diff --git a/Makefile b/Makefile index b8b1a95f..f91f4d33 100644 --- a/Makefile +++ b/Makefile @@ -94,7 +94,7 @@ SHELL = /bin/bash # # . is current directory, .. is parent directory -SRCPATH := ./src/lib ./src/common ./src/mHM ./src/mRM # where are the source files +SRCPATH := ./src/lib ./src/common ./src/mRM ./src/common_mHM_mRM ./src/MPR ./src/mHM # where are the source files PROGPATH := . # where shall be the executable CONFIGPATH := make.config # where are the $(system).$(compiler) files MAKEDPATH := $(CONFIGPATH) # where is the make.d.sh script @@ -109,9 +109,9 @@ LIBNAME := #libminpack.a # Name of library system := eve # Compiler: intelX, gnuX, nagX, sunX, where X stands for version number, e.g. intel13; # look at $(MAKEDPATH)/$(system).alias for shortcuts or type 'make info' -compiler := intel +compiler := nag # Releases: debug, release -release := release +release := debug # Netcdf versions (Network Common Data Form): netcdf3, netcdf4, [anything else] netcdf := netcdf4 # LAPACK (Linear Algebra Pack): true, [anything else] @@ -123,7 +123,7 @@ proj := # IMSL (IMSL Numerical Libraries): vendor, imsl, [anything else] imsl := # OpenMP parallelization: true, [anything else] -openmp := true +openmp := false # MPI parallelization - experimental: true, [anything else] mpi := # Linking: static, shared, dynamic (last two are equal) @@ -184,7 +184,7 @@ static := dynamic # Special compilation flags EXTRA_FCFLAGS := EXTRA_F90FLAGS := #-C=undefined -EXTRA_DEFINES := -DMRM2MHM +EXTRA_DEFINES := -DMRM2MHM #-DMPR_STANDALONE EXTRA_INCLUDES := EXTRA_LDFLAGS += #-Wl,--stack,12485760 EXTRA_LIBS := @@ -389,7 +389,6 @@ RANLIB := ranlib # Set path where all the .mod, .o, etc. files will be written, set before include $(MAKEINC) OBJPATH := $(addsuffix /.$(strip $(icompiler)).$(strip $(release)), $(SRCPATH)) - # Mac OS X is special, there is (almost) no static linking. # Mac OS X does not work with -rpath. Set DYLD_LIBRARY_PATH if needed. iOS := $(shell uname -s) @@ -800,6 +799,7 @@ ifneq ($(LDPATH),) empty:= space:= $(empty) $(empty) export LD_LIBRARY_PATH=$(subst $(space),$(empty),$(LDPATH)) + export DYLD_FALLBACK_LIBRARY_PATH=$(subst $(space),$(empty),$(LDPATH)) endif INCLUDES += $(addprefix -I,$(OBJPATH)) diff --git a/check/README b/check/README index 69c7a8b9..7a58128e 100644 --- a/check/README +++ b/check/README @@ -53,175 +53,21 @@ the Makefile setting for ---------------------------------------- TEST CASES ---------------------------------------- - -case 0 :: DEFAULT mhm.nml and mhm_outputs.nml and mhm_parameter.nml - -case 1 :: RESTART READING AND WRITING, MPR deactivated, PET: Hargreaves-Samani - nBasins = 2 (default: 1) - nGaugesTotal = 2 (default: 1) - processCase(5) = 1 (default: 0) - flag: read_restart = .TRUE. (default: .FALSE.) - flag: perform_mpr = .FALSE. (default: .TRUE. ) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - -case 2 :: ROUTING DEACTIVATED, PET: Priestley Taylor, CHUNK READ IN: monthly, output written monthly, - Jarvis SM-dependent ET reduction - nBasins = 2 (default: 1) - nGaugesTotal = 2 (default: 1) - processCase(3) = 2 (default: 1) - processCase(5) = 2 (default: 0) - processCase(8) = 0 (default: 1) - timestep_model_inputs = -2 (default: 1) - ----- - mhm_outputs.nml: - timeStep_model_outputs = -2 (default: -1) - -case 3 :: OPTIMIZATION ACTIVATED, PET: Penman-Monteith - nBasins = 2 (default: 1) - nGaugesTotal = 2 (default: 1) - processCase(5) = 3 (default: 0) - optimize = .TRUE. (default: .FALSE.) - opti_method = 1 (default: 3) - nIterations = 6 (default: 400) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - -case 4 :: MULTISCALE - nBasins = 6 (default: nBasins = 2) - resolution_Hydrology(1) = 24000 (default: resolution_Hydrology(1) = 24000 ) - resolution_Hydrology(2) = 12000 (default: resolution_Hydrology(1) = 24000 ) - resolution_Hydrology(3) = 24000 (default: ) - resolution_Hydrology(4) = 24000 (default: ) - resolution_Hydrology(5) = 12000 (default: ) - resolution_Hydrology(6) = 24000 (default: ) - resolution_Routing(1) = 24000 (default: resolution_Routing(1) = 24000) - resolution_Routing(2) = 12000 (default: resolution_Routing(2) = 24000) - resolution_Routing(3) = 24000 (default: ) - resolution_Routing(4) = 24000 (default: ) - resolution_Routing(5) = 12000 (default: ) - resolution_Routing(6) = 24000 (default: ) - L0Basin(1) = 1 (default: ) - L0Basin(2) = 1 (default: ) - L0Basin(3) = 2 (default: ) - L0Basin(4) = 3 (default: ) - L0Basin(5) = 4 (default: ) - L0Basin(6) = 5 (default: ) - nGaugesTotal = 6 (default: nGaugesTotal = 2) - NoGauges_basin(3) = 1 (default: ) - Gauge_id(3,1) = 45 (default: ) - Gauge_filename(3,1) = "45.txt" (default: ) - NoGauges_basin(4) = 1 (default: ) - Gauge_id(4,1) = 398 (default: ) - Gauge_filename(4,1) = "00398.txt" (default: ) - NoGauges_basin(5) = 1 (default: ) - Gauge_id(5,1) = 398 (default: ) - Gauge_filename(5,1) = "00398.txt" (default: ) - NoGauges_basin(6) = 1 (default: ) - Gauge_id(6,1) = 45 (default: ) - Gauge_filename(6,1) = "45.txt" (default: ) - + adjust basin wise directory paths according to the multiscale setup: - dir_Out(1) = "output_b1/b1_" (default: "output_b1/") - dir_RestartOut(1) = "output_b1/b1_" (default: "output_b1/") - dir_LatLon(2) = "../../test_basin/input/latlon/latlon_2.nc" (default: latlon_1.nc ) - dir_Out(2) = "output_b1/b2_" (default: "output_b1/") - dir_RestartOut(2) = "output_b1/b2_" (default: "output_b1/") - dir_LatLon(3) = "../../test_basin_2/input/latlon/latlon.nc" (default: ) - dir_Out(3) = "output_b1/b3_" (default: ) - dir_RestartOut(3) = "output_b1/b3_" (default: ) - dir_LatLon(4) = "../../test_basin/input/latlon/latlon_1.nc" (default: ) - dir_Out(4) = "output_b1/b4_" (default: ) - dir_RestartOut(4) = "output_b1/b4_" (default: ) - dir_LatLon(5) = "../../test_basin/input/latlon/latlon_2.nc" (default: ) - dir_Out(5) = "output_b1/b5_" (default: ) - dir_RestartOut(5) = "output_b1/b5_" (default: ) - dir_LatLon(6) = "../../test_basin_2/input/latlon/latlon.nc" (default: ) - dir_Out(6) = "output_b1/b6_" (default: ) - dir_RestartOut(6) = "output_b1/b6_" (default: ) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - -case 5 :: INFLOW GAUGE, LAI FROM GRIDDED DATA, output written every 14 days - nBasins = 3 (default: 1) - nGaugesTotal = 6 (default: 1) - NoGauges_basin(1) = 2 (default: 1) - NoGauges_basin(2) = 2 (default: 1) - NoGauges_basin(3) = 2 (default: 0) - timeStep_LAI_input = -2 (default: 0) - Gauge_id(1,2) = 333 (default: n.a.) - gauge_filename(1,2) = "00333.txt" (default: n.a.) - Gauge_id(2,2) = 333 (default: n.a.) - gauge_filename(2,2) = "00333.txt" (default: n.a.) - nInflowGaugesTotal = 2 (default: nInflowGaugesTotal = 0) - NoInflowGauges_basin(1) = 1 (default: NoInflowGauges_basin(1) = 0) - InflowGauge_id(1,1) = 333 (default: InflowGauge_id(1,1) = 398) - InflowGauge_filename(1,1) = "00333.txt" (default: InflowGauge_filename(1,1) = "00398.txt") - NoInflowGauges_basin(2) = 1 (default: NoInflowGauges_basin(2) = 0) - InflowGauge_id(2,1) = 333 (default: InflowGauge_id(2,1) = 398) - InflowGauge_filename(2,1) = "00333.txt" (default: InflowGauge_filename(2,1) = "00398.txt") - InflowGauge_Headwater(2,1) = .TRUE. (default: ) - dir_Out(1) = "output_b1/b1_" (default: "output_b1/") - dir_RestartOut(1) = "output_b1/b1_" (default: "output_b1/") - dir_Out(2) = "output_b1/b2_" (default: "output_b1/") - dir_RestartOut(2) = "output_b1/b2_" (default: "output_b1/") - dir_Out(3) = "output_b1/b3_" (default: "output_b1/") - dir_RestartOut(3) = "output_b1/b3_" (default: "output_b1/") - ----- - mhm_outputs.nml: - timeStep_model_outputs = 336 (= 14*24 hours) (default: -1) - - -case 6 :: COMBINED SOIL MOISTURE - STREAMFLOW OPTIMIZATION ACTIVATED - nBasins = 2 (default: 1) - nGaugesTotal = 2 (default: 1) - optimize = .TRUE. (default: .FALSE.) - opti_method = 1 (default: 3) - opti_function = 28 (default: 3) - nIterations = 6 (default: 400) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - -case 7 :: Q + TWS BASIN AVERAGE OPTIMIZATION ACTIVATED - nBasins = 2 (default: 1) - nGaugesTotal = 2 (default: 1) - optimize = .TRUE. (default: .FALSE.) - opti_method = 1 (default: 3) - opti_function = 15 (default: 3) - nIterations = 6 (default: 400) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - -case 8 :: NEUTRON OPTIMIZATION ACTIVATED - nBasins = 1 (default: 1) - nGaugesTotal = 1 (default: 1) - optimize = .TRUE. (default: .FALSE.) - opti_method = 1 (default: 3) - opti_function = 17 (default: 3) - nIterations = 6 (default: 400) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - -case 9 :: ADAPTIVE TIMESTEPPING IN ROUTING, RESTART WRITING, PET: Hargreaves-Samani - nBasins = 2 (default: 1) - nGaugesTotal = 2 (default: 1) - processCase(5) = 1 (default: 0) - processCase(8) = 2 (default: 0) - ----- - mhm_outputs.nml: - timeStep_model_outputs = 0 (default: -1) - +check in mhm.nml or simulation.ini for comprehensive list of changed options in namelists +please update both files when changes occur!!! +if unsure about format of simulation.ini, contact robert.schweppe@ufz.de + +case 00 :: DEFAULT mhm.nml and mhm_outputs.nml and mhm_parameter.nml +case 01 :: RESTART READING AND WRITING, MPR deactivated, PET: Hargreaves-Samani +case 02 :: ROUTING DEACTIVATED, PET: Priestley Taylor, CHUNK READ IN: monthly, output written monthly, +case 03 :: OPTIMIZATION ACTIVATED, PET: Penman-Monteith +case 04 :: MULTISCALE +case 05 :: INFLOW GAUGE, LAI FROM GRIDDED DATA, output written every 14 days +case 06 :: COMBINED SOIL MOISTURE - STREAMFLOW OPTIMIZATION ACTIVATED +case 07 :: Q + TWS BASIN AVERAGE OPTIMIZATION ACTIVATED +case 08 :: NEUTRON OPTIMIZATION ACTIVATED +case 09 :: ADAPTIVE TIMESTEPPING IN ROUTING, RESTART WRITING, PET: Hargreaves-Samani case 10 :: SOIL MOISTURE ET: Jarvis SM-dependent ET reduction &soil texture dependent root fraction - processCase(3) = 3 (default: 1) - processCase(5) = -1 (default: 0) ------ - mhm_outputs.nml: - timeStep_model_outputs = -2 (default: -1) # ------------------------------------------------------------------------------------------- diff --git a/check/case_00/mhm.nml b/check/case_00/mhm.nml index 35c279b7..3d553481 100644 --- a/check/case_00/mhm.nml +++ b/check/case_00/mhm.nml @@ -1,584 +1,141 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ -! -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = -2 / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/" -!> directory where output should be written -dir_Out(1) = "output_b1/" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/b2_" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -&directories_mHM -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 1 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = -2 -time_step_model_inputs(2) = -2 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. +/ -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 +/ -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 1 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -! -!> basin 3 -!> number of gauges for subbasin (2) -NoGauges_basin(3) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(3,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(3,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" -!> consider flows from upstream/headwater cells of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_Headwater(1,1) = .FALSE. +&processselection + processcase(1:10) = 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_00/output_save/ConfigFile.log b/check/case_00/output_save/ConfigFile.log index c78c671c..98b4d40b 100644 --- a/check/case_00/output_save/ConfigFile.log +++ b/check/case_00/output_save/ConfigFile.log @@ -1,18 +1,21 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N Number of basins 1 -Total No. of nodes 34 -Total No. of reaches 33 +Total No. of gauges 1 +Time Step [h] 1 + Basin 1 No. of cells L0 46545 + Basin 1 No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 No. of cells L11 34 Total No. of gauges 1 -Time Step [h] 1 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. Flag READ restart F @@ -23,21 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -101,7 +98,7 @@ Simulation Period (1)+(2) 6 1 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 + 1 1 932.000 16.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -116,8 +113,8 @@ Directory to gauging station input ../../test_basin/input/gauge/ Directory to precipitation input ../../test_basin/input/meteo/pre/ Directory to temperature input ../../test_basin/input/meteo/tavg/ Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/ -Directory to write output when restarted output_b1/ +Directory to write output by default output_b1/b1_ +Directory to write output when restarted output_b1/b1_ ------------------------------ River Network (Routing level) @@ -170,40 +167,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -247,4 +244,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - + diff --git a/check/case_00/output_save/b1_daily_discharge.out b/check/case_00/output_save/b1_daily_discharge.out new file mode 100755 index 00000000..2da3a04c --- /dev/null +++ b/check/case_00/output_save/b1_daily_discharge.out @@ -0,0 +1,366 @@ + No Day Mon Year Qobs_0000000398 Qsim_0000000398 + 1 1 7 1990 79.0000000 84.3356968 + 2 2 7 1990 92.0000000 70.3022274 + 3 3 7 1990 72.0000000 77.2618623 + 4 4 7 1990 58.0000000 93.5663052 + 5 5 7 1990 69.0000000 121.8340961 + 6 6 7 1990 94.0000000 104.3443920 + 7 7 7 1990 199.0000000 100.4103947 + 8 8 7 1990 133.0000000 100.1017889 + 9 9 7 1990 124.0000000 86.5482605 + 10 10 7 1990 123.0000000 81.6859664 + 11 11 7 1990 99.0000000 77.7940720 + 12 12 7 1990 88.0000000 74.3675785 + 13 13 7 1990 84.0000000 71.2654971 + 14 14 7 1990 72.0000000 68.4493197 + 15 15 7 1990 55.0000000 65.8857173 + 16 16 7 1990 65.0000000 63.5457569 + 17 17 7 1990 50.0000000 61.4042535 + 18 18 7 1990 50.0000000 59.4392281 + 19 19 7 1990 46.0000000 57.6314521 + 20 20 7 1990 44.0000000 55.9640640 + 21 21 7 1990 42.0000000 54.4222452 + 22 22 7 1990 37.0000000 52.9929451 + 23 23 7 1990 38.0000000 51.6646468 + 24 24 7 1990 44.0000000 50.4271673 + 25 25 7 1990 30.0000000 49.2714870 + 26 26 7 1990 26.0000000 48.1896023 + 27 27 7 1990 31.0000000 47.1743995 + 28 28 7 1990 33.0000000 49.3048754 + 29 29 7 1990 42.0000000 46.8319572 + 30 30 7 1990 36.0000000 44.8063899 + 31 31 7 1990 34.0000000 43.9743016 + 32 1 8 1990 25.0000000 43.1859667 + 33 2 8 1990 22.0000000 42.4374797 + 34 3 8 1990 28.0000000 41.7253392 + 35 4 8 1990 25.0000000 41.0464026 + 36 5 8 1990 19.0000000 40.3979823 + 37 6 8 1990 22.0000000 39.7779341 + 38 7 8 1990 19.0000000 39.1827759 + 39 8 8 1990 22.0000000 38.6110524 + 40 9 8 1990 19.0000000 38.0609532 + 41 10 8 1990 20.0000000 37.5307943 + 42 11 8 1990 19.0000000 37.0190518 + 43 12 8 1990 19.0000000 36.5243462 + 44 13 8 1990 22.0000000 41.2421292 + 45 14 8 1990 36.0000000 62.9091751 + 46 15 8 1990 31.0000000 53.5585466 + 47 16 8 1990 30.0000000 47.7061267 + 48 17 8 1990 28.0000000 43.9658884 + 49 18 8 1990 34.0000000 37.1673227 + 50 19 8 1990 21.0000000 36.5277561 + 51 20 8 1990 30.0000000 35.9202042 + 52 21 8 1990 22.0000000 35.3414249 + 53 22 8 1990 21.0000000 34.7888594 + 54 23 8 1990 23.0000000 34.2602202 + 55 24 8 1990 20.0000000 33.7534601 + 56 25 8 1990 29.0000000 33.2684054 + 57 26 8 1990 20.0000000 33.3138147 + 58 27 8 1990 22.0000000 34.5491848 + 59 28 8 1990 23.0000000 32.5976339 + 60 29 8 1990 35.0000000 31.6792469 + 61 30 8 1990 51.0000000 119.9553559 + 62 31 8 1990 80.0000000 114.9514767 + 63 1 9 1990 56.0000000 54.2358641 + 64 2 9 1990 33.0000000 45.1254889 + 65 3 9 1990 27.0000000 43.5089633 + 66 4 9 1990 27.0000000 46.1101771 + 67 5 9 1990 28.0000000 45.5085095 + 68 6 9 1990 26.0000000 40.6204034 + 69 7 9 1990 24.0000000 45.9742248 + 70 8 9 1990 33.0000000 42.8007598 + 71 9 9 1990 26.0000000 38.6603324 + 72 10 9 1990 27.0000000 37.5648860 + 73 11 9 1990 22.0000000 36.5533790 + 74 12 9 1990 22.0000000 35.6164493 + 75 13 9 1990 21.0000000 34.7462309 + 76 14 9 1990 22.0000000 33.9358004 + 77 15 9 1990 22.0000000 33.1790518 + 78 16 9 1990 22.0000000 32.4705902 + 79 17 9 1990 20.0000000 31.8056406 + 80 18 9 1990 22.0000000 31.1799690 + 81 19 9 1990 16.0000000 30.5898157 + 82 20 9 1990 22.0000000 30.0318362 + 83 21 9 1990 19.0000000 38.7887709 + 84 22 9 1990 32.0000000 106.3259929 + 85 23 9 1990 27.0000000 86.4778426 + 86 24 9 1990 45.0000000 62.3784197 + 87 25 9 1990 42.0000000 47.8859561 + 88 26 9 1990 39.0000000 44.0205210 + 89 27 9 1990 30.0000000 42.3175121 + 90 28 9 1990 28.0000000 40.7652981 + 91 29 9 1990 30.0000000 39.3491725 + 92 30 9 1990 30.0000000 90.8223222 + 93 1 10 1990 56.0000000 136.4781390 + 94 2 10 1990 72.0000000 101.0680275 + 95 3 10 1990 73.0000000 98.0908915 + 96 4 10 1990 68.0000000 92.2956143 + 97 5 10 1990 53.0000000 78.9577523 + 98 6 10 1990 42.0000000 72.8903128 + 99 7 10 1990 33.0000000 68.7051397 + 100 8 10 1990 42.0000000 64.9948668 + 101 9 10 1990 34.0000000 61.6629120 + 102 10 10 1990 36.0000000 58.6546809 + 103 11 10 1990 36.0000000 55.9393705 + 104 12 10 1990 28.0000000 53.4820084 + 105 13 10 1990 32.0000000 51.2523329 + 106 14 10 1990 27.0000000 49.2240843 + 107 15 10 1990 35.0000000 47.8221224 + 108 16 10 1990 42.0000000 48.8566459 + 109 17 10 1990 35.0000000 58.3756546 + 110 18 10 1990 39.0000000 57.2126443 + 111 19 10 1990 34.0000000 47.9843124 + 112 20 10 1990 32.0000000 46.2281221 + 113 21 10 1990 34.0000000 44.6291932 + 114 22 10 1990 27.0000000 43.1619978 + 115 23 10 1990 31.0000000 41.8123395 + 116 24 10 1990 28.0000000 40.5677590 + 117 25 10 1990 25.0000000 40.6222041 + 118 26 10 1990 29.0000000 59.1167300 + 119 27 10 1990 31.0000000 66.9630928 + 120 28 10 1990 65.0000000 196.3727249 + 121 29 10 1990 69.0000000 206.3715717 + 122 30 10 1990 157.0000000 170.7266802 + 123 31 10 1990 190.0000000 148.3626450 + 124 1 11 1990 115.0000000 151.9603736 + 125 2 11 1990 104.0000000 160.7780976 + 126 3 11 1990 100.0000000 169.9732818 + 127 4 11 1990 131.0000000 166.6361550 + 128 5 11 1990 130.0000000 160.0556730 + 129 6 11 1990 115.0000000 140.7053661 + 130 7 11 1990 102.0000000 123.7315298 + 131 8 11 1990 95.0000000 109.4323298 + 132 9 11 1990 81.0000000 98.1051912 + 133 10 11 1990 66.0000000 105.7895148 + 134 11 11 1990 67.0000000 137.7623301 + 135 12 11 1990 74.0000000 149.5286236 + 136 13 11 1990 109.0000000 141.5574987 + 137 14 11 1990 92.0000000 165.3474728 + 138 15 11 1990 92.0000000 178.1687475 + 139 16 11 1990 155.0000000 166.8222348 + 140 17 11 1990 159.0000000 157.0086927 + 141 18 11 1990 131.0000000 172.8120666 + 142 19 11 1990 161.0000000 182.9541859 + 143 20 11 1990 196.0000000 285.3123992 + 144 21 11 1990 336.0000000 348.0971528 + 145 22 11 1990 566.0000000 315.4177386 + 146 23 11 1990 373.0000000 325.8750589 + 147 24 11 1990 293.0000000 300.6836796 + 148 25 11 1990 264.0000000 287.0027568 + 149 26 11 1990 226.0000000 258.7579418 + 150 27 11 1990 201.0000000 221.7718410 + 151 28 11 1990 180.0000000 192.7459843 + 152 29 11 1990 161.0000000 182.5427944 + 153 30 11 1990 149.0000000 171.2507264 + 154 1 12 1990 134.0000000 150.4735773 + 155 2 12 1990 113.0000000 136.4818564 + 156 3 12 1990 99.0000000 127.0326974 + 157 4 12 1990 107.0000000 120.0345354 + 158 5 12 1990 99.0000000 113.6625613 + 159 6 12 1990 89.0000000 107.8081303 + 160 7 12 1990 77.0000000 102.6022714 + 161 8 12 1990 71.0000000 97.9215519 + 162 9 12 1990 68.0000000 93.7004214 + 163 10 12 1990 73.0000000 89.8825658 + 164 11 12 1990 84.0000000 86.4194563 + 165 12 12 1990 88.0000000 104.3587452 + 166 13 12 1990 92.0000000 110.1037679 + 167 14 12 1990 128.0000000 101.8076351 + 168 15 12 1990 136.0000000 95.0275388 + 169 16 12 1990 114.0000000 90.6631559 + 170 17 12 1990 101.0000000 86.8002618 + 171 18 12 1990 93.0000000 83.3186520 + 172 19 12 1990 85.0000000 80.1703381 + 173 20 12 1990 81.0000000 77.3141615 + 174 21 12 1990 106.0000000 113.3506735 + 175 22 12 1990 159.0000000 140.2301521 + 176 23 12 1990 250.0000000 154.7006930 + 177 24 12 1990 298.0000000 145.0932828 + 178 25 12 1990 261.0000000 190.9967130 + 179 26 12 1990 228.0000000 302.1891515 + 180 27 12 1990 409.0000000 367.0316950 + 181 28 12 1990 486.0000000 390.1052315 + 182 29 12 1990 440.0000000 498.9073126 + 183 30 12 1990 486.0000000 629.3739751 + 184 31 12 1990 774.0000000 719.8347727 + 185 1 1 1991 889.0000000 764.5322242 + 186 2 1 1991 863.0000000 811.1217833 + 187 3 1 1991 875.0000000 871.4667632 + 188 4 1 1991 932.0000000 783.4034392 + 189 5 1 1991 826.0000000 740.5927488 + 190 6 1 1991 731.0000000 691.6466558 + 191 7 1 1991 613.0000000 654.5584765 + 192 8 1 1991 610.0000000 643.7463251 + 193 9 1 1991 686.0000000 580.9708313 + 194 10 1 1991 556.0000000 617.3524723 + 195 11 1 1991 669.0000000 653.1260959 + 196 12 1 1991 828.0000000 613.8278462 + 197 13 1 1991 735.0000000 503.7866677 + 198 14 1 1991 513.0000000 416.2128639 + 199 15 1 1991 411.0000000 345.7196117 + 200 16 1 1991 345.0000000 289.4205357 + 201 17 1 1991 293.0000000 247.7610396 + 202 18 1 1991 251.0000000 218.6474375 + 203 19 1 1991 222.0000000 198.2057225 + 204 20 1 1991 215.0000000 184.1879805 + 205 21 1 1991 213.0000000 178.8982012 + 206 22 1 1991 202.0000000 179.7249534 + 207 23 1 1991 200.0000000 171.2789591 + 208 24 1 1991 192.0000000 162.5384719 + 209 25 1 1991 176.0000000 154.5208656 + 210 26 1 1991 164.0000000 147.4641500 + 211 27 1 1991 157.0000000 140.9734203 + 212 28 1 1991 134.0000000 135.1436886 + 213 29 1 1991 130.0000000 129.8895460 + 214 30 1 1991 119.0000000 125.1380218 + 215 31 1 1991 107.0000000 120.8265908 + 216 1 2 1991 112.0000000 116.9015125 + 217 2 2 1991 109.0000000 113.3164610 + 218 3 2 1991 101.0000000 110.0313907 + 219 4 2 1991 98.0000000 107.0115929 + 220 5 2 1991 84.0000000 104.2269078 + 221 6 2 1991 93.0000000 101.6510651 + 222 7 2 1991 80.0000000 99.2611298 + 223 8 2 1991 73.0000000 97.0370337 + 224 9 2 1991 89.0000000 94.9611804 + 225 10 2 1991 84.0000000 93.0181095 + 226 11 2 1991 78.0000000 91.1942104 + 227 12 2 1991 79.0000000 89.4774788 + 228 13 2 1991 77.0000000 87.8573083 + 229 14 2 1991 80.0000000 86.3243108 + 230 15 2 1991 72.0000000 84.8701630 + 231 16 2 1991 78.0000000 85.1272588 + 232 17 2 1991 74.0000000 85.0558551 + 233 18 2 1991 77.0000000 83.4612366 + 234 19 2 1991 73.0000000 93.7542201 + 235 20 2 1991 69.0000000 109.0668141 + 236 21 2 1991 74.0000000 139.2790561 + 237 22 2 1991 81.0000000 153.7077512 + 238 23 2 1991 110.0000000 149.5421431 + 239 24 2 1991 180.0000000 145.7627008 + 240 25 2 1991 213.0000000 142.8848966 + 241 26 2 1991 222.0000000 139.6987956 + 242 27 2 1991 208.0000000 140.8868384 + 243 28 2 1991 211.0000000 134.9325703 + 244 1 3 1991 214.0000000 130.0266312 + 245 2 3 1991 208.0000000 137.8337349 + 246 3 3 1991 221.0000000 136.4333186 + 247 4 3 1991 281.0000000 127.6287879 + 248 5 3 1991 219.0000000 122.1866623 + 249 6 3 1991 190.0000000 117.4012203 + 250 7 3 1991 173.0000000 113.0639589 + 251 8 3 1991 164.0000000 109.3541940 + 252 9 3 1991 142.0000000 106.7369819 + 253 10 3 1991 133.0000000 106.5786708 + 254 11 3 1991 133.0000000 103.8427134 + 255 12 3 1991 118.0000000 100.5226330 + 256 13 3 1991 127.0000000 97.4779289 + 257 14 3 1991 113.0000000 94.6831016 + 258 15 3 1991 107.0000000 92.1074319 + 259 16 3 1991 100.0000000 89.7267209 + 260 17 3 1991 100.0000000 87.5251697 + 261 18 3 1991 95.0000000 85.5226184 + 262 19 3 1991 98.0000000 142.0949606 + 263 20 3 1991 119.0000000 149.0578015 + 264 21 3 1991 159.0000000 164.2465308 + 265 22 3 1991 196.0000000 178.1613834 + 266 23 3 1991 242.0000000 162.0355787 + 267 24 3 1991 216.0000000 149.3206211 + 268 25 3 1991 180.0000000 140.5278019 + 269 26 3 1991 145.0000000 133.2867542 + 270 27 3 1991 127.0000000 128.1970899 + 271 28 3 1991 117.0000000 121.7126807 + 272 29 3 1991 109.0000000 116.2917591 + 273 30 3 1991 106.0000000 111.4169222 + 274 31 3 1991 99.0000000 107.0184499 + 275 1 4 1991 96.0000000 103.0368175 + 276 2 4 1991 88.0000000 99.4209166 + 277 3 4 1991 87.0000000 96.1267294 + 278 4 4 1991 82.0000000 93.5635245 + 279 5 4 1991 84.0000000 91.5788134 + 280 6 4 1991 67.0000000 88.9466947 + 281 7 4 1991 89.0000000 86.7157199 + 282 8 4 1991 75.0000000 84.7541147 + 283 9 4 1991 79.0000000 82.6887507 + 284 10 4 1991 70.0000000 80.7042216 + 285 11 4 1991 69.0000000 78.8547115 + 286 12 4 1991 69.0000000 77.1289935 + 287 13 4 1991 56.0000000 75.5144027 + 288 14 4 1991 63.0000000 74.0025548 + 289 15 4 1991 58.0000000 72.5832912 + 290 16 4 1991 56.0000000 71.2387779 + 291 17 4 1991 54.0000000 69.9674851 + 292 18 4 1991 57.0000000 68.8110485 + 293 19 4 1991 53.0000000 68.8835190 + 294 20 4 1991 53.0000000 68.5798998 + 295 21 4 1991 65.0000000 67.5176431 + 296 22 4 1991 69.0000000 69.4687341 + 297 23 4 1991 61.0000000 71.0266279 + 298 24 4 1991 56.0000000 67.7443536 + 299 25 4 1991 56.0000000 66.1580138 + 300 26 4 1991 53.0000000 64.9925262 + 301 27 4 1991 49.0000000 63.9056232 + 302 28 4 1991 53.0000000 62.8776122 + 303 29 4 1991 48.0000000 66.5038250 + 304 30 4 1991 57.0000000 111.5823414 + 305 1 5 1991 69.0000000 105.8836228 + 306 2 5 1991 89.0000000 83.9806615 + 307 3 5 1991 105.0000000 80.5148320 + 308 4 5 1991 79.0000000 78.0463735 + 309 5 5 1991 69.0000000 75.9159680 + 310 6 5 1991 71.0000000 74.2010307 + 311 7 5 1991 60.0000000 72.0175463 + 312 8 5 1991 64.0000000 70.1544652 + 313 9 5 1991 59.0000000 68.4356300 + 314 10 5 1991 57.0000000 68.8784785 + 315 11 5 1991 55.0000000 71.1831765 + 316 12 5 1991 53.0000000 67.7648158 + 317 13 5 1991 52.0000000 65.8815548 + 318 14 5 1991 50.0000000 64.6807377 + 319 15 5 1991 52.0000000 69.3373650 + 320 16 5 1991 54.0000000 70.2827778 + 321 17 5 1991 54.0000000 65.3816716 + 322 18 5 1991 55.0000000 63.9639300 + 323 19 5 1991 48.0000000 62.6528036 + 324 20 5 1991 48.0000000 61.4156964 + 325 21 5 1991 49.0000000 60.2459257 + 326 22 5 1991 41.0000000 59.1376414 + 327 23 5 1991 40.0000000 58.0855698 + 328 24 5 1991 40.0000000 57.0849520 + 329 25 5 1991 39.0000000 56.1314896 + 330 26 5 1991 43.0000000 55.2212968 + 331 27 5 1991 39.0000000 54.3508572 + 332 28 5 1991 36.0000000 53.5169862 + 333 29 5 1991 33.0000000 52.7167972 + 334 30 5 1991 39.0000000 51.9476718 + 335 31 5 1991 34.0000000 51.2072329 + 336 1 6 1991 37.0000000 50.4933206 + 337 2 6 1991 35.0000000 49.8039713 + 338 3 6 1991 29.0000000 49.1373982 + 339 4 6 1991 33.0000000 48.4919744 + 340 5 6 1991 34.0000000 47.8943093 + 341 6 6 1991 32.0000000 65.5870992 + 342 7 6 1991 38.0000000 68.4033249 + 343 8 6 1991 39.0000000 57.9861379 + 344 9 6 1991 41.0000000 55.2295062 + 345 10 6 1991 44.0000000 69.0833425 + 346 11 6 1991 48.0000000 54.3196078 + 347 12 6 1991 42.0000000 51.3530783 + 348 13 6 1991 37.0000000 50.3511434 + 349 14 6 1991 39.0000000 49.5833099 + 350 15 6 1991 35.0000000 49.1230992 + 351 16 6 1991 31.0000000 52.0497489 + 352 17 6 1991 33.0000000 55.5271147 + 353 18 6 1991 31.0000000 52.7399092 + 354 19 6 1991 28.0000000 49.6837512 + 355 20 6 1991 60.0000000 85.9386289 + 356 21 6 1991 48.0000000 72.2546130 + 357 22 6 1991 54.0000000 56.5964348 + 358 23 6 1991 63.0000000 63.9885951 + 359 24 6 1991 41.0000000 58.1334095 + 360 25 6 1991 42.0000000 54.0540739 + 361 26 6 1991 43.0000000 52.6364240 + 362 27 6 1991 38.0000000 61.2359379 + 363 28 6 1991 38.0000000 61.1773717 + 364 29 6 1991 35.0000000 54.2841798 + 365 30 6 1991 41.0000000 52.0807182 diff --git a/check/case_00/output_save/daily_discharge.out b/check/case_00/output_save/daily_discharge.out deleted file mode 100644 index 9ad7c5e0..00000000 --- a/check/case_00/output_save/daily_discharge.out +++ /dev/null @@ -1,1462 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 133.9333078 - 2 2 1 1990 129.0000000 125.1828279 - 3 3 1 1990 117.0000000 117.4345123 - 4 4 1 1990 111.0000000 110.5512412 - 5 5 1 1990 112.0000000 104.4178325 - 6 6 1 1990 93.0000000 99.0214737 - 7 7 1 1990 87.0000000 94.1634757 - 8 8 1 1990 84.0000000 89.7359244 - 9 9 1 1990 80.0000000 85.7443667 - 10 10 1 1990 78.0000000 82.1357792 - 11 11 1 1990 78.0000000 78.8655002 - 12 12 1 1990 77.0000000 75.8925735 - 13 13 1 1990 76.0000000 75.0317210 - 14 14 1 1990 73.0000000 77.0260542 - 15 15 1 1990 66.0000000 86.2387643 - 16 16 1 1990 76.0000000 85.5161507 - 17 17 1 1990 73.0000000 86.3417731 - 18 18 1 1990 71.0000000 87.6862782 - 19 19 1 1990 90.0000000 83.3660647 - 20 20 1 1990 82.0000000 86.4071666 - 21 21 1 1990 80.0000000 83.5571610 - 22 22 1 1990 81.0000000 78.8121212 - 23 23 1 1990 97.0000000 176.0501481 - 24 24 1 1990 198.0000000 214.3070241 - 25 25 1 1990 392.0000000 278.9009341 - 26 26 1 1990 519.0000000 304.6105520 - 27 27 1 1990 565.0000000 258.8972445 - 28 28 1 1990 331.0000000 237.7526768 - 29 29 1 1990 293.0000000 236.9073299 - 30 30 1 1990 302.0000000 201.1456819 - 31 31 1 1990 233.0000000 176.0323560 - 32 1 2 1990 198.0000000 184.6744659 - 33 2 2 1990 183.0000000 202.8716407 - 34 3 2 1990 206.0000000 207.9533575 - 35 4 2 1990 215.0000000 179.2980003 - 36 5 2 1990 183.0000000 159.7333718 - 37 6 2 1990 159.0000000 145.4497724 - 38 7 2 1990 167.0000000 135.6974958 - 39 8 2 1990 138.0000000 130.0857897 - 40 9 2 1990 126.0000000 127.7542126 - 41 10 2 1990 131.0000000 203.0149113 - 42 11 2 1990 173.0000000 261.1210947 - 43 12 2 1990 240.0000000 297.2822635 - 44 13 2 1990 270.0000000 463.0040923 - 45 14 2 1990 458.0000000 844.1701546 - 46 15 2 1990 996.0000000 1107.2401917 - 47 16 2 1990 1370.0000000 970.5281311 - 48 17 2 1990 1540.0000000 796.5406011 - 49 18 2 1990 1210.0000000 654.7879959 - 50 19 2 1990 616.0000000 537.6171922 - 51 20 2 1990 465.0000000 443.2663156 - 52 21 2 1990 373.0000000 367.0805514 - 53 22 2 1990 298.0000000 307.1206034 - 54 23 2 1990 270.0000000 261.8703331 - 55 24 2 1990 234.0000000 228.1443114 - 56 25 2 1990 218.0000000 208.4581475 - 57 26 2 1990 203.0000000 315.4969021 - 58 27 2 1990 314.0000000 528.3813188 - 59 28 2 1990 520.0000000 726.2713547 - 60 1 3 1990 689.0000000 799.1697718 - 61 2 3 1990 777.0000000 694.4219682 - 62 3 3 1990 584.0000000 571.2695822 - 63 4 3 1990 429.0000000 471.8615371 - 64 5 3 1990 365.0000000 394.3201520 - 65 6 3 1990 281.0000000 330.6564394 - 66 7 3 1990 257.0000000 279.8982513 - 67 8 3 1990 231.0000000 243.5238502 - 68 9 3 1990 211.0000000 217.0695947 - 69 10 3 1990 191.0000000 197.0550140 - 70 11 3 1990 182.0000000 182.7301594 - 71 12 3 1990 173.0000000 172.7534525 - 72 13 3 1990 159.0000000 164.3824319 - 73 14 3 1990 153.0000000 158.5482266 - 74 15 3 1990 141.0000000 152.8877773 - 75 16 3 1990 136.0000000 145.9515929 - 76 17 3 1990 130.0000000 140.1031185 - 77 18 3 1990 123.0000000 134.8146618 - 78 19 3 1990 115.0000000 130.0180888 - 79 20 3 1990 113.0000000 126.2396866 - 80 21 3 1990 102.0000000 122.9738665 - 81 22 3 1990 105.0000000 120.0966488 - 82 23 3 1990 106.0000000 117.1894611 - 83 24 3 1990 87.0000000 114.1545618 - 84 25 3 1990 80.0000000 112.0516524 - 85 26 3 1990 84.0000000 109.1476025 - 86 27 3 1990 82.0000000 106.6091584 - 87 28 3 1990 91.0000000 115.6494617 - 88 29 3 1990 97.0000000 122.4786121 - 89 30 3 1990 110.0000000 113.8738697 - 90 31 3 1990 97.0000000 109.9875141 - 91 1 4 1990 93.0000000 107.0269250 - 92 2 4 1990 85.0000000 104.2948387 - 93 3 4 1990 84.0000000 108.9481813 - 94 4 4 1990 81.0000000 112.7408786 - 95 5 4 1990 81.0000000 105.3387223 - 96 6 4 1990 76.0000000 103.5947756 - 97 7 4 1990 72.0000000 100.8303801 - 98 8 4 1990 68.0000000 98.3649164 - 99 9 4 1990 72.0000000 96.1405276 - 100 10 4 1990 65.0000000 94.1262393 - 101 11 4 1990 62.0000000 92.9544786 - 102 12 4 1990 62.0000000 94.1097827 - 103 13 4 1990 65.0000000 99.0081224 - 104 14 4 1990 68.0000000 122.3638336 - 105 15 4 1990 75.0000000 126.2261615 - 106 16 4 1990 90.0000000 121.2336385 - 107 17 4 1990 92.0000000 117.9159663 - 108 18 4 1990 94.0000000 117.8479481 - 109 19 4 1990 110.0000000 112.6005929 - 110 20 4 1990 99.0000000 108.7274658 - 111 21 4 1990 86.0000000 105.4929373 - 112 22 4 1990 86.0000000 110.7284639 - 113 23 4 1990 86.0000000 118.0090058 - 114 24 4 1990 88.0000000 117.8736238 - 115 25 4 1990 93.0000000 110.2744568 - 116 26 4 1990 99.0000000 106.3393749 - 117 27 4 1990 86.0000000 103.4039965 - 118 28 4 1990 74.0000000 100.5356117 - 119 29 4 1990 72.0000000 97.6411026 - 120 30 4 1990 77.0000000 94.9704126 - 121 1 5 1990 56.0000000 92.5008243 - 122 2 5 1990 64.0000000 90.2107375 - 123 3 5 1990 58.0000000 88.0812102 - 124 4 5 1990 50.0000000 86.0955789 - 125 5 5 1990 50.0000000 84.2391543 - 126 6 5 1990 50.0000000 82.4989625 - 127 7 5 1990 50.0000000 80.9196617 - 128 8 5 1990 53.0000000 80.6076643 - 129 9 5 1990 62.0000000 79.4833896 - 130 10 5 1990 64.0000000 85.0339817 - 131 11 5 1990 65.0000000 86.1111407 - 132 12 5 1990 75.0000000 79.1862952 - 133 13 5 1990 71.0000000 77.2983522 - 134 14 5 1990 63.0000000 75.9184242 - 135 15 5 1990 61.0000000 74.9733396 - 136 16 5 1990 49.0000000 73.7901678 - 137 17 5 1990 46.0000000 72.3294444 - 138 18 5 1990 46.0000000 71.0969244 - 139 19 5 1990 48.0000000 69.9253393 - 140 20 5 1990 41.0000000 68.8843411 - 141 21 5 1990 45.0000000 74.9555948 - 142 22 5 1990 52.0000000 75.3161421 - 143 23 5 1990 50.0000000 74.8726821 - 144 24 5 1990 56.0000000 78.9172581 - 145 25 5 1990 41.0000000 74.8756832 - 146 26 5 1990 40.0000000 69.8926009 - 147 27 5 1990 39.0000000 68.5187166 - 148 28 5 1990 39.0000000 67.2273776 - 149 29 5 1990 33.0000000 66.0097536 - 150 30 5 1990 37.0000000 64.8584941 - 151 31 5 1990 30.0000000 63.7671117 - 152 1 6 1990 37.0000000 69.5584544 - 153 2 6 1990 36.0000000 71.1022259 - 154 3 6 1990 40.0000000 101.4481348 - 155 4 6 1990 45.0000000 83.8791532 - 156 5 6 1990 39.0000000 69.3014120 - 157 6 6 1990 48.0000000 67.6875962 - 158 7 6 1990 39.0000000 116.0696918 - 159 8 6 1990 49.0000000 126.4518916 - 160 9 6 1990 84.0000000 112.4003278 - 161 10 6 1990 91.0000000 101.5020634 - 162 11 6 1990 80.0000000 91.3265109 - 163 12 6 1990 66.0000000 87.5180765 - 164 13 6 1990 53.0000000 84.3415036 - 165 14 6 1990 64.0000000 81.3066685 - 166 15 6 1990 55.0000000 78.3759805 - 167 16 6 1990 54.0000000 75.8125141 - 168 17 6 1990 42.0000000 73.4680295 - 169 18 6 1990 48.0000000 71.6809135 - 170 19 6 1990 48.0000000 89.1600657 - 171 20 6 1990 60.0000000 107.6447934 - 172 21 6 1990 75.0000000 101.4161257 - 173 22 6 1990 78.0000000 88.4866137 - 174 23 6 1990 66.0000000 84.6544588 - 175 24 6 1990 63.0000000 80.6867450 - 176 25 6 1990 52.0000000 77.6877924 - 177 26 6 1990 49.0000000 75.1453763 - 178 27 6 1990 44.0000000 82.0564642 - 179 28 6 1990 51.0000000 80.3544166 - 180 29 6 1990 61.0000000 101.0312297 - 181 30 6 1990 81.0000000 137.3018604 - 182 1 7 1990 79.0000000 112.5213750 - 183 2 7 1990 92.0000000 97.8790011 - 184 3 7 1990 72.0000000 104.0965601 - 185 4 7 1990 58.0000000 121.7168752 - 186 5 7 1990 69.0000000 153.4900609 - 187 6 7 1990 94.0000000 140.8684274 - 188 7 7 1990 199.0000000 135.7808958 - 189 8 7 1990 133.0000000 139.1563625 - 190 9 7 1990 124.0000000 120.9558957 - 191 10 7 1990 123.0000000 112.6538708 - 192 11 7 1990 99.0000000 106.3335602 - 193 12 7 1990 88.0000000 101.0630522 - 194 13 7 1990 84.0000000 96.3799960 - 195 14 7 1990 72.0000000 92.1647088 - 196 15 7 1990 55.0000000 88.3586697 - 197 16 7 1990 65.0000000 84.9116625 - 198 17 7 1990 50.0000000 81.7804551 - 199 18 7 1990 50.0000000 78.9277143 - 200 19 7 1990 46.0000000 76.3211063 - 201 20 7 1990 44.0000000 73.9325496 - 202 21 7 1990 42.0000000 71.7375922 - 203 22 7 1990 37.0000000 69.7148884 - 204 23 7 1990 38.0000000 67.8457602 - 205 24 7 1990 44.0000000 66.1138268 - 206 25 7 1990 30.0000000 64.5046907 - 207 26 7 1990 26.0000000 63.0056717 - 208 27 7 1990 31.0000000 61.6055801 - 209 28 7 1990 33.0000000 63.4594458 - 210 29 7 1990 42.0000000 60.7624381 - 211 30 7 1990 36.0000000 58.4167192 - 212 31 7 1990 34.0000000 57.2813198 - 213 1 8 1990 25.0000000 56.2097429 - 214 2 8 1990 22.0000000 55.1960076 - 215 3 8 1990 28.0000000 54.2347827 - 216 4 8 1990 25.0000000 53.3213087 - 217 5 8 1990 19.0000000 52.4515042 - 218 6 8 1990 22.0000000 51.6220724 - 219 7 8 1990 19.0000000 50.8280867 - 220 8 8 1990 22.0000000 50.0672248 - 221 9 8 1990 19.0000000 49.3368202 - 222 10 8 1990 20.0000000 48.6343946 - 223 11 8 1990 19.0000000 47.9577155 - 224 12 8 1990 19.0000000 47.3047694 - 225 13 8 1990 22.0000000 51.8223006 - 226 14 8 1990 36.0000000 73.3990585 - 227 15 8 1990 31.0000000 64.6406714 - 228 16 8 1990 30.0000000 58.9049887 - 229 17 8 1990 28.0000000 55.2682295 - 230 18 8 1990 34.0000000 48.3417851 - 231 19 8 1990 21.0000000 47.4751551 - 232 20 8 1990 30.0000000 46.6547552 - 233 21 8 1990 22.0000000 45.8758593 - 234 22 8 1990 21.0000000 45.1346035 - 235 23 8 1990 23.0000000 44.4275511 - 236 24 8 1990 20.0000000 43.7516405 - 237 25 8 1990 29.0000000 43.1063668 - 238 26 8 1990 20.0000000 43.0062848 - 239 27 8 1990 22.0000000 44.1171753 - 240 28 8 1990 23.0000000 42.0399801 - 241 29 8 1990 35.0000000 40.9861777 - 242 30 8 1990 51.0000000 129.1315778 - 243 31 8 1990 80.0000000 127.7381635 - 244 1 9 1990 56.0000000 68.6925680 - 245 2 9 1990 33.0000000 59.0446265 - 246 3 9 1990 27.0000000 56.8002379 - 247 4 9 1990 27.0000000 58.9053163 - 248 5 9 1990 28.0000000 58.0102150 - 249 6 9 1990 26.0000000 52.6929226 - 250 7 9 1990 24.0000000 57.7712962 - 251 8 9 1990 33.0000000 54.4833086 - 252 9 9 1990 26.0000000 50.0089346 - 253 10 9 1990 27.0000000 48.5437462 - 254 11 9 1990 22.0000000 47.1952048 - 255 12 9 1990 22.0000000 45.9500190 - 256 13 9 1990 21.0000000 44.7969172 - 257 14 9 1990 22.0000000 43.7260254 - 258 15 9 1990 22.0000000 42.7286748 - 259 16 9 1990 22.0000000 41.7972401 - 260 17 9 1990 20.0000000 40.9250002 - 261 18 9 1990 22.0000000 40.1060198 - 262 19 9 1990 16.0000000 39.3350488 - 263 20 9 1990 22.0000000 38.6074345 - 264 21 9 1990 19.0000000 47.2506864 - 265 22 9 1990 32.0000000 115.2201028 - 266 23 9 1990 27.0000000 98.0699305 - 267 24 9 1990 45.0000000 75.0416154 - 268 25 9 1990 42.0000000 60.4844440 - 269 26 9 1990 39.0000000 56.0894173 - 270 27 9 1990 30.0000000 53.8702751 - 271 28 9 1990 28.0000000 51.8537501 - 272 29 9 1990 30.0000000 50.0192275 - 273 30 9 1990 30.0000000 101.6401077 - 274 1 10 1990 56.0000000 151.1747384 - 275 2 10 1990 72.0000000 120.3030296 - 276 3 10 1990 73.0000000 117.1987197 - 277 4 10 1990 68.0000000 111.9995694 - 278 5 10 1990 53.0000000 97.7660670 - 279 6 10 1990 42.0000000 90.3996314 - 280 7 10 1990 33.0000000 84.9820657 - 281 8 10 1990 42.0000000 80.3077527 - 282 9 10 1990 34.0000000 76.1273117 - 283 10 10 1990 36.0000000 72.3651405 - 284 11 10 1990 36.0000000 68.9781040 - 285 12 10 1990 28.0000000 65.9202071 - 286 13 10 1990 32.0000000 63.1518275 - 287 14 10 1990 27.0000000 60.6387295 - 288 15 10 1990 35.0000000 58.8433082 - 289 16 10 1990 42.0000000 59.6189206 - 290 17 10 1990 35.0000000 69.0092425 - 291 18 10 1990 39.0000000 68.2975900 - 292 19 10 1990 34.0000000 58.8292117 - 293 20 10 1990 32.0000000 56.6737376 - 294 21 10 1990 34.0000000 54.7125365 - 295 22 10 1990 27.0000000 52.9156134 - 296 23 10 1990 31.0000000 51.2648766 - 297 24 10 1990 28.0000000 49.7444965 - 298 25 10 1990 25.0000000 49.5960653 - 299 26 10 1990 29.0000000 68.1888993 - 300 27 10 1990 31.0000000 76.8415825 - 301 28 10 1990 65.0000000 209.2637390 - 302 29 10 1990 69.0000000 232.3375446 - 303 30 10 1990 157.0000000 204.3058939 - 304 31 10 1990 190.0000000 178.4296555 - 305 1 11 1990 115.0000000 179.5780445 - 306 2 11 1990 104.0000000 187.8461299 - 307 3 11 1990 100.0000000 197.5581041 - 308 4 11 1990 131.0000000 192.7090079 - 309 5 11 1990 130.0000000 184.6175710 - 310 6 11 1990 115.0000000 162.4062766 - 311 7 11 1990 102.0000000 143.5692565 - 312 8 11 1990 95.0000000 127.7053023 - 313 9 11 1990 81.0000000 114.5738986 - 314 10 11 1990 66.0000000 120.9957007 - 315 11 11 1990 67.0000000 154.4461951 - 316 12 11 1990 74.0000000 169.2271559 - 317 13 11 1990 109.0000000 160.6614801 - 318 14 11 1990 92.0000000 185.0618769 - 319 15 11 1990 92.0000000 201.5859742 - 320 16 11 1990 155.0000000 188.6224687 - 321 17 11 1990 159.0000000 176.3355004 - 322 18 11 1990 131.0000000 192.4142822 - 323 19 11 1990 161.0000000 204.5101127 - 324 20 11 1990 196.0000000 314.5135142 - 325 21 11 1990 336.0000000 396.0736950 - 326 22 11 1990 566.0000000 358.0477682 - 327 23 11 1990 373.0000000 363.9950807 - 328 24 11 1990 293.0000000 334.6945074 - 329 25 11 1990 264.0000000 318.5959982 - 330 26 11 1990 226.0000000 287.7253381 - 331 27 11 1990 201.0000000 246.3703679 - 332 28 11 1990 180.0000000 214.3813321 - 333 29 11 1990 161.0000000 200.7406350 - 334 30 11 1990 149.0000000 188.6398360 - 335 1 12 1990 134.0000000 165.5104683 - 336 2 12 1990 113.0000000 150.3324184 - 337 3 12 1990 99.0000000 139.8890101 - 338 4 12 1990 107.0000000 132.2358459 - 339 5 12 1990 99.0000000 125.2897687 - 340 6 12 1990 89.0000000 118.9115645 - 341 7 12 1990 77.0000000 113.2394694 - 342 8 12 1990 71.0000000 108.1423944 - 343 9 12 1990 68.0000000 103.5479007 - 344 10 12 1990 73.0000000 99.3938558 - 345 11 12 1990 84.0000000 95.6267987 - 346 12 12 1990 88.0000000 113.5956834 - 347 13 12 1990 92.0000000 120.4615787 - 348 14 12 1990 128.0000000 112.4913552 - 349 15 12 1990 136.0000000 105.3875862 - 350 16 12 1990 114.0000000 100.5794860 - 351 17 12 1990 101.0000000 96.3187423 - 352 18 12 1990 93.0000000 92.4820371 - 353 19 12 1990 85.0000000 89.0153595 - 354 20 12 1990 81.0000000 85.8724847 - 355 21 12 1990 106.0000000 122.3182141 - 356 22 12 1990 159.0000000 152.2892298 - 357 23 12 1990 250.0000000 170.5539551 - 358 24 12 1990 298.0000000 161.5898248 - 359 25 12 1990 261.0000000 208.0856243 - 360 26 12 1990 228.0000000 328.9256904 - 361 27 12 1990 409.0000000 401.7638601 - 362 28 12 1990 486.0000000 426.2737504 - 363 29 12 1990 440.0000000 537.0403519 - 364 30 12 1990 486.0000000 672.5960348 - 365 31 12 1990 774.0000000 761.3193495 - 366 1 1 1991 889.0000000 804.7506382 - 367 2 1 1991 863.0000000 850.7842715 - 368 3 1 1991 875.0000000 912.3383119 - 369 4 1 1991 932.0000000 820.9666129 - 370 5 1 1991 826.0000000 774.6060998 - 371 6 1 1991 731.0000000 723.1524531 - 372 7 1 1991 613.0000000 682.9711798 - 373 8 1 1991 610.0000000 670.4245697 - 374 9 1 1991 686.0000000 605.2099291 - 375 10 1 1991 556.0000000 641.4390495 - 376 11 1 1991 669.0000000 678.4533648 - 377 12 1 1991 828.0000000 637.5180374 - 378 13 1 1991 735.0000000 524.0373367 - 379 14 1 1991 513.0000000 433.6345060 - 380 15 1 1991 411.0000000 360.9161237 - 381 16 1 1991 345.0000000 302.4660774 - 382 17 1 1991 293.0000000 258.4694027 - 383 18 1 1991 251.0000000 227.8399473 - 384 19 1 1991 222.0000000 206.3754762 - 385 20 1 1991 215.0000000 191.9645087 - 386 21 1 1991 213.0000000 186.4765279 - 387 22 1 1991 202.0000000 187.3412721 - 388 23 1 1991 200.0000000 178.8360009 - 389 24 1 1991 192.0000000 169.8693895 - 390 25 1 1991 176.0000000 161.6256864 - 391 26 1 1991 164.0000000 154.3682122 - 392 27 1 1991 157.0000000 147.6927910 - 393 28 1 1991 134.0000000 141.6957440 - 394 29 1 1991 130.0000000 136.2891837 - 395 30 1 1991 119.0000000 131.3980596 - 396 31 1 1991 107.0000000 126.9580990 - 397 1 2 1991 112.0000000 122.9140870 - 398 2 2 1991 109.0000000 119.2184503 - 399 3 2 1991 101.0000000 115.8300836 - 400 4 2 1991 98.0000000 112.7133753 - 401 5 2 1991 84.0000000 109.8373943 - 402 6 2 1991 93.0000000 107.1752093 - 403 7 2 1991 80.0000000 104.7033169 - 404 8 2 1991 73.0000000 102.4011594 - 405 9 2 1991 89.0000000 100.2507174 - 406 10 2 1991 84.0000000 98.2361638 - 407 11 2 1991 78.0000000 96.3435701 - 408 12 2 1991 79.0000000 94.5606550 - 409 13 2 1991 77.0000000 92.8765703 - 410 14 2 1991 80.0000000 91.2817168 - 411 15 2 1991 72.0000000 89.7675861 - 412 16 2 1991 78.0000000 89.9928272 - 413 17 2 1991 74.0000000 89.9401465 - 414 18 2 1991 77.0000000 88.2817131 - 415 19 2 1991 73.0000000 98.6169263 - 416 20 2 1991 69.0000000 114.3076439 - 417 21 2 1991 74.0000000 145.0143857 - 418 22 2 1991 81.0000000 160.0963300 - 419 23 2 1991 110.0000000 155.9735912 - 420 24 2 1991 180.0000000 151.9290637 - 421 25 2 1991 213.0000000 148.8248810 - 422 26 2 1991 222.0000000 145.4281456 - 423 27 2 1991 208.0000000 146.5111612 - 424 28 2 1991 211.0000000 140.4491504 - 425 1 3 1991 214.0000000 135.4117648 - 426 2 3 1991 208.0000000 143.2502808 - 427 3 3 1991 221.0000000 141.9111867 - 428 4 3 1991 281.0000000 132.9407850 - 429 5 3 1991 219.0000000 127.3317604 - 430 6 3 1991 190.0000000 122.3988201 - 431 7 3 1991 173.0000000 117.9279303 - 432 8 3 1991 164.0000000 114.0989585 - 433 9 3 1991 142.0000000 111.3850327 - 434 10 3 1991 133.0000000 111.1536250 - 435 11 3 1991 133.0000000 108.3490877 - 436 12 3 1991 118.0000000 104.9334473 - 437 13 3 1991 127.0000000 101.7968791 - 438 14 3 1991 113.0000000 98.9168387 - 439 15 3 1991 107.0000000 96.2617842 - 440 16 3 1991 100.0000000 93.8068118 - 441 17 3 1991 100.0000000 91.5355993 - 442 18 3 1991 95.0000000 89.4683099 - 443 19 3 1991 98.0000000 146.3472019 - 444 20 3 1991 119.0000000 154.1527948 - 445 21 3 1991 159.0000000 169.5721199 - 446 22 3 1991 196.0000000 184.0306099 - 447 23 3 1991 242.0000000 167.6916868 - 448 24 3 1991 216.0000000 154.6224809 - 449 25 3 1991 180.0000000 145.5410009 - 450 26 3 1991 145.0000000 138.0819270 - 451 27 3 1991 127.0000000 132.8140416 - 452 28 3 1991 117.0000000 126.1634900 - 453 29 3 1991 109.0000000 120.5927916 - 454 30 3 1991 106.0000000 115.5836280 - 455 31 3 1991 99.0000000 111.0640741 - 456 1 4 1991 96.0000000 106.9727555 - 457 2 4 1991 88.0000000 103.2570063 - 458 3 4 1991 87.0000000 99.8714926 - 459 4 4 1991 82.0000000 97.2341245 - 460 5 4 1991 84.0000000 95.1843897 - 461 6 4 1991 67.0000000 92.4790326 - 462 7 4 1991 89.0000000 90.1853007 - 463 8 4 1991 75.0000000 88.1692738 - 464 9 4 1991 79.0000000 86.0444252 - 465 10 4 1991 70.0000000 84.0013696 - 466 11 4 1991 69.0000000 82.0967318 - 467 12 4 1991 69.0000000 80.3189275 - 468 13 4 1991 56.0000000 78.6549575 - 469 14 4 1991 63.0000000 77.0961469 - 470 15 4 1991 58.0000000 75.6320842 - 471 16 4 1991 56.0000000 74.2447139 - 472 17 4 1991 54.0000000 72.9323135 - 473 18 4 1991 57.0000000 71.7378640 - 474 19 4 1991 53.0000000 71.7856763 - 475 20 4 1991 53.0000000 71.4621217 - 476 21 4 1991 65.0000000 70.3647193 - 477 22 4 1991 69.0000000 72.2932369 - 478 23 4 1991 61.0000000 73.8481430 - 479 24 4 1991 56.0000000 70.5364997 - 480 25 4 1991 56.0000000 68.9117116 - 481 26 4 1991 53.0000000 67.7090982 - 482 27 4 1991 49.0000000 66.5864451 - 483 28 4 1991 53.0000000 65.5239899 - 484 29 4 1991 48.0000000 69.1396751 - 485 30 4 1991 57.0000000 114.3455421 - 486 1 5 1991 69.0000000 108.9238935 - 487 2 5 1991 89.0000000 86.9693864 - 488 3 5 1991 105.0000000 83.4263739 - 489 4 5 1991 79.0000000 80.8888718 - 490 5 5 1991 69.0000000 78.6951032 - 491 6 5 1991 71.0000000 76.9199828 - 492 7 5 1991 60.0000000 74.6805122 - 493 8 5 1991 64.0000000 72.7652894 - 494 9 5 1991 59.0000000 70.9977532 - 495 10 5 1991 57.0000000 71.3958946 - 496 11 5 1991 55.0000000 73.6635605 - 497 12 5 1991 53.0000000 70.2067704 - 498 13 5 1991 52.0000000 68.2853243 - 499 14 5 1991 50.0000000 67.0496302 - 500 15 5 1991 52.0000000 71.6828135 - 501 16 5 1991 54.0000000 72.6075140 - 502 17 5 1991 54.0000000 67.6737776 - 503 18 5 1991 55.0000000 66.2227792 - 504 19 5 1991 48.0000000 64.8797981 - 505 20 5 1991 48.0000000 63.6121080 - 506 21 5 1991 49.0000000 62.4129080 - 507 22 5 1991 41.0000000 61.2762441 - 508 23 5 1991 40.0000000 60.1967504 - 509 24 5 1991 40.0000000 59.1695864 - 510 25 5 1991 39.0000000 58.1903813 - 511 26 5 1991 43.0000000 57.2551846 - 512 27 5 1991 39.0000000 56.3604225 - 513 28 5 1991 36.0000000 55.5028593 - 514 29 5 1991 33.0000000 54.6795625 - 515 30 5 1991 39.0000000 53.8878727 - 516 31 5 1991 34.0000000 53.1253758 - 517 1 6 1991 37.0000000 52.3898792 - 518 2 6 1991 35.0000000 51.6793892 - 519 3 6 1991 29.0000000 50.9920925 - 520 4 6 1991 33.0000000 50.3263378 - 521 5 6 1991 34.0000000 49.7087794 - 522 6 6 1991 32.0000000 67.3999767 - 523 7 6 1991 38.0000000 70.2486635 - 524 8 6 1991 39.0000000 59.8374148 - 525 9 6 1991 41.0000000 57.0641469 - 526 10 6 1991 44.0000000 70.9362142 - 527 11 6 1991 48.0000000 56.1751110 - 528 12 6 1991 42.0000000 53.1788643 - 529 13 6 1991 37.0000000 52.1476489 - 530 14 6 1991 39.0000000 51.3540157 - 531 15 6 1991 35.0000000 50.8675457 - 532 16 6 1991 31.0000000 53.7696944 - 533 17 6 1991 33.0000000 57.2291926 - 534 18 6 1991 31.0000000 54.4246037 - 535 19 6 1991 28.0000000 51.3470506 - 536 20 6 1991 60.0000000 87.6377538 - 537 21 6 1991 48.0000000 74.0908542 - 538 22 6 1991 54.0000000 58.4105559 - 539 23 6 1991 63.0000000 65.8019846 - 540 24 6 1991 41.0000000 59.9372350 - 541 25 6 1991 42.0000000 55.8178118 - 542 26 6 1991 43.0000000 54.3599617 - 543 27 6 1991 38.0000000 62.9429093 - 544 28 6 1991 38.0000000 62.8930052 - 545 29 6 1991 35.0000000 55.9708211 - 546 30 6 1991 41.0000000 53.7310118 - 547 1 7 1991 41.0000000 52.3650121 - 548 2 7 1991 38.0000000 51.0975004 - 549 3 7 1991 34.0000000 49.9153718 - 550 4 7 1991 27.0000000 48.8100960 - 551 5 7 1991 31.0000000 47.7741154 - 552 6 7 1991 30.0000000 46.8010708 - 553 7 7 1991 26.0000000 53.4500315 - 554 8 7 1991 30.0000000 52.4115728 - 555 9 7 1991 31.0000000 46.0618094 - 556 10 7 1991 23.0000000 45.1372192 - 557 11 7 1991 35.0000000 44.2663113 - 558 12 7 1991 19.0000000 45.3177078 - 559 13 7 1991 24.0000000 73.1846508 - 560 14 7 1991 26.0000000 66.6057353 - 561 15 7 1991 27.0000000 50.7722527 - 562 16 7 1991 41.0000000 47.4777475 - 563 17 7 1991 34.0000000 46.3482678 - 564 18 7 1991 27.0000000 45.2959470 - 565 19 7 1991 25.0000000 44.3102319 - 566 20 7 1991 23.0000000 43.3839079 - 567 21 7 1991 22.0000000 42.5126307 - 568 22 7 1991 27.0000000 41.6912062 - 569 23 7 1991 23.0000000 40.9150034 - 570 24 7 1991 21.0000000 41.8293140 - 571 25 7 1991 23.0000000 67.2749289 - 572 26 7 1991 33.0000000 60.3610371 - 573 27 7 1991 23.0000000 46.8758124 - 574 28 7 1991 29.0000000 43.3312564 - 575 29 7 1991 30.0000000 42.3356034 - 576 30 7 1991 35.0000000 56.0176051 - 577 31 7 1991 27.0000000 55.1520473 - 578 1 8 1991 45.0000000 44.0405292 - 579 2 8 1991 47.0000000 42.9111835 - 580 3 8 1991 40.0000000 41.9094506 - 581 4 8 1991 35.0000000 40.9729105 - 582 5 8 1991 26.0000000 40.0951768 - 583 6 8 1991 23.0000000 39.2705832 - 584 7 8 1991 30.0000000 40.2816100 - 585 8 8 1991 33.0000000 40.8023992 - 586 9 8 1991 30.0000000 37.9381757 - 587 10 8 1991 28.0000000 36.8298114 - 588 11 8 1991 19.0000000 36.1727437 - 589 12 8 1991 20.0000000 35.5488071 - 590 13 8 1991 16.0000000 34.9550760 - 591 14 8 1991 18.0000000 34.3889277 - 592 15 8 1991 18.0000000 33.8480074 - 593 16 8 1991 20.0000000 33.3301985 - 594 17 8 1991 16.0000000 32.8335961 - 595 18 8 1991 15.0000000 32.3564835 - 596 19 8 1991 15.0000000 31.8973123 - 597 20 8 1991 14.0000000 31.4546840 - 598 21 8 1991 15.0000000 31.0273343 - 599 22 8 1991 13.0000000 30.6148954 - 600 23 8 1991 12.0000000 30.4462367 - 601 24 8 1991 11.0000000 30.1657043 - 602 25 8 1991 12.0000000 29.4920562 - 603 26 8 1991 11.0000000 29.1235102 - 604 27 8 1991 13.0000000 28.7651474 - 605 28 8 1991 11.0000000 28.4161255 - 606 29 8 1991 12.0000000 28.0758451 - 607 30 8 1991 12.0000000 27.7437600 - 608 31 8 1991 11.0000000 27.4193710 - 609 1 9 1991 11.0000000 29.2273137 - 610 2 9 1991 17.0000000 29.4027675 - 611 3 9 1991 11.0000000 26.6869570 - 612 4 9 1991 12.0000000 26.3765810 - 613 5 9 1991 11.0000000 26.0733300 - 614 6 9 1991 11.0000000 25.7764928 - 615 7 9 1991 18.0000000 25.4857121 - 616 8 9 1991 11.0000000 25.2006607 - 617 9 9 1991 13.0000000 24.9210387 - 618 10 9 1991 12.0000000 25.5521301 - 619 11 9 1991 11.0000000 54.7284241 - 620 12 9 1991 20.0000000 47.9063683 - 621 13 9 1991 21.0000000 26.7499181 - 622 14 9 1991 29.0000000 26.3019881 - 623 15 9 1991 28.0000000 25.8766488 - 624 16 9 1991 20.0000000 25.4706224 - 625 17 9 1991 20.0000000 25.0822293 - 626 18 9 1991 20.0000000 24.7099649 - 627 19 9 1991 12.0000000 24.3524804 - 628 20 9 1991 11.0000000 24.0085641 - 629 21 9 1991 11.0000000 23.6771267 - 630 22 9 1991 22.0000000 45.8652962 - 631 23 9 1991 14.0000000 45.9458081 - 632 24 9 1991 48.0000000 26.3683052 - 633 25 9 1991 45.0000000 85.9103211 - 634 26 9 1991 80.0000000 88.9689010 - 635 27 9 1991 61.0000000 67.7357713 - 636 28 9 1991 61.0000000 93.6820681 - 637 29 9 1991 65.0000000 93.2934276 - 638 30 9 1991 63.0000000 81.4949932 - 639 1 10 1991 90.0000000 65.9917666 - 640 2 10 1991 59.0000000 60.4575847 - 641 3 10 1991 45.0000000 56.6725326 - 642 4 10 1991 42.0000000 53.3837068 - 643 5 10 1991 41.0000000 99.0889252 - 644 6 10 1991 41.0000000 106.7680126 - 645 7 10 1991 73.0000000 77.1421272 - 646 8 10 1991 96.0000000 69.2804595 - 647 9 10 1991 61.0000000 64.9239502 - 648 10 10 1991 44.0000000 61.0529317 - 649 11 10 1991 42.0000000 57.7645936 - 650 12 10 1991 41.0000000 82.3989134 - 651 13 10 1991 42.0000000 82.3404180 - 652 14 10 1991 61.0000000 64.6552075 - 653 15 10 1991 55.0000000 61.0972209 - 654 16 10 1991 41.0000000 63.6264399 - 655 17 10 1991 48.0000000 79.3663796 - 656 18 10 1991 52.0000000 104.3541804 - 657 19 10 1991 66.0000000 88.4501078 - 658 20 10 1991 59.0000000 78.2499500 - 659 21 10 1991 71.0000000 73.8174678 - 660 22 10 1991 74.0000000 68.2331221 - 661 23 10 1991 70.0000000 64.4472947 - 662 24 10 1991 59.0000000 61.1020886 - 663 25 10 1991 57.0000000 58.1059050 - 664 26 10 1991 57.0000000 55.4025395 - 665 27 10 1991 51.0000000 52.9569283 - 666 28 10 1991 47.0000000 50.7387433 - 667 29 10 1991 48.0000000 48.7216781 - 668 30 10 1991 45.0000000 51.5486840 - 669 31 10 1991 43.0000000 54.1868844 - 670 1 11 1991 40.0000000 66.5018304 - 671 2 11 1991 47.0000000 69.5199055 - 672 3 11 1991 46.0000000 97.5434648 - 673 4 11 1991 76.0000000 133.5452433 - 674 5 11 1991 60.0000000 125.5580168 - 675 6 11 1991 132.0000000 117.5141572 - 676 7 11 1991 133.0000000 124.6852881 - 677 8 11 1991 113.0000000 149.2042065 - 678 9 11 1991 120.0000000 159.0548542 - 679 10 11 1991 141.0000000 141.1455645 - 680 11 11 1991 208.0000000 167.8212611 - 681 12 11 1991 166.0000000 228.8669257 - 682 13 11 1991 183.0000000 302.1513572 - 683 14 11 1991 299.0000000 446.4209756 - 684 15 11 1991 521.0000000 416.3101284 - 685 16 11 1991 443.0000000 357.0151946 - 686 17 11 1991 304.0000000 303.7538182 - 687 18 11 1991 231.0000000 295.1697054 - 688 19 11 1991 192.0000000 291.6057820 - 689 20 11 1991 199.0000000 264.6219276 - 690 21 11 1991 201.0000000 242.2996362 - 691 22 11 1991 173.0000000 207.4191856 - 692 23 11 1991 159.0000000 179.5543557 - 693 24 11 1991 160.0000000 158.9308498 - 694 25 11 1991 146.0000000 141.8978779 - 695 26 11 1991 110.0000000 127.3986575 - 696 27 11 1991 114.0000000 116.6588721 - 697 28 11 1991 97.0000000 109.9343285 - 698 29 11 1991 89.0000000 104.1814454 - 699 30 11 1991 73.0000000 99.0213515 - 700 1 12 1991 69.0000000 94.3789664 - 701 2 12 1991 67.0000000 90.1905251 - 702 3 12 1991 63.0000000 86.4011195 - 703 4 12 1991 58.0000000 82.9633264 - 704 5 12 1991 59.0000000 79.8360698 - 705 6 12 1991 53.0000000 76.9836756 - 706 7 12 1991 54.0000000 74.3750808 - 707 8 12 1991 51.0000000 71.9831716 - 708 9 12 1991 47.0000000 69.7842259 - 709 10 12 1991 42.0000000 67.7574433 - 710 11 12 1991 40.0000000 65.8845461 - 711 12 12 1991 39.0000000 64.1494417 - 712 13 12 1991 36.0000000 62.5379333 - 713 14 12 1991 37.0000000 61.0374740 - 714 15 12 1991 32.0000000 59.6369552 - 715 16 12 1991 37.0000000 71.3992867 - 716 17 12 1991 62.0000000 175.7368581 - 717 18 12 1991 118.0000000 219.2549780 - 718 19 12 1991 170.0000000 306.4859197 - 719 20 12 1991 229.0000000 410.7729034 - 720 21 12 1991 448.0000000 501.1010076 - 721 22 12 1991 464.0000000 675.3506711 - 722 23 12 1991 675.0000000 612.0230377 - 723 24 12 1991 844.0000000 529.6660126 - 724 25 12 1991 569.0000000 438.7565632 - 725 26 12 1991 358.0000000 368.0100213 - 726 27 12 1991 279.0000000 315.4329383 - 727 28 12 1991 238.0000000 271.1066547 - 728 29 12 1991 201.0000000 232.8476375 - 729 30 12 1991 185.0000000 202.4192868 - 730 31 12 1991 165.0000000 179.0792538 - 731 1 1 1992 140.0000000 160.7422874 - 732 2 1 1992 126.0000000 146.1884176 - 733 3 1 1992 117.0000000 136.2652762 - 734 4 1 1992 114.0000000 132.8052375 - 735 5 1 1992 108.0000000 128.1053999 - 736 6 1 1992 108.0000000 121.2790820 - 737 7 1 1992 101.0000000 115.7782787 - 738 8 1 1992 97.0000000 114.3497084 - 739 9 1 1992 89.0000000 131.0678717 - 740 10 1 1992 111.0000000 162.8015837 - 741 11 1 1992 135.0000000 157.5753360 - 742 12 1 1992 171.0000000 142.8340495 - 743 13 1 1992 125.0000000 134.9157936 - 744 14 1 1992 111.0000000 127.9492058 - 745 15 1 1992 100.0000000 121.7710670 - 746 16 1 1992 87.0000000 116.3535384 - 747 17 1 1992 75.0000000 111.3526877 - 748 18 1 1992 79.0000000 106.8163839 - 749 19 1 1992 70.0000000 109.4150454 - 750 20 1 1992 72.0000000 106.3215201 - 751 21 1 1992 87.0000000 103.2791799 - 752 22 1 1992 79.0000000 98.8716821 - 753 23 1 1992 71.0000000 95.3963102 - 754 24 1 1992 66.0000000 92.2310743 - 755 25 1 1992 67.0000000 89.3391503 - 756 26 1 1992 65.0000000 86.6886760 - 757 27 1 1992 59.0000000 84.2520059 - 758 28 1 1992 57.0000000 82.0424843 - 759 29 1 1992 54.0000000 80.4533831 - 760 30 1 1992 59.0000000 82.3561178 - 761 31 1 1992 57.0000000 89.6161904 - 762 1 2 1992 56.0000000 91.6509290 - 763 2 2 1992 54.0000000 89.5692635 - 764 3 2 1992 58.0000000 87.4246301 - 765 4 2 1992 63.0000000 144.5834744 - 766 5 2 1992 76.0000000 184.2463549 - 767 6 2 1992 250.0000000 208.8202612 - 768 7 2 1992 346.0000000 182.3717068 - 769 8 2 1992 241.0000000 162.3503949 - 770 9 2 1992 180.0000000 160.1894560 - 771 10 2 1992 164.0000000 167.2224932 - 772 11 2 1992 183.0000000 187.7019368 - 773 12 2 1992 215.0000000 216.7095447 - 774 13 2 1992 265.0000000 230.6186364 - 775 14 2 1992 287.0000000 244.6703242 - 776 15 2 1992 272.0000000 245.0591393 - 777 16 2 1992 253.0000000 273.8661885 - 778 17 2 1992 301.0000000 264.0201282 - 779 18 2 1992 275.0000000 225.5576641 - 780 19 2 1992 224.0000000 196.6415287 - 781 20 2 1992 194.0000000 174.8370193 - 782 21 2 1992 173.0000000 159.7091873 - 783 22 2 1992 157.0000000 149.7976215 - 784 23 2 1992 142.0000000 142.6632077 - 785 24 2 1992 133.0000000 137.8526790 - 786 25 2 1992 128.0000000 131.6682990 - 787 26 2 1992 125.0000000 125.1964509 - 788 27 2 1992 125.0000000 119.7494011 - 789 28 2 1992 110.0000000 114.8499060 - 790 29 2 1992 107.0000000 110.4124600 - 791 1 3 1992 97.0000000 106.5322092 - 792 2 3 1992 97.0000000 104.6705880 - 793 3 3 1992 86.0000000 105.4872210 - 794 4 3 1992 93.0000000 100.5941825 - 795 5 3 1992 86.0000000 97.5497897 - 796 6 3 1992 82.0000000 94.7602310 - 797 7 3 1992 80.0000000 92.0542483 - 798 8 3 1992 77.0000000 89.5510915 - 799 9 3 1992 73.0000000 87.2340889 - 800 10 3 1992 76.0000000 85.3071944 - 801 11 3 1992 68.0000000 83.6392501 - 802 12 3 1992 70.0000000 141.6128571 - 803 13 3 1992 116.0000000 208.0523356 - 804 14 3 1992 206.0000000 251.8980026 - 805 15 3 1992 433.0000000 306.4958934 - 806 16 3 1992 495.0000000 328.4576158 - 807 17 3 1992 331.0000000 277.5229118 - 808 18 3 1992 240.0000000 239.3299820 - 809 19 3 1992 215.0000000 208.8954491 - 810 20 3 1992 185.0000000 184.8796116 - 811 21 3 1992 185.0000000 177.2372863 - 812 22 3 1992 185.0000000 237.4942379 - 813 23 3 1992 213.0000000 344.6176417 - 814 24 3 1992 466.0000000 384.2023845 - 815 25 3 1992 580.0000000 402.3681125 - 816 26 3 1992 566.0000000 370.9293670 - 817 27 3 1992 487.0000000 329.8012667 - 818 28 3 1992 387.0000000 298.2305535 - 819 29 3 1992 311.0000000 263.9977648 - 820 30 3 1992 270.0000000 234.0380401 - 821 31 3 1992 246.0000000 220.9287683 - 822 1 4 1992 229.0000000 236.8884781 - 823 2 4 1992 222.0000000 229.2049506 - 824 3 4 1992 217.0000000 245.8696167 - 825 4 4 1992 208.0000000 303.8557121 - 826 5 4 1992 220.0000000 279.9632583 - 827 6 4 1992 210.0000000 245.0007417 - 828 7 4 1992 190.0000000 215.6197234 - 829 8 4 1992 173.0000000 191.4366152 - 830 9 4 1992 166.0000000 172.4032601 - 831 10 4 1992 133.0000000 157.5769552 - 832 11 4 1992 126.0000000 145.0991841 - 833 12 4 1992 124.0000000 136.8359451 - 834 13 4 1992 116.0000000 131.3251327 - 835 14 4 1992 112.0000000 134.1989899 - 836 15 4 1992 111.0000000 168.5487053 - 837 16 4 1992 137.0000000 177.2240076 - 838 17 4 1992 206.0000000 168.1794857 - 839 18 4 1992 176.0000000 165.8084852 - 840 19 4 1992 161.0000000 153.4572958 - 841 20 4 1992 161.0000000 145.9288402 - 842 21 4 1992 139.0000000 139.4616926 - 843 22 4 1992 139.0000000 133.6640177 - 844 23 4 1992 123.0000000 128.4314198 - 845 24 4 1992 119.0000000 123.6939123 - 846 25 4 1992 111.0000000 119.3924564 - 847 26 4 1992 94.0000000 115.5700589 - 848 27 4 1992 94.0000000 116.5295184 - 849 28 4 1992 102.0000000 121.1786359 - 850 29 4 1992 120.0000000 118.8693443 - 851 30 4 1992 120.0000000 113.9243341 - 852 1 5 1992 114.0000000 141.1755864 - 853 2 5 1992 115.0000000 156.6710236 - 854 3 5 1992 206.0000000 137.4494938 - 855 4 5 1992 215.0000000 130.2081184 - 856 5 5 1992 125.0000000 125.1338983 - 857 6 5 1992 123.0000000 120.5444785 - 858 7 5 1992 113.0000000 116.3741124 - 859 8 5 1992 77.0000000 112.5722169 - 860 9 5 1992 83.0000000 109.3546219 - 861 10 5 1992 83.0000000 119.4478419 - 862 11 5 1992 96.0000000 118.2482171 - 863 12 5 1992 120.0000000 108.1445025 - 864 13 5 1992 80.0000000 103.7198319 - 865 14 5 1992 76.0000000 100.8430281 - 866 15 5 1992 69.0000000 98.1889999 - 867 16 5 1992 63.0000000 95.7329764 - 868 17 5 1992 61.0000000 93.4534460 - 869 18 5 1992 60.0000000 91.3315693 - 870 19 5 1992 59.0000000 89.3508101 - 871 20 5 1992 67.0000000 87.4978961 - 872 21 5 1992 51.0000000 85.7625320 - 873 22 5 1992 44.0000000 84.1279097 - 874 23 5 1992 42.0000000 82.5813797 - 875 24 5 1992 51.0000000 81.2501668 - 876 25 5 1992 42.0000000 80.1127671 - 877 26 5 1992 54.0000000 90.3393835 - 878 27 5 1992 53.0000000 82.5433737 - 879 28 5 1992 59.0000000 78.2143981 - 880 29 5 1992 55.0000000 86.9570536 - 881 30 5 1992 54.0000000 86.5186134 - 882 31 5 1992 48.0000000 80.5820486 - 883 1 6 1992 63.0000000 83.3116479 - 884 2 6 1992 61.0000000 82.3930706 - 885 3 6 1992 55.0000000 83.6011229 - 886 4 6 1992 75.0000000 100.7278272 - 887 5 6 1992 53.0000000 113.6193544 - 888 6 6 1992 77.0000000 110.6663739 - 889 7 6 1992 114.0000000 106.3882829 - 890 8 6 1992 167.0000000 116.8412425 - 891 9 6 1992 116.0000000 105.7215788 - 892 10 6 1992 91.0000000 96.6437582 - 893 11 6 1992 85.0000000 93.3664662 - 894 12 6 1992 68.0000000 90.4239782 - 895 13 6 1992 71.0000000 87.7364185 - 896 14 6 1992 63.0000000 85.2616248 - 897 15 6 1992 59.0000000 82.9768683 - 898 16 6 1992 46.0000000 80.8615445 - 899 17 6 1992 44.0000000 78.8975956 - 900 18 6 1992 39.0000000 77.0691598 - 901 19 6 1992 41.0000000 75.3745266 - 902 20 6 1992 44.0000000 76.3161599 - 903 21 6 1992 39.0000000 74.2279973 - 904 22 6 1992 32.0000000 71.7014746 - 905 23 6 1992 40.0000000 72.9709714 - 906 24 6 1992 41.0000000 86.3337247 - 907 25 6 1992 42.0000000 80.4867751 - 908 26 6 1992 42.0000000 72.6463486 - 909 27 6 1992 48.0000000 70.2348514 - 910 28 6 1992 37.0000000 68.7659866 - 911 29 6 1992 40.0000000 67.3902401 - 912 30 6 1992 29.0000000 66.3213352 - 913 1 7 1992 30.0000000 65.8475946 - 914 2 7 1992 36.0000000 64.1218940 - 915 3 7 1992 29.0000000 69.4949340 - 916 4 7 1992 36.0000000 80.3598386 - 917 5 7 1992 50.0000000 98.6769084 - 918 6 7 1992 78.0000000 100.2160477 - 919 7 7 1992 54.0000000 81.3806262 - 920 8 7 1992 57.0000000 72.6988656 - 921 9 7 1992 51.0000000 70.9428430 - 922 10 7 1992 47.0000000 91.0200760 - 923 11 7 1992 46.0000000 110.5730083 - 924 12 7 1992 76.0000000 103.6987848 - 925 13 7 1992 72.0000000 91.4828767 - 926 14 7 1992 67.0000000 83.0142444 - 927 15 7 1992 63.0000000 80.0702945 - 928 16 7 1992 47.0000000 77.3870546 - 929 17 7 1992 47.0000000 74.9333915 - 930 18 7 1992 42.0000000 72.6828561 - 931 19 7 1992 41.0000000 70.6124753 - 932 20 7 1992 39.0000000 68.7022402 - 933 21 7 1992 37.0000000 68.5112754 - 934 22 7 1992 33.0000000 68.3133663 - 935 23 7 1992 33.0000000 65.0129061 - 936 24 7 1992 33.0000000 63.5177003 - 937 25 7 1992 37.0000000 62.1186225 - 938 26 7 1992 26.0000000 60.8036501 - 939 27 7 1992 24.0000000 59.5688710 - 940 28 7 1992 26.0000000 58.4065138 - 941 29 7 1992 29.0000000 57.3096755 - 942 30 7 1992 19.0000000 56.2722144 - 943 31 7 1992 22.0000000 57.5124699 - 944 1 8 1992 28.0000000 57.1202530 - 945 2 8 1992 35.0000000 54.0662242 - 946 3 8 1992 29.0000000 53.1675713 - 947 4 8 1992 36.0000000 52.3120405 - 948 5 8 1992 52.0000000 51.4950248 - 949 6 8 1992 74.0000000 50.7132006 - 950 7 8 1992 54.0000000 49.9635878 - 951 8 8 1992 57.0000000 49.2435116 - 952 9 8 1992 48.0000000 51.5565155 - 953 10 8 1992 47.0000000 50.3094602 - 954 11 8 1992 46.0000000 57.9597171 - 955 12 8 1992 75.0000000 57.1502287 - 956 13 8 1992 73.0000000 61.8328755 - 957 14 8 1992 66.0000000 64.7666355 - 958 15 8 1992 60.0000000 57.4315136 - 959 16 8 1992 47.0000000 49.2175113 - 960 17 8 1992 46.0000000 48.3017484 - 961 18 8 1992 42.0000000 47.4375890 - 962 19 8 1992 41.0000000 46.7499120 - 963 20 8 1992 40.0000000 53.9495004 - 964 21 8 1992 37.0000000 49.9632430 - 965 22 8 1992 32.0000000 47.4572172 - 966 23 8 1992 32.0000000 47.2227755 - 967 24 8 1992 32.0000000 44.7978369 - 968 25 8 1992 36.0000000 44.0021920 - 969 26 8 1992 27.0000000 43.2877858 - 970 27 8 1992 25.0000000 42.6073036 - 971 28 8 1992 25.0000000 42.5318478 - 972 29 8 1992 28.0000000 49.6576564 - 973 30 8 1992 20.0000000 63.6463566 - 974 31 8 1992 22.0000000 107.7256423 - 975 1 9 1992 49.0000000 94.8939575 - 976 2 9 1992 77.0000000 81.2404857 - 977 3 9 1992 67.0000000 76.7161436 - 978 4 9 1992 45.0000000 75.5730655 - 979 5 9 1992 44.0000000 67.6732296 - 980 6 9 1992 64.0000000 60.7306771 - 981 7 9 1992 52.0000000 58.3364750 - 982 8 9 1992 40.0000000 56.1661690 - 983 9 9 1992 30.0000000 54.1923429 - 984 10 9 1992 34.0000000 52.3918729 - 985 11 9 1992 32.0000000 51.1349788 - 986 12 9 1992 36.0000000 49.9287862 - 987 13 9 1992 28.0000000 48.2731974 - 988 14 9 1992 33.0000000 48.4747911 - 989 15 9 1992 35.0000000 50.4348720 - 990 16 9 1992 30.0000000 46.0075525 - 991 17 9 1992 32.0000000 44.8462351 - 992 18 9 1992 29.0000000 43.8560725 - 993 19 9 1992 30.0000000 43.4268315 - 994 20 9 1992 28.0000000 42.0207587 - 995 21 9 1992 29.0000000 41.1307663 - 996 22 9 1992 29.0000000 40.2973245 - 997 23 9 1992 27.0000000 39.5232891 - 998 24 9 1992 27.0000000 38.7819455 - 999 25 9 1992 23.0000000 38.0789610 - 1000 26 9 1992 28.0000000 37.4126007 - 1001 27 9 1992 25.0000000 36.7810676 - 1002 28 9 1992 25.0000000 38.1536354 - 1003 29 9 1992 27.0000000 39.8191829 - 1004 30 9 1992 25.0000000 36.0267917 - 1005 1 10 1992 27.0000000 35.9850314 - 1006 2 10 1992 33.0000000 38.1243262 - 1007 3 10 1992 29.0000000 38.7282295 - 1008 4 10 1992 31.0000000 36.4445106 - 1009 5 10 1992 25.0000000 49.4323920 - 1010 6 10 1992 25.0000000 55.5144682 - 1011 7 10 1992 36.0000000 43.4738553 - 1012 8 10 1992 42.0000000 37.4912763 - 1013 9 10 1992 43.0000000 39.3006645 - 1014 10 10 1992 26.0000000 45.5246056 - 1015 11 10 1992 27.0000000 42.4907770 - 1016 12 10 1992 27.0000000 37.8985785 - 1017 13 10 1992 26.0000000 37.0465379 - 1018 14 10 1992 26.0000000 36.3656630 - 1019 15 10 1992 23.0000000 50.5615881 - 1020 16 10 1992 21.0000000 49.2981942 - 1021 17 10 1992 26.0000000 42.9239898 - 1022 18 10 1992 34.0000000 45.0572927 - 1023 19 10 1992 37.0000000 40.7439687 - 1024 20 10 1992 31.0000000 49.0013100 - 1025 21 10 1992 31.0000000 49.1100790 - 1026 22 10 1992 35.0000000 47.3131258 - 1027 23 10 1992 33.0000000 75.0554229 - 1028 24 10 1992 40.0000000 140.0545577 - 1029 25 10 1992 74.0000000 186.1880381 - 1030 26 10 1992 161.0000000 188.8029075 - 1031 27 10 1992 285.0000000 204.2316458 - 1032 28 10 1992 244.0000000 226.0304587 - 1033 29 10 1992 263.0000000 237.1808370 - 1034 30 10 1992 276.0000000 198.7757377 - 1035 31 10 1992 186.0000000 170.8727688 - 1036 1 11 1992 154.0000000 149.9109125 - 1037 2 11 1992 112.0000000 155.8673247 - 1038 3 11 1992 104.0000000 159.9626447 - 1039 4 11 1992 96.0000000 150.9147638 - 1040 5 11 1992 99.0000000 132.3984761 - 1041 6 11 1992 126.0000000 117.3478703 - 1042 7 11 1992 91.0000000 106.7084335 - 1043 8 11 1992 84.0000000 101.8932278 - 1044 9 11 1992 81.0000000 108.0141816 - 1045 10 11 1992 85.0000000 146.3738491 - 1046 11 11 1992 126.0000000 234.0977738 - 1047 12 11 1992 279.0000000 280.3817877 - 1048 13 11 1992 390.0000000 288.7831427 - 1049 14 11 1992 294.0000000 297.6629228 - 1050 15 11 1992 260.0000000 388.6266495 - 1051 16 11 1992 398.0000000 528.4390320 - 1052 17 11 1992 520.0000000 502.8343319 - 1053 18 11 1992 487.0000000 478.0418156 - 1054 19 11 1992 380.0000000 488.4995236 - 1055 20 11 1992 385.0000000 418.1525582 - 1056 21 11 1992 351.0000000 444.3955209 - 1057 22 11 1992 309.0000000 521.4814057 - 1058 23 11 1992 587.0000000 433.5182896 - 1059 24 11 1992 661.0000000 372.1851274 - 1060 25 11 1992 447.0000000 375.3390255 - 1061 26 11 1992 361.0000000 398.8930879 - 1062 27 11 1992 351.0000000 381.2781520 - 1063 28 11 1992 353.0000000 412.5118780 - 1064 29 11 1992 369.0000000 501.7969937 - 1065 30 11 1992 452.0000000 489.4521138 - 1066 1 12 1992 441.0000000 404.7265305 - 1067 2 12 1992 348.0000000 437.8610192 - 1068 3 12 1992 394.0000000 483.7755273 - 1069 4 12 1992 455.0000000 524.6027539 - 1070 5 12 1992 491.0000000 556.8211503 - 1071 6 12 1992 469.0000000 489.8304058 - 1072 7 12 1992 364.0000000 474.9198395 - 1073 8 12 1992 338.0000000 418.2533090 - 1074 9 12 1992 334.0000000 351.1210927 - 1075 10 12 1992 268.0000000 293.7421704 - 1076 11 12 1992 236.0000000 291.5165442 - 1077 12 12 1992 230.0000000 300.6301896 - 1078 13 12 1992 239.0000000 273.2578419 - 1079 14 12 1992 256.0000000 232.2366764 - 1080 15 12 1992 217.0000000 208.4416560 - 1081 16 12 1992 201.0000000 195.6244584 - 1082 17 12 1992 188.0000000 188.2951712 - 1083 18 12 1992 176.0000000 177.6770962 - 1084 19 12 1992 170.0000000 166.6208449 - 1085 20 12 1992 168.0000000 164.1178974 - 1086 21 12 1992 131.0000000 169.3147897 - 1087 22 12 1992 133.0000000 169.6904193 - 1088 23 12 1992 134.0000000 157.8119227 - 1089 24 12 1992 127.0000000 149.5542622 - 1090 25 12 1992 117.0000000 142.5661809 - 1091 26 12 1992 113.0000000 136.3015461 - 1092 27 12 1992 100.0000000 130.6661858 - 1093 28 12 1992 94.0000000 125.5798521 - 1094 29 12 1992 87.0000000 120.9738912 - 1095 30 12 1992 86.0000000 116.7893736 - 1096 31 12 1992 81.0000000 112.9755576 - 1097 1 1 1993 77.0000000 109.4886220 - 1098 2 1 1993 76.0000000 106.2906152 - 1099 3 1 1993 61.0000000 103.3485806 - 1100 4 1 1993 61.0000000 100.6338267 - 1101 5 1 1993 57.0000000 98.1213140 - 1102 6 1 1993 66.0000000 115.8243114 - 1103 7 1 1993 67.0000000 136.0176177 - 1104 8 1 1993 84.0000000 139.4005247 - 1105 9 1 1993 90.0000000 145.9119053 - 1106 10 1 1993 113.0000000 191.1269131 - 1107 11 1 1993 265.0000000 394.0565076 - 1108 12 1 1993 559.0000000 574.6073478 - 1109 13 1 1993 832.0000000 575.8551087 - 1110 14 1 1993 601.0000000 497.2191019 - 1111 15 1 1993 436.0000000 407.5449952 - 1112 16 1 1993 339.0000000 337.3590477 - 1113 17 1 1993 292.0000000 287.1787738 - 1114 18 1 1993 247.0000000 253.4167959 - 1115 19 1 1993 218.0000000 228.5465239 - 1116 20 1 1993 205.0000000 208.2183198 - 1117 21 1 1993 190.0000000 195.7318482 - 1118 22 1 1993 176.0000000 189.0153218 - 1119 23 1 1993 173.0000000 183.6178106 - 1120 24 1 1993 173.0000000 238.4735350 - 1121 25 1 1993 199.0000000 333.9544182 - 1122 26 1 1993 361.0000000 291.1581528 - 1123 27 1 1993 295.0000000 293.3333328 - 1124 28 1 1993 238.0000000 315.0666589 - 1125 29 1 1993 263.0000000 296.4148482 - 1126 30 1 1993 245.0000000 261.1255064 - 1127 31 1 1993 222.0000000 228.9297187 - 1128 1 2 1993 199.0000000 205.2595049 - 1129 2 2 1993 186.0000000 186.8284777 - 1130 3 2 1993 171.0000000 172.2159518 - 1131 4 2 1993 157.0000000 161.6803312 - 1132 5 2 1993 159.0000000 153.7857226 - 1133 6 2 1993 129.0000000 146.9979903 - 1134 7 2 1993 119.0000000 141.1180341 - 1135 8 2 1993 119.0000000 135.6306815 - 1136 9 2 1993 105.0000000 130.6279917 - 1137 10 2 1993 106.0000000 126.0827207 - 1138 11 2 1993 105.0000000 121.9399860 - 1139 12 2 1993 95.0000000 118.1523590 - 1140 13 2 1993 91.0000000 114.6787385 - 1141 14 2 1993 88.0000000 111.4834122 - 1142 15 2 1993 84.0000000 108.5352721 - 1143 16 2 1993 83.0000000 106.1091657 - 1144 17 2 1993 79.0000000 106.8904880 - 1145 18 2 1993 78.0000000 107.8865597 - 1146 19 2 1993 84.0000000 107.1419613 - 1147 20 2 1993 91.0000000 121.9843846 - 1148 21 2 1993 91.0000000 126.2749738 - 1149 22 2 1993 90.0000000 124.0143857 - 1150 23 2 1993 103.0000000 118.9840172 - 1151 24 2 1993 94.0000000 114.4413588 - 1152 25 2 1993 81.0000000 110.6224977 - 1153 26 2 1993 78.0000000 107.2772311 - 1154 27 2 1993 75.0000000 108.5159312 - 1155 28 2 1993 76.0000000 107.3645768 - 1156 1 3 1993 80.0000000 103.7783237 - 1157 2 3 1993 75.0000000 102.2105436 - 1158 3 3 1993 76.0000000 100.9339478 - 1159 4 3 1993 72.0000000 97.8969619 - 1160 5 3 1993 65.0000000 95.3988097 - 1161 6 3 1993 64.0000000 93.1243846 - 1162 7 3 1993 64.0000000 91.4200563 - 1163 8 3 1993 68.0000000 90.7958734 - 1164 9 3 1993 68.0000000 88.5677667 - 1165 10 3 1993 67.0000000 88.2553949 - 1166 11 3 1993 61.0000000 89.1991698 - 1167 12 3 1993 57.0000000 89.9000635 - 1168 13 3 1993 58.0000000 87.8291779 - 1169 14 3 1993 54.0000000 85.9054209 - 1170 15 3 1993 66.0000000 84.1309943 - 1171 16 3 1993 54.0000000 82.5532864 - 1172 17 3 1993 57.0000000 81.0796365 - 1173 18 3 1993 57.0000000 79.7270072 - 1174 19 3 1993 52.0000000 78.3823431 - 1175 20 3 1993 57.0000000 77.0921781 - 1176 21 3 1993 58.0000000 76.8458494 - 1177 22 3 1993 57.0000000 93.9629711 - 1178 23 3 1993 56.0000000 97.7787040 - 1179 24 3 1993 63.0000000 87.8133108 - 1180 25 3 1993 76.0000000 85.6444480 - 1181 26 3 1993 56.0000000 83.6251911 - 1182 27 3 1993 59.0000000 81.7397879 - 1183 28 3 1993 59.0000000 79.9749382 - 1184 29 3 1993 54.0000000 78.3188495 - 1185 30 3 1993 48.0000000 76.7610481 - 1186 31 3 1993 55.0000000 75.2922159 - 1187 1 4 1993 48.0000000 75.8248241 - 1188 2 4 1993 53.0000000 78.9539504 - 1189 3 4 1993 47.0000000 76.8981189 - 1190 4 4 1993 59.0000000 84.7045394 - 1191 5 4 1993 53.0000000 104.7581629 - 1192 6 4 1993 64.0000000 101.7246509 - 1193 7 4 1993 63.0000000 92.3063412 - 1194 8 4 1993 75.0000000 90.2304443 - 1195 9 4 1993 64.0000000 87.1418656 - 1196 10 4 1993 59.0000000 89.2920259 - 1197 11 4 1993 60.0000000 95.4516769 - 1198 12 4 1993 63.0000000 93.3121764 - 1199 13 4 1993 69.0000000 91.7737217 - 1200 14 4 1993 79.0000000 90.0052591 - 1201 15 4 1993 82.0000000 87.2550705 - 1202 16 4 1993 68.0000000 85.4401662 - 1203 17 4 1993 56.0000000 83.0005317 - 1204 18 4 1993 59.0000000 80.8320103 - 1205 19 4 1993 61.0000000 78.7345741 - 1206 20 4 1993 62.0000000 76.7639899 - 1207 21 4 1993 57.0000000 74.9299406 - 1208 22 4 1993 53.0000000 73.2235802 - 1209 23 4 1993 47.0000000 71.6258988 - 1210 24 4 1993 46.0000000 70.1239008 - 1211 25 4 1993 47.0000000 68.7119909 - 1212 26 4 1993 45.0000000 67.3815967 - 1213 27 4 1993 43.0000000 66.1250825 - 1214 28 4 1993 41.0000000 64.9379227 - 1215 29 4 1993 38.0000000 63.8209685 - 1216 30 4 1993 39.0000000 63.2477755 - 1217 1 5 1993 40.0000000 62.4593108 - 1218 2 5 1993 41.0000000 63.4751840 - 1219 3 5 1993 45.0000000 62.0502507 - 1220 4 5 1993 49.0000000 60.4453586 - 1221 5 5 1993 40.0000000 59.4965901 - 1222 6 5 1993 43.0000000 58.7217681 - 1223 7 5 1993 38.0000000 58.3370884 - 1224 8 5 1993 38.0000000 58.4032625 - 1225 9 5 1993 43.0000000 57.3712645 - 1226 10 5 1993 44.0000000 56.8802443 - 1227 11 5 1993 41.0000000 56.8391094 - 1228 12 5 1993 51.0000000 66.0113156 - 1229 13 5 1993 63.0000000 104.0904476 - 1230 14 5 1993 68.0000000 76.3642057 - 1231 15 5 1993 77.0000000 65.1711618 - 1232 16 5 1993 77.0000000 63.4046808 - 1233 17 5 1993 59.0000000 61.7360422 - 1234 18 5 1993 49.0000000 60.2135302 - 1235 19 5 1993 43.0000000 65.6281489 - 1236 20 5 1993 44.0000000 74.3259904 - 1237 21 5 1993 48.0000000 69.5711466 - 1238 22 5 1993 44.0000000 61.8721460 - 1239 23 5 1993 46.0000000 60.2854330 - 1240 24 5 1993 40.0000000 58.8171815 - 1241 25 5 1993 43.0000000 57.4535972 - 1242 26 5 1993 30.0000000 57.0188056 - 1243 27 5 1993 45.0000000 67.8183240 - 1244 28 5 1993 43.0000000 72.0264154 - 1245 29 5 1993 44.0000000 62.2571588 - 1246 30 5 1993 54.0000000 64.7732235 - 1247 31 5 1993 56.0000000 64.2926212 - 1248 1 6 1993 44.0000000 58.1790035 - 1249 2 6 1993 43.0000000 59.4175247 - 1250 3 6 1993 33.0000000 64.9796987 - 1251 4 6 1993 45.0000000 58.7514868 - 1252 5 6 1993 46.0000000 56.3457577 - 1253 6 6 1993 42.0000000 54.9966601 - 1254 7 6 1993 40.0000000 53.7395551 - 1255 8 6 1993 30.0000000 52.5647863 - 1256 9 6 1993 31.0000000 51.6826107 - 1257 10 6 1993 32.0000000 51.0186747 - 1258 11 6 1993 25.0000000 51.0051003 - 1259 12 6 1993 33.0000000 52.4177106 - 1260 13 6 1993 29.0000000 50.2806231 - 1261 14 6 1993 40.0000000 52.2151544 - 1262 15 6 1993 42.0000000 54.0940181 - 1263 16 6 1993 37.0000000 51.2360540 - 1264 17 6 1993 46.0000000 49.5882339 - 1265 18 6 1993 47.0000000 47.9267956 - 1266 19 6 1993 50.0000000 50.1494599 - 1267 20 6 1993 43.0000000 77.5742716 - 1268 21 6 1993 69.0000000 68.4826756 - 1269 22 6 1993 61.0000000 75.3949702 - 1270 23 6 1993 67.0000000 85.4581352 - 1271 24 6 1993 77.0000000 66.3072050 - 1272 25 6 1993 87.0000000 63.7043051 - 1273 26 6 1993 55.0000000 61.5419222 - 1274 27 6 1993 43.0000000 59.5586718 - 1275 28 6 1993 40.0000000 57.7347372 - 1276 29 6 1993 30.0000000 56.0529308 - 1277 30 6 1993 40.0000000 54.4981787 - 1278 1 7 1993 40.0000000 55.4800474 - 1279 2 7 1993 27.0000000 54.8800973 - 1280 3 7 1993 34.0000000 51.7842258 - 1281 4 7 1993 30.0000000 50.4992265 - 1282 5 7 1993 31.0000000 49.4256219 - 1283 6 7 1993 27.0000000 48.2068376 - 1284 7 7 1993 31.0000000 47.1607785 - 1285 8 7 1993 26.0000000 46.1793209 - 1286 9 7 1993 23.0000000 46.2431140 - 1287 10 7 1993 24.0000000 46.9238342 - 1288 11 7 1993 25.0000000 51.1718939 - 1289 12 7 1993 34.0000000 60.6969284 - 1290 13 7 1993 40.0000000 58.5914440 - 1291 14 7 1993 41.0000000 78.9950311 - 1292 15 7 1993 46.0000000 65.8874288 - 1293 16 7 1993 39.0000000 52.2541691 - 1294 17 7 1993 43.0000000 51.2458401 - 1295 18 7 1993 35.0000000 50.4582426 - 1296 19 7 1993 49.0000000 70.0887763 - 1297 20 7 1993 38.0000000 69.3698698 - 1298 21 7 1993 41.0000000 65.0769335 - 1299 22 7 1993 45.0000000 60.6596247 - 1300 23 7 1993 41.0000000 53.7425594 - 1301 24 7 1993 42.0000000 52.1521355 - 1302 25 7 1993 40.0000000 50.7285954 - 1303 26 7 1993 35.0000000 49.3717717 - 1304 27 7 1993 40.0000000 74.3065089 - 1305 28 7 1993 40.0000000 64.2950331 - 1306 29 7 1993 36.0000000 51.9874185 - 1307 30 7 1993 40.0000000 109.1209375 - 1308 31 7 1993 61.0000000 92.2885413 - 1309 1 8 1993 36.0000000 65.4355688 - 1310 2 8 1993 46.0000000 62.5418352 - 1311 3 8 1993 32.0000000 59.9293570 - 1312 4 8 1993 38.0000000 57.5630150 - 1313 5 8 1993 32.0000000 55.4175934 - 1314 6 8 1993 25.0000000 53.4724679 - 1315 7 8 1993 26.0000000 51.6822514 - 1316 8 8 1993 29.0000000 50.0419586 - 1317 9 8 1993 29.0000000 57.8969276 - 1318 10 8 1993 28.0000000 60.1130433 - 1319 11 8 1993 37.0000000 52.6546147 - 1320 12 8 1993 40.0000000 48.7091708 - 1321 13 8 1993 49.0000000 47.2946594 - 1322 14 8 1993 32.0000000 48.1898592 - 1323 15 8 1993 37.0000000 46.5848733 - 1324 16 8 1993 37.0000000 44.5386369 - 1325 17 8 1993 27.0000000 43.4161261 - 1326 18 8 1993 24.0000000 42.3719038 - 1327 19 8 1993 24.0000000 41.3979391 - 1328 20 8 1993 22.0000000 40.4871919 - 1329 21 8 1993 21.0000000 39.6334258 - 1330 22 8 1993 16.0000000 40.6467502 - 1331 23 8 1993 21.0000000 43.8010475 - 1332 24 8 1993 27.0000000 40.5079345 - 1333 25 8 1993 26.0000000 38.0088525 - 1334 26 8 1993 23.0000000 37.2861227 - 1335 27 8 1993 21.0000000 40.1921670 - 1336 28 8 1993 28.0000000 41.5362733 - 1337 29 8 1993 17.0000000 36.6824600 - 1338 30 8 1993 24.0000000 36.0169932 - 1339 31 8 1993 25.0000000 35.3856853 - 1340 1 9 1993 25.0000000 34.7850450 - 1341 2 9 1993 19.0000000 34.2124671 - 1342 3 9 1993 17.0000000 37.2549608 - 1343 4 9 1993 16.0000000 41.8588872 - 1344 5 9 1993 19.0000000 34.9164646 - 1345 6 9 1993 23.0000000 33.8641632 - 1346 7 9 1993 25.0000000 57.2731453 - 1347 8 9 1993 34.0000000 50.3124429 - 1348 9 9 1993 31.0000000 64.0884936 - 1349 10 9 1993 35.0000000 90.4297380 - 1350 11 9 1993 53.0000000 118.7006971 - 1351 12 9 1993 71.0000000 117.5060552 - 1352 13 9 1993 74.0000000 152.7999626 - 1353 14 9 1993 87.0000000 168.9967225 - 1354 15 9 1993 173.0000000 160.5411266 - 1355 16 9 1993 117.0000000 130.2641241 - 1356 17 9 1993 93.0000000 114.1048154 - 1357 18 9 1993 77.0000000 105.2216774 - 1358 19 9 1993 62.0000000 97.5494340 - 1359 20 9 1993 54.0000000 91.0713602 - 1360 21 9 1993 48.0000000 88.5953566 - 1361 22 9 1993 46.0000000 111.1316361 - 1362 23 9 1993 55.0000000 117.9069100 - 1363 24 9 1993 66.0000000 121.7989236 - 1364 25 9 1993 64.0000000 118.5793841 - 1365 26 9 1993 52.0000000 106.1674390 - 1366 27 9 1993 68.0000000 98.7998052 - 1367 28 9 1993 69.0000000 102.3520659 - 1368 29 9 1993 62.0000000 99.1475885 - 1369 30 9 1993 76.0000000 93.2675828 - 1370 1 10 1993 72.0000000 119.5771934 - 1371 2 10 1993 68.0000000 119.6719900 - 1372 3 10 1993 72.0000000 115.5426540 - 1373 4 10 1993 78.0000000 122.4085475 - 1374 5 10 1993 116.0000000 196.5630056 - 1375 6 10 1993 131.0000000 211.4081525 - 1376 7 10 1993 180.0000000 187.3150573 - 1377 8 10 1993 203.0000000 187.2493469 - 1378 9 10 1993 164.0000000 196.9627798 - 1379 10 10 1993 178.0000000 214.5195247 - 1380 11 10 1993 161.0000000 253.6860033 - 1381 12 10 1993 287.0000000 256.6699598 - 1382 13 10 1993 360.0000000 329.7852372 - 1383 14 10 1993 374.0000000 332.6781862 - 1384 15 10 1993 297.0000000 291.9568883 - 1385 16 10 1993 247.0000000 296.8964397 - 1386 17 10 1993 273.0000000 301.4746351 - 1387 18 10 1993 261.0000000 267.9550866 - 1388 19 10 1993 265.0000000 237.4589835 - 1389 20 10 1993 230.0000000 203.5537457 - 1390 21 10 1993 199.0000000 180.8021007 - 1391 22 10 1993 173.0000000 175.5378962 - 1392 23 10 1993 182.0000000 197.4086310 - 1393 24 10 1993 203.0000000 201.7331979 - 1394 25 10 1993 213.0000000 175.3455542 - 1395 26 10 1993 180.0000000 154.4840514 - 1396 27 10 1993 154.0000000 140.3075381 - 1397 28 10 1993 118.0000000 131.1843398 - 1398 29 10 1993 112.0000000 123.7435569 - 1399 30 10 1993 98.0000000 117.1183509 - 1400 31 10 1993 97.0000000 111.1977908 - 1401 1 11 1993 91.0000000 105.8902536 - 1402 2 11 1993 85.0000000 101.1175865 - 1403 3 11 1993 75.0000000 96.8128958 - 1404 4 11 1993 76.0000000 92.9187360 - 1405 5 11 1993 78.0000000 89.3856217 - 1406 6 11 1993 72.0000000 86.2651453 - 1407 7 11 1993 76.0000000 86.4180819 - 1408 8 11 1993 69.0000000 83.9849899 - 1409 9 11 1993 66.0000000 81.5121612 - 1410 10 11 1993 71.0000000 81.9521677 - 1411 11 11 1993 64.0000000 92.3841294 - 1412 12 11 1993 67.0000000 95.8545081 - 1413 13 11 1993 80.0000000 95.9771518 - 1414 14 11 1993 78.0000000 126.3697881 - 1415 15 11 1993 80.0000000 130.6063615 - 1416 16 11 1993 86.0000000 121.1892179 - 1417 17 11 1993 125.0000000 111.6900842 - 1418 18 11 1993 96.0000000 106.3222579 - 1419 19 11 1993 82.0000000 101.4838708 - 1420 20 11 1993 77.0000000 97.1222017 - 1421 21 11 1993 67.0000000 93.1760857 - 1422 22 11 1993 71.0000000 89.5955927 - 1423 23 11 1993 61.0000000 86.3375694 - 1424 24 11 1993 42.0000000 83.3647548 - 1425 25 11 1993 63.0000000 81.0263725 - 1426 26 11 1993 57.0000000 79.8629766 - 1427 27 11 1993 58.0000000 76.9730875 - 1428 28 11 1993 49.0000000 74.7914267 - 1429 29 11 1993 50.0000000 72.7737255 - 1430 30 11 1993 55.0000000 70.9027617 - 1431 1 12 1993 54.0000000 69.1634242 - 1432 2 12 1993 54.0000000 76.2118544 - 1433 3 12 1993 50.0000000 74.1441260 - 1434 4 12 1993 51.0000000 74.7841618 - 1435 5 12 1993 62.0000000 71.7280441 - 1436 6 12 1993 62.0000000 69.3016170 - 1437 7 12 1993 71.0000000 106.0850079 - 1438 8 12 1993 79.0000000 167.6844020 - 1439 9 12 1993 153.0000000 183.3679810 - 1440 10 12 1993 291.0000000 248.7485327 - 1441 11 12 1993 332.0000000 335.5372035 - 1442 12 12 1993 465.0000000 391.2190165 - 1443 13 12 1993 518.0000000 459.4032166 - 1444 14 12 1993 539.0000000 487.3648583 - 1445 15 12 1993 559.0000000 482.4165875 - 1446 16 12 1993 500.0000000 553.2946213 - 1447 17 12 1993 526.0000000 585.0356443 - 1448 18 12 1993 583.0000000 591.5786561 - 1449 19 12 1993 677.0000000 664.6650690 - 1450 20 12 1993 781.0000000 989.4794559 - 1451 21 12 1993 1180.0000000 1117.5850190 - 1452 22 12 1993 1460.0000000 1100.3000489 - 1453 23 12 1993 1600.0000000 1157.9831944 - 1454 24 12 1993 1410.0000000 1157.3798134 - 1455 25 12 1993 1230.0000000 986.6384962 - 1456 26 12 1993 1070.0000000 803.1583597 - 1457 27 12 1993 746.0000000 662.5288722 - 1458 28 12 1993 542.0000000 563.2707274 - 1459 29 12 1993 492.0000000 545.7895910 - 1460 30 12 1993 491.0000000 615.9550381 - 1461 31 12 1993 617.0000000 815.2922727 diff --git a/check/case_00/simulation_mhm_case00.ini b/check/case_00/simulation_mhm_case00.ini new file mode 100644 index 00000000..cd32512b --- /dev/null +++ b/check/case_00/simulation_mhm_case00.ini @@ -0,0 +1,14 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_00 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ \ No newline at end of file diff --git a/check/case_01/mhm.nml b/check/case_01/mhm.nml index 083daef0..0d24175a 100644 --- a/check/case_01/mhm.nml +++ b/check/case_01/mhm.nml @@ -1,583 +1,141 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -! -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 + +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' +/ -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -! general directories used by mRM and mHM -&directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/b1_" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/b1_" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/b2_" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 +/ -&directories_mHM -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&lcover_mpr + fracsealed_cityarea = 0.6 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. &mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 2 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .TRUE. -write_restart = .TRUE. -perform_mpr = .FALSE. + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .true. + resolution_routing(1) = 24000 + timestep = 1 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1993 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1994 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1995 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1996 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' -/ -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 1 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -! -!> basin 3 -!> number of gauges for subbasin (2) -NoGauges_basin(3) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(3,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(3,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_01/output_save/ConfigFile.log b/check/case_01/output_save/ConfigFile.log index 8367f00c..85041d08 100644 --- a/check/case_01/output_save/ConfigFile.log +++ b/check/case_01/output_save/ConfigFile.log @@ -1,22 +1,23 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N -Number of basins 2 -Total No. of nodes 68 -Total No. of reaches 67 -No. of cells L0 46545 -No. of cells L1 68 -No. of cells L11 68 -Total No. of gauges 2 +Number of basins 1 +Total No. of gauges 1 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 1 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. -Basin 2 Hydrology Resolution [m] 24000. -Basin 2 Routing Resolution [m] 24000. Flag READ restart T Flag WRITE restart T @@ -25,42 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - -------------------------------------------------------------- - Model Run Periods for Basin 2 -------------------------------------------------------------- - From To - Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - --------------------------------------------------- - Land Cover Observations for Basin 3 --------------------------------------------------- - Year Land cover scene Land Cover File - - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 1 lc_1990.asc - 1992 1 lc_1990.asc - 1993 1 lc_1990.asc +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 1 lc_1990.asc - 1992 1 lc_1990.asc - 1993 1 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -125,8 +99,7 @@ Simulation Period (1)+(2) 6 1 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 - 2 2 1600.000 11.000 + 1 1 932.000 16.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -195,40 +168,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -272,145 +245,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - --------------------------------------------------------------------------------- - Directory list --------------------------------------------------------------------------------- -Directory to morphological input ../../test_basin/input/morph/ -Directory to land cover input ../../test_basin/input/luse/ -Directory to gauging station input ../../test_basin/input/gauge/ -Directory to precipitation input ../../test_basin/input/meteo/pre/ -Directory to temperature input ../../test_basin/input/meteo/tavg/ -Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/b2_ -Directory to write output when restarted output_b1/b2_ - ------------------------------- -River Network (Routing level) ------------------------------- - Label 0 = intermediate draining cell - Label 1 = headwater cell - Label 2 = sink cell - ---------------------------------------------------------------------------- - Overall From To Routing Label Length Mean - Link Routing Routing Sequence Slope - Id Node Node [km] [o/oo] ---------------------------------------------------------------------------- - 35 1 5 1 1 7.536 0.100 - 40 7 3 2 1 28.349 0.100 - 43 10 9 3 1 9.243 1.190 - 44 11 8 4 1 40.042 0.999 - 48 15 14 5 1 27.728 0.938 - 53 20 19 6 1 28.435 1.653 - 54 21 16 7 1 21.728 4.786 - 58 25 24 8 1 32.127 4.171 - 63 30 26 9 1 28.642 3.840 - 66 33 29 10 1 27.142 13.116 - 67 34 32 11 1 31.763 2.613 - 36 3 4 12 0 29.642 0.100 - 41 8 4 13 0 1.414 0.100 - 47 14 13 14 0 38.213 0.576 - 49 16 17 15 0 9.985 0.100 - 52 19 18 16 0 33.799 1.036 - 59 26 22 17 0 61.734 0.794 - 62 29 28 18 0 6.243 3.204 - 65 32 31 19 0 16.399 1.342 - 37 4 5 20 0 38.420 0.833 - 46 13 12 21 0 42.127 0.166 - 51 18 17 22 0 42.542 0.282 - 61 28 24 23 0 32.835 1.980 - 64 31 27 24 0 32.728 2.781 - 57 24 23 25 0 34.420 1.133 - 60 27 23 26 0 29.799 1.141 - 56 23 22 27 0 0.707 0.100 - 55 22 17 28 0 38.456 0.364 - 50 17 12 29 0 35.885 1.728 - 45 12 9 30 0 30.263 0.100 - 42 9 5 31 0 24.399 0.100 - 38 5 6 32 0 5.036 0.100 - 39 6 2 33 2 14.692 0.100 - --------------------- - Overall Basin - Cell Routing - Id Node Id --------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 - ------------------------------- - Modeling Routing Effective - Cell Cell Id Area - Id [-] [km2] ------------------------------- - 35 1 126.750 - 36 2 229.750 - 37 3 107.750 - 38 4 312.500 - 39 5 573.750 - 40 6 314.250 - 41 7 42.500 - 42 8 524.750 - 43 9 576.000 - 44 10 146.500 - 45 11 470.000 - 46 12 576.000 - 47 13 414.500 - 48 14 340.750 - 49 15 9.000 - 50 16 230.250 - 51 17 576.000 - 52 18 576.000 - 53 19 527.250 - 54 20 48.250 - 55 21 10.500 - 56 22 545.000 - 57 23 576.000 - 58 24 576.000 - 59 25 318.500 - 60 26 456.250 - 61 27 551.250 - 62 28 576.000 - 63 29 337.000 - 64 30 3.250 - 65 31 198.000 - 66 32 555.250 - 67 33 89.000 - 68 34 121.750 ------------------------------- - Total[km2] 11636.250 - - + diff --git a/check/case_01/output_save/b1_daily_discharge.out b/check/case_01/output_save/b1_daily_discharge.out index d0a824f7..d5eb24da 100644 --- a/check/case_01/output_save/b1_daily_discharge.out +++ b/check/case_01/output_save/b1_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 120.2189122 - 2 2 1 1990 129.0000000 110.5187550 - 3 3 1 1990 117.0000000 102.7380020 - 4 4 1 1990 111.0000000 96.4521499 - 5 5 1 1990 112.0000000 91.4560729 - 6 6 1 1990 93.0000000 88.4411813 - 7 7 1 1990 87.0000000 85.4037430 - 8 8 1 1990 84.0000000 82.2467098 - 9 9 1 1990 80.0000000 79.5048518 - 10 10 1 1990 78.0000000 77.1798891 - 11 11 1 1990 78.0000000 75.1871771 - 12 12 1 1990 77.0000000 73.4599520 - 13 13 1 1990 76.0000000 73.1351989 - 14 14 1 1990 73.0000000 76.1338837 - 15 15 1 1990 66.0000000 88.4411707 - 16 16 1 1990 76.0000000 88.9709058 - 17 17 1 1990 73.0000000 98.2992391 - 18 18 1 1990 71.0000000 105.1283504 - 19 19 1 1990 90.0000000 99.6383906 - 20 20 1 1990 82.0000000 100.6434736 - 21 21 1 1990 80.0000000 93.2895075 - 22 22 1 1990 81.0000000 86.8651674 - 23 23 1 1990 97.0000000 217.8030408 - 24 24 1 1990 198.0000000 250.9785657 - 25 25 1 1990 392.0000000 359.0923472 - 26 26 1 1990 519.0000000 357.1628611 - 27 27 1 1990 565.0000000 295.1409347 - 28 28 1 1990 331.0000000 279.6684865 - 29 29 1 1990 293.0000000 270.7973249 - 30 30 1 1990 302.0000000 229.0046859 - 31 31 1 1990 233.0000000 198.4047691 - 32 1 2 1990 198.0000000 206.3175275 - 33 2 2 1990 183.0000000 226.3257484 - 34 3 2 1990 206.0000000 225.7875755 - 35 4 2 1990 215.0000000 194.0323994 - 36 5 2 1990 183.0000000 170.8339660 - 37 6 2 1990 159.0000000 152.7171138 - 38 7 2 1990 167.0000000 138.3898076 - 39 8 2 1990 138.0000000 133.3190036 - 40 9 2 1990 126.0000000 132.6880976 - 41 10 2 1990 131.0000000 255.1023540 - 42 11 2 1990 173.0000000 304.3551256 - 43 12 2 1990 240.0000000 360.3547210 - 44 13 2 1990 270.0000000 582.6348949 - 45 14 2 1990 458.0000000 1109.5307001 - 46 15 2 1990 996.0000000 1292.1445381 - 47 16 2 1990 1370.0000000 1019.2392322 - 48 17 2 1990 1540.0000000 755.4152826 - 49 18 2 1990 1210.0000000 573.1886100 - 50 19 2 1990 616.0000000 447.9209169 - 51 20 2 1990 465.0000000 369.3686498 - 52 21 2 1990 373.0000000 316.8047757 - 53 22 2 1990 298.0000000 276.3774587 - 54 23 2 1990 270.0000000 244.9678923 - 55 24 2 1990 234.0000000 220.3750978 - 56 25 2 1990 218.0000000 207.9566322 - 57 26 2 1990 203.0000000 377.2589991 - 58 27 2 1990 314.0000000 617.1837010 - 59 28 2 1990 520.0000000 863.2477916 - 60 1 3 1990 689.0000000 877.2291606 - 61 2 3 1990 777.0000000 692.9793687 - 62 3 3 1990 584.0000000 529.3953472 - 63 4 3 1990 429.0000000 429.9603709 - 64 5 3 1990 365.0000000 370.4385251 - 65 6 3 1990 281.0000000 323.1434891 - 66 7 3 1990 257.0000000 286.3549478 - 67 8 3 1990 231.0000000 257.7458898 - 68 9 3 1990 211.0000000 235.3025659 - 69 10 3 1990 191.0000000 217.5603033 - 70 11 3 1990 182.0000000 203.3948724 - 71 12 3 1990 173.0000000 191.9791465 - 72 13 3 1990 159.0000000 183.1715134 - 73 14 3 1990 153.0000000 179.7743056 - 74 15 3 1990 141.0000000 177.3851863 - 75 16 3 1990 136.0000000 170.5718525 - 76 17 3 1990 130.0000000 164.7570599 - 77 18 3 1990 123.0000000 159.8501364 - 78 19 3 1990 115.0000000 155.6631562 - 79 20 3 1990 113.0000000 152.5373691 - 80 21 3 1990 102.0000000 149.7268541 - 81 22 3 1990 105.0000000 147.4718462 - 82 23 3 1990 106.0000000 146.3396313 - 83 24 3 1990 87.0000000 144.9446566 - 84 25 3 1990 80.0000000 146.0803680 - 85 26 3 1990 84.0000000 143.1121726 - 86 27 3 1990 82.0000000 141.4796334 - 87 28 3 1990 91.0000000 158.8115522 - 88 29 3 1990 97.0000000 169.5376796 - 89 30 3 1990 110.0000000 165.1432264 - 90 31 3 1990 97.0000000 158.0152307 - 91 1 4 1990 93.0000000 151.4688122 - 92 2 4 1990 85.0000000 146.0107773 - 93 3 4 1990 84.0000000 152.8840858 - 94 4 4 1990 81.0000000 161.0395463 - 95 5 4 1990 81.0000000 153.6694367 - 96 6 4 1990 76.0000000 153.2588891 - 97 7 4 1990 72.0000000 146.6186368 - 98 8 4 1990 68.0000000 141.0774962 - 99 9 4 1990 72.0000000 136.4209230 - 100 10 4 1990 65.0000000 132.5315460 - 101 11 4 1990 62.0000000 131.8451404 - 102 12 4 1990 62.0000000 132.5041220 - 103 13 4 1990 65.0000000 137.0360292 - 104 14 4 1990 68.0000000 172.9963222 - 105 15 4 1990 75.0000000 177.3951506 - 106 16 4 1990 90.0000000 178.0088997 - 107 17 4 1990 92.0000000 182.5886227 - 108 18 4 1990 94.0000000 184.1183877 - 109 19 4 1990 110.0000000 170.3234152 - 110 20 4 1990 99.0000000 158.7027863 - 111 21 4 1990 86.0000000 149.3992983 - 112 22 4 1990 86.0000000 147.6559129 - 113 23 4 1990 86.0000000 155.9653232 - 114 24 4 1990 88.0000000 159.0082630 - 115 25 4 1990 93.0000000 150.3750450 - 116 26 4 1990 99.0000000 142.3779510 - 117 27 4 1990 86.0000000 138.8868823 - 118 28 4 1990 74.0000000 135.4481836 - 119 29 4 1990 72.0000000 129.6887947 - 120 30 4 1990 77.0000000 124.7300154 - 121 1 5 1990 56.0000000 120.5647479 - 122 2 5 1990 64.0000000 117.0320689 - 123 3 5 1990 58.0000000 114.0046261 - 124 4 5 1990 50.0000000 111.3815010 - 125 5 5 1990 50.0000000 109.0826223 - 126 6 5 1990 50.0000000 107.0443838 - 127 7 5 1990 50.0000000 105.2545133 - 128 8 5 1990 53.0000000 104.7894721 - 129 9 5 1990 62.0000000 103.9601175 - 130 10 5 1990 64.0000000 106.2553457 - 131 11 5 1990 65.0000000 107.1556524 - 132 12 5 1990 75.0000000 102.4192653 - 133 13 5 1990 71.0000000 100.5860352 - 134 14 5 1990 63.0000000 99.2213864 - 135 15 5 1990 61.0000000 97.7414966 - 136 16 5 1990 49.0000000 96.3640149 - 137 17 5 1990 46.0000000 94.9396317 - 138 18 5 1990 46.0000000 93.6326964 - 139 19 5 1990 48.0000000 92.4104445 - 140 20 5 1990 41.0000000 91.2989697 - 141 21 5 1990 45.0000000 97.5771229 - 142 22 5 1990 52.0000000 95.6102491 - 143 23 5 1990 50.0000000 97.6313656 - 144 24 5 1990 56.0000000 100.1169458 - 145 25 5 1990 41.0000000 94.4063136 - 146 26 5 1990 40.0000000 90.8390015 - 147 27 5 1990 39.0000000 89.0337545 - 148 28 5 1990 39.0000000 87.4302907 - 149 29 5 1990 33.0000000 85.9884051 - 150 30 5 1990 37.0000000 84.6764195 - 151 31 5 1990 30.0000000 83.4693182 - 152 1 6 1990 37.0000000 97.2898997 - 153 2 6 1990 36.0000000 97.3449241 - 154 3 6 1990 40.0000000 123.8858820 - 155 4 6 1990 45.0000000 102.5822604 - 156 5 6 1990 39.0000000 92.2728716 - 157 6 6 1990 48.0000000 88.9542282 - 158 7 6 1990 39.0000000 142.6130184 - 159 8 6 1990 49.0000000 141.4573253 - 160 9 6 1990 84.0000000 132.3115457 - 161 10 6 1990 91.0000000 120.2781138 - 162 11 6 1990 80.0000000 110.4216224 - 163 12 6 1990 66.0000000 103.2806777 - 164 13 6 1990 53.0000000 97.5208099 - 165 14 6 1990 64.0000000 92.6799392 - 166 15 6 1990 55.0000000 88.7032066 - 167 16 6 1990 54.0000000 85.3880756 - 168 17 6 1990 42.0000000 82.6000487 - 169 18 6 1990 48.0000000 80.6490695 - 170 19 6 1990 48.0000000 104.6609133 - 171 20 6 1990 60.0000000 123.7513994 - 172 21 6 1990 75.0000000 120.6497178 - 173 22 6 1990 78.0000000 111.0663225 - 174 23 6 1990 66.0000000 102.4665445 - 175 24 6 1990 63.0000000 95.4844504 - 176 25 6 1990 52.0000000 90.1124652 - 177 26 6 1990 49.0000000 85.6917885 - 178 27 6 1990 44.0000000 88.2867389 - 179 28 6 1990 51.0000000 85.1554704 - 180 29 6 1990 61.0000000 111.9488062 - 181 30 6 1990 81.0000000 138.9985748 - 182 1 7 1990 79.0000000 102.5858926 - 183 2 7 1990 92.0000000 89.7220664 - 184 3 7 1990 72.0000000 98.1815989 - 185 4 7 1990 58.0000000 120.5546710 - 186 5 7 1990 69.0000000 157.0873993 - 187 6 7 1990 94.0000000 138.6512647 - 188 7 7 1990 199.0000000 142.6427136 - 189 8 7 1990 133.0000000 142.4214312 - 190 9 7 1990 124.0000000 124.2847612 - 191 10 7 1990 123.0000000 112.7379203 - 192 11 7 1990 99.0000000 103.4403278 - 193 12 7 1990 88.0000000 95.9195433 - 194 13 7 1990 84.0000000 89.8048904 - 195 14 7 1990 72.0000000 84.8049148 - 196 15 7 1990 55.0000000 80.6900163 - 197 16 7 1990 65.0000000 77.2790102 - 198 17 7 1990 50.0000000 74.4286941 - 199 18 7 1990 50.0000000 72.0257227 - 200 19 7 1990 46.0000000 69.9802626 - 201 20 7 1990 44.0000000 68.2210265 - 202 21 7 1990 42.0000000 66.6913779 - 203 22 7 1990 37.0000000 65.3462694 - 204 23 7 1990 38.0000000 64.1498335 - 205 24 7 1990 44.0000000 63.0734825 - 206 25 7 1990 30.0000000 62.0944076 - 207 26 7 1990 26.0000000 61.1943935 - 208 27 7 1990 31.0000000 60.3588790 - 209 28 7 1990 33.0000000 63.4680430 - 210 29 7 1990 42.0000000 59.7593607 - 211 30 7 1990 36.0000000 58.2193869 - 212 31 7 1990 34.0000000 57.5363873 - 213 1 8 1990 25.0000000 56.8804018 - 214 2 8 1990 22.0000000 56.2472053 - 215 3 8 1990 28.0000000 55.6333954 - 216 4 8 1990 25.0000000 55.0362281 - 217 5 8 1990 19.0000000 54.4536906 - 218 6 8 1990 22.0000000 53.8840486 - 219 7 8 1990 19.0000000 53.3250979 - 220 8 8 1990 22.0000000 52.7761025 - 221 9 8 1990 19.0000000 52.2361629 - 222 10 8 1990 20.0000000 51.7044922 - 223 11 8 1990 19.0000000 51.1804466 - 224 12 8 1990 19.0000000 50.6634972 - 225 13 8 1990 22.0000000 56.7739781 - 226 14 8 1990 36.0000000 79.7041457 - 227 15 8 1990 31.0000000 62.3373458 - 228 16 8 1990 30.0000000 58.8630099 - 229 17 8 1990 28.0000000 53.6462296 - 230 18 8 1990 34.0000000 49.6107367 - 231 19 8 1990 21.0000000 48.8234148 - 232 20 8 1990 30.0000000 48.1016345 - 233 21 8 1990 22.0000000 47.4333193 - 234 22 8 1990 21.0000000 46.8087982 - 235 23 8 1990 23.0000000 46.2203189 - 236 24 8 1990 20.0000000 45.6616606 - 237 25 8 1990 29.0000000 45.1283111 - 238 26 8 1990 20.0000000 44.7962130 - 239 27 8 1990 22.0000000 46.0898658 - 240 28 8 1990 23.0000000 44.6610188 - 241 29 8 1990 35.0000000 43.5167570 - 242 30 8 1990 51.0000000 146.6827857 - 243 31 8 1990 80.0000000 97.7206332 - 244 1 9 1990 56.0000000 53.5960999 - 245 2 9 1990 33.0000000 48.5317618 - 246 3 9 1990 27.0000000 46.9897247 - 247 4 9 1990 27.0000000 52.5776357 - 248 5 9 1990 28.0000000 50.9063876 - 249 6 9 1990 26.0000000 47.2369009 - 250 7 9 1990 24.0000000 48.7238647 - 251 8 9 1990 33.0000000 45.9865372 - 252 9 9 1990 26.0000000 43.9218394 - 253 10 9 1990 27.0000000 42.7666406 - 254 11 9 1990 22.0000000 41.7653669 - 255 12 9 1990 22.0000000 40.8879156 - 256 13 9 1990 21.0000000 40.1102978 - 257 14 9 1990 22.0000000 39.4133741 - 258 15 9 1990 22.0000000 38.7818568 - 259 16 9 1990 22.0000000 38.2035214 - 260 17 9 1990 20.0000000 37.6685826 - 261 18 9 1990 22.0000000 37.1691991 - 262 19 9 1990 16.0000000 36.6990811 - 263 20 9 1990 22.0000000 36.2531781 - 264 21 9 1990 19.0000000 41.2505473 - 265 22 9 1990 32.0000000 123.2233642 - 266 23 9 1990 27.0000000 79.6428600 - 267 24 9 1990 45.0000000 63.4990697 - 268 25 9 1990 42.0000000 50.4905586 - 269 26 9 1990 39.0000000 46.6725154 - 270 27 9 1990 30.0000000 44.1310082 - 271 28 9 1990 28.0000000 42.0335124 - 272 29 9 1990 30.0000000 40.2911609 - 273 30 9 1990 30.0000000 111.9739629 - 274 1 10 1990 56.0000000 150.6690010 - 275 2 10 1990 72.0000000 112.6412460 - 276 3 10 1990 73.0000000 123.1096655 - 277 4 10 1990 68.0000000 103.5822628 - 278 5 10 1990 53.0000000 91.7010592 - 279 6 10 1990 42.0000000 80.2744792 - 280 7 10 1990 33.0000000 71.4877102 - 281 8 10 1990 42.0000000 64.4797274 - 282 9 10 1990 34.0000000 58.8153593 - 283 10 10 1990 36.0000000 54.2291764 - 284 11 10 1990 36.0000000 50.5055817 - 285 12 10 1990 28.0000000 47.4662983 - 286 13 10 1990 32.0000000 44.9708123 - 287 14 10 1990 27.0000000 42.9081682 - 288 15 10 1990 35.0000000 41.5270813 - 289 16 10 1990 42.0000000 41.9486740 - 290 17 10 1990 35.0000000 53.7156459 - 291 18 10 1990 39.0000000 51.3615739 - 292 19 10 1990 34.0000000 45.0479580 - 293 20 10 1990 32.0000000 42.7542928 - 294 21 10 1990 34.0000000 40.8572446 - 295 22 10 1990 27.0000000 39.2760634 - 296 23 10 1990 31.0000000 37.9468602 - 297 24 10 1990 28.0000000 36.8190111 - 298 25 10 1990 25.0000000 36.5777852 - 299 26 10 1990 29.0000000 57.0237849 - 300 27 10 1990 31.0000000 64.9950279 - 301 28 10 1990 65.0000000 230.4354813 - 302 29 10 1990 69.0000000 221.3812194 - 303 30 10 1990 157.0000000 186.2480061 - 304 31 10 1990 190.0000000 161.8105717 - 305 1 11 1990 115.0000000 160.4840070 - 306 2 11 1990 104.0000000 172.4301991 - 307 3 11 1990 100.0000000 179.9385242 - 308 4 11 1990 131.0000000 183.3499276 - 309 5 11 1990 130.0000000 169.6423276 - 310 6 11 1990 115.0000000 143.8333781 - 311 7 11 1990 102.0000000 123.8623488 - 312 8 11 1990 95.0000000 108.0030723 - 313 9 11 1990 81.0000000 95.4133785 - 314 10 11 1990 66.0000000 101.0607323 - 315 11 11 1990 67.0000000 152.9385042 - 316 12 11 1990 74.0000000 164.7222042 - 317 13 11 1990 109.0000000 158.6145424 - 318 14 11 1990 92.0000000 193.1120574 - 319 15 11 1990 92.0000000 201.1966655 - 320 16 11 1990 155.0000000 188.5167749 - 321 17 11 1990 159.0000000 175.4019991 - 322 18 11 1990 131.0000000 190.0379839 - 323 19 11 1990 161.0000000 200.6719074 - 324 20 11 1990 196.0000000 336.4701203 - 325 21 11 1990 336.0000000 345.1340422 - 326 22 11 1990 566.0000000 351.8862763 - 327 23 11 1990 373.0000000 368.3095395 - 328 24 11 1990 293.0000000 323.2387550 - 329 25 11 1990 264.0000000 292.1349453 - 330 26 11 1990 226.0000000 251.0481143 - 331 27 11 1990 201.0000000 215.0069251 - 332 28 11 1990 180.0000000 185.4178513 - 333 29 11 1990 161.0000000 179.5701836 - 334 30 11 1990 149.0000000 163.4551959 - 335 1 12 1990 134.0000000 143.6967177 - 336 2 12 1990 113.0000000 129.2416267 - 337 3 12 1990 99.0000000 117.7857080 - 338 4 12 1990 107.0000000 108.9021990 - 339 5 12 1990 99.0000000 101.4933152 - 340 6 12 1990 89.0000000 95.4004674 - 341 7 12 1990 77.0000000 90.4355177 - 342 8 12 1990 71.0000000 86.3602259 - 343 9 12 1990 68.0000000 85.7392935 - 344 10 12 1990 73.0000000 81.0461731 - 345 11 12 1990 84.0000000 78.4911467 - 346 12 12 1990 88.0000000 102.6615326 - 347 13 12 1990 92.0000000 106.8802381 - 348 14 12 1990 128.0000000 97.4320257 - 349 15 12 1990 136.0000000 89.8876957 - 350 16 12 1990 114.0000000 85.1664399 - 351 17 12 1990 101.0000000 81.3692250 - 352 18 12 1990 93.0000000 78.2658371 - 353 19 12 1990 85.0000000 75.6949856 - 354 20 12 1990 81.0000000 78.1441587 - 355 21 12 1990 106.0000000 119.2746225 - 356 22 12 1990 159.0000000 146.3129193 - 357 23 12 1990 250.0000000 151.7301061 - 358 24 12 1990 298.0000000 141.7708394 - 359 25 12 1990 261.0000000 217.8479966 - 360 26 12 1990 228.0000000 339.0269481 - 361 27 12 1990 409.0000000 387.2101309 - 362 28 12 1990 486.0000000 394.3976353 - 363 29 12 1990 440.0000000 544.6528576 - 364 30 12 1990 486.0000000 708.8077379 - 365 31 12 1990 774.0000000 874.5759921 - 366 1 1 1991 889.0000000 840.2882931 - 367 2 1 1991 863.0000000 870.0370357 - 368 3 1 1991 875.0000000 863.4281205 - 369 4 1 1991 932.0000000 718.1290716 - 370 5 1 1991 826.0000000 664.5884036 - 371 6 1 1991 731.0000000 605.1505880 - 372 7 1 1991 613.0000000 591.9380540 - 373 8 1 1991 610.0000000 567.6930928 - 374 9 1 1991 686.0000000 502.2306785 - 375 10 1 1991 556.0000000 555.8303646 - 376 11 1 1991 669.0000000 591.0801591 - 377 12 1 1991 828.0000000 528.0961045 - 378 13 1 1991 735.0000000 421.2063549 - 379 14 1 1991 513.0000000 355.8526647 - 380 15 1 1991 411.0000000 308.4361901 - 381 16 1 1991 345.0000000 272.1453691 - 382 17 1 1991 293.0000000 244.0629239 - 383 18 1 1991 251.0000000 222.1290876 - 384 19 1 1991 222.0000000 204.8872420 - 385 20 1 1991 215.0000000 191.4667940 - 386 21 1 1991 213.0000000 187.9952773 - 387 22 1 1991 202.0000000 189.7948469 - 388 23 1 1991 200.0000000 180.4820348 - 389 24 1 1991 192.0000000 171.5334971 - 390 25 1 1991 176.0000000 163.7833788 - 391 26 1 1991 164.0000000 157.4542129 - 392 27 1 1991 157.0000000 152.1916630 - 393 28 1 1991 134.0000000 147.7765609 - 394 29 1 1991 130.0000000 144.0217348 - 395 30 1 1991 119.0000000 140.7841789 - 396 31 1 1991 107.0000000 137.9540057 - 397 1 2 1991 112.0000000 135.4463405 - 398 2 2 1991 109.0000000 133.1953204 - 399 3 2 1991 101.0000000 131.1496179 - 400 4 2 1991 98.0000000 129.2690762 - 401 5 2 1991 84.0000000 127.5221648 - 402 6 2 1991 93.0000000 125.8840432 - 403 7 2 1991 80.0000000 124.3350801 - 404 8 2 1991 73.0000000 122.8597149 - 405 9 2 1991 89.0000000 121.4455790 - 406 10 2 1991 84.0000000 120.0828142 - 407 11 2 1991 78.0000000 118.7635421 - 408 12 2 1991 79.0000000 117.4814505 - 409 13 2 1991 77.0000000 116.2314685 - 410 14 2 1991 80.0000000 115.0095119 - 411 15 2 1991 72.0000000 113.8122818 - 412 16 2 1991 78.0000000 114.6134439 - 413 17 2 1991 74.0000000 114.6803523 - 414 18 2 1991 77.0000000 113.3963516 - 415 19 2 1991 73.0000000 137.8086995 - 416 20 2 1991 69.0000000 163.5362951 - 417 21 2 1991 74.0000000 204.1492151 - 418 22 2 1991 81.0000000 209.7061236 - 419 23 2 1991 110.0000000 202.2099318 - 420 24 2 1991 180.0000000 203.8329599 - 421 25 2 1991 213.0000000 214.8070947 - 422 26 2 1991 222.0000000 221.7320974 - 423 27 2 1991 208.0000000 224.6008413 - 424 28 2 1991 211.0000000 218.7007061 - 425 1 3 1991 214.0000000 201.6566824 - 426 2 3 1991 208.0000000 202.4770974 - 427 3 3 1991 221.0000000 191.4676105 - 428 4 3 1991 281.0000000 173.4212905 - 429 5 3 1991 219.0000000 160.3198373 - 430 6 3 1991 190.0000000 149.8813353 - 431 7 3 1991 173.0000000 141.3636830 - 432 8 3 1991 164.0000000 134.6826568 - 433 9 3 1991 142.0000000 130.1389408 - 434 10 3 1991 133.0000000 131.6919509 - 435 11 3 1991 133.0000000 130.0969464 - 436 12 3 1991 118.0000000 124.9037533 - 437 13 3 1991 127.0000000 120.2843564 - 438 14 3 1991 113.0000000 116.4011722 - 439 15 3 1991 107.0000000 113.1030450 - 440 16 3 1991 100.0000000 110.2710102 - 441 17 3 1991 100.0000000 107.8151929 - 442 18 3 1991 95.0000000 105.6881395 - 443 19 3 1991 98.0000000 185.0352174 - 444 20 3 1991 119.0000000 187.8660549 - 445 21 3 1991 159.0000000 224.4192956 - 446 22 3 1991 196.0000000 249.8999078 - 447 23 3 1991 242.0000000 230.1800910 - 448 24 3 1991 216.0000000 202.4744035 - 449 25 3 1991 180.0000000 181.4925449 - 450 26 3 1991 145.0000000 165.1250991 - 451 27 3 1991 127.0000000 153.0996604 - 452 28 3 1991 117.0000000 142.3685598 - 453 29 3 1991 109.0000000 133.5632033 - 454 30 3 1991 106.0000000 126.4066739 - 455 31 3 1991 99.0000000 120.5421024 - 456 1 4 1991 96.0000000 115.6933799 - 457 2 4 1991 88.0000000 111.6459870 - 458 3 4 1991 87.0000000 108.2326399 - 459 4 4 1991 82.0000000 105.7103636 - 460 5 4 1991 84.0000000 104.0351485 - 461 6 4 1991 67.0000000 101.6943295 - 462 7 4 1991 89.0000000 99.7011031 - 463 8 4 1991 75.0000000 97.8963950 - 464 9 4 1991 79.0000000 96.1956382 - 465 10 4 1991 70.0000000 94.6505051 - 466 11 4 1991 69.0000000 93.2374290 - 467 12 4 1991 69.0000000 91.9315806 - 468 13 4 1991 56.0000000 90.7134938 - 469 14 4 1991 63.0000000 89.5699127 - 470 15 4 1991 58.0000000 88.4838764 - 471 16 4 1991 56.0000000 87.4449407 - 472 17 4 1991 54.0000000 86.4472413 - 473 18 4 1991 57.0000000 85.4991541 - 474 19 4 1991 53.0000000 84.9664311 - 475 20 4 1991 53.0000000 85.0025242 - 476 21 4 1991 65.0000000 84.9342429 - 477 22 4 1991 69.0000000 86.0208902 - 478 23 4 1991 61.0000000 88.5965737 - 479 24 4 1991 56.0000000 87.8765133 - 480 25 4 1991 56.0000000 85.8053175 - 481 26 4 1991 53.0000000 83.8400928 - 482 27 4 1991 49.0000000 82.1164143 - 483 28 4 1991 53.0000000 80.5896750 - 484 29 4 1991 48.0000000 81.5556577 - 485 30 4 1991 57.0000000 136.0519794 - 486 1 5 1991 69.0000000 124.8780502 - 487 2 5 1991 89.0000000 110.3521882 - 488 3 5 1991 105.0000000 103.0009621 - 489 4 5 1991 79.0000000 96.9959011 - 490 5 5 1991 69.0000000 92.3864291 - 491 6 5 1991 71.0000000 89.2997769 - 492 7 5 1991 60.0000000 85.8785924 - 493 8 5 1991 64.0000000 82.7697496 - 494 9 5 1991 59.0000000 80.1451159 - 495 10 5 1991 57.0000000 84.5718182 - 496 11 5 1991 55.0000000 92.5513591 - 497 12 5 1991 53.0000000 89.4434245 - 498 13 5 1991 52.0000000 85.3878595 - 499 14 5 1991 50.0000000 82.6005494 - 500 15 5 1991 52.0000000 93.6411399 - 501 16 5 1991 54.0000000 98.9598905 - 502 17 5 1991 54.0000000 91.5630049 - 503 18 5 1991 55.0000000 86.3015265 - 504 19 5 1991 48.0000000 81.9736722 - 505 20 5 1991 48.0000000 78.3900968 - 506 21 5 1991 49.0000000 75.4004586 - 507 22 5 1991 41.0000000 72.8853068 - 508 23 5 1991 40.0000000 70.7496736 - 509 24 5 1991 40.0000000 68.9180075 - 510 25 5 1991 39.0000000 67.3301652 - 511 26 5 1991 43.0000000 65.9382390 - 512 27 5 1991 39.0000000 64.7040430 - 513 28 5 1991 36.0000000 63.5971211 - 514 29 5 1991 33.0000000 62.5931660 - 515 30 5 1991 39.0000000 61.6727653 - 516 31 5 1991 34.0000000 60.8204053 - 517 1 6 1991 37.0000000 60.0236790 - 518 2 6 1991 35.0000000 59.2726570 - 519 3 6 1991 29.0000000 58.5593864 - 520 4 6 1991 33.0000000 57.8774924 - 521 5 6 1991 34.0000000 57.3088722 - 522 6 6 1991 32.0000000 72.4473228 - 523 7 6 1991 38.0000000 71.4106256 - 524 8 6 1991 39.0000000 62.5088292 - 525 9 6 1991 41.0000000 63.5952515 - 526 10 6 1991 44.0000000 70.1546439 - 527 11 6 1991 48.0000000 61.3585044 - 528 12 6 1991 42.0000000 58.8671266 - 529 13 6 1991 37.0000000 57.3266438 - 530 14 6 1991 39.0000000 55.9928380 - 531 15 6 1991 35.0000000 56.2721422 - 532 16 6 1991 31.0000000 63.0951441 - 533 17 6 1991 33.0000000 67.7009212 - 534 18 6 1991 31.0000000 65.0820515 - 535 19 6 1991 28.0000000 62.2207480 - 536 20 6 1991 60.0000000 97.7041198 - 537 21 6 1991 48.0000000 70.3473349 - 538 22 6 1991 54.0000000 60.5595114 - 539 23 6 1991 63.0000000 69.4879224 - 540 24 6 1991 41.0000000 58.9694312 - 541 25 6 1991 42.0000000 55.0392263 - 542 26 6 1991 43.0000000 53.4470267 - 543 27 6 1991 38.0000000 62.4770599 - 544 28 6 1991 38.0000000 63.4589114 - 545 29 6 1991 35.0000000 58.7642409 - 546 30 6 1991 41.0000000 55.8050601 - 547 1 7 1991 41.0000000 53.5793095 - 548 2 7 1991 38.0000000 51.7104808 - 549 3 7 1991 34.0000000 50.1273365 - 550 4 7 1991 27.0000000 48.7731673 - 551 5 7 1991 31.0000000 47.6027965 - 552 6 7 1991 30.0000000 46.5803352 - 553 7 7 1991 26.0000000 53.2708372 - 554 8 7 1991 30.0000000 49.8031556 - 555 9 7 1991 31.0000000 45.2032028 - 556 10 7 1991 23.0000000 44.3573278 - 557 11 7 1991 35.0000000 43.5980789 - 558 12 7 1991 19.0000000 46.6853776 - 559 13 7 1991 24.0000000 80.2991400 - 560 14 7 1991 26.0000000 64.2623362 - 561 15 7 1991 27.0000000 53.4549289 - 562 16 7 1991 41.0000000 50.2675185 - 563 17 7 1991 34.0000000 48.0221952 - 564 18 7 1991 27.0000000 46.1492064 - 565 19 7 1991 25.0000000 44.5738532 - 566 20 7 1991 23.0000000 43.2368946 - 567 21 7 1991 22.0000000 42.0912217 - 568 22 7 1991 27.0000000 41.0991992 - 569 23 7 1991 23.0000000 40.2308030 - 570 24 7 1991 21.0000000 41.7745732 - 571 25 7 1991 23.0000000 62.9519142 - 572 26 7 1991 33.0000000 53.9736623 - 573 27 7 1991 23.0000000 44.1465212 - 574 28 7 1991 29.0000000 42.1526725 - 575 29 7 1991 30.0000000 40.7445100 - 576 30 7 1991 35.0000000 59.4719240 - 577 31 7 1991 27.0000000 53.9842316 - 578 1 8 1991 45.0000000 45.6225545 - 579 2 8 1991 47.0000000 43.3541038 - 580 3 8 1991 40.0000000 41.4724485 - 581 4 8 1991 35.0000000 39.9002505 - 582 5 8 1991 26.0000000 38.5756688 - 583 6 8 1991 23.0000000 37.4494616 - 584 7 8 1991 30.0000000 41.0694800 - 585 8 8 1991 33.0000000 39.1851156 - 586 9 8 1991 30.0000000 35.2836224 - 587 10 8 1991 28.0000000 34.3444139 - 588 11 8 1991 19.0000000 33.7481547 - 589 12 8 1991 20.0000000 33.2080439 - 590 13 8 1991 16.0000000 32.7135552 - 591 14 8 1991 18.0000000 32.2562611 - 592 15 8 1991 18.0000000 31.8294097 - 593 16 8 1991 20.0000000 31.4275873 - 594 17 8 1991 16.0000000 31.0464499 - 595 18 8 1991 15.0000000 30.6825087 - 596 19 8 1991 15.0000000 30.3329596 - 597 20 8 1991 14.0000000 29.9955465 - 598 21 8 1991 15.0000000 29.6684523 - 599 22 8 1991 13.0000000 29.3504252 - 600 23 8 1991 12.0000000 29.2427843 - 601 24 8 1991 11.0000000 28.9002251 - 602 25 8 1991 12.0000000 28.5400540 - 603 26 8 1991 11.0000000 28.2289343 - 604 27 8 1991 13.0000000 27.9262132 - 605 28 8 1991 11.0000000 27.6307687 - 606 29 8 1991 12.0000000 27.3416939 - 607 30 8 1991 12.0000000 27.0582548 - 608 31 8 1991 11.0000000 26.7798565 - 609 1 9 1991 11.0000000 29.2001749 - 610 2 9 1991 17.0000000 28.1071588 - 611 3 9 1991 11.0000000 26.0077337 - 612 4 9 1991 12.0000000 25.7411647 - 613 5 9 1991 11.0000000 25.4787942 - 614 6 9 1991 11.0000000 25.2202752 - 615 7 9 1991 18.0000000 24.9653247 - 616 8 9 1991 11.0000000 24.7137106 - 617 9 9 1991 13.0000000 24.4652416 - 618 10 9 1991 12.0000000 25.6187171 - 619 11 9 1991 11.0000000 65.7963164 - 620 12 9 1991 20.0000000 36.1827295 - 621 13 9 1991 21.0000000 25.7352292 - 622 14 9 1991 29.0000000 25.1037765 - 623 15 9 1991 28.0000000 24.5528661 - 624 16 9 1991 20.0000000 24.0668998 - 625 17 9 1991 20.0000000 23.6334091 - 626 18 9 1991 20.0000000 23.2424200 - 627 19 9 1991 12.0000000 22.8859485 - 628 20 9 1991 11.0000000 22.5575987 - 629 21 9 1991 11.0000000 22.2522434 - 630 22 9 1991 22.0000000 51.3180021 - 631 23 9 1991 14.0000000 33.6172716 - 632 24 9 1991 48.0000000 24.0789469 - 633 25 9 1991 45.0000000 93.8353435 - 634 26 9 1991 80.0000000 72.0153982 - 635 27 9 1991 61.0000000 52.6559413 - 636 28 9 1991 61.0000000 89.9083861 - 637 29 9 1991 65.0000000 73.3992186 - 638 30 9 1991 63.0000000 54.9328815 - 639 1 10 1991 90.0000000 42.7853904 - 640 2 10 1991 59.0000000 38.5089397 - 641 3 10 1991 45.0000000 35.1066894 - 642 4 10 1991 42.0000000 32.3721511 - 643 5 10 1991 41.0000000 94.3936051 - 644 6 10 1991 41.0000000 75.2500286 - 645 7 10 1991 73.0000000 54.2361224 - 646 8 10 1991 96.0000000 47.3001303 - 647 9 10 1991 61.0000000 42.3337385 - 648 10 10 1991 44.0000000 38.3565491 - 649 11 10 1991 42.0000000 35.2404262 - 650 12 10 1991 41.0000000 67.2158135 - 651 13 10 1991 42.0000000 64.2216224 - 652 14 10 1991 61.0000000 51.2424383 - 653 15 10 1991 55.0000000 45.6045612 - 654 16 10 1991 41.0000000 45.1398361 - 655 17 10 1991 48.0000000 62.6278353 - 656 18 10 1991 52.0000000 86.3390008 - 657 19 10 1991 66.0000000 62.7246351 - 658 20 10 1991 59.0000000 57.0830202 - 659 21 10 1991 71.0000000 52.7704218 - 660 22 10 1991 74.0000000 47.2444797 - 661 23 10 1991 70.0000000 42.7600696 - 662 24 10 1991 59.0000000 38.9857951 - 663 25 10 1991 57.0000000 35.9318227 - 664 26 10 1991 57.0000000 33.4496064 - 665 27 10 1991 51.0000000 31.4219115 - 666 28 10 1991 47.0000000 29.7565863 - 667 29 10 1991 48.0000000 28.3792608 - 668 30 10 1991 45.0000000 32.6932184 - 669 31 10 1991 43.0000000 33.9753896 - 670 1 11 1991 40.0000000 49.1339030 - 671 2 11 1991 47.0000000 50.5484009 - 672 3 11 1991 46.0000000 102.7163347 - 673 4 11 1991 76.0000000 147.4717557 - 674 5 11 1991 60.0000000 132.5169260 - 675 6 11 1991 132.0000000 118.0453581 - 676 7 11 1991 133.0000000 127.5578457 - 677 8 11 1991 113.0000000 153.1492021 - 678 9 11 1991 120.0000000 147.3797644 - 679 10 11 1991 141.0000000 127.4185860 - 680 11 11 1991 208.0000000 160.7159486 - 681 12 11 1991 166.0000000 204.0786263 - 682 13 11 1991 183.0000000 301.7555987 - 683 14 11 1991 299.0000000 428.9817092 - 684 15 11 1991 521.0000000 361.9256962 - 685 16 11 1991 443.0000000 301.7444391 - 686 17 11 1991 304.0000000 251.5817507 - 687 18 11 1991 231.0000000 261.6205934 - 688 19 11 1991 192.0000000 250.1717198 - 689 20 11 1991 199.0000000 234.9876020 - 690 21 11 1991 201.0000000 215.1574969 - 691 22 11 1991 173.0000000 182.2120168 - 692 23 11 1991 159.0000000 156.1884383 - 693 24 11 1991 160.0000000 135.5909202 - 694 25 11 1991 146.0000000 119.2423351 - 695 26 11 1991 110.0000000 106.2161993 - 696 27 11 1991 114.0000000 95.7954226 - 697 28 11 1991 97.0000000 87.4267143 - 698 29 11 1991 89.0000000 80.6755341 - 699 30 11 1991 73.0000000 75.2020353 - 700 1 12 1991 69.0000000 70.7397400 - 701 2 12 1991 67.0000000 67.0792204 - 702 3 12 1991 63.0000000 64.0555463 - 703 4 12 1991 58.0000000 61.5385896 - 704 5 12 1991 59.0000000 59.4255069 - 705 6 12 1991 53.0000000 57.6348920 - 706 7 12 1991 54.0000000 56.1022151 - 707 8 12 1991 51.0000000 54.7762551 - 708 9 12 1991 47.0000000 53.6163034 - 709 10 12 1991 42.0000000 52.5899677 - 710 11 12 1991 40.0000000 51.6714440 - 711 12 12 1991 39.0000000 50.8401535 - 712 13 12 1991 36.0000000 50.0796673 - 713 14 12 1991 37.0000000 49.3768561 - 714 15 12 1991 32.0000000 48.7212164 - 715 16 12 1991 37.0000000 74.2040584 - 716 17 12 1991 62.0000000 233.7157602 - 717 18 12 1991 118.0000000 307.4565673 - 718 19 12 1991 170.0000000 431.6909688 - 719 20 12 1991 229.0000000 484.2196835 - 720 21 12 1991 448.0000000 638.5738466 - 721 22 12 1991 464.0000000 775.1986387 - 722 23 12 1991 675.0000000 646.2046471 - 723 24 12 1991 844.0000000 514.1748359 - 724 25 12 1991 569.0000000 396.6934916 - 725 26 12 1991 358.0000000 319.0620652 - 726 27 12 1991 279.0000000 271.3675428 - 727 28 12 1991 238.0000000 233.3464818 - 728 29 12 1991 201.0000000 202.6843645 - 729 30 12 1991 185.0000000 178.5654406 - 730 31 12 1991 165.0000000 159.4830166 - 731 1 1 1992 140.0000000 144.4715028 - 732 2 1 1992 126.0000000 134.8543704 - 733 3 1 1992 117.0000000 128.1832605 - 734 4 1 1992 114.0000000 123.0582779 - 735 5 1 1992 108.0000000 115.5326501 - 736 6 1 1992 108.0000000 108.4934786 - 737 7 1 1992 101.0000000 103.0944408 - 738 8 1 1992 97.0000000 101.8271142 - 739 9 1 1992 89.0000000 137.9147452 - 740 10 1 1992 111.0000000 191.6212958 - 741 11 1 1992 135.0000000 179.7819333 - 742 12 1 1992 171.0000000 158.4481233 - 743 13 1 1992 125.0000000 142.9353404 - 744 14 1 1992 111.0000000 130.6197738 - 745 15 1 1992 100.0000000 121.1378543 - 746 16 1 1992 87.0000000 113.9730333 - 747 17 1 1992 75.0000000 107.3285806 - 748 18 1 1992 79.0000000 101.9025785 - 749 19 1 1992 70.0000000 103.9168464 - 750 20 1 1992 72.0000000 101.1825652 - 751 21 1 1992 87.0000000 96.4656436 - 752 22 1 1992 79.0000000 92.7540857 - 753 23 1 1992 71.0000000 89.6726154 - 754 24 1 1992 66.0000000 87.0708820 - 755 25 1 1992 67.0000000 84.8474935 - 756 26 1 1992 65.0000000 82.9237334 - 757 27 1 1992 59.0000000 81.2383663 - 758 28 1 1992 57.0000000 79.8471186 - 759 29 1 1992 54.0000000 79.2889446 - 760 30 1 1992 59.0000000 85.0587276 - 761 31 1 1992 57.0000000 97.5383747 - 762 1 2 1992 56.0000000 101.8239384 - 763 2 2 1992 54.0000000 99.6805671 - 764 3 2 1992 58.0000000 99.6334011 - 765 4 2 1992 63.0000000 188.9519653 - 766 5 2 1992 76.0000000 282.2768024 - 767 6 2 1992 250.0000000 307.8918647 - 768 7 2 1992 346.0000000 257.0235174 - 769 8 2 1992 241.0000000 220.4998558 - 770 9 2 1992 180.0000000 213.5068005 - 771 10 2 1992 164.0000000 209.8733025 - 772 11 2 1992 183.0000000 234.1016809 - 773 12 2 1992 215.0000000 250.2211630 - 774 13 2 1992 265.0000000 254.1626837 - 775 14 2 1992 287.0000000 256.4711678 - 776 15 2 1992 272.0000000 260.8407832 - 777 16 2 1992 253.0000000 286.6280278 - 778 17 2 1992 301.0000000 261.6814761 - 779 18 2 1992 275.0000000 223.9192887 - 780 19 2 1992 224.0000000 196.1092277 - 781 20 2 1992 194.0000000 174.3541287 - 782 21 2 1992 173.0000000 157.2696394 - 783 22 2 1992 157.0000000 144.3071335 - 784 23 2 1992 142.0000000 138.5452000 - 785 24 2 1992 133.0000000 139.8627451 - 786 25 2 1992 128.0000000 138.1271809 - 787 26 2 1992 125.0000000 128.2783695 - 788 27 2 1992 125.0000000 120.1104221 - 789 28 2 1992 110.0000000 113.4389075 - 790 29 2 1992 107.0000000 107.9533535 - 791 1 3 1992 97.0000000 103.5482830 - 792 2 3 1992 97.0000000 105.1036181 - 793 3 3 1992 86.0000000 111.1817968 - 794 4 3 1992 93.0000000 105.2378545 - 795 5 3 1992 86.0000000 100.8715805 - 796 6 3 1992 82.0000000 97.2216586 - 797 7 3 1992 80.0000000 94.0579455 - 798 8 3 1992 77.0000000 91.3682768 - 799 9 3 1992 73.0000000 89.0582742 - 800 10 3 1992 76.0000000 87.2196276 - 801 11 3 1992 68.0000000 85.6800644 - 802 12 3 1992 70.0000000 161.2441602 - 803 13 3 1992 116.0000000 263.7611002 - 804 14 3 1992 206.0000000 326.9972526 - 805 15 3 1992 433.0000000 397.2195629 - 806 16 3 1992 495.0000000 387.1691735 - 807 17 3 1992 331.0000000 312.5087632 - 808 18 3 1992 240.0000000 265.2342729 - 809 19 3 1992 215.0000000 229.3272865 - 810 20 3 1992 185.0000000 201.2019761 - 811 21 3 1992 185.0000000 192.5135754 - 812 22 3 1992 185.0000000 297.1947386 - 813 23 3 1992 213.0000000 396.7337012 - 814 24 3 1992 466.0000000 434.4016523 - 815 25 3 1992 580.0000000 421.9709406 - 816 26 3 1992 566.0000000 370.6097472 - 817 27 3 1992 487.0000000 326.2780051 - 818 28 3 1992 387.0000000 298.1961431 - 819 29 3 1992 311.0000000 266.0812282 - 820 30 3 1992 270.0000000 244.0677303 - 821 31 3 1992 246.0000000 249.7358428 - 822 1 4 1992 229.0000000 263.0774516 - 823 2 4 1992 222.0000000 257.0302270 - 824 3 4 1992 217.0000000 310.6491471 - 825 4 4 1992 208.0000000 364.2955232 - 826 5 4 1992 220.0000000 321.1404061 - 827 6 4 1992 210.0000000 277.8038860 - 828 7 4 1992 190.0000000 244.5791522 - 829 8 4 1992 173.0000000 218.2626426 - 830 9 4 1992 166.0000000 197.2584470 - 831 10 4 1992 133.0000000 180.4197746 - 832 11 4 1992 126.0000000 166.8555675 - 833 12 4 1992 124.0000000 155.8711694 - 834 13 4 1992 116.0000000 146.9426585 - 835 14 4 1992 112.0000000 153.6929321 - 836 15 4 1992 111.0000000 210.9786265 - 837 16 4 1992 137.0000000 213.9738923 - 838 17 4 1992 206.0000000 201.8921204 - 839 18 4 1992 176.0000000 193.1905096 - 840 19 4 1992 161.0000000 175.3518415 - 841 20 4 1992 161.0000000 162.1184490 - 842 21 4 1992 139.0000000 151.5329913 - 843 22 4 1992 139.0000000 143.0022940 - 844 23 4 1992 123.0000000 136.0562933 - 845 24 4 1992 119.0000000 130.3452830 - 846 25 4 1992 111.0000000 125.6060228 - 847 26 4 1992 94.0000000 121.7055082 - 848 27 4 1992 94.0000000 126.1190622 - 849 28 4 1992 102.0000000 137.6499576 - 850 29 4 1992 120.0000000 138.2568177 - 851 30 4 1992 120.0000000 131.8472747 - 852 1 5 1992 114.0000000 178.1322312 - 853 2 5 1992 115.0000000 196.2787797 - 854 3 5 1992 206.0000000 179.9250582 - 855 4 5 1992 215.0000000 164.4134549 - 856 5 5 1992 125.0000000 152.0013966 - 857 6 5 1992 123.0000000 141.9857335 - 858 7 5 1992 113.0000000 133.8504973 - 859 8 5 1992 77.0000000 127.1950177 - 860 9 5 1992 83.0000000 121.7426748 - 861 10 5 1992 83.0000000 125.8663741 - 862 11 5 1992 96.0000000 121.3767225 - 863 12 5 1992 120.0000000 112.5073480 - 864 13 5 1992 80.0000000 109.0626727 - 865 14 5 1992 76.0000000 106.3723841 - 866 15 5 1992 69.0000000 104.0334749 - 867 16 5 1992 63.0000000 101.9756018 - 868 17 5 1992 61.0000000 100.1431974 - 869 18 5 1992 60.0000000 98.4922784 - 870 19 5 1992 59.0000000 96.9879660 - 871 20 5 1992 67.0000000 95.6035188 - 872 21 5 1992 51.0000000 94.3175856 - 873 22 5 1992 44.0000000 93.1088896 - 874 23 5 1992 42.0000000 91.9642627 - 875 24 5 1992 51.0000000 91.1624846 - 876 25 5 1992 42.0000000 90.7026196 - 877 26 5 1992 54.0000000 102.5415792 - 878 27 5 1992 53.0000000 91.0749943 - 879 28 5 1992 59.0000000 88.0536737 - 880 29 5 1992 55.0000000 90.3996244 - 881 30 5 1992 54.0000000 90.9631038 - 882 31 5 1992 48.0000000 88.1361010 - 883 1 6 1992 63.0000000 92.1087237 - 884 2 6 1992 61.0000000 92.1009831 - 885 3 6 1992 55.0000000 95.2924361 - 886 4 6 1992 75.0000000 119.2057229 - 887 5 6 1992 53.0000000 129.3922643 - 888 6 6 1992 77.0000000 123.6077867 - 889 7 6 1992 114.0000000 125.2300762 - 890 8 6 1992 167.0000000 141.3541202 - 891 9 6 1992 116.0000000 120.9331934 - 892 10 6 1992 91.0000000 109.8630480 - 893 11 6 1992 85.0000000 103.3045463 - 894 12 6 1992 68.0000000 97.9427446 - 895 13 6 1992 71.0000000 93.5168895 - 896 14 6 1992 63.0000000 89.8355703 - 897 15 6 1992 59.0000000 86.7474795 - 898 16 6 1992 46.0000000 84.1327544 - 899 17 6 1992 44.0000000 81.8963783 - 900 18 6 1992 39.0000000 79.9629463 - 901 19 6 1992 41.0000000 78.2744836 - 902 20 6 1992 44.0000000 77.7043453 - 903 21 6 1992 39.0000000 75.8968127 - 904 22 6 1992 32.0000000 74.4327280 - 905 23 6 1992 40.0000000 75.3342744 - 906 24 6 1992 41.0000000 87.6106711 - 907 25 6 1992 42.0000000 82.4627030 - 908 26 6 1992 42.0000000 76.5115903 - 909 27 6 1992 48.0000000 74.4654418 - 910 28 6 1992 37.0000000 72.7360647 - 911 29 6 1992 40.0000000 71.2215762 - 912 30 6 1992 29.0000000 70.2304018 - 913 1 7 1992 30.0000000 70.3486546 - 914 2 7 1992 36.0000000 68.7633701 - 915 3 7 1992 29.0000000 78.2030488 - 916 4 7 1992 36.0000000 86.3058318 - 917 5 7 1992 50.0000000 96.3520676 - 918 6 7 1992 78.0000000 93.3514600 - 919 7 7 1992 54.0000000 76.5098895 - 920 8 7 1992 57.0000000 70.8798568 - 921 9 7 1992 51.0000000 69.4082683 - 922 10 7 1992 47.0000000 87.8617764 - 923 11 7 1992 46.0000000 109.5852785 - 924 12 7 1992 76.0000000 103.5744207 - 925 13 7 1992 72.0000000 91.8904508 - 926 14 7 1992 67.0000000 83.1355683 - 927 15 7 1992 63.0000000 78.2202156 - 928 16 7 1992 47.0000000 74.1834760 - 929 17 7 1992 47.0000000 70.8462478 - 930 18 7 1992 42.0000000 68.0666583 - 931 19 7 1992 41.0000000 65.7322047 - 932 20 7 1992 39.0000000 63.7535835 - 933 21 7 1992 37.0000000 65.1443192 - 934 22 7 1992 33.0000000 66.3120371 - 935 23 7 1992 33.0000000 63.1066048 - 936 24 7 1992 33.0000000 61.2603173 - 937 25 7 1992 37.0000000 59.6755963 - 938 26 7 1992 26.0000000 58.3009225 - 939 27 7 1992 24.0000000 57.0955110 - 940 28 7 1992 26.0000000 56.0264400 - 941 29 7 1992 29.0000000 55.0674421 - 942 30 7 1992 19.0000000 54.1975444 - 943 31 7 1992 22.0000000 55.0465562 - 944 1 8 1992 28.0000000 53.9724143 - 945 2 8 1992 35.0000000 52.0481812 - 946 3 8 1992 29.0000000 51.3882800 - 947 4 8 1992 36.0000000 50.7628997 - 948 5 8 1992 52.0000000 50.1661653 - 949 6 8 1992 74.0000000 49.5933627 - 950 7 8 1992 54.0000000 49.0407056 - 951 8 8 1992 57.0000000 48.5051498 - 952 9 8 1992 48.0000000 51.3077157 - 953 10 8 1992 47.0000000 49.2779091 - 954 11 8 1992 46.0000000 58.0165592 - 955 12 8 1992 75.0000000 54.0800383 - 956 13 8 1992 73.0000000 59.0284410 - 957 14 8 1992 66.0000000 58.7477339 - 958 15 8 1992 60.0000000 49.8064100 - 959 16 8 1992 47.0000000 45.9715445 - 960 17 8 1992 46.0000000 45.3186606 - 961 18 8 1992 42.0000000 44.7106859 - 962 19 8 1992 41.0000000 44.1577716 - 963 20 8 1992 40.0000000 55.1399650 - 964 21 8 1992 37.0000000 45.6815557 - 965 22 8 1992 32.0000000 43.5613788 - 966 23 8 1992 32.0000000 43.8331016 - 967 24 8 1992 32.0000000 42.0272052 - 968 25 8 1992 36.0000000 41.5242790 - 969 26 8 1992 27.0000000 41.0475672 - 970 27 8 1992 25.0000000 40.5879657 - 971 28 8 1992 25.0000000 40.8485086 - 972 29 8 1992 28.0000000 46.0483098 - 973 30 8 1992 20.0000000 54.5987805 - 974 31 8 1992 22.0000000 107.6656439 - 975 1 9 1992 49.0000000 65.1776589 - 976 2 9 1992 77.0000000 67.9030623 - 977 3 9 1992 67.0000000 59.7888652 - 978 4 9 1992 45.0000000 57.7816575 - 979 5 9 1992 44.0000000 49.8239005 - 980 6 9 1992 64.0000000 45.5872499 - 981 7 9 1992 52.0000000 43.7454190 - 982 8 9 1992 40.0000000 42.2019507 - 983 9 9 1992 30.0000000 40.8964127 - 984 10 9 1992 34.0000000 39.7810197 - 985 11 9 1992 32.0000000 39.0291134 - 986 12 9 1992 36.0000000 38.5193572 - 987 13 9 1992 28.0000000 37.6116939 - 988 14 9 1992 33.0000000 37.4468696 - 989 15 9 1992 35.0000000 37.5450330 - 990 16 9 1992 30.0000000 36.2917132 - 991 17 9 1992 32.0000000 35.6402063 - 992 18 9 1992 29.0000000 35.2224785 - 993 19 9 1992 30.0000000 35.1983774 - 994 20 9 1992 28.0000000 34.5029094 - 995 21 9 1992 29.0000000 33.9527128 - 996 22 9 1992 29.0000000 33.4491782 - 997 23 9 1992 27.0000000 32.9837018 - 998 24 9 1992 27.0000000 32.5480490 - 999 25 9 1992 23.0000000 32.1377204 - 1000 26 9 1992 28.0000000 31.7484003 - 1001 27 9 1992 25.0000000 31.3769210 - 1002 28 9 1992 25.0000000 33.1546807 - 1003 29 9 1992 27.0000000 33.2939912 - 1004 30 9 1992 25.0000000 31.3972833 - 1005 1 10 1992 27.0000000 31.2646501 - 1006 2 10 1992 33.0000000 35.4451682 - 1007 3 10 1992 29.0000000 34.1403350 - 1008 4 10 1992 31.0000000 33.6304372 - 1009 5 10 1992 25.0000000 42.8651014 - 1010 6 10 1992 25.0000000 47.9667028 - 1011 7 10 1992 36.0000000 33.8148364 - 1012 8 10 1992 42.0000000 30.4895245 - 1013 9 10 1992 43.0000000 34.8381182 - 1014 10 10 1992 26.0000000 39.9872752 - 1015 11 10 1992 27.0000000 35.3939633 - 1016 12 10 1992 27.0000000 32.4231224 - 1017 13 10 1992 26.0000000 31.2098479 - 1018 14 10 1992 26.0000000 30.2925802 - 1019 15 10 1992 23.0000000 47.6016584 - 1020 16 10 1992 21.0000000 39.7111012 - 1021 17 10 1992 26.0000000 42.1103011 - 1022 18 10 1992 34.0000000 40.3000836 - 1023 19 10 1992 37.0000000 37.6718167 - 1024 20 10 1992 31.0000000 44.7163412 - 1025 21 10 1992 31.0000000 41.9486982 - 1026 22 10 1992 35.0000000 40.9438263 - 1027 23 10 1992 33.0000000 81.0672367 - 1028 24 10 1992 40.0000000 148.2668908 - 1029 25 10 1992 74.0000000 196.5645099 - 1030 26 10 1992 161.0000000 158.1727212 - 1031 27 10 1992 285.0000000 186.4510113 - 1032 28 10 1992 244.0000000 198.3397332 - 1033 29 10 1992 263.0000000 193.0236385 - 1034 30 10 1992 276.0000000 152.4162683 - 1035 31 10 1992 186.0000000 127.7633503 - 1036 1 11 1992 154.0000000 109.1897001 - 1037 2 11 1992 112.0000000 124.4310093 - 1038 3 11 1992 104.0000000 125.7174026 - 1039 4 11 1992 96.0000000 112.2840404 - 1040 5 11 1992 99.0000000 95.8885343 - 1041 6 11 1992 126.0000000 84.0189586 - 1042 7 11 1992 91.0000000 74.9678690 - 1043 8 11 1992 84.0000000 69.4982370 - 1044 9 11 1992 81.0000000 74.3424909 - 1045 10 11 1992 85.0000000 141.1829558 - 1046 11 11 1992 126.0000000 246.1451567 - 1047 12 11 1992 279.0000000 272.9239339 - 1048 13 11 1992 390.0000000 262.8286922 - 1049 14 11 1992 294.0000000 272.3642263 - 1050 15 11 1992 260.0000000 405.9630844 - 1051 16 11 1992 398.0000000 508.2789878 - 1052 17 11 1992 520.0000000 426.8690697 - 1053 18 11 1992 487.0000000 413.2226005 - 1054 19 11 1992 380.0000000 396.3399631 - 1055 20 11 1992 385.0000000 327.0722862 - 1056 21 11 1992 351.0000000 408.9129369 - 1057 22 11 1992 309.0000000 435.2905940 - 1058 23 11 1992 587.0000000 340.1495427 - 1059 24 11 1992 661.0000000 290.7251468 - 1060 25 11 1992 447.0000000 320.2383832 - 1061 26 11 1992 361.0000000 326.7540923 - 1062 27 11 1992 351.0000000 320.2402920 - 1063 28 11 1992 353.0000000 375.6256661 - 1064 29 11 1992 369.0000000 458.9208836 - 1065 30 11 1992 452.0000000 410.1605724 - 1066 1 12 1992 441.0000000 332.1461598 - 1067 2 12 1992 348.0000000 393.6331746 - 1068 3 12 1992 394.0000000 402.8083488 - 1069 4 12 1992 455.0000000 481.2515841 - 1070 5 12 1992 491.0000000 477.7331621 - 1071 6 12 1992 469.0000000 422.3557356 - 1072 7 12 1992 364.0000000 405.4060340 - 1073 8 12 1992 338.0000000 354.0818417 - 1074 9 12 1992 334.0000000 305.4785517 - 1075 10 12 1992 268.0000000 263.5633584 - 1076 11 12 1992 236.0000000 274.5132068 - 1077 12 12 1992 230.0000000 267.5013378 - 1078 13 12 1992 239.0000000 237.8486378 - 1079 14 12 1992 256.0000000 210.9936173 - 1080 15 12 1992 217.0000000 197.3241690 - 1081 16 12 1992 201.0000000 193.0791220 - 1082 17 12 1992 188.0000000 190.8504606 - 1083 18 12 1992 176.0000000 186.4355068 - 1084 19 12 1992 170.0000000 175.3437461 - 1085 20 12 1992 168.0000000 171.1890538 - 1086 21 12 1992 131.0000000 185.1402948 - 1087 22 12 1992 133.0000000 185.6565686 - 1088 23 12 1992 134.0000000 168.8591035 - 1089 24 12 1992 127.0000000 156.4528530 - 1090 25 12 1992 117.0000000 146.6365596 - 1091 26 12 1992 113.0000000 138.6559039 - 1092 27 12 1992 100.0000000 132.1159429 - 1093 28 12 1992 94.0000000 126.7103790 - 1094 29 12 1992 87.0000000 122.2007279 - 1095 30 12 1992 86.0000000 118.4006651 - 1096 31 12 1992 81.0000000 115.1641735 - 1097 1 1 1993 77.0000000 112.3765125 - 1098 2 1 1993 76.0000000 109.9472972 - 1099 3 1 1993 61.0000000 107.8051704 - 1100 4 1 1993 61.0000000 105.8936813 - 1101 5 1 1993 57.0000000 104.1680876 - 1102 6 1 1993 66.0000000 130.4457814 - 1103 7 1 1993 67.0000000 160.0657554 - 1104 8 1 1993 84.0000000 173.4361553 - 1105 9 1 1993 90.0000000 186.0817167 - 1106 10 1 1993 113.0000000 229.8487820 - 1107 11 1 1993 265.0000000 475.3613754 - 1108 12 1 1993 559.0000000 616.9621418 - 1109 13 1 1993 832.0000000 571.2799154 - 1110 14 1 1993 601.0000000 460.2869170 - 1111 15 1 1993 436.0000000 365.9925330 - 1112 16 1 1993 339.0000000 304.0336285 - 1113 17 1 1993 292.0000000 265.5250390 - 1114 18 1 1993 247.0000000 237.3042113 - 1115 19 1 1993 218.0000000 212.7498003 - 1116 20 1 1993 205.0000000 192.2414632 - 1117 21 1 1993 190.0000000 179.7183961 - 1118 22 1 1993 176.0000000 171.9970647 - 1119 23 1 1993 173.0000000 167.8890744 - 1120 24 1 1993 173.0000000 294.6159176 - 1121 25 1 1993 199.0000000 375.9230916 - 1122 26 1 1993 361.0000000 326.3862777 - 1123 27 1 1993 295.0000000 339.2623571 - 1124 28 1 1993 238.0000000 347.4124959 - 1125 29 1 1993 263.0000000 319.5926704 - 1126 30 1 1993 245.0000000 278.7039370 - 1127 31 1 1993 222.0000000 246.2348059 - 1128 1 2 1993 199.0000000 220.8942550 - 1129 2 2 1993 186.0000000 200.8136178 - 1130 3 2 1993 171.0000000 184.8003159 - 1131 4 2 1993 157.0000000 171.9467342 - 1132 5 2 1993 159.0000000 161.5577530 - 1133 6 2 1993 129.0000000 153.0981218 - 1134 7 2 1993 119.0000000 146.2744251 - 1135 8 2 1993 119.0000000 140.5080380 - 1136 9 2 1993 105.0000000 135.6814753 - 1137 10 2 1993 106.0000000 131.6060461 - 1138 11 2 1993 105.0000000 128.1271008 - 1139 12 2 1993 95.0000000 125.1231123 - 1140 13 2 1993 91.0000000 122.4983616 - 1141 14 2 1993 88.0000000 120.1772982 - 1142 15 2 1993 84.0000000 118.1001746 - 1143 16 2 1993 83.0000000 116.4641055 - 1144 17 2 1993 79.0000000 117.1992426 - 1145 18 2 1993 78.0000000 118.8619871 - 1146 19 2 1993 84.0000000 121.9080671 - 1147 20 2 1993 91.0000000 144.1966818 - 1148 21 2 1993 91.0000000 152.2893845 - 1149 22 2 1993 90.0000000 147.7931693 - 1150 23 2 1993 103.0000000 138.2439235 - 1151 24 2 1993 94.0000000 131.3355499 - 1152 25 2 1993 81.0000000 125.7085162 - 1153 26 2 1993 78.0000000 121.2991345 - 1154 27 2 1993 75.0000000 124.1153852 - 1155 28 2 1993 76.0000000 122.5828292 - 1156 1 3 1993 80.0000000 118.6625670 - 1157 2 3 1993 75.0000000 117.1947542 - 1158 3 3 1993 76.0000000 117.1926591 - 1159 4 3 1993 72.0000000 113.3850087 - 1160 5 3 1993 65.0000000 110.1905758 - 1161 6 3 1993 64.0000000 107.7997347 - 1162 7 3 1993 64.0000000 108.9855765 - 1163 8 3 1993 68.0000000 111.6620819 - 1164 9 3 1993 68.0000000 110.9729398 - 1165 10 3 1993 67.0000000 116.1458924 - 1166 11 3 1993 61.0000000 126.1316751 - 1167 12 3 1993 57.0000000 132.2636590 - 1168 13 3 1993 58.0000000 126.5180792 - 1169 14 3 1993 54.0000000 119.3584873 - 1170 15 3 1993 66.0000000 113.5414645 - 1171 16 3 1993 54.0000000 108.7214008 - 1172 17 3 1993 57.0000000 104.8835192 - 1173 18 3 1993 57.0000000 101.6380022 - 1174 19 3 1993 52.0000000 98.6895340 - 1175 20 3 1993 57.0000000 96.1599871 - 1176 21 3 1993 58.0000000 95.8970501 - 1177 22 3 1993 57.0000000 124.0022213 - 1178 23 3 1993 56.0000000 135.5055542 - 1179 24 3 1993 63.0000000 123.2313188 - 1180 25 3 1993 76.0000000 115.5442797 - 1181 26 3 1993 56.0000000 109.2549333 - 1182 27 3 1993 59.0000000 104.0755410 - 1183 28 3 1993 59.0000000 99.7788682 - 1184 29 3 1993 54.0000000 96.1852275 - 1185 30 3 1993 48.0000000 93.1523568 - 1186 31 3 1993 55.0000000 90.5674952 - 1187 1 4 1993 48.0000000 95.4958490 - 1188 2 4 1993 53.0000000 109.5173322 - 1189 3 4 1993 47.0000000 109.1433580 - 1190 4 4 1993 59.0000000 111.0263397 - 1191 5 4 1993 53.0000000 139.3833153 - 1192 6 4 1993 64.0000000 136.8937797 - 1193 7 4 1993 63.0000000 123.3934226 - 1194 8 4 1993 75.0000000 114.7145311 - 1195 9 4 1993 64.0000000 107.5139500 - 1196 10 4 1993 59.0000000 109.8115764 - 1197 11 4 1993 60.0000000 118.7693309 - 1198 12 4 1993 63.0000000 115.3890099 - 1199 13 4 1993 69.0000000 113.1487232 - 1200 14 4 1993 79.0000000 107.9414292 - 1201 15 4 1993 82.0000000 101.9462190 - 1202 16 4 1993 68.0000000 97.1124799 - 1203 17 4 1993 56.0000000 92.9153194 - 1204 18 4 1993 59.0000000 90.3409103 - 1205 19 4 1993 61.0000000 87.0738165 - 1206 20 4 1993 62.0000000 84.1919689 - 1207 21 4 1993 57.0000000 81.7457772 - 1208 22 4 1993 53.0000000 79.6507640 - 1209 23 4 1993 47.0000000 77.8323661 - 1210 24 4 1993 46.0000000 76.2359926 - 1211 25 4 1993 47.0000000 74.8195617 - 1212 26 4 1993 45.0000000 73.5482067 - 1213 27 4 1993 43.0000000 72.3941575 - 1214 28 4 1993 41.0000000 71.3434041 - 1215 29 4 1993 38.0000000 70.4038057 - 1216 30 4 1993 39.0000000 69.7387236 - 1217 1 5 1993 40.0000000 69.4271496 - 1218 2 5 1993 41.0000000 71.7341407 - 1219 3 5 1993 45.0000000 71.1569995 - 1220 4 5 1993 49.0000000 69.6203817 - 1221 5 5 1993 40.0000000 68.2670714 - 1222 6 5 1993 43.0000000 67.0823913 - 1223 7 5 1993 38.0000000 66.0403075 - 1224 8 5 1993 38.0000000 65.3475424 - 1225 9 5 1993 43.0000000 65.1521131 - 1226 10 5 1993 44.0000000 65.5647991 - 1227 11 5 1993 41.0000000 65.3810964 - 1228 12 5 1993 51.0000000 78.7035666 - 1229 13 5 1993 63.0000000 114.7541134 - 1230 14 5 1993 68.0000000 78.2986801 - 1231 15 5 1993 77.0000000 70.5920076 - 1232 16 5 1993 77.0000000 68.0079664 - 1233 17 5 1993 59.0000000 65.8241144 - 1234 18 5 1993 49.0000000 63.9772699 - 1235 19 5 1993 43.0000000 64.9951375 - 1236 20 5 1993 44.0000000 77.1579271 - 1237 21 5 1993 48.0000000 76.0274535 - 1238 22 5 1993 44.0000000 70.2747178 - 1239 23 5 1993 46.0000000 67.1597024 - 1240 24 5 1993 40.0000000 64.5628979 - 1241 25 5 1993 43.0000000 62.3797441 - 1242 26 5 1993 30.0000000 60.6321502 - 1243 27 5 1993 45.0000000 73.0276367 - 1244 28 5 1993 43.0000000 76.1875019 - 1245 29 5 1993 44.0000000 68.3966926 - 1246 30 5 1993 54.0000000 66.5131179 - 1247 31 5 1993 56.0000000 64.1898783 - 1248 1 6 1993 44.0000000 60.0174513 - 1249 2 6 1993 43.0000000 59.9298149 - 1250 3 6 1993 33.0000000 64.1014640 - 1251 4 6 1993 45.0000000 61.4662870 - 1252 5 6 1993 46.0000000 58.8216501 - 1253 6 6 1993 42.0000000 56.8436631 - 1254 7 6 1993 40.0000000 55.1642226 - 1255 8 6 1993 30.0000000 53.7240136 - 1256 9 6 1993 31.0000000 52.5625552 - 1257 10 6 1993 32.0000000 52.0447632 - 1258 11 6 1993 25.0000000 52.9934930 - 1259 12 6 1993 33.0000000 54.5486344 - 1260 13 6 1993 29.0000000 52.1304725 - 1261 14 6 1993 40.0000000 51.6009120 - 1262 15 6 1993 42.0000000 52.6257954 - 1263 16 6 1993 37.0000000 54.3938978 - 1264 17 6 1993 46.0000000 53.3457376 - 1265 18 6 1993 47.0000000 51.2407034 - 1266 19 6 1993 50.0000000 56.1191596 - 1267 20 6 1993 43.0000000 89.0609967 - 1268 21 6 1993 69.0000000 68.5210713 - 1269 22 6 1993 61.0000000 95.1092723 - 1270 23 6 1993 67.0000000 99.6399804 - 1271 24 6 1993 77.0000000 84.0616249 - 1272 25 6 1993 87.0000000 76.0912082 - 1273 26 6 1993 55.0000000 69.5852950 - 1274 27 6 1993 43.0000000 64.3173010 - 1275 28 6 1993 40.0000000 60.0328004 - 1276 29 6 1993 30.0000000 56.5304973 - 1277 30 6 1993 40.0000000 53.6509687 - 1278 1 7 1993 40.0000000 53.5658030 - 1279 2 7 1993 27.0000000 50.7738319 - 1280 3 7 1993 34.0000000 48.0370376 - 1281 4 7 1993 30.0000000 46.5530631 - 1282 5 7 1993 31.0000000 45.3493806 - 1283 6 7 1993 27.0000000 44.1941966 - 1284 7 7 1993 31.0000000 43.2400780 - 1285 8 7 1993 26.0000000 42.3980387 - 1286 9 7 1993 23.0000000 43.6337778 - 1287 10 7 1993 24.0000000 45.9052229 - 1288 11 7 1993 25.0000000 54.3105182 - 1289 12 7 1993 34.0000000 64.4600241 - 1290 13 7 1993 40.0000000 62.4970441 - 1291 14 7 1993 41.0000000 88.2856689 - 1292 15 7 1993 46.0000000 68.9635464 - 1293 16 7 1993 39.0000000 57.7371252 - 1294 17 7 1993 43.0000000 54.4497129 - 1295 18 7 1993 35.0000000 52.5275903 - 1296 19 7 1993 49.0000000 69.9233631 - 1297 20 7 1993 38.0000000 64.1958761 - 1298 21 7 1993 41.0000000 60.8108285 - 1299 22 7 1993 45.0000000 55.0658429 - 1300 23 7 1993 41.0000000 49.9273038 - 1301 24 7 1993 42.0000000 47.1484792 - 1302 25 7 1993 40.0000000 44.8664952 - 1303 26 7 1993 35.0000000 42.9632924 - 1304 27 7 1993 40.0000000 61.1962368 - 1305 28 7 1993 40.0000000 47.6080993 - 1306 29 7 1993 36.0000000 40.2988930 - 1307 30 7 1993 40.0000000 110.7848176 - 1308 31 7 1993 61.0000000 63.6617235 - 1309 1 8 1993 36.0000000 48.6444614 - 1310 2 8 1993 46.0000000 45.8319181 - 1311 3 8 1993 32.0000000 43.5210766 - 1312 4 8 1993 38.0000000 41.6088776 - 1313 5 8 1993 32.0000000 40.0156727 - 1314 6 8 1993 25.0000000 38.6752196 - 1315 7 8 1993 26.0000000 37.5353046 - 1316 8 8 1993 29.0000000 36.5573876 - 1317 9 8 1993 29.0000000 44.1722165 - 1318 10 8 1993 28.0000000 45.0447956 - 1319 11 8 1993 37.0000000 40.8152662 - 1320 12 8 1993 40.0000000 38.3717200 - 1321 13 8 1993 49.0000000 36.9881993 - 1322 14 8 1993 32.0000000 37.7890541 - 1323 15 8 1993 37.0000000 36.5907563 - 1324 16 8 1993 37.0000000 34.3764993 - 1325 17 8 1993 27.0000000 33.5578390 - 1326 18 8 1993 24.0000000 32.8417723 - 1327 19 8 1993 24.0000000 32.2084140 - 1328 20 8 1993 22.0000000 31.6418825 - 1329 21 8 1993 21.0000000 31.1294830 - 1330 22 8 1993 16.0000000 34.2851488 - 1331 23 8 1993 21.0000000 36.2458927 - 1332 24 8 1993 27.0000000 33.2007494 - 1333 25 8 1993 26.0000000 32.1580696 - 1334 26 8 1993 23.0000000 31.2959190 - 1335 27 8 1993 21.0000000 35.6072094 - 1336 28 8 1993 28.0000000 34.4534217 - 1337 29 8 1993 17.0000000 31.7359741 - 1338 30 8 1993 24.0000000 30.7721730 - 1339 31 8 1993 25.0000000 29.9471397 - 1340 1 9 1993 25.0000000 29.2335534 - 1341 2 9 1993 19.0000000 28.6096160 - 1342 3 9 1993 17.0000000 34.0493980 - 1343 4 9 1993 16.0000000 36.1067317 - 1344 5 9 1993 19.0000000 31.0793060 - 1345 6 9 1993 23.0000000 29.7379775 - 1346 7 9 1993 25.0000000 52.8874886 - 1347 8 9 1993 34.0000000 38.8169844 - 1348 9 9 1993 31.0000000 60.1923637 - 1349 10 9 1993 35.0000000 83.6744248 - 1350 11 9 1993 53.0000000 119.9281988 - 1351 12 9 1993 71.0000000 93.7914754 - 1352 13 9 1993 74.0000000 141.2086398 - 1353 14 9 1993 87.0000000 134.9570743 - 1354 15 9 1993 173.0000000 123.8826145 - 1355 16 9 1993 117.0000000 88.2244503 - 1356 17 9 1993 93.0000000 74.0385231 - 1357 18 9 1993 77.0000000 65.0520083 - 1358 19 9 1993 62.0000000 57.8908230 - 1359 20 9 1993 54.0000000 52.1638379 - 1360 21 9 1993 48.0000000 48.3308844 - 1361 22 9 1993 46.0000000 74.1185663 - 1362 23 9 1993 55.0000000 69.1145064 - 1363 24 9 1993 66.0000000 71.4500163 - 1364 25 9 1993 64.0000000 64.5884124 - 1365 26 9 1993 52.0000000 54.5371634 - 1366 27 9 1993 68.0000000 53.9633216 - 1367 28 9 1993 69.0000000 67.6391483 - 1368 29 9 1993 62.0000000 66.0681861 - 1369 30 9 1993 76.0000000 63.3574558 - 1370 1 10 1993 72.0000000 95.8365705 - 1371 2 10 1993 68.0000000 98.0833376 - 1372 3 10 1993 72.0000000 98.4856617 - 1373 4 10 1993 78.0000000 99.6261436 - 1374 5 10 1993 116.0000000 184.2606531 - 1375 6 10 1993 131.0000000 153.4605161 - 1376 7 10 1993 180.0000000 135.1294175 - 1377 8 10 1993 203.0000000 151.7116048 - 1378 9 10 1993 164.0000000 156.1624407 - 1379 10 10 1993 178.0000000 195.2749420 - 1380 11 10 1993 161.0000000 202.7520467 - 1381 12 10 1993 287.0000000 220.9041588 - 1382 13 10 1993 360.0000000 276.7088701 - 1383 14 10 1993 374.0000000 250.5386041 - 1384 15 10 1993 297.0000000 214.0514313 - 1385 16 10 1993 247.0000000 229.7825207 - 1386 17 10 1993 273.0000000 224.8099791 - 1387 18 10 1993 261.0000000 198.6665745 - 1388 19 10 1993 265.0000000 171.8607949 - 1389 20 10 1993 230.0000000 147.0383791 - 1390 21 10 1993 199.0000000 130.0521728 - 1391 22 10 1993 173.0000000 131.6530274 - 1392 23 10 1993 182.0000000 161.9409016 - 1393 24 10 1993 203.0000000 156.6878177 - 1394 25 10 1993 213.0000000 134.4039748 - 1395 26 10 1993 180.0000000 118.4743691 - 1396 27 10 1993 154.0000000 105.8589326 - 1397 28 10 1993 118.0000000 95.8002610 - 1398 29 10 1993 112.0000000 87.7399454 - 1399 30 10 1993 98.0000000 81.2466152 - 1400 31 10 1993 97.0000000 75.9855881 - 1401 1 11 1993 91.0000000 71.6962222 - 1402 2 11 1993 85.0000000 68.1748700 - 1403 3 11 1993 75.0000000 65.2619554 - 1404 4 11 1993 76.0000000 62.8321151 - 1405 5 11 1993 78.0000000 60.7866359 - 1406 6 11 1993 72.0000000 59.0889532 - 1407 7 11 1993 76.0000000 58.8162994 - 1408 8 11 1993 69.0000000 58.0797205 - 1409 9 11 1993 66.0000000 58.5556566 - 1410 10 11 1993 71.0000000 61.3512493 - 1411 11 11 1993 64.0000000 91.1221410 - 1412 12 11 1993 67.0000000 111.1713608 - 1413 13 11 1993 80.0000000 106.8121121 - 1414 14 11 1993 78.0000000 139.9395019 - 1415 15 11 1993 80.0000000 141.7700627 - 1416 16 11 1993 86.0000000 136.9574394 - 1417 17 11 1993 125.0000000 119.5278244 - 1418 18 11 1993 96.0000000 106.3586302 - 1419 19 11 1993 82.0000000 95.8212875 - 1420 20 11 1993 77.0000000 87.3616628 - 1421 21 11 1993 67.0000000 80.5394936 - 1422 22 11 1993 71.0000000 75.0107367 - 1423 23 11 1993 61.0000000 70.5055972 - 1424 24 11 1993 42.0000000 66.8154724 - 1425 25 11 1993 63.0000000 65.7320001 - 1426 26 11 1993 57.0000000 65.7802879 - 1427 27 11 1993 58.0000000 62.7063588 - 1428 28 11 1993 49.0000000 60.2605770 - 1429 29 11 1993 50.0000000 58.2067638 - 1430 30 11 1993 55.0000000 56.4660230 - 1431 1 12 1993 54.0000000 54.9757352 - 1432 2 12 1993 54.0000000 62.4166809 - 1433 3 12 1993 50.0000000 62.1363943 - 1434 4 12 1993 51.0000000 68.7198970 - 1435 5 12 1993 62.0000000 64.7340667 - 1436 6 12 1993 62.0000000 61.1482959 - 1437 7 12 1993 71.0000000 110.8490879 - 1438 8 12 1993 79.0000000 218.7260085 - 1439 9 12 1993 153.0000000 226.7800707 - 1440 10 12 1993 291.0000000 321.7747990 - 1441 11 12 1993 332.0000000 361.5101021 - 1442 12 12 1993 465.0000000 386.7545592 - 1443 13 12 1993 518.0000000 441.0243175 - 1444 14 12 1993 539.0000000 438.1575730 - 1445 15 12 1993 559.0000000 456.0064539 - 1446 16 12 1993 500.0000000 511.5710175 - 1447 17 12 1993 526.0000000 531.0995768 - 1448 18 12 1993 583.0000000 487.4962608 - 1449 19 12 1993 677.0000000 612.8570018 - 1450 20 12 1993 781.0000000 966.0857013 - 1451 21 12 1993 1180.0000000 1027.6523347 - 1452 22 12 1993 1460.0000000 1005.8049268 - 1453 23 12 1993 1600.0000000 1082.5104151 - 1454 24 12 1993 1410.0000000 1051.0664298 - 1455 25 12 1993 1230.0000000 804.7833933 - 1456 26 12 1993 1070.0000000 598.8840285 - 1457 27 12 1993 746.0000000 470.5078703 - 1458 28 12 1993 542.0000000 400.6565024 - 1459 29 12 1993 492.0000000 412.7903297 - 1460 30 12 1993 491.0000000 514.3855765 - 1461 31 12 1993 617.0000000 888.3415547 + 1 1 7 1990 79.0000000 114.8085178 + 2 2 7 1990 92.0000000 101.7452365 + 3 3 7 1990 72.0000000 110.0506184 + 4 4 7 1990 58.0000000 132.3399237 + 5 5 7 1990 69.0000000 168.9115913 + 6 6 7 1990 94.0000000 150.4179711 + 7 7 7 1990 199.0000000 154.2530656 + 8 8 7 1990 133.0000000 153.9354225 + 9 9 7 1990 124.0000000 135.5743424 + 10 10 7 1990 123.0000000 123.8277634 + 11 11 7 1990 99.0000000 114.3526936 + 12 12 7 1990 88.0000000 106.6714807 + 13 13 7 1990 84.0000000 100.4095951 + 14 14 7 1990 72.0000000 95.2727107 + 15 15 7 1990 55.0000000 91.0290702 + 16 16 7 1990 65.0000000 87.4958570 + 17 17 7 1990 50.0000000 84.5286263 + 18 18 7 1990 50.0000000 82.0130803 + 19 19 7 1990 46.0000000 79.8586518 + 20 20 7 1990 44.0000000 77.9934843 + 21 21 7 1990 42.0000000 76.3604975 + 22 22 7 1990 37.0000000 74.9142964 + 23 23 7 1990 38.0000000 73.6187395 + 24 24 7 1990 44.0000000 72.4450216 + 25 25 7 1990 30.0000000 71.3701614 + 26 26 7 1990 26.0000000 70.3758048 + 27 27 7 1990 31.0000000 69.4472787 + 28 28 7 1990 33.0000000 72.4662155 + 29 29 7 1990 42.0000000 68.6687637 + 30 30 7 1990 36.0000000 67.0388431 + 31 31 7 1990 34.0000000 66.2670118 + 32 1 8 1990 25.0000000 65.5232801 + 33 2 8 1990 22.0000000 64.8033733 + 34 3 8 1990 28.0000000 64.1038475 + 35 4 8 1990 25.0000000 63.4219239 + 36 5 8 1990 19.0000000 62.7555600 + 37 6 8 1990 22.0000000 62.1029964 + 38 7 8 1990 19.0000000 61.4620056 + 39 8 8 1990 22.0000000 60.8318325 + 40 9 8 1990 19.0000000 60.2115607 + 41 10 8 1990 20.0000000 59.6003879 + 42 11 8 1990 19.0000000 58.9976561 + 43 12 8 1990 19.0000000 58.4028238 + 44 13 8 1990 22.0000000 64.4372567 + 45 14 8 1990 36.0000000 87.2979629 + 46 15 8 1990 31.0000000 69.8633461 + 47 16 8 1990 30.0000000 66.3164015 + 48 17 8 1990 28.0000000 61.0278308 + 49 18 8 1990 34.0000000 56.9164550 + 50 19 8 1990 21.0000000 56.0543696 + 51 20 8 1990 30.0000000 55.2589708 + 52 21 8 1990 22.0000000 54.5180908 + 53 22 8 1990 21.0000000 53.8219844 + 54 23 8 1990 23.0000000 53.1628389 + 55 24 8 1990 20.0000000 52.5343843 + 56 25 8 1990 29.0000000 51.9320763 + 57 26 8 1990 20.0000000 51.5319989 + 58 27 8 1990 22.0000000 52.7584271 + 59 28 8 1990 23.0000000 51.2629601 + 60 29 8 1990 35.0000000 50.0527009 + 61 30 8 1990 51.0000000 153.1821133 + 62 31 8 1990 80.0000000 104.2539856 + 63 1 9 1990 56.0000000 60.0786506 + 64 2 9 1990 33.0000000 54.9268524 + 65 3 9 1990 27.0000000 53.3028120 + 66 4 9 1990 27.0000000 58.8151035 + 67 5 9 1990 28.0000000 57.0726603 + 68 6 9 1990 26.0000000 53.3323767 + 69 7 9 1990 24.0000000 54.7556832 + 70 8 9 1990 33.0000000 51.9559674 + 71 9 9 1990 26.0000000 49.8259124 + 72 10 9 1990 27.0000000 48.6069751 + 73 11 9 1990 22.0000000 47.5435995 + 74 12 9 1990 22.0000000 46.6054578 + 75 13 9 1990 21.0000000 45.7683836 + 76 14 9 1990 22.0000000 45.0130967 + 77 15 9 1990 22.0000000 44.3241975 + 78 16 9 1990 22.0000000 43.6893716 + 79 17 9 1990 20.0000000 43.0987614 + 80 18 9 1990 22.0000000 42.5444669 + 81 19 9 1990 16.0000000 42.0201506 + 82 20 9 1990 22.0000000 41.5207225 + 83 21 9 1990 19.0000000 46.4671860 + 84 22 9 1990 32.0000000 128.4204033 + 85 23 9 1990 27.0000000 84.8514819 + 86 24 9 1990 45.0000000 68.6644168 + 87 25 9 1990 42.0000000 55.5945255 + 88 26 9 1990 39.0000000 51.7108569 + 89 27 9 1990 30.0000000 49.1074454 + 90 28 9 1990 28.0000000 46.9511407 + 91 29 9 1990 30.0000000 45.1525159 + 92 30 9 1990 30.0000000 116.8357307 + 93 1 10 1990 56.0000000 155.6706829 + 94 2 10 1990 72.0000000 117.6925212 + 95 3 10 1990 73.0000000 128.1179991 + 96 4 10 1990 68.0000000 108.5834976 + 97 5 10 1990 53.0000000 96.5782416 + 98 6 10 1990 42.0000000 85.0437431 + 99 7 10 1990 33.0000000 76.1641630 + 100 8 10 1990 42.0000000 69.0748511 + 101 9 10 1990 34.0000000 63.3379060 + 102 10 10 1990 36.0000000 58.6858912 + 103 11 10 1990 36.0000000 54.9017157 + 104 12 10 1990 28.0000000 51.8059814 + 105 13 10 1990 32.0000000 49.2573276 + 106 14 10 1990 27.0000000 47.1441545 + 107 15 10 1990 35.0000000 45.7179751 + 108 16 10 1990 42.0000000 46.1009709 + 109 17 10 1990 35.0000000 57.8385551 + 110 18 10 1990 39.0000000 55.4576720 + 111 19 10 1990 34.0000000 49.0937679 + 112 20 10 1990 32.0000000 46.7518234 + 113 21 10 1990 34.0000000 44.8086875 + 114 22 10 1990 27.0000000 43.1832058 + 115 23 10 1990 31.0000000 41.8111788 + 116 24 10 1990 28.0000000 40.6417433 + 117 25 10 1990 25.0000000 40.3621068 + 118 26 10 1990 29.0000000 60.7874600 + 119 27 10 1990 31.0000000 68.7509822 + 120 28 10 1990 65.0000000 234.4635644 + 121 29 10 1990 69.0000000 226.0404450 + 122 30 10 1990 157.0000000 190.9116674 + 123 31 10 1990 190.0000000 166.2353555 + 124 1 11 1990 115.0000000 164.7558733 + 125 2 11 1990 104.0000000 176.6139183 + 126 3 11 1990 100.0000000 184.0332912 + 127 4 11 1990 131.0000000 187.3312566 + 128 5 11 1990 130.0000000 173.5149037 + 129 6 11 1990 115.0000000 147.5814570 + 130 7 11 1990 102.0000000 127.5079367 + 131 8 11 1990 95.0000000 111.5631519 + 132 9 11 1990 81.0000000 98.9009858 + 133 10 11 1990 66.0000000 104.5338171 + 134 11 11 1990 67.0000000 156.5040326 + 135 12 11 1990 74.0000000 168.3214152 + 136 13 11 1990 109.0000000 162.1605573 + 137 14 11 1990 92.0000000 196.7406647 + 138 15 11 1990 92.0000000 204.8683363 + 139 16 11 1990 155.0000000 192.0633510 + 140 17 11 1990 159.0000000 178.8645674 + 141 18 11 1990 131.0000000 193.5064948 + 142 19 11 1990 161.0000000 204.1719945 + 143 20 11 1990 196.0000000 340.3860777 + 144 21 11 1990 336.0000000 349.5592302 + 145 22 11 1990 566.0000000 355.8938003 + 146 23 11 1990 373.0000000 372.1229195 + 147 24 11 1990 293.0000000 326.9020581 + 148 25 11 1990 264.0000000 295.7383405 + 149 26 11 1990 226.0000000 254.5480390 + 150 27 11 1990 201.0000000 218.3435694 + 151 28 11 1990 180.0000000 188.6263416 + 152 29 11 1990 161.0000000 182.7309967 + 153 30 11 1990 149.0000000 166.5949771 + 154 1 12 1990 134.0000000 146.7412857 + 155 2 12 1990 113.0000000 132.2069117 + 156 3 12 1990 99.0000000 120.6844174 + 157 4 12 1990 107.0000000 111.7445702 + 158 5 12 1990 99.0000000 104.2863970 + 159 6 12 1990 89.0000000 98.1489641 + 160 7 12 1990 77.0000000 93.1436910 + 161 8 12 1990 71.0000000 89.0313780 + 162 9 12 1990 68.0000000 88.3802364 + 163 10 12 1990 73.0000000 83.6597253 + 164 11 12 1990 84.0000000 81.0722478 + 165 12 12 1990 88.0000000 105.2744932 + 166 13 12 1990 92.0000000 109.5943401 + 167 14 12 1990 128.0000000 100.1495797 + 168 15 12 1990 136.0000000 92.5455322 + 169 16 12 1990 114.0000000 87.7584293 + 170 17 12 1990 101.0000000 83.9056021 + 171 18 12 1990 93.0000000 80.7542456 + 172 19 12 1990 85.0000000 78.1411956 + 173 20 12 1990 81.0000000 80.5590710 + 174 21 12 1990 106.0000000 121.7867780 + 175 22 12 1990 159.0000000 149.0859209 + 176 23 12 1990 250.0000000 154.6372773 + 177 24 12 1990 298.0000000 144.6280297 + 178 25 12 1990 261.0000000 220.7646067 + 179 26 12 1990 228.0000000 342.3924904 + 180 27 12 1990 409.0000000 390.7830502 + 181 28 12 1990 486.0000000 397.8541473 + 182 29 12 1990 440.0000000 548.4655139 + 183 30 12 1990 486.0000000 712.9995841 + 184 31 12 1990 774.0000000 878.4405289 + 185 1 1 1991 889.0000000 844.0395372 + 186 2 1 1991 863.0000000 873.9059080 + 187 3 1 1991 875.0000000 867.3775150 + 188 4 1 1991 932.0000000 721.7889180 + 189 5 1 1991 826.0000000 668.0081607 + 190 6 1 1991 731.0000000 608.3583979 + 191 7 1 1991 613.0000000 594.8985636 + 192 8 1 1991 610.0000000 570.4961393 + 193 9 1 1991 686.0000000 504.8998175 + 194 10 1 1991 556.0000000 558.6625129 + 195 11 1 1991 669.0000000 594.0912157 + 196 12 1 1991 828.0000000 530.8899299 + 197 13 1 1991 735.0000000 423.6555083 + 198 14 1 1991 513.0000000 358.1383168 + 199 15 1 1991 411.0000000 310.6279754 + 200 16 1 1991 345.0000000 274.2649185 + 201 17 1 1991 293.0000000 246.1248321 + 202 18 1 1991 251.0000000 224.1436910 + 203 19 1 1991 222.0000000 206.8620103 + 204 20 1 1991 215.0000000 193.4077530 + 205 21 1 1991 213.0000000 189.9181261 + 206 22 1 1991 202.0000000 191.7166441 + 207 23 1 1991 200.0000000 182.3848536 + 208 24 1 1991 192.0000000 173.4046953 + 209 25 1 1991 176.0000000 165.6244574 + 210 26 1 1991 164.0000000 159.2682851 + 211 27 1 1991 157.0000000 153.9810642 + 212 28 1 1991 134.0000000 149.5430871 + 213 29 1 1991 130.0000000 145.7667784 + 214 30 1 1991 119.0000000 142.5088347 + 215 31 1 1991 107.0000000 139.6591475 + 216 1 2 1991 112.0000000 137.1326761 + 217 2 2 1991 109.0000000 134.8634325 + 218 3 2 1991 101.0000000 132.7999940 + 219 4 2 1991 98.0000000 130.9021308 + 220 5 2 1991 84.0000000 129.1382560 + 221 6 2 1991 93.0000000 127.4834855 + 222 7 2 1991 80.0000000 125.9181538 + 223 8 2 1991 73.0000000 124.4266734 + 224 9 2 1991 89.0000000 122.9966544 + 225 10 2 1991 84.0000000 121.6182213 + 226 11 2 1991 78.0000000 120.2834823 + 227 12 2 1991 79.0000000 118.9861139 + 228 13 2 1991 77.0000000 117.7210362 + 229 14 2 1991 80.0000000 116.4841573 + 230 15 2 1991 72.0000000 115.2721722 + 231 16 2 1991 78.0000000 116.0629089 + 232 17 2 1991 74.0000000 116.1217819 + 233 18 2 1991 77.0000000 114.8216698 + 234 19 2 1991 73.0000000 139.2386955 + 235 20 2 1991 69.0000000 164.9984058 + 236 21 2 1991 74.0000000 205.6433913 + 237 22 2 1991 81.0000000 211.1872822 + 238 23 2 1991 110.0000000 203.6521880 + 239 24 2 1991 180.0000000 205.2420531 + 240 25 2 1991 213.0000000 216.1878450 + 241 26 2 1991 222.0000000 223.0883334 + 242 27 2 1991 208.0000000 225.9418742 + 243 28 2 1991 211.0000000 220.0290421 + 244 1 3 1991 214.0000000 202.9687476 + 245 2 3 1991 208.0000000 203.7875246 + 246 3 3 1991 221.0000000 192.7706150 + 247 4 3 1991 281.0000000 174.7016990 + 248 5 3 1991 219.0000000 161.5801180 + 249 6 3 1991 190.0000000 151.1235833 + 250 7 3 1991 173.0000000 142.5893372 + 251 8 3 1991 164.0000000 135.8930203 + 252 9 3 1991 142.0000000 131.3350684 + 253 10 3 1991 133.0000000 132.8756804 + 254 11 3 1991 133.0000000 131.2682193 + 255 12 3 1991 118.0000000 126.0615305 + 256 13 3 1991 127.0000000 121.4291394 + 257 14 3 1991 113.0000000 117.5334076 + 258 15 3 1991 107.0000000 114.2231030 + 259 16 3 1991 100.0000000 111.3792026 + 260 17 3 1991 100.0000000 108.9117888 + 261 18 3 1991 95.0000000 106.7734008 + 262 19 3 1991 98.0000000 186.1441321 + 263 20 3 1991 119.0000000 189.0190209 + 264 21 3 1991 159.0000000 225.5739387 + 265 22 3 1991 196.0000000 251.0640580 + 266 23 3 1991 242.0000000 231.3121278 + 267 24 3 1991 216.0000000 203.5743097 + 268 25 3 1991 180.0000000 182.5659263 + 269 26 3 1991 145.0000000 166.1761756 + 270 27 3 1991 127.0000000 154.1315598 + 271 28 3 1991 117.0000000 143.3835007 + 272 29 3 1991 109.0000000 134.5629427 + 273 30 3 1991 106.0000000 127.3925530 + 274 31 3 1991 99.0000000 121.5151543 + 275 1 4 1991 96.0000000 116.6544105 + 276 2 4 1991 88.0000000 112.5956327 + 277 3 4 1991 87.0000000 109.1714106 + 278 4 4 1991 82.0000000 106.6392128 + 279 5 4 1991 84.0000000 104.9543144 + 280 6 4 1991 67.0000000 102.6034938 + 281 7 4 1991 89.0000000 100.6008428 + 282 8 4 1991 75.0000000 98.7868400 + 283 9 4 1991 79.0000000 97.0767252 + 284 10 4 1991 70.0000000 95.5224110 + 285 11 4 1991 69.0000000 94.1003281 + 286 12 4 1991 69.0000000 92.7856283 + 287 13 4 1991 56.0000000 91.5588303 + 288 14 4 1991 63.0000000 90.4066662 + 289 15 4 1991 58.0000000 89.3121654 + 290 16 4 1991 56.0000000 88.2648761 + 291 17 4 1991 54.0000000 87.2589274 + 292 18 4 1991 57.0000000 86.3027213 + 293 19 4 1991 53.0000000 85.7623097 + 294 20 4 1991 53.0000000 85.7906305 + 295 21 4 1991 65.0000000 85.7143990 + 296 22 4 1991 69.0000000 86.7935484 + 297 23 4 1991 61.0000000 89.3619466 + 298 24 4 1991 56.0000000 88.6341505 + 299 25 4 1991 56.0000000 86.5552617 + 300 26 4 1991 53.0000000 84.5824500 + 301 27 4 1991 49.0000000 82.8512840 + 302 28 4 1991 53.0000000 81.3171515 + 303 29 4 1991 48.0000000 82.2764492 + 304 30 4 1991 57.0000000 136.7710878 + 305 1 5 1991 69.0000000 125.5968471 + 306 2 5 1991 89.0000000 111.0617128 + 307 3 5 1991 105.0000000 103.7016505 + 308 4 5 1991 79.0000000 97.6882312 + 309 5 5 1991 69.0000000 93.0707772 + 310 6 5 1991 71.0000000 89.9764489 + 311 7 5 1991 60.0000000 86.5478446 + 312 8 5 1991 64.0000000 83.4317967 + 313 9 5 1991 59.0000000 80.8001403 + 314 10 5 1991 57.0000000 85.2199862 + 315 11 5 1991 55.0000000 93.1928222 + 316 12 5 1991 53.0000000 90.0782801 + 317 13 5 1991 52.0000000 86.0162142 + 318 14 5 1991 50.0000000 83.2225553 + 319 15 5 1991 52.0000000 94.2570008 + 320 16 5 1991 54.0000000 99.5695952 + 321 17 5 1991 54.0000000 92.1665277 + 322 18 5 1991 55.0000000 86.8989481 + 323 19 5 1991 48.0000000 82.5650715 + 324 20 5 1991 48.0000000 78.9755486 + 325 21 5 1991 49.0000000 75.9800339 + 326 22 5 1991 41.0000000 73.4590737 + 327 23 5 1991 40.0000000 71.3176976 + 328 24 5 1991 40.0000000 69.4803519 + 329 25 5 1991 39.0000000 67.8868917 + 330 26 5 1991 43.0000000 66.4894075 + 331 27 5 1991 39.0000000 65.2497122 + 332 28 5 1991 36.0000000 64.1373483 + 333 29 5 1991 33.0000000 63.1280076 + 334 30 5 1991 39.0000000 62.2022766 + 335 31 5 1991 34.0000000 61.3446408 + 336 1 6 1991 37.0000000 60.5426924 + 337 2 6 1991 35.0000000 59.7865012 + 338 3 6 1991 29.0000000 59.0681137 + 339 4 6 1991 33.0000000 58.3811543 + 340 5 6 1991 34.0000000 57.8075199 + 341 6 6 1991 32.0000000 72.9412374 + 342 7 6 1991 38.0000000 71.9001943 + 343 8 6 1991 39.0000000 62.9935507 + 344 9 6 1991 41.0000000 64.0751343 + 345 10 6 1991 44.0000000 70.6300603 + 346 11 6 1991 48.0000000 61.8292819 + 347 12 6 1991 42.0000000 59.3330855 + 348 13 6 1991 37.0000000 57.7878565 + 349 14 6 1991 39.0000000 56.4493741 + 350 15 6 1991 35.0000000 56.7240634 + 351 16 6 1991 31.0000000 63.5425162 + 352 17 6 1991 33.0000000 68.1438272 + 353 18 6 1991 31.0000000 65.5205248 + 354 19 6 1991 28.0000000 62.6548234 + 355 20 6 1991 60.0000000 98.1348563 + 356 21 6 1991 48.0000000 70.7756615 + 357 22 6 1991 54.0000000 60.9833301 + 358 23 6 1991 63.0000000 69.9080498 + 359 24 6 1991 41.0000000 59.3856323 + 360 25 6 1991 42.0000000 55.4508268 + 361 26 6 1991 43.0000000 53.8541405 + 362 27 6 1991 38.0000000 62.8801805 + 363 28 6 1991 38.0000000 63.8583267 + 364 29 6 1991 35.0000000 59.1593948 + 365 30 6 1991 41.0000000 56.1959980 diff --git a/check/case_01/output_save/b2_daily_discharge.out b/check/case_01/output_save/b2_daily_discharge.out deleted file mode 100644 index 4521540a..00000000 --- a/check/case_01/output_save/b2_daily_discharge.out +++ /dev/null @@ -1,1462 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 120.2629931 - 2 2 1 1990 129.0000000 110.5604754 - 3 3 1 1990 117.0000000 102.7778416 - 4 4 1 1990 111.0000000 96.4904684 - 5 5 1 1990 112.0000000 91.4931425 - 6 6 1 1990 93.0000000 88.4772097 - 7 7 1 1990 87.0000000 85.4388887 - 8 8 1 1990 84.0000000 82.2810953 - 9 9 1 1990 80.0000000 79.5385727 - 10 10 1 1990 78.0000000 77.2130202 - 11 11 1 1990 78.0000000 75.2197773 - 12 12 1 1990 77.0000000 73.4920681 - 13 13 1 1990 76.0000000 73.1670970 - 14 14 1 1990 73.0000000 76.1661745 - 15 15 1 1990 66.0000000 88.4754398 - 16 16 1 1990 76.0000000 89.0065362 - 17 17 1 1990 73.0000000 98.3342634 - 18 18 1 1990 71.0000000 105.1628317 - 19 19 1 1990 90.0000000 99.6720230 - 20 20 1 1990 82.0000000 100.6779547 - 21 21 1 1990 80.0000000 93.3240239 - 22 22 1 1990 81.0000000 86.8983714 - 23 23 1 1990 97.0000000 217.8527986 - 24 24 1 1990 198.0000000 251.0548987 - 25 25 1 1990 392.0000000 359.1830147 - 26 26 1 1990 519.0000000 357.2603994 - 27 27 1 1990 565.0000000 295.2205405 - 28 28 1 1990 331.0000000 279.7334978 - 29 29 1 1990 293.0000000 270.8542305 - 30 30 1 1990 302.0000000 229.0549044 - 31 31 1 1990 233.0000000 198.4500800 - 32 1 2 1990 198.0000000 206.3629286 - 33 2 2 1990 183.0000000 226.3737351 - 34 3 2 1990 206.0000000 225.8336910 - 35 4 2 1990 215.0000000 194.0748489 - 36 5 2 1990 183.0000000 170.8731989 - 37 6 2 1990 159.0000000 152.7538692 - 38 7 2 1990 167.0000000 138.4246262 - 39 8 2 1990 138.0000000 133.3531045 - 40 9 2 1990 126.0000000 132.7219255 - 41 10 2 1990 131.0000000 255.1490045 - 42 11 2 1990 173.0000000 304.4214768 - 43 12 2 1990 240.0000000 360.4244605 - 44 13 2 1990 270.0000000 582.7303800 - 45 14 2 1990 458.0000000 1109.6860774 - 46 15 2 1990 996.0000000 1292.3192435 - 47 16 2 1990 1370.0000000 1019.3734408 - 48 17 2 1990 1540.0000000 755.5134083 - 49 18 2 1990 1210.0000000 573.2582275 - 50 19 2 1990 616.0000000 447.9744942 - 51 20 2 1990 465.0000000 369.4160843 - 52 21 2 1990 373.0000000 316.8475100 - 53 22 2 1990 298.0000000 276.4167107 - 54 23 2 1990 270.0000000 245.0045256 - 55 24 2 1990 234.0000000 220.4097256 - 56 25 2 1990 218.0000000 207.9903330 - 57 26 2 1990 203.0000000 377.3026056 - 58 27 2 1990 314.0000000 617.2513664 - 59 28 2 1990 520.0000000 863.3352603 - 60 1 3 1990 689.0000000 877.3202297 - 61 2 3 1990 777.0000000 693.0550852 - 62 3 3 1990 584.0000000 529.4515705 - 63 4 3 1990 429.0000000 430.0048292 - 64 5 3 1990 365.0000000 370.4785295 - 65 6 3 1990 281.0000000 323.1802583 - 66 7 3 1990 257.0000000 286.3893119 - 67 8 3 1990 231.0000000 257.7784286 - 68 9 3 1990 211.0000000 235.3336903 - 69 10 3 1990 191.0000000 217.5903084 - 70 11 3 1990 182.0000000 203.4239729 - 71 12 3 1990 173.0000000 192.0075004 - 72 13 3 1990 159.0000000 183.1992465 - 73 14 3 1990 153.0000000 179.8014987 - 74 15 3 1990 141.0000000 177.4119022 - 75 16 3 1990 136.0000000 170.5981435 - 76 17 3 1990 130.0000000 164.7829657 - 77 18 3 1990 123.0000000 159.8756881 - 78 19 3 1990 115.0000000 155.6883781 - 79 20 3 1990 113.0000000 152.5623431 - 80 21 3 1990 102.0000000 149.7515796 - 81 22 3 1990 105.0000000 147.4963243 - 82 23 3 1990 106.0000000 146.3638584 - 83 24 3 1990 87.0000000 144.9685989 - 84 25 3 1990 80.0000000 146.1040365 - 85 26 3 1990 84.0000000 143.1355753 - 86 27 3 1990 82.0000000 141.5027780 - 87 28 3 1990 91.0000000 158.8347509 - 88 29 3 1990 97.0000000 169.5610550 - 89 30 3 1990 110.0000000 165.1662325 - 90 31 3 1990 97.0000000 158.0378952 - 91 1 4 1990 93.0000000 151.4911630 - 92 2 4 1990 85.0000000 146.0328367 - 93 3 4 1990 84.0000000 152.9060795 - 94 4 4 1990 81.0000000 161.0615498 - 95 5 4 1990 81.0000000 153.6911088 - 96 6 4 1990 76.0000000 153.2802513 - 97 7 4 1990 72.0000000 146.6397127 - 98 8 4 1990 68.0000000 141.0983043 - 99 9 4 1990 72.0000000 136.4414782 - 100 10 4 1990 65.0000000 132.5518677 - 101 11 4 1990 62.0000000 131.8652473 - 102 12 4 1990 62.0000000 132.5240556 - 103 13 4 1990 65.0000000 137.0558689 - 104 14 4 1990 68.0000000 173.0166058 - 105 15 4 1990 75.0000000 177.4161339 - 106 16 4 1990 90.0000000 178.0296679 - 107 17 4 1990 92.0000000 182.6091222 - 108 18 4 1990 94.0000000 184.1384154 - 109 19 4 1990 110.0000000 170.3430218 - 110 20 4 1990 99.0000000 158.7220082 - 111 21 4 1990 86.0000000 149.4181919 - 112 22 4 1990 86.0000000 147.6747551 - 113 23 4 1990 86.0000000 155.9843189 - 114 24 4 1990 88.0000000 159.0270808 - 115 25 4 1990 93.0000000 150.3934877 - 116 26 4 1990 99.0000000 142.3960545 - 117 27 4 1990 86.0000000 138.9046854 - 118 28 4 1990 74.0000000 135.4657147 - 119 29 4 1990 72.0000000 129.7060765 - 120 30 4 1990 77.0000000 124.7470663 - 121 1 5 1990 56.0000000 120.5815825 - 122 2 5 1990 64.0000000 117.0486990 - 123 3 5 1990 58.0000000 114.0210613 - 124 4 5 1990 50.0000000 111.3977492 - 125 5 5 1990 50.0000000 109.0986900 - 126 6 5 1990 50.0000000 107.0602767 - 127 7 5 1990 50.0000000 105.2702366 - 128 8 5 1990 53.0000000 104.8050305 - 129 9 5 1990 62.0000000 103.9755200 - 130 10 5 1990 64.0000000 106.2706408 - 131 11 5 1990 65.0000000 107.1708504 - 132 12 5 1990 75.0000000 102.4342986 - 133 13 5 1990 71.0000000 100.6009000 - 134 14 5 1990 63.0000000 99.2360882 - 135 15 5 1990 61.0000000 97.7560464 - 136 16 5 1990 49.0000000 96.3784139 - 137 17 5 1990 46.0000000 94.9538782 - 138 18 5 1990 46.0000000 93.6467936 - 139 19 5 1990 48.0000000 92.4243953 - 140 20 5 1990 41.0000000 91.3127765 - 141 21 5 1990 45.0000000 97.5908107 - 142 22 5 1990 52.0000000 95.6238278 - 143 23 5 1990 50.0000000 97.6448519 - 144 24 5 1990 56.0000000 100.1303608 - 145 25 5 1990 41.0000000 94.4195673 - 146 26 5 1990 40.0000000 90.8521030 - 147 27 5 1990 39.0000000 89.0467095 - 148 28 5 1990 39.0000000 87.4431039 - 149 29 5 1990 33.0000000 86.0010805 - 150 30 5 1990 37.0000000 84.6889604 - 151 31 5 1990 30.0000000 83.4817276 - 152 1 6 1990 37.0000000 97.3022160 - 153 2 6 1990 36.0000000 97.3571881 - 154 3 6 1990 40.0000000 123.8981502 - 155 4 6 1990 45.0000000 102.5945904 - 156 5 6 1990 39.0000000 92.2850133 - 157 6 6 1990 48.0000000 88.9661937 - 158 7 6 1990 39.0000000 142.6250632 - 159 8 6 1990 49.0000000 141.4697120 - 160 9 6 1990 84.0000000 132.3239046 - 161 10 6 1990 91.0000000 120.2902480 - 162 11 6 1990 80.0000000 110.4334868 - 163 12 6 1990 66.0000000 103.2923068 - 164 13 6 1990 53.0000000 97.5322318 - 165 14 6 1990 64.0000000 92.6911756 - 166 15 6 1990 55.0000000 88.7142746 - 167 16 6 1990 54.0000000 85.3989888 - 168 17 6 1990 42.0000000 82.6108178 - 169 18 6 1990 48.0000000 80.6597034 - 170 19 6 1990 48.0000000 104.6715060 - 171 20 6 1990 60.0000000 123.7621005 - 172 21 6 1990 75.0000000 120.6604039 - 173 22 6 1990 78.0000000 111.0768326 - 174 23 6 1990 66.0000000 102.4768980 - 175 24 6 1990 63.0000000 95.4946564 - 176 25 6 1990 52.0000000 90.1225241 - 177 26 6 1990 49.0000000 85.7017110 - 178 27 6 1990 44.0000000 88.2965684 - 179 28 6 1990 51.0000000 85.1652183 - 180 29 6 1990 61.0000000 111.9586196 - 181 30 6 1990 81.0000000 139.0090663 - 182 1 7 1990 79.0000000 102.5968443 - 183 2 7 1990 92.0000000 89.7326912 - 184 3 7 1990 72.0000000 98.1919989 - 185 4 7 1990 58.0000000 120.5649857 - 186 5 7 1990 69.0000000 157.0979260 - 187 6 7 1990 94.0000000 138.6617745 - 188 7 7 1990 199.0000000 142.6530566 - 189 8 7 1990 133.0000000 142.4317484 - 190 9 7 1990 124.0000000 124.2947019 - 191 10 7 1990 123.0000000 112.7475442 - 192 11 7 1990 99.0000000 103.4496884 - 193 12 7 1990 88.0000000 95.9286812 - 194 13 7 1990 84.0000000 89.8138365 - 195 14 7 1990 72.0000000 84.8136933 - 196 15 7 1990 55.0000000 80.6986457 - 197 16 7 1990 65.0000000 77.2875051 - 198 17 7 1990 50.0000000 74.4370662 - 199 18 7 1990 50.0000000 72.0339810 - 200 19 7 1990 46.0000000 69.9884145 - 201 20 7 1990 44.0000000 68.2290781 - 202 21 7 1990 42.0000000 66.6993338 - 203 22 7 1990 37.0000000 65.3541338 - 204 23 7 1990 38.0000000 64.1576098 - 205 24 7 1990 44.0000000 63.0811734 - 206 25 7 1990 30.0000000 62.1020156 - 207 26 7 1990 26.0000000 61.2019206 - 208 27 7 1990 31.0000000 60.3663270 - 209 28 7 1990 33.0000000 63.4754170 - 210 29 7 1990 42.0000000 59.7666627 - 211 30 7 1990 36.0000000 58.2266131 - 212 31 7 1990 34.0000000 57.5435390 - 213 1 8 1990 25.0000000 56.8874801 - 214 2 8 1990 22.0000000 56.2542115 - 215 3 8 1990 28.0000000 55.6403305 - 216 4 8 1990 25.0000000 55.0430931 - 217 5 8 1990 19.0000000 54.4604863 - 218 6 8 1990 22.0000000 53.8907759 - 219 7 8 1990 19.0000000 53.3317577 - 220 8 8 1990 22.0000000 52.7826955 - 221 9 8 1990 19.0000000 52.2426898 - 222 10 8 1990 20.0000000 51.7109539 - 223 11 8 1990 19.0000000 51.1868437 - 224 12 8 1990 19.0000000 50.6698304 - 225 13 8 1990 22.0000000 56.7802509 - 226 14 8 1990 36.0000000 79.7103737 - 227 15 8 1990 31.0000000 62.3435308 - 228 16 8 1990 30.0000000 58.8691383 - 229 17 8 1990 28.0000000 53.6523024 - 230 18 8 1990 34.0000000 49.6167431 - 231 19 8 1990 21.0000000 48.8293565 - 232 20 8 1990 30.0000000 48.1075130 - 233 21 8 1990 22.0000000 47.4391361 - 234 22 8 1990 21.0000000 46.8145546 - 235 23 8 1990 23.0000000 46.2260158 - 236 24 8 1990 20.0000000 45.6672991 - 237 25 8 1990 29.0000000 45.1338922 - 238 26 8 1990 20.0000000 44.8017376 - 239 27 8 1990 22.0000000 46.0953346 - 240 28 8 1990 23.0000000 44.6664324 - 241 29 8 1990 35.0000000 43.5221161 - 242 30 8 1990 51.0000000 146.6881560 - 243 31 8 1990 80.0000000 97.7261713 - 244 1 9 1990 56.0000000 53.6016237 - 245 2 9 1990 33.0000000 48.5371785 - 246 3 9 1990 27.0000000 46.9950457 - 247 4 9 1990 27.0000000 52.5828723 - 248 5 9 1990 28.0000000 50.9115475 - 249 6 9 1990 26.0000000 47.2419887 - 250 7 9 1990 24.0000000 48.7288967 - 251 8 9 1990 33.0000000 45.9915160 - 252 9 9 1990 26.0000000 43.9267554 - 253 10 9 1990 27.0000000 42.7714962 - 254 11 9 1990 22.0000000 41.7701650 - 255 12 9 1990 22.0000000 40.8926587 - 256 13 9 1990 21.0000000 40.1149878 - 257 14 9 1990 22.0000000 39.4180126 - 258 15 9 1990 22.0000000 38.7864453 - 259 16 9 1990 22.0000000 38.2080612 - 260 17 9 1990 20.0000000 37.6730747 - 261 18 9 1990 22.0000000 37.1736445 - 262 19 9 1990 16.0000000 36.7034807 - 263 20 9 1990 22.0000000 36.2575325 - 264 21 9 1990 19.0000000 41.2548616 - 265 22 9 1990 32.0000000 123.2277095 - 266 23 9 1990 27.0000000 79.6473012 - 267 24 9 1990 45.0000000 63.5034874 - 268 25 9 1990 42.0000000 50.4949148 - 269 26 9 1990 39.0000000 46.6767949 - 270 27 9 1990 30.0000000 44.1352185 - 271 28 9 1990 28.0000000 42.0376598 - 272 29 9 1990 30.0000000 40.2952503 - 273 30 9 1990 30.0000000 111.9781011 - 274 1 10 1990 56.0000000 150.6734709 - 275 2 10 1990 72.0000000 112.6459062 - 276 3 10 1990 73.0000000 123.1143304 - 277 4 10 1990 68.0000000 103.5870060 - 278 5 10 1990 53.0000000 91.7055848 - 279 6 10 1990 42.0000000 80.2788269 - 280 7 10 1990 33.0000000 71.4919130 - 281 8 10 1990 42.0000000 64.4838100 - 282 9 10 1990 34.0000000 58.8193406 - 283 10 10 1990 36.0000000 54.2330709 - 284 11 10 1990 36.0000000 50.5094006 - 285 12 10 1990 28.0000000 47.4700503 - 286 13 10 1990 32.0000000 44.9745041 - 287 14 10 1990 27.0000000 42.9118053 - 288 15 10 1990 35.0000000 41.5306737 - 289 16 10 1990 42.0000000 41.9522338 - 290 17 10 1990 35.0000000 53.7191850 - 291 18 10 1990 39.0000000 51.3650910 - 292 19 10 1990 34.0000000 45.0514246 - 293 20 10 1990 32.0000000 42.7577121 - 294 21 10 1990 34.0000000 40.8606196 - 295 22 10 1990 27.0000000 39.2793967 - 296 23 10 1990 31.0000000 37.9501537 - 297 24 10 1990 28.0000000 36.8222666 - 298 25 10 1990 25.0000000 36.5810073 - 299 26 10 1990 29.0000000 57.0270061 - 300 27 10 1990 31.0000000 64.9982758 - 301 28 10 1990 65.0000000 230.4394188 - 302 29 10 1990 69.0000000 221.3866699 - 303 30 10 1990 157.0000000 186.2535011 - 304 31 10 1990 190.0000000 161.8155746 - 305 1 11 1990 115.0000000 160.4886878 - 306 2 11 1990 104.0000000 172.4346645 - 307 3 11 1990 100.0000000 179.9427637 - 308 4 11 1990 131.0000000 183.3539259 - 309 5 11 1990 130.0000000 169.6461229 - 310 6 11 1990 115.0000000 143.8369862 - 311 7 11 1990 102.0000000 123.8658069 - 312 8 11 1990 95.0000000 108.0064085 - 313 9 11 1990 81.0000000 95.4166153 - 314 10 11 1990 66.0000000 101.0639940 - 315 11 11 1990 67.0000000 152.9420127 - 316 12 11 1990 74.0000000 164.7258200 - 317 13 11 1990 109.0000000 158.6181002 - 318 14 11 1990 92.0000000 193.1158214 - 319 15 11 1990 92.0000000 201.2005080 - 320 16 11 1990 155.0000000 188.5203856 - 321 17 11 1990 159.0000000 175.4054818 - 322 18 11 1990 131.0000000 190.0415253 - 323 19 11 1990 161.0000000 200.6755676 - 324 20 11 1990 196.0000000 336.4747667 - 325 21 11 1990 336.0000000 345.1396851 - 326 22 11 1990 566.0000000 351.8912767 - 327 23 11 1990 373.0000000 368.3140519 - 328 24 11 1990 293.0000000 323.2429599 - 329 25 11 1990 264.0000000 292.1390722 - 330 26 11 1990 226.0000000 251.0520728 - 331 27 11 1990 201.0000000 215.0105803 - 332 28 11 1990 180.0000000 185.4212725 - 333 29 11 1990 161.0000000 179.5735719 - 334 30 11 1990 149.0000000 163.4586033 - 335 1 12 1990 134.0000000 143.6999400 - 336 2 12 1990 113.0000000 129.2447022 - 337 3 12 1990 99.0000000 117.7886649 - 338 4 12 1990 107.0000000 108.9050617 - 339 5 12 1990 99.0000000 101.4960995 - 340 6 12 1990 89.0000000 95.4031832 - 341 7 12 1990 77.0000000 90.4381747 - 342 8 12 1990 71.0000000 86.3628318 - 343 9 12 1990 68.0000000 85.7418618 - 344 10 12 1990 73.0000000 81.0487090 - 345 11 12 1990 84.0000000 78.4936426 - 346 12 12 1990 88.0000000 102.6641739 - 347 13 12 1990 92.0000000 106.8832255 - 348 14 12 1990 128.0000000 97.4350826 - 349 15 12 1990 136.0000000 89.8906351 - 350 16 12 1990 114.0000000 85.1692341 - 351 17 12 1990 101.0000000 81.3719036 - 352 18 12 1990 93.0000000 78.2684221 - 353 19 12 1990 85.0000000 75.6974936 - 354 20 12 1990 81.0000000 78.1466208 - 355 21 12 1990 106.0000000 119.2774166 - 356 22 12 1990 159.0000000 146.3165154 - 357 23 12 1990 250.0000000 151.7341152 - 358 24 12 1990 298.0000000 141.7747348 - 359 25 12 1990 261.0000000 217.8520581 - 360 26 12 1990 228.0000000 339.0317719 - 361 27 12 1990 409.0000000 387.2151358 - 362 28 12 1990 486.0000000 394.4024553 - 363 29 12 1990 440.0000000 544.6587920 - 364 30 12 1990 486.0000000 708.8150044 - 365 31 12 1990 774.0000000 874.5824512 - 366 1 1 1991 889.0000000 840.2946146 - 367 2 1 1991 863.0000000 870.0439004 - 368 3 1 1991 875.0000000 863.4353965 - 369 4 1 1991 932.0000000 718.1356537 - 370 5 1 1991 826.0000000 664.5943892 - 371 6 1 1991 731.0000000 605.1559760 - 372 7 1 1991 613.0000000 591.9427148 - 373 8 1 1991 610.0000000 567.6973465 - 374 9 1 1991 686.0000000 502.2346401 - 375 10 1 1991 556.0000000 555.8349181 - 376 11 1 1991 669.0000000 591.0853923 - 377 12 1 1991 828.0000000 528.1006821 - 378 13 1 1991 735.0000000 421.2099500 - 379 14 1 1991 513.0000000 355.8558426 - 380 15 1 1991 411.0000000 308.4391094 - 381 16 1 1991 345.0000000 272.1480966 - 382 17 1 1991 293.0000000 244.0655059 - 383 18 1 1991 251.0000000 222.1315569 - 384 19 1 1991 222.0000000 204.8896223 - 385 20 1 1991 215.0000000 191.4691035 - 386 21 1 1991 213.0000000 187.9975690 - 387 22 1 1991 202.0000000 189.7971778 - 388 23 1 1991 200.0000000 180.4843394 - 389 24 1 1991 192.0000000 171.5357375 - 390 25 1 1991 176.0000000 163.7855594 - 391 26 1 1991 164.0000000 157.4563432 - 392 27 1 1991 157.0000000 152.1937505 - 393 28 1 1991 134.0000000 147.7786110 - 394 29 1 1991 130.0000000 144.0237517 - 395 30 1 1991 119.0000000 140.7861657 - 396 31 1 1991 107.0000000 137.9559651 - 397 1 2 1991 112.0000000 135.4482743 - 398 2 2 1991 109.0000000 133.1972303 - 399 3 2 1991 101.0000000 131.1515050 - 400 4 2 1991 98.0000000 129.2709416 - 401 5 2 1991 84.0000000 127.5240093 - 402 6 2 1991 93.0000000 125.8858674 - 403 7 2 1991 80.0000000 124.3368846 - 404 8 2 1991 73.0000000 122.8615003 - 405 9 2 1991 89.0000000 121.4473457 - 406 10 2 1991 84.0000000 120.0845625 - 407 11 2 1991 78.0000000 118.7652724 - 408 12 2 1991 79.0000000 117.4831631 - 409 13 2 1991 77.0000000 116.2331637 - 410 14 2 1991 80.0000000 115.0111898 - 411 15 2 1991 72.0000000 113.8139428 - 412 16 2 1991 78.0000000 114.6151031 - 413 17 2 1991 74.0000000 114.6820178 - 414 18 2 1991 77.0000000 113.3979942 - 415 19 2 1991 73.0000000 137.8103863 - 416 20 2 1991 69.0000000 163.5381051 - 417 21 2 1991 74.0000000 204.1511310 - 418 22 2 1991 81.0000000 209.7079982 - 419 23 2 1991 110.0000000 202.2117206 - 420 24 2 1991 180.0000000 203.8346808 - 421 25 2 1991 213.0000000 214.8087610 - 422 26 2 1991 222.0000000 221.7337189 - 423 27 2 1991 208.0000000 224.6024452 - 424 28 2 1991 211.0000000 218.7022986 - 425 1 3 1991 214.0000000 201.6582519 - 426 2 3 1991 208.0000000 202.4786865 - 427 3 3 1991 221.0000000 191.4691992 - 428 4 3 1991 281.0000000 173.4228356 - 429 5 3 1991 219.0000000 160.3213456 - 430 6 3 1991 190.0000000 149.8828123 - 431 7 3 1991 173.0000000 141.3651328 - 432 8 3 1991 164.0000000 134.6840825 - 433 9 3 1991 142.0000000 130.1403446 - 434 10 3 1991 133.0000000 131.6933386 - 435 11 3 1991 133.0000000 130.0983181 - 436 12 3 1991 118.0000000 124.9051065 - 437 13 3 1991 127.0000000 120.2856923 - 438 14 3 1991 113.0000000 116.4024917 - 439 15 3 1991 107.0000000 113.1043490 - 440 16 3 1991 100.0000000 110.2722992 - 441 17 3 1991 100.0000000 107.8164676 - 442 18 3 1991 95.0000000 105.6894004 - 443 19 3 1991 98.0000000 185.0365737 - 444 20 3 1991 119.0000000 187.8675689 - 445 21 3 1991 159.0000000 224.4208291 - 446 22 3 1991 196.0000000 249.9014785 - 447 23 3 1991 242.0000000 230.1815835 - 448 24 3 1991 216.0000000 202.4758215 - 449 25 3 1991 180.0000000 181.4939040 - 450 26 3 1991 145.0000000 165.1264107 - 451 27 3 1991 127.0000000 153.1009332 - 452 28 3 1991 117.0000000 142.3698005 - 453 29 3 1991 109.0000000 133.5644167 - 454 30 3 1991 106.0000000 126.4078637 - 455 31 3 1991 99.0000000 120.5432714 - 456 1 4 1991 96.0000000 115.6945303 - 457 2 4 1991 88.0000000 111.6471205 - 458 3 4 1991 87.0000000 108.2337579 - 459 4 4 1991 82.0000000 105.7114686 - 460 5 4 1991 84.0000000 104.0362409 - 461 6 4 1991 67.0000000 101.6954084 - 462 7 4 1991 89.0000000 99.7021704 - 463 8 4 1991 75.0000000 97.8974508 - 464 9 4 1991 79.0000000 96.1966820 - 465 10 4 1991 70.0000000 94.6515373 - 466 11 4 1991 69.0000000 93.2384499 - 467 12 4 1991 69.0000000 91.9325906 - 468 13 4 1991 56.0000000 90.7144930 - 469 14 4 1991 63.0000000 89.5709015 - 470 15 4 1991 58.0000000 88.4848549 - 471 16 4 1991 56.0000000 87.4459092 - 472 17 4 1991 54.0000000 86.4481999 - 473 18 4 1991 57.0000000 85.5001030 - 474 19 4 1991 53.0000000 84.9673716 - 475 20 4 1991 53.0000000 85.0034558 - 476 21 4 1991 65.0000000 84.9351649 - 477 22 4 1991 69.0000000 86.0218038 - 478 23 4 1991 61.0000000 88.5974792 - 479 24 4 1991 56.0000000 87.8774095 - 480 25 4 1991 56.0000000 85.8062044 - 481 26 4 1991 53.0000000 83.8409704 - 482 27 4 1991 49.0000000 82.1172829 - 483 28 4 1991 53.0000000 80.5905347 - 484 29 4 1991 48.0000000 81.5565106 - 485 30 4 1991 57.0000000 136.0528403 - 486 1 5 1991 69.0000000 124.8789224 - 487 2 5 1991 89.0000000 110.3530456 - 488 3 5 1991 105.0000000 103.0018058 - 489 4 5 1991 79.0000000 96.9967323 - 490 5 5 1991 69.0000000 92.3872489 - 491 6 5 1991 71.0000000 89.3005860 - 492 7 5 1991 60.0000000 85.8793914 - 493 8 5 1991 64.0000000 82.7705390 - 494 9 5 1991 59.0000000 80.1458962 - 495 10 5 1991 57.0000000 84.5725897 - 496 11 5 1991 55.0000000 92.5521221 - 497 12 5 1991 53.0000000 89.4441793 - 498 13 5 1991 52.0000000 85.3886062 - 499 14 5 1991 50.0000000 82.6012884 - 500 15 5 1991 52.0000000 93.6418716 - 501 16 5 1991 54.0000000 98.9606146 - 502 17 5 1991 54.0000000 91.5637216 - 503 18 5 1991 55.0000000 86.3022358 - 504 19 5 1991 48.0000000 81.9743742 - 505 20 5 1991 48.0000000 78.3907917 - 506 21 5 1991 49.0000000 75.4011464 - 507 22 5 1991 41.0000000 72.8859877 - 508 23 5 1991 40.0000000 70.7503476 - 509 24 5 1991 40.0000000 68.9186747 - 510 25 5 1991 39.0000000 67.3308257 - 511 26 5 1991 43.0000000 65.9388929 - 512 27 5 1991 39.0000000 64.7046904 - 513 28 5 1991 36.0000000 63.5977620 - 514 29 5 1991 33.0000000 62.5938005 - 515 30 5 1991 39.0000000 61.6733935 - 516 31 5 1991 34.0000000 60.8210272 - 517 1 6 1991 37.0000000 60.0242947 - 518 2 6 1991 35.0000000 59.2732665 - 519 3 6 1991 29.0000000 58.5599899 - 520 4 6 1991 33.0000000 57.8780899 - 521 5 6 1991 34.0000000 57.3094637 - 522 6 6 1991 32.0000000 72.4479091 - 523 7 6 1991 38.0000000 71.4112076 - 524 8 6 1991 39.0000000 62.5094055 - 525 9 6 1991 41.0000000 63.5958219 - 526 10 6 1991 44.0000000 70.1552095 - 527 11 6 1991 48.0000000 61.3590648 - 528 12 6 1991 42.0000000 58.8676810 - 529 13 6 1991 37.0000000 57.3271924 - 530 14 6 1991 39.0000000 55.9933809 - 531 15 6 1991 35.0000000 56.2726796 - 532 16 6 1991 31.0000000 63.0956759 - 533 17 6 1991 33.0000000 67.7014476 - 534 18 6 1991 31.0000000 65.0825725 - 535 19 6 1991 28.0000000 62.2212638 - 536 20 6 1991 60.0000000 97.7046335 - 537 21 6 1991 48.0000000 70.3478494 - 538 22 6 1991 54.0000000 60.5600201 - 539 23 6 1991 63.0000000 69.4884277 - 540 24 6 1991 41.0000000 58.9699323 - 541 25 6 1991 42.0000000 55.0397210 - 542 26 6 1991 43.0000000 53.4475152 - 543 27 6 1991 38.0000000 62.4775437 - 544 28 6 1991 38.0000000 63.4593912 - 545 29 6 1991 35.0000000 58.7647150 - 546 30 6 1991 41.0000000 55.8055286 - 547 1 7 1991 41.0000000 53.5797727 - 548 2 7 1991 38.0000000 51.7109389 - 549 3 7 1991 34.0000000 50.1277895 - 550 4 7 1991 27.0000000 48.7736155 - 551 5 7 1991 31.0000000 47.6032400 - 552 6 7 1991 30.0000000 46.5807740 - 553 7 7 1991 26.0000000 53.2712725 - 554 8 7 1991 30.0000000 49.8035879 - 555 9 7 1991 31.0000000 45.2036304 - 556 10 7 1991 23.0000000 44.3577508 - 557 11 7 1991 35.0000000 43.5984974 - 558 12 7 1991 19.0000000 46.6857916 - 559 13 7 1991 24.0000000 80.2995516 - 560 14 7 1991 26.0000000 64.2627470 - 561 15 7 1991 27.0000000 53.4553348 - 562 16 7 1991 41.0000000 50.2679196 - 563 17 7 1991 34.0000000 48.0225918 - 564 18 7 1991 27.0000000 46.1495985 - 565 19 7 1991 25.0000000 44.5742410 - 566 20 7 1991 23.0000000 43.2372782 - 567 21 7 1991 22.0000000 42.0916013 - 568 22 7 1991 27.0000000 41.0995748 - 569 23 7 1991 23.0000000 40.2311747 - 570 24 7 1991 21.0000000 41.7749411 - 571 25 7 1991 23.0000000 62.9522794 - 572 26 7 1991 33.0000000 53.9740254 - 573 27 7 1991 23.0000000 44.1468805 - 574 28 7 1991 29.0000000 42.1530278 - 575 29 7 1991 30.0000000 40.7448615 - 576 30 7 1991 35.0000000 59.4722724 - 577 31 7 1991 27.0000000 53.9845774 - 578 1 8 1991 45.0000000 45.6228965 - 579 2 8 1991 47.0000000 43.3544420 - 580 3 8 1991 40.0000000 41.4727831 - 581 4 8 1991 35.0000000 39.9005815 - 582 5 8 1991 26.0000000 38.5759964 - 583 6 8 1991 23.0000000 37.4497857 - 584 7 8 1991 30.0000000 41.0698009 - 585 8 8 1991 33.0000000 39.1854333 - 586 9 8 1991 30.0000000 35.2839369 - 587 10 8 1991 28.0000000 34.3447252 - 588 11 8 1991 19.0000000 33.7484628 - 589 12 8 1991 20.0000000 33.2083489 - 590 13 8 1991 16.0000000 32.7138571 - 591 14 8 1991 18.0000000 32.2565599 - 592 15 8 1991 18.0000000 31.8297056 - 593 16 8 1991 20.0000000 31.4278802 - 594 17 8 1991 16.0000000 31.0467398 - 595 18 8 1991 15.0000000 30.6827957 - 596 19 8 1991 15.0000000 30.3332437 - 597 20 8 1991 14.0000000 29.9958278 - 598 21 8 1991 15.0000000 29.6687308 - 599 22 8 1991 13.0000000 29.3507009 - 600 23 8 1991 12.0000000 29.2430573 - 601 24 8 1991 11.0000000 28.9004954 - 602 25 8 1991 12.0000000 28.5403216 - 603 26 8 1991 11.0000000 28.2291992 - 604 27 8 1991 13.0000000 27.9264755 - 605 28 8 1991 11.0000000 27.6310284 - 606 29 8 1991 12.0000000 27.3419510 - 607 30 8 1991 12.0000000 27.0585094 - 608 31 8 1991 11.0000000 26.7801085 - 609 1 9 1991 11.0000000 29.2004244 - 610 2 9 1991 17.0000000 28.1074058 - 611 3 9 1991 11.0000000 26.0079782 - 612 4 9 1991 12.0000000 25.7414068 - 613 5 9 1991 11.0000000 25.4790338 - 614 6 9 1991 11.0000000 25.2205125 - 615 7 9 1991 18.0000000 24.9655597 - 616 8 9 1991 11.0000000 24.7139432 - 617 9 9 1991 13.0000000 24.4654719 - 618 10 9 1991 12.0000000 25.6189451 - 619 11 9 1991 11.0000000 65.7965424 - 620 12 9 1991 20.0000000 36.1829537 - 621 13 9 1991 21.0000000 25.7354512 - 622 14 9 1991 29.0000000 25.1039962 - 623 15 9 1991 28.0000000 24.5530835 - 624 16 9 1991 20.0000000 24.0671150 - 625 17 9 1991 20.0000000 23.6336221 - 626 18 9 1991 20.0000000 23.2426309 - 627 19 9 1991 12.0000000 22.8861572 - 628 20 9 1991 11.0000000 22.5578053 - 629 21 9 1991 11.0000000 22.2524480 - 630 22 9 1991 22.0000000 51.3182048 - 631 23 9 1991 14.0000000 33.6174728 - 632 24 9 1991 48.0000000 24.0791460 - 633 25 9 1991 45.0000000 93.8355419 - 634 26 9 1991 80.0000000 72.0155987 - 635 27 9 1991 61.0000000 52.6561408 - 636 28 9 1991 61.0000000 89.9085865 - 637 29 9 1991 65.0000000 73.3994225 - 638 30 9 1991 63.0000000 54.9330835 - 639 1 10 1991 90.0000000 42.7855885 - 640 2 10 1991 59.0000000 38.5091339 - 641 3 10 1991 45.0000000 35.1068801 - 642 4 10 1991 42.0000000 32.3723387 - 643 5 10 1991 41.0000000 94.3937950 - 644 6 10 1991 41.0000000 75.2502248 - 645 7 10 1991 73.0000000 54.2363143 - 646 8 10 1991 96.0000000 47.3003177 - 647 9 10 1991 61.0000000 42.3339219 - 648 10 10 1991 44.0000000 38.3567290 - 649 11 10 1991 42.0000000 35.2406031 - 650 12 10 1991 41.0000000 67.2159897 - 651 13 10 1991 42.0000000 64.2217990 - 652 14 10 1991 61.0000000 51.2426117 - 653 15 10 1991 55.0000000 45.6047317 - 654 16 10 1991 41.0000000 45.1400046 - 655 17 10 1991 48.0000000 62.6280039 - 656 18 10 1991 52.0000000 86.3391732 - 657 19 10 1991 66.0000000 62.7248103 - 658 20 10 1991 59.0000000 57.0831910 - 659 21 10 1991 71.0000000 52.7705887 - 660 22 10 1991 74.0000000 47.2446431 - 661 23 10 1991 70.0000000 42.7602300 - 662 24 10 1991 59.0000000 38.9859528 - 663 25 10 1991 57.0000000 35.9319780 - 664 26 10 1991 57.0000000 33.4497594 - 665 27 10 1991 51.0000000 31.4220625 - 666 28 10 1991 47.0000000 29.7567353 - 667 29 10 1991 48.0000000 28.3794080 - 668 30 10 1991 45.0000000 32.6933644 - 669 31 10 1991 43.0000000 33.9755350 - 670 1 11 1991 40.0000000 49.1340484 - 671 2 11 1991 47.0000000 50.5485484 - 672 3 11 1991 46.0000000 102.7164846 - 673 4 11 1991 76.0000000 147.4719129 - 674 5 11 1991 60.0000000 132.5170898 - 675 6 11 1991 132.0000000 118.0455187 - 676 7 11 1991 133.0000000 127.5580059 - 677 8 11 1991 113.0000000 153.1493725 - 678 9 11 1991 120.0000000 147.3799397 - 679 10 11 1991 141.0000000 127.4187533 - 680 11 11 1991 208.0000000 160.7161219 - 681 12 11 1991 166.0000000 204.0788350 - 682 13 11 1991 183.0000000 301.7558444 - 683 14 11 1991 299.0000000 428.9819773 - 684 15 11 1991 521.0000000 361.9259577 - 685 16 11 1991 443.0000000 301.7446690 - 686 17 11 1991 304.0000000 251.5819566 - 687 18 11 1991 231.0000000 261.6207936 - 688 19 11 1991 192.0000000 250.1719195 - 689 20 11 1991 199.0000000 234.9877879 - 690 21 11 1991 201.0000000 215.1576704 - 691 22 11 1991 173.0000000 182.2121795 - 692 23 11 1991 159.0000000 156.1885925 - 693 24 11 1991 160.0000000 135.5910676 - 694 25 11 1991 146.0000000 119.2424772 - 695 26 11 1991 110.0000000 106.2163369 - 696 27 11 1991 114.0000000 95.7955565 - 697 28 11 1991 97.0000000 87.4268450 - 698 29 11 1991 89.0000000 80.6756621 - 699 30 11 1991 73.0000000 75.2021609 - 700 1 12 1991 69.0000000 70.7398635 - 701 2 12 1991 67.0000000 67.0793419 - 702 3 12 1991 63.0000000 64.0556661 - 703 4 12 1991 58.0000000 61.5387078 - 704 5 12 1991 59.0000000 59.4256235 - 705 6 12 1991 53.0000000 57.6350073 - 706 7 12 1991 54.0000000 56.1023290 - 707 8 12 1991 51.0000000 54.7763676 - 708 9 12 1991 47.0000000 53.6164146 - 709 10 12 1991 42.0000000 52.5900778 - 710 11 12 1991 40.0000000 51.6715529 - 711 12 12 1991 39.0000000 50.8402612 - 712 13 12 1991 36.0000000 50.0797739 - 713 14 12 1991 37.0000000 49.3769616 - 714 15 12 1991 32.0000000 48.7213208 - 715 16 12 1991 37.0000000 74.2041650 - 716 17 12 1991 62.0000000 233.7159016 - 717 18 12 1991 118.0000000 307.4567479 - 718 19 12 1991 170.0000000 431.6911726 - 719 20 12 1991 229.0000000 484.2199132 - 720 21 12 1991 448.0000000 638.5741044 - 721 22 12 1991 464.0000000 775.1989192 - 722 23 12 1991 675.0000000 646.2048777 - 723 24 12 1991 844.0000000 514.1750362 - 724 25 12 1991 569.0000000 396.6936677 - 725 26 12 1991 358.0000000 319.0622249 - 726 27 12 1991 279.0000000 271.3676906 - 727 28 12 1991 238.0000000 233.3466186 - 728 29 12 1991 201.0000000 202.6844927 - 729 30 12 1991 185.0000000 178.5655623 - 730 31 12 1991 165.0000000 159.4831330 - 731 1 1 1992 140.0000000 144.4716149 - 732 2 1 1992 126.0000000 134.8544791 - 733 3 1 1992 117.0000000 128.1833663 - 734 4 1 1992 114.0000000 123.0583826 - 735 5 1 1992 108.0000000 115.5327544 - 736 6 1 1992 108.0000000 108.4935805 - 737 7 1 1992 101.0000000 103.0945405 - 738 8 1 1992 97.0000000 101.8272133 - 739 9 1 1992 89.0000000 137.9148489 - 740 10 1 1992 111.0000000 191.6214139 - 741 11 1 1992 135.0000000 179.7820596 - 742 12 1 1992 171.0000000 158.4482412 - 743 13 1 1992 125.0000000 142.9354516 - 744 14 1 1992 111.0000000 130.6198798 - 745 15 1 1992 100.0000000 121.1379562 - 746 16 1 1992 87.0000000 113.9731318 - 747 17 1 1992 75.0000000 107.3286763 - 748 18 1 1992 79.0000000 101.9026719 - 749 19 1 1992 70.0000000 103.9169389 - 750 20 1 1992 72.0000000 101.1826589 - 751 21 1 1992 87.0000000 96.4657377 - 752 22 1 1992 79.0000000 92.7541773 - 753 23 1 1992 71.0000000 89.6727048 - 754 24 1 1992 66.0000000 87.0709695 - 755 25 1 1992 67.0000000 84.8475794 - 756 26 1 1992 65.0000000 82.9238178 - 757 27 1 1992 59.0000000 81.2384494 - 758 28 1 1992 57.0000000 79.8472007 - 759 29 1 1992 54.0000000 79.2890268 - 760 30 1 1992 59.0000000 85.0588129 - 761 31 1 1992 57.0000000 97.5384637 - 762 1 2 1992 56.0000000 101.8240262 - 763 2 2 1992 54.0000000 99.6806521 - 764 3 2 1992 58.0000000 99.6334849 - 765 4 2 1992 63.0000000 188.9520618 - 766 5 2 1992 76.0000000 282.2769133 - 767 6 2 1992 250.0000000 307.8919695 - 768 7 2 1992 346.0000000 257.0236148 - 769 8 2 1992 241.0000000 220.4999475 - 770 9 2 1992 180.0000000 213.5068908 - 771 10 2 1992 164.0000000 209.8733934 - 772 11 2 1992 183.0000000 234.1017782 - 773 12 2 1992 215.0000000 250.2212729 - 774 13 2 1992 265.0000000 254.1627964 - 775 14 2 1992 287.0000000 256.4712805 - 776 15 2 1992 272.0000000 260.8408954 - 777 16 2 1992 253.0000000 286.6281419 - 778 17 2 1992 301.0000000 261.6815875 - 779 18 2 1992 275.0000000 223.9193905 - 780 19 2 1992 224.0000000 196.1093221 - 781 20 2 1992 194.0000000 174.3542174 - 782 21 2 1992 173.0000000 157.2697237 - 783 22 2 1992 157.0000000 144.3072141 - 784 23 2 1992 142.0000000 138.5452777 - 785 24 2 1992 133.0000000 139.8628204 - 786 25 2 1992 128.0000000 138.1272542 - 787 26 2 1992 125.0000000 128.2784410 - 788 27 2 1992 125.0000000 120.1104922 - 789 28 2 1992 110.0000000 113.4389763 - 790 29 2 1992 107.0000000 107.9534211 - 791 1 3 1992 97.0000000 103.5483496 - 792 2 3 1992 97.0000000 105.1036839 - 793 3 3 1992 86.0000000 111.1818619 - 794 4 3 1992 93.0000000 105.2379187 - 795 5 3 1992 86.0000000 100.8716439 - 796 6 3 1992 82.0000000 97.2217213 - 797 7 3 1992 80.0000000 94.0580074 - 798 8 3 1992 77.0000000 91.3683380 - 799 9 3 1992 73.0000000 89.0583346 - 800 10 3 1992 76.0000000 87.2196876 - 801 11 3 1992 68.0000000 85.6801238 - 802 12 3 1992 70.0000000 161.2442300 - 803 13 3 1992 116.0000000 263.7612006 - 804 14 3 1992 206.0000000 326.9973650 - 805 15 3 1992 433.0000000 397.2196744 - 806 16 3 1992 495.0000000 387.1692834 - 807 17 3 1992 331.0000000 312.5088604 - 808 18 3 1992 240.0000000 265.2343606 - 809 19 3 1992 215.0000000 229.3273670 - 810 20 3 1992 185.0000000 201.2020511 - 811 21 3 1992 185.0000000 192.5136494 - 812 22 3 1992 185.0000000 297.1948244 - 813 23 3 1992 213.0000000 396.7338008 - 814 24 3 1992 466.0000000 434.4017563 - 815 25 3 1992 580.0000000 421.9710439 - 816 26 3 1992 566.0000000 370.6098416 - 817 27 3 1992 487.0000000 326.2780925 - 818 28 3 1992 387.0000000 298.1962229 - 819 29 3 1992 311.0000000 266.0813025 - 820 30 3 1992 270.0000000 244.0678002 - 821 31 3 1992 246.0000000 249.7359098 - 822 1 4 1992 229.0000000 263.0775169 - 823 2 4 1992 222.0000000 257.0302944 - 824 3 4 1992 217.0000000 310.6492167 - 825 4 4 1992 208.0000000 364.2955891 - 826 5 4 1992 220.0000000 321.1404689 - 827 6 4 1992 210.0000000 277.8039464 - 828 7 4 1992 190.0000000 244.5792106 - 829 8 4 1992 173.0000000 218.2626993 - 830 9 4 1992 166.0000000 197.2585024 - 831 10 4 1992 133.0000000 180.4198287 - 832 11 4 1992 126.0000000 166.8556206 - 833 12 4 1992 124.0000000 155.8712215 - 834 13 4 1992 116.0000000 146.9427099 - 835 14 4 1992 112.0000000 153.6929839 - 836 15 4 1992 111.0000000 210.9786833 - 837 16 4 1992 137.0000000 213.9739529 - 838 17 4 1992 206.0000000 201.8921804 - 839 18 4 1992 176.0000000 193.1905695 - 840 19 4 1992 161.0000000 175.3518985 - 841 20 4 1992 161.0000000 162.1185037 - 842 21 4 1992 139.0000000 151.5330441 - 843 22 4 1992 139.0000000 143.0023452 - 844 23 4 1992 123.0000000 136.0563432 - 845 24 4 1992 119.0000000 130.3453317 - 846 25 4 1992 111.0000000 125.6060705 - 847 26 4 1992 94.0000000 121.7055551 - 848 27 4 1992 94.0000000 126.1191086 - 849 28 4 1992 102.0000000 137.6500036 - 850 29 4 1992 120.0000000 138.2568633 - 851 30 4 1992 120.0000000 131.8473197 - 852 1 5 1992 114.0000000 178.1322773 - 853 2 5 1992 115.0000000 196.2788281 - 854 3 5 1992 206.0000000 179.9251051 - 855 4 5 1992 215.0000000 164.4135005 - 856 5 5 1992 125.0000000 152.0014411 - 857 6 5 1992 123.0000000 141.9857771 - 858 7 5 1992 113.0000000 133.8505400 - 859 8 5 1992 77.0000000 127.1950597 - 860 9 5 1992 83.0000000 121.7427162 - 861 10 5 1992 83.0000000 125.8664152 - 862 11 5 1992 96.0000000 121.3767637 - 863 12 5 1992 120.0000000 112.5073887 - 864 13 5 1992 80.0000000 109.0627128 - 865 14 5 1992 76.0000000 106.3724236 - 866 15 5 1992 69.0000000 104.0335137 - 867 16 5 1992 63.0000000 101.9756402 - 868 17 5 1992 61.0000000 100.1432353 - 869 18 5 1992 60.0000000 98.4923158 - 870 19 5 1992 59.0000000 96.9880030 - 871 20 5 1992 67.0000000 95.6035553 - 872 21 5 1992 51.0000000 94.3176218 - 873 22 5 1992 44.0000000 93.1089253 - 874 23 5 1992 42.0000000 91.9642981 - 875 24 5 1992 51.0000000 91.1625196 - 876 25 5 1992 42.0000000 90.7026543 - 877 26 5 1992 54.0000000 102.5416137 - 878 27 5 1992 53.0000000 91.0750287 - 879 28 5 1992 59.0000000 88.0537077 - 880 29 5 1992 55.0000000 90.3996581 - 881 30 5 1992 54.0000000 90.9631373 - 882 31 5 1992 48.0000000 88.1361341 - 883 1 6 1992 63.0000000 92.1087564 - 884 2 6 1992 61.0000000 92.1010155 - 885 3 6 1992 55.0000000 95.2924681 - 886 4 6 1992 75.0000000 119.2057547 - 887 5 6 1992 53.0000000 129.3922963 - 888 6 6 1992 77.0000000 123.6078189 - 889 7 6 1992 114.0000000 125.2301080 - 890 8 6 1992 167.0000000 141.3541519 - 891 9 6 1992 116.0000000 120.9332252 - 892 10 6 1992 91.0000000 109.8630792 - 893 11 6 1992 85.0000000 103.3045770 - 894 12 6 1992 68.0000000 97.9427748 - 895 13 6 1992 71.0000000 93.5169193 - 896 14 6 1992 63.0000000 89.8355996 - 897 15 6 1992 59.0000000 86.7475084 - 898 16 6 1992 46.0000000 84.1327830 - 899 17 6 1992 44.0000000 81.8964065 - 900 18 6 1992 39.0000000 79.9629742 - 901 19 6 1992 41.0000000 78.2745111 - 902 20 6 1992 44.0000000 77.7043726 - 903 21 6 1992 39.0000000 75.8968397 - 904 22 6 1992 32.0000000 74.4327547 - 905 23 6 1992 40.0000000 75.3343009 - 906 24 6 1992 41.0000000 87.6106974 - 907 25 6 1992 42.0000000 82.4627292 - 908 26 6 1992 42.0000000 76.5116162 - 909 27 6 1992 48.0000000 74.4654673 - 910 28 6 1992 37.0000000 72.7360900 - 911 29 6 1992 40.0000000 71.2216012 - 912 30 6 1992 29.0000000 70.2304265 - 913 1 7 1992 30.0000000 70.3486790 - 914 2 7 1992 36.0000000 68.7633943 - 915 3 7 1992 29.0000000 78.2030728 - 916 4 7 1992 36.0000000 86.3058556 - 917 5 7 1992 50.0000000 96.3520913 - 918 6 7 1992 78.0000000 93.3514837 - 919 7 7 1992 54.0000000 76.5099130 - 920 8 7 1992 57.0000000 70.8798800 - 921 9 7 1992 51.0000000 69.4082912 - 922 10 7 1992 47.0000000 87.8617992 - 923 11 7 1992 46.0000000 109.5853015 - 924 12 7 1992 76.0000000 103.5744438 - 925 13 7 1992 72.0000000 91.8904736 - 926 14 7 1992 67.0000000 83.1355907 - 927 15 7 1992 63.0000000 78.2202377 - 928 16 7 1992 47.0000000 74.1834977 - 929 17 7 1992 47.0000000 70.8462692 - 930 18 7 1992 42.0000000 68.0666795 - 931 19 7 1992 41.0000000 65.7322256 - 932 20 7 1992 39.0000000 63.7536042 - 933 21 7 1992 37.0000000 65.1443396 - 934 22 7 1992 33.0000000 66.3120573 - 935 23 7 1992 33.0000000 63.1066247 - 936 24 7 1992 33.0000000 61.2603370 - 937 25 7 1992 37.0000000 59.6756158 - 938 26 7 1992 26.0000000 58.3009418 - 939 27 7 1992 24.0000000 57.0955301 - 940 28 7 1992 26.0000000 56.0264589 - 941 29 7 1992 29.0000000 55.0674608 - 942 30 7 1992 19.0000000 54.1975629 - 943 31 7 1992 22.0000000 55.0465745 - 944 1 8 1992 28.0000000 53.9724324 - 945 2 8 1992 35.0000000 52.0481991 - 946 3 8 1992 29.0000000 51.3882978 - 947 4 8 1992 36.0000000 50.7629173 - 948 5 8 1992 52.0000000 50.1661827 - 949 6 8 1992 74.0000000 49.5933799 - 950 7 8 1992 54.0000000 49.0407227 - 951 8 8 1992 57.0000000 48.5051667 - 952 9 8 1992 48.0000000 51.3077324 - 953 10 8 1992 47.0000000 49.2779257 - 954 11 8 1992 46.0000000 58.0165757 - 955 12 8 1992 75.0000000 54.0800546 - 956 13 8 1992 73.0000000 59.0284571 - 957 14 8 1992 66.0000000 58.7477500 - 958 15 8 1992 60.0000000 49.8064259 - 959 16 8 1992 47.0000000 45.9715603 - 960 17 8 1992 46.0000000 45.3186762 - 961 18 8 1992 42.0000000 44.7107013 - 962 19 8 1992 41.0000000 44.1577869 - 963 20 8 1992 40.0000000 55.1399801 - 964 21 8 1992 37.0000000 45.6815707 - 965 22 8 1992 32.0000000 43.5613937 - 966 23 8 1992 32.0000000 43.8331163 - 967 24 8 1992 32.0000000 42.0272198 - 968 25 8 1992 36.0000000 41.5242935 - 969 26 8 1992 27.0000000 41.0475815 - 970 27 8 1992 25.0000000 40.5879798 - 971 28 8 1992 25.0000000 40.8485226 - 972 29 8 1992 28.0000000 46.0483237 - 973 30 8 1992 20.0000000 54.5987943 - 974 31 8 1992 22.0000000 107.6656577 - 975 1 9 1992 49.0000000 65.1776730 - 976 2 9 1992 77.0000000 67.9030764 - 977 3 9 1992 67.0000000 59.7888793 - 978 4 9 1992 45.0000000 57.7816714 - 979 5 9 1992 44.0000000 49.8239142 - 980 6 9 1992 64.0000000 45.5872634 - 981 7 9 1992 52.0000000 43.7454321 - 982 8 9 1992 40.0000000 42.2019637 - 983 9 9 1992 30.0000000 40.8964255 - 984 10 9 1992 34.0000000 39.7810323 - 985 11 9 1992 32.0000000 39.0291259 - 986 12 9 1992 36.0000000 38.5193695 - 987 13 9 1992 28.0000000 37.6117061 - 988 14 9 1992 33.0000000 37.4468817 - 989 15 9 1992 35.0000000 37.5450449 - 990 16 9 1992 30.0000000 36.2917250 - 991 17 9 1992 32.0000000 35.6402179 - 992 18 9 1992 29.0000000 35.2224900 - 993 19 9 1992 30.0000000 35.1983888 - 994 20 9 1992 28.0000000 34.5029207 - 995 21 9 1992 29.0000000 33.9527239 - 996 22 9 1992 29.0000000 33.4491893 - 997 23 9 1992 27.0000000 32.9837127 - 998 24 9 1992 27.0000000 32.5480598 - 999 25 9 1992 23.0000000 32.1377312 - 1000 26 9 1992 28.0000000 31.7484109 - 1001 27 9 1992 25.0000000 31.3769315 - 1002 28 9 1992 25.0000000 33.1546911 - 1003 29 9 1992 27.0000000 33.2940014 - 1004 30 9 1992 25.0000000 31.3972935 - 1005 1 10 1992 27.0000000 31.2646601 - 1006 2 10 1992 33.0000000 35.4451782 - 1007 3 10 1992 29.0000000 34.1403449 - 1008 4 10 1992 31.0000000 33.6304470 - 1009 5 10 1992 25.0000000 42.8651111 - 1010 6 10 1992 25.0000000 47.9667125 - 1011 7 10 1992 36.0000000 33.8148460 - 1012 8 10 1992 42.0000000 30.4895340 - 1013 9 10 1992 43.0000000 34.8381276 - 1014 10 10 1992 26.0000000 39.9872845 - 1015 11 10 1992 27.0000000 35.3939725 - 1016 12 10 1992 27.0000000 32.4231315 - 1017 13 10 1992 26.0000000 31.2098570 - 1018 14 10 1992 26.0000000 30.2925891 - 1019 15 10 1992 23.0000000 47.6016673 - 1020 16 10 1992 21.0000000 39.7111100 - 1021 17 10 1992 26.0000000 42.1103098 - 1022 18 10 1992 34.0000000 40.3000922 - 1023 19 10 1992 37.0000000 37.6718252 - 1024 20 10 1992 31.0000000 44.7163496 - 1025 21 10 1992 31.0000000 41.9487065 - 1026 22 10 1992 35.0000000 40.9438346 - 1027 23 10 1992 33.0000000 81.0672451 - 1028 24 10 1992 40.0000000 148.2668996 - 1029 25 10 1992 74.0000000 196.5645205 - 1030 26 10 1992 161.0000000 158.1727329 - 1031 27 10 1992 285.0000000 186.4510233 - 1032 28 10 1992 244.0000000 198.3397463 - 1033 29 10 1992 263.0000000 193.0236516 - 1034 30 10 1992 276.0000000 152.4162806 - 1035 31 10 1992 186.0000000 127.7633617 - 1036 1 11 1992 154.0000000 109.1897107 - 1037 2 11 1992 112.0000000 124.4310199 - 1038 3 11 1992 104.0000000 125.7174135 - 1039 4 11 1992 96.0000000 112.2840509 - 1040 5 11 1992 99.0000000 95.8885442 - 1041 6 11 1992 126.0000000 84.0189680 - 1042 7 11 1992 91.0000000 74.9678780 - 1043 8 11 1992 84.0000000 69.4982458 - 1044 9 11 1992 81.0000000 74.3424997 - 1045 10 11 1992 85.0000000 141.1829657 - 1046 11 11 1992 126.0000000 246.1451694 - 1047 12 11 1992 279.0000000 272.9239492 - 1048 13 11 1992 390.0000000 262.8287074 - 1049 14 11 1992 294.0000000 272.3642407 - 1050 15 11 1992 260.0000000 405.9631008 - 1051 16 11 1992 398.0000000 508.2790077 - 1052 17 11 1992 520.0000000 426.8690899 - 1053 18 11 1992 487.0000000 413.2226198 - 1054 19 11 1992 380.0000000 396.3399822 - 1055 20 11 1992 385.0000000 327.0723029 - 1056 21 11 1992 351.0000000 408.9129548 - 1057 22 11 1992 309.0000000 435.2906141 - 1058 23 11 1992 587.0000000 340.1495600 - 1059 24 11 1992 661.0000000 290.7251624 - 1060 25 11 1992 447.0000000 320.2383999 - 1061 26 11 1992 361.0000000 326.7541099 - 1062 27 11 1992 351.0000000 320.2403085 - 1063 28 11 1992 353.0000000 375.6256841 - 1064 29 11 1992 369.0000000 458.9209040 - 1065 30 11 1992 452.0000000 410.1605923 - 1066 1 12 1992 441.0000000 332.1461768 - 1067 2 12 1992 348.0000000 393.6331930 - 1068 3 12 1992 394.0000000 402.8083700 - 1069 4 12 1992 455.0000000 481.2516067 - 1070 5 12 1992 491.0000000 477.7331846 - 1071 6 12 1992 469.0000000 422.3557553 - 1072 7 12 1992 364.0000000 405.4060530 - 1073 8 12 1992 338.0000000 354.0818587 - 1074 9 12 1992 334.0000000 305.4785665 - 1075 10 12 1992 268.0000000 263.5633717 - 1076 11 12 1992 236.0000000 274.5132204 - 1077 12 12 1992 230.0000000 267.5013524 - 1078 13 12 1992 239.0000000 237.8486514 - 1079 14 12 1992 256.0000000 210.9936295 - 1080 15 12 1992 217.0000000 197.3241803 - 1081 16 12 1992 201.0000000 193.0791326 - 1082 17 12 1992 188.0000000 190.8504707 - 1083 18 12 1992 176.0000000 186.4355163 - 1084 19 12 1992 170.0000000 175.3437553 - 1085 20 12 1992 168.0000000 171.1890631 - 1086 21 12 1992 131.0000000 185.1403043 - 1087 22 12 1992 133.0000000 185.6565782 - 1088 23 12 1992 134.0000000 168.8591129 - 1089 24 12 1992 127.0000000 156.4528619 - 1090 25 12 1992 117.0000000 146.6365682 - 1091 26 12 1992 113.0000000 138.6559123 - 1092 27 12 1992 100.0000000 132.1159511 - 1093 28 12 1992 94.0000000 126.7103869 - 1094 29 12 1992 87.0000000 122.2007357 - 1095 30 12 1992 86.0000000 118.4006728 - 1096 31 12 1992 81.0000000 115.1641811 - 1097 1 1 1993 77.0000000 112.3765199 - 1098 2 1 1993 76.0000000 109.9473045 - 1099 3 1 1993 61.0000000 107.8051776 - 1100 4 1 1993 61.0000000 105.8936884 - 1101 5 1 1993 57.0000000 104.1680946 - 1102 6 1 1993 66.0000000 130.4457888 - 1103 7 1 1993 67.0000000 160.0657637 - 1104 8 1 1993 84.0000000 173.4361639 - 1105 9 1 1993 90.0000000 186.0817252 - 1106 10 1 1993 113.0000000 229.8487924 - 1107 11 1 1993 265.0000000 475.3613964 - 1108 12 1 1993 559.0000000 616.9621746 - 1109 13 1 1993 832.0000000 571.2799431 - 1110 14 1 1993 601.0000000 460.2869377 - 1111 15 1 1993 436.0000000 365.9925486 - 1112 16 1 1993 339.0000000 304.0336412 - 1113 17 1 1993 292.0000000 265.5250501 - 1114 18 1 1993 247.0000000 237.3042216 - 1115 19 1 1993 218.0000000 212.7498098 - 1116 20 1 1993 205.0000000 192.2414720 - 1117 21 1 1993 190.0000000 179.7184045 - 1118 22 1 1993 176.0000000 171.9970728 - 1119 23 1 1993 173.0000000 167.8890824 - 1120 24 1 1993 173.0000000 294.6159261 - 1121 25 1 1993 199.0000000 375.9231008 - 1122 26 1 1993 361.0000000 326.3862864 - 1123 27 1 1993 295.0000000 339.2623659 - 1124 28 1 1993 238.0000000 347.4125044 - 1125 29 1 1993 263.0000000 319.5926784 - 1126 30 1 1993 245.0000000 278.7039447 - 1127 31 1 1993 222.0000000 246.2348132 - 1128 1 2 1993 199.0000000 220.8942621 - 1129 2 2 1993 186.0000000 200.8136247 - 1130 3 2 1993 171.0000000 184.8003226 - 1131 4 2 1993 157.0000000 171.9467406 - 1132 5 2 1993 159.0000000 161.5577594 - 1133 6 2 1993 129.0000000 153.0981280 - 1134 7 2 1993 119.0000000 146.2744313 - 1135 8 2 1993 119.0000000 140.5080441 - 1136 9 2 1993 105.0000000 135.6814812 - 1137 10 2 1993 106.0000000 131.6060519 - 1138 11 2 1993 105.0000000 128.1271066 - 1139 12 2 1993 95.0000000 125.1231180 - 1140 13 2 1993 91.0000000 122.4983672 - 1141 14 2 1993 88.0000000 120.1773038 - 1142 15 2 1993 84.0000000 118.1001801 - 1143 16 2 1993 83.0000000 116.4641109 - 1144 17 2 1993 79.0000000 117.1992481 - 1145 18 2 1993 78.0000000 118.8619925 - 1146 19 2 1993 84.0000000 121.9080725 - 1147 20 2 1993 91.0000000 144.1966873 - 1148 21 2 1993 91.0000000 152.2893902 - 1149 22 2 1993 90.0000000 147.7931749 - 1150 23 2 1993 103.0000000 138.2439290 - 1151 24 2 1993 94.0000000 131.3355553 - 1152 25 2 1993 81.0000000 125.7085215 - 1153 26 2 1993 78.0000000 121.2991397 - 1154 27 2 1993 75.0000000 124.1153903 - 1155 28 2 1993 76.0000000 122.5828343 - 1156 1 3 1993 80.0000000 118.6625720 - 1157 2 3 1993 75.0000000 117.1947592 - 1158 3 3 1993 76.0000000 117.1926640 - 1159 4 3 1993 72.0000000 113.3850135 - 1160 5 3 1993 65.0000000 110.1905806 - 1161 6 3 1993 64.0000000 107.7997394 - 1162 7 3 1993 64.0000000 108.9855811 - 1163 8 3 1993 68.0000000 111.6620865 - 1164 9 3 1993 68.0000000 110.9729443 - 1165 10 3 1993 67.0000000 116.1458969 - 1166 11 3 1993 61.0000000 126.1316795 - 1167 12 3 1993 57.0000000 132.2636634 - 1168 13 3 1993 58.0000000 126.5180835 - 1169 14 3 1993 54.0000000 119.3584916 - 1170 15 3 1993 66.0000000 113.5414688 - 1171 16 3 1993 54.0000000 108.7214050 - 1172 17 3 1993 57.0000000 104.8835234 - 1173 18 3 1993 57.0000000 101.6380063 - 1174 19 3 1993 52.0000000 98.6895380 - 1175 20 3 1993 57.0000000 96.1599912 - 1176 21 3 1993 58.0000000 95.8970541 - 1177 22 3 1993 57.0000000 124.0022253 - 1178 23 3 1993 56.0000000 135.5055583 - 1179 24 3 1993 63.0000000 123.2313228 - 1180 25 3 1993 76.0000000 115.5442836 - 1181 26 3 1993 56.0000000 109.2549372 - 1182 27 3 1993 59.0000000 104.0755448 - 1183 28 3 1993 59.0000000 99.7788719 - 1184 29 3 1993 54.0000000 96.1852312 - 1185 30 3 1993 48.0000000 93.1523605 - 1186 31 3 1993 55.0000000 90.5674989 - 1187 1 4 1993 48.0000000 95.4958526 - 1188 2 4 1993 53.0000000 109.5173357 - 1189 3 4 1993 47.0000000 109.1433615 - 1190 4 4 1993 59.0000000 111.0263432 - 1191 5 4 1993 53.0000000 139.3833190 - 1192 6 4 1993 64.0000000 136.8937834 - 1193 7 4 1993 63.0000000 123.3934262 - 1194 8 4 1993 75.0000000 114.7145346 - 1195 9 4 1993 64.0000000 107.5139535 - 1196 10 4 1993 59.0000000 109.8115799 - 1197 11 4 1993 60.0000000 118.7693343 - 1198 12 4 1993 63.0000000 115.3890133 - 1199 13 4 1993 69.0000000 113.1487266 - 1200 14 4 1993 79.0000000 107.9414325 - 1201 15 4 1993 82.0000000 101.9462222 - 1202 16 4 1993 68.0000000 97.1124831 - 1203 17 4 1993 56.0000000 92.9153226 - 1204 18 4 1993 59.0000000 90.3409134 - 1205 19 4 1993 61.0000000 87.0738196 - 1206 20 4 1993 62.0000000 84.1919719 - 1207 21 4 1993 57.0000000 81.7457802 - 1208 22 4 1993 53.0000000 79.6507670 - 1209 23 4 1993 47.0000000 77.8323690 - 1210 24 4 1993 46.0000000 76.2359955 - 1211 25 4 1993 47.0000000 74.8195646 - 1212 26 4 1993 45.0000000 73.5482095 - 1213 27 4 1993 43.0000000 72.3941604 - 1214 28 4 1993 41.0000000 71.3434069 - 1215 29 4 1993 38.0000000 70.4038084 - 1216 30 4 1993 39.0000000 69.7387263 - 1217 1 5 1993 40.0000000 69.4271523 - 1218 2 5 1993 41.0000000 71.7341433 - 1219 3 5 1993 45.0000000 71.1570021 - 1220 4 5 1993 49.0000000 69.6203843 - 1221 5 5 1993 40.0000000 68.2670740 - 1222 6 5 1993 43.0000000 67.0823939 - 1223 7 5 1993 38.0000000 66.0403100 - 1224 8 5 1993 38.0000000 65.3475449 - 1225 9 5 1993 43.0000000 65.1521156 - 1226 10 5 1993 44.0000000 65.5648016 - 1227 11 5 1993 41.0000000 65.3810988 - 1228 12 5 1993 51.0000000 78.7035690 - 1229 13 5 1993 63.0000000 114.7541159 - 1230 14 5 1993 68.0000000 78.2986827 - 1231 15 5 1993 77.0000000 70.5920101 - 1232 16 5 1993 77.0000000 68.0079689 - 1233 17 5 1993 59.0000000 65.8241168 - 1234 18 5 1993 49.0000000 63.9772723 - 1235 19 5 1993 43.0000000 64.9951399 - 1236 20 5 1993 44.0000000 77.1579294 - 1237 21 5 1993 48.0000000 76.0274558 - 1238 22 5 1993 44.0000000 70.2747200 - 1239 23 5 1993 46.0000000 67.1597047 - 1240 24 5 1993 40.0000000 64.5629002 - 1241 25 5 1993 43.0000000 62.3797463 - 1242 26 5 1993 30.0000000 60.6321524 - 1243 27 5 1993 45.0000000 73.0276389 - 1244 28 5 1993 43.0000000 76.1875040 - 1245 29 5 1993 44.0000000 68.3966947 - 1246 30 5 1993 54.0000000 66.5131200 - 1247 31 5 1993 56.0000000 64.1898804 - 1248 1 6 1993 44.0000000 60.0174534 - 1249 2 6 1993 43.0000000 59.9298170 - 1250 3 6 1993 33.0000000 64.1014660 - 1251 4 6 1993 45.0000000 61.4662890 - 1252 5 6 1993 46.0000000 58.8216521 - 1253 6 6 1993 42.0000000 56.8436651 - 1254 7 6 1993 40.0000000 55.1642246 - 1255 8 6 1993 30.0000000 53.7240155 - 1256 9 6 1993 31.0000000 52.5625570 - 1257 10 6 1993 32.0000000 52.0447651 - 1258 11 6 1993 25.0000000 52.9934948 - 1259 12 6 1993 33.0000000 54.5486362 - 1260 13 6 1993 29.0000000 52.1304743 - 1261 14 6 1993 40.0000000 51.6009138 - 1262 15 6 1993 42.0000000 52.6257972 - 1263 16 6 1993 37.0000000 54.3938995 - 1264 17 6 1993 46.0000000 53.3457393 - 1265 18 6 1993 47.0000000 51.2407051 - 1266 19 6 1993 50.0000000 56.1191613 - 1267 20 6 1993 43.0000000 89.0609984 - 1268 21 6 1993 69.0000000 68.5210730 - 1269 22 6 1993 61.0000000 95.1092739 - 1270 23 6 1993 67.0000000 99.6399821 - 1271 24 6 1993 77.0000000 84.0616265 - 1272 25 6 1993 87.0000000 76.0912098 - 1273 26 6 1993 55.0000000 69.5852966 - 1274 27 6 1993 43.0000000 64.3173026 - 1275 28 6 1993 40.0000000 60.0328019 - 1276 29 6 1993 30.0000000 56.5304989 - 1277 30 6 1993 40.0000000 53.6509703 - 1278 1 7 1993 40.0000000 53.5658045 - 1279 2 7 1993 27.0000000 50.7738334 - 1280 3 7 1993 34.0000000 48.0370391 - 1281 4 7 1993 30.0000000 46.5530645 - 1282 5 7 1993 31.0000000 45.3493820 - 1283 6 7 1993 27.0000000 44.1941980 - 1284 7 7 1993 31.0000000 43.2400794 - 1285 8 7 1993 26.0000000 42.3980401 - 1286 9 7 1993 23.0000000 43.6337792 - 1287 10 7 1993 24.0000000 45.9052242 - 1288 11 7 1993 25.0000000 54.3105196 - 1289 12 7 1993 34.0000000 64.4600254 - 1290 13 7 1993 40.0000000 62.4970454 - 1291 14 7 1993 41.0000000 88.2856702 - 1292 15 7 1993 46.0000000 68.9635477 - 1293 16 7 1993 39.0000000 57.7371266 - 1294 17 7 1993 43.0000000 54.4497142 - 1295 18 7 1993 35.0000000 52.5275916 - 1296 19 7 1993 49.0000000 69.9233644 - 1297 20 7 1993 38.0000000 64.1958774 - 1298 21 7 1993 41.0000000 60.8108298 - 1299 22 7 1993 45.0000000 55.0658442 - 1300 23 7 1993 41.0000000 49.9273050 - 1301 24 7 1993 42.0000000 47.1484804 - 1302 25 7 1993 40.0000000 44.8664964 - 1303 26 7 1993 35.0000000 42.9632936 - 1304 27 7 1993 40.0000000 61.1962379 - 1305 28 7 1993 40.0000000 47.6081005 - 1306 29 7 1993 36.0000000 40.2988941 - 1307 30 7 1993 40.0000000 110.7848188 - 1308 31 7 1993 61.0000000 63.6617248 - 1309 1 8 1993 36.0000000 48.6444626 - 1310 2 8 1993 46.0000000 45.8319193 - 1311 3 8 1993 32.0000000 43.5210777 - 1312 4 8 1993 38.0000000 41.6088787 - 1313 5 8 1993 32.0000000 40.0156738 - 1314 6 8 1993 25.0000000 38.6752207 - 1315 7 8 1993 26.0000000 37.5353057 - 1316 8 8 1993 29.0000000 36.5573887 - 1317 9 8 1993 29.0000000 44.1722176 - 1318 10 8 1993 28.0000000 45.0447966 - 1319 11 8 1993 37.0000000 40.8152672 - 1320 12 8 1993 40.0000000 38.3717211 - 1321 13 8 1993 49.0000000 36.9882003 - 1322 14 8 1993 32.0000000 37.7890551 - 1323 15 8 1993 37.0000000 36.5907573 - 1324 16 8 1993 37.0000000 34.3765003 - 1325 17 8 1993 27.0000000 33.5578399 - 1326 18 8 1993 24.0000000 32.8417733 - 1327 19 8 1993 24.0000000 32.2084150 - 1328 20 8 1993 22.0000000 31.6418834 - 1329 21 8 1993 21.0000000 31.1294839 - 1330 22 8 1993 16.0000000 34.2851497 - 1331 23 8 1993 21.0000000 36.2458936 - 1332 24 8 1993 27.0000000 33.2007503 - 1333 25 8 1993 26.0000000 32.1580705 - 1334 26 8 1993 23.0000000 31.2959199 - 1335 27 8 1993 21.0000000 35.6072103 - 1336 28 8 1993 28.0000000 34.4534225 - 1337 29 8 1993 17.0000000 31.7359750 - 1338 30 8 1993 24.0000000 30.7721739 - 1339 31 8 1993 25.0000000 29.9471405 - 1340 1 9 1993 25.0000000 29.2335543 - 1341 2 9 1993 19.0000000 28.6096168 - 1342 3 9 1993 17.0000000 34.0493988 - 1343 4 9 1993 16.0000000 36.1067325 - 1344 5 9 1993 19.0000000 31.0793068 - 1345 6 9 1993 23.0000000 29.7379782 - 1346 7 9 1993 25.0000000 52.8874894 - 1347 8 9 1993 34.0000000 38.8169852 - 1348 9 9 1993 31.0000000 60.1923645 - 1349 10 9 1993 35.0000000 83.6744256 - 1350 11 9 1993 53.0000000 119.9281996 - 1351 12 9 1993 71.0000000 93.7914763 - 1352 13 9 1993 74.0000000 141.2086407 - 1353 14 9 1993 87.0000000 134.9570754 - 1354 15 9 1993 173.0000000 123.8826155 - 1355 16 9 1993 117.0000000 88.2244513 - 1356 17 9 1993 93.0000000 74.0385241 - 1357 18 9 1993 77.0000000 65.0520092 - 1358 19 9 1993 62.0000000 57.8908239 - 1359 20 9 1993 54.0000000 52.1638387 - 1360 21 9 1993 48.0000000 48.3308852 - 1361 22 9 1993 46.0000000 74.1185672 - 1362 23 9 1993 55.0000000 69.1145073 - 1363 24 9 1993 66.0000000 71.4500172 - 1364 25 9 1993 64.0000000 64.5884133 - 1365 26 9 1993 52.0000000 54.5371643 - 1366 27 9 1993 68.0000000 53.9633224 - 1367 28 9 1993 69.0000000 67.6391491 - 1368 29 9 1993 62.0000000 66.0681869 - 1369 30 9 1993 76.0000000 63.3574566 - 1370 1 10 1993 72.0000000 95.8365713 - 1371 2 10 1993 68.0000000 98.0833384 - 1372 3 10 1993 72.0000000 98.4856624 - 1373 4 10 1993 78.0000000 99.6261443 - 1374 5 10 1993 116.0000000 184.2606539 - 1375 6 10 1993 131.0000000 153.4605171 - 1376 7 10 1993 180.0000000 135.1294184 - 1377 8 10 1993 203.0000000 151.7116057 - 1378 9 10 1993 164.0000000 156.1624415 - 1379 10 10 1993 178.0000000 195.2749429 - 1380 11 10 1993 161.0000000 202.7520476 - 1381 12 10 1993 287.0000000 220.9041598 - 1382 13 10 1993 360.0000000 276.7088712 - 1383 14 10 1993 374.0000000 250.5386053 - 1384 15 10 1993 297.0000000 214.0514324 - 1385 16 10 1993 247.0000000 229.7825217 - 1386 17 10 1993 273.0000000 224.8099802 - 1387 18 10 1993 261.0000000 198.6665755 - 1388 19 10 1993 265.0000000 171.8607958 - 1389 20 10 1993 230.0000000 147.0383800 - 1390 21 10 1993 199.0000000 130.0521736 - 1391 22 10 1993 173.0000000 131.6530282 - 1392 23 10 1993 182.0000000 161.9409025 - 1393 24 10 1993 203.0000000 156.6878185 - 1394 25 10 1993 213.0000000 134.4039756 - 1395 26 10 1993 180.0000000 118.4743699 - 1396 27 10 1993 154.0000000 105.8589333 - 1397 28 10 1993 118.0000000 95.8002616 - 1398 29 10 1993 112.0000000 87.7399461 - 1399 30 10 1993 98.0000000 81.2466158 - 1400 31 10 1993 97.0000000 75.9855887 - 1401 1 11 1993 91.0000000 71.6962228 - 1402 2 11 1993 85.0000000 68.1748706 - 1403 3 11 1993 75.0000000 65.2619560 - 1404 4 11 1993 76.0000000 62.8321156 - 1405 5 11 1993 78.0000000 60.7866365 - 1406 6 11 1993 72.0000000 59.0889538 - 1407 7 11 1993 76.0000000 58.8163000 - 1408 8 11 1993 69.0000000 58.0797211 - 1409 9 11 1993 66.0000000 58.5556572 - 1410 10 11 1993 71.0000000 61.3512498 - 1411 11 11 1993 64.0000000 91.1221416 - 1412 12 11 1993 67.0000000 111.1713614 - 1413 13 11 1993 80.0000000 106.8121127 - 1414 14 11 1993 78.0000000 139.9395026 - 1415 15 11 1993 80.0000000 141.7700633 - 1416 16 11 1993 86.0000000 136.9574401 - 1417 17 11 1993 125.0000000 119.5278251 - 1418 18 11 1993 96.0000000 106.3586308 - 1419 19 11 1993 82.0000000 95.8212880 - 1420 20 11 1993 77.0000000 87.3616634 - 1421 21 11 1993 67.0000000 80.5394941 - 1422 22 11 1993 71.0000000 75.0107372 - 1423 23 11 1993 61.0000000 70.5055977 - 1424 24 11 1993 42.0000000 66.8154729 - 1425 25 11 1993 63.0000000 65.7320005 - 1426 26 11 1993 57.0000000 65.7802884 - 1427 27 11 1993 58.0000000 62.7063593 - 1428 28 11 1993 49.0000000 60.2605775 - 1429 29 11 1993 50.0000000 58.2067643 - 1430 30 11 1993 55.0000000 56.4660234 - 1431 1 12 1993 54.0000000 54.9757357 - 1432 2 12 1993 54.0000000 62.4166813 - 1433 3 12 1993 50.0000000 62.1363947 - 1434 4 12 1993 51.0000000 68.7198975 - 1435 5 12 1993 62.0000000 64.7340671 - 1436 6 12 1993 62.0000000 61.1482964 - 1437 7 12 1993 71.0000000 110.8490884 - 1438 8 12 1993 79.0000000 218.7260092 - 1439 9 12 1993 153.0000000 226.7800715 - 1440 10 12 1993 291.0000000 321.7747999 - 1441 11 12 1993 332.0000000 361.5101032 - 1442 12 12 1993 465.0000000 386.7545605 - 1443 13 12 1993 518.0000000 441.0243190 - 1444 14 12 1993 539.0000000 438.1575744 - 1445 15 12 1993 559.0000000 456.0064553 - 1446 16 12 1993 500.0000000 511.5710191 - 1447 17 12 1993 526.0000000 531.0995784 - 1448 18 12 1993 583.0000000 487.4962623 - 1449 19 12 1993 677.0000000 612.8570038 - 1450 20 12 1993 781.0000000 966.0857047 - 1451 21 12 1993 1180.0000000 1027.6523383 - 1452 22 12 1993 1460.0000000 1005.8049299 - 1453 23 12 1993 1600.0000000 1082.5104180 - 1454 24 12 1993 1410.0000000 1051.0664322 - 1455 25 12 1993 1230.0000000 804.7833952 - 1456 26 12 1993 1070.0000000 598.8840298 - 1457 27 12 1993 746.0000000 470.5078713 - 1458 28 12 1993 542.0000000 400.6565033 - 1459 29 12 1993 492.0000000 412.7903306 - 1460 30 12 1993 491.0000000 514.3855776 - 1461 31 12 1993 617.0000000 888.3415562 diff --git a/check/case_01/simulation_mhm_case01.ini b/check/case_01/simulation_mhm_case01.ini new file mode 100644 index 00000000..8143c391 --- /dev/null +++ b/check/case_01/simulation_mhm_case01.ini @@ -0,0 +1,18 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_01 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig_mhm_mrm__read_restart = True +nml__directories_mhm__time_step_model_inputs = [0] +nml__processselection__processcase(5) = 1 diff --git a/check/case_02/mhm.nml b/check/case_02/mhm.nml index e0b576e4..f0ed7af4 100644 --- a/check/case_02/mhm.nml +++ b/check/case_02/mhm.nml @@ -1,580 +1,141 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ - -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = -2 / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/" -!> directory where output should be written -dir_Out(1) = "output_b1/" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b2/" -!> directory where output should be written -dir_Out(2) = "output_b2/" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -&directories_mHM -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 2 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = -2 -time_step_model_inputs(2) = -2 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. +/ -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 +/ -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soil moisture -!> 1 - Feddes equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like -!> 2 - Jarvis equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like -!> 3 - Jarvis equation for ET reduction and FC dependency on root fraction coefficient -processCase(3) = 2 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 2 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 0 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -! -!> basin 3 -!> number of gauges for subbasin (2) -NoGauges_basin(3) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(3,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(3,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 2, 1, 2, 1, 1, 0, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_02/mhm_outputs.nml b/check/case_02/mhm_outputs.nml index 060a3373..47bf26d9 100644 --- a/check/case_02/mhm_outputs.nml +++ b/check/case_02/mhm_outputs.nml @@ -14,7 +14,7 @@ ! -1: daily ! -2: monthly ! -3: yearly -timeStep_model_outputs = -2 +timeStep_model_outputs = 0 ! !---------------- ! 1. states diff --git a/check/case_02/output_save/ConfigFile.log b/check/case_02/output_save/ConfigFile.log index 2797fa73..dfbfc7a7 100644 --- a/check/case_02/output_save/ConfigFile.log +++ b/check/case_02/output_save/ConfigFile.log @@ -1,18 +1,17 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.7 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N -Number of basins 2 -Total No. of nodes 0 -Total No. of reaches -1 -No. of cells L0 46545 -No. of cells L1 68 +Number of basins 1 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 Basin 1 Hydrology Resolution [m] 24000. -Basin 2 Hydrology Resolution [m] 24000. Flag READ restart F Flag WRITE restart T @@ -21,42 +20,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - -------------------------------------------------------------- - Model Run Periods for Basin 2 -------------------------------------------------------------- - From To - Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- - Land Cover Observations for Basin 3 + Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc - --------------------------------------------------- - Land Cover Observations for Basin 6 --------------------------------------------------- - Year Land cover scene Land Cover File - - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -123,17 +95,6 @@ Directory to land cover input ../../test_basin/input/luse/ Directory to precipitation input ../../test_basin/input/meteo/pre/ Directory to temperature input ../../test_basin/input/meteo/tavg/ Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/ -Directory to write output when restarted output_b1/ - --------------------------------------------------------------------------------- - Directory list --------------------------------------------------------------------------------- -Directory to morphological input ../../test_basin/input/morph/ -Directory to land cover input ../../test_basin/input/luse/ -Directory to precipitation input ../../test_basin/input/meteo/pre/ -Directory to temperature input ../../test_basin/input/meteo/tavg/ -Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b2/ -Directory to write output when restarted output_b2/ - +Directory to write output by default output_b1/b1_ +Directory to write output when restarted output_b1/b1_ + diff --git a/check/case_02/simulation_mhm_case02.ini b/check/case_02/simulation_mhm_case02.ini new file mode 100644 index 00000000..4636e03e --- /dev/null +++ b/check/case_02/simulation_mhm_case02.ini @@ -0,0 +1,20 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_02 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__directories_mhm__time_step_model_inputs = -2 +nml__processselection__processcase(3) = 2 +nml__processselection__processcase(5) = 2 +nml__processselection__processcase(8) = 0 + diff --git a/check/case_03/mhm.nml b/check/case_03/mhm.nml index 675041e7..41cc20fd 100644 --- a/check/case_03/mhm.nml +++ b/check/case_03/mhm.nml @@ -1,582 +1,141 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ -! -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -&directories_general -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/" -!> directory where output should be written -dir_Out(1) = "output_b1/" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b2/" -!> directory where output should be written -dir_Out(2) = "output_b2/" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_mHM -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -! -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 2 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .true. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 540 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1991 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. +/ -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 3 + opti_method = 1 + optimize = .true. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 +/ -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 3 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 6 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -! -!> basin 3 -!> number of gauges for subbasin (2) -NoGauges_basin(3) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(3,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(3,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 1, 1, 3, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 6 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_03/output_save/ConfigFile.log b/check/case_03/output_save/ConfigFile.log index b92d55bd..8be13bc2 100644 --- a/check/case_03/output_save/ConfigFile.log +++ b/check/case_03/output_save/ConfigFile.log @@ -1,22 +1,23 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N -Number of basins 2 -Total No. of nodes 68 -Total No. of reaches 67 -No. of cells L0 46545 -No. of cells L1 68 -No. of cells L11 68 -Total No. of gauges 2 +Number of basins 1 +Total No. of gauges 1 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 1 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. -Basin 2 Hydrology Resolution [m] 24000. -Basin 2 Routing Resolution [m] 24000. Flag READ restart F Flag WRITE restart T @@ -25,42 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - -------------------------------------------------------------- - Model Run Periods for Basin 2 -------------------------------------------------------------- - From To - Day Month Year Day Month Year -Warming Period (1) 10 7 1989 31 12 1990 -Evaluation Period (2) 1 1 1991 31 12 1993 -Simulation Period (1)+(2) 10 7 1989 31 12 1993 - - --------------------------------------------------- - Land Cover Observations for Basin 3 --------------------------------------------------- - Year Land cover scene Land Cover File - - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 2 lc_1990.asc - 1990 2 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -128,8 +102,7 @@ Simulation Period (1)+(2) 10 7 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 - 2 2 1600.000 11.000 + 1 1 932.000 16.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -144,8 +117,8 @@ Directory to gauging station input ../../test_basin/input/gauge/ Directory to precipitation input ../../test_basin/input/meteo/pre/ Directory to temperature input ../../test_basin/input/meteo/tavg/ Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/ -Directory to write output when restarted output_b1/ +Directory to write output by default output_b1/b1_ +Directory to write output when restarted output_b1/b1_ ------------------------------ River Network (Routing level) @@ -198,40 +171,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -275,145 +248,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - --------------------------------------------------------------------------------- - Directory list --------------------------------------------------------------------------------- -Directory to morphological input ../../test_basin/input/morph/ -Directory to land cover input ../../test_basin/input/luse/ -Directory to gauging station input ../../test_basin/input/gauge/ -Directory to precipitation input ../../test_basin/input/meteo/pre/ -Directory to temperature input ../../test_basin/input/meteo/tavg/ -Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b2/ -Directory to write output when restarted output_b2/ - ------------------------------- -River Network (Routing level) ------------------------------- - Label 0 = intermediate draining cell - Label 1 = headwater cell - Label 2 = sink cell - ---------------------------------------------------------------------------- - Overall From To Routing Label Length Mean - Link Routing Routing Sequence Slope - Id Node Node [km] [o/oo] ---------------------------------------------------------------------------- - 35 1 5 1 1 7.536 0.100 - 40 7 3 2 1 28.349 0.100 - 43 10 9 3 1 9.243 1.190 - 44 11 8 4 1 40.042 0.999 - 48 15 14 5 1 27.728 0.938 - 53 20 19 6 1 28.435 1.653 - 54 21 16 7 1 21.728 4.786 - 58 25 24 8 1 32.127 4.171 - 63 30 26 9 1 28.642 3.840 - 66 33 29 10 1 27.142 13.116 - 67 34 32 11 1 31.763 2.613 - 36 3 4 12 0 29.642 0.100 - 41 8 4 13 0 1.414 0.100 - 47 14 13 14 0 38.213 0.576 - 49 16 17 15 0 9.985 0.100 - 52 19 18 16 0 33.799 1.036 - 59 26 22 17 0 61.734 0.794 - 62 29 28 18 0 6.243 3.204 - 65 32 31 19 0 16.399 1.342 - 37 4 5 20 0 38.420 0.833 - 46 13 12 21 0 42.127 0.166 - 51 18 17 22 0 42.542 0.282 - 61 28 24 23 0 32.835 1.980 - 64 31 27 24 0 32.728 2.781 - 57 24 23 25 0 34.420 1.133 - 60 27 23 26 0 29.799 1.141 - 56 23 22 27 0 0.707 0.100 - 55 22 17 28 0 38.456 0.364 - 50 17 12 29 0 35.885 1.728 - 45 12 9 30 0 30.263 0.100 - 42 9 5 31 0 24.399 0.100 - 38 5 6 32 0 5.036 0.100 - 39 6 2 33 2 14.692 0.100 - --------------------- - Overall Basin - Cell Routing - Id Node Id --------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 - ------------------------------- - Modeling Routing Effective - Cell Cell Id Area - Id [-] [km2] ------------------------------- - 35 1 126.750 - 36 2 229.750 - 37 3 107.750 - 38 4 312.500 - 39 5 573.750 - 40 6 314.250 - 41 7 42.500 - 42 8 524.750 - 43 9 576.000 - 44 10 146.500 - 45 11 470.000 - 46 12 576.000 - 47 13 414.500 - 48 14 340.750 - 49 15 9.000 - 50 16 230.250 - 51 17 576.000 - 52 18 576.000 - 53 19 527.250 - 54 20 48.250 - 55 21 10.500 - 56 22 545.000 - 57 23 576.000 - 58 24 576.000 - 59 25 318.500 - 60 26 456.250 - 61 27 551.250 - 62 28 576.000 - 63 29 337.000 - 64 30 3.250 - 65 31 198.000 - 66 32 555.250 - 67 33 89.000 - 68 34 121.750 ------------------------------- - Total[km2] 11636.250 - - + diff --git a/check/case_03/output_save/FinalParam.nml b/check/case_03/output_save/FinalParam.nml index a6a22382..d7267c33 100644 --- a/check/case_03/output_save/FinalParam.nml +++ b/check/case_03/output_save/FinalParam.nml @@ -1,96 +1,154 @@ !global_parameters - !PARAMETER lower_bound upper_bound value FLAG SCALING + !PARAMETER lower_bound upper_bound value FLAG + SCALING ! interception &interception1 - canopyInterceptionFactor = 0.14999999999999999 , 0.40000000000000002 , 0.19015917322116774 , 1 , 1 + canopyInterceptionFactor = 0.150000000000000 , 0.400000000000000 + , 0.206292417175140 , 1 , 1 / ! snow &snow1 - snowTreshholdTemperature = -2.0000000000000000 , 2.0000000000000000 , 1.7631852672525632 , 1 , 1 - degreeDayFactor_forest = 1.0000000000000000E-004 , 4.0000000000000000 , 1.5000000000000000 , 1 , 1 - degreeDayFactor_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.50000000000000000 , 1 , 1 - degreeDayFactor_pervious = 0.0000000000000000 , 2.0000000000000000 , 0.50000000000000000 , 1 , 1 - increaseDegreeDayFactorByPrecip = 0.10000000000000001 , 0.90000000000000002 , 0.43597941036007914 , 1 , 1 - maxDegreeDayFactor_forest = 0.0000000000000000 , 8.0000000000000000 , 2.5026204073144349 , 1 , 1 - maxDegreeDayFactor_impervious = 0.0000000000000000 , 8.0000000000000000 , 3.5000000000000000 , 1 , 1 - maxDegreeDayFactor_pervious = 0.0000000000000000 , 8.0000000000000000 , 4.0000000000000000 , 1 , 1 + snowTreshholdTemperature = -2.00000000000000 , 2.00000000000000 + , 1.11413798514203 , 1 , 1 + degreeDayFactor_forest = 1.000000000000000E-004 , 4.00000000000000 + , 2.12340562437516 , 1 , 1 + degreeDayFactor_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 0.358416663643768 , 1 , 1 + degreeDayFactor_pervious = 0.000000000000000E+000 , 2.00000000000000 + , 0.744023834479764 , 1 , 1 + increaseDegreeDayFactorByPrecip = 0.100000000000000 , + 0.900000000000000 , 0.443954961941640 , 1 , 1 + maxDegreeDayFactor_forest = 0.000000000000000E+000 , + 8.00000000000000 , 3.07504025961314 , 1 , 1 + maxDegreeDayFactor_impervious = 0.000000000000000E+000 , + 8.00000000000000 , 3.19534639391650 , 1 , 1 + maxDegreeDayFactor_pervious = 0.000000000000000E+000 , + 8.00000000000000 , 5.65569750791907 , 1 , 1 / ! soilmoisture &soilmoisture1 - orgMatterContent_forest = 0.0000000000000000 , 20.000000000000000 , 3.3999999999999999 , 1 , 1 - orgMatterContent_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.10000000000000001 , 1 , 1 - orgMatterContent_pervious = 0.0000000000000000 , 4.0000000000000000 , 0.59999999999999998 , 1 , 1 - PTF_lower66_5_constant = 0.64620000000000000 , 0.95060000000000000 , 0.76000000000000001 , 1 , 1 - PTF_lower66_5_clay = 1.0000000000000000E-004 , 2.8999999999999998E-003 , 8.2756557368382977E-004 , 1 , 1 - PTF_lower66_5_Db = -0.37269999999999998 , -0.18709999999999999 , -0.32025751454468177 , 1 , 1 - PTF_higher66_5_constant = 0.53580000000000005 , 1.1232000000000000 , 1.0025859686940115 , 1 , 1 - PTF_higher66_5_clay = -5.4999999999999997E-003 , 4.8999999999999998E-003 , 1.1302141017234500E-003 , 1 , 1 - PTF_higher66_5_Db = -0.55130000000000001 , -9.1300000000000006E-002 , -0.30486197988303215 , 1 , 1 - PTF_Ks_constant = -1.2000000000000000 , -0.28499999999999998 , -0.58499999999999996 , 1 , 1 - PTF_Ks_sand = 6.0000000000000001E-003 , 2.5999999999999999E-002 , 9.0981005557436503E-003 , 1 , 1 - PTF_Ks_clay = 3.0000000000000001E-003 , 1.2999999999999999E-002 , 6.3000000000000000E-003 , 1 , 1 - PTF_Ks_curveSlope = 60.960000000000001 , 60.960000000000001 , 60.960000000000001 , 0 , 1 - rootFractionCoefficient_forest = 0.90000000000000002 , 0.99900000000000000 , 0.97502022888228179 , 1 , 1 - rootFractionCoefficient_impervious = 0.90000000000000002 , 0.94999999999999996 , 0.92925469810558115 , 1 , 1 - rootFractionCoefficient_pervious = 1.0000000000000000E-003 , 8.9999999999999997E-002 , 3.8213093773617098E-002 , 1 , 1 - infiltrationShapeFactor = 1.0000000000000000 , 4.0000000000000000 , 1.4997388122873807 , 1 , 1 + orgMatterContent_forest = 0.000000000000000E+000 , 20.0000000000000 + , 13.9913675012930 , 1 , 1 + orgMatterContent_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 5.105612361697495E-002 , 1 , 1 + orgMatterContent_pervious = 0.000000000000000E+000 , + 4.00000000000000 , 0.896613581800218 , 1 , 1 + PTF_lower66_5_constant = 0.646200000000000 , 0.950600000000000 + , 0.707150874596424 , 1 , 1 + PTF_lower66_5_clay = 1.000000000000000E-004 , 2.900000000000000E-003 , + 1.058490426074058E-003 , 1 , 1 + PTF_lower66_5_Db = -0.372700000000000 , -0.187100000000000 , + -0.250290485999284 , 1 , 1 + PTF_higher66_5_constant = 0.535800000000000 , 1.12320000000000 + , 0.809060290214743 , 1 , 1 + PTF_higher66_5_clay = -5.500000000000000E-003 , 4.900000000000000E-003 , + -2.299235003946245E-003 , 1 , 1 + PTF_higher66_5_Db = -0.551300000000000 , -9.130000000000001E-002 , + -0.270274825467716 , 1 , 1 + PTF_Ks_constant = -1.20000000000000 , -0.285000000000000 , + -0.576887394145837 , 1 , 1 + PTF_Ks_sand = 6.000000000000000E-003 , 2.600000000000000E-002 , + 1.280101298883113E-002 , 1 , 1 + PTF_Ks_clay = 3.000000000000000E-003 , 1.300000000000000E-002 , + 5.921166514583914E-003 , 1 , 1 + PTF_Ks_curveSlope = 60.9600000000000 , 60.9600000000000 , + 60.9600000000000 , 0 , 1 + rootFractionCoefficient_forest = 0.900000000000000 , + 0.999000000000000 , 0.985067019078026 , 1 , 1 + rootFractionCoefficient_impervious = 0.900000000000000 , + 0.950000000000000 , 0.948770283181742 , 1 , 1 + rootFractionCoefficient_pervious = 1.000000000000000E-003 , + 9.000000000000000E-002 , 5.900295603935595E-003 , 1 , 1 + infiltrationShapeFactor = 1.00000000000000 , 4.00000000000000 + , 2.97556062380225 , 1 , 1 / ! directSealedAreaRunoff &directRunoff1 - imperviousStorageCapacity = 0.0000000000000000 , 5.0000000000000000 , 0.50000000000000000 , 1 , 1 + imperviousStorageCapacity = 0.000000000000000E+000 , + 5.00000000000000 , 0.215051846020602 , 1 , 1 / ! potential evapotranspiration &PET3 - canopyheigth_forest = 15.000000000000000 , 40.000000000000000 , 15.000000000000000 , 1 , 1 - canopyheigth_impervious = 1.0000000000000000E-002 , 0.50000000000000000 , 0.11312756933518443 , 1 , 1 - canopyheigth_pervious = 0.10000000000000001 , 5.0000000000000000 , 1.7257232381867886 , 1 , 1 - displacementheight_coeff = 0.50000000000000000 , 0.84999999999999998 , 0.70185838313771776 , 1 , 1 - roughnesslength_momentum_coeff = 8.9999999999999997E-002 , 0.16000000000000000 , 9.7205642761519606E-002 , 1 , 1 - roughnesslength_heat_coeff = 7.0000000000000007E-002 , 0.13000000000000000 , 7.5053126634355483E-002 , 1 , 1 - stomatal_resistance = 10.000000000000000 , 200.00000000000000 , 56.000000000000000 , 1 , 1 + canopyheigth_forest = 15.0000000000000 , 40.0000000000000 , + 21.9092727422325 , 1 , 1 + canopyheigth_impervious = 1.000000000000000E-002 , 0.500000000000000 + , 4.409236692429134E-002 , 1 , 1 + canopyheigth_pervious = 0.100000000000000 , 5.00000000000000 , + 0.153484978059827 , 1 , 1 + displacementheight_coeff = 0.500000000000000 , 0.850000000000000 + , 0.631787215053195 , 1 , 1 + roughnesslength_momentum_coeff = 9.000000000000000E-002 , + 0.160000000000000 , 9.619970985802488E-002 , 1 , 1 + roughnesslength_heat_coeff = 7.000000000000001E-002 , + 0.130000000000000 , 7.412328068632605E-002 , 1 , 1 + stomatal_resistance = 10.0000000000000 , 200.000000000000 , + 44.4181155601425 , 1 , 1 / ! interflow &interflow1 - interflowStorageCapacityFactor = 75.000000000000000 , 200.00000000000000 , 97.415163334784125 , 1 , 1 - interflowRecession_slope = 0.0000000000000000 , 10.000000000000000 , 5.0695268215707490 , 1 , 1 - fastInterflowRecession_forest = 1.0000000000000000 , 3.0000000000000000 , 1.0203928354408616 , 1 , 1 - slowInterflowRecession_Ks = 1.0000000000000000 , 30.000000000000000 , 15.000000000000000 , 1 , 1 - exponentSlowInterflow = 5.0000000000000003E-002 , 0.29999999999999999 , 0.12961118194886101 , 1 , 1 + interflowStorageCapacityFactor = 75.0000000000000 , + 200.000000000000 , 100.446402413275 , 1 , 1 + interflowRecession_slope = 0.000000000000000E+000 , 10.0000000000000 + , 5.72819497604246 , 1 , 1 + fastInterflowRecession_forest = 1.00000000000000 , + 3.00000000000000 , 1.46913842205795 , 1 , 1 + slowInterflowRecession_Ks = 1.00000000000000 , + 30.0000000000000 , 10.9375259686087 , 1 , 1 + exponentSlowInterflow = 5.000000000000000E-002 , 0.300000000000000 , + 0.185495267349062 , 1 , 1 / ! percolation &percolation1 - rechargeCoefficient = 0.0000000000000000 , 50.000000000000000 , 43.962347771933104 , 1 , 1 - rechargeFactor_karstic = -5.0000000000000000 , 5.0000000000000000 , -7.1362136147648636E-002 , 1 , 1 - gain_loss_GWreservoir_karstic = 1.0000000000000000 , 1.0000000000000000 , 1.0000000000000000 , 0 , 1 + rechargeCoefficient = 0.000000000000000E+000 , 50.0000000000000 , + 25.6791391299436 , 1 , 1 + rechargeFactor_karstic = -5.00000000000000 , 5.00000000000000 + , 2.47055780892711 , 1 , 1 + gain_loss_GWreservoir_karstic = 1.00000000000000 , + 1.00000000000000 , 1.00000000000000 , 0 , 1 / ! routing &routing1 - muskingumTravelTime_constant = 0.31000000000000000 , 0.34999999999999998 , 0.32500000000000001 , 1 , 1 - muskingumTravelTime_riverLength = 7.0000000000000007E-002 , 8.0000000000000002E-002 , 7.4999999999999997E-002 , 1 , 1 - muskingumTravelTime_riverSlope = 1.9500000000000000 , 2.1000000000000001 , 1.9747551247863051 , 1 , 1 - muskingumTravelTime_impervious = 8.9999999999999997E-002 , 0.11000000000000000 , 0.10165441666775003 , 1 , 1 - muskingumAttenuation_riverSlope = 1.0000000000000000E-002 , 0.50000000000000000 , 0.36204341503636578 , 1 , 1 + muskingumTravelTime_constant = 0.310000000000000 , + 0.350000000000000 , 0.334277347185789 , 1 , 1 + muskingumTravelTime_riverLength = 7.000000000000001E-002 , + 8.000000000000000E-002 , 7.543634940263758E-002 , 1 , 1 + muskingumTravelTime_riverSlope = 1.95000000000000 , + 2.10000000000000 , 2.00216264925617 , 1 , 1 + muskingumTravelTime_impervious = 9.000000000000000E-002 , + 0.110000000000000 , 0.101811262528843 , 1 , 1 + muskingumAttenuation_riverSlope = 1.000000000000000E-002 , + 0.500000000000000 , 0.341282646405447 , 1 , 1 / ! geology &geoparameter - GeoParam(1,:) = 1.0000000000000000 , 1000.0000000000000 , 261.16953518219651 , 1 , 1 - GeoParam(2,:) = 1.0000000000000000 , 1000.0000000000000 , 355.41335144123536 , 1 , 1 - GeoParam(3,:) = 1.0000000000000000 , 1000.0000000000000 , 85.252293903546530 , 1 , 1 - GeoParam(4,:) = 1.0000000000000000 , 1000.0000000000000 , 79.912860535439464 , 1 , 1 - GeoParam(5,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(6,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(7,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(8,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(9,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(10,:) = 1.0000000000000000 , 1000.0000000000000 , 140.55053265727508 , 1 , 1 + GeoParam(1,:) = 1.00000000000000 , 1000.00000000000 , + 97.0303313768825 , 1 , 1 + GeoParam(2,:) = 1.00000000000000 , 1000.00000000000 , + 66.9985228998802 , 1 , 1 + GeoParam(3,:) = 1.00000000000000 , 1000.00000000000 , + 47.9554431856718 , 1 , 1 + GeoParam(4,:) = 1.00000000000000 , 1000.00000000000 , + 181.009520825398 , 1 , 1 + GeoParam(5,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(6,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(7,:) = 1.00000000000000 , 1000.00000000000 , + 8.41387726473933 , 1 , 1 + GeoParam(8,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(9,:) = 1.00000000000000 , 1000.00000000000 , + 147.263520762120 , 1 , 1 + GeoParam(10,:) = 1.00000000000000 , 1000.00000000000 , + 22.2744376104507 , 1 , 1 / ! neutrons diff --git a/check/case_03/output_save/FinalParam.out b/check/case_03/output_save/FinalParam.out index ab35bb78..5cac9c50 100644 --- a/check/case_03/output_save/FinalParam.out +++ b/check/case_03/output_save/FinalParam.out @@ -1,2 +1,2 @@ OF canopyInterceptionFactor snowTreshholdTemperature degreeDayFactor_forest degreeDayFactor_impervious degreeDayFactor_pervious increaseDegreeDayFactorByPrecip maxDegreeDayFactor_forest maxDegreeDayFactor_impervious maxDegreeDayFactor_pervious orgMatterContent_forest orgMatterContent_impervious orgMatterContent_pervious PTF_lower66_5_constant PTF_lower66_5_clay PTF_lower66_5_Db PTF_higher66_5_constant PTF_higher66_5_clay PTF_higher66_5_Db PTF_Ks_constant PTF_Ks_sand PTF_Ks_clay PTF_Ks_curveSlope rootFractionCoefficient_forest rootFractionCoefficient_impervious rootFractionCoefficient_pervious infiltrationShapeFactor imperviousStorageCapacity canopyheigth_forest canopyheigth_impervious canopyheigth_pervious displacementheight_coeff roughnesslength_momentum_coeff roughnesslength_heat_coeff stomatal_resistance interflowStorageCapacityFactor interflowRecession_slope fastInterflowRecession_forest slowInterflowRecession_Ks exponentSlowInterflow rechargeCoefficient rechargeFactor_karstic gain_loss_GWreservoir_karstic muskingumTravelTime_constant muskingumTravelTime_riverLength muskingumTravelTime_riverSlope muskingumTravelTime_impervious muskingumAttenuation_riverSlope GeoParam(1,:) GeoParam(2,:) GeoParam(3,:) GeoParam(4,:) GeoParam(5,:) GeoParam(6,:) GeoParam(7,:) GeoParam(8,:) GeoParam(9,:) GeoParam(10,:) - 1.31657068478540E-01 1.90159173221168E-01 1.76318526725256E+00 1.50000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 4.35979410360079E-01 2.50262040731443E+00 3.50000000000000E+00 4.00000000000000E+00 3.40000000000000E+00 1.00000000000000E-01 6.00000000000000E-01 7.60000000000000E-01 8.27565573683830E-04 -3.20257514544682E-01 1.00258596869401E+00 1.13021410172345E-03 -3.04861979883032E-01 -5.85000000000000E-01 9.09810055574365E-03 6.30000000000000E-03 6.09600000000000E+01 9.75020228882282E-01 9.29254698105581E-01 3.82130937736171E-02 1.49973881228738E+00 5.00000000000000E-01 1.50000000000000E+01 1.13127569335184E-01 1.72572323818679E+00 7.01858383137718E-01 9.72056427615196E-02 7.50531266343555E-02 5.60000000000000E+01 9.74151633347841E+01 5.06952682157075E+00 1.02039283544086E+00 1.50000000000000E+01 1.29611181948861E-01 4.39623477719331E+01 -7.13621361476486E-02 1.00000000000000E+00 3.25000000000000E-01 7.50000000000000E-02 1.97475512478631E+00 1.01654416667750E-01 3.62043415036366E-01 2.61169535182197E+02 3.55413351441235E+02 8.52522939035465E+01 7.99128605354395E+01 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.40550532657275E+02 + 1.10018973432723E-01 2.06292417175140E-01 1.11413798514203E+00 2.12340562437516E+00 3.58416663643768E-01 7.44023834479764E-01 4.43954961941640E-01 3.07504025961314E+00 3.19534639391650E+00 5.65569750791907E+00 1.39913675012930E+01 5.10561236169750E-02 8.96613581800218E-01 7.07150874596424E-01 1.05849042607406E-03 -2.50290485999284E-01 8.09060290214743E-01 -2.29923500394625E-03 -2.70274825467716E-01 -5.76887394145837E-01 1.28010129888311E-02 5.92116651458391E-03 6.09600000000000E+01 9.85067019078026E-01 9.48770283181742E-01 5.90029560393559E-03 2.97556062380225E+00 2.15051846020602E-01 2.19092727422325E+01 4.40923669242913E-02 1.53484978059827E-01 6.31787215053195E-01 9.61997098580249E-02 7.41232806863261E-02 4.44181155601425E+01 1.00446402413275E+02 5.72819497604246E+00 1.46913842205795E+00 1.09375259686087E+01 1.85495267349062E-01 2.56791391299436E+01 2.47055780892711E+00 1.00000000000000E+00 3.34277347185789E-01 7.54363494026376E-02 2.00216264925617E+00 1.01811262528843E-01 3.41282646405447E-01 9.70303313768825E+01 6.69985228998802E+01 4.79554431856718E+01 1.81009520825398E+02 1.00000000000000E+02 1.00000000000000E+02 8.41387726473933E+00 1.00000000000000E+02 1.47263520762120E+02 2.22744376104507E+01 diff --git a/check/case_03/output_save/b1_daily_discharge.out b/check/case_03/output_save/b1_daily_discharge.out new file mode 100755 index 00000000..0075f620 --- /dev/null +++ b/check/case_03/output_save/b1_daily_discharge.out @@ -0,0 +1,366 @@ + No Day Mon Year Qobs_0000000398 Qsim_0000000398 + 1 1 7 1990 79.0000000 57.4663098 + 2 2 7 1990 92.0000000 43.6455289 + 3 3 7 1990 72.0000000 49.3878100 + 4 4 7 1990 58.0000000 63.0062544 + 5 5 7 1990 69.0000000 86.4224656 + 6 6 7 1990 94.0000000 64.8653581 + 7 7 7 1990 199.0000000 68.8106251 + 8 8 7 1990 133.0000000 64.3211686 + 9 9 7 1990 124.0000000 51.7051712 + 10 10 7 1990 123.0000000 49.2677236 + 11 11 7 1990 99.0000000 47.1192640 + 12 12 7 1990 88.0000000 45.2181575 + 13 13 7 1990 84.0000000 43.5294670 + 14 14 7 1990 72.0000000 42.0237011 + 15 15 7 1990 55.0000000 40.6758782 + 16 16 7 1990 65.0000000 39.4647670 + 17 17 7 1990 50.0000000 38.3722698 + 18 18 7 1990 50.0000000 37.3829165 + 19 19 7 1990 46.0000000 36.4834488 + 20 20 7 1990 44.0000000 35.6624760 + 21 21 7 1990 42.0000000 34.9101902 + 22 22 7 1990 37.0000000 34.2181283 + 23 23 7 1990 38.0000000 33.5789730 + 24 24 7 1990 44.0000000 32.9863858 + 25 25 7 1990 30.0000000 32.4348665 + 26 26 7 1990 26.0000000 31.9196344 + 27 27 7 1990 31.0000000 31.4365273 + 28 28 7 1990 33.0000000 37.8578083 + 29 29 7 1990 42.0000000 32.7621241 + 30 30 7 1990 36.0000000 30.3265197 + 31 31 7 1990 34.0000000 29.9239876 + 32 1 8 1990 25.0000000 29.5413146 + 33 2 8 1990 22.0000000 29.1763979 + 34 3 8 1990 28.0000000 28.8273938 + 35 4 8 1990 25.0000000 28.4926829 + 36 5 8 1990 19.0000000 28.1708420 + 37 6 8 1990 22.0000000 27.8606178 + 38 7 8 1990 19.0000000 27.5609063 + 39 8 8 1990 22.0000000 27.2707329 + 40 9 8 1990 19.0000000 26.9892370 + 41 10 8 1990 20.0000000 26.7156574 + 42 11 8 1990 19.0000000 26.4493201 + 43 12 8 1990 19.0000000 26.1896276 + 44 13 8 1990 22.0000000 30.4602021 + 45 14 8 1990 36.0000000 47.8341881 + 46 15 8 1990 31.0000000 39.3767988 + 47 16 8 1990 30.0000000 34.6011148 + 48 17 8 1990 28.0000000 30.8793415 + 49 18 8 1990 34.0000000 25.3501274 + 50 19 8 1990 21.0000000 25.0787548 + 51 20 8 1990 30.0000000 24.8161037 + 52 21 8 1990 22.0000000 24.5613600 + 53 22 8 1990 21.0000000 24.3138192 + 54 23 8 1990 23.0000000 24.0728590 + 55 24 8 1990 20.0000000 23.8379293 + 56 25 8 1990 29.0000000 23.6085431 + 57 26 8 1990 20.0000000 23.7092140 + 58 27 8 1990 22.0000000 24.3923882 + 59 28 8 1990 23.0000000 22.9780044 + 60 29 8 1990 35.0000000 22.7575899 + 61 30 8 1990 51.0000000 106.5271812 + 62 31 8 1990 80.0000000 86.7005082 + 63 1 9 1990 56.0000000 31.1108388 + 64 2 9 1990 33.0000000 25.1867431 + 65 3 9 1990 27.0000000 24.8363616 + 66 4 9 1990 27.0000000 30.6717562 + 67 5 9 1990 28.0000000 30.4380984 + 68 6 9 1990 26.0000000 24.0158498 + 69 7 9 1990 24.0000000 31.4854529 + 70 8 9 1990 33.0000000 27.3358242 + 71 9 9 1990 26.0000000 23.1816719 + 72 10 9 1990 27.0000000 22.8077840 + 73 11 9 1990 22.0000000 22.4585620 + 74 12 9 1990 22.0000000 22.1310367 + 75 13 9 1990 21.0000000 21.8226641 + 76 14 9 1990 22.0000000 21.5312423 + 77 15 9 1990 22.0000000 21.2548618 + 78 16 9 1990 22.0000000 20.9918631 + 79 17 9 1990 20.0000000 20.7408017 + 80 18 9 1990 22.0000000 20.5004172 + 81 19 9 1990 16.0000000 20.2696088 + 82 20 9 1990 22.0000000 20.0474125 + 83 21 9 1990 19.0000000 29.9910595 + 84 22 9 1990 32.0000000 97.1099960 + 85 23 9 1990 27.0000000 66.6435734 + 86 24 9 1990 45.0000000 44.5060571 + 87 25 9 1990 42.0000000 28.7503711 + 88 26 9 1990 39.0000000 25.2163003 + 89 27 9 1990 30.0000000 24.3929251 + 90 28 9 1990 28.0000000 23.6980302 + 91 29 9 1990 30.0000000 23.1252394 + 92 30 9 1990 30.0000000 78.0249267 + 93 1 10 1990 56.0000000 111.8006837 + 94 2 10 1990 72.0000000 67.5195746 + 95 3 10 1990 73.0000000 75.3158798 + 96 4 10 1990 68.0000000 63.7504784 + 97 5 10 1990 53.0000000 49.8277620 + 98 6 10 1990 42.0000000 44.5092147 + 99 7 10 1990 33.0000000 41.5583774 + 100 8 10 1990 42.0000000 39.1107100 + 101 9 10 1990 34.0000000 36.8028258 + 102 10 10 1990 36.0000000 34.8571471 + 103 11 10 1990 36.0000000 33.1522033 + 104 12 10 1990 28.0000000 31.6522929 + 105 13 10 1990 32.0000000 30.3275868 + 106 14 10 1990 27.0000000 29.1530594 + 107 15 10 1990 35.0000000 28.8065145 + 108 16 10 1990 42.0000000 30.5123956 + 109 17 10 1990 35.0000000 39.1260778 + 110 18 10 1990 39.0000000 37.4556186 + 111 19 10 1990 34.0000000 29.4981866 + 112 20 10 1990 32.0000000 28.3900784 + 113 21 10 1990 34.0000000 27.4042376 + 114 22 10 1990 27.0000000 26.5227371 + 115 23 10 1990 31.0000000 25.7313421 + 116 24 10 1990 28.0000000 25.0179626 + 117 25 10 1990 25.0000000 26.1912792 + 118 26 10 1990 29.0000000 47.0322216 + 119 27 10 1990 31.0000000 56.1990077 + 120 28 10 1990 65.0000000 192.5664936 + 121 29 10 1990 69.0000000 207.1489125 + 122 30 10 1990 157.0000000 163.9860181 + 123 31 10 1990 190.0000000 136.0156531 + 124 1 11 1990 115.0000000 138.3860027 + 125 2 11 1990 104.0000000 145.0603518 + 126 3 11 1990 100.0000000 141.6157257 + 127 4 11 1990 131.0000000 133.7005953 + 128 5 11 1990 130.0000000 125.6302856 + 129 6 11 1990 115.0000000 107.9706347 + 130 7 11 1990 102.0000000 95.9353879 + 131 8 11 1990 95.0000000 86.7899325 + 132 9 11 1990 81.0000000 80.1641173 + 133 10 11 1990 66.0000000 94.1700238 + 134 11 11 1990 67.0000000 128.0484676 + 135 12 11 1990 74.0000000 125.2804647 + 136 13 11 1990 109.0000000 123.0900426 + 137 14 11 1990 92.0000000 154.1234042 + 138 15 11 1990 92.0000000 164.4288089 + 139 16 11 1990 155.0000000 151.7904602 + 140 17 11 1990 159.0000000 141.1958728 + 141 18 11 1990 131.0000000 160.4136923 + 142 19 11 1990 161.0000000 175.0055820 + 143 20 11 1990 196.0000000 290.8876603 + 144 21 11 1990 336.0000000 366.4226632 + 145 22 11 1990 566.0000000 325.9865136 + 146 23 11 1990 373.0000000 329.8057113 + 147 24 11 1990 293.0000000 298.5103873 + 148 25 11 1990 264.0000000 283.5456014 + 149 26 11 1990 226.0000000 250.8861059 + 150 27 11 1990 201.0000000 205.9801705 + 151 28 11 1990 180.0000000 174.7197588 + 152 29 11 1990 161.0000000 172.6809568 + 153 30 11 1990 149.0000000 165.7043758 + 154 1 12 1990 134.0000000 146.3660693 + 155 2 12 1990 113.0000000 133.6084709 + 156 3 12 1990 99.0000000 122.2093589 + 157 4 12 1990 107.0000000 113.2232372 + 158 5 12 1990 99.0000000 105.1875938 + 159 6 12 1990 89.0000000 98.0260189 + 160 7 12 1990 77.0000000 91.9590526 + 161 8 12 1990 71.0000000 86.7301096 + 162 9 12 1990 68.0000000 82.2002098 + 163 10 12 1990 73.0000000 78.2561810 + 164 11 12 1990 84.0000000 74.8053330 + 165 12 12 1990 88.0000000 97.2582087 + 166 13 12 1990 92.0000000 110.8857359 + 167 14 12 1990 128.0000000 104.8576152 + 168 15 12 1990 136.0000000 95.6088734 + 169 16 12 1990 114.0000000 89.2014433 + 170 17 12 1990 101.0000000 83.8165148 + 171 18 12 1990 93.0000000 79.2113049 + 172 19 12 1990 85.0000000 75.2483001 + 173 20 12 1990 81.0000000 71.8172000 + 174 21 12 1990 106.0000000 115.7743749 + 175 22 12 1990 159.0000000 168.3471769 + 176 23 12 1990 250.0000000 202.0863784 + 177 24 12 1990 298.0000000 193.5724622 + 178 25 12 1990 261.0000000 238.9433394 + 179 26 12 1990 228.0000000 385.0567095 + 180 27 12 1990 409.0000000 484.4008519 + 181 28 12 1990 486.0000000 491.2237511 + 182 29 12 1990 440.0000000 617.9829432 + 183 30 12 1990 486.0000000 780.4592505 + 184 31 12 1990 774.0000000 871.8512118 + 185 1 1 1991 889.0000000 891.8277307 + 186 2 1 1991 863.0000000 925.2975565 + 187 3 1 1991 875.0000000 975.5101315 + 188 4 1 1991 932.0000000 833.9322809 + 189 5 1 1991 826.0000000 761.1479855 + 190 6 1 1991 731.0000000 705.6670078 + 191 7 1 1991 613.0000000 653.8367422 + 192 8 1 1991 610.0000000 634.5496922 + 193 9 1 1991 686.0000000 562.2806155 + 194 10 1 1991 556.0000000 621.0782129 + 195 11 1 1991 669.0000000 673.3315125 + 196 12 1 1991 828.0000000 602.6459404 + 197 13 1 1991 735.0000000 456.5177256 + 198 14 1 1991 513.0000000 354.4263527 + 199 15 1 1991 411.0000000 294.8175715 + 200 16 1 1991 345.0000000 260.8834630 + 201 17 1 1991 293.0000000 235.3418550 + 202 18 1 1991 251.0000000 214.3061963 + 203 19 1 1991 222.0000000 196.8244495 + 204 20 1 1991 215.0000000 182.2188884 + 205 21 1 1991 213.0000000 178.7776032 + 206 22 1 1991 202.0000000 183.4000433 + 207 23 1 1991 200.0000000 176.0226769 + 208 24 1 1991 192.0000000 164.8306158 + 209 25 1 1991 176.0000000 154.8318288 + 210 26 1 1991 164.0000000 146.4433138 + 211 27 1 1991 157.0000000 138.9943379 + 212 28 1 1991 134.0000000 132.5718739 + 213 29 1 1991 130.0000000 126.9986985 + 214 30 1 1991 119.0000000 122.1318768 + 215 31 1 1991 107.0000000 117.8554581 + 216 1 2 1991 112.0000000 114.0748384 + 217 2 2 1991 109.0000000 110.7124169 + 218 3 2 1991 101.0000000 107.7042223 + 219 4 2 1991 98.0000000 104.9972730 + 220 5 2 1991 84.0000000 102.5474984 + 221 6 2 1991 93.0000000 100.3180901 + 222 7 2 1991 80.0000000 98.2781875 + 223 8 2 1991 73.0000000 96.4018228 + 224 9 2 1991 89.0000000 94.6670712 + 225 10 2 1991 84.0000000 93.0553616 + 226 11 2 1991 78.0000000 91.5509154 + 227 12 2 1991 79.0000000 90.1402876 + 228 13 2 1991 77.0000000 88.8119904 + 229 14 2 1991 80.0000000 87.5561816 + 230 15 2 1991 72.0000000 86.3644083 + 231 16 2 1991 78.0000000 90.0114063 + 232 17 2 1991 74.0000000 89.2645881 + 233 18 2 1991 77.0000000 87.4453274 + 234 19 2 1991 73.0000000 110.6395186 + 235 20 2 1991 69.0000000 141.6330642 + 236 21 2 1991 74.0000000 197.4046527 + 237 22 2 1991 81.0000000 225.5201315 + 238 23 2 1991 110.0000000 211.5897637 + 239 24 2 1991 180.0000000 196.5843268 + 240 25 2 1991 213.0000000 187.4900424 + 241 26 2 1991 222.0000000 176.7536700 + 242 27 2 1991 208.0000000 172.2147848 + 243 28 2 1991 211.0000000 167.9629323 + 244 1 3 1991 214.0000000 166.6683262 + 245 2 3 1991 208.0000000 179.8838013 + 246 3 3 1991 221.0000000 176.8454077 + 247 4 3 1991 281.0000000 161.1154757 + 248 5 3 1991 219.0000000 149.8496754 + 249 6 3 1991 190.0000000 140.4828266 + 250 7 3 1991 173.0000000 132.4593777 + 251 8 3 1991 164.0000000 126.0444045 + 252 9 3 1991 142.0000000 121.8729774 + 253 10 3 1991 133.0000000 118.8337497 + 254 11 3 1991 133.0000000 114.9583243 + 255 12 3 1991 118.0000000 110.2227223 + 256 13 3 1991 127.0000000 106.0355094 + 257 14 3 1991 113.0000000 102.3512521 + 258 15 3 1991 107.0000000 99.0903391 + 259 16 3 1991 100.0000000 96.1875349 + 260 17 3 1991 100.0000000 93.5951857 + 261 18 3 1991 95.0000000 91.3514380 + 262 19 3 1991 98.0000000 160.1410975 + 263 20 3 1991 119.0000000 185.2050738 + 264 21 3 1991 159.0000000 195.9798039 + 265 22 3 1991 196.0000000 212.6858782 + 266 23 3 1991 242.0000000 192.1601657 + 267 24 3 1991 216.0000000 173.3803549 + 268 25 3 1991 180.0000000 159.2653975 + 269 26 3 1991 145.0000000 147.6023999 + 270 27 3 1991 127.0000000 137.9989353 + 271 28 3 1991 117.0000000 129.4604027 + 272 29 3 1991 109.0000000 122.1645554 + 273 30 3 1991 106.0000000 115.9109436 + 274 31 3 1991 99.0000000 110.5164252 + 275 1 4 1991 96.0000000 105.8339976 + 276 2 4 1991 88.0000000 101.7448812 + 277 3 4 1991 87.0000000 98.1525110 + 278 4 4 1991 82.0000000 95.7031741 + 279 5 4 1991 84.0000000 93.1983298 + 280 6 4 1991 67.0000000 90.4863764 + 281 7 4 1991 89.0000000 88.3558113 + 282 8 4 1991 75.0000000 86.3422254 + 283 9 4 1991 79.0000000 84.3721304 + 284 10 4 1991 70.0000000 82.5620352 + 285 11 4 1991 69.0000000 80.9064859 + 286 12 4 1991 69.0000000 79.3843786 + 287 13 4 1991 56.0000000 77.9778759 + 288 14 4 1991 63.0000000 76.6775993 + 289 15 4 1991 58.0000000 75.4587942 + 290 16 4 1991 56.0000000 74.3163007 + 291 17 4 1991 54.0000000 73.2414542 + 292 18 4 1991 57.0000000 72.2690624 + 293 19 4 1991 53.0000000 72.5293854 + 294 20 4 1991 53.0000000 71.4237356 + 295 21 4 1991 65.0000000 70.4166852 + 296 22 4 1991 69.0000000 72.6067311 + 297 23 4 1991 61.0000000 73.8917603 + 298 24 4 1991 56.0000000 70.4151022 + 299 25 4 1991 56.0000000 69.0767421 + 300 26 4 1991 53.0000000 68.0929823 + 301 27 4 1991 49.0000000 67.1702698 + 302 28 4 1991 53.0000000 66.2938339 + 303 29 4 1991 48.0000000 72.3198843 + 304 30 4 1991 57.0000000 109.9864048 + 305 1 5 1991 69.0000000 100.2867362 + 306 2 5 1991 89.0000000 81.5105506 + 307 3 5 1991 105.0000000 78.7692368 + 308 4 5 1991 79.0000000 76.3872583 + 309 5 5 1991 69.0000000 74.6816616 + 310 6 5 1991 71.0000000 73.5864199 + 311 7 5 1991 60.0000000 71.1263788 + 312 8 5 1991 64.0000000 69.4988934 + 313 9 5 1991 59.0000000 68.0818780 + 314 10 5 1991 57.0000000 69.3795186 + 315 11 5 1991 55.0000000 71.2844276 + 316 12 5 1991 53.0000000 67.9707267 + 317 13 5 1991 52.0000000 66.8048472 + 318 14 5 1991 50.0000000 65.8796587 + 319 15 5 1991 52.0000000 73.8110037 + 320 16 5 1991 54.0000000 72.4164031 + 321 17 5 1991 54.0000000 67.6018317 + 322 18 5 1991 55.0000000 65.7927060 + 323 19 5 1991 48.0000000 64.4691848 + 324 20 5 1991 48.0000000 63.2468896 + 325 21 5 1991 49.0000000 62.1134047 + 326 22 5 1991 41.0000000 61.0584751 + 327 23 5 1991 40.0000000 60.0731321 + 328 24 5 1991 40.0000000 59.1495242 + 329 25 5 1991 39.0000000 58.2807715 + 330 26 5 1991 43.0000000 57.4608401 + 331 27 5 1991 39.0000000 56.6844336 + 332 28 5 1991 36.0000000 55.9468986 + 333 29 5 1991 33.0000000 55.2441441 + 334 30 5 1991 39.0000000 54.5725696 + 335 31 5 1991 34.0000000 53.9290047 + 336 1 6 1991 37.0000000 53.3106548 + 337 2 6 1991 35.0000000 52.7150552 + 338 3 6 1991 29.0000000 52.1400299 + 339 4 6 1991 33.0000000 51.5836567 + 340 5 6 1991 34.0000000 51.2328571 + 341 6 6 1991 32.0000000 71.8803562 + 342 7 6 1991 38.0000000 72.8757605 + 343 8 6 1991 39.0000000 61.3041769 + 344 9 6 1991 41.0000000 56.3491141 + 345 10 6 1991 44.0000000 65.1218293 + 346 11 6 1991 48.0000000 55.4072760 + 347 12 6 1991 42.0000000 52.9880095 + 348 13 6 1991 37.0000000 52.1103534 + 349 14 6 1991 39.0000000 51.4052240 + 350 15 6 1991 35.0000000 51.3222823 + 351 16 6 1991 31.0000000 55.8643654 + 352 17 6 1991 33.0000000 58.8655679 + 353 18 6 1991 31.0000000 55.8689348 + 354 19 6 1991 28.0000000 53.7194143 + 355 20 6 1991 60.0000000 98.0818582 + 356 21 6 1991 48.0000000 75.4555918 + 357 22 6 1991 54.0000000 57.3071733 + 358 23 6 1991 63.0000000 66.3741469 + 359 24 6 1991 41.0000000 58.5655259 + 360 25 6 1991 42.0000000 54.3132823 + 361 26 6 1991 43.0000000 53.0342007 + 362 27 6 1991 38.0000000 58.0782444 + 363 28 6 1991 38.0000000 58.0626933 + 364 29 6 1991 35.0000000 53.3732000 + 365 30 6 1991 41.0000000 51.3459397 diff --git a/check/case_03/output_save/daily_discharge.out b/check/case_03/output_save/daily_discharge.out deleted file mode 100644 index 8f484a31..00000000 --- a/check/case_03/output_save/daily_discharge.out +++ /dev/null @@ -1,1462 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 124.1007398 - 2 2 1 1990 129.0000000 112.7839981 - 3 3 1 1990 117.0000000 103.0383443 - 4 4 1 1990 111.0000000 94.6013507 - 5 5 1 1990 112.0000000 87.2614311 - 6 6 1 1990 93.0000000 80.8466829 - 7 7 1 1990 87.0000000 75.2164502 - 8 8 1 1990 84.0000000 70.2561426 - 9 9 1 1990 80.0000000 65.8724230 - 10 10 1 1990 78.0000000 61.9757266 - 11 11 1 1990 78.0000000 58.5046204 - 12 12 1 1990 77.0000000 55.4026218 - 13 13 1 1990 76.0000000 52.6733302 - 14 14 1 1990 73.0000000 53.7106231 - 15 15 1 1990 66.0000000 65.3985850 - 16 16 1 1990 76.0000000 63.3713921 - 17 17 1 1990 73.0000000 62.3061182 - 18 18 1 1990 71.0000000 63.9124129 - 19 19 1 1990 90.0000000 59.8977861 - 20 20 1 1990 82.0000000 68.4329190 - 21 21 1 1990 80.0000000 67.8270657 - 22 22 1 1990 81.0000000 62.3231722 - 23 23 1 1990 97.0000000 165.5596749 - 24 24 1 1990 198.0000000 218.7188768 - 25 25 1 1990 392.0000000 288.4739287 - 26 26 1 1990 519.0000000 304.1676143 - 27 27 1 1990 565.0000000 242.6530476 - 28 28 1 1990 331.0000000 212.6314336 - 29 29 1 1990 293.0000000 194.3338209 - 30 30 1 1990 302.0000000 166.6699500 - 31 31 1 1990 233.0000000 148.7171301 - 32 1 2 1990 198.0000000 156.8602877 - 33 2 2 1990 183.0000000 172.1402235 - 34 3 2 1990 206.0000000 167.1852144 - 35 4 2 1990 215.0000000 145.6068593 - 36 5 2 1990 183.0000000 130.8734607 - 37 6 2 1990 159.0000000 118.7879517 - 38 7 2 1990 167.0000000 108.4241418 - 39 8 2 1990 138.0000000 100.6953921 - 40 9 2 1990 126.0000000 94.9577148 - 41 10 2 1990 131.0000000 171.5961358 - 42 11 2 1990 173.0000000 224.2488753 - 43 12 2 1990 240.0000000 257.2879500 - 44 13 2 1990 270.0000000 406.5671132 - 45 14 2 1990 458.0000000 873.8814011 - 46 15 2 1990 996.0000000 1283.5117777 - 47 16 2 1990 1370.0000000 1081.7626445 - 48 17 2 1990 1540.0000000 818.7349413 - 49 18 2 1990 1210.0000000 621.3471827 - 50 19 2 1990 616.0000000 468.0816814 - 51 20 2 1990 465.0000000 361.1925198 - 52 21 2 1990 373.0000000 289.2436542 - 53 22 2 1990 298.0000000 238.9021669 - 54 23 2 1990 270.0000000 202.0925676 - 55 24 2 1990 234.0000000 174.1998559 - 56 25 2 1990 218.0000000 160.1703048 - 57 26 2 1990 203.0000000 270.7458928 - 58 27 2 1990 314.0000000 489.1525560 - 59 28 2 1990 520.0000000 747.8679418 - 60 1 3 1990 689.0000000 830.9137959 - 61 2 3 1990 777.0000000 665.7359104 - 62 3 3 1990 584.0000000 504.6098309 - 63 4 3 1990 429.0000000 381.3214096 - 64 5 3 1990 365.0000000 300.8497423 - 65 6 3 1990 281.0000000 249.4683125 - 66 7 3 1990 257.0000000 212.0389458 - 67 8 3 1990 231.0000000 184.9000250 - 68 9 3 1990 211.0000000 166.5658213 - 69 10 3 1990 191.0000000 151.5301753 - 70 11 3 1990 182.0000000 138.6534116 - 71 12 3 1990 173.0000000 127.5527381 - 72 13 3 1990 159.0000000 118.1980068 - 73 14 3 1990 153.0000000 110.6850929 - 74 15 3 1990 141.0000000 103.6432133 - 75 16 3 1990 136.0000000 97.0536245 - 76 17 3 1990 130.0000000 91.2215045 - 77 18 3 1990 123.0000000 86.0567124 - 78 19 3 1990 115.0000000 81.4655133 - 79 20 3 1990 113.0000000 77.8501115 - 80 21 3 1990 102.0000000 74.6602692 - 81 22 3 1990 105.0000000 71.9247385 - 82 23 3 1990 106.0000000 69.2489629 - 83 24 3 1990 87.0000000 66.6968668 - 84 25 3 1990 80.0000000 66.4307029 - 85 26 3 1990 84.0000000 64.0178353 - 86 27 3 1990 82.0000000 63.7868032 - 87 28 3 1990 91.0000000 79.6463179 - 88 29 3 1990 97.0000000 82.4699570 - 89 30 3 1990 110.0000000 75.5932603 - 90 31 3 1990 97.0000000 70.8800027 - 91 1 4 1990 93.0000000 67.6601159 - 92 2 4 1990 85.0000000 64.8152803 - 93 3 4 1990 84.0000000 70.8151811 - 94 4 4 1990 81.0000000 75.3009179 - 95 5 4 1990 81.0000000 67.7271667 - 96 6 4 1990 76.0000000 65.3162636 - 97 7 4 1990 72.0000000 62.7380824 - 98 8 4 1990 68.0000000 60.3124059 - 99 9 4 1990 72.0000000 58.1262126 - 100 10 4 1990 65.0000000 56.1708988 - 101 11 4 1990 62.0000000 54.8847440 - 102 12 4 1990 62.0000000 55.3076575 - 103 13 4 1990 65.0000000 60.6305847 - 104 14 4 1990 68.0000000 96.0082609 - 105 15 4 1990 75.0000000 102.1768944 - 106 16 4 1990 90.0000000 106.8015226 - 107 17 4 1990 92.0000000 104.7039788 - 108 18 4 1990 94.0000000 100.5463409 - 109 19 4 1990 110.0000000 94.4723020 - 110 20 4 1990 99.0000000 88.1453117 - 111 21 4 1990 86.0000000 83.2903212 - 112 22 4 1990 86.0000000 87.5466142 - 113 23 4 1990 86.0000000 95.6166690 - 114 24 4 1990 88.0000000 93.2291217 - 115 25 4 1990 93.0000000 85.3880172 - 116 26 4 1990 99.0000000 80.3814825 - 117 27 4 1990 86.0000000 77.3630751 - 118 28 4 1990 74.0000000 74.8470903 - 119 29 4 1990 72.0000000 70.4516987 - 120 30 4 1990 77.0000000 67.1183666 - 121 1 5 1990 56.0000000 64.1248180 - 122 2 5 1990 64.0000000 61.4276706 - 123 3 5 1990 58.0000000 58.9900375 - 124 4 5 1990 50.0000000 56.7804096 - 125 5 5 1990 50.0000000 54.7717541 - 126 6 5 1990 50.0000000 52.9407842 - 127 7 5 1990 50.0000000 51.2751702 - 128 8 5 1990 53.0000000 50.3168439 - 129 9 5 1990 62.0000000 49.1898063 - 130 10 5 1990 64.0000000 52.9164496 - 131 11 5 1990 65.0000000 53.3615599 - 132 12 5 1990 75.0000000 48.3882776 - 133 13 5 1990 71.0000000 47.0599750 - 134 14 5 1990 63.0000000 46.2802709 - 135 15 5 1990 61.0000000 45.0766801 - 136 16 5 1990 49.0000000 44.0957497 - 137 17 5 1990 46.0000000 43.0839442 - 138 18 5 1990 46.0000000 42.1145034 - 139 19 5 1990 48.0000000 41.2149518 - 140 20 5 1990 41.0000000 40.4292132 - 141 21 5 1990 45.0000000 45.6704172 - 142 22 5 1990 52.0000000 45.8882558 - 143 23 5 1990 50.0000000 44.2929493 - 144 24 5 1990 56.0000000 45.8198170 - 145 25 5 1990 41.0000000 43.5814299 - 146 26 5 1990 40.0000000 41.1923922 - 147 27 5 1990 39.0000000 40.2217306 - 148 28 5 1990 39.0000000 39.3278914 - 149 29 5 1990 33.0000000 38.5022517 - 150 30 5 1990 37.0000000 37.7373316 - 151 31 5 1990 30.0000000 37.0266187 - 152 1 6 1990 37.0000000 42.8316939 - 153 2 6 1990 36.0000000 43.3017476 - 154 3 6 1990 40.0000000 70.0158278 - 155 4 6 1990 45.0000000 57.2302713 - 156 5 6 1990 39.0000000 44.8122674 - 157 6 6 1990 48.0000000 43.3716590 - 158 7 6 1990 39.0000000 83.2813762 - 159 8 6 1990 49.0000000 92.1052681 - 160 9 6 1990 84.0000000 79.5048199 - 161 10 6 1990 91.0000000 70.2458477 - 162 11 6 1990 80.0000000 63.1951907 - 163 12 6 1990 66.0000000 59.6905682 - 164 13 6 1990 53.0000000 56.6736394 - 165 14 6 1990 64.0000000 53.8761257 - 166 15 6 1990 55.0000000 51.3907758 - 167 16 6 1990 54.0000000 49.1909983 - 168 17 6 1990 42.0000000 47.2187985 - 169 18 6 1990 48.0000000 45.5496123 - 170 19 6 1990 48.0000000 63.7530427 - 171 20 6 1990 60.0000000 83.7466635 - 172 21 6 1990 75.0000000 80.0005712 - 173 22 6 1990 78.0000000 71.1614866 - 174 23 6 1990 66.0000000 63.8478870 - 175 24 6 1990 63.0000000 58.9990779 - 176 25 6 1990 52.0000000 56.0260870 - 177 26 6 1990 49.0000000 53.3688649 - 178 27 6 1990 44.0000000 58.9058383 - 179 28 6 1990 51.0000000 57.6817900 - 180 29 6 1990 61.0000000 74.6949977 - 181 30 6 1990 81.0000000 115.8029401 - 182 1 7 1990 79.0000000 94.1584426 - 183 2 7 1990 92.0000000 78.3509891 - 184 3 7 1990 72.0000000 82.9693038 - 185 4 7 1990 58.0000000 101.5554599 - 186 5 7 1990 69.0000000 135.3727237 - 187 6 7 1990 94.0000000 121.1481602 - 188 7 7 1990 199.0000000 127.8137321 - 189 8 7 1990 133.0000000 127.4978267 - 190 9 7 1990 124.0000000 107.4713615 - 191 10 7 1990 123.0000000 98.2274216 - 192 11 7 1990 99.0000000 90.6282095 - 193 12 7 1990 88.0000000 84.0273548 - 194 13 7 1990 84.0000000 78.2600042 - 195 14 7 1990 72.0000000 73.1969848 - 196 15 7 1990 55.0000000 68.7325942 - 197 16 7 1990 65.0000000 64.7797277 - 198 17 7 1990 50.0000000 61.2661372 - 199 18 7 1990 50.0000000 58.1315321 - 200 19 7 1990 46.0000000 55.3253138 - 201 20 7 1990 44.0000000 52.8047915 - 202 21 7 1990 42.0000000 50.5337662 - 203 22 7 1990 37.0000000 48.4813995 - 204 23 7 1990 38.0000000 46.6213038 - 205 24 7 1990 44.0000000 44.9308063 - 206 25 7 1990 30.0000000 43.3903496 - 207 26 7 1990 26.0000000 41.9830014 - 208 27 7 1990 31.0000000 40.6940509 - 209 28 7 1990 33.0000000 45.4213649 - 210 29 7 1990 42.0000000 41.3080045 - 211 30 7 1990 36.0000000 38.4981840 - 212 31 7 1990 34.0000000 37.4645164 - 213 1 8 1990 25.0000000 36.5112004 - 214 2 8 1990 22.0000000 35.6299261 - 215 3 8 1990 28.0000000 34.8133789 - 216 4 8 1990 25.0000000 34.0551034 - 217 5 8 1990 19.0000000 33.3493883 - 218 6 8 1990 22.0000000 32.6911693 - 219 7 8 1990 19.0000000 32.0759451 - 220 8 8 1990 22.0000000 31.4997070 - 221 9 8 1990 19.0000000 30.9588772 - 222 10 8 1990 20.0000000 30.4502568 - 223 11 8 1990 19.0000000 29.9709803 - 224 12 8 1990 19.0000000 29.5184764 - 225 13 8 1990 22.0000000 31.5896629 - 226 14 8 1990 36.0000000 47.4930767 - 227 15 8 1990 31.0000000 42.1625934 - 228 16 8 1990 30.0000000 38.7421476 - 229 17 8 1990 28.0000000 36.5487388 - 230 18 8 1990 34.0000000 31.5034468 - 231 19 8 1990 21.0000000 30.8310672 - 232 20 8 1990 30.0000000 30.2081701 - 233 21 8 1990 22.0000000 29.6295421 - 234 22 8 1990 21.0000000 29.0906114 - 235 23 8 1990 23.0000000 28.5873569 - 236 24 8 1990 20.0000000 28.1162327 - 237 25 8 1990 29.0000000 27.6741041 - 238 26 8 1990 20.0000000 27.3031301 - 239 27 8 1990 22.0000000 27.6813145 - 240 28 8 1990 23.0000000 26.6079853 - 241 29 8 1990 35.0000000 26.2471649 - 242 30 8 1990 51.0000000 108.7427367 - 243 31 8 1990 80.0000000 105.4518327 - 244 1 9 1990 56.0000000 56.6685271 - 245 2 9 1990 33.0000000 48.4379339 - 246 3 9 1990 27.0000000 45.7655232 - 247 4 9 1990 27.0000000 50.6297901 - 248 5 9 1990 28.0000000 50.2820458 - 249 6 9 1990 26.0000000 42.3540240 - 250 7 9 1990 24.0000000 52.5830336 - 251 8 9 1990 33.0000000 47.7374682 - 252 9 9 1990 26.0000000 41.0928343 - 253 10 9 1990 27.0000000 39.2113188 - 254 11 9 1990 22.0000000 37.5326935 - 255 12 9 1990 22.0000000 36.0295282 - 256 13 9 1990 21.0000000 34.6786935 - 257 14 9 1990 22.0000000 33.4605917 - 258 15 9 1990 22.0000000 32.3585438 - 259 16 9 1990 22.0000000 31.3582957 - 260 17 9 1990 20.0000000 30.4476178 - 261 18 9 1990 22.0000000 29.6159791 - 262 19 9 1990 16.0000000 28.8542791 - 263 20 9 1990 22.0000000 28.1546281 - 264 21 9 1990 19.0000000 38.5294894 - 265 22 9 1990 32.0000000 115.0580179 - 266 23 9 1990 27.0000000 101.0250807 - 267 24 9 1990 45.0000000 86.2568927 - 268 25 9 1990 42.0000000 69.3336062 - 269 26 9 1990 39.0000000 61.6271695 - 270 27 9 1990 30.0000000 57.2572570 - 271 28 9 1990 28.0000000 53.4794039 - 272 29 9 1990 30.0000000 50.4045337 - 273 30 9 1990 30.0000000 111.7229357 - 274 1 10 1990 56.0000000 176.6292557 - 275 2 10 1990 72.0000000 154.4140918 - 276 3 10 1990 73.0000000 158.6655987 - 277 4 10 1990 68.0000000 154.6339282 - 278 5 10 1990 53.0000000 132.4016245 - 279 6 10 1990 42.0000000 117.6230269 - 280 7 10 1990 33.0000000 106.3844716 - 281 8 10 1990 42.0000000 96.8427446 - 282 9 10 1990 34.0000000 88.5663531 - 283 10 10 1990 36.0000000 81.4284169 - 284 11 10 1990 36.0000000 75.2243659 - 285 12 10 1990 28.0000000 69.8054095 - 286 13 10 1990 32.0000000 65.0504594 - 287 14 10 1990 27.0000000 60.8602553 - 288 15 10 1990 35.0000000 57.5610588 - 289 16 10 1990 42.0000000 56.4093839 - 290 17 10 1990 35.0000000 62.8420074 - 291 18 10 1990 39.0000000 64.3180202 - 292 19 10 1990 34.0000000 55.9341366 - 293 20 10 1990 32.0000000 52.7411856 - 294 21 10 1990 34.0000000 49.8978387 - 295 22 10 1990 27.0000000 47.3565669 - 296 23 10 1990 31.0000000 45.0776920 - 297 24 10 1990 28.0000000 43.0276405 - 298 25 10 1990 25.0000000 43.1283127 - 299 26 10 1990 29.0000000 68.4948135 - 300 27 10 1990 31.0000000 84.4092896 - 301 28 10 1990 65.0000000 257.1328980 - 302 29 10 1990 69.0000000 365.5674189 - 303 30 10 1990 157.0000000 343.5538131 - 304 31 10 1990 190.0000000 278.6846365 - 305 1 11 1990 115.0000000 254.1860343 - 306 2 11 1990 104.0000000 248.6782819 - 307 3 11 1990 100.0000000 251.1993915 - 308 4 11 1990 131.0000000 236.3674702 - 309 5 11 1990 130.0000000 221.2338237 - 310 6 11 1990 115.0000000 186.9976092 - 311 7 11 1990 102.0000000 157.7022036 - 312 8 11 1990 95.0000000 137.7674405 - 313 9 11 1990 81.0000000 125.0602114 - 314 10 11 1990 66.0000000 139.1263656 - 315 11 11 1990 67.0000000 177.6885449 - 316 12 11 1990 74.0000000 200.1474930 - 317 13 11 1990 109.0000000 187.2686816 - 318 14 11 1990 92.0000000 227.1818058 - 319 15 11 1990 92.0000000 257.6519008 - 320 16 11 1990 155.0000000 240.2358180 - 321 17 11 1990 159.0000000 218.8328072 - 322 18 11 1990 131.0000000 235.6812004 - 323 19 11 1990 161.0000000 252.5571292 - 324 20 11 1990 196.0000000 398.4540457 - 325 21 11 1990 336.0000000 532.0690555 - 326 22 11 1990 566.0000000 453.8910311 - 327 23 11 1990 373.0000000 432.4891312 - 328 24 11 1990 293.0000000 378.6230568 - 329 25 11 1990 264.0000000 354.5316831 - 330 26 11 1990 226.0000000 312.3139461 - 331 27 11 1990 201.0000000 253.9862959 - 332 28 11 1990 180.0000000 213.9294926 - 333 29 11 1990 161.0000000 204.3779735 - 334 30 11 1990 149.0000000 192.8351919 - 335 1 12 1990 134.0000000 171.6910787 - 336 2 12 1990 113.0000000 155.1205182 - 337 3 12 1990 99.0000000 140.9630682 - 338 4 12 1990 107.0000000 129.1613605 - 339 5 12 1990 99.0000000 118.4891533 - 340 6 12 1990 89.0000000 109.0397877 - 341 7 12 1990 77.0000000 100.8692454 - 342 8 12 1990 71.0000000 93.7431272 - 343 9 12 1990 68.0000000 87.4986687 - 344 10 12 1990 73.0000000 82.0026947 - 345 11 12 1990 84.0000000 77.1454948 - 346 12 12 1990 88.0000000 84.4693222 - 347 13 12 1990 92.0000000 87.4458043 - 348 14 12 1990 128.0000000 81.1456003 - 349 15 12 1990 136.0000000 75.6350941 - 350 16 12 1990 114.0000000 71.1977054 - 351 17 12 1990 101.0000000 67.2848171 - 352 18 12 1990 93.0000000 63.8180581 - 353 19 12 1990 85.0000000 60.7340617 - 354 20 12 1990 81.0000000 57.9800113 - 355 21 12 1990 106.0000000 80.1254583 - 356 22 12 1990 159.0000000 108.2279907 - 357 23 12 1990 250.0000000 132.1918881 - 358 24 12 1990 298.0000000 133.0995325 - 359 25 12 1990 261.0000000 200.9029673 - 360 26 12 1990 228.0000000 396.4732762 - 361 27 12 1990 409.0000000 536.5334188 - 362 28 12 1990 486.0000000 551.3875865 - 363 29 12 1990 440.0000000 710.1776349 - 364 30 12 1990 486.0000000 918.7224699 - 365 31 12 1990 774.0000000 979.2970861 - 366 1 1 1991 889.0000000 1005.9807182 - 367 2 1 1991 863.0000000 1034.1945736 - 368 3 1 1991 875.0000000 1111.8250635 - 369 4 1 1991 932.0000000 966.9976766 - 370 5 1 1991 826.0000000 890.7508827 - 371 6 1 1991 731.0000000 823.2677130 - 372 7 1 1991 613.0000000 788.3033419 - 373 8 1 1991 610.0000000 799.0119701 - 374 9 1 1991 686.0000000 716.7662293 - 375 10 1 1991 556.0000000 793.8846563 - 376 11 1 1991 669.0000000 831.1665798 - 377 12 1 1991 828.0000000 735.6536338 - 378 13 1 1991 735.0000000 552.7316312 - 379 14 1 1991 513.0000000 417.9687560 - 380 15 1 1991 411.0000000 329.3949513 - 381 16 1 1991 345.0000000 273.3799807 - 382 17 1 1991 293.0000000 232.3362899 - 383 18 1 1991 251.0000000 200.1787983 - 384 19 1 1991 222.0000000 177.4316192 - 385 20 1 1991 215.0000000 161.4384516 - 386 21 1 1991 213.0000000 148.5727656 - 387 22 1 1991 202.0000000 141.1388077 - 388 23 1 1991 200.0000000 132.2849843 - 389 24 1 1991 192.0000000 123.1334568 - 390 25 1 1991 176.0000000 114.9237662 - 391 26 1 1991 164.0000000 107.7257439 - 392 27 1 1991 157.0000000 101.3863729 - 393 28 1 1991 134.0000000 95.7795618 - 394 29 1 1991 130.0000000 90.8008073 - 395 30 1 1991 119.0000000 86.3629856 - 396 31 1 1991 107.0000000 82.3930593 - 397 1 2 1991 112.0000000 78.8294816 - 398 2 2 1991 109.0000000 75.6201352 - 399 3 2 1991 101.0000000 72.7206845 - 400 4 2 1991 98.0000000 70.0932505 - 401 5 2 1991 84.0000000 67.7053379 - 402 6 2 1991 93.0000000 65.5289627 - 403 7 2 1991 80.0000000 63.5399373 - 404 8 2 1991 73.0000000 61.7172836 - 405 9 2 1991 89.0000000 60.0427476 - 406 10 2 1991 84.0000000 58.5003959 - 407 11 2 1991 78.0000000 57.0762801 - 408 12 2 1991 79.0000000 55.7581552 - 409 13 2 1991 77.0000000 54.5352429 - 410 14 2 1991 80.0000000 53.3980322 - 411 15 2 1991 72.0000000 52.3381100 - 412 16 2 1991 78.0000000 51.7567703 - 413 17 2 1991 74.0000000 51.6042111 - 414 18 2 1991 77.0000000 50.6255650 - 415 19 2 1991 73.0000000 60.4024149 - 416 20 2 1991 69.0000000 74.4150816 - 417 21 2 1991 74.0000000 107.4584369 - 418 22 2 1991 81.0000000 159.5604057 - 419 23 2 1991 110.0000000 199.9336534 - 420 24 2 1991 180.0000000 215.2439715 - 421 25 2 1991 213.0000000 204.4584166 - 422 26 2 1991 222.0000000 186.9381975 - 423 27 2 1991 208.0000000 184.6840885 - 424 28 2 1991 211.0000000 183.2288470 - 425 1 3 1991 214.0000000 182.9489227 - 426 2 3 1991 208.0000000 195.0172931 - 427 3 3 1991 221.0000000 187.9800017 - 428 4 3 1991 281.0000000 165.5809465 - 429 5 3 1991 219.0000000 150.7280302 - 430 6 3 1991 190.0000000 138.5415205 - 431 7 3 1991 173.0000000 128.0086525 - 432 8 3 1991 164.0000000 119.2815674 - 433 9 3 1991 142.0000000 112.7307623 - 434 10 3 1991 133.0000000 108.0294932 - 435 11 3 1991 133.0000000 103.1515261 - 436 12 3 1991 118.0000000 97.1373392 - 437 13 3 1991 127.0000000 91.6063565 - 438 14 3 1991 113.0000000 86.7072371 - 439 15 3 1991 107.0000000 82.3499052 - 440 16 3 1991 100.0000000 78.4594317 - 441 17 3 1991 100.0000000 74.9806096 - 442 18 3 1991 95.0000000 71.9237885 - 443 19 3 1991 98.0000000 139.1846344 - 444 20 3 1991 119.0000000 166.0515898 - 445 21 3 1991 159.0000000 177.9229783 - 446 22 3 1991 196.0000000 197.4770513 - 447 23 3 1991 242.0000000 177.2017097 - 448 24 3 1991 216.0000000 158.7106211 - 449 25 3 1991 180.0000000 144.4800981 - 450 26 3 1991 145.0000000 132.5132958 - 451 27 3 1991 127.0000000 122.6755443 - 452 28 3 1991 117.0000000 113.6836991 - 453 29 3 1991 109.0000000 105.7946078 - 454 30 3 1991 106.0000000 98.9218053 - 455 31 3 1991 99.0000000 92.9041332 - 456 1 4 1991 96.0000000 87.6102771 - 457 2 4 1991 88.0000000 82.9324724 - 458 3 4 1991 87.0000000 78.7816916 - 459 4 4 1991 82.0000000 75.5738669 - 460 5 4 1991 84.0000000 72.8265952 - 461 6 4 1991 67.0000000 69.7598647 - 462 7 4 1991 89.0000000 67.1988910 - 463 8 4 1991 75.0000000 64.8920241 - 464 9 4 1991 79.0000000 62.5992476 - 465 10 4 1991 70.0000000 60.4931623 - 466 11 4 1991 69.0000000 58.5777369 - 467 12 4 1991 69.0000000 56.8304987 - 468 13 4 1991 56.0000000 55.2320588 - 469 14 4 1991 63.0000000 53.7699970 - 470 15 4 1991 58.0000000 52.4294252 - 471 16 4 1991 56.0000000 51.1842762 - 472 17 4 1991 54.0000000 50.0327822 - 473 18 4 1991 57.0000000 49.0155352 - 474 19 4 1991 53.0000000 48.7536122 - 475 20 4 1991 53.0000000 48.3428871 - 476 21 4 1991 65.0000000 47.9016578 - 477 22 4 1991 69.0000000 50.1354332 - 478 23 4 1991 61.0000000 53.1468022 - 479 24 4 1991 56.0000000 50.5742961 - 480 25 4 1991 56.0000000 48.8835250 - 481 26 4 1991 53.0000000 47.7939209 - 482 27 4 1991 49.0000000 46.7901486 - 483 28 4 1991 53.0000000 45.8566308 - 484 29 4 1991 48.0000000 53.5604698 - 485 30 4 1991 57.0000000 97.5246803 - 486 1 5 1991 69.0000000 95.4515472 - 487 2 5 1991 89.0000000 76.6656287 - 488 3 5 1991 105.0000000 72.5940799 - 489 4 5 1991 79.0000000 69.0123365 - 490 5 5 1991 69.0000000 66.3708527 - 491 6 5 1991 71.0000000 64.7447726 - 492 7 5 1991 60.0000000 61.5229550 - 493 8 5 1991 64.0000000 59.1239400 - 494 9 5 1991 59.0000000 56.9959124 - 495 10 5 1991 57.0000000 58.0347853 - 496 11 5 1991 55.0000000 60.9813574 - 497 12 5 1991 53.0000000 57.4606992 - 498 13 5 1991 52.0000000 56.3360331 - 499 14 5 1991 50.0000000 55.0691886 - 500 15 5 1991 52.0000000 62.8551772 - 501 16 5 1991 54.0000000 64.3994459 - 502 17 5 1991 54.0000000 59.5940574 - 503 18 5 1991 55.0000000 57.2786860 - 504 19 5 1991 48.0000000 55.4327835 - 505 20 5 1991 48.0000000 53.7285085 - 506 21 5 1991 49.0000000 52.1507688 - 507 22 5 1991 41.0000000 50.6878127 - 508 23 5 1991 40.0000000 49.3291326 - 509 24 5 1991 40.0000000 48.0653146 - 510 25 5 1991 39.0000000 46.8879081 - 511 26 5 1991 43.0000000 45.7893140 - 512 27 5 1991 39.0000000 44.7626872 - 513 28 5 1991 36.0000000 43.8018522 - 514 29 5 1991 33.0000000 42.9012292 - 515 30 5 1991 39.0000000 42.0557696 - 516 31 5 1991 34.0000000 41.2608995 - 517 1 6 1991 37.0000000 40.5124696 - 518 2 6 1991 35.0000000 39.8067117 - 519 3 6 1991 29.0000000 39.1401995 - 520 4 6 1991 33.0000000 38.5098144 - 521 5 6 1991 34.0000000 38.3006581 - 522 6 6 1991 32.0000000 64.0755883 - 523 7 6 1991 38.0000000 70.8289408 - 524 8 6 1991 39.0000000 60.0310408 - 525 9 6 1991 41.0000000 54.8134295 - 526 10 6 1991 44.0000000 67.4738578 - 527 11 6 1991 48.0000000 56.8225207 - 528 12 6 1991 42.0000000 53.1725098 - 529 13 6 1991 37.0000000 51.2093070 - 530 14 6 1991 39.0000000 49.5375301 - 531 15 6 1991 35.0000000 48.7150584 - 532 16 6 1991 31.0000000 53.0378541 - 533 17 6 1991 33.0000000 57.7104115 - 534 18 6 1991 31.0000000 56.9505704 - 535 19 6 1991 28.0000000 55.1704816 - 536 20 6 1991 60.0000000 104.7349143 - 537 21 6 1991 48.0000000 93.9854906 - 538 22 6 1991 54.0000000 74.3829777 - 539 23 6 1991 63.0000000 81.5014098 - 540 24 6 1991 41.0000000 74.6624037 - 541 25 6 1991 42.0000000 68.2213043 - 542 26 6 1991 43.0000000 64.6252828 - 543 27 6 1991 38.0000000 67.4820952 - 544 28 6 1991 38.0000000 67.6765666 - 545 29 6 1991 35.0000000 62.7717449 - 546 30 6 1991 41.0000000 59.2361706 - 547 1 7 1991 41.0000000 56.6024910 - 548 2 7 1991 38.0000000 54.2430651 - 549 3 7 1991 34.0000000 52.1040413 - 550 4 7 1991 27.0000000 50.1594754 - 551 5 7 1991 31.0000000 48.3870150 - 552 6 7 1991 30.0000000 46.7673238 - 553 7 7 1991 26.0000000 49.7580372 - 554 8 7 1991 30.0000000 46.2339759 - 555 9 7 1991 31.0000000 44.1563104 - 556 10 7 1991 23.0000000 42.8560991 - 557 11 7 1991 35.0000000 41.6598568 - 558 12 7 1991 19.0000000 41.8102743 - 559 13 7 1991 24.0000000 67.6209902 - 560 14 7 1991 26.0000000 61.7374855 - 561 15 7 1991 27.0000000 47.1139626 - 562 16 7 1991 41.0000000 44.5348617 - 563 17 7 1991 34.0000000 43.1055357 - 564 18 7 1991 27.0000000 41.7981630 - 565 19 7 1991 25.0000000 40.5991922 - 566 20 7 1991 23.0000000 39.4968324 - 567 21 7 1991 22.0000000 38.4807896 - 568 22 7 1991 27.0000000 37.5420480 - 569 23 7 1991 23.0000000 36.6726881 - 570 24 7 1991 21.0000000 36.7283384 - 571 25 7 1991 23.0000000 50.5731526 - 572 26 7 1991 33.0000000 49.9231934 - 573 27 7 1991 23.0000000 39.2187503 - 574 28 7 1991 29.0000000 37.4947269 - 575 29 7 1991 30.0000000 36.5554520 - 576 30 7 1991 35.0000000 45.3119781 - 577 31 7 1991 27.0000000 43.2467441 - 578 1 8 1991 45.0000000 37.3322781 - 579 2 8 1991 47.0000000 36.3763189 - 580 3 8 1991 40.0000000 35.4945588 - 581 4 8 1991 35.0000000 34.6785459 - 582 5 8 1991 26.0000000 33.9215298 - 583 6 8 1991 23.0000000 33.2175754 - 584 7 8 1991 30.0000000 37.0431358 - 585 8 8 1991 33.0000000 35.6454488 - 586 9 8 1991 30.0000000 32.5760544 - 587 10 8 1991 28.0000000 31.5857354 - 588 11 8 1991 19.0000000 31.0121685 - 589 12 8 1991 20.0000000 30.4751958 - 590 13 8 1991 16.0000000 29.9713231 - 591 14 8 1991 18.0000000 29.4974489 - 592 15 8 1991 18.0000000 29.0508136 - 593 16 8 1991 20.0000000 28.6289561 - 594 17 8 1991 16.0000000 28.2296766 - 595 18 8 1991 15.0000000 27.8510053 - 596 19 8 1991 15.0000000 27.4911743 - 597 20 8 1991 14.0000000 27.1485943 - 598 21 8 1991 15.0000000 26.8218341 - 599 22 8 1991 13.0000000 26.5096027 - 600 23 8 1991 12.0000000 26.2259116 - 601 24 8 1991 11.0000000 25.9342735 - 602 25 8 1991 12.0000000 25.6581482 - 603 26 8 1991 11.0000000 25.3928571 - 604 27 8 1991 13.0000000 25.1372992 - 605 28 8 1991 11.0000000 24.8907538 - 606 29 8 1991 12.0000000 24.6525647 - 607 30 8 1991 12.0000000 24.4221332 - 608 31 8 1991 11.0000000 24.1989129 - 609 1 9 1991 11.0000000 25.4788671 - 610 2 9 1991 17.0000000 25.6402373 - 611 3 9 1991 11.0000000 23.8029331 - 612 4 9 1991 12.0000000 23.5880465 - 613 5 9 1991 11.0000000 23.3796080 - 614 6 9 1991 11.0000000 23.1771651 - 615 7 9 1991 18.0000000 22.9803059 - 616 8 9 1991 11.0000000 22.7886544 - 617 9 9 1991 13.0000000 22.6018667 - 618 10 9 1991 12.0000000 22.8813305 - 619 11 9 1991 11.0000000 49.8656776 - 620 12 9 1991 20.0000000 42.5132491 - 621 13 9 1991 21.0000000 25.3807675 - 622 14 9 1991 29.0000000 24.9449643 - 623 15 9 1991 28.0000000 24.5383343 - 624 16 9 1991 20.0000000 24.1578219 - 625 17 9 1991 20.0000000 23.8007535 - 626 18 9 1991 20.0000000 23.4647792 - 627 19 9 1991 12.0000000 23.1478275 - 628 20 9 1991 11.0000000 22.8480683 - 629 21 9 1991 11.0000000 22.5638802 - 630 22 9 1991 22.0000000 43.0636842 - 631 23 9 1991 14.0000000 40.9889565 - 632 24 9 1991 48.0000000 25.4914431 - 633 25 9 1991 45.0000000 74.0104936 - 634 26 9 1991 80.0000000 79.3096460 - 635 27 9 1991 61.0000000 64.7763189 - 636 28 9 1991 61.0000000 95.4092475 - 637 29 9 1991 65.0000000 94.8161490 - 638 30 9 1991 63.0000000 81.4922980 - 639 1 10 1991 90.0000000 67.5050068 - 640 2 10 1991 59.0000000 63.6298099 - 641 3 10 1991 45.0000000 57.3491026 - 642 4 10 1991 42.0000000 53.1240592 - 643 5 10 1991 41.0000000 112.4328897 - 644 6 10 1991 41.0000000 116.6298776 - 645 7 10 1991 73.0000000 85.8176189 - 646 8 10 1991 96.0000000 76.2454282 - 647 9 10 1991 61.0000000 69.7310383 - 648 10 10 1991 44.0000000 64.1417352 - 649 11 10 1991 42.0000000 59.4556716 - 650 12 10 1991 41.0000000 80.6165352 - 651 13 10 1991 42.0000000 81.2173584 - 652 14 10 1991 61.0000000 64.6203293 - 653 15 10 1991 55.0000000 59.9953726 - 654 16 10 1991 41.0000000 62.7789882 - 655 17 10 1991 48.0000000 83.6388328 - 656 18 10 1991 52.0000000 111.0994926 - 657 19 10 1991 66.0000000 96.3341656 - 658 20 10 1991 59.0000000 84.0140654 - 659 21 10 1991 71.0000000 76.6577218 - 660 22 10 1991 74.0000000 70.3439347 - 661 23 10 1991 70.0000000 64.9826647 - 662 24 10 1991 59.0000000 60.4137755 - 663 25 10 1991 57.0000000 56.4172827 - 664 26 10 1991 57.0000000 52.8947191 - 665 27 10 1991 51.0000000 49.7770067 - 666 28 10 1991 47.0000000 47.0087886 - 667 29 10 1991 48.0000000 44.5390982 - 668 30 10 1991 45.0000000 49.3907375 - 669 31 10 1991 43.0000000 52.6193122 - 670 1 11 1991 40.0000000 67.4676996 - 671 2 11 1991 47.0000000 73.3041916 - 672 3 11 1991 46.0000000 108.0527254 - 673 4 11 1991 76.0000000 150.5032501 - 674 5 11 1991 60.0000000 143.1935494 - 675 6 11 1991 132.0000000 130.8516546 - 676 7 11 1991 133.0000000 141.3246446 - 677 8 11 1991 113.0000000 171.1507765 - 678 9 11 1991 120.0000000 173.3746973 - 679 10 11 1991 141.0000000 150.6044697 - 680 11 11 1991 208.0000000 189.2601693 - 681 12 11 1991 166.0000000 266.7715141 - 682 13 11 1991 183.0000000 365.8699214 - 683 14 11 1991 299.0000000 537.7144837 - 684 15 11 1991 521.0000000 480.8862148 - 685 16 11 1991 443.0000000 385.9660486 - 686 17 11 1991 304.0000000 307.7424459 - 687 18 11 1991 231.0000000 297.3334289 - 688 19 11 1991 192.0000000 299.3461678 - 689 20 11 1991 199.0000000 263.6997780 - 690 21 11 1991 201.0000000 237.5285118 - 691 22 11 1991 173.0000000 198.7423320 - 692 23 11 1991 159.0000000 167.4534166 - 693 24 11 1991 160.0000000 143.8085642 - 694 25 11 1991 146.0000000 129.6570037 - 695 26 11 1991 110.0000000 119.3642744 - 696 27 11 1991 114.0000000 109.2589731 - 697 28 11 1991 97.0000000 100.7097712 - 698 29 11 1991 89.0000000 93.2358461 - 699 30 11 1991 73.0000000 86.6720218 - 700 1 12 1991 69.0000000 80.8832115 - 701 2 12 1991 67.0000000 75.7578335 - 702 3 12 1991 63.0000000 71.2031323 - 703 4 12 1991 58.0000000 67.1415416 - 704 5 12 1991 59.0000000 63.5078357 - 705 6 12 1991 53.0000000 60.2468786 - 706 7 12 1991 54.0000000 57.3118353 - 707 8 12 1991 51.0000000 54.6627384 - 708 9 12 1991 47.0000000 52.2653339 - 709 10 12 1991 42.0000000 50.0901442 - 710 11 12 1991 40.0000000 48.1117050 - 711 12 12 1991 39.0000000 46.3079392 - 712 13 12 1991 36.0000000 44.6596411 - 713 14 12 1991 37.0000000 43.1500485 - 714 15 12 1991 32.0000000 41.7644877 - 715 16 12 1991 37.0000000 48.0002163 - 716 17 12 1991 62.0000000 174.6718600 - 717 18 12 1991 118.0000000 232.6560127 - 718 19 12 1991 170.0000000 339.5763454 - 719 20 12 1991 229.0000000 476.7969108 - 720 21 12 1991 448.0000000 598.6270999 - 721 22 12 1991 464.0000000 839.8123558 - 722 23 12 1991 675.0000000 721.2993334 - 723 24 12 1991 844.0000000 578.4570486 - 724 25 12 1991 569.0000000 447.2235117 - 725 26 12 1991 358.0000000 352.8488409 - 726 27 12 1991 279.0000000 287.8504432 - 727 28 12 1991 238.0000000 239.1254594 - 728 29 12 1991 201.0000000 200.7165068 - 729 30 12 1991 185.0000000 170.4903690 - 730 31 12 1991 165.0000000 148.1789881 - 731 1 1 1992 140.0000000 134.6497262 - 732 2 1 1992 126.0000000 123.7057906 - 733 3 1 1992 117.0000000 114.4257037 - 734 4 1 1992 114.0000000 108.8389648 - 735 5 1 1992 108.0000000 103.2546376 - 736 6 1 1992 108.0000000 96.5216849 - 737 7 1 1992 101.0000000 90.1825177 - 738 8 1 1992 97.0000000 87.7281423 - 739 9 1 1992 89.0000000 104.4808704 - 740 10 1 1992 111.0000000 143.6085137 - 741 11 1 1992 135.0000000 143.9844373 - 742 12 1 1992 171.0000000 127.0589631 - 743 13 1 1992 125.0000000 116.4118569 - 744 14 1 1992 111.0000000 107.2516867 - 745 15 1 1992 100.0000000 99.3437122 - 746 16 1 1992 87.0000000 92.4685995 - 747 17 1 1992 75.0000000 86.4170722 - 748 18 1 1992 79.0000000 81.1144809 - 749 19 1 1992 70.0000000 80.8321924 - 750 20 1 1992 72.0000000 78.3831492 - 751 21 1 1992 87.0000000 73.7508962 - 752 22 1 1992 79.0000000 69.6509667 - 753 23 1 1992 71.0000000 66.1371596 - 754 24 1 1992 66.0000000 62.9977743 - 755 25 1 1992 67.0000000 60.1830047 - 756 26 1 1992 65.0000000 57.6507965 - 757 27 1 1992 59.0000000 55.3654646 - 758 28 1 1992 57.0000000 53.3113985 - 759 29 1 1992 54.0000000 52.5635479 - 760 30 1 1992 59.0000000 55.8287101 - 761 31 1 1992 57.0000000 61.2260076 - 762 1 2 1992 56.0000000 65.4633093 - 763 2 2 1992 54.0000000 63.5776079 - 764 3 2 1992 58.0000000 59.9986038 - 765 4 2 1992 63.0000000 137.0343621 - 766 5 2 1992 76.0000000 208.4203931 - 767 6 2 1992 250.0000000 222.4118153 - 768 7 2 1992 346.0000000 190.3812138 - 769 8 2 1992 241.0000000 168.1664599 - 770 9 2 1992 180.0000000 176.0591248 - 771 10 2 1992 164.0000000 191.0982238 - 772 11 2 1992 183.0000000 207.9567229 - 773 12 2 1992 215.0000000 246.1872101 - 774 13 2 1992 265.0000000 254.0957379 - 775 14 2 1992 287.0000000 263.9077207 - 776 15 2 1992 272.0000000 258.7080554 - 777 16 2 1992 253.0000000 277.7501786 - 778 17 2 1992 301.0000000 247.9542041 - 779 18 2 1992 275.0000000 206.6237268 - 780 19 2 1992 224.0000000 176.4159137 - 781 20 2 1992 194.0000000 157.0981481 - 782 21 2 1992 173.0000000 144.3296857 - 783 22 2 1992 157.0000000 132.6980372 - 784 23 2 1992 142.0000000 124.9075926 - 785 24 2 1992 133.0000000 117.8556198 - 786 25 2 1992 128.0000000 112.1916488 - 787 26 2 1992 125.0000000 104.6229053 - 788 27 2 1992 125.0000000 97.8087874 - 789 28 2 1992 110.0000000 91.7268276 - 790 29 2 1992 107.0000000 86.4081101 - 791 1 3 1992 97.0000000 81.9997009 - 792 2 3 1992 97.0000000 81.5860206 - 793 3 3 1992 86.0000000 86.2695570 - 794 4 3 1992 93.0000000 79.9999370 - 795 5 3 1992 86.0000000 76.0502186 - 796 6 3 1992 82.0000000 72.5073767 - 797 7 3 1992 80.0000000 69.1754328 - 798 8 3 1992 77.0000000 66.1636011 - 799 9 3 1992 73.0000000 63.4368011 - 800 10 3 1992 76.0000000 61.2924809 - 801 11 3 1992 68.0000000 59.7866677 - 802 12 3 1992 70.0000000 130.9123163 - 803 13 3 1992 116.0000000 234.6454043 - 804 14 3 1992 206.0000000 326.9975640 - 805 15 3 1992 433.0000000 419.4191279 - 806 16 3 1992 495.0000000 445.9867922 - 807 17 3 1992 331.0000000 351.4959710 - 808 18 3 1992 240.0000000 281.6242021 - 809 19 3 1992 215.0000000 233.2819935 - 810 20 3 1992 185.0000000 197.6671326 - 811 21 3 1992 185.0000000 179.0982850 - 812 22 3 1992 185.0000000 247.3844370 - 813 23 3 1992 213.0000000 384.7298551 - 814 24 3 1992 466.0000000 422.0888756 - 815 25 3 1992 580.0000000 423.9287747 - 816 26 3 1992 566.0000000 374.9185514 - 817 27 3 1992 487.0000000 324.8497756 - 818 28 3 1992 387.0000000 283.7170805 - 819 29 3 1992 311.0000000 243.7765095 - 820 30 3 1992 270.0000000 216.0271099 - 821 31 3 1992 246.0000000 221.5810584 - 822 1 4 1992 229.0000000 250.1563635 - 823 2 4 1992 222.0000000 240.0934041 - 824 3 4 1992 217.0000000 259.2762055 - 825 4 4 1992 208.0000000 338.1056482 - 826 5 4 1992 220.0000000 314.5961500 - 827 6 4 1992 210.0000000 260.7010414 - 828 7 4 1992 190.0000000 217.3580663 - 829 8 4 1992 173.0000000 184.2611497 - 830 9 4 1992 166.0000000 157.5397233 - 831 10 4 1992 133.0000000 136.4075474 - 832 11 4 1992 126.0000000 123.5730901 - 833 12 4 1992 124.0000000 115.3756144 - 834 13 4 1992 116.0000000 108.4047192 - 835 14 4 1992 112.0000000 112.3791012 - 836 15 4 1992 111.0000000 153.8322402 - 837 16 4 1992 137.0000000 166.5290272 - 838 17 4 1992 206.0000000 156.7471044 - 839 18 4 1992 176.0000000 155.2997074 - 840 19 4 1992 161.0000000 140.4604754 - 841 20 4 1992 161.0000000 129.5955310 - 842 21 4 1992 139.0000000 120.3294817 - 843 22 4 1992 139.0000000 112.2662849 - 844 23 4 1992 123.0000000 105.2447001 - 845 24 4 1992 119.0000000 99.0075050 - 846 25 4 1992 111.0000000 93.4854413 - 847 26 4 1992 94.0000000 88.6310886 - 848 27 4 1992 94.0000000 87.7366473 - 849 28 4 1992 102.0000000 91.2741876 - 850 29 4 1992 120.0000000 92.6220626 - 851 30 4 1992 120.0000000 86.2869765 - 852 1 5 1992 114.0000000 114.4539223 - 853 2 5 1992 115.0000000 134.0261516 - 854 3 5 1992 206.0000000 114.8436125 - 855 4 5 1992 215.0000000 106.9096958 - 856 5 5 1992 125.0000000 100.4245358 - 857 6 5 1992 123.0000000 94.7007619 - 858 7 5 1992 113.0000000 89.6257293 - 859 8 5 1992 77.0000000 85.1066626 - 860 9 5 1992 83.0000000 81.1519958 - 861 10 5 1992 83.0000000 87.0412606 - 862 11 5 1992 96.0000000 85.6274609 - 863 12 5 1992 120.0000000 76.9063028 - 864 13 5 1992 80.0000000 73.0594242 - 865 14 5 1992 76.0000000 70.1389708 - 866 15 5 1992 69.0000000 67.4968607 - 867 16 5 1992 63.0000000 65.0991593 - 868 17 5 1992 61.0000000 62.9168030 - 869 18 5 1992 60.0000000 60.9247918 - 870 19 5 1992 59.0000000 59.1015330 - 871 20 5 1992 67.0000000 57.4283054 - 872 21 5 1992 51.0000000 55.8888188 - 873 22 5 1992 44.0000000 54.4688507 - 874 23 5 1992 42.0000000 53.1559436 - 875 24 5 1992 51.0000000 52.0407899 - 876 25 5 1992 42.0000000 51.2423074 - 877 26 5 1992 54.0000000 67.1549960 - 878 27 5 1992 53.0000000 57.4989388 - 879 28 5 1992 59.0000000 51.9276334 - 880 29 5 1992 55.0000000 61.9184033 - 881 30 5 1992 54.0000000 62.3493736 - 882 31 5 1992 48.0000000 55.4443280 - 883 1 6 1992 63.0000000 56.7246470 - 884 2 6 1992 61.0000000 55.8246406 - 885 3 6 1992 55.0000000 57.5944172 - 886 4 6 1992 75.0000000 76.0198272 - 887 5 6 1992 53.0000000 100.7145580 - 888 6 6 1992 77.0000000 96.4063481 - 889 7 6 1992 114.0000000 91.5911349 - 890 8 6 1992 167.0000000 109.7934732 - 891 9 6 1992 116.0000000 97.3927202 - 892 10 6 1992 91.0000000 85.5220770 - 893 11 6 1992 85.0000000 80.6097255 - 894 12 6 1992 68.0000000 76.2650967 - 895 13 6 1992 71.0000000 72.4187075 - 896 14 6 1992 63.0000000 68.9897008 - 897 15 6 1992 59.0000000 65.9211010 - 898 16 6 1992 46.0000000 63.1650882 - 899 17 6 1992 44.0000000 60.6813051 - 900 18 6 1992 39.0000000 58.4355164 - 901 19 6 1992 41.0000000 56.4038188 - 902 20 6 1992 44.0000000 57.8359456 - 903 21 6 1992 39.0000000 55.5821835 - 904 22 6 1992 32.0000000 52.6879317 - 905 23 6 1992 40.0000000 53.2452027 - 906 24 6 1992 41.0000000 66.5388788 - 907 25 6 1992 42.0000000 61.4486590 - 908 26 6 1992 42.0000000 54.5706942 - 909 27 6 1992 48.0000000 52.0591733 - 910 28 6 1992 37.0000000 50.3799540 - 911 29 6 1992 40.0000000 48.8621166 - 912 30 6 1992 29.0000000 47.5745859 - 913 1 7 1992 30.0000000 46.6332776 - 914 2 7 1992 36.0000000 45.2947476 - 915 3 7 1992 29.0000000 50.2287688 - 916 4 7 1992 36.0000000 58.8456227 - 917 5 7 1992 50.0000000 69.4694471 - 918 6 7 1992 78.0000000 79.7035548 - 919 7 7 1992 54.0000000 63.4516264 - 920 8 7 1992 57.0000000 54.5635442 - 921 9 7 1992 51.0000000 52.5742604 - 922 10 7 1992 47.0000000 67.4056999 - 923 11 7 1992 46.0000000 92.1590625 - 924 12 7 1992 76.0000000 87.3961502 - 925 13 7 1992 72.0000000 73.4521348 - 926 14 7 1992 67.0000000 65.3532714 - 927 15 7 1992 63.0000000 62.1318330 - 928 16 7 1992 47.0000000 59.2646610 - 929 17 7 1992 47.0000000 56.7021281 - 930 18 7 1992 42.0000000 54.4028571 - 931 19 7 1992 41.0000000 52.3321322 - 932 20 7 1992 39.0000000 50.4606575 - 933 21 7 1992 37.0000000 49.4298585 - 934 22 7 1992 33.0000000 47.6751456 - 935 23 7 1992 33.0000000 46.1391098 - 936 24 7 1992 33.0000000 44.8297248 - 937 25 7 1992 37.0000000 43.6260258 - 938 26 7 1992 26.0000000 42.5171055 - 939 27 7 1992 24.0000000 41.4938655 - 940 28 7 1992 26.0000000 40.5472577 - 941 29 7 1992 29.0000000 39.6693538 - 942 30 7 1992 19.0000000 38.8531852 - 943 31 7 1992 22.0000000 39.2970461 - 944 1 8 1992 28.0000000 38.7652060 - 945 2 8 1992 35.0000000 37.0919408 - 946 3 8 1992 29.0000000 36.4339764 - 947 4 8 1992 36.0000000 35.8169786 - 948 5 8 1992 52.0000000 35.2371362 - 949 6 8 1992 74.0000000 34.6910191 - 950 7 8 1992 54.0000000 34.1755675 - 951 8 8 1992 57.0000000 33.6880467 - 952 9 8 1992 48.0000000 35.0553614 - 953 10 8 1992 47.0000000 34.1554649 - 954 11 8 1992 46.0000000 47.1623391 - 955 12 8 1992 75.0000000 47.2017200 - 956 13 8 1992 73.0000000 47.0035716 - 957 14 8 1992 66.0000000 45.7942532 - 958 15 8 1992 60.0000000 39.4000991 - 959 16 8 1992 47.0000000 35.9167096 - 960 17 8 1992 46.0000000 35.1058658 - 961 18 8 1992 42.0000000 34.3619881 - 962 19 8 1992 41.0000000 33.7197673 - 963 20 8 1992 40.0000000 38.2447772 - 964 21 8 1992 37.0000000 34.1838769 - 965 22 8 1992 32.0000000 35.8013871 - 966 23 8 1992 32.0000000 35.9663706 - 967 24 8 1992 32.0000000 32.5194007 - 968 25 8 1992 36.0000000 31.9256833 - 969 26 8 1992 27.0000000 31.3744673 - 970 27 8 1992 25.0000000 30.8609625 - 971 28 8 1992 25.0000000 30.6782768 - 972 29 8 1992 28.0000000 35.1566301 - 973 30 8 1992 20.0000000 48.1295882 - 974 31 8 1992 22.0000000 99.1454946 - 975 1 9 1992 49.0000000 89.4273895 - 976 2 9 1992 77.0000000 78.8514920 - 977 3 9 1992 67.0000000 74.2183048 - 978 4 9 1992 45.0000000 73.7761904 - 979 5 9 1992 44.0000000 63.3996216 - 980 6 9 1992 64.0000000 55.0574471 - 981 7 9 1992 52.0000000 52.2491216 - 982 8 9 1992 40.0000000 49.1963822 - 983 9 9 1992 30.0000000 46.7321351 - 984 10 9 1992 34.0000000 44.5488688 - 985 11 9 1992 32.0000000 46.9050721 - 986 12 9 1992 36.0000000 47.5720832 - 987 13 9 1992 28.0000000 42.0952571 - 988 14 9 1992 33.0000000 41.0928614 - 989 15 9 1992 35.0000000 39.3934626 - 990 16 9 1992 30.0000000 37.9740041 - 991 17 9 1992 32.0000000 36.6887213 - 992 18 9 1992 29.0000000 35.5265434 - 993 19 9 1992 30.0000000 34.4760464 - 994 20 9 1992 28.0000000 33.5126696 - 995 21 9 1992 29.0000000 32.6304559 - 996 22 9 1992 29.0000000 31.8213257 - 997 23 9 1992 27.0000000 31.0770440 - 998 24 9 1992 27.0000000 30.3904521 - 999 25 9 1992 23.0000000 29.7553082 - 1000 26 9 1992 28.0000000 29.1661540 - 1001 27 9 1992 25.0000000 28.6182033 - 1002 28 9 1992 25.0000000 29.1192883 - 1003 29 9 1992 27.0000000 29.6371130 - 1004 30 9 1992 25.0000000 27.5116350 - 1005 1 10 1992 27.0000000 27.0886161 - 1006 2 10 1992 33.0000000 28.8557450 - 1007 3 10 1992 29.0000000 28.8292123 - 1008 4 10 1992 31.0000000 26.7087692 - 1009 5 10 1992 25.0000000 33.8407511 - 1010 6 10 1992 25.0000000 47.1014664 - 1011 7 10 1992 36.0000000 34.9418244 - 1012 8 10 1992 42.0000000 28.7780053 - 1013 9 10 1992 43.0000000 32.1607648 - 1014 10 10 1992 26.0000000 39.1955914 - 1015 11 10 1992 27.0000000 34.3268803 - 1016 12 10 1992 27.0000000 29.3491877 - 1017 13 10 1992 26.0000000 28.6453341 - 1018 14 10 1992 26.0000000 29.4529184 - 1019 15 10 1992 23.0000000 48.5658256 - 1020 16 10 1992 21.0000000 43.0707829 - 1021 17 10 1992 26.0000000 36.7749638 - 1022 18 10 1992 34.0000000 36.1590583 - 1023 19 10 1992 37.0000000 32.4865405 - 1024 20 10 1992 31.0000000 45.8076103 - 1025 21 10 1992 31.0000000 49.1808271 - 1026 22 10 1992 35.0000000 45.3347289 - 1027 23 10 1992 33.0000000 73.7867482 - 1028 24 10 1992 40.0000000 141.0993787 - 1029 25 10 1992 74.0000000 204.5329557 - 1030 26 10 1992 161.0000000 185.8931102 - 1031 27 10 1992 285.0000000 207.2990276 - 1032 28 10 1992 244.0000000 239.6470335 - 1033 29 10 1992 263.0000000 249.1922523 - 1034 30 10 1992 276.0000000 203.8750802 - 1035 31 10 1992 186.0000000 169.1922551 - 1036 1 11 1992 154.0000000 146.3104364 - 1037 2 11 1992 112.0000000 163.9607666 - 1038 3 11 1992 104.0000000 169.5522428 - 1039 4 11 1992 96.0000000 155.9148166 - 1040 5 11 1992 99.0000000 136.8923527 - 1041 6 11 1992 126.0000000 122.4856063 - 1042 7 11 1992 91.0000000 114.0556316 - 1043 8 11 1992 84.0000000 107.3802637 - 1044 9 11 1992 81.0000000 114.2075751 - 1045 10 11 1992 85.0000000 164.1522601 - 1046 11 11 1992 126.0000000 260.4316473 - 1047 12 11 1992 279.0000000 323.8775257 - 1048 13 11 1992 390.0000000 332.4700399 - 1049 14 11 1992 294.0000000 328.1461748 - 1050 15 11 1992 260.0000000 428.9676853 - 1051 16 11 1992 398.0000000 643.9879120 - 1052 17 11 1992 520.0000000 616.2018268 - 1053 18 11 1992 487.0000000 554.1012785 - 1054 19 11 1992 380.0000000 547.5514824 - 1055 20 11 1992 385.0000000 448.9912582 - 1056 21 11 1992 351.0000000 486.7436264 - 1057 22 11 1992 309.0000000 582.4161524 - 1058 23 11 1992 587.0000000 442.9160174 - 1059 24 11 1992 661.0000000 354.9341245 - 1060 25 11 1992 447.0000000 352.4867314 - 1061 26 11 1992 361.0000000 374.2570929 - 1062 27 11 1992 351.0000000 344.5811595 - 1063 28 11 1992 353.0000000 381.6660787 - 1064 29 11 1992 369.0000000 490.4385361 - 1065 30 11 1992 452.0000000 461.6838977 - 1066 1 12 1992 441.0000000 354.2700620 - 1067 2 12 1992 348.0000000 388.4427344 - 1068 3 12 1992 394.0000000 442.8435994 - 1069 4 12 1992 455.0000000 494.8340186 - 1070 5 12 1992 491.0000000 552.3351547 - 1071 6 12 1992 469.0000000 461.0194457 - 1072 7 12 1992 364.0000000 437.3827905 - 1073 8 12 1992 338.0000000 384.9981736 - 1074 9 12 1992 334.0000000 308.5937716 - 1075 10 12 1992 268.0000000 253.2951977 - 1076 11 12 1992 236.0000000 249.6429601 - 1077 12 12 1992 230.0000000 255.4788313 - 1078 13 12 1992 239.0000000 234.3644992 - 1079 14 12 1992 256.0000000 206.3388612 - 1080 15 12 1992 217.0000000 187.8358658 - 1081 16 12 1992 201.0000000 173.7950661 - 1082 17 12 1992 188.0000000 160.8062231 - 1083 18 12 1992 176.0000000 149.4067614 - 1084 19 12 1992 170.0000000 139.0236716 - 1085 20 12 1992 168.0000000 134.5465162 - 1086 21 12 1992 131.0000000 140.8557449 - 1087 22 12 1992 133.0000000 142.9514668 - 1088 23 12 1992 134.0000000 129.9548808 - 1089 24 12 1992 127.0000000 119.6037668 - 1090 25 12 1992 117.0000000 110.9793044 - 1091 26 12 1992 113.0000000 103.4559065 - 1092 27 12 1992 100.0000000 96.8597427 - 1093 28 12 1992 94.0000000 91.0499588 - 1094 29 12 1992 87.0000000 85.9108096 - 1095 30 12 1992 86.0000000 81.3465333 - 1096 31 12 1992 81.0000000 77.2773995 - 1097 1 1 1993 77.0000000 73.6366336 - 1098 2 1 1993 76.0000000 70.3680042 - 1099 3 1 1993 61.0000000 67.4239150 - 1100 4 1 1993 61.0000000 64.7638849 - 1101 5 1 1993 57.0000000 62.3533287 - 1102 6 1 1993 66.0000000 75.8438651 - 1103 7 1 1993 67.0000000 91.0880407 - 1104 8 1 1993 84.0000000 93.2879754 - 1105 9 1 1993 90.0000000 95.9626158 - 1106 10 1 1993 113.0000000 143.6343803 - 1107 11 1 1993 265.0000000 379.8955027 - 1108 12 1 1993 559.0000000 588.6107208 - 1109 13 1 1993 832.0000000 551.1637721 - 1110 14 1 1993 601.0000000 436.4363963 - 1111 15 1 1993 436.0000000 333.7961189 - 1112 16 1 1993 339.0000000 269.7016173 - 1113 17 1 1993 292.0000000 232.9282879 - 1114 18 1 1993 247.0000000 207.8288144 - 1115 19 1 1993 218.0000000 184.8429179 - 1116 20 1 1993 205.0000000 165.6154384 - 1117 21 1 1993 190.0000000 151.7218523 - 1118 22 1 1993 176.0000000 141.7718048 - 1119 23 1 1993 173.0000000 132.4960188 - 1120 24 1 1993 173.0000000 187.2535372 - 1121 25 1 1993 199.0000000 259.5150402 - 1122 26 1 1993 361.0000000 217.4881695 - 1123 27 1 1993 295.0000000 229.5929823 - 1124 28 1 1993 238.0000000 253.3569352 - 1125 29 1 1993 263.0000000 232.9905194 - 1126 30 1 1993 245.0000000 206.8379553 - 1127 31 1 1993 222.0000000 179.9382689 - 1128 1 2 1993 199.0000000 157.7913505 - 1129 2 2 1993 186.0000000 141.3136027 - 1130 3 2 1993 171.0000000 130.2477661 - 1131 4 2 1993 157.0000000 120.8687833 - 1132 5 2 1993 159.0000000 112.7788358 - 1133 6 2 1993 129.0000000 105.6557266 - 1134 7 2 1993 119.0000000 99.7378939 - 1135 8 2 1993 119.0000000 94.2709407 - 1136 9 2 1993 105.0000000 89.1293521 - 1137 10 2 1993 106.0000000 84.5925897 - 1138 11 2 1993 105.0000000 80.5310554 - 1139 12 2 1993 95.0000000 76.8827993 - 1140 13 2 1993 91.0000000 73.5953385 - 1141 14 2 1993 88.0000000 70.6239955 - 1142 15 2 1993 84.0000000 67.9305650 - 1143 16 2 1993 83.0000000 65.6706600 - 1144 17 2 1993 79.0000000 68.1056113 - 1145 18 2 1993 78.0000000 69.4624196 - 1146 19 2 1993 84.0000000 67.8175779 - 1147 20 2 1993 91.0000000 79.4483142 - 1148 21 2 1993 91.0000000 87.0348303 - 1149 22 2 1993 90.0000000 87.4928397 - 1150 23 2 1993 103.0000000 81.1810594 - 1151 24 2 1993 94.0000000 76.5282052 - 1152 25 2 1993 81.0000000 72.6878162 - 1153 26 2 1993 78.0000000 69.2815699 - 1154 27 2 1993 75.0000000 73.0586067 - 1155 28 2 1993 76.0000000 71.7098046 - 1156 1 3 1993 80.0000000 68.9372023 - 1157 2 3 1993 75.0000000 72.6853902 - 1158 3 3 1993 76.0000000 70.8458852 - 1159 4 3 1993 72.0000000 66.8767595 - 1160 5 3 1993 65.0000000 64.2443670 - 1161 6 3 1993 64.0000000 64.4306848 - 1162 7 3 1993 64.0000000 64.1979282 - 1163 8 3 1993 68.0000000 62.4027007 - 1164 9 3 1993 68.0000000 59.9167413 - 1165 10 3 1993 67.0000000 59.5047974 - 1166 11 3 1993 61.0000000 60.3288027 - 1167 12 3 1993 57.0000000 61.1862891 - 1168 13 3 1993 58.0000000 63.0885571 - 1169 14 3 1993 54.0000000 63.3727372 - 1170 15 3 1993 66.0000000 60.6412377 - 1171 16 3 1993 54.0000000 58.5330516 - 1172 17 3 1993 57.0000000 56.7164478 - 1173 18 3 1993 57.0000000 55.0411549 - 1174 19 3 1993 52.0000000 53.4878955 - 1175 20 3 1993 57.0000000 52.0491406 - 1176 21 3 1993 58.0000000 51.3988095 - 1177 22 3 1993 57.0000000 65.9767251 - 1178 23 3 1993 56.0000000 71.1507393 - 1179 24 3 1993 63.0000000 63.7067356 - 1180 25 3 1993 76.0000000 61.2334356 - 1181 26 3 1993 56.0000000 58.9836330 - 1182 27 3 1993 59.0000000 56.9317033 - 1183 28 3 1993 59.0000000 55.0554776 - 1184 29 3 1993 54.0000000 53.3357003 - 1185 30 3 1993 48.0000000 51.7561779 - 1186 31 3 1993 55.0000000 50.3038820 - 1187 1 4 1993 48.0000000 50.6557507 - 1188 2 4 1993 53.0000000 54.3301527 - 1189 3 4 1993 47.0000000 54.0839854 - 1190 4 4 1993 59.0000000 71.7517276 - 1191 5 4 1993 53.0000000 101.1595739 - 1192 6 4 1993 64.0000000 100.9832534 - 1193 7 4 1993 63.0000000 89.0166781 - 1194 8 4 1993 75.0000000 84.3773023 - 1195 9 4 1993 64.0000000 79.5080535 - 1196 10 4 1993 59.0000000 80.6796741 - 1197 11 4 1993 60.0000000 85.3180684 - 1198 12 4 1993 63.0000000 82.4525180 - 1199 13 4 1993 69.0000000 80.8793945 - 1200 14 4 1993 79.0000000 80.5492908 - 1201 15 4 1993 82.0000000 75.9205348 - 1202 16 4 1993 68.0000000 72.5883776 - 1203 17 4 1993 56.0000000 69.5635113 - 1204 18 4 1993 59.0000000 67.2186260 - 1205 19 4 1993 61.0000000 63.9439585 - 1206 20 4 1993 62.0000000 61.2073381 - 1207 21 4 1993 57.0000000 58.7330279 - 1208 22 4 1993 53.0000000 56.4897477 - 1209 23 4 1993 47.0000000 54.4495872 - 1210 24 4 1993 46.0000000 52.5889096 - 1211 25 4 1993 47.0000000 50.8878410 - 1212 26 4 1993 45.0000000 49.3287858 - 1213 27 4 1993 43.0000000 47.8964180 - 1214 28 4 1993 41.0000000 46.5787320 - 1215 29 4 1993 38.0000000 45.3676312 - 1216 30 4 1993 39.0000000 44.7213429 - 1217 1 5 1993 40.0000000 43.8943141 - 1218 2 5 1993 41.0000000 43.9695502 - 1219 3 5 1993 45.0000000 42.8984196 - 1220 4 5 1993 49.0000000 41.7182380 - 1221 5 5 1993 40.0000000 40.8355917 - 1222 6 5 1993 43.0000000 40.5896617 - 1223 7 5 1993 38.0000000 40.9994552 - 1224 8 5 1993 38.0000000 40.4640137 - 1225 9 5 1993 43.0000000 39.9651387 - 1226 10 5 1993 44.0000000 39.2922322 - 1227 11 5 1993 41.0000000 39.0729895 - 1228 12 5 1993 51.0000000 49.5967566 - 1229 13 5 1993 63.0000000 92.4848596 - 1230 14 5 1993 68.0000000 68.8374172 - 1231 15 5 1993 77.0000000 60.4436432 - 1232 16 5 1993 77.0000000 57.0459629 - 1233 17 5 1993 59.0000000 52.7669410 - 1234 18 5 1993 49.0000000 50.2850665 - 1235 19 5 1993 43.0000000 54.3758811 - 1236 20 5 1993 44.0000000 65.1597844 - 1237 21 5 1993 48.0000000 59.5474015 - 1238 22 5 1993 44.0000000 52.0858046 - 1239 23 5 1993 46.0000000 49.8297801 - 1240 24 5 1993 40.0000000 47.8187040 - 1241 25 5 1993 43.0000000 46.0177598 - 1242 26 5 1993 30.0000000 44.9293625 - 1243 27 5 1993 45.0000000 52.5230211 - 1244 28 5 1993 43.0000000 54.3208239 - 1245 29 5 1993 44.0000000 50.7661486 - 1246 30 5 1993 54.0000000 49.1768171 - 1247 31 5 1993 56.0000000 46.6983640 - 1248 1 6 1993 44.0000000 44.6596002 - 1249 2 6 1993 43.0000000 44.1569979 - 1250 3 6 1993 33.0000000 45.9308330 - 1251 4 6 1993 45.0000000 42.4585542 - 1252 5 6 1993 46.0000000 41.1372286 - 1253 6 6 1993 42.0000000 39.9332710 - 1254 7 6 1993 40.0000000 38.8311868 - 1255 8 6 1993 30.0000000 37.8194517 - 1256 9 6 1993 31.0000000 36.9413737 - 1257 10 6 1993 32.0000000 36.1136977 - 1258 11 6 1993 25.0000000 36.0907706 - 1259 12 6 1993 33.0000000 36.5931876 - 1260 13 6 1993 29.0000000 34.5482111 - 1261 14 6 1993 40.0000000 35.2473303 - 1262 15 6 1993 42.0000000 39.4175643 - 1263 16 6 1993 37.0000000 38.9927332 - 1264 17 6 1993 46.0000000 34.4058682 - 1265 18 6 1993 47.0000000 33.6644652 - 1266 19 6 1993 50.0000000 35.1085613 - 1267 20 6 1993 43.0000000 56.9785499 - 1268 21 6 1993 69.0000000 48.6026698 - 1269 22 6 1993 61.0000000 57.0845561 - 1270 23 6 1993 67.0000000 61.3596633 - 1271 24 6 1993 77.0000000 45.7325492 - 1272 25 6 1993 87.0000000 43.9062297 - 1273 26 6 1993 55.0000000 42.2588353 - 1274 27 6 1993 43.0000000 40.7659789 - 1275 28 6 1993 40.0000000 39.4087522 - 1276 29 6 1993 30.0000000 38.1710089 - 1277 30 6 1993 40.0000000 37.0388941 - 1278 1 7 1993 40.0000000 38.2140343 - 1279 2 7 1993 27.0000000 37.6830412 - 1280 3 7 1993 34.0000000 35.2646160 - 1281 4 7 1993 30.0000000 34.3332547 - 1282 5 7 1993 31.0000000 33.6346454 - 1283 6 7 1993 27.0000000 32.7143192 - 1284 7 7 1993 31.0000000 31.9814246 - 1285 8 7 1993 26.0000000 31.3018403 - 1286 9 7 1993 23.0000000 31.3681646 - 1287 10 7 1993 24.0000000 32.4270963 - 1288 11 7 1993 25.0000000 35.7277478 - 1289 12 7 1993 34.0000000 50.9711077 - 1290 13 7 1993 40.0000000 48.5380293 - 1291 14 7 1993 41.0000000 77.7695582 - 1292 15 7 1993 46.0000000 58.3865996 - 1293 16 7 1993 39.0000000 43.5591067 - 1294 17 7 1993 43.0000000 41.9925813 - 1295 18 7 1993 35.0000000 40.4503017 - 1296 19 7 1993 49.0000000 56.2582729 - 1297 20 7 1993 38.0000000 54.7594240 - 1298 21 7 1993 41.0000000 51.7328043 - 1299 22 7 1993 45.0000000 49.3892832 - 1300 23 7 1993 41.0000000 42.6997324 - 1301 24 7 1993 42.0000000 40.9765265 - 1302 25 7 1993 40.0000000 39.4245435 - 1303 26 7 1993 35.0000000 38.0086744 - 1304 27 7 1993 40.0000000 57.3786775 - 1305 28 7 1993 40.0000000 48.9382680 - 1306 29 7 1993 36.0000000 39.6513583 - 1307 30 7 1993 40.0000000 86.2807330 - 1308 31 7 1993 61.0000000 69.8589615 - 1309 1 8 1993 36.0000000 49.5185633 - 1310 2 8 1993 46.0000000 46.8318237 - 1311 3 8 1993 32.0000000 44.4493851 - 1312 4 8 1993 38.0000000 42.3284343 - 1313 5 8 1993 32.0000000 40.4331971 - 1314 6 8 1993 25.0000000 38.7336116 - 1315 7 8 1993 26.0000000 37.2042839 - 1316 8 8 1993 29.0000000 35.8236600 - 1317 9 8 1993 29.0000000 41.3728183 - 1318 10 8 1993 28.0000000 44.6472123 - 1319 11 8 1993 37.0000000 38.0813582 - 1320 12 8 1993 40.0000000 34.5375534 - 1321 13 8 1993 49.0000000 33.3992753 - 1322 14 8 1993 32.0000000 33.9139688 - 1323 15 8 1993 37.0000000 33.0468562 - 1324 16 8 1993 37.0000000 31.2863647 - 1325 17 8 1993 27.0000000 30.4117899 - 1326 18 8 1993 24.0000000 29.6087863 - 1327 19 8 1993 24.0000000 28.8695555 - 1328 20 8 1993 22.0000000 28.1872847 - 1329 21 8 1993 21.0000000 27.5560050 - 1330 22 8 1993 16.0000000 28.5460006 - 1331 23 8 1993 21.0000000 29.9120688 - 1332 24 8 1993 27.0000000 26.8240628 - 1333 25 8 1993 26.0000000 26.1925377 - 1334 26 8 1993 23.0000000 25.7536894 - 1335 27 8 1993 21.0000000 30.5484042 - 1336 28 8 1993 28.0000000 30.7529793 - 1337 29 8 1993 17.0000000 25.9731131 - 1338 30 8 1993 24.0000000 25.4801297 - 1339 31 8 1993 25.0000000 25.0176095 - 1340 1 9 1993 25.0000000 24.5828659 - 1341 2 9 1993 19.0000000 24.1734872 - 1342 3 9 1993 17.0000000 27.5444165 - 1343 4 9 1993 16.0000000 32.2511454 - 1344 5 9 1993 19.0000000 26.8446814 - 1345 6 9 1993 23.0000000 24.7108155 - 1346 7 9 1993 25.0000000 47.3704588 - 1347 8 9 1993 34.0000000 39.8027647 - 1348 9 9 1993 31.0000000 49.9235441 - 1349 10 9 1993 35.0000000 83.1606927 - 1350 11 9 1993 53.0000000 110.3447087 - 1351 12 9 1993 71.0000000 104.5628167 - 1352 13 9 1993 74.0000000 150.2564626 - 1353 14 9 1993 87.0000000 165.6010894 - 1354 15 9 1993 173.0000000 162.4880245 - 1355 16 9 1993 117.0000000 134.7844066 - 1356 17 9 1993 93.0000000 115.2742832 - 1357 18 9 1993 77.0000000 103.6843797 - 1358 19 9 1993 62.0000000 93.8586431 - 1359 20 9 1993 54.0000000 85.4705120 - 1360 21 9 1993 48.0000000 80.1413545 - 1361 22 9 1993 46.0000000 100.6927542 - 1362 23 9 1993 55.0000000 105.8691966 - 1363 24 9 1993 66.0000000 108.7531770 - 1364 25 9 1993 64.0000000 105.6121553 - 1365 26 9 1993 52.0000000 92.3677116 - 1366 27 9 1993 68.0000000 86.0123070 - 1367 28 9 1993 69.0000000 89.8957859 - 1368 29 9 1993 62.0000000 85.5867213 - 1369 30 9 1993 76.0000000 80.0698800 - 1370 1 10 1993 72.0000000 113.7255189 - 1371 2 10 1993 68.0000000 114.7786855 - 1372 3 10 1993 72.0000000 104.4979873 - 1373 4 10 1993 78.0000000 106.8415161 - 1374 5 10 1993 116.0000000 192.1594426 - 1375 6 10 1993 131.0000000 213.5682883 - 1376 7 10 1993 180.0000000 194.1753620 - 1377 8 10 1993 203.0000000 206.1521452 - 1378 9 10 1993 164.0000000 216.3849527 - 1379 10 10 1993 178.0000000 240.4428235 - 1380 11 10 1993 161.0000000 293.8148912 - 1381 12 10 1993 287.0000000 285.2491704 - 1382 13 10 1993 360.0000000 359.4581496 - 1383 14 10 1993 374.0000000 348.5946986 - 1384 15 10 1993 297.0000000 288.3919806 - 1385 16 10 1993 247.0000000 284.9766741 - 1386 17 10 1993 273.0000000 292.3197418 - 1387 18 10 1993 261.0000000 244.0095351 - 1388 19 10 1993 265.0000000 206.3751737 - 1389 20 10 1993 230.0000000 172.2297566 - 1390 21 10 1993 199.0000000 151.5452172 - 1391 22 10 1993 173.0000000 151.9268707 - 1392 23 10 1993 182.0000000 175.1003192 - 1393 24 10 1993 203.0000000 180.4231304 - 1394 25 10 1993 213.0000000 159.1499061 - 1395 26 10 1993 180.0000000 140.3400193 - 1396 27 10 1993 154.0000000 127.4171872 - 1397 28 10 1993 118.0000000 116.3371191 - 1398 29 10 1993 112.0000000 106.7744822 - 1399 30 10 1993 98.0000000 98.4750786 - 1400 31 10 1993 97.0000000 91.2346927 - 1401 1 11 1993 91.0000000 84.8917825 - 1402 2 11 1993 85.0000000 79.3024259 - 1403 3 11 1993 75.0000000 74.3612250 - 1404 4 11 1993 76.0000000 69.9754560 - 1405 5 11 1993 78.0000000 66.0684513 - 1406 6 11 1993 72.0000000 62.9109325 - 1407 7 11 1993 76.0000000 64.3593110 - 1408 8 11 1993 69.0000000 61.2734109 - 1409 9 11 1993 66.0000000 58.9769349 - 1410 10 11 1993 71.0000000 60.1406198 - 1411 11 11 1993 64.0000000 73.4346941 - 1412 12 11 1993 67.0000000 77.9212883 - 1413 13 11 1993 80.0000000 82.5244696 - 1414 14 11 1993 78.0000000 124.1631977 - 1415 15 11 1993 80.0000000 136.4161323 - 1416 16 11 1993 86.0000000 121.1606986 - 1417 17 11 1993 125.0000000 109.2125695 - 1418 18 11 1993 96.0000000 100.3326768 - 1419 19 11 1993 82.0000000 92.6363139 - 1420 20 11 1993 77.0000000 85.9308238 - 1421 21 11 1993 67.0000000 80.0602568 - 1422 22 11 1993 71.0000000 74.8973953 - 1423 23 11 1993 61.0000000 70.3377125 - 1424 24 11 1993 42.0000000 66.2947505 - 1425 25 11 1993 63.0000000 63.2028017 - 1426 26 11 1993 57.0000000 61.0254269 - 1427 27 11 1993 58.0000000 57.7097814 - 1428 28 11 1993 49.0000000 55.0420431 - 1429 29 11 1993 50.0000000 52.6352528 - 1430 30 11 1993 55.0000000 50.4576782 - 1431 1 12 1993 54.0000000 48.4820927 - 1432 2 12 1993 54.0000000 60.2019555 - 1433 3 12 1993 50.0000000 60.2883725 - 1434 4 12 1993 51.0000000 62.1299992 - 1435 5 12 1993 62.0000000 63.6833628 - 1436 6 12 1993 62.0000000 58.7961215 - 1437 7 12 1993 71.0000000 95.0996684 - 1438 8 12 1993 79.0000000 188.8414422 - 1439 9 12 1993 153.0000000 235.4177330 - 1440 10 12 1993 291.0000000 320.6739046 - 1441 11 12 1993 332.0000000 446.9631114 - 1442 12 12 1993 465.0000000 508.0232679 - 1443 13 12 1993 518.0000000 578.8970971 - 1444 14 12 1993 539.0000000 575.3215994 - 1445 15 12 1993 559.0000000 535.4891183 - 1446 16 12 1993 500.0000000 606.0804236 - 1447 17 12 1993 526.0000000 632.4168960 - 1448 18 12 1993 583.0000000 634.1485512 - 1449 19 12 1993 677.0000000 728.1818957 - 1450 20 12 1993 781.0000000 1161.7576344 - 1451 21 12 1993 1180.0000000 1301.0250966 - 1452 22 12 1993 1460.0000000 1226.2521400 - 1453 23 12 1993 1600.0000000 1251.6182039 - 1454 24 12 1993 1410.0000000 1197.0860984 - 1455 25 12 1993 1230.0000000 935.4719661 - 1456 26 12 1993 1070.0000000 687.8313956 - 1457 27 12 1993 746.0000000 510.9015394 - 1458 28 12 1993 542.0000000 392.7403876 - 1459 29 12 1993 492.0000000 428.2747102 - 1460 30 12 1993 491.0000000 574.3414337 - 1461 31 12 1993 617.0000000 890.6489995 diff --git a/check/case_03/output_save/dds_results.out b/check/case_03/output_save/dds_results.out new file mode 100755 index 00000000..cc28aa81 --- /dev/null +++ b/check/case_03/output_save/dds_results.out @@ -0,0 +1,13 @@ + # settings :: general + # nIterations iseed + 6 1235876 + # settings :: dds specific + # dds_r + 0.200000000000000 + # iter bestf (bestx(j),j=1,nopt) + 0 0.135875222708980 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 15.0000000000000 2.000000000000000E-002 0.110000000000000 0.640000000000000 9.500000000000000E-002 7.500000000000000E-002 56.0000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 + 1 0.129501626103289 0.214719529555557 1.11413798514203 2.12340562437516 0.358416663643768 0.744023834479764 0.507975551581560 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 5.105612361697495E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.332214503414208 -0.576887394145837 1.280101298883113E-002 5.921166514583914E-003 60.9600000000000 0.980046790195744 0.948770283181742 1.336629017628920E-002 2.97556062380225 0.215051846020602 21.9092727422325 4.409236692429134E-002 0.153484978059827 0.631787215053195 9.619970985802488E-002 7.412328068632605E-002 44.4181155601425 100.446402413275 5.72819497604246 1.46913842205795 10.9375259686087 0.185495267349062 19.1797193705933 2.11063123657309 1.00000000000000 0.334277347185789 7.543634940263758E-002 2.00216264925617 0.101811262528843 0.341282646405447 97.0303313768825 66.9985228998802 241.716548262639 181.009520825398 100.000000000000 100.000000000000 8.41387726473933 100.000000000000 147.263520762120 32.8642734387213 + 2 0.129501626103289 0.214719529555557 1.11413798514203 2.12340562437516 0.358416663643768 0.744023834479764 0.507975551581560 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 5.105612361697495E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.332214503414208 -0.576887394145837 1.280101298883113E-002 5.921166514583914E-003 60.9600000000000 0.980046790195744 0.948770283181742 1.336629017628920E-002 2.97556062380225 0.215051846020602 21.9092727422325 4.409236692429134E-002 0.153484978059827 0.631787215053195 9.619970985802488E-002 7.412328068632605E-002 44.4181155601425 100.446402413275 5.72819497604246 1.46913842205795 10.9375259686087 0.185495267349062 19.1797193705933 2.11063123657309 1.00000000000000 0.334277347185789 7.543634940263758E-002 2.00216264925617 0.101811262528843 0.341282646405447 97.0303313768825 66.9985228998802 241.716548262639 181.009520825398 100.000000000000 100.000000000000 8.41387726473933 100.000000000000 147.263520762120 32.8642734387213 + 3 0.129501626103289 0.214719529555557 1.11413798514203 2.12340562437516 0.358416663643768 0.744023834479764 0.507975551581560 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 5.105612361697495E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.332214503414208 -0.576887394145837 1.280101298883113E-002 5.921166514583914E-003 60.9600000000000 0.980046790195744 0.948770283181742 1.336629017628920E-002 2.97556062380225 0.215051846020602 21.9092727422325 4.409236692429134E-002 0.153484978059827 0.631787215053195 9.619970985802488E-002 7.412328068632605E-002 44.4181155601425 100.446402413275 5.72819497604246 1.46913842205795 10.9375259686087 0.185495267349062 19.1797193705933 2.11063123657309 1.00000000000000 0.334277347185789 7.543634940263758E-002 2.00216264925617 0.101811262528843 0.341282646405447 97.0303313768825 66.9985228998802 241.716548262639 181.009520825398 100.000000000000 100.000000000000 8.41387726473933 100.000000000000 147.263520762120 32.8642734387213 + 4 0.110019021627567 0.206292417175140 1.11413798514203 2.12340562437516 0.358416663643768 0.744023834479764 0.443954961941640 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 5.105612361697495E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.270274825467716 -0.576887394145837 1.280101298883113E-002 5.921166514583914E-003 60.9600000000000 0.985067019078026 0.948770283181742 5.900295603935595E-003 2.97556062380225 0.215051846020602 21.9092727422325 4.409236692429134E-002 0.153484978059827 0.631787215053195 9.619970985802488E-002 7.412328068632605E-002 44.4181155601425 100.446402413275 5.72819497604246 1.46913842205795 10.9375259686087 0.185495267349062 25.6791391299436 2.47055780892711 1.00000000000000 0.334277347185789 7.543634940263758E-002 2.00216264925617 0.101811262528843 0.341282646405447 97.0303313768825 66.9985228998802 47.9554431856718 181.009520825398 100.000000000000 100.000000000000 8.41387726473933 100.000000000000 147.263520762120 32.8642734387213 + 5 0.110018973432723 0.206292417175140 1.11413798514203 2.12340562437516 0.358416663643768 0.744023834479764 0.443954961941640 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 5.105612361697495E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.270274825467716 -0.576887394145837 1.280101298883113E-002 5.921166514583914E-003 60.9600000000000 0.985067019078026 0.948770283181742 5.900295603935595E-003 2.97556062380225 0.215051846020602 21.9092727422325 4.409236692429134E-002 0.153484978059827 0.631787215053195 9.619970985802488E-002 7.412328068632605E-002 44.4181155601425 100.446402413275 5.72819497604246 1.46913842205795 10.9375259686087 0.185495267349062 25.6791391299436 2.47055780892711 1.00000000000000 0.334277347185789 7.543634940263758E-002 2.00216264925617 0.101811262528843 0.341282646405447 97.0303313768825 66.9985228998802 47.9554431856718 181.009520825398 100.000000000000 100.000000000000 8.41387726473933 100.000000000000 147.263520762120 22.2744376104507 diff --git a/check/case_03/simulation_mhm_case03.ini b/check/case_03/simulation_mhm_case03.ini new file mode 100644 index 00000000..194582b4 --- /dev/null +++ b/check/case_03/simulation_mhm_case03.ini @@ -0,0 +1,20 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_03 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig_mhm_mrm__optimize = True +nml__mainconfig_mhm_mrm__opti_method = 1 +nml__optimization__niterations = 6 +nml__directories_mhm__time_step_model_inputs = [0] +nml__processselection__processcase(5) = 3 diff --git a/check/case_04/mhm.nml b/check/case_04/mhm.nml index aff3e4be..e4f4ec0c 100644 --- a/check/case_04/mhm.nml +++ b/check/case_04/mhm.nml @@ -1,701 +1,201 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" +&directories_general + dir_lcover(1:6) = '../../test_basin/input/luse/', '../../test_basin/input/luse/', + '../../test_basin_2/input/luse/', '../../test_basin/input/luse/', + '../../test_basin/input/luse/', '../../test_basin_2/input/luse/' + dir_morpho(1:6) = '../../test_basin/input/morph/', '../../test_basin/input/morph/', + '../../test_basin_2/input/morph/', '../../test_basin/input/morph/', + '../../test_basin/input/morph/', '../../test_basin_2/input/morph/' + dir_out(1:6) = 'output_b1/b1_', 'output_b1/b2_', 'output_b1/b3_', 'output_b1/b4_', + 'output_b1/b5_', 'output_b1/b6_' + dir_restartout(1:6) = 'output_b1/b1_', 'output_b1/b2_', 'output_b1/b3_', + 'output_b1/b4_', 'output_b1/b5_', 'output_b1/b6_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1:6) = '../../test_basin/input/latlon/latlon_1.nc', '../../test_basin/input/latlon/latlon_2.nc', + '../../test_basin_2/input/latlon/latlon.nc', '../../test_basin/input/latlon/latlon_1.nc', + '../../test_basin/input/latlon/latlon_2.nc', '../../test_basin_2/input/latlon/latlon.nc' +/ + +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1:6) = '../../test_basin/input/meteo/pre/', '../../test_basin/input/meteo/pre/', + '../../test_basin_2/input/meteo/pre/', '../../test_basin/input/meteo/pre/', + '../../test_basin/input/meteo/pre/', '../../test_basin_2/input/meteo/pre/' + dir_referenceet(1:6) = '../../test_basin/input/meteo/pet/', '../../test_basin/input/meteo/pet/', + '../../test_basin_2/input/meteo/pet/', '../../test_basin/input/meteo/pet/', + '../../test_basin/input/meteo/pet/', '../../test_basin_2/input/meteo/pet/' + dir_temperature(1:6) = '../../test_basin/input/meteo/tavg/', '../../test_basin/input/meteo/tavg/', + '../../test_basin_2/input/meteo/tavg/', '../../test_basin/input/meteo/tavg/', + '../../test_basin/input/meteo/tavg/', '../../test_basin_2/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1:6) = 0, 0, 0, 0, 0, 0 +/ + +&directories_mrm + dir_gauges(1:6) = '../../test_basin/input/gauge/', '../../test_basin/input/gauge/', + '../../test_basin_2/input/gauge/', '../../test_basin/input/gauge/', + '../../test_basin/input/gauge/', '../../test_basin_2/input/gauge/' + dir_total_runoff(1:6) = '../../test_basin/input/gauge/', '../../test_basin/input/gauge/', + '../../test_basin_2/input/gauge/', '../../test_basin/input/gauge/', + '../../test_basin/input/gauge/', '../../test_basin_2/input/gauge/' / -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 + +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_filename(2,1) = '00398.txt' + gauge_filename(3,1) = '45.txt' + gauge_filename(4,1) = '00398.txt' + gauge_filename(5,1) = '00398.txt' + gauge_filename(6,1) = '45.txt' + gauge_id(1,1) = 398 + gauge_id(2,1) = 398 + gauge_id(3,1) = 45 + gauge_id(4,1) = 398 + gauge_id(5,1) = 398 + gauge_id(6,1) = 45 + ngaugestotal = 6 + nogauges_basin(1:6) = 1, 1, 1, 1, 1, 1 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" -dir_Gauges(3) = "../../test_basin_2/input/gauge/" -dir_Gauges(4) = "../../test_basin/input/gauge/" -dir_Gauges(5) = "../../test_basin/input/gauge/" -dir_Gauges(6) = "../../test_basin_2/input/gauge/" +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_general -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "../../test_basin/restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/b1_" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "../../test_basin/restart/" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_2.nc" -! -!**** for Basin 3 -!> directory where morphological files are located -dir_Morpho(3) = "../../test_basin_2/input/morph/" -!> directory where land cover files are located -dir_LCover(3) = "../../test_basin_2/input/luse/" -!> directory where restart input is located -dir_RestartIn(3) = "../../test_basin_2/restart/" -!> directory where restart output should be written -dir_RestartOut(3) = "output_b1/b3_" -!> directory where output should be written -dir_Out(3) = "output_b1/b3_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(3) = "../../test_basin_2/input/latlon/latlon.nc" -! -!**** for Basin 4 -!> directory where morphological files are located -dir_Morpho(4) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(4) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(4) = "../../test_basin/restart/" -!> directory where restart output should be written -dir_RestartOut(4) = "output_b1/b4_" -!> directory where output should be written -dir_Out(4) = "output_b1/b4_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(4) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 5 -!> directory where morphological files are located -dir_Morpho(5) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(5) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(5) = "../../test_basin/restart/" -!> directory where restart output should be written -dir_RestartOut(5) = "output_b1/b5_" -!> directory where output should be written -dir_Out(5) = "output_b1/b5_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(5) = "../../test_basin/input/latlon/latlon_2.nc" -! -!**** for Basin 6 -!> directory where morphological files are located -dir_Morpho(6) = "../../test_basin_2/input/morph/" -!> directory where land cover files are located -dir_LCover(6) = "../../test_basin_2/input/luse/" -!> directory where restart input is located -dir_RestartIn(6) = "../../test_basin_2/restart/" -!> directory where restart output should be written -dir_RestartOut(6) = "output_b1/b6_" -!> directory where output should be written -dir_Out(6) = "output_b1/b6_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(6) = "../../test_basin_2/input/latlon/latlon.nc" +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&directories_mHM -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -! -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" -! -!**** for Basin 3 -!> directory where meteorological input is located -dir_Precipitation(3) = "../../test_basin_2/input/meteo/pre/" -dir_Temperature(3) = "../../test_basin_2/input/meteo/tavg/" -dir_ReferenceET(3) = "../../test_basin_2/input/meteo/pet/" -!> directory where gridded LAI files are located -dir_gridded_LAI(3) = "../../test_basin/input/lai/" -! -!**** for Basin 4 -!> directory where meteorological input is located -dir_Precipitation(4) = "../../test_basin/input/meteo/pre/" -dir_Temperature(4) = "../../test_basin/input/meteo/tavg/" -dir_ReferenceET(4) = "../../test_basin/input/meteo/pet/" -!> directory where gridded LAI files are located -dir_gridded_LAI(4) = "../../test_basin/input/lai/" -! -!**** for Basin 5 -!> directory where meteorological input is located -dir_Precipitation(5) = "../../test_basin/input/meteo/pre/" -dir_Temperature(5) = "../../test_basin/input/meteo/tavg/" -dir_ReferenceET(5) = "../../test_basin/input/meteo/pet/" -!> directory where gridded LAI files are located -dir_gridded_LAI(5) = "../../test_basin/input/lai/" -! -!**** for Basin 6 -!> directory where meteorological input is located -dir_Precipitation(6) = "../../test_basin_2/input/meteo/pre/" -dir_Temperature(6) = "../../test_basin_2/input/meteo/tavg/" -dir_ReferenceET(6) = "../../test_basin_2/input/meteo/pet/" -!> directory where gridded LAI files are located -dir_gridded_LAI(6) = "../../test_basin/input/lai/" +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&lcover_mpr + fracsealed_cityarea = 0.6 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. &mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 6 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m] per basin -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 12000 -resolution_Hydrology(3) = 24000 -resolution_Hydrology(4) = 24000 -resolution_Hydrology(5) = 12000 -resolution_Hydrology(6) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -resolution_Routing(3) = 24000 -resolution_Routing(4) = 24000 -resolution_Routing(5) = 12000 -resolution_Routing(6) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -L0Basin(3) = 2 -L0Basin(4) = 3 -L0Basin(5) = 4 -L0Basin(6) = 5 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. + iflag_cordinate_sys = 0 + l0basin(1:6) = 1, 1, 2, 3, 4, 5 + nbasins = 6 + resolution_hydrology(1:6) = 24000, 12000, 24000, 24000, 12000, 24000 + write_restart = .true. / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 360 -warming_Days(3) = 180 -warming_Days(4) = 360 -warming_Days(5) = 50 -warming_Days(6) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1991 -eval_Per(3)%yStart = 1993 -eval_Per(4)%yStart = 1990 -eval_Per(5)%yStart = 1992 -eval_Per(6)%yStart = 1991 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -eval_Per(3)%mStart = 01 -eval_Per(4)%mStart = 01 -eval_Per(5)%mStart = 01 -eval_Per(6)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -eval_Per(3)%dStart = 01 -eval_Per(4)%dStart = 01 -eval_Per(5)%dStart = 01 -eval_Per(6)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1992 -eval_Per(3)%yEnd = 1993 -eval_Per(4)%yEnd = 1993 -eval_Per(5)%yEnd = 1993 -eval_Per(6)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -eval_Per(3)%mEnd = 12 -eval_Per(4)%mEnd = 12 -eval_Per(5)%mEnd = 12 -eval_Per(6)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -eval_Per(3)%dEnd = 31 -eval_Per(4)%dEnd = 31 -eval_Per(5)%dEnd = 31 -eval_Per(6)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 -time_step_model_inputs(3) = 0 -time_step_model_inputs(4) = 0 -time_step_model_inputs(5) = 0 -time_step_model_inputs(6) = 0 +&mainconfig_mhm_mrm + dir_restartin(1:6) = '../../test_basin/restart/', '../../test_basin/restart/', + '../../test_basin_2/restart/', '../../test_basin/restart/', + '../../test_basin/restart/', '../../test_basin_2/restart/' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1:6) = 24000, 24000, 24000, 24000, 12000, 24000 + timestep = 1 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' - -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' -/ -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> actualET -!> 1 - root fraction approach -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series - -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 6 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -! -!> basin 3 -!> number of gauges for subbasin (3) -NoGauges_basin(3) = 1 -!> id of gauge(1) for subbasin(3) --> (3,1) -Gauge_id(3,1) = 45 -!> name of file with timeseries of gauge(1) for subbasin(3) --> (3,1) -Gauge_filename(3,1) = "45.txt" -! -!> basin 4 -!> number of gauges for subbasin (4) -NoGauges_basin(4) = 1 -!> id of gauge(1) for subbasin(4) --> (4,1) -Gauge_id(4,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(4) --> (4,1) -Gauge_filename(4,1) = "00398.txt" -! -!> basin 5 -!> number of gauges for subbasin (5) -NoGauges_basin(5) = 1 -!> id of gauge(1) for subbasin(5) --> (5,1) -Gauge_id(5,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(5) --> (5,1) -Gauge_filename(5,1) = "00398.txt" -! -!> basin 6 -!> number of gauges for subbasin (6) -NoGauges_basin(6) = 1 -!> id of gauge(1) for subbasin(6) --> (6,1) -Gauge_id(6,1) = 45 -!> name of file with timeseries of gauge(1) for subbasin(6) --> (6,1) -Gauge_filename(6,1) = "45.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 31 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 12 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1990 + eval_per(1)%ystart = 1990 + eval_per(2)%dend = 31 + eval_per(2)%dstart = 1 + eval_per(2)%mend = 12 + eval_per(2)%mstart = 1 + eval_per(2)%yend = 1992 + eval_per(2)%ystart = 1991 + eval_per(3)%dend = 31 + eval_per(3)%dstart = 1 + eval_per(3)%mend = 12 + eval_per(3)%mstart = 1 + eval_per(3)%yend = 1993 + eval_per(3)%ystart = 1993 + eval_per(4)%dend = 31 + eval_per(4)%dstart = 1 + eval_per(4)%mend = 12 + eval_per(4)%mstart = 7 + eval_per(4)%yend = 1990 + eval_per(4)%ystart = 1990 + eval_per(5)%dend = 31 + eval_per(5)%dstart = 1 + eval_per(5)%mend = 12 + eval_per(5)%mstart = 1 + eval_per(5)%yend = 1992 + eval_per(5)%ystart = 1992 + eval_per(6)%dend = 31 + eval_per(6)%dstart = 1 + eval_per(6)%mend = 12 + eval_per(6)%mstart = 1 + eval_per(6)%yend = 1991 + eval_per(6)%ystart = 1991 + warming_days(1:6) = 180, 180, 180, 360, 50, 0 / diff --git a/check/case_04/output_save/ConfigFile.log b/check/case_04/output_save/ConfigFile.log index 783fd019..4184e21a 100644 --- a/check/case_04/output_save/ConfigFile.log +++ b/check/case_04/output_save/ConfigFile.log @@ -1,28 +1,71 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N Number of basins 6 -Total No. of nodes 249 -Total No. of reaches 248 -No. of cells L0 181685 -No. of cells L1 324 -No. of cells L11 249 Total No. of gauges 6 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 6 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. + Basin 2 +No. of cells L0 46545 + Basin 2 +No. of cells L1 109 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 6 Basin 2 Hydrology Resolution [m] 12000. Basin 2 Routing Resolution [m] 24000. + Basin 3 +No. of cells L0 21025 + Basin 3 +No. of cells L1 19 +Total No. of nodes 19 +Total No. of reaches 18 +No. of cells L11 19 +Total No. of gauges 6 Basin 3 Hydrology Resolution [m] 24000. Basin 3 Routing Resolution [m] 24000. + Basin 4 +No. of cells L0 46545 + Basin 4 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 6 Basin 4 Hydrology Resolution [m] 24000. Basin 4 Routing Resolution [m] 24000. + Basin 5 +No. of cells L0 46545 + Basin 5 +No. of cells L1 109 +Total No. of nodes 109 +Total No. of reaches 108 +No. of cells L11 109 +Total No. of gauges 6 Basin 5 Hydrology Resolution [m] 12000. Basin 5 Routing Resolution [m] 12000. + Basin 6 +No. of cells L0 21025 + Basin 6 +No. of cells L1 19 +Total No. of nodes 19 +Total No. of reaches 18 +No. of cells L11 19 +Total No. of gauges 6 Basin 6 Hydrology Resolution [m] 24000. Basin 6 Routing Resolution [m] 24000. Flag READ restart F @@ -33,118 +76,90 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 2 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 31 12 1990Simulation Period (1)+(2) 2 1 1990 31 12 1990 ------------------------------------------------------------- Model Run Periods for Basin 2 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1990 31 12 1990 -Evaluation Period (2) 1 1 1991 31 12 1992 -Simulation Period (1)+(2) 6 1 1990 31 12 1992 - +Warming Period (1) 5 7 1990 31 12 1990Evaluation Period (2) 1 1 1991 31 12 1992Simulation Period (1)+(2) 5 7 1990 31 12 1992 ------------------------------------------------------------- Model Run Periods for Basin 3 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 5 7 1992 31 12 1992 -Evaluation Period (2) 1 1 1993 31 12 1993 -Simulation Period (1)+(2) 5 7 1992 31 12 1993 - +Warming Period (1) 5 7 1992 31 12 1992Evaluation Period (2) 1 1 1993 31 12 1993Simulation Period (1)+(2) 5 7 1992 31 12 1993 ------------------------------------------------------------- Model Run Periods for Basin 4 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 6 7 1989 30 6 1990Evaluation Period (2) 1 7 1990 31 12 1990Simulation Period (1)+(2) 6 7 1989 31 12 1990 ------------------------------------------------------------- Model Run Periods for Basin 5 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 12 11 1991 31 12 1991 -Evaluation Period (2) 1 1 1992 31 12 1993 -Simulation Period (1)+(2) 12 11 1991 31 12 1993 - +Warming Period (1) 12 11 1991 31 12 1991Evaluation Period (2) 1 1 1992 31 12 1992Simulation Period (1)+(2) 12 11 1991 31 12 1992 ------------------------------------------------------------- Model Run Periods for Basin 6 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1990 31 12 1990 -Evaluation Period (2) 1 1 1991 31 12 1993 -Simulation Period (1)+(2) 6 1 1990 31 12 1993 - +Warming Period (1) 1 1 1991 31 12 1990Evaluation Period (2) 1 1 1991 31 12 1991Simulation Period (1)+(2) 1 1 1991 31 12 1991 -------------------------------------------------- Land Cover Observations for Basin 7 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 -9999 lc_1991.asc -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1990 2 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc + 1981 1990 2 lc_1981.asc + 1991 2000 2 lc_1991.asc -------------------------------------------------- - Land Cover Observations for Basin 4 + Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 2 lc_1981.asc + 1991 2000 2 lc_1991.asc -------------------------------------------------- Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 -9999 lc_1991.asc -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 2 lc_1981.asc + 1991 2000 2 lc_1991.asc -------------------------------------------------- - Land Cover Observations for Basin 4 + Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1990 2 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 2 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -208,12 +223,12 @@ Simulation Period (1)+(2) 6 1 1990 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 + 1 1 774.000 16.000 2 2 932.000 11.000 3 3 1185.000 32.800 - 4 4 1600.000 11.000 - 5 5 1600.000 16.000 - 6 6 1185.000 32.800 + 4 4 774.000 16.000 + 5 5 661.000 19.000 + 6 6 -9999.000 -9999.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -282,40 +297,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -423,155 +438,155 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 35 1 8.250 - 36 2 29.750 - 37 1 26.750 - 38 1 91.750 - 39 2 134.250 - 40 2 65.750 - 41 3 8.000 - 42 4 20.750 - 43 4 35.000 - 44 5 141.750 + 1 1 8.250 + 2 2 29.750 + 3 3 26.750 + 4 4 91.750 + 5 5 134.250 + 6 6 65.750 + 7 7 8.000 + 8 8 20.750 + 9 9 35.000 + 10 10 141.750 + 11 11 144.000 + 12 12 144.000 + 13 13 29.500 + 14 14 99.750 + 15 15 138.750 + 16 16 118.000 + 17 17 144.000 + 18 18 144.000 + 19 19 138.000 + 20 20 2.750 + 21 21 41.750 + 22 22 144.000 + 23 23 144.000 + 24 24 144.000 + 25 25 144.000 + 26 26 86.500 + 27 27 0.750 + 28 28 92.750 + 29 29 144.000 + 30 30 144.000 + 31 31 144.000 + 32 32 60.000 + 33 33 95.750 + 34 34 144.000 + 35 1 144.000 + 36 2 144.000 + 37 1 112.000 + 38 1 23.250 + 39 2 61.750 + 40 2 7.000 + 41 3 86.250 + 42 4 144.000 + 43 4 144.000 + 44 5 144.000 45 5 144.000 - 46 6 144.000 - 47 6 29.500 - 48 3 99.750 - 49 4 138.750 - 50 4 118.000 + 46 6 135.250 + 47 6 144.000 + 48 3 128.000 + 49 4 9.000 + 50 4 134.000 51 5 144.000 52 5 144.000 - 53 6 138.000 - 54 6 2.750 - 55 7 41.750 - 56 8 144.000 - 57 8 144.000 + 53 6 144.000 + 54 6 144.000 + 55 7 144.000 + 56 8 99.250 + 57 8 96.250 58 9 144.000 59 9 144.000 - 60 10 86.500 - 61 7 0.750 - 62 8 92.750 - 63 8 144.000 - 64 9 144.000 - 65 9 144.000 - 66 10 60.000 - 67 11 95.750 + 60 10 144.000 + 61 7 144.000 + 62 8 144.000 + 63 8 140.000 + 64 9 48.250 + 65 9 10.500 + 66 10 141.250 + 67 11 144.000 68 11 144.000 69 12 144.000 70 12 144.000 - 71 13 112.000 - 72 13 23.250 - 73 14 61.750 - 74 14 7.000 - 75 11 86.250 + 71 13 144.000 + 72 13 140.000 + 73 14 29.250 + 74 14 115.750 + 75 11 144.000 76 11 144.000 77 12 144.000 78 12 144.000 79 13 144.000 - 80 13 135.250 - 81 14 144.000 - 82 14 128.000 - 83 15 9.000 - 84 16 134.000 + 80 13 144.000 + 81 14 5.250 + 82 14 112.750 + 83 15 144.000 + 84 16 144.000 85 17 144.000 86 17 144.000 87 18 144.000 88 18 144.000 - 89 19 144.000 - 90 19 99.250 - 91 16 96.250 - 92 17 144.000 + 89 19 59.250 + 90 19 61.250 + 91 16 138.250 + 92 17 119.250 93 17 144.000 94 18 144.000 95 18 144.000 - 96 19 144.000 - 97 19 140.000 - 98 20 48.250 - 99 21 10.500 - 100 22 141.250 + 96 19 128.000 + 97 19 5.750 + 98 20 3.250 + 99 21 10.250 + 100 22 138.500 101 22 144.000 102 23 144.000 - 103 23 144.000 - 104 24 144.000 + 103 23 83.750 + 104 24 49.250 105 24 144.000 - 106 25 140.000 - 107 25 29.250 - 108 22 115.750 - 109 22 144.000 - 110 23 144.000 - 111 23 144.000 - 112 24 144.000 - 113 24 144.000 - 114 25 144.000 - 115 25 5.250 - 116 26 112.750 - 117 26 144.000 - 118 27 144.000 - 119 27 144.000 - 120 28 144.000 - 121 28 144.000 - 122 29 144.000 - 123 29 59.250 - 124 26 61.250 - 125 26 138.250 - 126 27 119.250 - 127 27 144.000 - 128 28 144.000 - 129 28 144.000 - 130 29 128.000 - 131 29 5.750 - 132 30 3.250 - 133 31 10.250 - 134 31 138.500 - 135 32 144.000 - 136 32 144.000 - 137 33 83.750 - 138 31 49.250 - 139 32 144.000 - 140 32 123.250 - 141 33 5.250 - 142 34 45.750 - 143 34 76.000 + 106 25 123.250 + 107 25 5.250 + 108 22 45.750 + 109 22 76.000 ------------------------------ Total[km2] 11636.250 @@ -624,50 +639,50 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 69 1 - 70 2 - 71 3 - 72 4 - 73 5 - 74 6 - 75 7 - 76 8 - 77 9 - 78 10 - 79 11 - 80 12 - 81 13 - 82 14 - 83 15 - 84 16 - 85 17 - 86 18 - 87 19 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 144 1 210.750 - 145 2 299.750 - 146 3 218.500 - 147 4 31.250 - 148 5 150.500 - 149 6 487.250 - 150 7 576.000 - 151 8 450.500 - 152 9 179.500 - 153 10 227.000 - 154 11 576.000 - 155 12 524.500 - 156 13 168.500 - 157 14 42.750 - 158 15 449.250 - 159 16 398.750 - 160 17 12.000 - 161 18 89.500 - 162 19 164.000 + 1 1 210.750 + 2 2 299.750 + 3 3 218.500 + 4 4 31.250 + 5 5 150.500 + 6 6 487.250 + 7 7 576.000 + 8 8 450.500 + 9 9 179.500 + 10 10 227.000 + 11 11 576.000 + 12 12 524.500 + 13 13 168.500 + 14 14 42.750 + 15 15 449.250 + 16 16 398.750 + 17 17 12.000 + 18 18 89.500 + 19 19 164.000 ------------------------------ Total[km2] 5256.250 @@ -735,80 +750,80 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 88 1 - 89 2 - 90 3 - 91 4 - 92 5 - 93 6 - 94 7 - 95 8 - 96 9 - 97 10 - 98 11 - 99 12 - 100 13 - 101 14 - 102 15 - 103 16 - 104 17 - 105 18 - 106 19 - 107 20 - 108 21 - 109 22 - 110 23 - 111 24 - 112 25 - 113 26 - 114 27 - 115 28 - 116 29 - 117 30 - 118 31 - 119 32 - 120 33 - 121 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 163 1 126.750 - 164 2 229.750 - 165 3 107.750 - 166 4 312.500 - 167 5 573.750 - 168 6 314.250 - 169 7 42.500 - 170 8 524.750 - 171 9 576.000 - 172 10 146.500 - 173 11 470.000 - 174 12 576.000 - 175 13 414.500 - 176 14 340.750 - 177 15 9.000 - 178 16 230.250 - 179 17 576.000 - 180 18 576.000 - 181 19 527.250 - 182 20 48.250 - 183 21 10.500 - 184 22 545.000 - 185 23 576.000 - 186 24 576.000 - 187 25 318.500 - 188 26 456.250 - 189 27 551.250 - 190 28 576.000 - 191 29 337.000 - 192 30 3.250 - 193 31 198.000 - 194 32 555.250 - 195 33 89.000 - 196 34 121.750 + 1 1 126.750 + 2 2 229.750 + 3 3 107.750 + 4 4 312.500 + 5 5 573.750 + 6 6 314.250 + 7 7 42.500 + 8 8 524.750 + 9 9 576.000 + 10 10 146.500 + 11 11 470.000 + 12 12 576.000 + 13 13 414.500 + 14 14 340.750 + 15 15 9.000 + 16 16 230.250 + 17 17 576.000 + 18 18 576.000 + 19 19 527.250 + 20 20 48.250 + 21 21 10.500 + 22 22 545.000 + 23 23 576.000 + 24 24 576.000 + 25 25 318.500 + 26 26 456.250 + 27 27 551.250 + 28 28 576.000 + 29 29 337.000 + 30 30 3.250 + 31 31 198.000 + 32 32 555.250 + 33 33 89.000 + 34 34 121.750 ------------------------------ Total[km2] 11636.250 @@ -951,230 +966,230 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 122 1 - 123 2 - 124 3 - 125 4 - 126 5 - 127 6 - 128 7 - 129 8 - 130 9 - 131 10 - 132 11 - 133 12 - 134 13 - 135 14 - 136 15 - 137 16 - 138 17 - 139 18 - 140 19 - 141 20 - 142 21 - 143 22 - 144 23 - 145 24 - 146 25 - 147 26 - 148 27 - 149 28 - 150 29 - 151 30 - 152 31 - 153 32 - 154 33 - 155 34 - 156 35 - 157 36 - 158 37 - 159 38 - 160 39 - 161 40 - 162 41 - 163 42 - 164 43 - 165 44 - 166 45 - 167 46 - 168 47 - 169 48 - 170 49 - 171 50 - 172 51 - 173 52 - 174 53 - 175 54 - 176 55 - 177 56 - 178 57 - 179 58 - 180 59 - 181 60 - 182 61 - 183 62 - 184 63 - 185 64 - 186 65 - 187 66 - 188 67 - 189 68 - 190 69 - 191 70 - 192 71 - 193 72 - 194 73 - 195 74 - 196 75 - 197 76 - 198 77 - 199 78 - 200 79 - 201 80 - 202 81 - 203 82 - 204 83 - 205 84 - 206 85 - 207 86 - 208 87 - 209 88 - 210 89 - 211 90 - 212 91 - 213 92 - 214 93 - 215 94 - 216 95 - 217 96 - 218 97 - 219 98 - 220 99 - 221 100 - 222 101 - 223 102 - 224 103 - 225 104 - 226 105 - 227 106 - 228 107 - 229 108 - 230 109 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 197 1 8.250 - 198 2 29.750 - 199 3 26.750 - 200 4 91.750 - 201 5 134.250 - 202 6 65.750 - 203 7 8.000 - 204 8 20.750 - 205 9 35.000 - 206 10 141.750 - 207 11 144.000 - 208 12 144.000 - 209 13 29.500 - 210 14 99.750 - 211 15 138.750 - 212 16 118.000 - 213 17 144.000 - 214 18 144.000 - 215 19 138.000 - 216 20 2.750 - 217 21 41.750 - 218 22 144.000 - 219 23 144.000 - 220 24 144.000 - 221 25 144.000 - 222 26 86.500 - 223 27 0.750 - 224 28 92.750 - 225 29 144.000 - 226 30 144.000 - 227 31 144.000 - 228 32 60.000 - 229 33 95.750 - 230 34 144.000 - 231 35 144.000 - 232 36 144.000 - 233 37 112.000 - 234 38 23.250 - 235 39 61.750 - 236 40 7.000 - 237 41 86.250 - 238 42 144.000 - 239 43 144.000 - 240 44 144.000 - 241 45 144.000 - 242 46 135.250 - 243 47 144.000 - 244 48 128.000 - 245 49 9.000 - 246 50 134.000 - 247 51 144.000 - 248 52 144.000 - 249 53 144.000 - 250 54 144.000 - 251 55 144.000 - 252 56 99.250 - 253 57 96.250 - 254 58 144.000 - 255 59 144.000 - 256 60 144.000 - 257 61 144.000 - 258 62 144.000 - 259 63 140.000 - 260 64 48.250 - 261 65 10.500 - 262 66 141.250 - 263 67 144.000 - 264 68 144.000 - 265 69 144.000 - 266 70 144.000 - 267 71 144.000 - 268 72 140.000 - 269 73 29.250 - 270 74 115.750 - 271 75 144.000 - 272 76 144.000 - 273 77 144.000 - 274 78 144.000 - 275 79 144.000 - 276 80 144.000 - 277 81 5.250 - 278 82 112.750 - 279 83 144.000 - 280 84 144.000 - 281 85 144.000 - 282 86 144.000 - 283 87 144.000 - 284 88 144.000 - 285 89 59.250 - 286 90 61.250 - 287 91 138.250 - 288 92 119.250 - 289 93 144.000 - 290 94 144.000 - 291 95 144.000 - 292 96 128.000 - 293 97 5.750 - 294 98 3.250 - 295 99 10.250 - 296 100 138.500 - 297 101 144.000 - 298 102 144.000 - 299 103 83.750 - 300 104 49.250 - 301 105 144.000 - 302 106 123.250 - 303 107 5.250 - 304 108 45.750 - 305 109 76.000 + 1 1 8.250 + 2 2 29.750 + 3 3 26.750 + 4 4 91.750 + 5 5 134.250 + 6 6 65.750 + 7 7 8.000 + 8 8 20.750 + 9 9 35.000 + 10 10 141.750 + 11 11 144.000 + 12 12 144.000 + 13 13 29.500 + 14 14 99.750 + 15 15 138.750 + 16 16 118.000 + 17 17 144.000 + 18 18 144.000 + 19 19 138.000 + 20 20 2.750 + 21 21 41.750 + 22 22 144.000 + 23 23 144.000 + 24 24 144.000 + 25 25 144.000 + 26 26 86.500 + 27 27 0.750 + 28 28 92.750 + 29 29 144.000 + 30 30 144.000 + 31 31 144.000 + 32 32 60.000 + 33 33 95.750 + 34 34 144.000 + 35 1 144.000 + 36 2 144.000 + 37 1 112.000 + 38 1 23.250 + 39 2 61.750 + 40 2 7.000 + 41 3 86.250 + 42 4 144.000 + 43 4 144.000 + 44 5 144.000 + 45 5 144.000 + 46 6 135.250 + 47 6 144.000 + 48 3 128.000 + 49 4 9.000 + 50 4 134.000 + 51 5 144.000 + 52 5 144.000 + 53 6 144.000 + 54 6 144.000 + 55 7 144.000 + 56 8 99.250 + 57 8 96.250 + 58 9 144.000 + 59 9 144.000 + 60 10 144.000 + 61 7 144.000 + 62 8 144.000 + 63 8 140.000 + 64 9 48.250 + 65 9 10.500 + 66 10 141.250 + 67 11 144.000 + 68 11 144.000 + 69 12 144.000 + 70 12 144.000 + 71 13 144.000 + 72 13 140.000 + 73 14 29.250 + 74 14 115.750 + 75 11 144.000 + 76 11 144.000 + 77 12 144.000 + 78 12 144.000 + 79 13 144.000 + 80 13 144.000 + 81 14 5.250 + 82 14 112.750 + 83 15 144.000 + 84 16 144.000 + 85 17 144.000 + 86 17 144.000 + 87 18 144.000 + 88 18 144.000 + 89 19 59.250 + 90 19 61.250 + 91 16 138.250 + 92 17 119.250 + 93 17 144.000 + 94 18 144.000 + 95 18 144.000 + 96 19 128.000 + 97 19 5.750 + 98 20 3.250 + 99 21 10.250 + 100 22 138.500 + 101 22 144.000 + 102 23 144.000 + 103 23 83.750 + 104 24 49.250 + 105 24 144.000 + 106 25 123.250 + 107 25 5.250 + 108 22 45.750 + 109 22 76.000 ------------------------------ Total[km2] 11636.250 @@ -1227,51 +1242,51 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 231 1 - 232 2 - 233 3 - 234 4 - 235 5 - 236 6 - 237 7 - 238 8 - 239 9 - 240 10 - 241 11 - 242 12 - 243 13 - 244 14 - 245 15 - 246 16 - 247 17 - 248 18 - 249 19 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 306 1 210.750 - 307 2 299.750 - 308 3 218.500 - 309 4 31.250 - 310 5 150.500 - 311 6 487.250 - 312 7 576.000 - 313 8 450.500 - 314 9 179.500 - 315 10 227.000 - 316 11 576.000 - 317 12 524.500 - 318 13 168.500 - 319 14 42.750 - 320 15 449.250 - 321 16 398.750 - 322 17 12.000 - 323 18 89.500 - 324 19 164.000 + 1 1 210.750 + 2 2 299.750 + 3 3 218.500 + 4 4 31.250 + 5 5 150.500 + 6 6 487.250 + 7 7 576.000 + 8 8 450.500 + 9 9 179.500 + 10 10 227.000 + 11 11 576.000 + 12 12 524.500 + 13 13 168.500 + 14 14 42.750 + 15 15 449.250 + 16 16 398.750 + 17 17 12.000 + 18 18 89.500 + 19 19 164.000 ------------------------------ Total[km2] 5256.250 - + diff --git a/check/case_04/output_save/b1_daily_discharge.out b/check/case_04/output_save/b1_daily_discharge.out index 9ad7c5e0..12e37ee1 100644 --- a/check/case_04/output_save/b1_daily_discharge.out +++ b/check/case_04/output_save/b1_daily_discharge.out @@ -1,1462 +1,185 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 133.9333078 - 2 2 1 1990 129.0000000 125.1828279 - 3 3 1 1990 117.0000000 117.4345123 - 4 4 1 1990 111.0000000 110.5512412 - 5 5 1 1990 112.0000000 104.4178325 - 6 6 1 1990 93.0000000 99.0214737 - 7 7 1 1990 87.0000000 94.1634757 - 8 8 1 1990 84.0000000 89.7359244 - 9 9 1 1990 80.0000000 85.7443667 - 10 10 1 1990 78.0000000 82.1357792 - 11 11 1 1990 78.0000000 78.8655002 - 12 12 1 1990 77.0000000 75.8925735 - 13 13 1 1990 76.0000000 75.0317210 - 14 14 1 1990 73.0000000 77.0260542 - 15 15 1 1990 66.0000000 86.2387643 - 16 16 1 1990 76.0000000 85.5161507 - 17 17 1 1990 73.0000000 86.3417731 - 18 18 1 1990 71.0000000 87.6862782 - 19 19 1 1990 90.0000000 83.3660647 - 20 20 1 1990 82.0000000 86.4071666 - 21 21 1 1990 80.0000000 83.5571610 - 22 22 1 1990 81.0000000 78.8121212 - 23 23 1 1990 97.0000000 176.0501481 - 24 24 1 1990 198.0000000 214.3070241 - 25 25 1 1990 392.0000000 278.9009341 - 26 26 1 1990 519.0000000 304.6105520 - 27 27 1 1990 565.0000000 258.8972445 - 28 28 1 1990 331.0000000 237.7526768 - 29 29 1 1990 293.0000000 236.9073299 - 30 30 1 1990 302.0000000 201.1456819 - 31 31 1 1990 233.0000000 176.0323560 - 32 1 2 1990 198.0000000 184.6744659 - 33 2 2 1990 183.0000000 202.8716407 - 34 3 2 1990 206.0000000 207.9533575 - 35 4 2 1990 215.0000000 179.2980003 - 36 5 2 1990 183.0000000 159.7333718 - 37 6 2 1990 159.0000000 145.4497724 - 38 7 2 1990 167.0000000 135.6974958 - 39 8 2 1990 138.0000000 130.0857897 - 40 9 2 1990 126.0000000 127.7542126 - 41 10 2 1990 131.0000000 203.0149113 - 42 11 2 1990 173.0000000 261.1210947 - 43 12 2 1990 240.0000000 297.2822635 - 44 13 2 1990 270.0000000 463.0040923 - 45 14 2 1990 458.0000000 844.1701546 - 46 15 2 1990 996.0000000 1107.2401917 - 47 16 2 1990 1370.0000000 970.5281311 - 48 17 2 1990 1540.0000000 796.5406011 - 49 18 2 1990 1210.0000000 654.7879959 - 50 19 2 1990 616.0000000 537.6171922 - 51 20 2 1990 465.0000000 443.2663156 - 52 21 2 1990 373.0000000 367.0805514 - 53 22 2 1990 298.0000000 307.1206034 - 54 23 2 1990 270.0000000 261.8703331 - 55 24 2 1990 234.0000000 228.1443114 - 56 25 2 1990 218.0000000 208.4581475 - 57 26 2 1990 203.0000000 315.4969021 - 58 27 2 1990 314.0000000 528.3813188 - 59 28 2 1990 520.0000000 726.2713547 - 60 1 3 1990 689.0000000 799.1697718 - 61 2 3 1990 777.0000000 694.4219682 - 62 3 3 1990 584.0000000 571.2695822 - 63 4 3 1990 429.0000000 471.8615371 - 64 5 3 1990 365.0000000 394.3201520 - 65 6 3 1990 281.0000000 330.6564394 - 66 7 3 1990 257.0000000 279.8982513 - 67 8 3 1990 231.0000000 243.5238502 - 68 9 3 1990 211.0000000 217.0695947 - 69 10 3 1990 191.0000000 197.0550140 - 70 11 3 1990 182.0000000 182.7301594 - 71 12 3 1990 173.0000000 172.7534525 - 72 13 3 1990 159.0000000 164.3824319 - 73 14 3 1990 153.0000000 158.5482266 - 74 15 3 1990 141.0000000 152.8877773 - 75 16 3 1990 136.0000000 145.9515929 - 76 17 3 1990 130.0000000 140.1031185 - 77 18 3 1990 123.0000000 134.8146618 - 78 19 3 1990 115.0000000 130.0180888 - 79 20 3 1990 113.0000000 126.2396866 - 80 21 3 1990 102.0000000 122.9738665 - 81 22 3 1990 105.0000000 120.0966488 - 82 23 3 1990 106.0000000 117.1894611 - 83 24 3 1990 87.0000000 114.1545618 - 84 25 3 1990 80.0000000 112.0516524 - 85 26 3 1990 84.0000000 109.1476025 - 86 27 3 1990 82.0000000 106.6091584 - 87 28 3 1990 91.0000000 115.6494617 - 88 29 3 1990 97.0000000 122.4786121 - 89 30 3 1990 110.0000000 113.8738697 - 90 31 3 1990 97.0000000 109.9875141 - 91 1 4 1990 93.0000000 107.0269250 - 92 2 4 1990 85.0000000 104.2948387 - 93 3 4 1990 84.0000000 108.9481813 - 94 4 4 1990 81.0000000 112.7408786 - 95 5 4 1990 81.0000000 105.3387223 - 96 6 4 1990 76.0000000 103.5947756 - 97 7 4 1990 72.0000000 100.8303801 - 98 8 4 1990 68.0000000 98.3649164 - 99 9 4 1990 72.0000000 96.1405276 - 100 10 4 1990 65.0000000 94.1262393 - 101 11 4 1990 62.0000000 92.9544786 - 102 12 4 1990 62.0000000 94.1097827 - 103 13 4 1990 65.0000000 99.0081224 - 104 14 4 1990 68.0000000 122.3638336 - 105 15 4 1990 75.0000000 126.2261615 - 106 16 4 1990 90.0000000 121.2336385 - 107 17 4 1990 92.0000000 117.9159663 - 108 18 4 1990 94.0000000 117.8479481 - 109 19 4 1990 110.0000000 112.6005929 - 110 20 4 1990 99.0000000 108.7274658 - 111 21 4 1990 86.0000000 105.4929373 - 112 22 4 1990 86.0000000 110.7284639 - 113 23 4 1990 86.0000000 118.0090058 - 114 24 4 1990 88.0000000 117.8736238 - 115 25 4 1990 93.0000000 110.2744568 - 116 26 4 1990 99.0000000 106.3393749 - 117 27 4 1990 86.0000000 103.4039965 - 118 28 4 1990 74.0000000 100.5356117 - 119 29 4 1990 72.0000000 97.6411026 - 120 30 4 1990 77.0000000 94.9704126 - 121 1 5 1990 56.0000000 92.5008243 - 122 2 5 1990 64.0000000 90.2107375 - 123 3 5 1990 58.0000000 88.0812102 - 124 4 5 1990 50.0000000 86.0955789 - 125 5 5 1990 50.0000000 84.2391543 - 126 6 5 1990 50.0000000 82.4989625 - 127 7 5 1990 50.0000000 80.9196617 - 128 8 5 1990 53.0000000 80.6076643 - 129 9 5 1990 62.0000000 79.4833896 - 130 10 5 1990 64.0000000 85.0339817 - 131 11 5 1990 65.0000000 86.1111407 - 132 12 5 1990 75.0000000 79.1862952 - 133 13 5 1990 71.0000000 77.2983522 - 134 14 5 1990 63.0000000 75.9184242 - 135 15 5 1990 61.0000000 74.9733396 - 136 16 5 1990 49.0000000 73.7901678 - 137 17 5 1990 46.0000000 72.3294444 - 138 18 5 1990 46.0000000 71.0969244 - 139 19 5 1990 48.0000000 69.9253393 - 140 20 5 1990 41.0000000 68.8843411 - 141 21 5 1990 45.0000000 74.9555948 - 142 22 5 1990 52.0000000 75.3161421 - 143 23 5 1990 50.0000000 74.8726821 - 144 24 5 1990 56.0000000 78.9172581 - 145 25 5 1990 41.0000000 74.8756832 - 146 26 5 1990 40.0000000 69.8926009 - 147 27 5 1990 39.0000000 68.5187166 - 148 28 5 1990 39.0000000 67.2273776 - 149 29 5 1990 33.0000000 66.0097536 - 150 30 5 1990 37.0000000 64.8584941 - 151 31 5 1990 30.0000000 63.7671117 - 152 1 6 1990 37.0000000 69.5584544 - 153 2 6 1990 36.0000000 71.1022259 - 154 3 6 1990 40.0000000 101.4481348 - 155 4 6 1990 45.0000000 83.8791532 - 156 5 6 1990 39.0000000 69.3014120 - 157 6 6 1990 48.0000000 67.6875962 - 158 7 6 1990 39.0000000 116.0696918 - 159 8 6 1990 49.0000000 126.4518916 - 160 9 6 1990 84.0000000 112.4003278 - 161 10 6 1990 91.0000000 101.5020634 - 162 11 6 1990 80.0000000 91.3265109 - 163 12 6 1990 66.0000000 87.5180765 - 164 13 6 1990 53.0000000 84.3415036 - 165 14 6 1990 64.0000000 81.3066685 - 166 15 6 1990 55.0000000 78.3759805 - 167 16 6 1990 54.0000000 75.8125141 - 168 17 6 1990 42.0000000 73.4680295 - 169 18 6 1990 48.0000000 71.6809135 - 170 19 6 1990 48.0000000 89.1600657 - 171 20 6 1990 60.0000000 107.6447934 - 172 21 6 1990 75.0000000 101.4161257 - 173 22 6 1990 78.0000000 88.4866137 - 174 23 6 1990 66.0000000 84.6544588 - 175 24 6 1990 63.0000000 80.6867450 - 176 25 6 1990 52.0000000 77.6877924 - 177 26 6 1990 49.0000000 75.1453763 - 178 27 6 1990 44.0000000 82.0564642 - 179 28 6 1990 51.0000000 80.3544166 - 180 29 6 1990 61.0000000 101.0312297 - 181 30 6 1990 81.0000000 137.3018604 - 182 1 7 1990 79.0000000 112.5213750 - 183 2 7 1990 92.0000000 97.8790011 - 184 3 7 1990 72.0000000 104.0965601 - 185 4 7 1990 58.0000000 121.7168752 - 186 5 7 1990 69.0000000 153.4900609 - 187 6 7 1990 94.0000000 140.8684274 - 188 7 7 1990 199.0000000 135.7808958 - 189 8 7 1990 133.0000000 139.1563625 - 190 9 7 1990 124.0000000 120.9558957 - 191 10 7 1990 123.0000000 112.6538708 - 192 11 7 1990 99.0000000 106.3335602 - 193 12 7 1990 88.0000000 101.0630522 - 194 13 7 1990 84.0000000 96.3799960 - 195 14 7 1990 72.0000000 92.1647088 - 196 15 7 1990 55.0000000 88.3586697 - 197 16 7 1990 65.0000000 84.9116625 - 198 17 7 1990 50.0000000 81.7804551 - 199 18 7 1990 50.0000000 78.9277143 - 200 19 7 1990 46.0000000 76.3211063 - 201 20 7 1990 44.0000000 73.9325496 - 202 21 7 1990 42.0000000 71.7375922 - 203 22 7 1990 37.0000000 69.7148884 - 204 23 7 1990 38.0000000 67.8457602 - 205 24 7 1990 44.0000000 66.1138268 - 206 25 7 1990 30.0000000 64.5046907 - 207 26 7 1990 26.0000000 63.0056717 - 208 27 7 1990 31.0000000 61.6055801 - 209 28 7 1990 33.0000000 63.4594458 - 210 29 7 1990 42.0000000 60.7624381 - 211 30 7 1990 36.0000000 58.4167192 - 212 31 7 1990 34.0000000 57.2813198 - 213 1 8 1990 25.0000000 56.2097429 - 214 2 8 1990 22.0000000 55.1960076 - 215 3 8 1990 28.0000000 54.2347827 - 216 4 8 1990 25.0000000 53.3213087 - 217 5 8 1990 19.0000000 52.4515042 - 218 6 8 1990 22.0000000 51.6220724 - 219 7 8 1990 19.0000000 50.8280867 - 220 8 8 1990 22.0000000 50.0672248 - 221 9 8 1990 19.0000000 49.3368202 - 222 10 8 1990 20.0000000 48.6343946 - 223 11 8 1990 19.0000000 47.9577155 - 224 12 8 1990 19.0000000 47.3047694 - 225 13 8 1990 22.0000000 51.8223006 - 226 14 8 1990 36.0000000 73.3990585 - 227 15 8 1990 31.0000000 64.6406714 - 228 16 8 1990 30.0000000 58.9049887 - 229 17 8 1990 28.0000000 55.2682295 - 230 18 8 1990 34.0000000 48.3417851 - 231 19 8 1990 21.0000000 47.4751551 - 232 20 8 1990 30.0000000 46.6547552 - 233 21 8 1990 22.0000000 45.8758593 - 234 22 8 1990 21.0000000 45.1346035 - 235 23 8 1990 23.0000000 44.4275511 - 236 24 8 1990 20.0000000 43.7516405 - 237 25 8 1990 29.0000000 43.1063668 - 238 26 8 1990 20.0000000 43.0062848 - 239 27 8 1990 22.0000000 44.1171753 - 240 28 8 1990 23.0000000 42.0399801 - 241 29 8 1990 35.0000000 40.9861777 - 242 30 8 1990 51.0000000 129.1315778 - 243 31 8 1990 80.0000000 127.7381635 - 244 1 9 1990 56.0000000 68.6925680 - 245 2 9 1990 33.0000000 59.0446265 - 246 3 9 1990 27.0000000 56.8002379 - 247 4 9 1990 27.0000000 58.9053163 - 248 5 9 1990 28.0000000 58.0102150 - 249 6 9 1990 26.0000000 52.6929226 - 250 7 9 1990 24.0000000 57.7712962 - 251 8 9 1990 33.0000000 54.4833086 - 252 9 9 1990 26.0000000 50.0089346 - 253 10 9 1990 27.0000000 48.5437462 - 254 11 9 1990 22.0000000 47.1952048 - 255 12 9 1990 22.0000000 45.9500190 - 256 13 9 1990 21.0000000 44.7969172 - 257 14 9 1990 22.0000000 43.7260254 - 258 15 9 1990 22.0000000 42.7286748 - 259 16 9 1990 22.0000000 41.7972401 - 260 17 9 1990 20.0000000 40.9250002 - 261 18 9 1990 22.0000000 40.1060198 - 262 19 9 1990 16.0000000 39.3350488 - 263 20 9 1990 22.0000000 38.6074345 - 264 21 9 1990 19.0000000 47.2506864 - 265 22 9 1990 32.0000000 115.2201028 - 266 23 9 1990 27.0000000 98.0699305 - 267 24 9 1990 45.0000000 75.0416154 - 268 25 9 1990 42.0000000 60.4844440 - 269 26 9 1990 39.0000000 56.0894173 - 270 27 9 1990 30.0000000 53.8702751 - 271 28 9 1990 28.0000000 51.8537501 - 272 29 9 1990 30.0000000 50.0192275 - 273 30 9 1990 30.0000000 101.6401077 - 274 1 10 1990 56.0000000 151.1747384 - 275 2 10 1990 72.0000000 120.3030296 - 276 3 10 1990 73.0000000 117.1987197 - 277 4 10 1990 68.0000000 111.9995694 - 278 5 10 1990 53.0000000 97.7660670 - 279 6 10 1990 42.0000000 90.3996314 - 280 7 10 1990 33.0000000 84.9820657 - 281 8 10 1990 42.0000000 80.3077527 - 282 9 10 1990 34.0000000 76.1273117 - 283 10 10 1990 36.0000000 72.3651405 - 284 11 10 1990 36.0000000 68.9781040 - 285 12 10 1990 28.0000000 65.9202071 - 286 13 10 1990 32.0000000 63.1518275 - 287 14 10 1990 27.0000000 60.6387295 - 288 15 10 1990 35.0000000 58.8433082 - 289 16 10 1990 42.0000000 59.6189206 - 290 17 10 1990 35.0000000 69.0092425 - 291 18 10 1990 39.0000000 68.2975900 - 292 19 10 1990 34.0000000 58.8292117 - 293 20 10 1990 32.0000000 56.6737376 - 294 21 10 1990 34.0000000 54.7125365 - 295 22 10 1990 27.0000000 52.9156134 - 296 23 10 1990 31.0000000 51.2648766 - 297 24 10 1990 28.0000000 49.7444965 - 298 25 10 1990 25.0000000 49.5960653 - 299 26 10 1990 29.0000000 68.1888993 - 300 27 10 1990 31.0000000 76.8415825 - 301 28 10 1990 65.0000000 209.2637390 - 302 29 10 1990 69.0000000 232.3375446 - 303 30 10 1990 157.0000000 204.3058939 - 304 31 10 1990 190.0000000 178.4296555 - 305 1 11 1990 115.0000000 179.5780445 - 306 2 11 1990 104.0000000 187.8461299 - 307 3 11 1990 100.0000000 197.5581041 - 308 4 11 1990 131.0000000 192.7090079 - 309 5 11 1990 130.0000000 184.6175710 - 310 6 11 1990 115.0000000 162.4062766 - 311 7 11 1990 102.0000000 143.5692565 - 312 8 11 1990 95.0000000 127.7053023 - 313 9 11 1990 81.0000000 114.5738986 - 314 10 11 1990 66.0000000 120.9957007 - 315 11 11 1990 67.0000000 154.4461951 - 316 12 11 1990 74.0000000 169.2271559 - 317 13 11 1990 109.0000000 160.6614801 - 318 14 11 1990 92.0000000 185.0618769 - 319 15 11 1990 92.0000000 201.5859742 - 320 16 11 1990 155.0000000 188.6224687 - 321 17 11 1990 159.0000000 176.3355004 - 322 18 11 1990 131.0000000 192.4142822 - 323 19 11 1990 161.0000000 204.5101127 - 324 20 11 1990 196.0000000 314.5135142 - 325 21 11 1990 336.0000000 396.0736950 - 326 22 11 1990 566.0000000 358.0477682 - 327 23 11 1990 373.0000000 363.9950807 - 328 24 11 1990 293.0000000 334.6945074 - 329 25 11 1990 264.0000000 318.5959982 - 330 26 11 1990 226.0000000 287.7253381 - 331 27 11 1990 201.0000000 246.3703679 - 332 28 11 1990 180.0000000 214.3813321 - 333 29 11 1990 161.0000000 200.7406350 - 334 30 11 1990 149.0000000 188.6398360 - 335 1 12 1990 134.0000000 165.5104683 - 336 2 12 1990 113.0000000 150.3324184 - 337 3 12 1990 99.0000000 139.8890101 - 338 4 12 1990 107.0000000 132.2358459 - 339 5 12 1990 99.0000000 125.2897687 - 340 6 12 1990 89.0000000 118.9115645 - 341 7 12 1990 77.0000000 113.2394694 - 342 8 12 1990 71.0000000 108.1423944 - 343 9 12 1990 68.0000000 103.5479007 - 344 10 12 1990 73.0000000 99.3938558 - 345 11 12 1990 84.0000000 95.6267987 - 346 12 12 1990 88.0000000 113.5956834 - 347 13 12 1990 92.0000000 120.4615787 - 348 14 12 1990 128.0000000 112.4913552 - 349 15 12 1990 136.0000000 105.3875862 - 350 16 12 1990 114.0000000 100.5794860 - 351 17 12 1990 101.0000000 96.3187423 - 352 18 12 1990 93.0000000 92.4820371 - 353 19 12 1990 85.0000000 89.0153595 - 354 20 12 1990 81.0000000 85.8724847 - 355 21 12 1990 106.0000000 122.3182141 - 356 22 12 1990 159.0000000 152.2892298 - 357 23 12 1990 250.0000000 170.5539551 - 358 24 12 1990 298.0000000 161.5898248 - 359 25 12 1990 261.0000000 208.0856243 - 360 26 12 1990 228.0000000 328.9256904 - 361 27 12 1990 409.0000000 401.7638601 - 362 28 12 1990 486.0000000 426.2737504 - 363 29 12 1990 440.0000000 537.0403519 - 364 30 12 1990 486.0000000 672.5960348 - 365 31 12 1990 774.0000000 761.3193495 - 366 1 1 1991 889.0000000 804.7506382 - 367 2 1 1991 863.0000000 850.7842715 - 368 3 1 1991 875.0000000 912.3383119 - 369 4 1 1991 932.0000000 820.9666129 - 370 5 1 1991 826.0000000 774.6060998 - 371 6 1 1991 731.0000000 723.1524531 - 372 7 1 1991 613.0000000 682.9711798 - 373 8 1 1991 610.0000000 670.4245697 - 374 9 1 1991 686.0000000 605.2099291 - 375 10 1 1991 556.0000000 641.4390495 - 376 11 1 1991 669.0000000 678.4533648 - 377 12 1 1991 828.0000000 637.5180374 - 378 13 1 1991 735.0000000 524.0373367 - 379 14 1 1991 513.0000000 433.6345060 - 380 15 1 1991 411.0000000 360.9161237 - 381 16 1 1991 345.0000000 302.4660774 - 382 17 1 1991 293.0000000 258.4694027 - 383 18 1 1991 251.0000000 227.8399473 - 384 19 1 1991 222.0000000 206.3754762 - 385 20 1 1991 215.0000000 191.9645087 - 386 21 1 1991 213.0000000 186.4765279 - 387 22 1 1991 202.0000000 187.3412721 - 388 23 1 1991 200.0000000 178.8360009 - 389 24 1 1991 192.0000000 169.8693895 - 390 25 1 1991 176.0000000 161.6256864 - 391 26 1 1991 164.0000000 154.3682122 - 392 27 1 1991 157.0000000 147.6927910 - 393 28 1 1991 134.0000000 141.6957440 - 394 29 1 1991 130.0000000 136.2891837 - 395 30 1 1991 119.0000000 131.3980596 - 396 31 1 1991 107.0000000 126.9580990 - 397 1 2 1991 112.0000000 122.9140870 - 398 2 2 1991 109.0000000 119.2184503 - 399 3 2 1991 101.0000000 115.8300836 - 400 4 2 1991 98.0000000 112.7133753 - 401 5 2 1991 84.0000000 109.8373943 - 402 6 2 1991 93.0000000 107.1752093 - 403 7 2 1991 80.0000000 104.7033169 - 404 8 2 1991 73.0000000 102.4011594 - 405 9 2 1991 89.0000000 100.2507174 - 406 10 2 1991 84.0000000 98.2361638 - 407 11 2 1991 78.0000000 96.3435701 - 408 12 2 1991 79.0000000 94.5606550 - 409 13 2 1991 77.0000000 92.8765703 - 410 14 2 1991 80.0000000 91.2817168 - 411 15 2 1991 72.0000000 89.7675861 - 412 16 2 1991 78.0000000 89.9928272 - 413 17 2 1991 74.0000000 89.9401465 - 414 18 2 1991 77.0000000 88.2817131 - 415 19 2 1991 73.0000000 98.6169263 - 416 20 2 1991 69.0000000 114.3076439 - 417 21 2 1991 74.0000000 145.0143857 - 418 22 2 1991 81.0000000 160.0963300 - 419 23 2 1991 110.0000000 155.9735912 - 420 24 2 1991 180.0000000 151.9290637 - 421 25 2 1991 213.0000000 148.8248810 - 422 26 2 1991 222.0000000 145.4281456 - 423 27 2 1991 208.0000000 146.5111612 - 424 28 2 1991 211.0000000 140.4491504 - 425 1 3 1991 214.0000000 135.4117648 - 426 2 3 1991 208.0000000 143.2502808 - 427 3 3 1991 221.0000000 141.9111867 - 428 4 3 1991 281.0000000 132.9407850 - 429 5 3 1991 219.0000000 127.3317604 - 430 6 3 1991 190.0000000 122.3988201 - 431 7 3 1991 173.0000000 117.9279303 - 432 8 3 1991 164.0000000 114.0989585 - 433 9 3 1991 142.0000000 111.3850327 - 434 10 3 1991 133.0000000 111.1536250 - 435 11 3 1991 133.0000000 108.3490877 - 436 12 3 1991 118.0000000 104.9334473 - 437 13 3 1991 127.0000000 101.7968791 - 438 14 3 1991 113.0000000 98.9168387 - 439 15 3 1991 107.0000000 96.2617842 - 440 16 3 1991 100.0000000 93.8068118 - 441 17 3 1991 100.0000000 91.5355993 - 442 18 3 1991 95.0000000 89.4683099 - 443 19 3 1991 98.0000000 146.3472019 - 444 20 3 1991 119.0000000 154.1527948 - 445 21 3 1991 159.0000000 169.5721199 - 446 22 3 1991 196.0000000 184.0306099 - 447 23 3 1991 242.0000000 167.6916868 - 448 24 3 1991 216.0000000 154.6224809 - 449 25 3 1991 180.0000000 145.5410009 - 450 26 3 1991 145.0000000 138.0819270 - 451 27 3 1991 127.0000000 132.8140416 - 452 28 3 1991 117.0000000 126.1634900 - 453 29 3 1991 109.0000000 120.5927916 - 454 30 3 1991 106.0000000 115.5836280 - 455 31 3 1991 99.0000000 111.0640741 - 456 1 4 1991 96.0000000 106.9727555 - 457 2 4 1991 88.0000000 103.2570063 - 458 3 4 1991 87.0000000 99.8714926 - 459 4 4 1991 82.0000000 97.2341245 - 460 5 4 1991 84.0000000 95.1843897 - 461 6 4 1991 67.0000000 92.4790326 - 462 7 4 1991 89.0000000 90.1853007 - 463 8 4 1991 75.0000000 88.1692738 - 464 9 4 1991 79.0000000 86.0444252 - 465 10 4 1991 70.0000000 84.0013696 - 466 11 4 1991 69.0000000 82.0967318 - 467 12 4 1991 69.0000000 80.3189275 - 468 13 4 1991 56.0000000 78.6549575 - 469 14 4 1991 63.0000000 77.0961469 - 470 15 4 1991 58.0000000 75.6320842 - 471 16 4 1991 56.0000000 74.2447139 - 472 17 4 1991 54.0000000 72.9323135 - 473 18 4 1991 57.0000000 71.7378640 - 474 19 4 1991 53.0000000 71.7856763 - 475 20 4 1991 53.0000000 71.4621217 - 476 21 4 1991 65.0000000 70.3647193 - 477 22 4 1991 69.0000000 72.2932369 - 478 23 4 1991 61.0000000 73.8481430 - 479 24 4 1991 56.0000000 70.5364997 - 480 25 4 1991 56.0000000 68.9117116 - 481 26 4 1991 53.0000000 67.7090982 - 482 27 4 1991 49.0000000 66.5864451 - 483 28 4 1991 53.0000000 65.5239899 - 484 29 4 1991 48.0000000 69.1396751 - 485 30 4 1991 57.0000000 114.3455421 - 486 1 5 1991 69.0000000 108.9238935 - 487 2 5 1991 89.0000000 86.9693864 - 488 3 5 1991 105.0000000 83.4263739 - 489 4 5 1991 79.0000000 80.8888718 - 490 5 5 1991 69.0000000 78.6951032 - 491 6 5 1991 71.0000000 76.9199828 - 492 7 5 1991 60.0000000 74.6805122 - 493 8 5 1991 64.0000000 72.7652894 - 494 9 5 1991 59.0000000 70.9977532 - 495 10 5 1991 57.0000000 71.3958946 - 496 11 5 1991 55.0000000 73.6635605 - 497 12 5 1991 53.0000000 70.2067704 - 498 13 5 1991 52.0000000 68.2853243 - 499 14 5 1991 50.0000000 67.0496302 - 500 15 5 1991 52.0000000 71.6828135 - 501 16 5 1991 54.0000000 72.6075140 - 502 17 5 1991 54.0000000 67.6737776 - 503 18 5 1991 55.0000000 66.2227792 - 504 19 5 1991 48.0000000 64.8797981 - 505 20 5 1991 48.0000000 63.6121080 - 506 21 5 1991 49.0000000 62.4129080 - 507 22 5 1991 41.0000000 61.2762441 - 508 23 5 1991 40.0000000 60.1967504 - 509 24 5 1991 40.0000000 59.1695864 - 510 25 5 1991 39.0000000 58.1903813 - 511 26 5 1991 43.0000000 57.2551846 - 512 27 5 1991 39.0000000 56.3604225 - 513 28 5 1991 36.0000000 55.5028593 - 514 29 5 1991 33.0000000 54.6795625 - 515 30 5 1991 39.0000000 53.8878727 - 516 31 5 1991 34.0000000 53.1253758 - 517 1 6 1991 37.0000000 52.3898792 - 518 2 6 1991 35.0000000 51.6793892 - 519 3 6 1991 29.0000000 50.9920925 - 520 4 6 1991 33.0000000 50.3263378 - 521 5 6 1991 34.0000000 49.7087794 - 522 6 6 1991 32.0000000 67.3999767 - 523 7 6 1991 38.0000000 70.2486635 - 524 8 6 1991 39.0000000 59.8374148 - 525 9 6 1991 41.0000000 57.0641469 - 526 10 6 1991 44.0000000 70.9362142 - 527 11 6 1991 48.0000000 56.1751110 - 528 12 6 1991 42.0000000 53.1788643 - 529 13 6 1991 37.0000000 52.1476489 - 530 14 6 1991 39.0000000 51.3540157 - 531 15 6 1991 35.0000000 50.8675457 - 532 16 6 1991 31.0000000 53.7696944 - 533 17 6 1991 33.0000000 57.2291926 - 534 18 6 1991 31.0000000 54.4246037 - 535 19 6 1991 28.0000000 51.3470506 - 536 20 6 1991 60.0000000 87.6377538 - 537 21 6 1991 48.0000000 74.0908542 - 538 22 6 1991 54.0000000 58.4105559 - 539 23 6 1991 63.0000000 65.8019846 - 540 24 6 1991 41.0000000 59.9372350 - 541 25 6 1991 42.0000000 55.8178118 - 542 26 6 1991 43.0000000 54.3599617 - 543 27 6 1991 38.0000000 62.9429093 - 544 28 6 1991 38.0000000 62.8930052 - 545 29 6 1991 35.0000000 55.9708211 - 546 30 6 1991 41.0000000 53.7310118 - 547 1 7 1991 41.0000000 52.3650121 - 548 2 7 1991 38.0000000 51.0975004 - 549 3 7 1991 34.0000000 49.9153718 - 550 4 7 1991 27.0000000 48.8100960 - 551 5 7 1991 31.0000000 47.7741154 - 552 6 7 1991 30.0000000 46.8010708 - 553 7 7 1991 26.0000000 53.4500315 - 554 8 7 1991 30.0000000 52.4115728 - 555 9 7 1991 31.0000000 46.0618094 - 556 10 7 1991 23.0000000 45.1372192 - 557 11 7 1991 35.0000000 44.2663113 - 558 12 7 1991 19.0000000 45.3177078 - 559 13 7 1991 24.0000000 73.1846508 - 560 14 7 1991 26.0000000 66.6057353 - 561 15 7 1991 27.0000000 50.7722527 - 562 16 7 1991 41.0000000 47.4777475 - 563 17 7 1991 34.0000000 46.3482678 - 564 18 7 1991 27.0000000 45.2959470 - 565 19 7 1991 25.0000000 44.3102319 - 566 20 7 1991 23.0000000 43.3839079 - 567 21 7 1991 22.0000000 42.5126307 - 568 22 7 1991 27.0000000 41.6912062 - 569 23 7 1991 23.0000000 40.9150034 - 570 24 7 1991 21.0000000 41.8293140 - 571 25 7 1991 23.0000000 67.2749289 - 572 26 7 1991 33.0000000 60.3610371 - 573 27 7 1991 23.0000000 46.8758124 - 574 28 7 1991 29.0000000 43.3312564 - 575 29 7 1991 30.0000000 42.3356034 - 576 30 7 1991 35.0000000 56.0176051 - 577 31 7 1991 27.0000000 55.1520473 - 578 1 8 1991 45.0000000 44.0405292 - 579 2 8 1991 47.0000000 42.9111835 - 580 3 8 1991 40.0000000 41.9094506 - 581 4 8 1991 35.0000000 40.9729105 - 582 5 8 1991 26.0000000 40.0951768 - 583 6 8 1991 23.0000000 39.2705832 - 584 7 8 1991 30.0000000 40.2816100 - 585 8 8 1991 33.0000000 40.8023992 - 586 9 8 1991 30.0000000 37.9381757 - 587 10 8 1991 28.0000000 36.8298114 - 588 11 8 1991 19.0000000 36.1727437 - 589 12 8 1991 20.0000000 35.5488071 - 590 13 8 1991 16.0000000 34.9550760 - 591 14 8 1991 18.0000000 34.3889277 - 592 15 8 1991 18.0000000 33.8480074 - 593 16 8 1991 20.0000000 33.3301985 - 594 17 8 1991 16.0000000 32.8335961 - 595 18 8 1991 15.0000000 32.3564835 - 596 19 8 1991 15.0000000 31.8973123 - 597 20 8 1991 14.0000000 31.4546840 - 598 21 8 1991 15.0000000 31.0273343 - 599 22 8 1991 13.0000000 30.6148954 - 600 23 8 1991 12.0000000 30.4462367 - 601 24 8 1991 11.0000000 30.1657043 - 602 25 8 1991 12.0000000 29.4920562 - 603 26 8 1991 11.0000000 29.1235102 - 604 27 8 1991 13.0000000 28.7651474 - 605 28 8 1991 11.0000000 28.4161255 - 606 29 8 1991 12.0000000 28.0758451 - 607 30 8 1991 12.0000000 27.7437600 - 608 31 8 1991 11.0000000 27.4193710 - 609 1 9 1991 11.0000000 29.2273137 - 610 2 9 1991 17.0000000 29.4027675 - 611 3 9 1991 11.0000000 26.6869570 - 612 4 9 1991 12.0000000 26.3765810 - 613 5 9 1991 11.0000000 26.0733300 - 614 6 9 1991 11.0000000 25.7764928 - 615 7 9 1991 18.0000000 25.4857121 - 616 8 9 1991 11.0000000 25.2006607 - 617 9 9 1991 13.0000000 24.9210387 - 618 10 9 1991 12.0000000 25.5521301 - 619 11 9 1991 11.0000000 54.7284241 - 620 12 9 1991 20.0000000 47.9063683 - 621 13 9 1991 21.0000000 26.7499181 - 622 14 9 1991 29.0000000 26.3019881 - 623 15 9 1991 28.0000000 25.8766488 - 624 16 9 1991 20.0000000 25.4706224 - 625 17 9 1991 20.0000000 25.0822293 - 626 18 9 1991 20.0000000 24.7099649 - 627 19 9 1991 12.0000000 24.3524804 - 628 20 9 1991 11.0000000 24.0085641 - 629 21 9 1991 11.0000000 23.6771267 - 630 22 9 1991 22.0000000 45.8652962 - 631 23 9 1991 14.0000000 45.9458081 - 632 24 9 1991 48.0000000 26.3683052 - 633 25 9 1991 45.0000000 85.9103211 - 634 26 9 1991 80.0000000 88.9689010 - 635 27 9 1991 61.0000000 67.7357713 - 636 28 9 1991 61.0000000 93.6820681 - 637 29 9 1991 65.0000000 93.2934276 - 638 30 9 1991 63.0000000 81.4949932 - 639 1 10 1991 90.0000000 65.9917666 - 640 2 10 1991 59.0000000 60.4575847 - 641 3 10 1991 45.0000000 56.6725326 - 642 4 10 1991 42.0000000 53.3837068 - 643 5 10 1991 41.0000000 99.0889252 - 644 6 10 1991 41.0000000 106.7680126 - 645 7 10 1991 73.0000000 77.1421272 - 646 8 10 1991 96.0000000 69.2804595 - 647 9 10 1991 61.0000000 64.9239502 - 648 10 10 1991 44.0000000 61.0529317 - 649 11 10 1991 42.0000000 57.7645936 - 650 12 10 1991 41.0000000 82.3989134 - 651 13 10 1991 42.0000000 82.3404180 - 652 14 10 1991 61.0000000 64.6552075 - 653 15 10 1991 55.0000000 61.0972209 - 654 16 10 1991 41.0000000 63.6264399 - 655 17 10 1991 48.0000000 79.3663796 - 656 18 10 1991 52.0000000 104.3541804 - 657 19 10 1991 66.0000000 88.4501078 - 658 20 10 1991 59.0000000 78.2499500 - 659 21 10 1991 71.0000000 73.8174678 - 660 22 10 1991 74.0000000 68.2331221 - 661 23 10 1991 70.0000000 64.4472947 - 662 24 10 1991 59.0000000 61.1020886 - 663 25 10 1991 57.0000000 58.1059050 - 664 26 10 1991 57.0000000 55.4025395 - 665 27 10 1991 51.0000000 52.9569283 - 666 28 10 1991 47.0000000 50.7387433 - 667 29 10 1991 48.0000000 48.7216781 - 668 30 10 1991 45.0000000 51.5486840 - 669 31 10 1991 43.0000000 54.1868844 - 670 1 11 1991 40.0000000 66.5018304 - 671 2 11 1991 47.0000000 69.5199055 - 672 3 11 1991 46.0000000 97.5434648 - 673 4 11 1991 76.0000000 133.5452433 - 674 5 11 1991 60.0000000 125.5580168 - 675 6 11 1991 132.0000000 117.5141572 - 676 7 11 1991 133.0000000 124.6852881 - 677 8 11 1991 113.0000000 149.2042065 - 678 9 11 1991 120.0000000 159.0548542 - 679 10 11 1991 141.0000000 141.1455645 - 680 11 11 1991 208.0000000 167.8212611 - 681 12 11 1991 166.0000000 228.8669257 - 682 13 11 1991 183.0000000 302.1513572 - 683 14 11 1991 299.0000000 446.4209756 - 684 15 11 1991 521.0000000 416.3101284 - 685 16 11 1991 443.0000000 357.0151946 - 686 17 11 1991 304.0000000 303.7538182 - 687 18 11 1991 231.0000000 295.1697054 - 688 19 11 1991 192.0000000 291.6057820 - 689 20 11 1991 199.0000000 264.6219276 - 690 21 11 1991 201.0000000 242.2996362 - 691 22 11 1991 173.0000000 207.4191856 - 692 23 11 1991 159.0000000 179.5543557 - 693 24 11 1991 160.0000000 158.9308498 - 694 25 11 1991 146.0000000 141.8978779 - 695 26 11 1991 110.0000000 127.3986575 - 696 27 11 1991 114.0000000 116.6588721 - 697 28 11 1991 97.0000000 109.9343285 - 698 29 11 1991 89.0000000 104.1814454 - 699 30 11 1991 73.0000000 99.0213515 - 700 1 12 1991 69.0000000 94.3789664 - 701 2 12 1991 67.0000000 90.1905251 - 702 3 12 1991 63.0000000 86.4011195 - 703 4 12 1991 58.0000000 82.9633264 - 704 5 12 1991 59.0000000 79.8360698 - 705 6 12 1991 53.0000000 76.9836756 - 706 7 12 1991 54.0000000 74.3750808 - 707 8 12 1991 51.0000000 71.9831716 - 708 9 12 1991 47.0000000 69.7842259 - 709 10 12 1991 42.0000000 67.7574433 - 710 11 12 1991 40.0000000 65.8845461 - 711 12 12 1991 39.0000000 64.1494417 - 712 13 12 1991 36.0000000 62.5379333 - 713 14 12 1991 37.0000000 61.0374740 - 714 15 12 1991 32.0000000 59.6369552 - 715 16 12 1991 37.0000000 71.3992867 - 716 17 12 1991 62.0000000 175.7368581 - 717 18 12 1991 118.0000000 219.2549780 - 718 19 12 1991 170.0000000 306.4859197 - 719 20 12 1991 229.0000000 410.7729034 - 720 21 12 1991 448.0000000 501.1010076 - 721 22 12 1991 464.0000000 675.3506711 - 722 23 12 1991 675.0000000 612.0230377 - 723 24 12 1991 844.0000000 529.6660126 - 724 25 12 1991 569.0000000 438.7565632 - 725 26 12 1991 358.0000000 368.0100213 - 726 27 12 1991 279.0000000 315.4329383 - 727 28 12 1991 238.0000000 271.1066547 - 728 29 12 1991 201.0000000 232.8476375 - 729 30 12 1991 185.0000000 202.4192868 - 730 31 12 1991 165.0000000 179.0792538 - 731 1 1 1992 140.0000000 160.7422874 - 732 2 1 1992 126.0000000 146.1884176 - 733 3 1 1992 117.0000000 136.2652762 - 734 4 1 1992 114.0000000 132.8052375 - 735 5 1 1992 108.0000000 128.1053999 - 736 6 1 1992 108.0000000 121.2790820 - 737 7 1 1992 101.0000000 115.7782787 - 738 8 1 1992 97.0000000 114.3497084 - 739 9 1 1992 89.0000000 131.0678717 - 740 10 1 1992 111.0000000 162.8015837 - 741 11 1 1992 135.0000000 157.5753360 - 742 12 1 1992 171.0000000 142.8340495 - 743 13 1 1992 125.0000000 134.9157936 - 744 14 1 1992 111.0000000 127.9492058 - 745 15 1 1992 100.0000000 121.7710670 - 746 16 1 1992 87.0000000 116.3535384 - 747 17 1 1992 75.0000000 111.3526877 - 748 18 1 1992 79.0000000 106.8163839 - 749 19 1 1992 70.0000000 109.4150454 - 750 20 1 1992 72.0000000 106.3215201 - 751 21 1 1992 87.0000000 103.2791799 - 752 22 1 1992 79.0000000 98.8716821 - 753 23 1 1992 71.0000000 95.3963102 - 754 24 1 1992 66.0000000 92.2310743 - 755 25 1 1992 67.0000000 89.3391503 - 756 26 1 1992 65.0000000 86.6886760 - 757 27 1 1992 59.0000000 84.2520059 - 758 28 1 1992 57.0000000 82.0424843 - 759 29 1 1992 54.0000000 80.4533831 - 760 30 1 1992 59.0000000 82.3561178 - 761 31 1 1992 57.0000000 89.6161904 - 762 1 2 1992 56.0000000 91.6509290 - 763 2 2 1992 54.0000000 89.5692635 - 764 3 2 1992 58.0000000 87.4246301 - 765 4 2 1992 63.0000000 144.5834744 - 766 5 2 1992 76.0000000 184.2463549 - 767 6 2 1992 250.0000000 208.8202612 - 768 7 2 1992 346.0000000 182.3717068 - 769 8 2 1992 241.0000000 162.3503949 - 770 9 2 1992 180.0000000 160.1894560 - 771 10 2 1992 164.0000000 167.2224932 - 772 11 2 1992 183.0000000 187.7019368 - 773 12 2 1992 215.0000000 216.7095447 - 774 13 2 1992 265.0000000 230.6186364 - 775 14 2 1992 287.0000000 244.6703242 - 776 15 2 1992 272.0000000 245.0591393 - 777 16 2 1992 253.0000000 273.8661885 - 778 17 2 1992 301.0000000 264.0201282 - 779 18 2 1992 275.0000000 225.5576641 - 780 19 2 1992 224.0000000 196.6415287 - 781 20 2 1992 194.0000000 174.8370193 - 782 21 2 1992 173.0000000 159.7091873 - 783 22 2 1992 157.0000000 149.7976215 - 784 23 2 1992 142.0000000 142.6632077 - 785 24 2 1992 133.0000000 137.8526790 - 786 25 2 1992 128.0000000 131.6682990 - 787 26 2 1992 125.0000000 125.1964509 - 788 27 2 1992 125.0000000 119.7494011 - 789 28 2 1992 110.0000000 114.8499060 - 790 29 2 1992 107.0000000 110.4124600 - 791 1 3 1992 97.0000000 106.5322092 - 792 2 3 1992 97.0000000 104.6705880 - 793 3 3 1992 86.0000000 105.4872210 - 794 4 3 1992 93.0000000 100.5941825 - 795 5 3 1992 86.0000000 97.5497897 - 796 6 3 1992 82.0000000 94.7602310 - 797 7 3 1992 80.0000000 92.0542483 - 798 8 3 1992 77.0000000 89.5510915 - 799 9 3 1992 73.0000000 87.2340889 - 800 10 3 1992 76.0000000 85.3071944 - 801 11 3 1992 68.0000000 83.6392501 - 802 12 3 1992 70.0000000 141.6128571 - 803 13 3 1992 116.0000000 208.0523356 - 804 14 3 1992 206.0000000 251.8980026 - 805 15 3 1992 433.0000000 306.4958934 - 806 16 3 1992 495.0000000 328.4576158 - 807 17 3 1992 331.0000000 277.5229118 - 808 18 3 1992 240.0000000 239.3299820 - 809 19 3 1992 215.0000000 208.8954491 - 810 20 3 1992 185.0000000 184.8796116 - 811 21 3 1992 185.0000000 177.2372863 - 812 22 3 1992 185.0000000 237.4942379 - 813 23 3 1992 213.0000000 344.6176417 - 814 24 3 1992 466.0000000 384.2023845 - 815 25 3 1992 580.0000000 402.3681125 - 816 26 3 1992 566.0000000 370.9293670 - 817 27 3 1992 487.0000000 329.8012667 - 818 28 3 1992 387.0000000 298.2305535 - 819 29 3 1992 311.0000000 263.9977648 - 820 30 3 1992 270.0000000 234.0380401 - 821 31 3 1992 246.0000000 220.9287683 - 822 1 4 1992 229.0000000 236.8884781 - 823 2 4 1992 222.0000000 229.2049506 - 824 3 4 1992 217.0000000 245.8696167 - 825 4 4 1992 208.0000000 303.8557121 - 826 5 4 1992 220.0000000 279.9632583 - 827 6 4 1992 210.0000000 245.0007417 - 828 7 4 1992 190.0000000 215.6197234 - 829 8 4 1992 173.0000000 191.4366152 - 830 9 4 1992 166.0000000 172.4032601 - 831 10 4 1992 133.0000000 157.5769552 - 832 11 4 1992 126.0000000 145.0991841 - 833 12 4 1992 124.0000000 136.8359451 - 834 13 4 1992 116.0000000 131.3251327 - 835 14 4 1992 112.0000000 134.1989899 - 836 15 4 1992 111.0000000 168.5487053 - 837 16 4 1992 137.0000000 177.2240076 - 838 17 4 1992 206.0000000 168.1794857 - 839 18 4 1992 176.0000000 165.8084852 - 840 19 4 1992 161.0000000 153.4572958 - 841 20 4 1992 161.0000000 145.9288402 - 842 21 4 1992 139.0000000 139.4616926 - 843 22 4 1992 139.0000000 133.6640177 - 844 23 4 1992 123.0000000 128.4314198 - 845 24 4 1992 119.0000000 123.6939123 - 846 25 4 1992 111.0000000 119.3924564 - 847 26 4 1992 94.0000000 115.5700589 - 848 27 4 1992 94.0000000 116.5295184 - 849 28 4 1992 102.0000000 121.1786359 - 850 29 4 1992 120.0000000 118.8693443 - 851 30 4 1992 120.0000000 113.9243341 - 852 1 5 1992 114.0000000 141.1755864 - 853 2 5 1992 115.0000000 156.6710236 - 854 3 5 1992 206.0000000 137.4494938 - 855 4 5 1992 215.0000000 130.2081184 - 856 5 5 1992 125.0000000 125.1338983 - 857 6 5 1992 123.0000000 120.5444785 - 858 7 5 1992 113.0000000 116.3741124 - 859 8 5 1992 77.0000000 112.5722169 - 860 9 5 1992 83.0000000 109.3546219 - 861 10 5 1992 83.0000000 119.4478419 - 862 11 5 1992 96.0000000 118.2482171 - 863 12 5 1992 120.0000000 108.1445025 - 864 13 5 1992 80.0000000 103.7198319 - 865 14 5 1992 76.0000000 100.8430281 - 866 15 5 1992 69.0000000 98.1889999 - 867 16 5 1992 63.0000000 95.7329764 - 868 17 5 1992 61.0000000 93.4534460 - 869 18 5 1992 60.0000000 91.3315693 - 870 19 5 1992 59.0000000 89.3508101 - 871 20 5 1992 67.0000000 87.4978961 - 872 21 5 1992 51.0000000 85.7625320 - 873 22 5 1992 44.0000000 84.1279097 - 874 23 5 1992 42.0000000 82.5813797 - 875 24 5 1992 51.0000000 81.2501668 - 876 25 5 1992 42.0000000 80.1127671 - 877 26 5 1992 54.0000000 90.3393835 - 878 27 5 1992 53.0000000 82.5433737 - 879 28 5 1992 59.0000000 78.2143981 - 880 29 5 1992 55.0000000 86.9570536 - 881 30 5 1992 54.0000000 86.5186134 - 882 31 5 1992 48.0000000 80.5820486 - 883 1 6 1992 63.0000000 83.3116479 - 884 2 6 1992 61.0000000 82.3930706 - 885 3 6 1992 55.0000000 83.6011229 - 886 4 6 1992 75.0000000 100.7278272 - 887 5 6 1992 53.0000000 113.6193544 - 888 6 6 1992 77.0000000 110.6663739 - 889 7 6 1992 114.0000000 106.3882829 - 890 8 6 1992 167.0000000 116.8412425 - 891 9 6 1992 116.0000000 105.7215788 - 892 10 6 1992 91.0000000 96.6437582 - 893 11 6 1992 85.0000000 93.3664662 - 894 12 6 1992 68.0000000 90.4239782 - 895 13 6 1992 71.0000000 87.7364185 - 896 14 6 1992 63.0000000 85.2616248 - 897 15 6 1992 59.0000000 82.9768683 - 898 16 6 1992 46.0000000 80.8615445 - 899 17 6 1992 44.0000000 78.8975956 - 900 18 6 1992 39.0000000 77.0691598 - 901 19 6 1992 41.0000000 75.3745266 - 902 20 6 1992 44.0000000 76.3161599 - 903 21 6 1992 39.0000000 74.2279973 - 904 22 6 1992 32.0000000 71.7014746 - 905 23 6 1992 40.0000000 72.9709714 - 906 24 6 1992 41.0000000 86.3337247 - 907 25 6 1992 42.0000000 80.4867751 - 908 26 6 1992 42.0000000 72.6463486 - 909 27 6 1992 48.0000000 70.2348514 - 910 28 6 1992 37.0000000 68.7659866 - 911 29 6 1992 40.0000000 67.3902401 - 912 30 6 1992 29.0000000 66.3213352 - 913 1 7 1992 30.0000000 65.8475946 - 914 2 7 1992 36.0000000 64.1218940 - 915 3 7 1992 29.0000000 69.4949340 - 916 4 7 1992 36.0000000 80.3598386 - 917 5 7 1992 50.0000000 98.6769084 - 918 6 7 1992 78.0000000 100.2160477 - 919 7 7 1992 54.0000000 81.3806262 - 920 8 7 1992 57.0000000 72.6988656 - 921 9 7 1992 51.0000000 70.9428430 - 922 10 7 1992 47.0000000 91.0200760 - 923 11 7 1992 46.0000000 110.5730083 - 924 12 7 1992 76.0000000 103.6987848 - 925 13 7 1992 72.0000000 91.4828767 - 926 14 7 1992 67.0000000 83.0142444 - 927 15 7 1992 63.0000000 80.0702945 - 928 16 7 1992 47.0000000 77.3870546 - 929 17 7 1992 47.0000000 74.9333915 - 930 18 7 1992 42.0000000 72.6828561 - 931 19 7 1992 41.0000000 70.6124753 - 932 20 7 1992 39.0000000 68.7022402 - 933 21 7 1992 37.0000000 68.5112754 - 934 22 7 1992 33.0000000 68.3133663 - 935 23 7 1992 33.0000000 65.0129061 - 936 24 7 1992 33.0000000 63.5177003 - 937 25 7 1992 37.0000000 62.1186225 - 938 26 7 1992 26.0000000 60.8036501 - 939 27 7 1992 24.0000000 59.5688710 - 940 28 7 1992 26.0000000 58.4065138 - 941 29 7 1992 29.0000000 57.3096755 - 942 30 7 1992 19.0000000 56.2722144 - 943 31 7 1992 22.0000000 57.5124699 - 944 1 8 1992 28.0000000 57.1202530 - 945 2 8 1992 35.0000000 54.0662242 - 946 3 8 1992 29.0000000 53.1675713 - 947 4 8 1992 36.0000000 52.3120405 - 948 5 8 1992 52.0000000 51.4950248 - 949 6 8 1992 74.0000000 50.7132006 - 950 7 8 1992 54.0000000 49.9635878 - 951 8 8 1992 57.0000000 49.2435116 - 952 9 8 1992 48.0000000 51.5565155 - 953 10 8 1992 47.0000000 50.3094602 - 954 11 8 1992 46.0000000 57.9597171 - 955 12 8 1992 75.0000000 57.1502287 - 956 13 8 1992 73.0000000 61.8328755 - 957 14 8 1992 66.0000000 64.7666355 - 958 15 8 1992 60.0000000 57.4315136 - 959 16 8 1992 47.0000000 49.2175113 - 960 17 8 1992 46.0000000 48.3017484 - 961 18 8 1992 42.0000000 47.4375890 - 962 19 8 1992 41.0000000 46.7499120 - 963 20 8 1992 40.0000000 53.9495004 - 964 21 8 1992 37.0000000 49.9632430 - 965 22 8 1992 32.0000000 47.4572172 - 966 23 8 1992 32.0000000 47.2227755 - 967 24 8 1992 32.0000000 44.7978369 - 968 25 8 1992 36.0000000 44.0021920 - 969 26 8 1992 27.0000000 43.2877858 - 970 27 8 1992 25.0000000 42.6073036 - 971 28 8 1992 25.0000000 42.5318478 - 972 29 8 1992 28.0000000 49.6576564 - 973 30 8 1992 20.0000000 63.6463566 - 974 31 8 1992 22.0000000 107.7256423 - 975 1 9 1992 49.0000000 94.8939575 - 976 2 9 1992 77.0000000 81.2404857 - 977 3 9 1992 67.0000000 76.7161436 - 978 4 9 1992 45.0000000 75.5730655 - 979 5 9 1992 44.0000000 67.6732296 - 980 6 9 1992 64.0000000 60.7306771 - 981 7 9 1992 52.0000000 58.3364750 - 982 8 9 1992 40.0000000 56.1661690 - 983 9 9 1992 30.0000000 54.1923429 - 984 10 9 1992 34.0000000 52.3918729 - 985 11 9 1992 32.0000000 51.1349788 - 986 12 9 1992 36.0000000 49.9287862 - 987 13 9 1992 28.0000000 48.2731974 - 988 14 9 1992 33.0000000 48.4747911 - 989 15 9 1992 35.0000000 50.4348720 - 990 16 9 1992 30.0000000 46.0075525 - 991 17 9 1992 32.0000000 44.8462351 - 992 18 9 1992 29.0000000 43.8560725 - 993 19 9 1992 30.0000000 43.4268315 - 994 20 9 1992 28.0000000 42.0207587 - 995 21 9 1992 29.0000000 41.1307663 - 996 22 9 1992 29.0000000 40.2973245 - 997 23 9 1992 27.0000000 39.5232891 - 998 24 9 1992 27.0000000 38.7819455 - 999 25 9 1992 23.0000000 38.0789610 - 1000 26 9 1992 28.0000000 37.4126007 - 1001 27 9 1992 25.0000000 36.7810676 - 1002 28 9 1992 25.0000000 38.1536354 - 1003 29 9 1992 27.0000000 39.8191829 - 1004 30 9 1992 25.0000000 36.0267917 - 1005 1 10 1992 27.0000000 35.9850314 - 1006 2 10 1992 33.0000000 38.1243262 - 1007 3 10 1992 29.0000000 38.7282295 - 1008 4 10 1992 31.0000000 36.4445106 - 1009 5 10 1992 25.0000000 49.4323920 - 1010 6 10 1992 25.0000000 55.5144682 - 1011 7 10 1992 36.0000000 43.4738553 - 1012 8 10 1992 42.0000000 37.4912763 - 1013 9 10 1992 43.0000000 39.3006645 - 1014 10 10 1992 26.0000000 45.5246056 - 1015 11 10 1992 27.0000000 42.4907770 - 1016 12 10 1992 27.0000000 37.8985785 - 1017 13 10 1992 26.0000000 37.0465379 - 1018 14 10 1992 26.0000000 36.3656630 - 1019 15 10 1992 23.0000000 50.5615881 - 1020 16 10 1992 21.0000000 49.2981942 - 1021 17 10 1992 26.0000000 42.9239898 - 1022 18 10 1992 34.0000000 45.0572927 - 1023 19 10 1992 37.0000000 40.7439687 - 1024 20 10 1992 31.0000000 49.0013100 - 1025 21 10 1992 31.0000000 49.1100790 - 1026 22 10 1992 35.0000000 47.3131258 - 1027 23 10 1992 33.0000000 75.0554229 - 1028 24 10 1992 40.0000000 140.0545577 - 1029 25 10 1992 74.0000000 186.1880381 - 1030 26 10 1992 161.0000000 188.8029075 - 1031 27 10 1992 285.0000000 204.2316458 - 1032 28 10 1992 244.0000000 226.0304587 - 1033 29 10 1992 263.0000000 237.1808370 - 1034 30 10 1992 276.0000000 198.7757377 - 1035 31 10 1992 186.0000000 170.8727688 - 1036 1 11 1992 154.0000000 149.9109125 - 1037 2 11 1992 112.0000000 155.8673247 - 1038 3 11 1992 104.0000000 159.9626447 - 1039 4 11 1992 96.0000000 150.9147638 - 1040 5 11 1992 99.0000000 132.3984761 - 1041 6 11 1992 126.0000000 117.3478703 - 1042 7 11 1992 91.0000000 106.7084335 - 1043 8 11 1992 84.0000000 101.8932278 - 1044 9 11 1992 81.0000000 108.0141816 - 1045 10 11 1992 85.0000000 146.3738491 - 1046 11 11 1992 126.0000000 234.0977738 - 1047 12 11 1992 279.0000000 280.3817877 - 1048 13 11 1992 390.0000000 288.7831427 - 1049 14 11 1992 294.0000000 297.6629228 - 1050 15 11 1992 260.0000000 388.6266495 - 1051 16 11 1992 398.0000000 528.4390320 - 1052 17 11 1992 520.0000000 502.8343319 - 1053 18 11 1992 487.0000000 478.0418156 - 1054 19 11 1992 380.0000000 488.4995236 - 1055 20 11 1992 385.0000000 418.1525582 - 1056 21 11 1992 351.0000000 444.3955209 - 1057 22 11 1992 309.0000000 521.4814057 - 1058 23 11 1992 587.0000000 433.5182896 - 1059 24 11 1992 661.0000000 372.1851274 - 1060 25 11 1992 447.0000000 375.3390255 - 1061 26 11 1992 361.0000000 398.8930879 - 1062 27 11 1992 351.0000000 381.2781520 - 1063 28 11 1992 353.0000000 412.5118780 - 1064 29 11 1992 369.0000000 501.7969937 - 1065 30 11 1992 452.0000000 489.4521138 - 1066 1 12 1992 441.0000000 404.7265305 - 1067 2 12 1992 348.0000000 437.8610192 - 1068 3 12 1992 394.0000000 483.7755273 - 1069 4 12 1992 455.0000000 524.6027539 - 1070 5 12 1992 491.0000000 556.8211503 - 1071 6 12 1992 469.0000000 489.8304058 - 1072 7 12 1992 364.0000000 474.9198395 - 1073 8 12 1992 338.0000000 418.2533090 - 1074 9 12 1992 334.0000000 351.1210927 - 1075 10 12 1992 268.0000000 293.7421704 - 1076 11 12 1992 236.0000000 291.5165442 - 1077 12 12 1992 230.0000000 300.6301896 - 1078 13 12 1992 239.0000000 273.2578419 - 1079 14 12 1992 256.0000000 232.2366764 - 1080 15 12 1992 217.0000000 208.4416560 - 1081 16 12 1992 201.0000000 195.6244584 - 1082 17 12 1992 188.0000000 188.2951712 - 1083 18 12 1992 176.0000000 177.6770962 - 1084 19 12 1992 170.0000000 166.6208449 - 1085 20 12 1992 168.0000000 164.1178974 - 1086 21 12 1992 131.0000000 169.3147897 - 1087 22 12 1992 133.0000000 169.6904193 - 1088 23 12 1992 134.0000000 157.8119227 - 1089 24 12 1992 127.0000000 149.5542622 - 1090 25 12 1992 117.0000000 142.5661809 - 1091 26 12 1992 113.0000000 136.3015461 - 1092 27 12 1992 100.0000000 130.6661858 - 1093 28 12 1992 94.0000000 125.5798521 - 1094 29 12 1992 87.0000000 120.9738912 - 1095 30 12 1992 86.0000000 116.7893736 - 1096 31 12 1992 81.0000000 112.9755576 - 1097 1 1 1993 77.0000000 109.4886220 - 1098 2 1 1993 76.0000000 106.2906152 - 1099 3 1 1993 61.0000000 103.3485806 - 1100 4 1 1993 61.0000000 100.6338267 - 1101 5 1 1993 57.0000000 98.1213140 - 1102 6 1 1993 66.0000000 115.8243114 - 1103 7 1 1993 67.0000000 136.0176177 - 1104 8 1 1993 84.0000000 139.4005247 - 1105 9 1 1993 90.0000000 145.9119053 - 1106 10 1 1993 113.0000000 191.1269131 - 1107 11 1 1993 265.0000000 394.0565076 - 1108 12 1 1993 559.0000000 574.6073478 - 1109 13 1 1993 832.0000000 575.8551087 - 1110 14 1 1993 601.0000000 497.2191019 - 1111 15 1 1993 436.0000000 407.5449952 - 1112 16 1 1993 339.0000000 337.3590477 - 1113 17 1 1993 292.0000000 287.1787738 - 1114 18 1 1993 247.0000000 253.4167959 - 1115 19 1 1993 218.0000000 228.5465239 - 1116 20 1 1993 205.0000000 208.2183198 - 1117 21 1 1993 190.0000000 195.7318482 - 1118 22 1 1993 176.0000000 189.0153218 - 1119 23 1 1993 173.0000000 183.6178106 - 1120 24 1 1993 173.0000000 238.4735350 - 1121 25 1 1993 199.0000000 333.9544182 - 1122 26 1 1993 361.0000000 291.1581528 - 1123 27 1 1993 295.0000000 293.3333328 - 1124 28 1 1993 238.0000000 315.0666589 - 1125 29 1 1993 263.0000000 296.4148482 - 1126 30 1 1993 245.0000000 261.1255064 - 1127 31 1 1993 222.0000000 228.9297187 - 1128 1 2 1993 199.0000000 205.2595049 - 1129 2 2 1993 186.0000000 186.8284777 - 1130 3 2 1993 171.0000000 172.2159518 - 1131 4 2 1993 157.0000000 161.6803312 - 1132 5 2 1993 159.0000000 153.7857226 - 1133 6 2 1993 129.0000000 146.9979903 - 1134 7 2 1993 119.0000000 141.1180341 - 1135 8 2 1993 119.0000000 135.6306815 - 1136 9 2 1993 105.0000000 130.6279917 - 1137 10 2 1993 106.0000000 126.0827207 - 1138 11 2 1993 105.0000000 121.9399860 - 1139 12 2 1993 95.0000000 118.1523590 - 1140 13 2 1993 91.0000000 114.6787385 - 1141 14 2 1993 88.0000000 111.4834122 - 1142 15 2 1993 84.0000000 108.5352721 - 1143 16 2 1993 83.0000000 106.1091657 - 1144 17 2 1993 79.0000000 106.8904880 - 1145 18 2 1993 78.0000000 107.8865597 - 1146 19 2 1993 84.0000000 107.1419613 - 1147 20 2 1993 91.0000000 121.9843846 - 1148 21 2 1993 91.0000000 126.2749738 - 1149 22 2 1993 90.0000000 124.0143857 - 1150 23 2 1993 103.0000000 118.9840172 - 1151 24 2 1993 94.0000000 114.4413588 - 1152 25 2 1993 81.0000000 110.6224977 - 1153 26 2 1993 78.0000000 107.2772311 - 1154 27 2 1993 75.0000000 108.5159312 - 1155 28 2 1993 76.0000000 107.3645768 - 1156 1 3 1993 80.0000000 103.7783237 - 1157 2 3 1993 75.0000000 102.2105436 - 1158 3 3 1993 76.0000000 100.9339478 - 1159 4 3 1993 72.0000000 97.8969619 - 1160 5 3 1993 65.0000000 95.3988097 - 1161 6 3 1993 64.0000000 93.1243846 - 1162 7 3 1993 64.0000000 91.4200563 - 1163 8 3 1993 68.0000000 90.7958734 - 1164 9 3 1993 68.0000000 88.5677667 - 1165 10 3 1993 67.0000000 88.2553949 - 1166 11 3 1993 61.0000000 89.1991698 - 1167 12 3 1993 57.0000000 89.9000635 - 1168 13 3 1993 58.0000000 87.8291779 - 1169 14 3 1993 54.0000000 85.9054209 - 1170 15 3 1993 66.0000000 84.1309943 - 1171 16 3 1993 54.0000000 82.5532864 - 1172 17 3 1993 57.0000000 81.0796365 - 1173 18 3 1993 57.0000000 79.7270072 - 1174 19 3 1993 52.0000000 78.3823431 - 1175 20 3 1993 57.0000000 77.0921781 - 1176 21 3 1993 58.0000000 76.8458494 - 1177 22 3 1993 57.0000000 93.9629711 - 1178 23 3 1993 56.0000000 97.7787040 - 1179 24 3 1993 63.0000000 87.8133108 - 1180 25 3 1993 76.0000000 85.6444480 - 1181 26 3 1993 56.0000000 83.6251911 - 1182 27 3 1993 59.0000000 81.7397879 - 1183 28 3 1993 59.0000000 79.9749382 - 1184 29 3 1993 54.0000000 78.3188495 - 1185 30 3 1993 48.0000000 76.7610481 - 1186 31 3 1993 55.0000000 75.2922159 - 1187 1 4 1993 48.0000000 75.8248241 - 1188 2 4 1993 53.0000000 78.9539504 - 1189 3 4 1993 47.0000000 76.8981189 - 1190 4 4 1993 59.0000000 84.7045394 - 1191 5 4 1993 53.0000000 104.7581629 - 1192 6 4 1993 64.0000000 101.7246509 - 1193 7 4 1993 63.0000000 92.3063412 - 1194 8 4 1993 75.0000000 90.2304443 - 1195 9 4 1993 64.0000000 87.1418656 - 1196 10 4 1993 59.0000000 89.2920259 - 1197 11 4 1993 60.0000000 95.4516769 - 1198 12 4 1993 63.0000000 93.3121764 - 1199 13 4 1993 69.0000000 91.7737217 - 1200 14 4 1993 79.0000000 90.0052591 - 1201 15 4 1993 82.0000000 87.2550705 - 1202 16 4 1993 68.0000000 85.4401662 - 1203 17 4 1993 56.0000000 83.0005317 - 1204 18 4 1993 59.0000000 80.8320103 - 1205 19 4 1993 61.0000000 78.7345741 - 1206 20 4 1993 62.0000000 76.7639899 - 1207 21 4 1993 57.0000000 74.9299406 - 1208 22 4 1993 53.0000000 73.2235802 - 1209 23 4 1993 47.0000000 71.6258988 - 1210 24 4 1993 46.0000000 70.1239008 - 1211 25 4 1993 47.0000000 68.7119909 - 1212 26 4 1993 45.0000000 67.3815967 - 1213 27 4 1993 43.0000000 66.1250825 - 1214 28 4 1993 41.0000000 64.9379227 - 1215 29 4 1993 38.0000000 63.8209685 - 1216 30 4 1993 39.0000000 63.2477755 - 1217 1 5 1993 40.0000000 62.4593108 - 1218 2 5 1993 41.0000000 63.4751840 - 1219 3 5 1993 45.0000000 62.0502507 - 1220 4 5 1993 49.0000000 60.4453586 - 1221 5 5 1993 40.0000000 59.4965901 - 1222 6 5 1993 43.0000000 58.7217681 - 1223 7 5 1993 38.0000000 58.3370884 - 1224 8 5 1993 38.0000000 58.4032625 - 1225 9 5 1993 43.0000000 57.3712645 - 1226 10 5 1993 44.0000000 56.8802443 - 1227 11 5 1993 41.0000000 56.8391094 - 1228 12 5 1993 51.0000000 66.0113156 - 1229 13 5 1993 63.0000000 104.0904476 - 1230 14 5 1993 68.0000000 76.3642057 - 1231 15 5 1993 77.0000000 65.1711618 - 1232 16 5 1993 77.0000000 63.4046808 - 1233 17 5 1993 59.0000000 61.7360422 - 1234 18 5 1993 49.0000000 60.2135302 - 1235 19 5 1993 43.0000000 65.6281489 - 1236 20 5 1993 44.0000000 74.3259904 - 1237 21 5 1993 48.0000000 69.5711466 - 1238 22 5 1993 44.0000000 61.8721460 - 1239 23 5 1993 46.0000000 60.2854330 - 1240 24 5 1993 40.0000000 58.8171815 - 1241 25 5 1993 43.0000000 57.4535972 - 1242 26 5 1993 30.0000000 57.0188056 - 1243 27 5 1993 45.0000000 67.8183240 - 1244 28 5 1993 43.0000000 72.0264154 - 1245 29 5 1993 44.0000000 62.2571588 - 1246 30 5 1993 54.0000000 64.7732235 - 1247 31 5 1993 56.0000000 64.2926212 - 1248 1 6 1993 44.0000000 58.1790035 - 1249 2 6 1993 43.0000000 59.4175247 - 1250 3 6 1993 33.0000000 64.9796987 - 1251 4 6 1993 45.0000000 58.7514868 - 1252 5 6 1993 46.0000000 56.3457577 - 1253 6 6 1993 42.0000000 54.9966601 - 1254 7 6 1993 40.0000000 53.7395551 - 1255 8 6 1993 30.0000000 52.5647863 - 1256 9 6 1993 31.0000000 51.6826107 - 1257 10 6 1993 32.0000000 51.0186747 - 1258 11 6 1993 25.0000000 51.0051003 - 1259 12 6 1993 33.0000000 52.4177106 - 1260 13 6 1993 29.0000000 50.2806231 - 1261 14 6 1993 40.0000000 52.2151544 - 1262 15 6 1993 42.0000000 54.0940181 - 1263 16 6 1993 37.0000000 51.2360540 - 1264 17 6 1993 46.0000000 49.5882339 - 1265 18 6 1993 47.0000000 47.9267956 - 1266 19 6 1993 50.0000000 50.1494599 - 1267 20 6 1993 43.0000000 77.5742716 - 1268 21 6 1993 69.0000000 68.4826756 - 1269 22 6 1993 61.0000000 75.3949702 - 1270 23 6 1993 67.0000000 85.4581352 - 1271 24 6 1993 77.0000000 66.3072050 - 1272 25 6 1993 87.0000000 63.7043051 - 1273 26 6 1993 55.0000000 61.5419222 - 1274 27 6 1993 43.0000000 59.5586718 - 1275 28 6 1993 40.0000000 57.7347372 - 1276 29 6 1993 30.0000000 56.0529308 - 1277 30 6 1993 40.0000000 54.4981787 - 1278 1 7 1993 40.0000000 55.4800474 - 1279 2 7 1993 27.0000000 54.8800973 - 1280 3 7 1993 34.0000000 51.7842258 - 1281 4 7 1993 30.0000000 50.4992265 - 1282 5 7 1993 31.0000000 49.4256219 - 1283 6 7 1993 27.0000000 48.2068376 - 1284 7 7 1993 31.0000000 47.1607785 - 1285 8 7 1993 26.0000000 46.1793209 - 1286 9 7 1993 23.0000000 46.2431140 - 1287 10 7 1993 24.0000000 46.9238342 - 1288 11 7 1993 25.0000000 51.1718939 - 1289 12 7 1993 34.0000000 60.6969284 - 1290 13 7 1993 40.0000000 58.5914440 - 1291 14 7 1993 41.0000000 78.9950311 - 1292 15 7 1993 46.0000000 65.8874288 - 1293 16 7 1993 39.0000000 52.2541691 - 1294 17 7 1993 43.0000000 51.2458401 - 1295 18 7 1993 35.0000000 50.4582426 - 1296 19 7 1993 49.0000000 70.0887763 - 1297 20 7 1993 38.0000000 69.3698698 - 1298 21 7 1993 41.0000000 65.0769335 - 1299 22 7 1993 45.0000000 60.6596247 - 1300 23 7 1993 41.0000000 53.7425594 - 1301 24 7 1993 42.0000000 52.1521355 - 1302 25 7 1993 40.0000000 50.7285954 - 1303 26 7 1993 35.0000000 49.3717717 - 1304 27 7 1993 40.0000000 74.3065089 - 1305 28 7 1993 40.0000000 64.2950331 - 1306 29 7 1993 36.0000000 51.9874185 - 1307 30 7 1993 40.0000000 109.1209375 - 1308 31 7 1993 61.0000000 92.2885413 - 1309 1 8 1993 36.0000000 65.4355688 - 1310 2 8 1993 46.0000000 62.5418352 - 1311 3 8 1993 32.0000000 59.9293570 - 1312 4 8 1993 38.0000000 57.5630150 - 1313 5 8 1993 32.0000000 55.4175934 - 1314 6 8 1993 25.0000000 53.4724679 - 1315 7 8 1993 26.0000000 51.6822514 - 1316 8 8 1993 29.0000000 50.0419586 - 1317 9 8 1993 29.0000000 57.8969276 - 1318 10 8 1993 28.0000000 60.1130433 - 1319 11 8 1993 37.0000000 52.6546147 - 1320 12 8 1993 40.0000000 48.7091708 - 1321 13 8 1993 49.0000000 47.2946594 - 1322 14 8 1993 32.0000000 48.1898592 - 1323 15 8 1993 37.0000000 46.5848733 - 1324 16 8 1993 37.0000000 44.5386369 - 1325 17 8 1993 27.0000000 43.4161261 - 1326 18 8 1993 24.0000000 42.3719038 - 1327 19 8 1993 24.0000000 41.3979391 - 1328 20 8 1993 22.0000000 40.4871919 - 1329 21 8 1993 21.0000000 39.6334258 - 1330 22 8 1993 16.0000000 40.6467502 - 1331 23 8 1993 21.0000000 43.8010475 - 1332 24 8 1993 27.0000000 40.5079345 - 1333 25 8 1993 26.0000000 38.0088525 - 1334 26 8 1993 23.0000000 37.2861227 - 1335 27 8 1993 21.0000000 40.1921670 - 1336 28 8 1993 28.0000000 41.5362733 - 1337 29 8 1993 17.0000000 36.6824600 - 1338 30 8 1993 24.0000000 36.0169932 - 1339 31 8 1993 25.0000000 35.3856853 - 1340 1 9 1993 25.0000000 34.7850450 - 1341 2 9 1993 19.0000000 34.2124671 - 1342 3 9 1993 17.0000000 37.2549608 - 1343 4 9 1993 16.0000000 41.8588872 - 1344 5 9 1993 19.0000000 34.9164646 - 1345 6 9 1993 23.0000000 33.8641632 - 1346 7 9 1993 25.0000000 57.2731453 - 1347 8 9 1993 34.0000000 50.3124429 - 1348 9 9 1993 31.0000000 64.0884936 - 1349 10 9 1993 35.0000000 90.4297380 - 1350 11 9 1993 53.0000000 118.7006971 - 1351 12 9 1993 71.0000000 117.5060552 - 1352 13 9 1993 74.0000000 152.7999626 - 1353 14 9 1993 87.0000000 168.9967225 - 1354 15 9 1993 173.0000000 160.5411266 - 1355 16 9 1993 117.0000000 130.2641241 - 1356 17 9 1993 93.0000000 114.1048154 - 1357 18 9 1993 77.0000000 105.2216774 - 1358 19 9 1993 62.0000000 97.5494340 - 1359 20 9 1993 54.0000000 91.0713602 - 1360 21 9 1993 48.0000000 88.5953566 - 1361 22 9 1993 46.0000000 111.1316361 - 1362 23 9 1993 55.0000000 117.9069100 - 1363 24 9 1993 66.0000000 121.7989236 - 1364 25 9 1993 64.0000000 118.5793841 - 1365 26 9 1993 52.0000000 106.1674390 - 1366 27 9 1993 68.0000000 98.7998052 - 1367 28 9 1993 69.0000000 102.3520659 - 1368 29 9 1993 62.0000000 99.1475885 - 1369 30 9 1993 76.0000000 93.2675828 - 1370 1 10 1993 72.0000000 119.5771934 - 1371 2 10 1993 68.0000000 119.6719900 - 1372 3 10 1993 72.0000000 115.5426540 - 1373 4 10 1993 78.0000000 122.4085475 - 1374 5 10 1993 116.0000000 196.5630056 - 1375 6 10 1993 131.0000000 211.4081525 - 1376 7 10 1993 180.0000000 187.3150573 - 1377 8 10 1993 203.0000000 187.2493469 - 1378 9 10 1993 164.0000000 196.9627798 - 1379 10 10 1993 178.0000000 214.5195247 - 1380 11 10 1993 161.0000000 253.6860033 - 1381 12 10 1993 287.0000000 256.6699598 - 1382 13 10 1993 360.0000000 329.7852372 - 1383 14 10 1993 374.0000000 332.6781862 - 1384 15 10 1993 297.0000000 291.9568883 - 1385 16 10 1993 247.0000000 296.8964397 - 1386 17 10 1993 273.0000000 301.4746351 - 1387 18 10 1993 261.0000000 267.9550866 - 1388 19 10 1993 265.0000000 237.4589835 - 1389 20 10 1993 230.0000000 203.5537457 - 1390 21 10 1993 199.0000000 180.8021007 - 1391 22 10 1993 173.0000000 175.5378962 - 1392 23 10 1993 182.0000000 197.4086310 - 1393 24 10 1993 203.0000000 201.7331979 - 1394 25 10 1993 213.0000000 175.3455542 - 1395 26 10 1993 180.0000000 154.4840514 - 1396 27 10 1993 154.0000000 140.3075381 - 1397 28 10 1993 118.0000000 131.1843398 - 1398 29 10 1993 112.0000000 123.7435569 - 1399 30 10 1993 98.0000000 117.1183509 - 1400 31 10 1993 97.0000000 111.1977908 - 1401 1 11 1993 91.0000000 105.8902536 - 1402 2 11 1993 85.0000000 101.1175865 - 1403 3 11 1993 75.0000000 96.8128958 - 1404 4 11 1993 76.0000000 92.9187360 - 1405 5 11 1993 78.0000000 89.3856217 - 1406 6 11 1993 72.0000000 86.2651453 - 1407 7 11 1993 76.0000000 86.4180819 - 1408 8 11 1993 69.0000000 83.9849899 - 1409 9 11 1993 66.0000000 81.5121612 - 1410 10 11 1993 71.0000000 81.9521677 - 1411 11 11 1993 64.0000000 92.3841294 - 1412 12 11 1993 67.0000000 95.8545081 - 1413 13 11 1993 80.0000000 95.9771518 - 1414 14 11 1993 78.0000000 126.3697881 - 1415 15 11 1993 80.0000000 130.6063615 - 1416 16 11 1993 86.0000000 121.1892179 - 1417 17 11 1993 125.0000000 111.6900842 - 1418 18 11 1993 96.0000000 106.3222579 - 1419 19 11 1993 82.0000000 101.4838708 - 1420 20 11 1993 77.0000000 97.1222017 - 1421 21 11 1993 67.0000000 93.1760857 - 1422 22 11 1993 71.0000000 89.5955927 - 1423 23 11 1993 61.0000000 86.3375694 - 1424 24 11 1993 42.0000000 83.3647548 - 1425 25 11 1993 63.0000000 81.0263725 - 1426 26 11 1993 57.0000000 79.8629766 - 1427 27 11 1993 58.0000000 76.9730875 - 1428 28 11 1993 49.0000000 74.7914267 - 1429 29 11 1993 50.0000000 72.7737255 - 1430 30 11 1993 55.0000000 70.9027617 - 1431 1 12 1993 54.0000000 69.1634242 - 1432 2 12 1993 54.0000000 76.2118544 - 1433 3 12 1993 50.0000000 74.1441260 - 1434 4 12 1993 51.0000000 74.7841618 - 1435 5 12 1993 62.0000000 71.7280441 - 1436 6 12 1993 62.0000000 69.3016170 - 1437 7 12 1993 71.0000000 106.0850079 - 1438 8 12 1993 79.0000000 167.6844020 - 1439 9 12 1993 153.0000000 183.3679810 - 1440 10 12 1993 291.0000000 248.7485327 - 1441 11 12 1993 332.0000000 335.5372035 - 1442 12 12 1993 465.0000000 391.2190165 - 1443 13 12 1993 518.0000000 459.4032166 - 1444 14 12 1993 539.0000000 487.3648583 - 1445 15 12 1993 559.0000000 482.4165875 - 1446 16 12 1993 500.0000000 553.2946213 - 1447 17 12 1993 526.0000000 585.0356443 - 1448 18 12 1993 583.0000000 591.5786561 - 1449 19 12 1993 677.0000000 664.6650690 - 1450 20 12 1993 781.0000000 989.4794559 - 1451 21 12 1993 1180.0000000 1117.5850190 - 1452 22 12 1993 1460.0000000 1100.3000489 - 1453 23 12 1993 1600.0000000 1157.9831944 - 1454 24 12 1993 1410.0000000 1157.3798134 - 1455 25 12 1993 1230.0000000 986.6384962 - 1456 26 12 1993 1070.0000000 803.1583597 - 1457 27 12 1993 746.0000000 662.5288722 - 1458 28 12 1993 542.0000000 563.2707274 - 1459 29 12 1993 492.0000000 545.7895910 - 1460 30 12 1993 491.0000000 615.9550381 - 1461 31 12 1993 617.0000000 815.2922727 + 1 1 7 1990 79.0000000 84.5093809 + 2 2 7 1990 92.0000000 70.4741318 + 3 3 7 1990 72.0000000 77.4320635 + 4 4 7 1990 58.0000000 93.7353185 + 5 5 7 1990 69.0000000 122.0019790 + 6 6 7 1990 94.0000000 104.5116884 + 7 7 7 1990 199.0000000 100.5759917 + 8 8 7 1990 133.0000000 100.2661907 + 9 9 7 1990 124.0000000 86.7108672 + 10 10 7 1990 123.0000000 81.8465435 + 11 11 7 1990 99.0000000 77.9527261 + 12 12 7 1990 88.0000000 74.5245203 + 13 13 7 1990 84.0000000 71.4207561 + 14 14 7 1990 72.0000000 68.6029239 + 15 15 7 1990 55.0000000 66.0376933 + 16 16 7 1990 65.0000000 63.6961300 + 17 17 7 1990 50.0000000 61.5530480 + 18 18 7 1990 50.0000000 59.5864671 + 19 19 7 1990 46.0000000 57.7771579 + 20 20 7 1990 44.0000000 56.1082579 + 21 21 7 1990 42.0000000 54.5649479 + 22 22 7 1990 37.0000000 53.1341765 + 23 23 7 1990 38.0000000 51.8044260 + 24 24 7 1990 44.0000000 50.5655130 + 25 25 7 1990 30.0000000 49.4084171 + 26 26 7 1990 26.0000000 48.3251344 + 27 27 7 1990 31.0000000 47.3085506 + 28 28 7 1990 33.0000000 49.4376625 + 29 29 7 1990 42.0000000 46.9633967 + 30 30 7 1990 36.0000000 44.9364967 + 31 31 7 1990 34.0000000 44.1030913 + 32 1 8 1990 25.0000000 43.3134542 + 33 2 8 1990 22.0000000 42.5636797 + 34 3 8 1990 28.0000000 41.8502662 + 35 4 8 1990 25.0000000 41.1700708 + 36 5 8 1990 19.0000000 40.5204055 + 37 6 8 1990 22.0000000 39.8991260 + 38 7 8 1990 19.0000000 39.3027498 + 39 8 8 1990 22.0000000 38.7298214 + 40 9 8 1990 19.0000000 38.1785303 + 41 10 8 1990 20.0000000 37.6471920 + 42 11 8 1990 19.0000000 37.1342828 + 43 12 8 1990 19.0000000 36.6384228 + 44 13 8 1990 22.0000000 41.3550654 + 45 14 8 1990 36.0000000 63.0210015 + 46 15 8 1990 31.0000000 53.6693014 + 47 16 8 1990 30.0000000 47.8157840 + 48 17 8 1990 28.0000000 44.0744711 + 49 18 8 1990 34.0000000 37.2748214 + 50 19 8 1990 21.0000000 36.6341763 + 51 20 8 1990 30.0000000 36.0255573 + 52 21 8 1990 22.0000000 35.4457223 + 53 22 8 1990 21.0000000 34.8921122 + 54 23 8 1990 23.0000000 34.3624394 + 55 24 8 1990 20.0000000 33.8546564 + 56 25 8 1990 29.0000000 33.3685895 + 57 26 8 1990 20.0000000 33.4129983 + 58 27 8 1990 22.0000000 34.6473846 + 59 28 8 1990 23.0000000 32.6948600 + 60 29 8 1990 35.0000000 31.7755023 + 61 30 8 1990 51.0000000 120.0506726 + 62 31 8 1990 80.0000000 115.0460397 + 63 1 9 1990 56.0000000 54.3295471 + 64 2 9 1990 33.0000000 45.2182257 + 65 3 9 1990 27.0000000 43.6007607 + 66 4 9 1990 27.0000000 46.2010734 + 67 5 9 1990 28.0000000 45.5985916 + 68 6 9 1990 26.0000000 40.7095932 + 69 7 9 1990 24.0000000 46.0625301 + 70 8 9 1990 33.0000000 42.8881965 + 71 9 9 1990 26.0000000 38.7468860 + 72 10 9 1990 27.0000000 37.6505621 + 73 11 9 1990 22.0000000 36.6381877 + 74 12 9 1990 22.0000000 35.7004005 + 75 13 9 1990 21.0000000 34.8293343 + 76 14 9 1990 22.0000000 34.0180656 + 77 15 9 1990 22.0000000 33.2604881 + 78 16 9 1990 22.0000000 32.5512067 + 79 17 9 1990 20.0000000 31.8854462 + 80 18 9 1990 22.0000000 31.2589726 + 81 19 9 1990 16.0000000 30.6680259 + 82 20 9 1990 22.0000000 30.1092615 + 83 21 9 1990 19.0000000 38.8654245 + 84 22 9 1990 32.0000000 106.4019797 + 85 23 9 1990 27.0000000 86.5535078 + 86 24 9 1990 45.0000000 62.4535278 + 87 25 9 1990 42.0000000 47.9603045 + 88 26 9 1990 39.0000000 44.0940899 + 89 27 9 1990 30.0000000 42.3903128 + 90 28 9 1990 28.0000000 40.8373416 + 91 29 9 1990 30.0000000 39.4204691 + 92 30 9 1990 30.0000000 90.8929920 + 93 1 10 1990 56.0000000 136.5489028 + 94 2 10 1990 72.0000000 101.1390446 + 95 3 10 1990 73.0000000 98.1612158 + 96 4 10 1990 68.0000000 92.3652071 + 97 5 10 1990 53.0000000 79.0266479 + 98 6 10 1990 42.0000000 72.9583629 + 99 7 10 1990 33.0000000 68.7723644 + 100 8 10 1990 42.0000000 65.0613316 + 101 9 10 1990 34.0000000 61.7286328 + 102 10 10 1990 36.0000000 58.7196724 + 103 11 10 1990 36.0000000 56.0036469 + 104 12 10 1990 28.0000000 53.5455832 + 105 13 10 1990 32.0000000 51.3152187 + 106 14 10 1990 27.0000000 49.2862930 + 107 15 10 1990 35.0000000 47.8836672 + 108 16 10 1990 42.0000000 48.9175462 + 109 17 10 1990 35.0000000 58.4359615 + 110 18 10 1990 39.0000000 57.2724889 + 111 19 10 1990 34.0000000 48.0435485 + 112 20 10 1990 32.0000000 46.2867244 + 113 21 10 1990 34.0000000 44.6871720 + 114 22 10 1990 27.0000000 43.2193630 + 115 23 10 1990 31.0000000 41.8691006 + 116 24 10 1990 28.0000000 40.6239250 + 117 25 10 1990 25.0000000 40.6777865 + 118 26 10 1990 29.0000000 59.1718003 + 119 27 10 1990 31.0000000 67.0177305 + 120 28 10 1990 65.0000000 196.4270068 + 121 29 10 1990 69.0000000 206.4264293 + 122 30 10 1990 157.0000000 170.7837869 + 123 31 10 1990 190.0000000 148.4189619 + 124 1 11 1990 115.0000000 152.0162994 + 125 2 11 1990 104.0000000 160.8334428 + 126 3 11 1990 100.0000000 170.0284558 + 127 4 11 1990 131.0000000 166.6908274 + 128 5 11 1990 130.0000000 160.1097610 + 129 6 11 1990 115.0000000 140.7585126 + 130 7 11 1990 102.0000000 123.7836961 + 131 8 11 1990 95.0000000 109.4835814 + 132 9 11 1990 81.0000000 98.1550952 + 133 10 11 1990 66.0000000 105.8383429 + 134 11 11 1990 67.0000000 137.8111090 + 135 12 11 1990 74.0000000 149.5783519 + 136 13 11 1990 109.0000000 141.6065625 + 137 14 11 1990 92.0000000 165.3960247 + 138 15 11 1990 92.0000000 178.2172409 + 139 16 11 1990 155.0000000 166.8703244 + 140 17 11 1990 159.0000000 157.0560452 + 141 18 11 1990 131.0000000 172.8589365 + 142 19 11 1990 161.0000000 183.0006817 + 143 20 11 1990 196.0000000 285.3595269 + 144 21 11 1990 336.0000000 348.1477539 + 145 22 11 1990 566.0000000 315.4678301 + 146 23 11 1990 373.0000000 325.9247414 + 147 24 11 1990 293.0000000 300.7322016 + 148 25 11 1990 264.0000000 287.0500419 + 149 26 11 1990 226.0000000 258.8041056 + 150 27 11 1990 201.0000000 221.8168872 + 151 28 11 1990 180.0000000 192.7895372 + 152 29 11 1990 161.0000000 182.5845459 + 153 30 11 1990 149.0000000 171.2918188 + 154 1 12 1990 134.0000000 150.5138928 + 155 2 12 1990 113.0000000 136.5215444 + 156 3 12 1990 99.0000000 127.0717414 + 157 4 12 1990 107.0000000 120.0731353 + 158 5 12 1990 99.0000000 113.7007295 + 159 6 12 1990 89.0000000 107.8458747 + 160 7 12 1990 77.0000000 102.6396006 + 161 8 12 1990 71.0000000 97.9584741 + 162 9 12 1990 68.0000000 93.7369442 + 163 10 12 1990 73.0000000 89.9186965 + 164 11 12 1990 84.0000000 86.4552017 + 165 12 12 1990 88.0000000 104.3941152 + 166 13 12 1990 92.0000000 110.1387739 + 167 14 12 1990 128.0000000 101.8422784 + 168 15 12 1990 136.0000000 95.0618188 + 169 16 12 1990 114.0000000 90.6970777 + 170 17 12 1990 101.0000000 86.8338308 + 171 18 12 1990 93.0000000 83.3518731 + 172 19 12 1990 85.0000000 80.2032162 + 173 20 12 1990 81.0000000 77.3467012 + 174 21 12 1990 106.0000000 113.3828865 + 175 22 12 1990 159.0000000 140.2620702 + 176 23 12 1990 250.0000000 154.7323710 + 177 24 12 1990 298.0000000 145.1247016 + 178 25 12 1990 261.0000000 191.0279060 + 179 26 12 1990 228.0000000 302.2205943 + 180 27 12 1990 409.0000000 367.0644676 + 181 28 12 1990 486.0000000 390.1389304 + 182 29 12 1990 440.0000000 498.9412572 + 183 30 12 1990 486.0000000 629.4089179 + 184 31 12 1990 774.0000000 719.8696734 diff --git a/check/case_04/output_save/b2_daily_discharge.out b/check/case_04/output_save/b2_daily_discharge.out index 8a8177f0..f224d189 100644 --- a/check/case_04/output_save/b2_daily_discharge.out +++ b/check/case_04/output_save/b2_daily_discharge.out @@ -1,732 +1,732 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1991 889.0000000 769.7215787 - 2 2 1 1991 863.0000000 814.7406248 - 3 3 1 1991 875.0000000 874.8914795 - 4 4 1 1991 932.0000000 784.0885423 - 5 5 1 1991 826.0000000 739.8043629 - 6 6 1 1991 731.0000000 690.1603473 - 7 7 1 1991 613.0000000 652.8598976 - 8 8 1 1991 610.0000000 642.3546899 - 9 9 1 1991 686.0000000 578.6625043 - 10 10 1 1991 556.0000000 615.4188815 - 11 11 1 1991 669.0000000 651.6603583 - 12 12 1 1991 828.0000000 612.2312119 - 13 13 1 1991 735.0000000 500.9735917 - 14 14 1 1991 513.0000000 412.7642156 - 15 15 1 1991 411.0000000 342.3226091 - 16 16 1 1991 345.0000000 286.7768447 - 17 17 1 1991 293.0000000 245.3674479 - 18 18 1 1991 251.0000000 216.7805747 - 19 19 1 1991 222.0000000 196.8467320 - 20 20 1 1991 215.0000000 183.1221405 - 21 21 1 1991 213.0000000 177.6398019 - 22 22 1 1991 202.0000000 178.5492224 - 23 23 1 1991 200.0000000 170.1924263 - 24 24 1 1991 192.0000000 161.5556518 - 25 25 1 1991 176.0000000 153.6485206 - 26 26 1 1991 164.0000000 146.6993946 - 27 27 1 1991 157.0000000 140.3119091 - 28 28 1 1991 134.0000000 134.5798139 - 29 29 1 1991 130.0000000 129.4168590 - 30 30 1 1991 119.0000000 124.7497036 - 31 31 1 1991 107.0000000 120.5157655 - 32 1 2 1991 112.0000000 116.6614543 - 33 2 2 1991 109.0000000 113.1407265 - 34 3 2 1991 101.0000000 109.9138981 - 35 4 2 1991 98.0000000 106.9466643 - 36 5 2 1991 84.0000000 104.2092864 - 37 6 2 1991 93.0000000 101.6759154 - 38 7 2 1991 80.0000000 99.3240254 - 39 8 2 1991 73.0000000 97.1339393 - 40 9 2 1991 89.0000000 95.0884284 - 41 10 2 1991 84.0000000 93.1723748 - 42 11 2 1991 78.0000000 91.3724846 - 43 12 2 1991 79.0000000 89.6770445 - 44 13 2 1991 77.0000000 88.0757137 - 45 14 2 1991 80.0000000 86.5593464 - 46 15 2 1991 72.0000000 85.1198391 - 47 16 2 1991 78.0000000 85.4235798 - 48 17 2 1991 74.0000000 85.3260730 - 49 18 2 1991 77.0000000 83.7396381 - 50 19 2 1991 73.0000000 94.2919942 - 51 20 2 1991 69.0000000 109.8525066 - 52 21 2 1991 74.0000000 140.5869114 - 53 22 2 1991 81.0000000 155.6244922 - 54 23 2 1991 110.0000000 154.0447475 - 55 24 2 1991 180.0000000 150.5938266 - 56 25 2 1991 213.0000000 145.6793722 - 57 26 2 1991 222.0000000 141.5605490 - 58 27 2 1991 208.0000000 142.6062549 - 59 28 2 1991 211.0000000 136.5305703 - 60 1 3 1991 214.0000000 130.9267915 - 61 2 3 1991 208.0000000 138.4850451 - 62 3 3 1991 221.0000000 137.1294789 - 63 4 3 1991 281.0000000 128.0057402 - 64 5 3 1991 219.0000000 122.4246338 - 65 6 3 1991 190.0000000 117.5457934 - 66 7 3 1991 173.0000000 113.1395063 - 67 8 3 1991 164.0000000 109.3980366 - 68 9 3 1991 142.0000000 106.8310598 - 69 10 3 1991 133.0000000 106.6870380 - 70 11 3 1991 133.0000000 103.9751612 - 71 12 3 1991 118.0000000 100.6238666 - 72 13 3 1991 127.0000000 97.5469752 - 73 14 3 1991 113.0000000 94.7309727 - 74 15 3 1991 107.0000000 92.1424510 - 75 16 3 1991 100.0000000 89.7551321 - 76 17 3 1991 100.0000000 87.5517776 - 77 18 3 1991 95.0000000 85.5509642 - 78 19 3 1991 98.0000000 142.6813765 - 79 20 3 1991 119.0000000 150.0563246 - 80 21 3 1991 159.0000000 165.5643302 - 81 22 3 1991 196.0000000 180.9515705 - 82 23 3 1991 242.0000000 164.9231609 - 83 24 3 1991 216.0000000 150.6444598 - 84 25 3 1991 180.0000000 141.1684635 - 85 26 3 1991 145.0000000 133.7247830 - 86 27 3 1991 127.0000000 128.5128254 - 87 28 3 1991 117.0000000 121.8955981 - 88 29 3 1991 109.0000000 116.3730683 - 89 30 3 1991 106.0000000 111.4274624 - 90 31 3 1991 99.0000000 106.9813205 - 91 1 4 1991 96.0000000 102.9692569 - 92 2 4 1991 88.0000000 99.3357170 - 93 3 4 1991 87.0000000 96.0333068 - 94 4 4 1991 82.0000000 93.4955887 - 95 5 4 1991 84.0000000 91.5273455 - 96 6 4 1991 67.0000000 88.8973846 - 97 7 4 1991 89.0000000 86.6749060 - 98 8 4 1991 75.0000000 84.7294872 - 99 9 4 1991 79.0000000 82.6745721 - 100 10 4 1991 70.0000000 80.6965748 - 101 11 4 1991 69.0000000 78.8545783 - 102 12 4 1991 69.0000000 77.1369086 - 103 13 4 1991 56.0000000 75.5305911 - 104 14 4 1991 63.0000000 74.0273367 - 105 15 4 1991 58.0000000 72.6159780 - 106 16 4 1991 56.0000000 71.2791701 - 107 17 4 1991 54.0000000 70.0153534 - 108 18 4 1991 57.0000000 68.8698526 - 109 19 4 1991 53.0000000 69.0120576 - 110 20 4 1991 53.0000000 68.6980375 - 111 21 4 1991 65.0000000 67.6507835 - 112 22 4 1991 69.0000000 69.7066262 - 113 23 4 1991 61.0000000 71.2455111 - 114 24 4 1991 56.0000000 67.9593081 - 115 25 4 1991 56.0000000 66.3646269 - 116 26 4 1991 53.0000000 65.1893095 - 117 27 4 1991 49.0000000 64.0938808 - 118 28 4 1991 53.0000000 63.0586302 - 119 29 4 1991 48.0000000 66.8336754 - 120 30 4 1991 57.0000000 112.3735959 - 121 1 5 1991 69.0000000 107.3700256 - 122 2 5 1991 89.0000000 85.3256553 - 123 3 5 1991 105.0000000 81.6764547 - 124 4 5 1991 79.0000000 79.0565187 - 125 5 5 1991 69.0000000 76.8046088 - 126 6 5 1991 71.0000000 74.9810670 - 127 7 5 1991 60.0000000 72.7051534 - 128 8 5 1991 64.0000000 70.7632770 - 129 9 5 1991 59.0000000 68.9775907 - 130 10 5 1991 57.0000000 69.3784047 - 131 11 5 1991 55.0000000 71.6830517 - 132 12 5 1991 53.0000000 68.2342737 - 133 13 5 1991 52.0000000 66.3123114 - 134 14 5 1991 50.0000000 65.1037504 - 135 15 5 1991 52.0000000 69.8140419 - 136 16 5 1991 54.0000000 70.8266861 - 137 17 5 1991 54.0000000 65.8939308 - 138 18 5 1991 55.0000000 64.4281256 - 139 19 5 1991 48.0000000 63.0749630 - 140 20 5 1991 48.0000000 61.8013320 - 141 21 5 1991 49.0000000 60.5997630 - 142 22 5 1991 41.0000000 59.4637406 - 143 23 5 1991 40.0000000 58.3874247 - 144 24 5 1991 40.0000000 57.3655735 - 145 25 5 1991 39.0000000 56.3934760 - 146 26 5 1991 43.0000000 55.4668932 - 147 27 5 1991 39.0000000 54.5820060 - 148 28 5 1991 36.0000000 53.7353703 - 149 29 5 1991 33.0000000 52.9238765 - 150 30 5 1991 39.0000000 52.1447139 - 151 31 5 1991 34.0000000 51.3953401 - 152 1 6 1991 37.0000000 50.6734524 - 153 2 6 1991 35.0000000 49.9769640 - 154 3 6 1991 29.0000000 49.3039814 - 155 4 6 1991 33.0000000 48.6527854 - 156 5 6 1991 34.0000000 48.0613255 - 157 6 6 1991 32.0000000 66.1799331 - 158 7 6 1991 38.0000000 68.8865152 - 159 8 6 1991 39.0000000 58.5570889 - 160 9 6 1991 41.0000000 56.0875917 - 161 10 6 1991 44.0000000 69.9920480 - 162 11 6 1991 48.0000000 55.1192601 - 163 12 6 1991 42.0000000 52.0587825 - 164 13 6 1991 37.0000000 50.9912138 - 165 14 6 1991 39.0000000 50.2209792 - 166 15 6 1991 35.0000000 49.6673611 - 167 16 6 1991 31.0000000 52.5838014 - 168 17 6 1991 33.0000000 56.2171596 - 169 18 6 1991 31.0000000 53.4469162 - 170 19 6 1991 28.0000000 50.3633849 - 171 20 6 1991 60.0000000 87.2467730 - 172 21 6 1991 48.0000000 73.6034098 - 173 22 6 1991 54.0000000 58.0693475 - 174 23 6 1991 63.0000000 65.3751940 - 175 24 6 1991 41.0000000 59.2969321 - 176 25 6 1991 42.0000000 55.0536813 - 177 26 6 1991 43.0000000 53.5302760 - 178 27 6 1991 38.0000000 62.3758397 - 179 28 6 1991 38.0000000 62.1190149 - 180 29 6 1991 35.0000000 55.1459658 - 181 30 6 1991 41.0000000 52.8556576 - 182 1 7 1991 41.0000000 51.4428764 - 183 2 7 1991 38.0000000 50.1374254 - 184 3 7 1991 34.0000000 48.9247598 - 185 4 7 1991 27.0000000 47.7951575 - 186 5 7 1991 31.0000000 46.7400707 - 187 6 7 1991 30.0000000 45.7524250 - 188 7 7 1991 26.0000000 52.7479073 - 189 8 7 1991 30.0000000 51.4907323 - 190 9 7 1991 31.0000000 45.0915393 - 191 10 7 1991 23.0000000 44.1506959 - 192 11 7 1991 35.0000000 43.2673154 - 193 12 7 1991 19.0000000 44.3250332 - 194 13 7 1991 24.0000000 72.7445661 - 195 14 7 1991 26.0000000 66.0825067 - 196 15 7 1991 27.0000000 50.2371966 - 197 16 7 1991 41.0000000 46.8954716 - 198 17 7 1991 34.0000000 45.7135817 - 199 18 7 1991 27.0000000 44.6178300 - 200 19 7 1991 25.0000000 43.5957214 - 201 20 7 1991 23.0000000 42.6385573 - 202 21 7 1991 22.0000000 41.7416865 - 203 22 7 1991 27.0000000 40.8991682 - 204 23 7 1991 23.0000000 40.1057368 - 205 24 7 1991 21.0000000 41.1183359 - 206 25 7 1991 23.0000000 66.8587970 - 207 26 7 1991 33.0000000 59.9584185 - 208 27 7 1991 23.0000000 46.4513670 - 209 28 7 1991 29.0000000 42.8586398 - 210 29 7 1991 30.0000000 41.8150382 - 211 30 7 1991 35.0000000 55.8777928 - 212 31 7 1991 27.0000000 54.9196032 - 213 1 8 1991 45.0000000 43.7368447 - 214 2 8 1991 47.0000000 42.5440422 - 215 3 8 1991 40.0000000 41.4879243 - 216 4 8 1991 35.0000000 40.5050055 - 217 5 8 1991 26.0000000 39.5877816 - 218 6 8 1991 23.0000000 38.7296347 - 219 7 8 1991 30.0000000 39.7994333 - 220 8 8 1991 33.0000000 40.2676961 - 221 9 8 1991 30.0000000 37.3474492 - 222 10 8 1991 28.0000000 36.2152945 - 223 11 8 1991 19.0000000 35.5422919 - 224 12 8 1991 20.0000000 34.9052168 - 225 13 8 1991 16.0000000 34.3007744 - 226 14 8 1991 18.0000000 33.7260238 - 227 15 8 1991 18.0000000 33.1783356 - 228 16 8 1991 20.0000000 32.6553562 - 229 17 8 1991 16.0000000 32.1549751 - 230 18 8 1991 15.0000000 31.6752977 - 231 19 8 1991 15.0000000 31.2146207 - 232 20 8 1991 14.0000000 30.7714112 - 233 21 8 1991 15.0000000 30.3442874 - 234 22 8 1991 13.0000000 29.9330944 - 235 23 8 1991 12.0000000 29.7892717 - 236 24 8 1991 11.0000000 29.4970523 - 237 25 8 1991 12.0000000 28.8254275 - 238 26 8 1991 11.0000000 28.4590842 - 239 27 8 1991 13.0000000 28.1033557 - 240 28 8 1991 11.0000000 27.7573448 - 241 29 8 1991 12.0000000 27.4204044 - 242 30 8 1991 12.0000000 27.0919457 - 243 31 8 1991 11.0000000 26.7714324 - 244 1 9 1991 11.0000000 28.6928058 - 245 2 9 1991 17.0000000 28.8670675 - 246 3 9 1991 11.0000000 26.1380478 - 247 4 9 1991 12.0000000 25.8249119 - 248 5 9 1991 11.0000000 25.5197758 - 249 6 9 1991 11.0000000 25.2218243 - 250 7 9 1991 18.0000000 24.9306089 - 251 8 9 1991 11.0000000 24.6457225 - 252 9 9 1991 13.0000000 24.3667945 - 253 10 9 1991 12.0000000 25.0436079 - 254 11 9 1991 11.0000000 54.5357237 - 255 12 9 1991 20.0000000 48.0042195 - 256 13 9 1991 21.0000000 26.7906310 - 257 14 9 1991 29.0000000 26.2864641 - 258 15 9 1991 28.0000000 25.8120557 - 259 16 9 1991 20.0000000 25.3632845 - 260 17 9 1991 20.0000000 24.9376344 - 261 18 9 1991 20.0000000 24.5327124 - 262 19 9 1991 12.0000000 24.1467301 - 263 20 9 1991 11.0000000 23.7779627 - 264 21 9 1991 11.0000000 23.4248759 - 265 22 9 1991 22.0000000 45.9344029 - 266 23 9 1991 14.0000000 46.3905139 - 267 24 9 1991 48.0000000 26.7516493 - 268 25 9 1991 45.0000000 87.0718623 - 269 26 9 1991 80.0000000 91.0148182 - 270 27 9 1991 61.0000000 70.5171336 - 271 28 9 1991 61.0000000 97.1916354 - 272 29 9 1991 65.0000000 98.7868814 - 273 30 9 1991 63.0000000 89.3521871 - 274 1 10 1991 90.0000000 71.9179620 - 275 2 10 1991 59.0000000 64.4350387 - 276 3 10 1991 45.0000000 59.2581477 - 277 4 10 1991 42.0000000 55.4017673 - 278 5 10 1991 41.0000000 101.6291357 - 279 6 10 1991 41.0000000 112.1569221 - 280 7 10 1991 73.0000000 81.5290341 - 281 8 10 1991 96.0000000 71.9760311 - 282 9 10 1991 61.0000000 66.7774099 - 283 10 10 1991 44.0000000 62.4857054 - 284 11 10 1991 42.0000000 58.8921743 - 285 12 10 1991 41.0000000 83.7603492 - 286 13 10 1991 42.0000000 84.1408668 - 287 14 10 1991 61.0000000 66.1344681 - 288 15 10 1991 55.0000000 62.2422319 - 289 16 10 1991 41.0000000 64.6688910 - 290 17 10 1991 48.0000000 80.4243678 - 291 18 10 1991 52.0000000 106.0454160 - 292 19 10 1991 66.0000000 90.2477715 - 293 20 10 1991 59.0000000 79.8181528 - 294 21 10 1991 71.0000000 75.1412739 - 295 22 10 1991 74.0000000 69.2334594 - 296 23 10 1991 70.0000000 65.1804294 - 297 24 10 1991 59.0000000 61.6191085 - 298 25 10 1991 57.0000000 58.4483247 - 299 26 10 1991 57.0000000 55.6038897 - 300 27 10 1991 51.0000000 53.0443851 - 301 28 10 1991 47.0000000 50.7343510 - 302 29 10 1991 48.0000000 48.6430155 - 303 30 10 1991 45.0000000 51.5894476 - 304 31 10 1991 43.0000000 54.2594033 - 305 1 11 1991 40.0000000 66.6986588 - 306 2 11 1991 47.0000000 69.8562655 - 307 3 11 1991 46.0000000 98.6645283 - 308 4 11 1991 76.0000000 138.3644698 - 309 5 11 1991 60.0000000 131.3079368 - 310 6 11 1991 132.0000000 122.2190193 - 311 7 11 1991 133.0000000 128.1009465 - 312 8 11 1991 113.0000000 152.9724595 - 313 9 11 1991 120.0000000 164.6157025 - 314 10 11 1991 141.0000000 145.3994027 - 315 11 11 1991 208.0000000 171.0364389 - 316 12 11 1991 166.0000000 234.7163689 - 317 13 11 1991 183.0000000 308.5599362 - 318 14 11 1991 299.0000000 452.8216315 - 319 15 11 1991 521.0000000 420.7377482 - 320 16 11 1991 443.0000000 358.9146504 - 321 17 11 1991 304.0000000 304.3404416 - 322 18 11 1991 231.0000000 295.4929683 - 323 19 11 1991 192.0000000 291.5788345 - 324 20 11 1991 199.0000000 264.0226463 - 325 21 11 1991 201.0000000 241.4626629 - 326 22 11 1991 173.0000000 206.8012437 - 327 23 11 1991 159.0000000 179.3916819 - 328 24 11 1991 160.0000000 157.7218457 - 329 25 11 1991 146.0000000 139.8731921 - 330 26 11 1991 110.0000000 125.6761313 - 331 27 11 1991 114.0000000 115.4473956 - 332 28 11 1991 97.0000000 108.4015871 - 333 29 11 1991 89.0000000 102.5744887 - 334 30 11 1991 73.0000000 97.4851606 - 335 1 12 1991 69.0000000 92.9180014 - 336 2 12 1991 67.0000000 88.8061470 - 337 3 12 1991 63.0000000 85.0927874 - 338 4 12 1991 58.0000000 81.7291839 - 339 5 12 1991 59.0000000 78.6733799 - 340 6 12 1991 53.0000000 75.8891396 - 341 7 12 1991 54.0000000 73.3450728 - 342 8 12 1991 51.0000000 71.0139087 - 343 9 12 1991 47.0000000 68.8718900 - 344 10 12 1991 42.0000000 66.8982676 - 345 11 12 1991 40.0000000 65.0748746 - 346 12 12 1991 39.0000000 63.3857685 - 347 13 12 1991 36.0000000 61.8169276 - 348 14 12 1991 37.0000000 60.3559943 - 349 15 12 1991 32.0000000 58.9920551 - 350 16 12 1991 37.0000000 70.9363104 - 351 17 12 1991 62.0000000 176.7218417 - 352 18 12 1991 118.0000000 225.5202237 - 353 19 12 1991 170.0000000 313.3531846 - 354 20 12 1991 229.0000000 415.3009207 - 355 21 12 1991 448.0000000 506.2296569 - 356 22 12 1991 464.0000000 684.0355731 - 357 23 12 1991 675.0000000 617.1471179 - 358 24 12 1991 844.0000000 531.0015997 - 359 25 12 1991 569.0000000 437.2178050 - 360 26 12 1991 358.0000000 365.2072255 - 361 27 12 1991 279.0000000 311.9628009 - 362 28 12 1991 238.0000000 267.5042766 - 363 29 12 1991 201.0000000 229.4723165 - 364 30 12 1991 185.0000000 200.0677679 - 365 31 12 1991 165.0000000 177.0384210 - 366 1 1 1992 140.0000000 158.5468018 - 367 2 1 1992 126.0000000 144.1582348 - 368 3 1 1992 117.0000000 134.9442848 - 369 4 1 1992 114.0000000 131.3635980 - 370 5 1 1992 108.0000000 126.5747544 - 371 6 1 1992 108.0000000 119.7511507 - 372 7 1 1992 101.0000000 114.3493924 - 373 8 1 1992 97.0000000 113.0528687 - 374 9 1 1992 89.0000000 130.0467962 - 375 10 1 1992 111.0000000 162.7005420 - 376 11 1 1992 135.0000000 158.5052521 - 377 12 1 1992 171.0000000 142.8952693 - 378 13 1 1992 125.0000000 134.4158250 - 379 14 1 1992 111.0000000 127.3492829 - 380 15 1 1992 100.0000000 121.1228580 - 381 16 1 1992 87.0000000 115.6822534 - 382 17 1 1992 75.0000000 110.6706783 - 383 18 1 1992 79.0000000 106.1429007 - 384 19 1 1992 70.0000000 108.8145365 - 385 20 1 1992 72.0000000 105.7250523 - 386 21 1 1992 87.0000000 102.6874165 - 387 22 1 1992 79.0000000 98.2894477 - 388 23 1 1992 71.0000000 94.8340584 - 389 24 1 1992 66.0000000 91.6917618 - 390 25 1 1992 67.0000000 88.8245083 - 391 26 1 1992 65.0000000 86.1995273 - 392 27 1 1992 59.0000000 83.7885068 - 393 28 1 1992 57.0000000 81.6044621 - 394 29 1 1992 54.0000000 80.0379759 - 395 30 1 1992 59.0000000 82.0373284 - 396 31 1 1992 57.0000000 89.4481735 - 397 1 2 1992 56.0000000 91.2937253 - 398 2 2 1992 54.0000000 89.3987384 - 399 3 2 1992 58.0000000 87.2467008 - 400 4 2 1992 63.0000000 145.2203934 - 401 5 2 1992 76.0000000 190.3815995 - 402 6 2 1992 250.0000000 213.7299456 - 403 7 2 1992 346.0000000 186.6837216 - 404 8 2 1992 241.0000000 165.1152148 - 405 9 2 1992 180.0000000 161.7716653 - 406 10 2 1992 164.0000000 168.6544739 - 407 11 2 1992 183.0000000 188.9546104 - 408 12 2 1992 215.0000000 219.3951130 - 409 13 2 1992 265.0000000 232.2241129 - 410 14 2 1992 287.0000000 245.6637142 - 411 15 2 1992 272.0000000 245.8135082 - 412 16 2 1992 253.0000000 274.1886812 - 413 17 2 1992 301.0000000 263.7217101 - 414 18 2 1992 275.0000000 224.7350499 - 415 19 2 1992 224.0000000 195.8779174 - 416 20 2 1992 194.0000000 174.2621536 - 417 21 2 1992 173.0000000 158.8393153 - 418 22 2 1992 157.0000000 148.4275680 - 419 23 2 1992 142.0000000 141.1297812 - 420 24 2 1992 133.0000000 136.4364153 - 421 25 2 1992 128.0000000 130.2922268 - 422 26 2 1992 125.0000000 123.8038474 - 423 27 2 1992 125.0000000 118.4282230 - 424 28 2 1992 110.0000000 113.6023859 - 425 29 2 1992 107.0000000 109.2397961 - 426 1 3 1992 97.0000000 105.4333113 - 427 2 3 1992 97.0000000 103.7224051 - 428 3 3 1992 86.0000000 104.6462759 - 429 4 3 1992 93.0000000 99.8169563 - 430 5 3 1992 86.0000000 96.8089021 - 431 6 3 1992 82.0000000 94.0585224 - 432 7 3 1992 80.0000000 91.3900940 - 433 8 3 1992 77.0000000 88.9241243 - 434 9 3 1992 73.0000000 86.6434527 - 435 10 3 1992 76.0000000 84.7554879 - 436 11 3 1992 68.0000000 83.1372496 - 437 12 3 1992 70.0000000 141.6739687 - 438 13 3 1992 116.0000000 209.7512594 - 439 14 3 1992 206.0000000 257.0321933 - 440 15 3 1992 433.0000000 309.9699821 - 441 16 3 1992 495.0000000 330.9288217 - 442 17 3 1992 331.0000000 278.6353396 - 443 18 3 1992 240.0000000 239.5178204 - 444 19 3 1992 215.0000000 208.9253025 - 445 20 3 1992 185.0000000 184.7928604 - 446 21 3 1992 185.0000000 177.0656823 - 447 22 3 1992 185.0000000 237.7301945 - 448 23 3 1992 213.0000000 345.3496660 - 449 24 3 1992 466.0000000 384.2726281 - 450 25 3 1992 580.0000000 402.2874572 - 451 26 3 1992 566.0000000 370.0601121 - 452 27 3 1992 487.0000000 328.0610182 - 453 28 3 1992 387.0000000 295.7511904 - 454 29 3 1992 311.0000000 261.1824412 - 455 30 3 1992 270.0000000 231.5387186 - 456 31 3 1992 246.0000000 218.9197814 - 457 1 4 1992 229.0000000 234.9850384 - 458 2 4 1992 222.0000000 227.8104812 - 459 3 4 1992 217.0000000 244.6385327 - 460 4 4 1992 208.0000000 302.8453414 - 461 5 4 1992 220.0000000 278.4884695 - 462 6 4 1992 210.0000000 243.3054720 - 463 7 4 1992 190.0000000 214.3666886 - 464 8 4 1992 173.0000000 190.6196809 - 465 9 4 1992 166.0000000 171.5464908 - 466 10 4 1992 133.0000000 156.1952997 - 467 11 4 1992 126.0000000 144.3349059 - 468 12 4 1992 124.0000000 136.0539919 - 469 13 4 1992 116.0000000 130.3200349 - 470 14 4 1992 112.0000000 133.3854036 - 471 15 4 1992 111.0000000 168.5768261 - 472 16 4 1992 137.0000000 178.6266960 - 473 17 4 1992 206.0000000 169.5085746 - 474 18 4 1992 176.0000000 167.4189831 - 475 19 4 1992 161.0000000 154.1556915 - 476 20 4 1992 161.0000000 145.6067681 - 477 21 4 1992 139.0000000 138.8485769 - 478 22 4 1992 139.0000000 133.0068213 - 479 23 4 1992 123.0000000 127.7591367 - 480 24 4 1992 119.0000000 123.0245407 - 481 25 4 1992 111.0000000 118.7403961 - 482 26 4 1992 94.0000000 114.9576022 - 483 27 4 1992 94.0000000 116.0616794 - 484 28 4 1992 102.0000000 120.9059418 - 485 29 4 1992 120.0000000 118.6893402 - 486 30 4 1992 120.0000000 113.7303117 - 487 1 5 1992 114.0000000 141.5072822 - 488 2 5 1992 115.0000000 158.5235350 - 489 3 5 1992 206.0000000 139.2654335 - 490 4 5 1992 215.0000000 131.0076322 - 491 5 5 1992 125.0000000 125.4030876 - 492 6 5 1992 123.0000000 120.6426450 - 493 7 5 1992 113.0000000 116.3621799 - 494 8 5 1992 77.0000000 112.4819801 - 495 9 5 1992 83.0000000 109.2445185 - 496 10 5 1992 83.0000000 119.5144991 - 497 11 5 1992 96.0000000 118.2464101 - 498 12 5 1992 120.0000000 108.0639300 - 499 13 5 1992 80.0000000 103.5926680 - 500 14 5 1992 76.0000000 100.7012884 - 501 15 5 1992 69.0000000 98.0402912 - 502 16 5 1992 63.0000000 95.5829607 - 503 17 5 1992 61.0000000 93.3062805 - 504 18 5 1992 60.0000000 91.1902479 - 505 19 5 1992 59.0000000 89.2174295 - 506 20 5 1992 67.0000000 87.3741438 - 507 21 5 1992 51.0000000 85.6499394 - 508 22 5 1992 44.0000000 84.0265573 - 509 23 5 1992 42.0000000 82.4906675 - 510 24 5 1992 51.0000000 81.1817741 - 511 25 5 1992 42.0000000 80.0517156 - 512 26 5 1992 54.0000000 90.5874752 - 513 27 5 1992 53.0000000 82.5736717 - 514 28 5 1992 59.0000000 78.2208267 - 515 29 5 1992 55.0000000 87.2497216 - 516 30 5 1992 54.0000000 86.6931376 - 517 31 5 1992 48.0000000 80.8315903 - 518 1 6 1992 63.0000000 83.7453232 - 519 2 6 1992 61.0000000 82.9172669 - 520 3 6 1992 55.0000000 84.2091255 - 521 4 6 1992 75.0000000 101.7413149 - 522 5 6 1992 53.0000000 115.2117250 - 523 6 6 1992 77.0000000 112.7494411 - 524 7 6 1992 114.0000000 108.7466990 - 525 8 6 1992 167.0000000 119.6112851 - 526 9 6 1992 116.0000000 108.0270956 - 527 10 6 1992 91.0000000 98.5868818 - 528 11 6 1992 85.0000000 94.9977488 - 529 12 6 1992 68.0000000 91.7972431 - 530 13 6 1992 71.0000000 88.8970432 - 531 14 6 1992 63.0000000 86.2461709 - 532 15 6 1992 59.0000000 83.8155867 - 533 16 6 1992 46.0000000 81.5792227 - 534 17 6 1992 44.0000000 79.5145962 - 535 18 6 1992 39.0000000 77.6022535 - 536 19 6 1992 41.0000000 75.8391174 - 537 20 6 1992 44.0000000 76.8918604 - 538 21 6 1992 39.0000000 74.6193354 - 539 22 6 1992 32.0000000 72.0335286 - 540 23 6 1992 40.0000000 73.3792294 - 541 24 6 1992 41.0000000 86.8486321 - 542 25 6 1992 42.0000000 80.9860576 - 543 26 6 1992 42.0000000 73.0613437 - 544 27 6 1992 48.0000000 70.5945592 - 545 28 6 1992 37.0000000 69.0833677 - 546 29 6 1992 40.0000000 67.6726927 - 547 30 6 1992 29.0000000 66.5834796 - 548 1 7 1992 30.0000000 66.1044387 - 549 2 7 1992 36.0000000 64.3561806 - 550 3 7 1992 29.0000000 69.9303613 - 551 4 7 1992 36.0000000 80.9693464 - 552 5 7 1992 50.0000000 99.8463689 - 553 6 7 1992 78.0000000 101.6191835 - 554 7 7 1992 54.0000000 82.8105098 - 555 8 7 1992 57.0000000 73.9422052 - 556 9 7 1992 51.0000000 72.0399389 - 557 10 7 1992 47.0000000 92.4834571 - 558 11 7 1992 46.0000000 112.2514119 - 559 12 7 1992 76.0000000 105.5905245 - 560 13 7 1992 72.0000000 93.4428745 - 561 14 7 1992 67.0000000 84.7223051 - 562 15 7 1992 63.0000000 81.5317574 - 563 16 7 1992 47.0000000 78.6424301 - 564 17 7 1992 47.0000000 76.0160273 - 565 18 7 1992 42.0000000 73.6202969 - 566 19 7 1992 41.0000000 71.4275458 - 567 20 7 1992 39.0000000 69.4139115 - 568 21 7 1992 37.0000000 69.1874949 - 569 22 7 1992 33.0000000 68.9497948 - 570 23 7 1992 33.0000000 65.5852364 - 571 24 7 1992 33.0000000 64.0258038 - 572 25 7 1992 37.0000000 62.5711540 - 573 26 7 1992 26.0000000 61.2081916 - 574 27 7 1992 24.0000000 59.9321925 - 575 28 7 1992 26.0000000 58.7343539 - 576 29 7 1992 29.0000000 57.6069087 - 577 30 7 1992 19.0000000 56.5429885 - 578 31 7 1992 22.0000000 57.9138284 - 579 1 8 1992 28.0000000 57.5068433 - 580 2 8 1992 35.0000000 54.4137041 - 581 3 8 1992 29.0000000 53.4836521 - 582 4 8 1992 36.0000000 52.6011612 - 583 5 8 1992 52.0000000 51.7606131 - 584 6 8 1992 74.0000000 50.9582024 - 585 7 8 1992 54.0000000 50.1905398 - 586 8 8 1992 57.0000000 49.4546017 - 587 9 8 1992 48.0000000 51.9630869 - 588 10 8 1992 47.0000000 50.5715107 - 589 11 8 1992 46.0000000 58.5402819 - 590 12 8 1992 75.0000000 57.5449379 - 591 13 8 1992 73.0000000 62.4219081 - 592 14 8 1992 66.0000000 65.3579229 - 593 15 8 1992 60.0000000 58.0487100 - 594 16 8 1992 47.0000000 49.7689906 - 595 17 8 1992 46.0000000 48.8005452 - 596 18 8 1992 42.0000000 47.8906127 - 597 19 8 1992 41.0000000 47.2228295 - 598 20 8 1992 40.0000000 54.5797426 - 599 21 8 1992 37.0000000 50.4043213 - 600 22 8 1992 32.0000000 48.0926485 - 601 23 8 1992 32.0000000 47.6146866 - 602 24 8 1992 32.0000000 45.1545146 - 603 25 8 1992 36.0000000 44.3315704 - 604 26 8 1992 27.0000000 43.5926291 - 605 27 8 1992 25.0000000 42.8904549 - 606 28 8 1992 25.0000000 42.8394060 - 607 29 8 1992 28.0000000 50.1715568 - 608 30 8 1992 20.0000000 64.2769691 - 609 31 8 1992 22.0000000 108.9220120 - 610 1 9 1992 49.0000000 96.8738134 - 611 2 9 1992 77.0000000 83.3738512 - 612 3 9 1992 67.0000000 78.8283358 - 613 4 9 1992 45.0000000 77.8487100 - 614 5 9 1992 44.0000000 69.9356450 - 615 6 9 1992 64.0000000 62.7105166 - 616 7 9 1992 52.0000000 60.0526705 - 617 8 9 1992 40.0000000 57.6603381 - 618 9 9 1992 30.0000000 55.4988706 - 619 10 9 1992 34.0000000 53.5393120 - 620 11 9 1992 32.0000000 52.1654492 - 621 12 9 1992 36.0000000 50.8644496 - 622 13 9 1992 28.0000000 49.1120205 - 623 14 9 1992 33.0000000 49.4199799 - 624 15 9 1992 35.0000000 51.2113622 - 625 16 9 1992 30.0000000 46.7118002 - 626 17 9 1992 32.0000000 45.4797598 - 627 18 9 1992 29.0000000 44.4376886 - 628 19 9 1992 30.0000000 43.9516862 - 629 20 9 1992 28.0000000 42.4969095 - 630 21 9 1992 29.0000000 41.5661744 - 631 22 9 1992 29.0000000 40.6977021 - 632 23 9 1992 27.0000000 39.8968291 - 633 24 9 1992 27.0000000 39.1276444 - 634 25 9 1992 23.0000000 38.3998072 - 635 26 9 1992 28.0000000 37.7114886 - 636 27 9 1992 25.0000000 37.0610156 - 637 28 9 1992 25.0000000 38.4613881 - 638 29 9 1992 27.0000000 40.1883443 - 639 30 9 1992 25.0000000 36.3666004 - 640 1 10 1992 27.0000000 36.3071734 - 641 2 10 1992 33.0000000 38.4738890 - 642 3 10 1992 29.0000000 39.1286917 - 643 4 10 1992 31.0000000 36.8653180 - 644 5 10 1992 25.0000000 50.0586176 - 645 6 10 1992 25.0000000 56.2578467 - 646 7 10 1992 36.0000000 44.2371882 - 647 8 10 1992 42.0000000 38.1715010 - 648 9 10 1992 43.0000000 39.9734959 - 649 10 10 1992 26.0000000 46.3447701 - 650 11 10 1992 27.0000000 43.4002959 - 651 12 10 1992 27.0000000 38.7290363 - 652 13 10 1992 26.0000000 37.7918251 - 653 14 10 1992 26.0000000 37.0473702 - 654 15 10 1992 23.0000000 51.4363684 - 655 16 10 1992 21.0000000 50.2642528 - 656 17 10 1992 26.0000000 43.8489880 - 657 18 10 1992 34.0000000 46.0642917 - 658 19 10 1992 37.0000000 41.6786566 - 659 20 10 1992 31.0000000 50.0052550 - 660 21 10 1992 31.0000000 50.0330222 - 661 22 10 1992 35.0000000 48.2371612 - 662 23 10 1992 33.0000000 76.3045970 - 663 24 10 1992 40.0000000 142.8229233 - 664 25 10 1992 74.0000000 191.7043986 - 665 26 10 1992 161.0000000 197.4559281 - 666 27 10 1992 285.0000000 212.5433230 - 667 28 10 1992 244.0000000 236.6596071 - 668 29 10 1992 263.0000000 250.1365443 - 669 30 10 1992 276.0000000 208.0469961 - 670 31 10 1992 186.0000000 176.0842760 - 671 1 11 1992 154.0000000 152.6578930 - 672 2 11 1992 112.0000000 157.6089998 - 673 3 11 1992 104.0000000 162.0493178 - 674 4 11 1992 96.0000000 153.1924358 - 675 5 11 1992 99.0000000 133.7131703 - 676 6 11 1992 126.0000000 118.1131029 - 677 7 11 1992 91.0000000 107.6690309 - 678 8 11 1992 84.0000000 102.4522603 - 679 9 11 1992 81.0000000 108.2383920 - 680 10 11 1992 85.0000000 147.1696179 - 681 11 11 1992 126.0000000 238.5762453 - 682 12 11 1992 279.0000000 288.3651459 - 683 13 11 1992 390.0000000 294.7510222 - 684 14 11 1992 294.0000000 302.1260928 - 685 15 11 1992 260.0000000 393.3397690 - 686 16 11 1992 398.0000000 534.5447295 - 687 17 11 1992 520.0000000 507.3790716 - 688 18 11 1992 487.0000000 480.7979074 - 689 19 11 1992 380.0000000 491.0344275 - 690 20 11 1992 385.0000000 418.5042688 - 691 21 11 1992 351.0000000 444.1881118 - 692 22 11 1992 309.0000000 522.2947218 - 693 23 11 1992 587.0000000 433.0666966 - 694 24 11 1992 661.0000000 370.4021489 - 695 25 11 1992 447.0000000 373.4495176 - 696 26 11 1992 361.0000000 397.4034342 - 697 27 11 1992 351.0000000 379.8676506 - 698 28 11 1992 353.0000000 410.8303860 - 699 29 11 1992 369.0000000 501.2536252 - 700 30 11 1992 452.0000000 488.9020489 - 701 1 12 1992 441.0000000 403.0926083 - 702 2 12 1992 348.0000000 436.3987480 - 703 3 12 1992 394.0000000 482.9913163 - 704 4 12 1992 455.0000000 524.2186404 - 705 5 12 1992 491.0000000 557.2553355 - 706 6 12 1992 469.0000000 488.9521883 - 707 7 12 1992 364.0000000 473.7920640 - 708 8 12 1992 338.0000000 416.3815116 - 709 9 12 1992 334.0000000 348.7021356 - 710 10 12 1992 268.0000000 291.6610155 - 711 11 12 1992 236.0000000 289.6731512 - 712 12 12 1992 230.0000000 299.0939894 - 713 13 12 1992 239.0000000 271.9523837 - 714 14 12 1992 256.0000000 231.5398833 - 715 15 12 1992 217.0000000 208.2027998 - 716 16 12 1992 201.0000000 195.5392097 - 717 17 12 1992 188.0000000 187.1827087 - 718 18 12 1992 176.0000000 176.6128465 - 719 19 12 1992 170.0000000 165.9539652 - 720 20 12 1992 168.0000000 163.2463096 - 721 21 12 1992 131.0000000 168.6465569 - 722 22 12 1992 133.0000000 169.3129385 - 723 23 12 1992 134.0000000 157.2946020 - 724 24 12 1992 127.0000000 149.0515571 - 725 25 12 1992 117.0000000 142.1011455 - 726 26 12 1992 113.0000000 135.8810909 - 727 27 12 1992 100.0000000 130.2939050 - 728 28 12 1992 94.0000000 125.2570785 - 729 29 12 1992 87.0000000 120.7003813 - 730 30 12 1992 86.0000000 116.5638089 - 731 31 12 1992 81.0000000 112.7959102 + 1 1 1 1991 889.0000000 645.5908638 + 2 2 1 1991 863.0000000 694.5190638 + 3 3 1 1991 875.0000000 752.7521929 + 4 4 1 1991 932.0000000 673.8834824 + 5 5 1 1991 826.0000000 641.4480981 + 6 6 1 1991 731.0000000 600.2075208 + 7 7 1 1991 613.0000000 572.3254256 + 8 8 1 1991 610.0000000 567.0017428 + 9 9 1 1991 686.0000000 511.5258708 + 10 10 1 1991 556.0000000 549.7421439 + 11 11 1 1991 669.0000000 582.9926149 + 12 12 1 1991 828.0000000 548.2093888 + 13 13 1 1991 735.0000000 447.4841221 + 14 14 1 1991 513.0000000 368.3906091 + 15 15 1 1991 411.0000000 305.6224831 + 16 16 1 1991 345.0000000 257.1149069 + 17 17 1 1991 293.0000000 222.6252654 + 18 18 1 1991 251.0000000 197.9589305 + 19 19 1 1991 222.0000000 180.7309294 + 20 20 1 1991 215.0000000 168.5302276 + 21 21 1 1991 213.0000000 163.6262995 + 22 22 1 1991 202.0000000 164.3925024 + 23 23 1 1991 200.0000000 156.1271370 + 24 24 1 1991 192.0000000 148.0689545 + 25 25 1 1991 176.0000000 140.7429719 + 26 26 1 1991 164.0000000 134.3006856 + 27 27 1 1991 157.0000000 128.3746190 + 28 28 1 1991 134.0000000 123.0537204 + 29 29 1 1991 130.0000000 118.2591331 + 30 30 1 1991 119.0000000 113.9236851 + 31 31 1 1991 107.0000000 109.9899527 + 32 1 2 1991 112.0000000 106.4086774 + 33 2 2 1991 109.0000000 103.1374674 + 34 3 2 1991 101.0000000 100.1397292 + 35 4 2 1991 98.0000000 97.3837823 + 36 5 2 1991 84.0000000 94.8421245 + 37 6 2 1991 93.0000000 92.4908185 + 38 7 2 1991 80.0000000 90.3089778 + 39 8 2 1991 73.0000000 88.2783353 + 40 9 2 1991 89.0000000 86.3828782 + 41 10 2 1991 84.0000000 84.6085402 + 42 11 2 1991 78.0000000 82.9429393 + 43 12 2 1991 79.0000000 81.3751544 + 44 13 2 1991 77.0000000 79.8955354 + 45 14 2 1991 80.0000000 78.4955395 + 46 15 2 1991 72.0000000 77.1675909 + 47 16 2 1991 78.0000000 77.5083169 + 48 17 2 1991 74.0000000 77.3029861 + 49 18 2 1991 77.0000000 75.8394148 + 50 19 2 1991 73.0000000 86.2092357 + 51 20 2 1991 69.0000000 100.5512821 + 52 21 2 1991 74.0000000 129.7151575 + 53 22 2 1991 81.0000000 142.4191832 + 54 23 2 1991 110.0000000 140.4289897 + 55 24 2 1991 180.0000000 137.6312317 + 56 25 2 1991 213.0000000 133.5484729 + 57 26 2 1991 222.0000000 130.0176620 + 58 27 2 1991 208.0000000 131.0859419 + 59 28 2 1991 211.0000000 125.5094624 + 60 1 3 1991 214.0000000 120.4533694 + 61 2 3 1991 208.0000000 127.9251048 + 62 3 3 1991 221.0000000 126.3321700 + 63 4 3 1991 281.0000000 117.6811897 + 64 5 3 1991 219.0000000 112.5500216 + 65 6 3 1991 190.0000000 108.0573443 + 66 7 3 1991 173.0000000 103.9953018 + 67 8 3 1991 164.0000000 100.5540643 + 68 9 3 1991 142.0000000 98.2165162 + 69 10 3 1991 133.0000000 98.2246332 + 70 11 3 1991 133.0000000 95.6529763 + 71 12 3 1991 118.0000000 92.5338011 + 72 13 3 1991 127.0000000 89.6811557 + 73 14 3 1991 113.0000000 87.0695696 + 74 15 3 1991 107.0000000 84.6682415 + 75 16 3 1991 100.0000000 82.4531069 + 76 17 3 1991 100.0000000 80.4084882 + 77 18 3 1991 95.0000000 78.5522041 + 78 19 3 1991 98.0000000 134.7632028 + 79 20 3 1991 119.0000000 139.5519345 + 80 21 3 1991 159.0000000 154.3181310 + 81 22 3 1991 196.0000000 167.8665503 + 82 23 3 1991 242.0000000 152.3133937 + 83 24 3 1991 216.0000000 139.1209745 + 84 25 3 1991 180.0000000 130.6622254 + 85 26 3 1991 145.0000000 123.8290290 + 86 27 3 1991 127.0000000 119.1000558 + 87 28 3 1991 117.0000000 112.9333102 + 88 29 3 1991 109.0000000 107.8131638 + 89 30 3 1991 106.0000000 103.2233317 + 90 31 3 1991 99.0000000 99.0933369 + 91 1 4 1991 96.0000000 95.3635898 + 92 2 4 1991 88.0000000 91.9833700 + 93 3 4 1991 87.0000000 88.9093335 + 94 4 4 1991 82.0000000 86.5504266 + 95 5 4 1991 84.0000000 84.7318675 + 96 6 4 1991 67.0000000 82.2772835 + 97 7 4 1991 89.0000000 80.2014890 + 98 8 4 1991 75.0000000 78.3786502 + 99 9 4 1991 79.0000000 76.4608458 + 100 10 4 1991 70.0000000 74.6174946 + 101 11 4 1991 69.0000000 72.9006486 + 102 12 4 1991 69.0000000 71.2996149 + 103 13 4 1991 56.0000000 69.8024019 + 104 14 4 1991 63.0000000 68.4015558 + 105 15 4 1991 58.0000000 67.0866494 + 106 16 4 1991 56.0000000 65.8410308 + 107 17 4 1991 54.0000000 64.6636658 + 108 18 4 1991 57.0000000 63.5959746 + 109 19 4 1991 53.0000000 63.7766403 + 110 20 4 1991 53.0000000 63.4841063 + 111 21 4 1991 65.0000000 62.5041421 + 112 22 4 1991 69.0000000 64.5945346 + 113 23 4 1991 61.0000000 66.1044834 + 114 24 4 1991 56.0000000 62.8672770 + 115 25 4 1991 56.0000000 61.3541582 + 116 26 4 1991 53.0000000 60.2580425 + 117 27 4 1991 49.0000000 59.2379745 + 118 28 4 1991 53.0000000 58.2744100 + 119 29 4 1991 48.0000000 62.0511287 + 120 30 4 1991 57.0000000 107.1729197 + 121 1 5 1991 69.0000000 101.2205928 + 122 2 5 1991 89.0000000 79.2889725 + 123 3 5 1991 105.0000000 75.8525088 + 124 4 5 1991 79.0000000 73.4198412 + 125 5 5 1991 69.0000000 71.3362893 + 126 6 5 1991 71.0000000 69.6695666 + 127 7 5 1991 60.0000000 67.5380446 + 128 8 5 1991 64.0000000 65.7291577 + 129 9 5 1991 59.0000000 64.0656023 + 130 10 5 1991 57.0000000 64.5743196 + 131 11 5 1991 55.0000000 66.9498372 + 132 12 5 1991 53.0000000 63.5848620 + 133 13 5 1991 52.0000000 61.7507714 + 134 14 5 1991 50.0000000 60.6223206 + 135 15 5 1991 52.0000000 65.3697862 + 136 16 5 1991 54.0000000 66.3968650 + 137 17 5 1991 54.0000000 61.5355605 + 138 18 5 1991 55.0000000 60.1483384 + 139 19 5 1991 48.0000000 58.8693589 + 140 20 5 1991 48.0000000 57.6659077 + 141 21 5 1991 49.0000000 56.5309230 + 142 22 5 1991 41.0000000 55.4582475 + 143 23 5 1991 40.0000000 54.4423565 + 144 24 5 1991 40.0000000 53.4782864 + 145 25 5 1991 39.0000000 52.5615720 + 146 26 5 1991 43.0000000 51.6881919 + 147 27 5 1991 39.0000000 50.8545204 + 148 28 5 1991 36.0000000 50.0572847 + 149 29 5 1991 33.0000000 49.2935280 + 150 30 5 1991 39.0000000 48.5605759 + 151 31 5 1991 34.0000000 47.8560074 + 152 1 6 1991 37.0000000 47.1776289 + 153 2 6 1991 35.0000000 46.5234507 + 154 3 6 1991 29.0000000 45.8916669 + 155 4 6 1991 33.0000000 45.2806370 + 156 5 6 1991 34.0000000 44.7280395 + 157 6 6 1991 32.0000000 62.8328740 + 158 7 6 1991 38.0000000 65.4241653 + 159 8 6 1991 39.0000000 55.0452628 + 160 9 6 1991 41.0000000 52.6019657 + 161 10 6 1991 44.0000000 66.4242495 + 162 11 6 1991 48.0000000 51.5306230 + 163 12 6 1991 42.0000000 48.5423038 + 164 13 6 1991 37.0000000 47.5449791 + 165 14 6 1991 39.0000000 46.8351002 + 166 15 6 1991 35.0000000 46.3421433 + 167 16 6 1991 31.0000000 49.3098901 + 168 17 6 1991 33.0000000 52.9649786 + 169 18 6 1991 31.0000000 50.2176399 + 170 19 6 1991 28.0000000 47.1779020 + 171 20 6 1991 60.0000000 83.9446144 + 172 21 6 1991 48.0000000 69.8747131 + 173 22 6 1991 54.0000000 54.3894153 + 174 23 6 1991 63.0000000 61.6892796 + 175 24 6 1991 41.0000000 55.6336711 + 176 25 6 1991 42.0000000 51.4961017 + 177 26 6 1991 43.0000000 50.0770158 + 178 27 6 1991 38.0000000 58.9583221 + 179 28 6 1991 38.0000000 58.6582064 + 180 29 6 1991 35.0000000 51.7490595 + 181 30 6 1991 41.0000000 49.5506095 + 182 1 7 1991 41.0000000 48.2246972 + 183 2 7 1991 38.0000000 46.9990731 + 184 3 7 1991 34.0000000 45.8600452 + 185 4 7 1991 27.0000000 44.7986265 + 186 5 7 1991 31.0000000 43.8069034 + 187 6 7 1991 30.0000000 42.8783310 + 188 7 7 1991 26.0000000 49.8899628 + 189 8 7 1991 30.0000000 48.5994195 + 190 9 7 1991 31.0000000 42.2498283 + 191 10 7 1991 23.0000000 41.3670047 + 192 11 7 1991 35.0000000 40.5378648 + 193 12 7 1991 19.0000000 41.6450605 + 194 13 7 1991 24.0000000 70.0193632 + 195 14 7 1991 26.0000000 63.1602854 + 196 15 7 1991 27.0000000 47.3415288 + 197 16 7 1991 41.0000000 44.0709847 + 198 17 7 1991 34.0000000 42.9577888 + 199 18 7 1991 27.0000000 41.9253480 + 200 19 7 1991 25.0000000 40.9619886 + 201 20 7 1991 23.0000000 40.0596079 + 202 21 7 1991 22.0000000 39.2138909 + 203 22 7 1991 27.0000000 38.4192980 + 204 23 7 1991 23.0000000 37.6709132 + 205 24 7 1991 21.0000000 38.7193894 + 206 25 7 1991 23.0000000 64.4177523 + 207 26 7 1991 33.0000000 57.3738528 + 208 27 7 1991 23.0000000 43.8778311 + 209 28 7 1991 29.0000000 40.3428757 + 210 29 7 1991 30.0000000 39.3578225 + 211 30 7 1991 35.0000000 53.4303668 + 212 31 7 1991 27.0000000 52.4075580 + 213 1 8 1991 45.0000000 41.2698379 + 214 2 8 1991 47.0000000 40.1363446 + 215 3 8 1991 40.0000000 39.1352009 + 216 4 8 1991 35.0000000 38.2032546 + 217 5 8 1991 26.0000000 37.3334651 + 218 6 8 1991 23.0000000 36.5196166 + 219 7 8 1991 30.0000000 37.6249333 + 220 8 8 1991 33.0000000 38.1195703 + 221 9 8 1991 30.0000000 35.2327895 + 222 10 8 1991 28.0000000 34.1373720 + 223 11 8 1991 19.0000000 33.4992272 + 224 12 8 1991 20.0000000 32.8952047 + 225 13 8 1991 16.0000000 32.3221912 + 226 14 8 1991 18.0000000 31.7774054 + 227 15 8 1991 18.0000000 31.2583589 + 228 16 8 1991 20.0000000 30.7628220 + 229 17 8 1991 16.0000000 30.2887942 + 230 18 8 1991 15.0000000 29.8344781 + 231 19 8 1991 15.0000000 29.3982570 + 232 20 8 1991 14.0000000 28.9786746 + 233 21 8 1991 15.0000000 28.5744177 + 234 22 8 1991 13.0000000 28.1853520 + 235 23 8 1991 12.0000000 28.0627810 + 236 24 8 1991 11.0000000 27.7910871 + 237 25 8 1991 12.0000000 27.1398458 + 238 26 8 1991 11.0000000 26.7934152 + 239 27 8 1991 13.0000000 26.4571169 + 240 28 8 1991 11.0000000 26.1300861 + 241 29 8 1991 12.0000000 25.8117048 + 242 30 8 1991 12.0000000 25.5014105 + 243 31 8 1991 11.0000000 25.1986906 + 244 1 9 1991 11.0000000 27.1356255 + 245 2 9 1991 17.0000000 27.3209582 + 246 3 9 1991 11.0000000 24.6083203 + 247 4 9 1991 12.0000000 24.3123512 + 248 5 9 1991 11.0000000 24.0240349 + 249 6 9 1991 11.0000000 23.7425768 + 250 7 9 1991 18.0000000 23.4675472 + 251 8 9 1991 11.0000000 23.1985554 + 252 9 9 1991 13.0000000 22.9352464 + 253 10 9 1991 12.0000000 23.6268610 + 254 11 9 1991 11.0000000 53.1122479 + 255 12 9 1991 20.0000000 46.5149919 + 256 13 9 1991 21.0000000 25.3131481 + 257 14 9 1991 29.0000000 24.8322696 + 258 15 9 1991 28.0000000 24.3799998 + 259 16 9 1991 20.0000000 23.9523326 + 260 17 9 1991 20.0000000 23.5468580 + 261 18 9 1991 20.0000000 23.1612845 + 262 19 9 1991 12.0000000 22.7938959 + 263 20 9 1991 11.0000000 22.4430375 + 264 21 9 1991 11.0000000 22.1072370 + 265 22 9 1991 22.0000000 44.6119076 + 266 23 9 1991 14.0000000 44.9925508 + 267 24 9 1991 48.0000000 25.3659240 + 268 25 9 1991 45.0000000 85.6352310 + 269 26 9 1991 80.0000000 89.2718968 + 270 27 9 1991 61.0000000 68.5871133 + 271 28 9 1991 61.0000000 95.1384932 + 272 29 9 1991 65.0000000 96.3260256 + 273 30 9 1991 63.0000000 86.7289245 + 274 1 10 1991 90.0000000 69.4338430 + 275 2 10 1991 59.0000000 62.1161815 + 276 3 10 1991 45.0000000 57.1353370 + 277 4 10 1991 42.0000000 53.4103277 + 278 5 10 1991 41.0000000 99.5633124 + 279 6 10 1991 41.0000000 109.6060047 + 280 7 10 1991 73.0000000 79.0311512 + 281 8 10 1991 96.0000000 69.6639852 + 282 9 10 1991 61.0000000 64.6386634 + 283 10 10 1991 44.0000000 60.4633912 + 284 11 10 1991 42.0000000 56.9695418 + 285 12 10 1991 41.0000000 81.8417054 + 286 13 10 1991 42.0000000 82.0665179 + 287 14 10 1991 61.0000000 64.1400126 + 288 15 10 1991 55.0000000 60.3452572 + 289 16 10 1991 41.0000000 62.8368304 + 290 17 10 1991 48.0000000 78.5632220 + 291 18 10 1991 52.0000000 103.9983069 + 292 19 10 1991 66.0000000 88.0306606 + 293 20 10 1991 59.0000000 77.6804031 + 294 21 10 1991 71.0000000 73.0931189 + 295 22 10 1991 74.0000000 67.2895815 + 296 23 10 1991 70.0000000 63.3323985 + 297 24 10 1991 59.0000000 59.8560527 + 298 25 10 1991 57.0000000 56.7607918 + 299 26 10 1991 57.0000000 53.9837719 + 300 27 10 1991 51.0000000 51.4847019 + 301 28 10 1991 47.0000000 49.2290720 + 302 29 10 1991 48.0000000 47.1869190 + 303 30 10 1991 45.0000000 50.1602115 + 304 31 10 1991 43.0000000 52.8064364 + 305 1 11 1991 40.0000000 65.2326822 + 306 2 11 1991 47.0000000 68.2885275 + 307 3 11 1991 46.0000000 96.9473700 + 308 4 11 1991 76.0000000 136.1864560 + 309 5 11 1991 60.0000000 128.7943785 + 310 6 11 1991 132.0000000 119.7073979 + 311 7 11 1991 133.0000000 125.6918084 + 312 8 11 1991 113.0000000 150.3591997 + 313 9 11 1991 120.0000000 161.5762032 + 314 10 11 1991 141.0000000 142.5733090 + 315 11 11 1991 208.0000000 168.2964753 + 316 12 11 1991 166.0000000 231.1057094 + 317 13 11 1991 183.0000000 303.4253944 + 318 14 11 1991 299.0000000 446.0487270 + 319 15 11 1991 521.0000000 414.0429758 + 320 16 11 1991 443.0000000 353.3489972 + 321 17 11 1991 304.0000000 299.9843136 + 322 18 11 1991 231.0000000 291.6137749 + 323 19 11 1991 192.0000000 287.7209950 + 324 20 11 1991 199.0000000 260.6091829 + 325 21 11 1991 201.0000000 238.4554912 + 326 22 11 1991 173.0000000 204.1662667 + 327 23 11 1991 159.0000000 177.1014064 + 328 24 11 1991 160.0000000 155.6370526 + 329 25 11 1991 146.0000000 137.9389381 + 330 26 11 1991 110.0000000 123.8641714 + 331 27 11 1991 114.0000000 113.7441919 + 332 28 11 1991 97.0000000 106.7796943 + 333 29 11 1991 89.0000000 101.0219682 + 334 30 11 1991 73.0000000 95.9930099 + 335 1 12 1991 69.0000000 91.4799125 + 336 2 12 1991 67.0000000 87.4167087 + 337 3 12 1991 63.0000000 83.7473187 + 338 4 12 1991 58.0000000 80.4236221 + 339 5 12 1991 59.0000000 77.4041875 + 340 6 12 1991 53.0000000 74.6532270 + 341 7 12 1991 54.0000000 72.1397337 + 342 8 12 1991 51.0000000 69.8367654 + 343 9 12 1991 47.0000000 67.7208481 + 344 10 12 1991 42.0000000 65.7714768 + 345 11 12 1991 40.0000000 63.9706964 + 346 12 12 1991 39.0000000 62.3027477 + 347 13 12 1991 36.0000000 60.7537690 + 348 14 12 1991 37.0000000 59.3115417 + 349 15 12 1991 32.0000000 57.9652741 + 350 16 12 1991 37.0000000 69.9007544 + 351 17 12 1991 62.0000000 175.2662416 + 352 18 12 1991 118.0000000 223.1902117 + 353 19 12 1991 170.0000000 310.2751604 + 354 20 12 1991 229.0000000 410.8640461 + 355 21 12 1991 448.0000000 501.1913004 + 356 22 12 1991 464.0000000 678.2863839 + 357 23 12 1991 675.0000000 612.0453540 + 358 24 12 1991 844.0000000 526.6339020 + 359 25 12 1991 569.0000000 433.6526824 + 360 26 12 1991 358.0000000 362.2424106 + 361 27 12 1991 279.0000000 309.4271281 + 362 28 12 1991 238.0000000 265.3620465 + 363 29 12 1991 201.0000000 227.6312561 + 364 30 12 1991 185.0000000 198.4604895 + 365 31 12 1991 165.0000000 175.5553976 + 366 1 1 1992 140.0000000 157.1664914 + 367 2 1 1992 126.0000000 142.8510171 + 368 3 1 1992 117.0000000 133.6957310 + 369 4 1 1992 114.0000000 130.1475375 + 370 5 1 1992 108.0000000 125.3711937 + 371 6 1 1992 108.0000000 118.5887328 + 372 7 1 1992 101.0000000 113.2264781 + 373 8 1 1992 97.0000000 111.9516743 + 374 9 1 1992 89.0000000 128.9099534 + 375 10 1 1992 111.0000000 161.4108454 + 376 11 1 1992 135.0000000 157.0834940 + 377 12 1 1992 171.0000000 141.5424897 + 378 13 1 1992 125.0000000 133.1379838 + 379 14 1 1992 111.0000000 126.1326247 + 380 15 1 1992 100.0000000 119.9588902 + 381 16 1 1992 87.0000000 114.5647123 + 382 17 1 1992 75.0000000 109.5944322 + 383 18 1 1992 79.0000000 105.1035779 + 384 19 1 1992 70.0000000 107.7921661 + 385 20 1 1992 72.0000000 104.6976293 + 386 21 1 1992 87.0000000 101.6615434 + 387 22 1 1992 79.0000000 97.2966666 + 388 23 1 1992 71.0000000 93.8717195 + 389 24 1 1992 66.0000000 90.7569533 + 390 25 1 1992 67.0000000 87.9147162 + 391 26 1 1992 65.0000000 85.3125736 + 392 27 1 1992 59.0000000 82.9224981 + 393 28 1 1992 57.0000000 80.7572284 + 394 29 1 1992 54.0000000 79.2045917 + 395 30 1 1992 59.0000000 81.2010467 + 396 31 1 1992 57.0000000 88.5802953 + 397 1 2 1992 56.0000000 90.4022981 + 398 2 2 1992 54.0000000 88.5168758 + 399 3 2 1992 58.0000000 86.3852469 + 400 4 2 1992 63.0000000 144.2343060 + 401 5 2 1992 76.0000000 189.0509121 + 402 6 2 1992 250.0000000 212.3517667 + 403 7 2 1992 346.0000000 185.4400922 + 404 8 2 1992 241.0000000 163.9900704 + 405 9 2 1992 180.0000000 160.6867992 + 406 10 2 1992 164.0000000 167.5461823 + 407 11 2 1992 183.0000000 187.7896671 + 408 12 2 1992 215.0000000 217.9856616 + 409 13 2 1992 265.0000000 230.7041284 + 410 14 2 1992 287.0000000 244.0962645 + 411 15 2 1992 272.0000000 244.2127152 + 412 16 2 1992 253.0000000 272.5141539 + 413 17 2 1992 301.0000000 262.0532299 + 414 18 2 1992 275.0000000 223.3002299 + 415 19 2 1992 224.0000000 194.5939300 + 416 20 2 1992 194.0000000 173.1087399 + 417 21 2 1992 173.0000000 157.7605441 + 418 22 2 1992 157.0000000 147.4081377 + 419 23 2 1992 142.0000000 140.1602181 + 420 24 2 1992 133.0000000 135.5110100 + 421 25 2 1992 128.0000000 129.4059659 + 422 26 2 1992 125.0000000 122.9525403 + 423 27 2 1992 125.0000000 117.6079492 + 424 28 2 1992 110.0000000 112.8099031 + 425 29 2 1992 107.0000000 108.4723209 + 426 1 3 1992 97.0000000 104.6875195 + 427 2 3 1992 97.0000000 102.9939026 + 428 3 3 1992 86.0000000 103.9302930 + 429 4 3 1992 93.0000000 99.1182579 + 430 5 3 1992 86.0000000 96.1258792 + 431 6 3 1992 82.0000000 93.3899868 + 432 7 3 1992 80.0000000 90.7361450 + 433 8 3 1992 77.0000000 88.2837359 + 434 9 3 1992 73.0000000 86.0156867 + 435 10 3 1992 76.0000000 84.1373730 + 436 11 3 1992 68.0000000 82.5274737 + 437 12 3 1992 70.0000000 140.9851752 + 438 13 3 1992 116.0000000 208.7483803 + 439 14 3 1992 206.0000000 255.7011872 + 440 15 3 1992 433.0000000 308.5307718 + 441 16 3 1992 495.0000000 329.3740628 + 442 17 3 1992 331.0000000 277.2967324 + 443 18 3 1992 240.0000000 238.3863177 + 444 19 3 1992 215.0000000 207.9014329 + 445 20 3 1992 185.0000000 183.8671399 + 446 21 3 1992 185.0000000 176.1736891 + 447 22 3 1992 185.0000000 236.7208416 + 448 23 3 1992 213.0000000 343.9815943 + 449 24 3 1992 466.0000000 382.7182189 + 450 25 3 1992 580.0000000 400.6860485 + 451 26 3 1992 566.0000000 368.6141458 + 452 27 3 1992 487.0000000 326.7594374 + 453 28 3 1992 387.0000000 294.6395452 + 454 29 3 1992 311.0000000 260.1850235 + 455 30 3 1992 270.0000000 230.6578981 + 456 31 3 1992 246.0000000 218.0946882 + 457 1 4 1992 229.0000000 234.1694333 + 458 2 4 1992 222.0000000 226.9984558 + 459 3 4 1992 217.0000000 243.7750520 + 460 4 4 1992 208.0000000 301.9493160 + 461 5 4 1992 220.0000000 277.6542303 + 462 6 4 1992 210.0000000 242.5607894 + 463 7 4 1992 190.0000000 213.6702990 + 464 8 4 1992 173.0000000 189.9590065 + 465 9 4 1992 166.0000000 170.9153474 + 466 10 4 1992 133.0000000 155.5885630 + 467 11 4 1992 126.0000000 143.7484343 + 468 12 4 1992 124.0000000 135.4854952 + 469 13 4 1992 116.0000000 129.7675035 + 470 14 4 1992 112.0000000 132.8371047 + 471 15 4 1992 111.0000000 167.9914947 + 472 16 4 1992 137.0000000 177.9794489 + 473 17 4 1992 206.0000000 168.8644330 + 474 18 4 1992 176.0000000 166.7655797 + 475 19 4 1992 161.0000000 153.5303085 + 476 20 4 1992 161.0000000 145.0090536 + 477 21 4 1992 139.0000000 138.2743347 + 478 22 4 1992 139.0000000 132.4530396 + 479 23 4 1992 123.0000000 127.2236804 + 480 24 4 1992 119.0000000 122.5055878 + 481 25 4 1992 111.0000000 118.2363447 + 482 26 4 1992 94.0000000 114.4664883 + 483 27 4 1992 94.0000000 115.5796249 + 484 28 4 1992 102.0000000 120.4263493 + 485 29 4 1992 120.0000000 118.2122836 + 486 30 4 1992 120.0000000 113.2621310 + 487 1 5 1992 114.0000000 141.0312213 + 488 2 5 1992 115.0000000 157.9997825 + 489 3 5 1992 206.0000000 138.7551966 + 490 4 5 1992 215.0000000 130.5154985 + 491 5 5 1992 125.0000000 124.9269930 + 492 6 5 1992 123.0000000 120.1806306 + 493 7 5 1992 113.0000000 115.9128865 + 494 8 5 1992 77.0000000 112.0442443 + 495 9 5 1992 83.0000000 108.8166131 + 496 10 5 1992 83.0000000 119.0853337 + 497 11 5 1992 96.0000000 117.8046660 + 498 12 5 1992 120.0000000 107.6242708 + 499 13 5 1992 80.0000000 103.1647484 + 500 14 5 1992 76.0000000 100.2843158 + 501 15 5 1992 69.0000000 97.6333393 + 502 16 5 1992 63.0000000 95.1852236 + 503 17 5 1992 61.0000000 92.9170545 + 504 18 5 1992 60.0000000 90.8089165 + 505 19 5 1992 59.0000000 88.8434511 + 506 20 5 1992 67.0000000 87.0070390 + 507 21 5 1992 51.0000000 85.2892805 + 508 22 5 1992 44.0000000 83.6719729 + 509 23 5 1992 42.0000000 82.1418309 + 510 24 5 1992 51.0000000 80.8383829 + 511 25 5 1992 42.0000000 79.7133834 + 512 26 5 1992 54.0000000 90.2484938 + 513 27 5 1992 53.0000000 82.2306494 + 514 28 5 1992 59.0000000 77.8831771 + 515 29 5 1992 55.0000000 86.9129595 + 516 30 5 1992 54.0000000 86.3506526 + 517 31 5 1992 48.0000000 80.4933152 + 518 1 6 1992 63.0000000 83.4117243 + 519 2 6 1992 61.0000000 82.5875112 + 520 3 6 1992 55.0000000 83.8817953 + 521 4 6 1992 75.0000000 101.4120426 + 522 5 6 1992 53.0000000 114.8670735 + 523 6 6 1992 77.0000000 112.3906013 + 524 7 6 1992 114.0000000 108.3841485 + 525 8 6 1992 167.0000000 119.2481568 + 526 9 6 1992 116.0000000 107.6535881 + 527 10 6 1992 91.0000000 98.2233509 + 528 11 6 1992 85.0000000 94.6456905 + 529 12 6 1992 68.0000000 91.4559058 + 530 13 6 1992 71.0000000 88.5654245 + 531 14 6 1992 63.0000000 85.9234019 + 532 15 6 1992 59.0000000 83.5009089 + 533 16 6 1992 46.0000000 81.2719756 + 534 17 6 1992 44.0000000 79.2142020 + 535 18 6 1992 39.0000000 77.3082057 + 536 19 6 1992 41.0000000 75.5508957 + 537 20 6 1992 44.0000000 76.6077627 + 538 21 6 1992 39.0000000 74.3382539 + 539 22 6 1992 32.0000000 71.7575583 + 540 23 6 1992 40.0000000 73.1064982 + 541 24 6 1992 41.0000000 86.5712162 + 542 25 6 1992 42.0000000 80.7019484 + 543 26 6 1992 42.0000000 72.7811416 + 544 27 6 1992 48.0000000 70.3207065 + 545 28 6 1992 37.0000000 68.8154080 + 546 29 6 1992 40.0000000 67.4101840 + 547 30 6 1992 29.0000000 66.3260366 + 548 1 7 1992 30.0000000 65.8515236 + 549 2 7 1992 36.0000000 64.1074376 + 550 3 7 1992 29.0000000 69.6848196 + 551 4 7 1992 36.0000000 80.7237954 + 552 5 7 1992 50.0000000 99.5926807 + 553 6 7 1992 78.0000000 101.3474620 + 554 7 7 1992 54.0000000 82.5313055 + 555 8 7 1992 57.0000000 73.6705937 + 556 9 7 1992 51.0000000 71.7761341 + 557 10 7 1992 47.0000000 92.2185108 + 558 11 7 1992 46.0000000 111.9674844 + 559 12 7 1992 76.0000000 105.2913563 + 560 13 7 1992 72.0000000 93.1473939 + 561 14 7 1992 67.0000000 84.4377450 + 562 15 7 1992 63.0000000 81.2576952 + 563 16 7 1992 47.0000000 78.3777609 + 564 17 7 1992 47.0000000 75.7598031 + 565 18 7 1992 42.0000000 73.3717015 + 566 19 7 1992 41.0000000 71.1858738 + 567 20 7 1992 39.0000000 69.1785515 + 568 21 7 1992 37.0000000 68.9576799 + 569 22 7 1992 33.0000000 68.7248633 + 570 23 7 1992 33.0000000 65.3652271 + 571 24 7 1992 33.0000000 63.8103552 + 572 25 7 1992 37.0000000 62.3599743 + 573 26 7 1992 26.0000000 61.0010335 + 574 27 7 1992 24.0000000 59.7288030 + 575 28 7 1992 26.0000000 58.5345087 + 576 29 7 1992 29.0000000 57.4104078 + 577 30 7 1992 19.0000000 56.3496538 + 578 31 7 1992 22.0000000 57.7232861 + 579 1 8 1992 28.0000000 57.3184303 + 580 2 8 1992 35.0000000 54.2279184 + 581 3 8 1992 29.0000000 53.3005883 + 582 4 8 1992 36.0000000 52.4207027 + 583 5 8 1992 52.0000000 51.5826538 + 584 6 8 1992 74.0000000 50.7826463 + 585 7 8 1992 54.0000000 50.0172996 + 586 8 8 1992 57.0000000 49.2835979 + 587 9 8 1992 48.0000000 51.7937406 + 588 10 8 1992 47.0000000 50.4032616 + 589 11 8 1992 46.0000000 58.3726936 + 590 12 8 1992 75.0000000 57.3759880 + 591 13 8 1992 73.0000000 62.2521860 + 592 14 8 1992 66.0000000 65.1849170 + 593 15 8 1992 60.0000000 57.8758023 + 594 16 8 1992 47.0000000 49.5991080 + 595 17 8 1992 46.0000000 48.6337437 + 596 18 8 1992 42.0000000 47.7267074 + 597 19 8 1992 41.0000000 47.0614530 + 598 20 8 1992 40.0000000 54.4189740 + 599 21 8 1992 37.0000000 50.2431710 + 600 22 8 1992 32.0000000 47.9332068 + 601 23 8 1992 32.0000000 47.4565573 + 602 24 8 1992 32.0000000 44.9990105 + 603 25 8 1992 36.0000000 44.1786782 + 604 26 8 1992 27.0000000 43.4422113 + 605 27 8 1992 25.0000000 42.7423861 + 606 28 8 1992 25.0000000 42.6932270 + 607 29 8 1992 28.0000000 50.0260911 + 608 30 8 1992 20.0000000 64.1290634 + 609 31 8 1992 22.0000000 108.7638418 + 610 1 9 1992 49.0000000 96.6934912 + 611 2 9 1992 77.0000000 83.1874880 + 612 3 9 1992 67.0000000 78.6360565 + 613 4 9 1992 45.0000000 77.6582176 + 614 5 9 1992 44.0000000 69.7502127 + 615 6 9 1992 64.0000000 62.5322894 + 616 7 9 1992 52.0000000 59.8810983 + 617 8 9 1992 40.0000000 57.4947274 + 618 9 9 1992 30.0000000 55.3386249 + 619 10 9 1992 34.0000000 53.3839163 + 620 11 9 1992 32.0000000 52.0141498 + 621 12 9 1992 36.0000000 50.7167599 + 622 13 9 1992 28.0000000 48.9680484 + 623 14 9 1992 33.0000000 49.2786748 + 624 15 9 1992 35.0000000 51.0715701 + 625 16 9 1992 30.0000000 46.5750423 + 626 17 9 1992 32.0000000 45.3459934 + 627 18 9 1992 29.0000000 44.3066992 + 628 19 9 1992 30.0000000 43.8232833 + 629 20 9 1992 28.0000000 42.3709263 + 630 21 9 1992 29.0000000 41.4424631 + 631 22 9 1992 29.0000000 40.5761282 + 632 23 9 1992 27.0000000 39.7772662 + 633 24 9 1992 27.0000000 39.0099956 + 634 25 9 1992 23.0000000 38.2839811 + 635 26 9 1992 28.0000000 37.5973999 + 636 27 9 1992 25.0000000 36.9485857 + 637 28 9 1992 25.0000000 38.3504861 + 638 29 9 1992 27.0000000 40.0787055 + 639 30 9 1992 25.0000000 36.2584142 + 640 1 10 1992 27.0000000 36.2003432 + 641 2 10 1992 33.0000000 38.3682948 + 642 3 10 1992 29.0000000 39.0242939 + 643 4 10 1992 31.0000000 36.7621761 + 644 5 10 1992 25.0000000 49.9553228 + 645 6 10 1992 25.0000000 56.1514178 + 646 7 10 1992 36.0000000 44.1290153 + 647 8 10 1992 42.0000000 38.0650852 + 648 9 10 1992 43.0000000 39.8689005 + 649 10 10 1992 26.0000000 46.2413871 + 650 11 10 1992 27.0000000 43.2977602 + 651 12 10 1992 27.0000000 38.6281407 + 652 13 10 1992 26.0000000 37.6925971 + 653 14 10 1992 26.0000000 36.9496455 + 654 15 10 1992 23.0000000 51.3384703 + 655 16 10 1992 21.0000000 50.1641367 + 656 17 10 1992 26.0000000 43.7503490 + 657 18 10 1992 34.0000000 45.9671387 + 658 19 10 1992 37.0000000 41.5831308 + 659 20 10 1992 31.0000000 49.9100195 + 660 21 10 1992 31.0000000 49.9361736 + 661 22 10 1992 35.0000000 48.1400713 + 662 23 10 1992 33.0000000 76.2048704 + 663 24 10 1992 40.0000000 142.7017426 + 664 25 10 1992 74.0000000 191.5343489 + 665 26 10 1992 161.0000000 197.2451436 + 666 27 10 1992 285.0000000 212.3254393 + 667 28 10 1992 244.0000000 236.4038302 + 668 29 10 1992 263.0000000 249.8745699 + 669 30 10 1992 276.0000000 207.8030837 + 670 31 10 1992 186.0000000 175.8705738 + 671 1 11 1992 154.0000000 152.4640324 + 672 2 11 1992 112.0000000 157.4203540 + 673 3 11 1992 104.0000000 161.8531509 + 674 4 11 1992 96.0000000 153.0046606 + 675 5 11 1992 99.0000000 133.5384001 + 676 6 11 1992 126.0000000 117.9502328 + 677 7 11 1992 91.0000000 107.5156202 + 678 8 11 1992 84.0000000 102.3055941 + 679 9 11 1992 81.0000000 108.0929535 + 680 10 11 1992 85.0000000 147.0086293 + 681 11 11 1992 126.0000000 238.3676812 + 682 12 11 1992 279.0000000 288.0866406 + 683 13 11 1992 390.0000000 294.4563635 + 684 14 11 1992 294.0000000 301.8495795 + 685 15 11 1992 260.0000000 393.0063729 + 686 16 11 1992 398.0000000 534.1010595 + 687 17 11 1992 520.0000000 506.9314440 + 688 18 11 1992 487.0000000 480.3900472 + 689 19 11 1992 380.0000000 490.6324989 + 690 20 11 1992 385.0000000 418.1611444 + 691 21 11 1992 351.0000000 443.8576963 + 692 22 11 1992 309.0000000 521.9125816 + 693 23 11 1992 587.0000000 432.7538165 + 694 24 11 1992 661.0000000 370.1309056 + 695 25 11 1992 447.0000000 373.1655563 + 696 26 11 1992 361.0000000 397.0990876 + 697 27 11 1992 351.0000000 379.5912681 + 698 28 11 1992 353.0000000 410.5315642 + 699 29 11 1992 369.0000000 500.9071938 + 700 30 11 1992 452.0000000 488.5622783 + 701 1 12 1992 441.0000000 402.8113004 + 702 2 12 1992 348.0000000 436.1122844 + 703 3 12 1992 394.0000000 482.6593083 + 704 4 12 1992 455.0000000 523.8849558 + 705 5 12 1992 491.0000000 556.9153996 + 706 6 12 1992 469.0000000 488.6531069 + 707 7 12 1992 364.0000000 473.5081617 + 708 8 12 1992 338.0000000 416.1274484 + 709 9 12 1992 334.0000000 348.4892578 + 710 10 12 1992 268.0000000 291.4893811 + 711 11 12 1992 236.0000000 289.5073287 + 712 12 12 1992 230.0000000 298.9002138 + 713 13 12 1992 239.0000000 271.7792474 + 714 14 12 1992 256.0000000 231.4033694 + 715 15 12 1992 217.0000000 208.0875184 + 716 16 12 1992 201.0000000 195.4331269 + 717 17 12 1992 188.0000000 187.0814166 + 718 18 12 1992 176.0000000 176.5160723 + 719 19 12 1992 170.0000000 165.8603318 + 720 20 12 1992 168.0000000 163.1533224 + 721 21 12 1992 131.0000000 168.5519525 + 722 22 12 1992 133.0000000 169.2166386 + 723 23 12 1992 134.0000000 157.2004936 + 724 24 12 1992 127.0000000 148.9612799 + 725 25 12 1992 117.0000000 142.0142901 + 726 26 12 1992 113.0000000 135.7972690 + 727 27 12 1992 100.0000000 130.2127877 + 728 28 12 1992 94.0000000 125.1783862 + 729 29 12 1992 87.0000000 120.6238753 + 730 30 12 1992 86.0000000 116.4892844 + 731 31 12 1992 81.0000000 112.7231911 diff --git a/check/case_04/output_save/b3_daily_discharge.out b/check/case_04/output_save/b3_daily_discharge.out index 7453c8c5..6a056d98 100644 --- a/check/case_04/output_save/b3_daily_discharge.out +++ b/check/case_04/output_save/b3_daily_discharge.out @@ -1,366 +1,366 @@ No Day Mon Year Qobs_0000000045 Qsim_0000000045 - 1 1 1 1993 -9999.0000000 88.9174817 - 2 2 1 1993 -9999.0000000 86.6802737 - 3 3 1 1993 -9999.0000000 84.5922725 - 4 4 1 1993 -9999.0000000 82.6394203 - 5 5 1 1993 -9999.0000000 80.8091137 - 6 6 1 1993 -9999.0000000 79.0900445 - 7 7 1 1993 -9999.0000000 77.6127293 - 8 8 1 1993 -9999.0000000 77.6188245 - 9 9 1 1993 -9999.0000000 77.6905175 - 10 10 1 1993 -9999.0000000 76.7503534 - 11 11 1 1993 -9999.0000000 87.3812119 - 12 12 1 1993 -9999.0000000 105.5179063 - 13 13 1 1993 -9999.0000000 115.0501425 - 14 14 1 1993 -9999.0000000 125.9789760 - 15 15 1 1993 -9999.0000000 126.0381887 - 16 16 1 1993 -9999.0000000 125.1277395 - 17 17 1 1993 -9999.0000000 123.3173811 - 18 18 1 1993 -9999.0000000 117.2772167 - 19 19 1 1993 -9999.0000000 108.7408371 - 20 20 1 1993 -9999.0000000 103.3334174 - 21 21 1 1993 -9999.0000000 102.4310536 - 22 22 1 1993 -9999.0000000 101.5611734 - 23 23 1 1993 -9999.0000000 98.2035010 - 24 24 1 1993 -9999.0000000 94.5344721 - 25 25 1 1993 -9999.0000000 91.5645214 - 26 26 1 1993 -9999.0000000 88.4334035 - 27 27 1 1993 -9999.0000000 85.2416123 - 28 28 1 1993 -9999.0000000 82.3226963 - 29 29 1 1993 -9999.0000000 79.7242373 - 30 30 1 1993 -9999.0000000 77.5250909 - 31 31 1 1993 -9999.0000000 75.3178177 - 32 1 2 1993 -9999.0000000 73.3911589 - 33 2 2 1993 -9999.0000000 71.5976392 - 34 3 2 1993 -9999.0000000 69.9643306 - 35 4 2 1993 -9999.0000000 68.4411077 - 36 5 2 1993 -9999.0000000 66.9581169 - 37 6 2 1993 -9999.0000000 65.5631678 - 38 7 2 1993 -9999.0000000 64.2484551 - 39 8 2 1993 -9999.0000000 63.0068217 - 40 9 2 1993 -9999.0000000 61.8318233 - 41 10 2 1993 -9999.0000000 60.7176533 - 42 11 2 1993 -9999.0000000 59.6590761 - 43 12 2 1993 -9999.0000000 58.6513669 - 44 13 2 1993 -9999.0000000 57.6902595 - 45 14 2 1993 -9999.0000000 56.7718984 - 46 15 2 1993 -9999.0000000 55.8927973 - 47 16 2 1993 -9999.0000000 55.0498011 - 48 17 2 1993 -9999.0000000 54.2400527 - 49 18 2 1993 -9999.0000000 53.4609629 - 50 19 2 1993 -9999.0000000 52.7167388 - 51 20 2 1993 -9999.0000000 52.0133247 - 52 21 2 1993 -9999.0000000 51.3174116 - 53 22 2 1993 -9999.0000000 50.6374519 - 54 23 2 1993 -9999.0000000 49.9785492 - 55 24 2 1993 -9999.0000000 49.3392326 - 56 25 2 1993 -9999.0000000 48.7181626 - 57 26 2 1993 -9999.0000000 48.1141181 - 58 27 2 1993 -9999.0000000 47.6863095 - 59 28 2 1993 -9999.0000000 48.3771309 - 60 1 3 1993 50.5000000 47.4563970 - 61 2 3 1993 48.5000000 47.1746923 - 62 3 3 1993 46.6000000 46.7027112 - 63 4 3 1993 46.6000000 46.1240202 - 64 5 3 1993 48.5000000 45.5237896 - 65 6 3 1993 47.5000000 44.9433043 - 66 7 3 1993 68.8000000 44.4673151 - 67 8 3 1993 52.6000000 44.1547199 - 68 9 3 1993 39.8000000 43.9698766 - 69 10 3 1993 43.8000000 43.9972491 - 70 11 3 1993 42.2000000 43.6993126 - 71 12 3 1993 42.2000000 43.2832027 - 72 13 3 1993 38.3000000 42.9076594 - 73 14 3 1993 42.2000000 42.5344163 - 74 15 3 1993 44.7000000 42.0865674 - 75 16 3 1993 44.7000000 41.5299183 - 76 17 3 1993 43.8000000 40.9778303 - 77 18 3 1993 44.7000000 40.4429160 - 78 19 3 1993 44.7000000 39.9239789 - 79 20 3 1993 43.0000000 39.4199275 - 80 21 3 1993 41.3000000 38.9297665 - 81 22 3 1993 41.3000000 38.4525879 - 82 23 3 1993 41.3000000 47.5774598 - 83 24 3 1993 44.7000000 84.2115319 - 84 25 3 1993 70.0000000 87.9040724 - 85 26 3 1993 106.0000000 78.6155259 - 86 27 3 1993 88.2000000 74.3224090 - 87 28 3 1993 82.9000000 71.1185513 - 88 29 3 1993 63.8000000 68.1792042 - 89 30 3 1993 54.9000000 65.2503131 - 90 31 3 1993 52.6000000 62.7641175 - 91 1 4 1993 50.5000000 62.8474533 - 92 2 4 1993 50.5000000 62.8315327 - 93 3 4 1993 53.7000000 61.9529926 - 94 4 4 1993 60.1000000 61.5830785 - 95 5 4 1993 56.0000000 59.3241895 - 96 6 4 1993 56.0000000 58.0419712 - 97 7 4 1993 54.9000000 57.0259880 - 98 8 4 1993 56.5000000 55.4157479 - 99 9 4 1993 53.7000000 53.8503885 - 100 10 4 1993 51.6000000 61.1009138 - 101 11 4 1993 56.0000000 107.4742775 - 102 12 4 1993 106.0000000 134.5574793 - 103 13 4 1993 158.0000000 167.5613209 - 104 14 4 1993 222.0000000 184.0932804 - 105 15 4 1993 209.0000000 174.3555987 - 106 16 4 1993 194.0000000 155.5201493 - 107 17 4 1993 158.0000000 135.6970116 - 108 18 4 1993 126.0000000 120.1171377 - 109 19 4 1993 113.0000000 106.8746554 - 110 20 4 1993 106.0000000 96.2659361 - 111 21 4 1993 100.0000000 88.8486434 - 112 22 4 1993 98.9000000 82.9290691 - 113 23 4 1993 94.8000000 78.1768669 - 114 24 4 1993 90.8000000 73.9938665 - 115 25 4 1993 88.2000000 70.2405113 - 116 26 4 1993 82.9000000 66.9318521 - 117 27 4 1993 77.7000000 64.0175483 - 118 28 4 1993 75.1000000 61.4780028 - 119 29 4 1993 76.4000000 59.4052493 - 120 30 4 1993 75.1000000 65.6808928 - 121 1 5 1993 73.8000000 64.7179039 - 122 2 5 1993 68.8000000 59.8119498 - 123 3 5 1993 67.5000000 57.6555626 - 124 4 5 1993 66.3000000 55.9525711 - 125 5 5 1993 67.5000000 55.1776455 - 126 6 5 1993 66.3000000 53.1016579 - 127 7 5 1993 68.8000000 53.4509745 - 128 8 5 1993 63.8000000 60.4475126 - 129 9 5 1993 62.6000000 58.9368831 - 130 10 5 1993 61.3000000 54.0263370 - 131 11 5 1993 60.1000000 51.7768636 - 132 12 5 1993 65.0000000 50.1078061 - 133 13 5 1993 62.6000000 48.7020596 - 134 14 5 1993 58.9000000 47.4173307 - 135 15 5 1993 57.2000000 50.3498283 - 136 16 5 1993 56.0000000 51.3479266 - 137 17 5 1993 56.0000000 47.8475576 - 138 18 5 1993 54.9000000 46.4234063 - 139 19 5 1993 54.9000000 45.0929406 - 140 20 5 1993 56.0000000 43.8892348 - 141 21 5 1993 56.0000000 43.0220374 - 142 22 5 1993 54.9000000 41.6779460 - 143 23 5 1993 52.6000000 40.6672801 - 144 24 5 1993 51.6000000 39.7192676 - 145 25 5 1993 48.5000000 38.8292359 - 146 26 5 1993 47.5000000 37.9920507 - 147 27 5 1993 45.6000000 37.2030789 - 148 28 5 1993 45.6000000 53.5700850 - 149 29 5 1993 53.7000000 47.0571078 - 150 30 5 1993 53.7000000 38.7975623 - 151 31 5 1993 49.5000000 37.8738823 - 152 1 6 1993 51.6000000 37.0071103 - 153 2 6 1993 47.5000000 38.1930803 - 154 3 6 1993 47.5000000 68.1828539 - 155 4 6 1993 53.7000000 57.6862846 - 156 5 6 1993 51.6000000 46.8869497 - 157 6 6 1993 52.6000000 45.0424690 - 158 7 6 1993 48.5000000 43.9640434 - 159 8 6 1993 52.6000000 42.5341215 - 160 9 6 1993 50.5000000 41.0147334 - 161 10 6 1993 46.6000000 40.6522442 - 162 11 6 1993 46.6000000 46.2075401 - 163 12 6 1993 47.5000000 47.8087675 - 164 13 6 1993 45.6000000 43.6190264 - 165 14 6 1993 44.7000000 40.0673826 - 166 15 6 1993 52.6000000 38.8254142 - 167 16 6 1993 48.5000000 37.7041825 - 168 17 6 1993 51.6000000 45.0175928 - 169 18 6 1993 52.6000000 42.4901620 - 170 19 6 1993 47.5000000 38.2736715 - 171 20 6 1993 44.7000000 40.1327517 - 172 21 6 1993 45.6000000 43.4850851 - 173 22 6 1993 48.5000000 38.9406455 - 174 23 6 1993 47.5000000 56.6757714 - 175 24 6 1993 58.9000000 70.9492495 - 176 25 6 1993 62.6000000 57.3830614 - 177 26 6 1993 60.1000000 50.3606707 - 178 27 6 1993 60.1000000 47.8478660 - 179 28 6 1993 56.0000000 50.2575289 - 180 29 6 1993 57.2000000 49.8565506 - 181 30 6 1993 53.7000000 45.6936917 - 182 1 7 1993 49.5000000 43.8326209 - 183 2 7 1993 48.5000000 42.1969732 - 184 3 7 1993 54.9000000 40.6903703 - 185 4 7 1993 49.5000000 39.3003280 - 186 5 7 1993 43.8000000 38.0156687 - 187 6 7 1993 43.0000000 57.0376726 - 188 7 7 1993 44.7000000 49.9355734 - 189 8 7 1993 41.3000000 42.3693201 - 190 9 7 1993 38.3000000 40.5775320 - 191 10 7 1993 39.1000000 41.1038661 - 192 11 7 1993 37.6000000 75.7709674 - 193 12 7 1993 38.3000000 65.8854124 - 194 13 7 1993 66.3000000 49.8079554 - 195 14 7 1993 53.7000000 46.6767805 - 196 15 7 1993 44.7000000 44.0680329 - 197 16 7 1993 43.0000000 42.2289602 - 198 17 7 1993 37.6000000 40.6233237 - 199 18 7 1993 37.0000000 47.3880246 - 200 19 7 1993 37.0000000 49.8887000 - 201 20 7 1993 39.8000000 51.6255513 - 202 21 7 1993 46.6000000 48.9884497 - 203 22 7 1993 48.5000000 43.2356050 - 204 23 7 1993 45.6000000 40.4032786 - 205 24 7 1993 45.6000000 37.9908218 - 206 25 7 1993 42.2000000 36.3414537 - 207 26 7 1993 43.8000000 85.0528743 - 208 27 7 1993 73.8000000 69.5451940 - 209 28 7 1993 57.7000000 52.6119507 - 210 29 7 1993 53.7000000 48.9101544 - 211 30 7 1993 49.5000000 45.7098253 - 212 31 7 1993 43.8000000 43.0066159 - 213 1 8 1993 40.6000000 41.1045288 - 214 2 8 1993 37.6000000 39.4809828 - 215 3 8 1993 39.1000000 37.9887047 - 216 4 8 1993 37.6000000 36.6163328 - 217 5 8 1993 36.3000000 35.3520375 - 218 6 8 1993 39.1000000 37.1031235 - 219 7 8 1993 41.3000000 34.4514202 - 220 8 8 1993 39.1000000 33.8431229 - 221 9 8 1993 39.8000000 44.4173605 - 222 10 8 1993 43.0000000 35.9972949 - 223 11 8 1993 37.0000000 32.4544709 - 224 12 8 1993 37.0000000 31.4840580 - 225 13 8 1993 36.3000000 30.5826346 - 226 14 8 1993 37.6000000 29.7437704 - 227 15 8 1993 34.5000000 28.9616927 - 228 16 8 1993 35.1000000 28.2312088 - 229 17 8 1993 35.1000000 29.5166868 - 230 18 8 1993 35.7000000 28.9005681 - 231 19 8 1993 35.1000000 27.1485394 - 232 20 8 1993 35.1000000 26.3238587 - 233 21 8 1993 33.3000000 25.7451806 - 234 22 8 1993 32.8000000 25.1999522 - 235 23 8 1993 34.5000000 24.6855447 - 236 24 8 1993 33.9000000 33.0026394 - 237 25 8 1993 37.6000000 86.9093216 - 238 26 8 1993 53.7000000 65.1993801 - 239 27 8 1993 81.6000000 70.1422507 - 240 28 8 1993 76.4000000 73.3543250 - 241 29 8 1993 77.7000000 59.2273887 - 242 30 8 1993 68.8000000 52.6138336 - 243 31 8 1993 56.5000000 48.8861225 - 244 1 9 1993 52.6000000 46.2003838 - 245 2 9 1993 48.5000000 43.7793558 - 246 3 9 1993 43.8000000 61.5026864 - 247 4 9 1993 76.4000000 92.5462287 - 248 5 9 1993 131.0000000 93.4932332 - 249 6 9 1993 124.0000000 79.1596956 - 250 7 9 1993 96.2000000 71.1394021 - 251 8 9 1993 75.1000000 67.9814715 - 252 9 9 1993 62.6000000 91.4528645 - 253 10 9 1993 88.2000000 143.9721568 - 254 11 9 1993 177.0000000 148.2462650 - 255 12 9 1993 186.0000000 125.7752791 - 256 13 9 1993 140.0000000 125.2855159 - 257 14 9 1993 133.0000000 155.0368213 - 258 15 9 1993 206.0000000 160.5448505 - 259 16 9 1993 152.0000000 171.2905381 - 260 17 9 1993 142.0000000 215.6563554 - 261 18 9 1993 186.0000000 216.3797671 - 262 19 9 1993 221.0000000 180.8427547 - 263 20 9 1993 171.0000000 153.6918330 - 264 21 9 1993 139.0000000 131.3551517 - 265 22 9 1993 111.0000000 113.0401181 - 266 23 9 1993 103.0000000 98.2067967 - 267 24 9 1993 85.5000000 99.0106255 - 268 25 9 1993 79.0000000 218.3689240 - 269 26 9 1993 226.0000000 339.9157414 - 270 27 9 1993 396.0000000 332.7978120 - 271 28 9 1993 306.0000000 286.2359393 - 272 29 9 1993 263.0000000 307.8071897 - 273 30 9 1993 297.0000000 310.8303450 - 274 1 10 1993 249.0000000 337.5824792 - 275 2 10 1993 358.0000000 513.5285566 - 276 3 10 1993 667.0000000 563.9151453 - 277 4 10 1993 476.0000000 463.6293887 - 278 5 10 1993 328.0000000 388.7943929 - 279 6 10 1993 260.0000000 433.5669168 - 280 7 10 1993 419.0000000 519.9931476 - 281 8 10 1993 495.0000000 605.8479438 - 282 9 10 1993 581.0000000 634.4935101 - 283 10 10 1993 545.0000000 526.6322418 - 284 11 10 1993 396.0000000 439.9444574 - 285 12 10 1993 311.0000000 375.8063840 - 286 13 10 1993 258.0000000 330.7515782 - 287 14 10 1993 262.0000000 350.4072621 - 288 15 10 1993 304.0000000 369.7597595 - 289 16 10 1993 265.0000000 321.8714501 - 290 17 10 1993 256.0000000 280.0968967 - 291 18 10 1993 237.0000000 292.5097020 - 292 19 10 1993 244.0000000 289.3308491 - 293 20 10 1993 241.0000000 258.2111990 - 294 21 10 1993 244.0000000 553.6335100 - 295 22 10 1993 803.0000000 959.6352133 - 296 23 10 1993 1185.0000000 1096.9772180 - 297 24 10 1993 993.0000000 1059.2733428 - 298 25 10 1993 774.0000000 906.3788976 - 299 26 10 1993 609.0000000 760.6889830 - 300 27 10 1993 493.0000000 641.8597118 - 301 28 10 1993 444.0000000 544.1075748 - 302 29 10 1993 392.0000000 463.2523096 - 303 30 10 1993 334.0000000 395.8934193 - 304 31 10 1993 306.0000000 339.4349273 - 305 1 11 1993 265.0000000 291.8717350 - 306 2 11 1993 263.0000000 253.1321123 - 307 3 11 1993 248.0000000 225.2971513 - 308 4 11 1993 239.0000000 198.4603392 - 309 5 11 1993 219.0000000 279.0751095 - 310 6 11 1993 302.0000000 385.9510468 - 311 7 11 1993 330.0000000 413.8248962 - 312 8 11 1993 358.0000000 414.2968570 - 313 9 11 1993 396.0000000 377.3377797 - 314 10 11 1993 339.0000000 324.9259619 - 315 11 11 1993 286.0000000 320.6174214 - 316 12 11 1993 286.0000000 377.6032154 - 317 13 11 1993 274.0000000 390.2055204 - 318 14 11 1993 281.0000000 340.7960068 - 319 15 11 1993 293.0000000 317.6694183 - 320 16 11 1993 322.0000000 293.9891351 - 321 17 11 1993 304.0000000 259.2702127 - 322 18 11 1993 276.0000000 226.1423274 - 323 19 11 1993 248.0000000 198.4109226 - 324 20 11 1993 234.0000000 175.9482470 - 325 21 11 1993 219.0000000 158.2795612 - 326 22 11 1993 216.0000000 143.5439408 - 327 23 11 1993 209.0000000 131.4365558 - 328 24 11 1993 178.0000000 122.4192301 - 329 25 11 1993 188.0000000 115.8067511 - 330 26 11 1993 183.0000000 110.8639427 - 331 27 11 1993 171.0000000 106.7283792 - 332 28 11 1993 169.0000000 102.9466885 - 333 29 11 1993 164.0000000 99.4682330 - 334 30 11 1993 142.0000000 96.2625552 - 335 1 12 1993 130.0000000 93.3025005 - 336 2 12 1993 134.0000000 90.5638370 - 337 3 12 1993 126.0000000 88.1448841 - 338 4 12 1993 114.0000000 89.7747477 - 339 5 12 1993 116.0000000 90.6422308 - 340 6 12 1993 114.0000000 89.2289863 - 341 7 12 1993 124.0000000 87.1463799 - 342 8 12 1993 121.0000000 87.9339935 - 343 9 12 1993 124.0000000 101.8499798 - 344 10 12 1993 172.0000000 115.4449482 - 345 11 12 1993 174.0000000 162.2581588 - 346 12 12 1993 188.0000000 180.5514185 - 347 13 12 1993 174.0000000 200.3022182 - 348 14 12 1993 178.0000000 396.7061048 - 349 15 12 1993 565.0000000 551.2968976 - 350 16 12 1993 506.0000000 532.7143505 - 351 17 12 1993 424.0000000 483.0365982 - 352 18 12 1993 343.0000000 413.2806945 - 353 19 12 1993 286.0000000 358.8525746 - 354 20 12 1993 258.0000000 324.9512502 - 355 21 12 1993 237.0000000 348.9072864 - 356 22 12 1993 246.0000000 346.4147608 - 357 23 12 1993 239.0000000 293.7313370 - 358 24 12 1993 224.0000000 353.1994255 - 359 25 12 1993 337.0000000 417.6421394 - 360 26 12 1993 288.0000000 356.5672295 - 361 27 12 1993 248.0000000 307.6532311 - 362 28 12 1993 219.0000000 266.7355682 - 363 29 12 1993 204.0000000 232.8171598 - 364 30 12 1993 188.0000000 204.5406892 - 365 31 12 1993 175.0000000 185.4160584 + 1 1 1 1993 -9999.0000000 88.9219225 + 2 2 1 1993 -9999.0000000 86.6846183 + 3 3 1 1993 -9999.0000000 84.5965265 + 4 4 1 1993 -9999.0000000 82.6435889 + 5 5 1 1993 -9999.0000000 80.8132016 + 6 6 1 1993 -9999.0000000 79.0940559 + 7 7 1 1993 -9999.0000000 77.6166709 + 8 8 1 1993 -9999.0000000 77.6232678 + 9 9 1 1993 -9999.0000000 77.6945394 + 10 10 1 1993 -9999.0000000 76.7542803 + 11 11 1 1993 -9999.0000000 87.3985129 + 12 12 1 1993 -9999.0000000 105.5168100 + 13 13 1 1993 -9999.0000000 115.0097444 + 14 14 1 1993 -9999.0000000 125.9542450 + 15 15 1 1993 -9999.0000000 126.0300807 + 16 16 1 1993 -9999.0000000 125.1041370 + 17 17 1 1993 -9999.0000000 123.2930031 + 18 18 1 1993 -9999.0000000 117.2775026 + 19 19 1 1993 -9999.0000000 108.7486325 + 20 20 1 1993 -9999.0000000 103.3386830 + 21 21 1 1993 -9999.0000000 102.4213872 + 22 22 1 1993 -9999.0000000 101.5570022 + 23 23 1 1993 -9999.0000000 98.2042876 + 24 24 1 1993 -9999.0000000 94.5431654 + 25 25 1 1993 -9999.0000000 91.5727407 + 26 26 1 1993 -9999.0000000 88.4411708 + 27 27 1 1993 -9999.0000000 85.2489685 + 28 28 1 1993 -9999.0000000 82.3296788 + 29 29 1 1993 -9999.0000000 79.7308790 + 30 30 1 1993 -9999.0000000 77.5314231 + 31 31 1 1993 -9999.0000000 75.3238669 + 32 1 2 1993 -9999.0000000 73.3969495 + 33 2 2 1993 -9999.0000000 71.6031932 + 34 3 2 1993 -9999.0000000 69.9696674 + 35 4 2 1993 -9999.0000000 68.4462455 + 36 5 2 1993 -9999.0000000 66.9630714 + 37 6 2 1993 -9999.0000000 65.5679534 + 38 7 2 1993 -9999.0000000 64.2530848 + 39 8 2 1993 -9999.0000000 63.0113072 + 40 9 2 1993 -9999.0000000 61.8361752 + 41 10 2 1993 -9999.0000000 60.7218813 + 42 11 2 1993 -9999.0000000 59.6631888 + 43 12 2 1993 -9999.0000000 58.6553722 + 44 13 2 1993 -9999.0000000 57.6941645 + 45 14 2 1993 -9999.0000000 56.7757097 + 46 15 2 1993 -9999.0000000 55.8965208 + 47 16 2 1993 -9999.0000000 55.0534422 + 48 17 2 1993 -9999.0000000 54.2436163 + 49 18 2 1993 -9999.0000000 53.4644534 + 50 19 2 1993 -9999.0000000 52.7201578 + 51 20 2 1993 -9999.0000000 52.0166707 + 52 21 2 1993 -9999.0000000 51.3206943 + 53 22 2 1993 -9999.0000000 50.6406766 + 54 23 2 1993 -9999.0000000 49.9817186 + 55 24 2 1993 -9999.0000000 49.3423494 + 56 25 2 1993 -9999.0000000 48.7212291 + 57 26 2 1993 -9999.0000000 48.1171364 + 58 27 2 1993 -9999.0000000 47.6898559 + 59 28 2 1993 -9999.0000000 48.3813354 + 60 1 3 1993 50.5000000 47.4591843 + 61 2 3 1993 48.5000000 47.1774263 + 62 3 3 1993 46.6000000 46.7053922 + 63 4 3 1993 46.6000000 46.1266359 + 64 5 3 1993 48.5000000 45.5263771 + 65 6 3 1993 47.5000000 44.9458649 + 66 7 3 1993 68.8000000 44.4698256 + 67 8 3 1993 52.6000000 44.1571907 + 68 9 3 1993 39.8000000 43.9723119 + 69 10 3 1993 43.8000000 43.9996639 + 70 11 3 1993 42.2000000 43.7016899 + 71 12 3 1993 42.2000000 43.2858831 + 72 13 3 1993 38.3000000 42.9102964 + 73 14 3 1993 42.2000000 42.5370114 + 74 15 3 1993 44.7000000 42.0891227 + 75 16 3 1993 44.7000000 41.5324352 + 76 17 3 1993 43.8000000 40.9803101 + 77 18 3 1993 44.7000000 40.4453601 + 78 19 3 1993 44.7000000 39.9263887 + 79 20 3 1993 43.0000000 39.4223041 + 80 21 3 1993 41.3000000 38.9321110 + 81 22 3 1993 41.3000000 38.4549013 + 82 23 3 1993 41.3000000 47.5598293 + 83 24 3 1993 44.7000000 84.1489851 + 84 25 3 1993 70.0000000 87.9240716 + 85 26 3 1993 106.0000000 78.6220543 + 86 27 3 1993 88.2000000 74.3246429 + 87 28 3 1993 82.9000000 71.1210349 + 88 29 3 1993 63.8000000 68.1814668 + 89 30 3 1993 54.9000000 65.2525448 + 90 31 3 1993 52.6000000 62.7664111 + 91 1 4 1993 50.5000000 62.8307456 + 92 2 4 1993 50.5000000 62.8198188 + 93 3 4 1993 53.7000000 61.9531922 + 94 4 4 1993 60.1000000 61.5893014 + 95 5 4 1993 56.0000000 59.3285067 + 96 6 4 1993 56.0000000 58.0460774 + 97 7 4 1993 54.9000000 57.0299065 + 98 8 4 1993 56.5000000 55.4194918 + 99 9 4 1993 53.7000000 53.8539723 + 100 10 4 1993 51.6000000 61.1019785 + 101 11 4 1993 56.0000000 107.4524006 + 102 12 4 1993 106.0000000 134.5165828 + 103 13 4 1993 158.0000000 167.5725050 + 104 14 4 1993 222.0000000 184.0980255 + 105 15 4 1993 209.0000000 174.3587564 + 106 16 4 1993 194.0000000 155.5239396 + 107 17 4 1993 158.0000000 135.7022890 + 108 18 4 1993 126.0000000 120.1216788 + 109 19 4 1993 113.0000000 106.8785644 + 110 20 4 1993 106.0000000 96.2698393 + 111 21 4 1993 100.0000000 88.8522923 + 112 22 4 1993 98.9000000 82.9326293 + 113 23 4 1993 94.8000000 78.1803895 + 114 24 4 1993 90.8000000 73.9972503 + 115 25 4 1993 88.2000000 70.2437671 + 116 26 4 1993 82.9000000 66.9349899 + 117 27 4 1993 77.7000000 64.0205769 + 118 28 4 1993 75.1000000 61.4809308 + 119 29 4 1993 76.4000000 59.4080901 + 120 30 4 1993 75.1000000 65.6716536 + 121 1 5 1993 73.8000000 64.7120971 + 122 2 5 1993 68.8000000 59.8149283 + 123 3 5 1993 67.5000000 57.6584380 + 124 4 5 1993 66.3000000 55.9559380 + 125 5 5 1993 67.5000000 55.1818391 + 126 6 5 1993 66.3000000 53.1042283 + 127 7 5 1993 68.8000000 53.4413468 + 128 8 5 1993 63.8000000 60.4356503 + 129 9 5 1993 62.6000000 58.9278398 + 130 10 5 1993 61.3000000 54.0261618 + 131 11 5 1993 60.1000000 51.7799091 + 132 12 5 1993 65.0000000 50.1107378 + 133 13 5 1993 62.6000000 48.7048821 + 134 14 5 1993 58.9000000 47.4200542 + 135 15 5 1993 57.2000000 50.3345694 + 136 16 5 1993 56.0000000 51.3392072 + 137 17 5 1993 56.0000000 47.8504744 + 138 18 5 1993 54.9000000 46.4262175 + 139 19 5 1993 54.9000000 45.0956541 + 140 20 5 1993 56.0000000 43.8918582 + 141 21 5 1993 56.0000000 43.0245772 + 142 22 5 1993 54.9000000 41.6804086 + 143 23 5 1993 52.6000000 40.6696708 + 144 24 5 1993 51.6000000 39.7215915 + 145 25 5 1993 48.5000000 38.8314976 + 146 26 5 1993 47.5000000 37.9942543 + 147 27 5 1993 45.6000000 37.2052281 + 148 28 5 1993 45.6000000 53.5700682 + 149 29 5 1993 53.7000000 47.0505032 + 150 30 5 1993 53.7000000 38.7997147 + 151 31 5 1993 49.5000000 37.8759808 + 152 1 6 1993 51.6000000 37.0091584 + 153 2 6 1993 47.5000000 38.1950706 + 154 3 6 1993 47.5000000 68.1207453 + 155 4 6 1993 53.7000000 57.6520764 + 156 5 6 1993 51.6000000 46.8901487 + 157 6 6 1993 52.6000000 45.0455252 + 158 7 6 1993 48.5000000 43.9652859 + 159 8 6 1993 52.6000000 42.5307079 + 160 9 6 1993 50.5000000 41.0175715 + 161 10 6 1993 46.6000000 40.6549661 + 162 11 6 1993 46.6000000 46.2005981 + 163 12 6 1993 47.5000000 47.7939404 + 164 13 6 1993 45.6000000 43.6147560 + 165 14 6 1993 44.7000000 40.0701394 + 166 15 6 1993 52.6000000 38.8280636 + 167 16 6 1993 48.5000000 37.7067329 + 168 17 6 1993 51.6000000 45.0256201 + 169 18 6 1993 52.6000000 42.4871251 + 170 19 6 1993 47.5000000 38.2761109 + 171 20 6 1993 44.7000000 40.1276910 + 172 21 6 1993 45.6000000 43.4827206 + 173 22 6 1993 48.5000000 38.9458885 + 174 23 6 1993 47.5000000 56.6948911 + 175 24 6 1993 58.9000000 70.9385629 + 176 25 6 1993 62.6000000 57.3754932 + 177 26 6 1993 60.1000000 50.3635494 + 178 27 6 1993 60.1000000 47.8506207 + 179 28 6 1993 56.0000000 50.2620556 + 180 29 6 1993 57.2000000 49.8541105 + 181 30 6 1993 53.7000000 45.6963120 + 182 1 7 1993 49.5000000 43.8351377 + 183 2 7 1993 48.5000000 42.1993952 + 184 3 7 1993 54.9000000 40.6927050 + 185 4 7 1993 49.5000000 39.3025822 + 186 5 7 1993 43.8000000 38.0178483 + 187 6 7 1993 43.0000000 57.0763688 + 188 7 7 1993 44.7000000 49.9372795 + 189 8 7 1993 41.3000000 42.3712224 + 190 9 7 1993 38.3000000 40.5793844 + 191 10 7 1993 39.1000000 41.1056639 + 192 11 7 1993 37.6000000 75.6578567 + 193 12 7 1993 38.3000000 65.8351510 + 194 13 7 1993 66.3000000 49.8114701 + 195 14 7 1993 53.7000000 46.6801134 + 196 15 7 1993 44.7000000 44.0711987 + 197 16 7 1993 43.0000000 42.2319737 + 198 17 7 1993 37.6000000 40.6261985 + 199 18 7 1993 37.0000000 47.3320815 + 200 19 7 1993 37.0000000 49.8627153 + 201 20 7 1993 39.8000000 51.6290113 + 202 21 7 1993 46.6000000 48.9916973 + 203 22 7 1993 48.5000000 43.2388264 + 204 23 7 1993 45.6000000 40.4063069 + 205 24 7 1993 45.6000000 37.9937121 + 206 25 7 1993 42.2000000 36.3426078 + 207 26 7 1993 43.8000000 84.9324883 + 208 27 7 1993 73.8000000 69.4948021 + 209 28 7 1993 57.7000000 52.6176887 + 210 29 7 1993 53.7000000 48.9155261 + 211 30 7 1993 49.5000000 45.7148646 + 212 31 7 1993 43.8000000 43.0113527 + 213 1 8 1993 40.6000000 41.1089904 + 214 2 8 1993 37.6000000 39.4851949 + 215 3 8 1993 39.1000000 37.9926893 + 216 4 8 1993 37.6000000 36.6201100 + 217 5 8 1993 36.3000000 35.3556252 + 218 6 8 1993 39.1000000 37.1144611 + 219 7 8 1993 41.3000000 34.4585344 + 220 8 8 1993 39.1000000 33.8323303 + 221 9 8 1993 39.8000000 44.3986674 + 222 10 8 1993 43.0000000 35.9896216 + 223 11 8 1993 37.0000000 32.4578524 + 224 12 8 1993 37.0000000 31.4872828 + 225 13 8 1993 36.3000000 30.5857159 + 226 14 8 1993 37.6000000 29.7467198 + 227 15 8 1993 34.5000000 28.9645209 + 228 16 8 1993 35.1000000 28.2339255 + 229 17 8 1993 35.1000000 29.4882297 + 230 18 8 1993 35.7000000 28.8856449 + 231 19 8 1993 35.1000000 27.1513566 + 232 20 8 1993 35.1000000 26.3265648 + 233 21 8 1993 33.3000000 25.7477841 + 234 22 8 1993 32.8000000 25.2024610 + 235 23 8 1993 34.5000000 24.6879661 + 236 24 8 1993 33.9000000 32.9744426 + 237 25 8 1993 37.6000000 86.7693965 + 238 26 8 1993 53.7000000 65.1469644 + 239 27 8 1993 81.6000000 70.1666929 + 240 28 8 1993 76.4000000 73.3813808 + 241 29 8 1993 77.7000000 59.2349273 + 242 30 8 1993 68.8000000 52.6190737 + 243 31 8 1993 56.5000000 48.8910565 + 244 1 9 1993 52.6000000 46.2050574 + 245 2 9 1993 48.5000000 43.7837698 + 246 3 9 1993 43.8000000 61.5221636 + 247 4 9 1993 76.4000000 92.5369973 + 248 5 9 1993 131.0000000 93.4890860 + 249 6 9 1993 124.0000000 79.1672552 + 250 7 9 1993 96.2000000 71.1460911 + 251 8 9 1993 75.1000000 67.9875224 + 252 9 9 1993 62.6000000 91.4391073 + 253 10 9 1993 88.2000000 143.8737801 + 254 11 9 1993 177.0000000 148.2076483 + 255 12 9 1993 186.0000000 125.7829334 + 256 13 9 1993 140.0000000 125.2669152 + 257 14 9 1993 133.0000000 154.9210778 + 258 15 9 1993 206.0000000 160.5187469 + 259 16 9 1993 152.0000000 171.2877826 + 260 17 9 1993 142.0000000 215.6225234 + 261 18 9 1993 186.0000000 216.3835105 + 262 19 9 1993 221.0000000 180.8647158 + 263 20 9 1993 171.0000000 153.7102910 + 264 21 9 1993 139.0000000 131.3697656 + 265 22 9 1993 111.0000000 113.0516078 + 266 23 9 1993 103.0000000 98.2154754 + 267 24 9 1993 85.5000000 99.0194362 + 268 25 9 1993 79.0000000 218.2082715 + 269 26 9 1993 226.0000000 339.8269125 + 270 27 9 1993 396.0000000 332.8128931 + 271 28 9 1993 306.0000000 286.2731204 + 272 29 9 1993 263.0000000 307.7965005 + 273 30 9 1993 297.0000000 310.8424290 + 274 1 10 1993 249.0000000 337.5141238 + 275 2 10 1993 358.0000000 513.3532918 + 276 3 10 1993 667.0000000 563.9030232 + 277 4 10 1993 476.0000000 463.6985020 + 278 5 10 1993 328.0000000 388.8501162 + 279 6 10 1993 260.0000000 433.4262927 + 280 7 10 1993 419.0000000 519.9201819 + 281 8 10 1993 495.0000000 605.7919277 + 282 9 10 1993 581.0000000 634.5205088 + 283 10 10 1993 545.0000000 526.7069302 + 284 11 10 1993 396.0000000 440.0075926 + 285 12 10 1993 311.0000000 375.8572189 + 286 13 10 1993 258.0000000 330.7942834 + 287 14 10 1993 262.0000000 350.4186745 + 288 15 10 1993 304.0000000 369.7771123 + 289 16 10 1993 265.0000000 321.8999547 + 290 17 10 1993 256.0000000 280.1250606 + 291 18 10 1993 237.0000000 292.5067633 + 292 19 10 1993 244.0000000 289.3397160 + 293 20 10 1993 241.0000000 258.2069782 + 294 21 10 1993 244.0000000 553.4753852 + 295 22 10 1993 803.0000000 959.4379864 + 296 23 10 1993 1185.0000000 1096.9054412 + 297 24 10 1993 993.0000000 1059.3320988 + 298 25 10 1993 774.0000000 906.4815343 + 299 26 10 1993 609.0000000 760.7780584 + 300 27 10 1993 493.0000000 641.9300934 + 301 28 10 1993 444.0000000 544.1631683 + 302 29 10 1993 392.0000000 463.2962085 + 303 30 10 1993 334.0000000 395.9280670 + 304 31 10 1993 306.0000000 339.4622648 + 305 1 11 1993 265.0000000 291.8932931 + 306 2 11 1993 263.0000000 253.1491178 + 307 3 11 1993 248.0000000 225.3106108 + 308 4 11 1993 239.0000000 198.4709853 + 309 5 11 1993 219.0000000 279.0276244 + 310 6 11 1993 302.0000000 385.9231790 + 311 7 11 1993 330.0000000 413.8530387 + 312 8 11 1993 358.0000000 414.3103128 + 313 9 11 1993 396.0000000 377.3551322 + 314 10 11 1993 339.0000000 324.9390322 + 315 11 11 1993 286.0000000 320.6162303 + 316 12 11 1993 286.0000000 377.6108900 + 317 13 11 1993 274.0000000 390.2320360 + 318 14 11 1993 281.0000000 340.8161591 + 319 15 11 1993 293.0000000 317.7045789 + 320 16 11 1993 322.0000000 294.0110482 + 321 17 11 1993 304.0000000 259.2805498 + 322 18 11 1993 276.0000000 226.1493948 + 323 19 11 1993 248.0000000 198.4160339 + 324 20 11 1993 234.0000000 175.9523530 + 325 21 11 1993 219.0000000 158.2837610 + 326 22 11 1993 216.0000000 143.5480963 + 327 23 11 1993 209.0000000 131.4409215 + 328 24 11 1993 178.0000000 122.4237668 + 329 25 11 1993 188.0000000 115.8116138 + 330 26 11 1993 183.0000000 110.8690726 + 331 27 11 1993 171.0000000 106.7334424 + 332 28 11 1993 169.0000000 102.9516840 + 333 29 11 1993 164.0000000 99.4731621 + 334 30 11 1993 142.0000000 96.2674193 + 335 1 12 1993 130.0000000 93.3073011 + 336 2 12 1993 134.0000000 90.5685754 + 337 3 12 1993 126.0000000 88.1495653 + 338 4 12 1993 114.0000000 89.7663742 + 339 5 12 1993 116.0000000 90.6412187 + 340 6 12 1993 114.0000000 89.2345113 + 341 7 12 1993 124.0000000 87.1520266 + 342 8 12 1993 121.0000000 87.9412983 + 343 9 12 1993 124.0000000 101.8656131 + 344 10 12 1993 172.0000000 115.4588914 + 345 11 12 1993 174.0000000 162.3245441 + 346 12 12 1993 188.0000000 180.5617479 + 347 13 12 1993 174.0000000 200.3192189 + 348 14 12 1993 178.0000000 396.5415682 + 349 15 12 1993 565.0000000 551.2072963 + 350 16 12 1993 506.0000000 532.7295947 + 351 17 12 1993 424.0000000 483.0757466 + 352 18 12 1993 343.0000000 413.3020084 + 353 19 12 1993 286.0000000 358.8634897 + 354 20 12 1993 258.0000000 324.9390831 + 355 21 12 1993 237.0000000 348.7684867 + 356 22 12 1993 246.0000000 346.4276455 + 357 23 12 1993 239.0000000 293.7640048 + 358 24 12 1993 224.0000000 353.1255923 + 359 25 12 1993 337.0000000 417.6727471 + 360 26 12 1993 288.0000000 356.6033072 + 361 27 12 1993 248.0000000 307.6817808 + 362 28 12 1993 219.0000000 266.7581354 + 363 29 12 1993 204.0000000 232.8349746 + 364 30 12 1993 188.0000000 204.5547348 + 365 31 12 1993 175.0000000 185.4274169 diff --git a/check/case_04/output_save/b4_daily_discharge.out b/check/case_04/output_save/b4_daily_discharge.out index 9ad7c5e0..dae9cdd5 100644 --- a/check/case_04/output_save/b4_daily_discharge.out +++ b/check/case_04/output_save/b4_daily_discharge.out @@ -1,1462 +1,185 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 133.9333078 - 2 2 1 1990 129.0000000 125.1828279 - 3 3 1 1990 117.0000000 117.4345123 - 4 4 1 1990 111.0000000 110.5512412 - 5 5 1 1990 112.0000000 104.4178325 - 6 6 1 1990 93.0000000 99.0214737 - 7 7 1 1990 87.0000000 94.1634757 - 8 8 1 1990 84.0000000 89.7359244 - 9 9 1 1990 80.0000000 85.7443667 - 10 10 1 1990 78.0000000 82.1357792 - 11 11 1 1990 78.0000000 78.8655002 - 12 12 1 1990 77.0000000 75.8925735 - 13 13 1 1990 76.0000000 75.0317210 - 14 14 1 1990 73.0000000 77.0260542 - 15 15 1 1990 66.0000000 86.2387643 - 16 16 1 1990 76.0000000 85.5161507 - 17 17 1 1990 73.0000000 86.3417731 - 18 18 1 1990 71.0000000 87.6862782 - 19 19 1 1990 90.0000000 83.3660647 - 20 20 1 1990 82.0000000 86.4071666 - 21 21 1 1990 80.0000000 83.5571610 - 22 22 1 1990 81.0000000 78.8121212 - 23 23 1 1990 97.0000000 176.0501481 - 24 24 1 1990 198.0000000 214.3070241 - 25 25 1 1990 392.0000000 278.9009341 - 26 26 1 1990 519.0000000 304.6105520 - 27 27 1 1990 565.0000000 258.8972445 - 28 28 1 1990 331.0000000 237.7526768 - 29 29 1 1990 293.0000000 236.9073299 - 30 30 1 1990 302.0000000 201.1456819 - 31 31 1 1990 233.0000000 176.0323560 - 32 1 2 1990 198.0000000 184.6744659 - 33 2 2 1990 183.0000000 202.8716407 - 34 3 2 1990 206.0000000 207.9533575 - 35 4 2 1990 215.0000000 179.2980003 - 36 5 2 1990 183.0000000 159.7333718 - 37 6 2 1990 159.0000000 145.4497724 - 38 7 2 1990 167.0000000 135.6974958 - 39 8 2 1990 138.0000000 130.0857897 - 40 9 2 1990 126.0000000 127.7542126 - 41 10 2 1990 131.0000000 203.0149113 - 42 11 2 1990 173.0000000 261.1210947 - 43 12 2 1990 240.0000000 297.2822635 - 44 13 2 1990 270.0000000 463.0040923 - 45 14 2 1990 458.0000000 844.1701546 - 46 15 2 1990 996.0000000 1107.2401917 - 47 16 2 1990 1370.0000000 970.5281311 - 48 17 2 1990 1540.0000000 796.5406011 - 49 18 2 1990 1210.0000000 654.7879959 - 50 19 2 1990 616.0000000 537.6171922 - 51 20 2 1990 465.0000000 443.2663156 - 52 21 2 1990 373.0000000 367.0805514 - 53 22 2 1990 298.0000000 307.1206034 - 54 23 2 1990 270.0000000 261.8703331 - 55 24 2 1990 234.0000000 228.1443114 - 56 25 2 1990 218.0000000 208.4581475 - 57 26 2 1990 203.0000000 315.4969021 - 58 27 2 1990 314.0000000 528.3813188 - 59 28 2 1990 520.0000000 726.2713547 - 60 1 3 1990 689.0000000 799.1697718 - 61 2 3 1990 777.0000000 694.4219682 - 62 3 3 1990 584.0000000 571.2695822 - 63 4 3 1990 429.0000000 471.8615371 - 64 5 3 1990 365.0000000 394.3201520 - 65 6 3 1990 281.0000000 330.6564394 - 66 7 3 1990 257.0000000 279.8982513 - 67 8 3 1990 231.0000000 243.5238502 - 68 9 3 1990 211.0000000 217.0695947 - 69 10 3 1990 191.0000000 197.0550140 - 70 11 3 1990 182.0000000 182.7301594 - 71 12 3 1990 173.0000000 172.7534525 - 72 13 3 1990 159.0000000 164.3824319 - 73 14 3 1990 153.0000000 158.5482266 - 74 15 3 1990 141.0000000 152.8877773 - 75 16 3 1990 136.0000000 145.9515929 - 76 17 3 1990 130.0000000 140.1031185 - 77 18 3 1990 123.0000000 134.8146618 - 78 19 3 1990 115.0000000 130.0180888 - 79 20 3 1990 113.0000000 126.2396866 - 80 21 3 1990 102.0000000 122.9738665 - 81 22 3 1990 105.0000000 120.0966488 - 82 23 3 1990 106.0000000 117.1894611 - 83 24 3 1990 87.0000000 114.1545618 - 84 25 3 1990 80.0000000 112.0516524 - 85 26 3 1990 84.0000000 109.1476025 - 86 27 3 1990 82.0000000 106.6091584 - 87 28 3 1990 91.0000000 115.6494617 - 88 29 3 1990 97.0000000 122.4786121 - 89 30 3 1990 110.0000000 113.8738697 - 90 31 3 1990 97.0000000 109.9875141 - 91 1 4 1990 93.0000000 107.0269250 - 92 2 4 1990 85.0000000 104.2948387 - 93 3 4 1990 84.0000000 108.9481813 - 94 4 4 1990 81.0000000 112.7408786 - 95 5 4 1990 81.0000000 105.3387223 - 96 6 4 1990 76.0000000 103.5947756 - 97 7 4 1990 72.0000000 100.8303801 - 98 8 4 1990 68.0000000 98.3649164 - 99 9 4 1990 72.0000000 96.1405276 - 100 10 4 1990 65.0000000 94.1262393 - 101 11 4 1990 62.0000000 92.9544786 - 102 12 4 1990 62.0000000 94.1097827 - 103 13 4 1990 65.0000000 99.0081224 - 104 14 4 1990 68.0000000 122.3638336 - 105 15 4 1990 75.0000000 126.2261615 - 106 16 4 1990 90.0000000 121.2336385 - 107 17 4 1990 92.0000000 117.9159663 - 108 18 4 1990 94.0000000 117.8479481 - 109 19 4 1990 110.0000000 112.6005929 - 110 20 4 1990 99.0000000 108.7274658 - 111 21 4 1990 86.0000000 105.4929373 - 112 22 4 1990 86.0000000 110.7284639 - 113 23 4 1990 86.0000000 118.0090058 - 114 24 4 1990 88.0000000 117.8736238 - 115 25 4 1990 93.0000000 110.2744568 - 116 26 4 1990 99.0000000 106.3393749 - 117 27 4 1990 86.0000000 103.4039965 - 118 28 4 1990 74.0000000 100.5356117 - 119 29 4 1990 72.0000000 97.6411026 - 120 30 4 1990 77.0000000 94.9704126 - 121 1 5 1990 56.0000000 92.5008243 - 122 2 5 1990 64.0000000 90.2107375 - 123 3 5 1990 58.0000000 88.0812102 - 124 4 5 1990 50.0000000 86.0955789 - 125 5 5 1990 50.0000000 84.2391543 - 126 6 5 1990 50.0000000 82.4989625 - 127 7 5 1990 50.0000000 80.9196617 - 128 8 5 1990 53.0000000 80.6076643 - 129 9 5 1990 62.0000000 79.4833896 - 130 10 5 1990 64.0000000 85.0339817 - 131 11 5 1990 65.0000000 86.1111407 - 132 12 5 1990 75.0000000 79.1862952 - 133 13 5 1990 71.0000000 77.2983522 - 134 14 5 1990 63.0000000 75.9184242 - 135 15 5 1990 61.0000000 74.9733396 - 136 16 5 1990 49.0000000 73.7901678 - 137 17 5 1990 46.0000000 72.3294444 - 138 18 5 1990 46.0000000 71.0969244 - 139 19 5 1990 48.0000000 69.9253393 - 140 20 5 1990 41.0000000 68.8843411 - 141 21 5 1990 45.0000000 74.9555948 - 142 22 5 1990 52.0000000 75.3161421 - 143 23 5 1990 50.0000000 74.8726821 - 144 24 5 1990 56.0000000 78.9172581 - 145 25 5 1990 41.0000000 74.8756832 - 146 26 5 1990 40.0000000 69.8926009 - 147 27 5 1990 39.0000000 68.5187166 - 148 28 5 1990 39.0000000 67.2273776 - 149 29 5 1990 33.0000000 66.0097536 - 150 30 5 1990 37.0000000 64.8584941 - 151 31 5 1990 30.0000000 63.7671117 - 152 1 6 1990 37.0000000 69.5584544 - 153 2 6 1990 36.0000000 71.1022259 - 154 3 6 1990 40.0000000 101.4481348 - 155 4 6 1990 45.0000000 83.8791532 - 156 5 6 1990 39.0000000 69.3014120 - 157 6 6 1990 48.0000000 67.6875962 - 158 7 6 1990 39.0000000 116.0696918 - 159 8 6 1990 49.0000000 126.4518916 - 160 9 6 1990 84.0000000 112.4003278 - 161 10 6 1990 91.0000000 101.5020634 - 162 11 6 1990 80.0000000 91.3265109 - 163 12 6 1990 66.0000000 87.5180765 - 164 13 6 1990 53.0000000 84.3415036 - 165 14 6 1990 64.0000000 81.3066685 - 166 15 6 1990 55.0000000 78.3759805 - 167 16 6 1990 54.0000000 75.8125141 - 168 17 6 1990 42.0000000 73.4680295 - 169 18 6 1990 48.0000000 71.6809135 - 170 19 6 1990 48.0000000 89.1600657 - 171 20 6 1990 60.0000000 107.6447934 - 172 21 6 1990 75.0000000 101.4161257 - 173 22 6 1990 78.0000000 88.4866137 - 174 23 6 1990 66.0000000 84.6544588 - 175 24 6 1990 63.0000000 80.6867450 - 176 25 6 1990 52.0000000 77.6877924 - 177 26 6 1990 49.0000000 75.1453763 - 178 27 6 1990 44.0000000 82.0564642 - 179 28 6 1990 51.0000000 80.3544166 - 180 29 6 1990 61.0000000 101.0312297 - 181 30 6 1990 81.0000000 137.3018604 - 182 1 7 1990 79.0000000 112.5213750 - 183 2 7 1990 92.0000000 97.8790011 - 184 3 7 1990 72.0000000 104.0965601 - 185 4 7 1990 58.0000000 121.7168752 - 186 5 7 1990 69.0000000 153.4900609 - 187 6 7 1990 94.0000000 140.8684274 - 188 7 7 1990 199.0000000 135.7808958 - 189 8 7 1990 133.0000000 139.1563625 - 190 9 7 1990 124.0000000 120.9558957 - 191 10 7 1990 123.0000000 112.6538708 - 192 11 7 1990 99.0000000 106.3335602 - 193 12 7 1990 88.0000000 101.0630522 - 194 13 7 1990 84.0000000 96.3799960 - 195 14 7 1990 72.0000000 92.1647088 - 196 15 7 1990 55.0000000 88.3586697 - 197 16 7 1990 65.0000000 84.9116625 - 198 17 7 1990 50.0000000 81.7804551 - 199 18 7 1990 50.0000000 78.9277143 - 200 19 7 1990 46.0000000 76.3211063 - 201 20 7 1990 44.0000000 73.9325496 - 202 21 7 1990 42.0000000 71.7375922 - 203 22 7 1990 37.0000000 69.7148884 - 204 23 7 1990 38.0000000 67.8457602 - 205 24 7 1990 44.0000000 66.1138268 - 206 25 7 1990 30.0000000 64.5046907 - 207 26 7 1990 26.0000000 63.0056717 - 208 27 7 1990 31.0000000 61.6055801 - 209 28 7 1990 33.0000000 63.4594458 - 210 29 7 1990 42.0000000 60.7624381 - 211 30 7 1990 36.0000000 58.4167192 - 212 31 7 1990 34.0000000 57.2813198 - 213 1 8 1990 25.0000000 56.2097429 - 214 2 8 1990 22.0000000 55.1960076 - 215 3 8 1990 28.0000000 54.2347827 - 216 4 8 1990 25.0000000 53.3213087 - 217 5 8 1990 19.0000000 52.4515042 - 218 6 8 1990 22.0000000 51.6220724 - 219 7 8 1990 19.0000000 50.8280867 - 220 8 8 1990 22.0000000 50.0672248 - 221 9 8 1990 19.0000000 49.3368202 - 222 10 8 1990 20.0000000 48.6343946 - 223 11 8 1990 19.0000000 47.9577155 - 224 12 8 1990 19.0000000 47.3047694 - 225 13 8 1990 22.0000000 51.8223006 - 226 14 8 1990 36.0000000 73.3990585 - 227 15 8 1990 31.0000000 64.6406714 - 228 16 8 1990 30.0000000 58.9049887 - 229 17 8 1990 28.0000000 55.2682295 - 230 18 8 1990 34.0000000 48.3417851 - 231 19 8 1990 21.0000000 47.4751551 - 232 20 8 1990 30.0000000 46.6547552 - 233 21 8 1990 22.0000000 45.8758593 - 234 22 8 1990 21.0000000 45.1346035 - 235 23 8 1990 23.0000000 44.4275511 - 236 24 8 1990 20.0000000 43.7516405 - 237 25 8 1990 29.0000000 43.1063668 - 238 26 8 1990 20.0000000 43.0062848 - 239 27 8 1990 22.0000000 44.1171753 - 240 28 8 1990 23.0000000 42.0399801 - 241 29 8 1990 35.0000000 40.9861777 - 242 30 8 1990 51.0000000 129.1315778 - 243 31 8 1990 80.0000000 127.7381635 - 244 1 9 1990 56.0000000 68.6925680 - 245 2 9 1990 33.0000000 59.0446265 - 246 3 9 1990 27.0000000 56.8002379 - 247 4 9 1990 27.0000000 58.9053163 - 248 5 9 1990 28.0000000 58.0102150 - 249 6 9 1990 26.0000000 52.6929226 - 250 7 9 1990 24.0000000 57.7712962 - 251 8 9 1990 33.0000000 54.4833086 - 252 9 9 1990 26.0000000 50.0089346 - 253 10 9 1990 27.0000000 48.5437462 - 254 11 9 1990 22.0000000 47.1952048 - 255 12 9 1990 22.0000000 45.9500190 - 256 13 9 1990 21.0000000 44.7969172 - 257 14 9 1990 22.0000000 43.7260254 - 258 15 9 1990 22.0000000 42.7286748 - 259 16 9 1990 22.0000000 41.7972401 - 260 17 9 1990 20.0000000 40.9250002 - 261 18 9 1990 22.0000000 40.1060198 - 262 19 9 1990 16.0000000 39.3350488 - 263 20 9 1990 22.0000000 38.6074345 - 264 21 9 1990 19.0000000 47.2506864 - 265 22 9 1990 32.0000000 115.2201028 - 266 23 9 1990 27.0000000 98.0699305 - 267 24 9 1990 45.0000000 75.0416154 - 268 25 9 1990 42.0000000 60.4844440 - 269 26 9 1990 39.0000000 56.0894173 - 270 27 9 1990 30.0000000 53.8702751 - 271 28 9 1990 28.0000000 51.8537501 - 272 29 9 1990 30.0000000 50.0192275 - 273 30 9 1990 30.0000000 101.6401077 - 274 1 10 1990 56.0000000 151.1747384 - 275 2 10 1990 72.0000000 120.3030296 - 276 3 10 1990 73.0000000 117.1987197 - 277 4 10 1990 68.0000000 111.9995694 - 278 5 10 1990 53.0000000 97.7660670 - 279 6 10 1990 42.0000000 90.3996314 - 280 7 10 1990 33.0000000 84.9820657 - 281 8 10 1990 42.0000000 80.3077527 - 282 9 10 1990 34.0000000 76.1273117 - 283 10 10 1990 36.0000000 72.3651405 - 284 11 10 1990 36.0000000 68.9781040 - 285 12 10 1990 28.0000000 65.9202071 - 286 13 10 1990 32.0000000 63.1518275 - 287 14 10 1990 27.0000000 60.6387295 - 288 15 10 1990 35.0000000 58.8433082 - 289 16 10 1990 42.0000000 59.6189206 - 290 17 10 1990 35.0000000 69.0092425 - 291 18 10 1990 39.0000000 68.2975900 - 292 19 10 1990 34.0000000 58.8292117 - 293 20 10 1990 32.0000000 56.6737376 - 294 21 10 1990 34.0000000 54.7125365 - 295 22 10 1990 27.0000000 52.9156134 - 296 23 10 1990 31.0000000 51.2648766 - 297 24 10 1990 28.0000000 49.7444965 - 298 25 10 1990 25.0000000 49.5960653 - 299 26 10 1990 29.0000000 68.1888993 - 300 27 10 1990 31.0000000 76.8415825 - 301 28 10 1990 65.0000000 209.2637390 - 302 29 10 1990 69.0000000 232.3375446 - 303 30 10 1990 157.0000000 204.3058939 - 304 31 10 1990 190.0000000 178.4296555 - 305 1 11 1990 115.0000000 179.5780445 - 306 2 11 1990 104.0000000 187.8461299 - 307 3 11 1990 100.0000000 197.5581041 - 308 4 11 1990 131.0000000 192.7090079 - 309 5 11 1990 130.0000000 184.6175710 - 310 6 11 1990 115.0000000 162.4062766 - 311 7 11 1990 102.0000000 143.5692565 - 312 8 11 1990 95.0000000 127.7053023 - 313 9 11 1990 81.0000000 114.5738986 - 314 10 11 1990 66.0000000 120.9957007 - 315 11 11 1990 67.0000000 154.4461951 - 316 12 11 1990 74.0000000 169.2271559 - 317 13 11 1990 109.0000000 160.6614801 - 318 14 11 1990 92.0000000 185.0618769 - 319 15 11 1990 92.0000000 201.5859742 - 320 16 11 1990 155.0000000 188.6224687 - 321 17 11 1990 159.0000000 176.3355004 - 322 18 11 1990 131.0000000 192.4142822 - 323 19 11 1990 161.0000000 204.5101127 - 324 20 11 1990 196.0000000 314.5135142 - 325 21 11 1990 336.0000000 396.0736950 - 326 22 11 1990 566.0000000 358.0477682 - 327 23 11 1990 373.0000000 363.9950807 - 328 24 11 1990 293.0000000 334.6945074 - 329 25 11 1990 264.0000000 318.5959982 - 330 26 11 1990 226.0000000 287.7253381 - 331 27 11 1990 201.0000000 246.3703679 - 332 28 11 1990 180.0000000 214.3813321 - 333 29 11 1990 161.0000000 200.7406350 - 334 30 11 1990 149.0000000 188.6398360 - 335 1 12 1990 134.0000000 165.5104683 - 336 2 12 1990 113.0000000 150.3324184 - 337 3 12 1990 99.0000000 139.8890101 - 338 4 12 1990 107.0000000 132.2358459 - 339 5 12 1990 99.0000000 125.2897687 - 340 6 12 1990 89.0000000 118.9115645 - 341 7 12 1990 77.0000000 113.2394694 - 342 8 12 1990 71.0000000 108.1423944 - 343 9 12 1990 68.0000000 103.5479007 - 344 10 12 1990 73.0000000 99.3938558 - 345 11 12 1990 84.0000000 95.6267987 - 346 12 12 1990 88.0000000 113.5956834 - 347 13 12 1990 92.0000000 120.4615787 - 348 14 12 1990 128.0000000 112.4913552 - 349 15 12 1990 136.0000000 105.3875862 - 350 16 12 1990 114.0000000 100.5794860 - 351 17 12 1990 101.0000000 96.3187423 - 352 18 12 1990 93.0000000 92.4820371 - 353 19 12 1990 85.0000000 89.0153595 - 354 20 12 1990 81.0000000 85.8724847 - 355 21 12 1990 106.0000000 122.3182141 - 356 22 12 1990 159.0000000 152.2892298 - 357 23 12 1990 250.0000000 170.5539551 - 358 24 12 1990 298.0000000 161.5898248 - 359 25 12 1990 261.0000000 208.0856243 - 360 26 12 1990 228.0000000 328.9256904 - 361 27 12 1990 409.0000000 401.7638601 - 362 28 12 1990 486.0000000 426.2737504 - 363 29 12 1990 440.0000000 537.0403519 - 364 30 12 1990 486.0000000 672.5960348 - 365 31 12 1990 774.0000000 761.3193495 - 366 1 1 1991 889.0000000 804.7506382 - 367 2 1 1991 863.0000000 850.7842715 - 368 3 1 1991 875.0000000 912.3383119 - 369 4 1 1991 932.0000000 820.9666129 - 370 5 1 1991 826.0000000 774.6060998 - 371 6 1 1991 731.0000000 723.1524531 - 372 7 1 1991 613.0000000 682.9711798 - 373 8 1 1991 610.0000000 670.4245697 - 374 9 1 1991 686.0000000 605.2099291 - 375 10 1 1991 556.0000000 641.4390495 - 376 11 1 1991 669.0000000 678.4533648 - 377 12 1 1991 828.0000000 637.5180374 - 378 13 1 1991 735.0000000 524.0373367 - 379 14 1 1991 513.0000000 433.6345060 - 380 15 1 1991 411.0000000 360.9161237 - 381 16 1 1991 345.0000000 302.4660774 - 382 17 1 1991 293.0000000 258.4694027 - 383 18 1 1991 251.0000000 227.8399473 - 384 19 1 1991 222.0000000 206.3754762 - 385 20 1 1991 215.0000000 191.9645087 - 386 21 1 1991 213.0000000 186.4765279 - 387 22 1 1991 202.0000000 187.3412721 - 388 23 1 1991 200.0000000 178.8360009 - 389 24 1 1991 192.0000000 169.8693895 - 390 25 1 1991 176.0000000 161.6256864 - 391 26 1 1991 164.0000000 154.3682122 - 392 27 1 1991 157.0000000 147.6927910 - 393 28 1 1991 134.0000000 141.6957440 - 394 29 1 1991 130.0000000 136.2891837 - 395 30 1 1991 119.0000000 131.3980596 - 396 31 1 1991 107.0000000 126.9580990 - 397 1 2 1991 112.0000000 122.9140870 - 398 2 2 1991 109.0000000 119.2184503 - 399 3 2 1991 101.0000000 115.8300836 - 400 4 2 1991 98.0000000 112.7133753 - 401 5 2 1991 84.0000000 109.8373943 - 402 6 2 1991 93.0000000 107.1752093 - 403 7 2 1991 80.0000000 104.7033169 - 404 8 2 1991 73.0000000 102.4011594 - 405 9 2 1991 89.0000000 100.2507174 - 406 10 2 1991 84.0000000 98.2361638 - 407 11 2 1991 78.0000000 96.3435701 - 408 12 2 1991 79.0000000 94.5606550 - 409 13 2 1991 77.0000000 92.8765703 - 410 14 2 1991 80.0000000 91.2817168 - 411 15 2 1991 72.0000000 89.7675861 - 412 16 2 1991 78.0000000 89.9928272 - 413 17 2 1991 74.0000000 89.9401465 - 414 18 2 1991 77.0000000 88.2817131 - 415 19 2 1991 73.0000000 98.6169263 - 416 20 2 1991 69.0000000 114.3076439 - 417 21 2 1991 74.0000000 145.0143857 - 418 22 2 1991 81.0000000 160.0963300 - 419 23 2 1991 110.0000000 155.9735912 - 420 24 2 1991 180.0000000 151.9290637 - 421 25 2 1991 213.0000000 148.8248810 - 422 26 2 1991 222.0000000 145.4281456 - 423 27 2 1991 208.0000000 146.5111612 - 424 28 2 1991 211.0000000 140.4491504 - 425 1 3 1991 214.0000000 135.4117648 - 426 2 3 1991 208.0000000 143.2502808 - 427 3 3 1991 221.0000000 141.9111867 - 428 4 3 1991 281.0000000 132.9407850 - 429 5 3 1991 219.0000000 127.3317604 - 430 6 3 1991 190.0000000 122.3988201 - 431 7 3 1991 173.0000000 117.9279303 - 432 8 3 1991 164.0000000 114.0989585 - 433 9 3 1991 142.0000000 111.3850327 - 434 10 3 1991 133.0000000 111.1536250 - 435 11 3 1991 133.0000000 108.3490877 - 436 12 3 1991 118.0000000 104.9334473 - 437 13 3 1991 127.0000000 101.7968791 - 438 14 3 1991 113.0000000 98.9168387 - 439 15 3 1991 107.0000000 96.2617842 - 440 16 3 1991 100.0000000 93.8068118 - 441 17 3 1991 100.0000000 91.5355993 - 442 18 3 1991 95.0000000 89.4683099 - 443 19 3 1991 98.0000000 146.3472019 - 444 20 3 1991 119.0000000 154.1527948 - 445 21 3 1991 159.0000000 169.5721199 - 446 22 3 1991 196.0000000 184.0306099 - 447 23 3 1991 242.0000000 167.6916868 - 448 24 3 1991 216.0000000 154.6224809 - 449 25 3 1991 180.0000000 145.5410009 - 450 26 3 1991 145.0000000 138.0819270 - 451 27 3 1991 127.0000000 132.8140416 - 452 28 3 1991 117.0000000 126.1634900 - 453 29 3 1991 109.0000000 120.5927916 - 454 30 3 1991 106.0000000 115.5836280 - 455 31 3 1991 99.0000000 111.0640741 - 456 1 4 1991 96.0000000 106.9727555 - 457 2 4 1991 88.0000000 103.2570063 - 458 3 4 1991 87.0000000 99.8714926 - 459 4 4 1991 82.0000000 97.2341245 - 460 5 4 1991 84.0000000 95.1843897 - 461 6 4 1991 67.0000000 92.4790326 - 462 7 4 1991 89.0000000 90.1853007 - 463 8 4 1991 75.0000000 88.1692738 - 464 9 4 1991 79.0000000 86.0444252 - 465 10 4 1991 70.0000000 84.0013696 - 466 11 4 1991 69.0000000 82.0967318 - 467 12 4 1991 69.0000000 80.3189275 - 468 13 4 1991 56.0000000 78.6549575 - 469 14 4 1991 63.0000000 77.0961469 - 470 15 4 1991 58.0000000 75.6320842 - 471 16 4 1991 56.0000000 74.2447139 - 472 17 4 1991 54.0000000 72.9323135 - 473 18 4 1991 57.0000000 71.7378640 - 474 19 4 1991 53.0000000 71.7856763 - 475 20 4 1991 53.0000000 71.4621217 - 476 21 4 1991 65.0000000 70.3647193 - 477 22 4 1991 69.0000000 72.2932369 - 478 23 4 1991 61.0000000 73.8481430 - 479 24 4 1991 56.0000000 70.5364997 - 480 25 4 1991 56.0000000 68.9117116 - 481 26 4 1991 53.0000000 67.7090982 - 482 27 4 1991 49.0000000 66.5864451 - 483 28 4 1991 53.0000000 65.5239899 - 484 29 4 1991 48.0000000 69.1396751 - 485 30 4 1991 57.0000000 114.3455421 - 486 1 5 1991 69.0000000 108.9238935 - 487 2 5 1991 89.0000000 86.9693864 - 488 3 5 1991 105.0000000 83.4263739 - 489 4 5 1991 79.0000000 80.8888718 - 490 5 5 1991 69.0000000 78.6951032 - 491 6 5 1991 71.0000000 76.9199828 - 492 7 5 1991 60.0000000 74.6805122 - 493 8 5 1991 64.0000000 72.7652894 - 494 9 5 1991 59.0000000 70.9977532 - 495 10 5 1991 57.0000000 71.3958946 - 496 11 5 1991 55.0000000 73.6635605 - 497 12 5 1991 53.0000000 70.2067704 - 498 13 5 1991 52.0000000 68.2853243 - 499 14 5 1991 50.0000000 67.0496302 - 500 15 5 1991 52.0000000 71.6828135 - 501 16 5 1991 54.0000000 72.6075140 - 502 17 5 1991 54.0000000 67.6737776 - 503 18 5 1991 55.0000000 66.2227792 - 504 19 5 1991 48.0000000 64.8797981 - 505 20 5 1991 48.0000000 63.6121080 - 506 21 5 1991 49.0000000 62.4129080 - 507 22 5 1991 41.0000000 61.2762441 - 508 23 5 1991 40.0000000 60.1967504 - 509 24 5 1991 40.0000000 59.1695864 - 510 25 5 1991 39.0000000 58.1903813 - 511 26 5 1991 43.0000000 57.2551846 - 512 27 5 1991 39.0000000 56.3604225 - 513 28 5 1991 36.0000000 55.5028593 - 514 29 5 1991 33.0000000 54.6795625 - 515 30 5 1991 39.0000000 53.8878727 - 516 31 5 1991 34.0000000 53.1253758 - 517 1 6 1991 37.0000000 52.3898792 - 518 2 6 1991 35.0000000 51.6793892 - 519 3 6 1991 29.0000000 50.9920925 - 520 4 6 1991 33.0000000 50.3263378 - 521 5 6 1991 34.0000000 49.7087794 - 522 6 6 1991 32.0000000 67.3999767 - 523 7 6 1991 38.0000000 70.2486635 - 524 8 6 1991 39.0000000 59.8374148 - 525 9 6 1991 41.0000000 57.0641469 - 526 10 6 1991 44.0000000 70.9362142 - 527 11 6 1991 48.0000000 56.1751110 - 528 12 6 1991 42.0000000 53.1788643 - 529 13 6 1991 37.0000000 52.1476489 - 530 14 6 1991 39.0000000 51.3540157 - 531 15 6 1991 35.0000000 50.8675457 - 532 16 6 1991 31.0000000 53.7696944 - 533 17 6 1991 33.0000000 57.2291926 - 534 18 6 1991 31.0000000 54.4246037 - 535 19 6 1991 28.0000000 51.3470506 - 536 20 6 1991 60.0000000 87.6377538 - 537 21 6 1991 48.0000000 74.0908542 - 538 22 6 1991 54.0000000 58.4105559 - 539 23 6 1991 63.0000000 65.8019846 - 540 24 6 1991 41.0000000 59.9372350 - 541 25 6 1991 42.0000000 55.8178118 - 542 26 6 1991 43.0000000 54.3599617 - 543 27 6 1991 38.0000000 62.9429093 - 544 28 6 1991 38.0000000 62.8930052 - 545 29 6 1991 35.0000000 55.9708211 - 546 30 6 1991 41.0000000 53.7310118 - 547 1 7 1991 41.0000000 52.3650121 - 548 2 7 1991 38.0000000 51.0975004 - 549 3 7 1991 34.0000000 49.9153718 - 550 4 7 1991 27.0000000 48.8100960 - 551 5 7 1991 31.0000000 47.7741154 - 552 6 7 1991 30.0000000 46.8010708 - 553 7 7 1991 26.0000000 53.4500315 - 554 8 7 1991 30.0000000 52.4115728 - 555 9 7 1991 31.0000000 46.0618094 - 556 10 7 1991 23.0000000 45.1372192 - 557 11 7 1991 35.0000000 44.2663113 - 558 12 7 1991 19.0000000 45.3177078 - 559 13 7 1991 24.0000000 73.1846508 - 560 14 7 1991 26.0000000 66.6057353 - 561 15 7 1991 27.0000000 50.7722527 - 562 16 7 1991 41.0000000 47.4777475 - 563 17 7 1991 34.0000000 46.3482678 - 564 18 7 1991 27.0000000 45.2959470 - 565 19 7 1991 25.0000000 44.3102319 - 566 20 7 1991 23.0000000 43.3839079 - 567 21 7 1991 22.0000000 42.5126307 - 568 22 7 1991 27.0000000 41.6912062 - 569 23 7 1991 23.0000000 40.9150034 - 570 24 7 1991 21.0000000 41.8293140 - 571 25 7 1991 23.0000000 67.2749289 - 572 26 7 1991 33.0000000 60.3610371 - 573 27 7 1991 23.0000000 46.8758124 - 574 28 7 1991 29.0000000 43.3312564 - 575 29 7 1991 30.0000000 42.3356034 - 576 30 7 1991 35.0000000 56.0176051 - 577 31 7 1991 27.0000000 55.1520473 - 578 1 8 1991 45.0000000 44.0405292 - 579 2 8 1991 47.0000000 42.9111835 - 580 3 8 1991 40.0000000 41.9094506 - 581 4 8 1991 35.0000000 40.9729105 - 582 5 8 1991 26.0000000 40.0951768 - 583 6 8 1991 23.0000000 39.2705832 - 584 7 8 1991 30.0000000 40.2816100 - 585 8 8 1991 33.0000000 40.8023992 - 586 9 8 1991 30.0000000 37.9381757 - 587 10 8 1991 28.0000000 36.8298114 - 588 11 8 1991 19.0000000 36.1727437 - 589 12 8 1991 20.0000000 35.5488071 - 590 13 8 1991 16.0000000 34.9550760 - 591 14 8 1991 18.0000000 34.3889277 - 592 15 8 1991 18.0000000 33.8480074 - 593 16 8 1991 20.0000000 33.3301985 - 594 17 8 1991 16.0000000 32.8335961 - 595 18 8 1991 15.0000000 32.3564835 - 596 19 8 1991 15.0000000 31.8973123 - 597 20 8 1991 14.0000000 31.4546840 - 598 21 8 1991 15.0000000 31.0273343 - 599 22 8 1991 13.0000000 30.6148954 - 600 23 8 1991 12.0000000 30.4462367 - 601 24 8 1991 11.0000000 30.1657043 - 602 25 8 1991 12.0000000 29.4920562 - 603 26 8 1991 11.0000000 29.1235102 - 604 27 8 1991 13.0000000 28.7651474 - 605 28 8 1991 11.0000000 28.4161255 - 606 29 8 1991 12.0000000 28.0758451 - 607 30 8 1991 12.0000000 27.7437600 - 608 31 8 1991 11.0000000 27.4193710 - 609 1 9 1991 11.0000000 29.2273137 - 610 2 9 1991 17.0000000 29.4027675 - 611 3 9 1991 11.0000000 26.6869570 - 612 4 9 1991 12.0000000 26.3765810 - 613 5 9 1991 11.0000000 26.0733300 - 614 6 9 1991 11.0000000 25.7764928 - 615 7 9 1991 18.0000000 25.4857121 - 616 8 9 1991 11.0000000 25.2006607 - 617 9 9 1991 13.0000000 24.9210387 - 618 10 9 1991 12.0000000 25.5521301 - 619 11 9 1991 11.0000000 54.7284241 - 620 12 9 1991 20.0000000 47.9063683 - 621 13 9 1991 21.0000000 26.7499181 - 622 14 9 1991 29.0000000 26.3019881 - 623 15 9 1991 28.0000000 25.8766488 - 624 16 9 1991 20.0000000 25.4706224 - 625 17 9 1991 20.0000000 25.0822293 - 626 18 9 1991 20.0000000 24.7099649 - 627 19 9 1991 12.0000000 24.3524804 - 628 20 9 1991 11.0000000 24.0085641 - 629 21 9 1991 11.0000000 23.6771267 - 630 22 9 1991 22.0000000 45.8652962 - 631 23 9 1991 14.0000000 45.9458081 - 632 24 9 1991 48.0000000 26.3683052 - 633 25 9 1991 45.0000000 85.9103211 - 634 26 9 1991 80.0000000 88.9689010 - 635 27 9 1991 61.0000000 67.7357713 - 636 28 9 1991 61.0000000 93.6820681 - 637 29 9 1991 65.0000000 93.2934276 - 638 30 9 1991 63.0000000 81.4949932 - 639 1 10 1991 90.0000000 65.9917666 - 640 2 10 1991 59.0000000 60.4575847 - 641 3 10 1991 45.0000000 56.6725326 - 642 4 10 1991 42.0000000 53.3837068 - 643 5 10 1991 41.0000000 99.0889252 - 644 6 10 1991 41.0000000 106.7680126 - 645 7 10 1991 73.0000000 77.1421272 - 646 8 10 1991 96.0000000 69.2804595 - 647 9 10 1991 61.0000000 64.9239502 - 648 10 10 1991 44.0000000 61.0529317 - 649 11 10 1991 42.0000000 57.7645936 - 650 12 10 1991 41.0000000 82.3989134 - 651 13 10 1991 42.0000000 82.3404180 - 652 14 10 1991 61.0000000 64.6552075 - 653 15 10 1991 55.0000000 61.0972209 - 654 16 10 1991 41.0000000 63.6264399 - 655 17 10 1991 48.0000000 79.3663796 - 656 18 10 1991 52.0000000 104.3541804 - 657 19 10 1991 66.0000000 88.4501078 - 658 20 10 1991 59.0000000 78.2499500 - 659 21 10 1991 71.0000000 73.8174678 - 660 22 10 1991 74.0000000 68.2331221 - 661 23 10 1991 70.0000000 64.4472947 - 662 24 10 1991 59.0000000 61.1020886 - 663 25 10 1991 57.0000000 58.1059050 - 664 26 10 1991 57.0000000 55.4025395 - 665 27 10 1991 51.0000000 52.9569283 - 666 28 10 1991 47.0000000 50.7387433 - 667 29 10 1991 48.0000000 48.7216781 - 668 30 10 1991 45.0000000 51.5486840 - 669 31 10 1991 43.0000000 54.1868844 - 670 1 11 1991 40.0000000 66.5018304 - 671 2 11 1991 47.0000000 69.5199055 - 672 3 11 1991 46.0000000 97.5434648 - 673 4 11 1991 76.0000000 133.5452433 - 674 5 11 1991 60.0000000 125.5580168 - 675 6 11 1991 132.0000000 117.5141572 - 676 7 11 1991 133.0000000 124.6852881 - 677 8 11 1991 113.0000000 149.2042065 - 678 9 11 1991 120.0000000 159.0548542 - 679 10 11 1991 141.0000000 141.1455645 - 680 11 11 1991 208.0000000 167.8212611 - 681 12 11 1991 166.0000000 228.8669257 - 682 13 11 1991 183.0000000 302.1513572 - 683 14 11 1991 299.0000000 446.4209756 - 684 15 11 1991 521.0000000 416.3101284 - 685 16 11 1991 443.0000000 357.0151946 - 686 17 11 1991 304.0000000 303.7538182 - 687 18 11 1991 231.0000000 295.1697054 - 688 19 11 1991 192.0000000 291.6057820 - 689 20 11 1991 199.0000000 264.6219276 - 690 21 11 1991 201.0000000 242.2996362 - 691 22 11 1991 173.0000000 207.4191856 - 692 23 11 1991 159.0000000 179.5543557 - 693 24 11 1991 160.0000000 158.9308498 - 694 25 11 1991 146.0000000 141.8978779 - 695 26 11 1991 110.0000000 127.3986575 - 696 27 11 1991 114.0000000 116.6588721 - 697 28 11 1991 97.0000000 109.9343285 - 698 29 11 1991 89.0000000 104.1814454 - 699 30 11 1991 73.0000000 99.0213515 - 700 1 12 1991 69.0000000 94.3789664 - 701 2 12 1991 67.0000000 90.1905251 - 702 3 12 1991 63.0000000 86.4011195 - 703 4 12 1991 58.0000000 82.9633264 - 704 5 12 1991 59.0000000 79.8360698 - 705 6 12 1991 53.0000000 76.9836756 - 706 7 12 1991 54.0000000 74.3750808 - 707 8 12 1991 51.0000000 71.9831716 - 708 9 12 1991 47.0000000 69.7842259 - 709 10 12 1991 42.0000000 67.7574433 - 710 11 12 1991 40.0000000 65.8845461 - 711 12 12 1991 39.0000000 64.1494417 - 712 13 12 1991 36.0000000 62.5379333 - 713 14 12 1991 37.0000000 61.0374740 - 714 15 12 1991 32.0000000 59.6369552 - 715 16 12 1991 37.0000000 71.3992867 - 716 17 12 1991 62.0000000 175.7368581 - 717 18 12 1991 118.0000000 219.2549780 - 718 19 12 1991 170.0000000 306.4859197 - 719 20 12 1991 229.0000000 410.7729034 - 720 21 12 1991 448.0000000 501.1010076 - 721 22 12 1991 464.0000000 675.3506711 - 722 23 12 1991 675.0000000 612.0230377 - 723 24 12 1991 844.0000000 529.6660126 - 724 25 12 1991 569.0000000 438.7565632 - 725 26 12 1991 358.0000000 368.0100213 - 726 27 12 1991 279.0000000 315.4329383 - 727 28 12 1991 238.0000000 271.1066547 - 728 29 12 1991 201.0000000 232.8476375 - 729 30 12 1991 185.0000000 202.4192868 - 730 31 12 1991 165.0000000 179.0792538 - 731 1 1 1992 140.0000000 160.7422874 - 732 2 1 1992 126.0000000 146.1884176 - 733 3 1 1992 117.0000000 136.2652762 - 734 4 1 1992 114.0000000 132.8052375 - 735 5 1 1992 108.0000000 128.1053999 - 736 6 1 1992 108.0000000 121.2790820 - 737 7 1 1992 101.0000000 115.7782787 - 738 8 1 1992 97.0000000 114.3497084 - 739 9 1 1992 89.0000000 131.0678717 - 740 10 1 1992 111.0000000 162.8015837 - 741 11 1 1992 135.0000000 157.5753360 - 742 12 1 1992 171.0000000 142.8340495 - 743 13 1 1992 125.0000000 134.9157936 - 744 14 1 1992 111.0000000 127.9492058 - 745 15 1 1992 100.0000000 121.7710670 - 746 16 1 1992 87.0000000 116.3535384 - 747 17 1 1992 75.0000000 111.3526877 - 748 18 1 1992 79.0000000 106.8163839 - 749 19 1 1992 70.0000000 109.4150454 - 750 20 1 1992 72.0000000 106.3215201 - 751 21 1 1992 87.0000000 103.2791799 - 752 22 1 1992 79.0000000 98.8716821 - 753 23 1 1992 71.0000000 95.3963102 - 754 24 1 1992 66.0000000 92.2310743 - 755 25 1 1992 67.0000000 89.3391503 - 756 26 1 1992 65.0000000 86.6886760 - 757 27 1 1992 59.0000000 84.2520059 - 758 28 1 1992 57.0000000 82.0424843 - 759 29 1 1992 54.0000000 80.4533831 - 760 30 1 1992 59.0000000 82.3561178 - 761 31 1 1992 57.0000000 89.6161904 - 762 1 2 1992 56.0000000 91.6509290 - 763 2 2 1992 54.0000000 89.5692635 - 764 3 2 1992 58.0000000 87.4246301 - 765 4 2 1992 63.0000000 144.5834744 - 766 5 2 1992 76.0000000 184.2463549 - 767 6 2 1992 250.0000000 208.8202612 - 768 7 2 1992 346.0000000 182.3717068 - 769 8 2 1992 241.0000000 162.3503949 - 770 9 2 1992 180.0000000 160.1894560 - 771 10 2 1992 164.0000000 167.2224932 - 772 11 2 1992 183.0000000 187.7019368 - 773 12 2 1992 215.0000000 216.7095447 - 774 13 2 1992 265.0000000 230.6186364 - 775 14 2 1992 287.0000000 244.6703242 - 776 15 2 1992 272.0000000 245.0591393 - 777 16 2 1992 253.0000000 273.8661885 - 778 17 2 1992 301.0000000 264.0201282 - 779 18 2 1992 275.0000000 225.5576641 - 780 19 2 1992 224.0000000 196.6415287 - 781 20 2 1992 194.0000000 174.8370193 - 782 21 2 1992 173.0000000 159.7091873 - 783 22 2 1992 157.0000000 149.7976215 - 784 23 2 1992 142.0000000 142.6632077 - 785 24 2 1992 133.0000000 137.8526790 - 786 25 2 1992 128.0000000 131.6682990 - 787 26 2 1992 125.0000000 125.1964509 - 788 27 2 1992 125.0000000 119.7494011 - 789 28 2 1992 110.0000000 114.8499060 - 790 29 2 1992 107.0000000 110.4124600 - 791 1 3 1992 97.0000000 106.5322092 - 792 2 3 1992 97.0000000 104.6705880 - 793 3 3 1992 86.0000000 105.4872210 - 794 4 3 1992 93.0000000 100.5941825 - 795 5 3 1992 86.0000000 97.5497897 - 796 6 3 1992 82.0000000 94.7602310 - 797 7 3 1992 80.0000000 92.0542483 - 798 8 3 1992 77.0000000 89.5510915 - 799 9 3 1992 73.0000000 87.2340889 - 800 10 3 1992 76.0000000 85.3071944 - 801 11 3 1992 68.0000000 83.6392501 - 802 12 3 1992 70.0000000 141.6128571 - 803 13 3 1992 116.0000000 208.0523356 - 804 14 3 1992 206.0000000 251.8980026 - 805 15 3 1992 433.0000000 306.4958934 - 806 16 3 1992 495.0000000 328.4576158 - 807 17 3 1992 331.0000000 277.5229118 - 808 18 3 1992 240.0000000 239.3299820 - 809 19 3 1992 215.0000000 208.8954491 - 810 20 3 1992 185.0000000 184.8796116 - 811 21 3 1992 185.0000000 177.2372863 - 812 22 3 1992 185.0000000 237.4942379 - 813 23 3 1992 213.0000000 344.6176417 - 814 24 3 1992 466.0000000 384.2023845 - 815 25 3 1992 580.0000000 402.3681125 - 816 26 3 1992 566.0000000 370.9293670 - 817 27 3 1992 487.0000000 329.8012667 - 818 28 3 1992 387.0000000 298.2305535 - 819 29 3 1992 311.0000000 263.9977648 - 820 30 3 1992 270.0000000 234.0380401 - 821 31 3 1992 246.0000000 220.9287683 - 822 1 4 1992 229.0000000 236.8884781 - 823 2 4 1992 222.0000000 229.2049506 - 824 3 4 1992 217.0000000 245.8696167 - 825 4 4 1992 208.0000000 303.8557121 - 826 5 4 1992 220.0000000 279.9632583 - 827 6 4 1992 210.0000000 245.0007417 - 828 7 4 1992 190.0000000 215.6197234 - 829 8 4 1992 173.0000000 191.4366152 - 830 9 4 1992 166.0000000 172.4032601 - 831 10 4 1992 133.0000000 157.5769552 - 832 11 4 1992 126.0000000 145.0991841 - 833 12 4 1992 124.0000000 136.8359451 - 834 13 4 1992 116.0000000 131.3251327 - 835 14 4 1992 112.0000000 134.1989899 - 836 15 4 1992 111.0000000 168.5487053 - 837 16 4 1992 137.0000000 177.2240076 - 838 17 4 1992 206.0000000 168.1794857 - 839 18 4 1992 176.0000000 165.8084852 - 840 19 4 1992 161.0000000 153.4572958 - 841 20 4 1992 161.0000000 145.9288402 - 842 21 4 1992 139.0000000 139.4616926 - 843 22 4 1992 139.0000000 133.6640177 - 844 23 4 1992 123.0000000 128.4314198 - 845 24 4 1992 119.0000000 123.6939123 - 846 25 4 1992 111.0000000 119.3924564 - 847 26 4 1992 94.0000000 115.5700589 - 848 27 4 1992 94.0000000 116.5295184 - 849 28 4 1992 102.0000000 121.1786359 - 850 29 4 1992 120.0000000 118.8693443 - 851 30 4 1992 120.0000000 113.9243341 - 852 1 5 1992 114.0000000 141.1755864 - 853 2 5 1992 115.0000000 156.6710236 - 854 3 5 1992 206.0000000 137.4494938 - 855 4 5 1992 215.0000000 130.2081184 - 856 5 5 1992 125.0000000 125.1338983 - 857 6 5 1992 123.0000000 120.5444785 - 858 7 5 1992 113.0000000 116.3741124 - 859 8 5 1992 77.0000000 112.5722169 - 860 9 5 1992 83.0000000 109.3546219 - 861 10 5 1992 83.0000000 119.4478419 - 862 11 5 1992 96.0000000 118.2482171 - 863 12 5 1992 120.0000000 108.1445025 - 864 13 5 1992 80.0000000 103.7198319 - 865 14 5 1992 76.0000000 100.8430281 - 866 15 5 1992 69.0000000 98.1889999 - 867 16 5 1992 63.0000000 95.7329764 - 868 17 5 1992 61.0000000 93.4534460 - 869 18 5 1992 60.0000000 91.3315693 - 870 19 5 1992 59.0000000 89.3508101 - 871 20 5 1992 67.0000000 87.4978961 - 872 21 5 1992 51.0000000 85.7625320 - 873 22 5 1992 44.0000000 84.1279097 - 874 23 5 1992 42.0000000 82.5813797 - 875 24 5 1992 51.0000000 81.2501668 - 876 25 5 1992 42.0000000 80.1127671 - 877 26 5 1992 54.0000000 90.3393835 - 878 27 5 1992 53.0000000 82.5433737 - 879 28 5 1992 59.0000000 78.2143981 - 880 29 5 1992 55.0000000 86.9570536 - 881 30 5 1992 54.0000000 86.5186134 - 882 31 5 1992 48.0000000 80.5820486 - 883 1 6 1992 63.0000000 83.3116479 - 884 2 6 1992 61.0000000 82.3930706 - 885 3 6 1992 55.0000000 83.6011229 - 886 4 6 1992 75.0000000 100.7278272 - 887 5 6 1992 53.0000000 113.6193544 - 888 6 6 1992 77.0000000 110.6663739 - 889 7 6 1992 114.0000000 106.3882829 - 890 8 6 1992 167.0000000 116.8412425 - 891 9 6 1992 116.0000000 105.7215788 - 892 10 6 1992 91.0000000 96.6437582 - 893 11 6 1992 85.0000000 93.3664662 - 894 12 6 1992 68.0000000 90.4239782 - 895 13 6 1992 71.0000000 87.7364185 - 896 14 6 1992 63.0000000 85.2616248 - 897 15 6 1992 59.0000000 82.9768683 - 898 16 6 1992 46.0000000 80.8615445 - 899 17 6 1992 44.0000000 78.8975956 - 900 18 6 1992 39.0000000 77.0691598 - 901 19 6 1992 41.0000000 75.3745266 - 902 20 6 1992 44.0000000 76.3161599 - 903 21 6 1992 39.0000000 74.2279973 - 904 22 6 1992 32.0000000 71.7014746 - 905 23 6 1992 40.0000000 72.9709714 - 906 24 6 1992 41.0000000 86.3337247 - 907 25 6 1992 42.0000000 80.4867751 - 908 26 6 1992 42.0000000 72.6463486 - 909 27 6 1992 48.0000000 70.2348514 - 910 28 6 1992 37.0000000 68.7659866 - 911 29 6 1992 40.0000000 67.3902401 - 912 30 6 1992 29.0000000 66.3213352 - 913 1 7 1992 30.0000000 65.8475946 - 914 2 7 1992 36.0000000 64.1218940 - 915 3 7 1992 29.0000000 69.4949340 - 916 4 7 1992 36.0000000 80.3598386 - 917 5 7 1992 50.0000000 98.6769084 - 918 6 7 1992 78.0000000 100.2160477 - 919 7 7 1992 54.0000000 81.3806262 - 920 8 7 1992 57.0000000 72.6988656 - 921 9 7 1992 51.0000000 70.9428430 - 922 10 7 1992 47.0000000 91.0200760 - 923 11 7 1992 46.0000000 110.5730083 - 924 12 7 1992 76.0000000 103.6987848 - 925 13 7 1992 72.0000000 91.4828767 - 926 14 7 1992 67.0000000 83.0142444 - 927 15 7 1992 63.0000000 80.0702945 - 928 16 7 1992 47.0000000 77.3870546 - 929 17 7 1992 47.0000000 74.9333915 - 930 18 7 1992 42.0000000 72.6828561 - 931 19 7 1992 41.0000000 70.6124753 - 932 20 7 1992 39.0000000 68.7022402 - 933 21 7 1992 37.0000000 68.5112754 - 934 22 7 1992 33.0000000 68.3133663 - 935 23 7 1992 33.0000000 65.0129061 - 936 24 7 1992 33.0000000 63.5177003 - 937 25 7 1992 37.0000000 62.1186225 - 938 26 7 1992 26.0000000 60.8036501 - 939 27 7 1992 24.0000000 59.5688710 - 940 28 7 1992 26.0000000 58.4065138 - 941 29 7 1992 29.0000000 57.3096755 - 942 30 7 1992 19.0000000 56.2722144 - 943 31 7 1992 22.0000000 57.5124699 - 944 1 8 1992 28.0000000 57.1202530 - 945 2 8 1992 35.0000000 54.0662242 - 946 3 8 1992 29.0000000 53.1675713 - 947 4 8 1992 36.0000000 52.3120405 - 948 5 8 1992 52.0000000 51.4950248 - 949 6 8 1992 74.0000000 50.7132006 - 950 7 8 1992 54.0000000 49.9635878 - 951 8 8 1992 57.0000000 49.2435116 - 952 9 8 1992 48.0000000 51.5565155 - 953 10 8 1992 47.0000000 50.3094602 - 954 11 8 1992 46.0000000 57.9597171 - 955 12 8 1992 75.0000000 57.1502287 - 956 13 8 1992 73.0000000 61.8328755 - 957 14 8 1992 66.0000000 64.7666355 - 958 15 8 1992 60.0000000 57.4315136 - 959 16 8 1992 47.0000000 49.2175113 - 960 17 8 1992 46.0000000 48.3017484 - 961 18 8 1992 42.0000000 47.4375890 - 962 19 8 1992 41.0000000 46.7499120 - 963 20 8 1992 40.0000000 53.9495004 - 964 21 8 1992 37.0000000 49.9632430 - 965 22 8 1992 32.0000000 47.4572172 - 966 23 8 1992 32.0000000 47.2227755 - 967 24 8 1992 32.0000000 44.7978369 - 968 25 8 1992 36.0000000 44.0021920 - 969 26 8 1992 27.0000000 43.2877858 - 970 27 8 1992 25.0000000 42.6073036 - 971 28 8 1992 25.0000000 42.5318478 - 972 29 8 1992 28.0000000 49.6576564 - 973 30 8 1992 20.0000000 63.6463566 - 974 31 8 1992 22.0000000 107.7256423 - 975 1 9 1992 49.0000000 94.8939575 - 976 2 9 1992 77.0000000 81.2404857 - 977 3 9 1992 67.0000000 76.7161436 - 978 4 9 1992 45.0000000 75.5730655 - 979 5 9 1992 44.0000000 67.6732296 - 980 6 9 1992 64.0000000 60.7306771 - 981 7 9 1992 52.0000000 58.3364750 - 982 8 9 1992 40.0000000 56.1661690 - 983 9 9 1992 30.0000000 54.1923429 - 984 10 9 1992 34.0000000 52.3918729 - 985 11 9 1992 32.0000000 51.1349788 - 986 12 9 1992 36.0000000 49.9287862 - 987 13 9 1992 28.0000000 48.2731974 - 988 14 9 1992 33.0000000 48.4747911 - 989 15 9 1992 35.0000000 50.4348720 - 990 16 9 1992 30.0000000 46.0075525 - 991 17 9 1992 32.0000000 44.8462351 - 992 18 9 1992 29.0000000 43.8560725 - 993 19 9 1992 30.0000000 43.4268315 - 994 20 9 1992 28.0000000 42.0207587 - 995 21 9 1992 29.0000000 41.1307663 - 996 22 9 1992 29.0000000 40.2973245 - 997 23 9 1992 27.0000000 39.5232891 - 998 24 9 1992 27.0000000 38.7819455 - 999 25 9 1992 23.0000000 38.0789610 - 1000 26 9 1992 28.0000000 37.4126007 - 1001 27 9 1992 25.0000000 36.7810676 - 1002 28 9 1992 25.0000000 38.1536354 - 1003 29 9 1992 27.0000000 39.8191829 - 1004 30 9 1992 25.0000000 36.0267917 - 1005 1 10 1992 27.0000000 35.9850314 - 1006 2 10 1992 33.0000000 38.1243262 - 1007 3 10 1992 29.0000000 38.7282295 - 1008 4 10 1992 31.0000000 36.4445106 - 1009 5 10 1992 25.0000000 49.4323920 - 1010 6 10 1992 25.0000000 55.5144682 - 1011 7 10 1992 36.0000000 43.4738553 - 1012 8 10 1992 42.0000000 37.4912763 - 1013 9 10 1992 43.0000000 39.3006645 - 1014 10 10 1992 26.0000000 45.5246056 - 1015 11 10 1992 27.0000000 42.4907770 - 1016 12 10 1992 27.0000000 37.8985785 - 1017 13 10 1992 26.0000000 37.0465379 - 1018 14 10 1992 26.0000000 36.3656630 - 1019 15 10 1992 23.0000000 50.5615881 - 1020 16 10 1992 21.0000000 49.2981942 - 1021 17 10 1992 26.0000000 42.9239898 - 1022 18 10 1992 34.0000000 45.0572927 - 1023 19 10 1992 37.0000000 40.7439687 - 1024 20 10 1992 31.0000000 49.0013100 - 1025 21 10 1992 31.0000000 49.1100790 - 1026 22 10 1992 35.0000000 47.3131258 - 1027 23 10 1992 33.0000000 75.0554229 - 1028 24 10 1992 40.0000000 140.0545577 - 1029 25 10 1992 74.0000000 186.1880381 - 1030 26 10 1992 161.0000000 188.8029075 - 1031 27 10 1992 285.0000000 204.2316458 - 1032 28 10 1992 244.0000000 226.0304587 - 1033 29 10 1992 263.0000000 237.1808370 - 1034 30 10 1992 276.0000000 198.7757377 - 1035 31 10 1992 186.0000000 170.8727688 - 1036 1 11 1992 154.0000000 149.9109125 - 1037 2 11 1992 112.0000000 155.8673247 - 1038 3 11 1992 104.0000000 159.9626447 - 1039 4 11 1992 96.0000000 150.9147638 - 1040 5 11 1992 99.0000000 132.3984761 - 1041 6 11 1992 126.0000000 117.3478703 - 1042 7 11 1992 91.0000000 106.7084335 - 1043 8 11 1992 84.0000000 101.8932278 - 1044 9 11 1992 81.0000000 108.0141816 - 1045 10 11 1992 85.0000000 146.3738491 - 1046 11 11 1992 126.0000000 234.0977738 - 1047 12 11 1992 279.0000000 280.3817877 - 1048 13 11 1992 390.0000000 288.7831427 - 1049 14 11 1992 294.0000000 297.6629228 - 1050 15 11 1992 260.0000000 388.6266495 - 1051 16 11 1992 398.0000000 528.4390320 - 1052 17 11 1992 520.0000000 502.8343319 - 1053 18 11 1992 487.0000000 478.0418156 - 1054 19 11 1992 380.0000000 488.4995236 - 1055 20 11 1992 385.0000000 418.1525582 - 1056 21 11 1992 351.0000000 444.3955209 - 1057 22 11 1992 309.0000000 521.4814057 - 1058 23 11 1992 587.0000000 433.5182896 - 1059 24 11 1992 661.0000000 372.1851274 - 1060 25 11 1992 447.0000000 375.3390255 - 1061 26 11 1992 361.0000000 398.8930879 - 1062 27 11 1992 351.0000000 381.2781520 - 1063 28 11 1992 353.0000000 412.5118780 - 1064 29 11 1992 369.0000000 501.7969937 - 1065 30 11 1992 452.0000000 489.4521138 - 1066 1 12 1992 441.0000000 404.7265305 - 1067 2 12 1992 348.0000000 437.8610192 - 1068 3 12 1992 394.0000000 483.7755273 - 1069 4 12 1992 455.0000000 524.6027539 - 1070 5 12 1992 491.0000000 556.8211503 - 1071 6 12 1992 469.0000000 489.8304058 - 1072 7 12 1992 364.0000000 474.9198395 - 1073 8 12 1992 338.0000000 418.2533090 - 1074 9 12 1992 334.0000000 351.1210927 - 1075 10 12 1992 268.0000000 293.7421704 - 1076 11 12 1992 236.0000000 291.5165442 - 1077 12 12 1992 230.0000000 300.6301896 - 1078 13 12 1992 239.0000000 273.2578419 - 1079 14 12 1992 256.0000000 232.2366764 - 1080 15 12 1992 217.0000000 208.4416560 - 1081 16 12 1992 201.0000000 195.6244584 - 1082 17 12 1992 188.0000000 188.2951712 - 1083 18 12 1992 176.0000000 177.6770962 - 1084 19 12 1992 170.0000000 166.6208449 - 1085 20 12 1992 168.0000000 164.1178974 - 1086 21 12 1992 131.0000000 169.3147897 - 1087 22 12 1992 133.0000000 169.6904193 - 1088 23 12 1992 134.0000000 157.8119227 - 1089 24 12 1992 127.0000000 149.5542622 - 1090 25 12 1992 117.0000000 142.5661809 - 1091 26 12 1992 113.0000000 136.3015461 - 1092 27 12 1992 100.0000000 130.6661858 - 1093 28 12 1992 94.0000000 125.5798521 - 1094 29 12 1992 87.0000000 120.9738912 - 1095 30 12 1992 86.0000000 116.7893736 - 1096 31 12 1992 81.0000000 112.9755576 - 1097 1 1 1993 77.0000000 109.4886220 - 1098 2 1 1993 76.0000000 106.2906152 - 1099 3 1 1993 61.0000000 103.3485806 - 1100 4 1 1993 61.0000000 100.6338267 - 1101 5 1 1993 57.0000000 98.1213140 - 1102 6 1 1993 66.0000000 115.8243114 - 1103 7 1 1993 67.0000000 136.0176177 - 1104 8 1 1993 84.0000000 139.4005247 - 1105 9 1 1993 90.0000000 145.9119053 - 1106 10 1 1993 113.0000000 191.1269131 - 1107 11 1 1993 265.0000000 394.0565076 - 1108 12 1 1993 559.0000000 574.6073478 - 1109 13 1 1993 832.0000000 575.8551087 - 1110 14 1 1993 601.0000000 497.2191019 - 1111 15 1 1993 436.0000000 407.5449952 - 1112 16 1 1993 339.0000000 337.3590477 - 1113 17 1 1993 292.0000000 287.1787738 - 1114 18 1 1993 247.0000000 253.4167959 - 1115 19 1 1993 218.0000000 228.5465239 - 1116 20 1 1993 205.0000000 208.2183198 - 1117 21 1 1993 190.0000000 195.7318482 - 1118 22 1 1993 176.0000000 189.0153218 - 1119 23 1 1993 173.0000000 183.6178106 - 1120 24 1 1993 173.0000000 238.4735350 - 1121 25 1 1993 199.0000000 333.9544182 - 1122 26 1 1993 361.0000000 291.1581528 - 1123 27 1 1993 295.0000000 293.3333328 - 1124 28 1 1993 238.0000000 315.0666589 - 1125 29 1 1993 263.0000000 296.4148482 - 1126 30 1 1993 245.0000000 261.1255064 - 1127 31 1 1993 222.0000000 228.9297187 - 1128 1 2 1993 199.0000000 205.2595049 - 1129 2 2 1993 186.0000000 186.8284777 - 1130 3 2 1993 171.0000000 172.2159518 - 1131 4 2 1993 157.0000000 161.6803312 - 1132 5 2 1993 159.0000000 153.7857226 - 1133 6 2 1993 129.0000000 146.9979903 - 1134 7 2 1993 119.0000000 141.1180341 - 1135 8 2 1993 119.0000000 135.6306815 - 1136 9 2 1993 105.0000000 130.6279917 - 1137 10 2 1993 106.0000000 126.0827207 - 1138 11 2 1993 105.0000000 121.9399860 - 1139 12 2 1993 95.0000000 118.1523590 - 1140 13 2 1993 91.0000000 114.6787385 - 1141 14 2 1993 88.0000000 111.4834122 - 1142 15 2 1993 84.0000000 108.5352721 - 1143 16 2 1993 83.0000000 106.1091657 - 1144 17 2 1993 79.0000000 106.8904880 - 1145 18 2 1993 78.0000000 107.8865597 - 1146 19 2 1993 84.0000000 107.1419613 - 1147 20 2 1993 91.0000000 121.9843846 - 1148 21 2 1993 91.0000000 126.2749738 - 1149 22 2 1993 90.0000000 124.0143857 - 1150 23 2 1993 103.0000000 118.9840172 - 1151 24 2 1993 94.0000000 114.4413588 - 1152 25 2 1993 81.0000000 110.6224977 - 1153 26 2 1993 78.0000000 107.2772311 - 1154 27 2 1993 75.0000000 108.5159312 - 1155 28 2 1993 76.0000000 107.3645768 - 1156 1 3 1993 80.0000000 103.7783237 - 1157 2 3 1993 75.0000000 102.2105436 - 1158 3 3 1993 76.0000000 100.9339478 - 1159 4 3 1993 72.0000000 97.8969619 - 1160 5 3 1993 65.0000000 95.3988097 - 1161 6 3 1993 64.0000000 93.1243846 - 1162 7 3 1993 64.0000000 91.4200563 - 1163 8 3 1993 68.0000000 90.7958734 - 1164 9 3 1993 68.0000000 88.5677667 - 1165 10 3 1993 67.0000000 88.2553949 - 1166 11 3 1993 61.0000000 89.1991698 - 1167 12 3 1993 57.0000000 89.9000635 - 1168 13 3 1993 58.0000000 87.8291779 - 1169 14 3 1993 54.0000000 85.9054209 - 1170 15 3 1993 66.0000000 84.1309943 - 1171 16 3 1993 54.0000000 82.5532864 - 1172 17 3 1993 57.0000000 81.0796365 - 1173 18 3 1993 57.0000000 79.7270072 - 1174 19 3 1993 52.0000000 78.3823431 - 1175 20 3 1993 57.0000000 77.0921781 - 1176 21 3 1993 58.0000000 76.8458494 - 1177 22 3 1993 57.0000000 93.9629711 - 1178 23 3 1993 56.0000000 97.7787040 - 1179 24 3 1993 63.0000000 87.8133108 - 1180 25 3 1993 76.0000000 85.6444480 - 1181 26 3 1993 56.0000000 83.6251911 - 1182 27 3 1993 59.0000000 81.7397879 - 1183 28 3 1993 59.0000000 79.9749382 - 1184 29 3 1993 54.0000000 78.3188495 - 1185 30 3 1993 48.0000000 76.7610481 - 1186 31 3 1993 55.0000000 75.2922159 - 1187 1 4 1993 48.0000000 75.8248241 - 1188 2 4 1993 53.0000000 78.9539504 - 1189 3 4 1993 47.0000000 76.8981189 - 1190 4 4 1993 59.0000000 84.7045394 - 1191 5 4 1993 53.0000000 104.7581629 - 1192 6 4 1993 64.0000000 101.7246509 - 1193 7 4 1993 63.0000000 92.3063412 - 1194 8 4 1993 75.0000000 90.2304443 - 1195 9 4 1993 64.0000000 87.1418656 - 1196 10 4 1993 59.0000000 89.2920259 - 1197 11 4 1993 60.0000000 95.4516769 - 1198 12 4 1993 63.0000000 93.3121764 - 1199 13 4 1993 69.0000000 91.7737217 - 1200 14 4 1993 79.0000000 90.0052591 - 1201 15 4 1993 82.0000000 87.2550705 - 1202 16 4 1993 68.0000000 85.4401662 - 1203 17 4 1993 56.0000000 83.0005317 - 1204 18 4 1993 59.0000000 80.8320103 - 1205 19 4 1993 61.0000000 78.7345741 - 1206 20 4 1993 62.0000000 76.7639899 - 1207 21 4 1993 57.0000000 74.9299406 - 1208 22 4 1993 53.0000000 73.2235802 - 1209 23 4 1993 47.0000000 71.6258988 - 1210 24 4 1993 46.0000000 70.1239008 - 1211 25 4 1993 47.0000000 68.7119909 - 1212 26 4 1993 45.0000000 67.3815967 - 1213 27 4 1993 43.0000000 66.1250825 - 1214 28 4 1993 41.0000000 64.9379227 - 1215 29 4 1993 38.0000000 63.8209685 - 1216 30 4 1993 39.0000000 63.2477755 - 1217 1 5 1993 40.0000000 62.4593108 - 1218 2 5 1993 41.0000000 63.4751840 - 1219 3 5 1993 45.0000000 62.0502507 - 1220 4 5 1993 49.0000000 60.4453586 - 1221 5 5 1993 40.0000000 59.4965901 - 1222 6 5 1993 43.0000000 58.7217681 - 1223 7 5 1993 38.0000000 58.3370884 - 1224 8 5 1993 38.0000000 58.4032625 - 1225 9 5 1993 43.0000000 57.3712645 - 1226 10 5 1993 44.0000000 56.8802443 - 1227 11 5 1993 41.0000000 56.8391094 - 1228 12 5 1993 51.0000000 66.0113156 - 1229 13 5 1993 63.0000000 104.0904476 - 1230 14 5 1993 68.0000000 76.3642057 - 1231 15 5 1993 77.0000000 65.1711618 - 1232 16 5 1993 77.0000000 63.4046808 - 1233 17 5 1993 59.0000000 61.7360422 - 1234 18 5 1993 49.0000000 60.2135302 - 1235 19 5 1993 43.0000000 65.6281489 - 1236 20 5 1993 44.0000000 74.3259904 - 1237 21 5 1993 48.0000000 69.5711466 - 1238 22 5 1993 44.0000000 61.8721460 - 1239 23 5 1993 46.0000000 60.2854330 - 1240 24 5 1993 40.0000000 58.8171815 - 1241 25 5 1993 43.0000000 57.4535972 - 1242 26 5 1993 30.0000000 57.0188056 - 1243 27 5 1993 45.0000000 67.8183240 - 1244 28 5 1993 43.0000000 72.0264154 - 1245 29 5 1993 44.0000000 62.2571588 - 1246 30 5 1993 54.0000000 64.7732235 - 1247 31 5 1993 56.0000000 64.2926212 - 1248 1 6 1993 44.0000000 58.1790035 - 1249 2 6 1993 43.0000000 59.4175247 - 1250 3 6 1993 33.0000000 64.9796987 - 1251 4 6 1993 45.0000000 58.7514868 - 1252 5 6 1993 46.0000000 56.3457577 - 1253 6 6 1993 42.0000000 54.9966601 - 1254 7 6 1993 40.0000000 53.7395551 - 1255 8 6 1993 30.0000000 52.5647863 - 1256 9 6 1993 31.0000000 51.6826107 - 1257 10 6 1993 32.0000000 51.0186747 - 1258 11 6 1993 25.0000000 51.0051003 - 1259 12 6 1993 33.0000000 52.4177106 - 1260 13 6 1993 29.0000000 50.2806231 - 1261 14 6 1993 40.0000000 52.2151544 - 1262 15 6 1993 42.0000000 54.0940181 - 1263 16 6 1993 37.0000000 51.2360540 - 1264 17 6 1993 46.0000000 49.5882339 - 1265 18 6 1993 47.0000000 47.9267956 - 1266 19 6 1993 50.0000000 50.1494599 - 1267 20 6 1993 43.0000000 77.5742716 - 1268 21 6 1993 69.0000000 68.4826756 - 1269 22 6 1993 61.0000000 75.3949702 - 1270 23 6 1993 67.0000000 85.4581352 - 1271 24 6 1993 77.0000000 66.3072050 - 1272 25 6 1993 87.0000000 63.7043051 - 1273 26 6 1993 55.0000000 61.5419222 - 1274 27 6 1993 43.0000000 59.5586718 - 1275 28 6 1993 40.0000000 57.7347372 - 1276 29 6 1993 30.0000000 56.0529308 - 1277 30 6 1993 40.0000000 54.4981787 - 1278 1 7 1993 40.0000000 55.4800474 - 1279 2 7 1993 27.0000000 54.8800973 - 1280 3 7 1993 34.0000000 51.7842258 - 1281 4 7 1993 30.0000000 50.4992265 - 1282 5 7 1993 31.0000000 49.4256219 - 1283 6 7 1993 27.0000000 48.2068376 - 1284 7 7 1993 31.0000000 47.1607785 - 1285 8 7 1993 26.0000000 46.1793209 - 1286 9 7 1993 23.0000000 46.2431140 - 1287 10 7 1993 24.0000000 46.9238342 - 1288 11 7 1993 25.0000000 51.1718939 - 1289 12 7 1993 34.0000000 60.6969284 - 1290 13 7 1993 40.0000000 58.5914440 - 1291 14 7 1993 41.0000000 78.9950311 - 1292 15 7 1993 46.0000000 65.8874288 - 1293 16 7 1993 39.0000000 52.2541691 - 1294 17 7 1993 43.0000000 51.2458401 - 1295 18 7 1993 35.0000000 50.4582426 - 1296 19 7 1993 49.0000000 70.0887763 - 1297 20 7 1993 38.0000000 69.3698698 - 1298 21 7 1993 41.0000000 65.0769335 - 1299 22 7 1993 45.0000000 60.6596247 - 1300 23 7 1993 41.0000000 53.7425594 - 1301 24 7 1993 42.0000000 52.1521355 - 1302 25 7 1993 40.0000000 50.7285954 - 1303 26 7 1993 35.0000000 49.3717717 - 1304 27 7 1993 40.0000000 74.3065089 - 1305 28 7 1993 40.0000000 64.2950331 - 1306 29 7 1993 36.0000000 51.9874185 - 1307 30 7 1993 40.0000000 109.1209375 - 1308 31 7 1993 61.0000000 92.2885413 - 1309 1 8 1993 36.0000000 65.4355688 - 1310 2 8 1993 46.0000000 62.5418352 - 1311 3 8 1993 32.0000000 59.9293570 - 1312 4 8 1993 38.0000000 57.5630150 - 1313 5 8 1993 32.0000000 55.4175934 - 1314 6 8 1993 25.0000000 53.4724679 - 1315 7 8 1993 26.0000000 51.6822514 - 1316 8 8 1993 29.0000000 50.0419586 - 1317 9 8 1993 29.0000000 57.8969276 - 1318 10 8 1993 28.0000000 60.1130433 - 1319 11 8 1993 37.0000000 52.6546147 - 1320 12 8 1993 40.0000000 48.7091708 - 1321 13 8 1993 49.0000000 47.2946594 - 1322 14 8 1993 32.0000000 48.1898592 - 1323 15 8 1993 37.0000000 46.5848733 - 1324 16 8 1993 37.0000000 44.5386369 - 1325 17 8 1993 27.0000000 43.4161261 - 1326 18 8 1993 24.0000000 42.3719038 - 1327 19 8 1993 24.0000000 41.3979391 - 1328 20 8 1993 22.0000000 40.4871919 - 1329 21 8 1993 21.0000000 39.6334258 - 1330 22 8 1993 16.0000000 40.6467502 - 1331 23 8 1993 21.0000000 43.8010475 - 1332 24 8 1993 27.0000000 40.5079345 - 1333 25 8 1993 26.0000000 38.0088525 - 1334 26 8 1993 23.0000000 37.2861227 - 1335 27 8 1993 21.0000000 40.1921670 - 1336 28 8 1993 28.0000000 41.5362733 - 1337 29 8 1993 17.0000000 36.6824600 - 1338 30 8 1993 24.0000000 36.0169932 - 1339 31 8 1993 25.0000000 35.3856853 - 1340 1 9 1993 25.0000000 34.7850450 - 1341 2 9 1993 19.0000000 34.2124671 - 1342 3 9 1993 17.0000000 37.2549608 - 1343 4 9 1993 16.0000000 41.8588872 - 1344 5 9 1993 19.0000000 34.9164646 - 1345 6 9 1993 23.0000000 33.8641632 - 1346 7 9 1993 25.0000000 57.2731453 - 1347 8 9 1993 34.0000000 50.3124429 - 1348 9 9 1993 31.0000000 64.0884936 - 1349 10 9 1993 35.0000000 90.4297380 - 1350 11 9 1993 53.0000000 118.7006971 - 1351 12 9 1993 71.0000000 117.5060552 - 1352 13 9 1993 74.0000000 152.7999626 - 1353 14 9 1993 87.0000000 168.9967225 - 1354 15 9 1993 173.0000000 160.5411266 - 1355 16 9 1993 117.0000000 130.2641241 - 1356 17 9 1993 93.0000000 114.1048154 - 1357 18 9 1993 77.0000000 105.2216774 - 1358 19 9 1993 62.0000000 97.5494340 - 1359 20 9 1993 54.0000000 91.0713602 - 1360 21 9 1993 48.0000000 88.5953566 - 1361 22 9 1993 46.0000000 111.1316361 - 1362 23 9 1993 55.0000000 117.9069100 - 1363 24 9 1993 66.0000000 121.7989236 - 1364 25 9 1993 64.0000000 118.5793841 - 1365 26 9 1993 52.0000000 106.1674390 - 1366 27 9 1993 68.0000000 98.7998052 - 1367 28 9 1993 69.0000000 102.3520659 - 1368 29 9 1993 62.0000000 99.1475885 - 1369 30 9 1993 76.0000000 93.2675828 - 1370 1 10 1993 72.0000000 119.5771934 - 1371 2 10 1993 68.0000000 119.6719900 - 1372 3 10 1993 72.0000000 115.5426540 - 1373 4 10 1993 78.0000000 122.4085475 - 1374 5 10 1993 116.0000000 196.5630056 - 1375 6 10 1993 131.0000000 211.4081525 - 1376 7 10 1993 180.0000000 187.3150573 - 1377 8 10 1993 203.0000000 187.2493469 - 1378 9 10 1993 164.0000000 196.9627798 - 1379 10 10 1993 178.0000000 214.5195247 - 1380 11 10 1993 161.0000000 253.6860033 - 1381 12 10 1993 287.0000000 256.6699598 - 1382 13 10 1993 360.0000000 329.7852372 - 1383 14 10 1993 374.0000000 332.6781862 - 1384 15 10 1993 297.0000000 291.9568883 - 1385 16 10 1993 247.0000000 296.8964397 - 1386 17 10 1993 273.0000000 301.4746351 - 1387 18 10 1993 261.0000000 267.9550866 - 1388 19 10 1993 265.0000000 237.4589835 - 1389 20 10 1993 230.0000000 203.5537457 - 1390 21 10 1993 199.0000000 180.8021007 - 1391 22 10 1993 173.0000000 175.5378962 - 1392 23 10 1993 182.0000000 197.4086310 - 1393 24 10 1993 203.0000000 201.7331979 - 1394 25 10 1993 213.0000000 175.3455542 - 1395 26 10 1993 180.0000000 154.4840514 - 1396 27 10 1993 154.0000000 140.3075381 - 1397 28 10 1993 118.0000000 131.1843398 - 1398 29 10 1993 112.0000000 123.7435569 - 1399 30 10 1993 98.0000000 117.1183509 - 1400 31 10 1993 97.0000000 111.1977908 - 1401 1 11 1993 91.0000000 105.8902536 - 1402 2 11 1993 85.0000000 101.1175865 - 1403 3 11 1993 75.0000000 96.8128958 - 1404 4 11 1993 76.0000000 92.9187360 - 1405 5 11 1993 78.0000000 89.3856217 - 1406 6 11 1993 72.0000000 86.2651453 - 1407 7 11 1993 76.0000000 86.4180819 - 1408 8 11 1993 69.0000000 83.9849899 - 1409 9 11 1993 66.0000000 81.5121612 - 1410 10 11 1993 71.0000000 81.9521677 - 1411 11 11 1993 64.0000000 92.3841294 - 1412 12 11 1993 67.0000000 95.8545081 - 1413 13 11 1993 80.0000000 95.9771518 - 1414 14 11 1993 78.0000000 126.3697881 - 1415 15 11 1993 80.0000000 130.6063615 - 1416 16 11 1993 86.0000000 121.1892179 - 1417 17 11 1993 125.0000000 111.6900842 - 1418 18 11 1993 96.0000000 106.3222579 - 1419 19 11 1993 82.0000000 101.4838708 - 1420 20 11 1993 77.0000000 97.1222017 - 1421 21 11 1993 67.0000000 93.1760857 - 1422 22 11 1993 71.0000000 89.5955927 - 1423 23 11 1993 61.0000000 86.3375694 - 1424 24 11 1993 42.0000000 83.3647548 - 1425 25 11 1993 63.0000000 81.0263725 - 1426 26 11 1993 57.0000000 79.8629766 - 1427 27 11 1993 58.0000000 76.9730875 - 1428 28 11 1993 49.0000000 74.7914267 - 1429 29 11 1993 50.0000000 72.7737255 - 1430 30 11 1993 55.0000000 70.9027617 - 1431 1 12 1993 54.0000000 69.1634242 - 1432 2 12 1993 54.0000000 76.2118544 - 1433 3 12 1993 50.0000000 74.1441260 - 1434 4 12 1993 51.0000000 74.7841618 - 1435 5 12 1993 62.0000000 71.7280441 - 1436 6 12 1993 62.0000000 69.3016170 - 1437 7 12 1993 71.0000000 106.0850079 - 1438 8 12 1993 79.0000000 167.6844020 - 1439 9 12 1993 153.0000000 183.3679810 - 1440 10 12 1993 291.0000000 248.7485327 - 1441 11 12 1993 332.0000000 335.5372035 - 1442 12 12 1993 465.0000000 391.2190165 - 1443 13 12 1993 518.0000000 459.4032166 - 1444 14 12 1993 539.0000000 487.3648583 - 1445 15 12 1993 559.0000000 482.4165875 - 1446 16 12 1993 500.0000000 553.2946213 - 1447 17 12 1993 526.0000000 585.0356443 - 1448 18 12 1993 583.0000000 591.5786561 - 1449 19 12 1993 677.0000000 664.6650690 - 1450 20 12 1993 781.0000000 989.4794559 - 1451 21 12 1993 1180.0000000 1117.5850190 - 1452 22 12 1993 1460.0000000 1100.3000489 - 1453 23 12 1993 1600.0000000 1157.9831944 - 1454 24 12 1993 1410.0000000 1157.3798134 - 1455 25 12 1993 1230.0000000 986.6384962 - 1456 26 12 1993 1070.0000000 803.1583597 - 1457 27 12 1993 746.0000000 662.5288722 - 1458 28 12 1993 542.0000000 563.2707274 - 1459 29 12 1993 492.0000000 545.7895910 - 1460 30 12 1993 491.0000000 615.9550381 - 1461 31 12 1993 617.0000000 815.2922727 + 1 1 7 1990 79.0000000 108.4972384 + 2 2 7 1990 92.0000000 93.6936752 + 3 3 7 1990 72.0000000 100.1110345 + 4 4 7 1990 58.0000000 117.7421259 + 5 5 7 1990 69.0000000 149.2317214 + 6 6 7 1990 94.0000000 135.9789254 + 7 7 7 1990 199.0000000 131.0241477 + 8 8 7 1990 133.0000000 134.1886346 + 9 9 7 1990 124.0000000 116.2838240 + 10 10 7 1990 123.0000000 108.3744975 + 11 11 7 1990 99.0000000 102.3173761 + 12 12 7 1990 88.0000000 97.2749990 + 13 13 7 1990 84.0000000 92.7881302 + 14 14 7 1990 72.0000000 88.7460172 + 15 15 7 1990 55.0000000 85.0934793 + 16 16 7 1990 65.0000000 81.7830984 + 17 17 7 1990 50.0000000 78.7739958 + 18 18 7 1990 50.0000000 76.0308245 + 19 19 7 1990 46.0000000 73.5229330 + 20 20 7 1990 44.0000000 71.2236692 + 21 21 7 1990 42.0000000 69.1097991 + 22 22 7 1990 37.0000000 67.1610182 + 23 23 7 1990 38.0000000 65.3595412 + 24 24 7 1990 44.0000000 63.6897542 + 25 25 7 1990 30.0000000 62.1379209 + 26 26 7 1990 26.0000000 60.6919323 + 27 27 7 1990 31.0000000 59.3410930 + 28 28 7 1990 33.0000000 61.2312311 + 29 29 7 1990 42.0000000 58.5645775 + 30 30 7 1990 36.0000000 56.2606786 + 31 31 7 1990 34.0000000 55.1651324 + 32 1 8 1990 25.0000000 54.1310745 + 33 2 8 1990 22.0000000 53.1527692 + 34 3 8 1990 28.0000000 52.2251001 + 35 4 8 1990 25.0000000 51.3434966 + 36 5 8 1990 19.0000000 50.5040416 + 37 6 8 1990 22.0000000 49.7035789 + 38 7 8 1990 19.0000000 48.9373284 + 39 8 8 1990 22.0000000 48.2030761 + 40 9 8 1990 19.0000000 47.4982549 + 41 10 8 1990 20.0000000 46.8204768 + 42 11 8 1990 19.0000000 46.1675895 + 43 12 8 1990 19.0000000 45.5376512 + 44 13 8 1990 22.0000000 50.1725798 + 45 14 8 1990 36.0000000 72.0013563 + 46 15 8 1990 31.0000000 62.9824585 + 47 16 8 1990 30.0000000 57.1726230 + 48 17 8 1990 28.0000000 53.5271067 + 49 18 8 1990 34.0000000 46.5540074 + 50 19 8 1990 21.0000000 45.7190440 + 51 20 8 1990 30.0000000 44.9285213 + 52 21 8 1990 22.0000000 44.1779016 + 53 22 8 1990 21.0000000 43.4634862 + 54 23 8 1990 23.0000000 42.7819834 + 55 24 8 1990 20.0000000 42.1304591 + 56 25 8 1990 29.0000000 41.5084679 + 57 26 8 1990 20.0000000 41.4299762 + 58 27 8 1990 22.0000000 42.5606377 + 59 28 8 1990 23.0000000 40.5033684 + 60 29 8 1990 35.0000000 39.4697410 + 61 30 8 1990 51.0000000 128.3173894 + 62 31 8 1990 80.0000000 126.3556564 + 63 1 9 1990 56.0000000 66.6545619 + 64 2 9 1990 33.0000000 56.9997605 + 65 3 9 1990 27.0000000 54.8356689 + 66 4 9 1990 27.0000000 57.0074926 + 67 5 9 1990 28.0000000 56.1625877 + 68 6 9 1990 26.0000000 50.9024717 + 69 7 9 1990 24.0000000 56.0440931 + 70 8 9 1990 33.0000000 52.7787633 + 71 9 9 1990 26.0000000 48.3175403 + 72 10 9 1990 27.0000000 46.8994459 + 73 11 9 1990 22.0000000 45.5940236 + 74 12 9 1990 22.0000000 44.3884605 + 75 13 9 1990 21.0000000 43.2719066 + 76 14 9 1990 22.0000000 42.2348513 + 77 15 9 1990 22.0000000 41.2689408 + 78 16 9 1990 22.0000000 40.3668222 + 79 17 9 1990 20.0000000 39.5220117 + 80 18 9 1990 22.0000000 38.7287808 + 81 19 9 1990 16.0000000 37.9820594 + 82 20 9 1990 22.0000000 37.2773528 + 83 21 9 1990 19.0000000 45.9914960 + 84 22 9 1990 32.0000000 114.4222048 + 85 23 9 1990 27.0000000 96.8650549 + 86 24 9 1990 45.0000000 73.4251132 + 87 25 9 1990 42.0000000 58.7693033 + 88 26 9 1990 39.0000000 54.4144057 + 89 27 9 1990 30.0000000 52.2576235 + 90 28 9 1990 28.0000000 50.2972567 + 91 29 9 1990 30.0000000 48.5134248 + 92 30 9 1990 30.0000000 100.5416628 + 93 1 10 1990 56.0000000 150.0748280 + 94 2 10 1990 72.0000000 118.2531425 + 95 3 10 1990 73.0000000 115.0684206 + 96 4 10 1990 68.0000000 109.7271094 + 97 5 10 1990 53.0000000 95.4701663 + 98 6 10 1990 42.0000000 88.2471157 + 99 7 10 1990 33.0000000 82.9582305 + 100 8 10 1990 42.0000000 78.3939363 + 101 9 10 1990 34.0000000 74.3098705 + 102 10 10 1990 36.0000000 70.6330880 + 103 11 10 1990 36.0000000 67.3219965 + 104 12 10 1990 28.0000000 64.3319152 + 105 13 10 1990 32.0000000 61.6243313 + 106 14 10 1990 27.0000000 59.1659485 + 107 15 10 1990 35.0000000 57.4147561 + 108 16 10 1990 42.0000000 58.2422691 + 109 17 10 1990 35.0000000 67.7518594 + 110 18 10 1990 39.0000000 66.9507605 + 111 19 10 1990 34.0000000 57.4400628 + 112 20 10 1990 32.0000000 55.3290534 + 113 21 10 1990 34.0000000 53.4082641 + 114 22 10 1990 27.0000000 51.6482089 + 115 23 10 1990 31.0000000 50.0312337 + 116 24 10 1990 28.0000000 48.5418856 + 117 25 10 1990 25.0000000 48.4166012 + 118 26 10 1990 29.0000000 67.1290473 + 119 27 10 1990 31.0000000 75.6633434 + 120 28 10 1990 65.0000000 208.5121626 + 121 29 10 1990 69.0000000 230.0488974 + 122 30 10 1990 157.0000000 200.7571179 + 123 31 10 1990 190.0000000 175.1681064 + 124 1 11 1990 115.0000000 176.6325793 + 125 2 11 1990 104.0000000 184.9967600 + 126 3 11 1990 100.0000000 194.6621620 + 127 4 11 1990 131.0000000 189.9863861 + 128 5 11 1990 130.0000000 182.0052936 + 129 6 11 1990 115.0000000 160.1642535 + 130 7 11 1990 102.0000000 141.5084628 + 131 8 11 1990 95.0000000 125.7816127 + 132 9 11 1990 81.0000000 112.7782840 + 133 10 11 1990 66.0000000 119.3578926 + 134 11 11 1990 67.0000000 152.8605693 + 135 12 11 1990 74.0000000 167.2726687 + 136 13 11 1990 109.0000000 158.6926053 + 137 14 11 1990 92.0000000 183.1881900 + 138 15 11 1990 92.0000000 199.1864893 + 139 16 11 1990 155.0000000 186.2771953 + 140 17 11 1990 159.0000000 174.3309338 + 141 18 11 1990 131.0000000 190.4415326 + 142 19 11 1990 161.0000000 202.3631195 + 143 20 11 1990 196.0000000 312.1765507 + 144 21 11 1990 336.0000000 391.4933063 + 145 22 11 1990 566.0000000 353.7774929 + 146 23 11 1990 373.0000000 360.3212863 + 147 24 11 1990 293.0000000 331.4964385 + 148 25 11 1990 264.0000000 315.5856570 + 149 26 11 1990 226.0000000 284.8764596 + 150 27 11 1990 201.0000000 243.9121493 + 151 28 11 1990 180.0000000 212.2010498 + 152 29 11 1990 161.0000000 198.8088380 + 153 30 11 1990 149.0000000 186.7720708 + 154 1 12 1990 134.0000000 163.8542721 + 155 2 12 1990 113.0000000 148.7940410 + 156 3 12 1990 99.0000000 138.4393719 + 157 4 12 1990 107.0000000 130.8568677 + 158 5 12 1990 99.0000000 123.9728179 + 159 6 12 1990 89.0000000 117.6511652 + 160 7 12 1990 77.0000000 112.0293364 + 161 8 12 1990 71.0000000 106.9771141 + 162 9 12 1990 68.0000000 102.4228232 + 163 10 12 1990 73.0000000 98.3049740 + 164 11 12 1990 84.0000000 94.5706486 + 165 12 12 1990 88.0000000 112.6672811 + 166 13 12 1990 92.0000000 119.4019292 + 167 14 12 1990 128.0000000 111.2930721 + 168 15 12 1990 136.0000000 104.1846366 + 169 16 12 1990 114.0000000 99.4250792 + 170 17 12 1990 101.0000000 95.2100641 + 171 18 12 1990 93.0000000 91.4141153 + 172 19 12 1990 85.0000000 87.9839338 + 173 20 12 1990 81.0000000 84.8738915 + 174 21 12 1990 106.0000000 121.4584482 + 175 22 12 1990 159.0000000 151.1031104 + 176 23 12 1990 250.0000000 168.9409087 + 177 24 12 1990 298.0000000 159.7439000 + 178 25 12 1990 261.0000000 206.5819586 + 179 26 12 1990 228.0000000 326.3884513 + 180 27 12 1990 409.0000000 398.1632197 + 181 28 12 1990 486.0000000 422.5244550 + 182 29 12 1990 440.0000000 533.5235626 + 183 30 12 1990 486.0000000 668.5648170 + 184 31 12 1990 774.0000000 757.3893967 diff --git a/check/case_04/output_save/b5_daily_discharge.out b/check/case_04/output_save/b5_daily_discharge.out index 70179914..abaeb1e4 100644 --- a/check/case_04/output_save/b5_daily_discharge.out +++ b/check/case_04/output_save/b5_daily_discharge.out @@ -1,732 +1,367 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1992 140.0000000 106.5063245 - 2 2 1 1992 126.0000000 103.0863962 - 3 3 1 1992 117.0000000 100.4506955 - 4 4 1 1992 114.0000000 100.0148769 - 5 5 1 1992 108.0000000 97.5268097 - 6 6 1 1992 108.0000000 93.8464682 - 7 7 1 1992 101.0000000 91.2415304 - 8 8 1 1992 97.0000000 91.3018281 - 9 9 1 1992 89.0000000 97.8630722 - 10 10 1 1992 111.0000000 122.1312935 - 11 11 1 1992 135.0000000 113.6981189 - 12 12 1 1992 171.0000000 99.2769000 - 13 13 1 1992 125.0000000 96.0651831 - 14 14 1 1992 111.0000000 93.2173016 - 15 15 1 1992 100.0000000 90.6039046 - 16 16 1 1992 87.0000000 88.3087365 - 17 17 1 1992 75.0000000 86.0812046 - 18 18 1 1992 79.0000000 83.9950241 - 19 19 1 1992 70.0000000 87.4711376 - 20 20 1 1992 72.0000000 83.9868487 - 21 21 1 1992 87.0000000 82.1694237 - 22 22 1 1992 79.0000000 79.0489580 - 23 23 1 1992 71.0000000 77.3909403 - 24 24 1 1992 66.0000000 75.8375433 - 25 25 1 1992 67.0000000 74.3776050 - 26 26 1 1992 65.0000000 73.0017332 - 27 27 1 1992 59.0000000 71.7016395 - 28 28 1 1992 57.0000000 70.4741024 - 29 29 1 1992 54.0000000 69.4782378 - 30 30 1 1992 59.0000000 69.9797538 - 31 31 1 1992 57.0000000 73.7439789 - 32 1 2 1992 56.0000000 75.3972015 - 33 2 2 1992 54.0000000 72.9189765 - 34 3 2 1992 58.0000000 70.6669734 - 35 4 2 1992 63.0000000 100.0390836 - 36 5 2 1992 76.0000000 130.0244146 - 37 6 2 1992 250.0000000 125.6578358 - 38 7 2 1992 346.0000000 110.4084282 - 39 8 2 1992 241.0000000 102.5409191 - 40 9 2 1992 180.0000000 103.6405348 - 41 10 2 1992 164.0000000 111.6380229 - 42 11 2 1992 183.0000000 122.5059463 - 43 12 2 1992 215.0000000 137.7419074 - 44 13 2 1992 265.0000000 137.4301783 - 45 14 2 1992 287.0000000 146.4663520 - 46 15 2 1992 272.0000000 143.2570635 - 47 16 2 1992 253.0000000 163.1552392 - 48 17 2 1992 301.0000000 161.1982158 - 49 18 2 1992 275.0000000 141.8187342 - 50 19 2 1992 224.0000000 127.7256366 - 51 20 2 1992 194.0000000 117.4979029 - 52 21 2 1992 173.0000000 110.7925603 - 53 22 2 1992 157.0000000 105.6926992 - 54 23 2 1992 142.0000000 101.7312649 - 55 24 2 1992 133.0000000 99.6025714 - 56 25 2 1992 128.0000000 97.4538879 - 57 26 2 1992 125.0000000 93.3404958 - 58 27 2 1992 125.0000000 90.1507669 - 59 28 2 1992 110.0000000 87.2951563 - 60 29 2 1992 107.0000000 84.6742579 - 61 1 3 1992 97.0000000 82.3167736 - 62 2 3 1992 97.0000000 80.3474633 - 63 3 3 1992 86.0000000 82.5754557 - 64 4 3 1992 93.0000000 79.2421808 - 65 5 3 1992 86.0000000 77.0313973 - 66 6 3 1992 82.0000000 75.2304394 - 67 7 3 1992 80.0000000 73.4898254 - 68 8 3 1992 77.0000000 71.8574830 - 69 9 3 1992 73.0000000 70.3291306 - 70 10 3 1992 76.0000000 68.9632651 - 71 11 3 1992 68.0000000 67.7843270 - 72 12 3 1992 70.0000000 104.2768267 - 73 13 3 1992 116.0000000 149.2808666 - 74 14 3 1992 206.0000000 167.9712542 - 75 15 3 1992 433.0000000 189.8717112 - 76 16 3 1992 495.0000000 219.7594531 - 77 17 3 1992 331.0000000 193.9879618 - 78 18 3 1992 240.0000000 170.1973557 - 79 19 3 1992 215.0000000 150.8135502 - 80 20 3 1992 185.0000000 134.7466275 - 81 21 3 1992 185.0000000 128.4040380 - 82 22 3 1992 185.0000000 152.6696436 - 83 23 3 1992 213.0000000 228.7356548 - 84 24 3 1992 466.0000000 259.5259624 - 85 25 3 1992 580.0000000 281.5883654 - 86 26 3 1992 566.0000000 268.1735036 - 87 27 3 1992 487.0000000 242.6690777 - 88 28 3 1992 387.0000000 222.2943818 - 89 29 3 1992 311.0000000 202.9160074 - 90 30 3 1992 270.0000000 182.5759114 - 91 31 3 1992 246.0000000 166.1345587 - 92 1 4 1992 229.0000000 182.1372355 - 93 2 4 1992 222.0000000 181.2847269 - 94 3 4 1992 217.0000000 176.7938548 - 95 4 4 1992 208.0000000 227.4941252 - 96 5 4 1992 220.0000000 231.7608247 - 97 6 4 1992 210.0000000 206.8618846 - 98 7 4 1992 190.0000000 181.7313110 - 99 8 4 1992 173.0000000 161.3310205 - 100 9 4 1992 166.0000000 144.5134584 - 101 10 4 1992 133.0000000 131.0911414 - 102 11 4 1992 126.0000000 120.3196339 - 103 12 4 1992 124.0000000 112.7272943 - 104 13 4 1992 116.0000000 107.8947207 - 105 14 4 1992 112.0000000 107.9622848 - 106 15 4 1992 111.0000000 130.1470741 - 107 16 4 1992 137.0000000 146.9641904 - 108 17 4 1992 206.0000000 135.4762202 - 109 18 4 1992 176.0000000 134.5579100 - 110 19 4 1992 161.0000000 124.5484155 - 111 20 4 1992 161.0000000 117.8542517 - 112 21 4 1992 139.0000000 112.7794135 - 113 22 4 1992 139.0000000 108.4582743 - 114 23 4 1992 123.0000000 104.5508101 - 115 24 4 1992 119.0000000 100.9998212 - 116 25 4 1992 111.0000000 97.7639701 - 117 26 4 1992 94.0000000 94.8412243 - 118 27 4 1992 94.0000000 93.6318175 - 119 28 4 1992 102.0000000 99.8000262 - 120 29 4 1992 120.0000000 98.6691462 - 121 30 4 1992 120.0000000 95.0542070 - 122 1 5 1992 114.0000000 105.9640672 - 123 2 5 1992 115.0000000 136.9742754 - 124 3 5 1992 206.0000000 116.0007508 - 125 4 5 1992 215.0000000 108.6167166 - 126 5 5 1992 125.0000000 104.0886298 - 127 6 5 1992 123.0000000 100.3748756 - 128 7 5 1992 113.0000000 97.0378429 - 129 8 5 1992 77.0000000 93.9946258 - 130 9 5 1992 83.0000000 91.4104683 - 131 10 5 1992 83.0000000 100.2739262 - 132 11 5 1992 96.0000000 99.8168477 - 133 12 5 1992 120.0000000 89.9655260 - 134 13 5 1992 80.0000000 85.9666314 - 135 14 5 1992 76.0000000 83.6879150 - 136 15 5 1992 69.0000000 81.6411037 - 137 16 5 1992 63.0000000 79.7387263 - 138 17 5 1992 61.0000000 77.9653958 - 139 18 5 1992 60.0000000 76.3076279 - 140 19 5 1992 59.0000000 74.7535756 - 141 20 5 1992 67.0000000 73.2928544 - 142 21 5 1992 51.0000000 71.9195046 - 143 22 5 1992 44.0000000 70.6234396 - 144 23 5 1992 42.0000000 69.3909759 - 145 24 5 1992 51.0000000 68.2292909 - 146 25 5 1992 42.0000000 67.5257400 - 147 26 5 1992 54.0000000 76.5141828 - 148 27 5 1992 53.0000000 70.7644295 - 149 28 5 1992 59.0000000 65.5287847 - 150 29 5 1992 55.0000000 72.3937586 - 151 30 5 1992 54.0000000 74.3553163 - 152 31 5 1992 48.0000000 66.6795834 - 153 1 6 1992 63.0000000 69.6557612 - 154 2 6 1992 61.0000000 70.9205133 - 155 3 6 1992 55.0000000 68.8425146 - 156 4 6 1992 75.0000000 82.2330697 - 157 5 6 1992 53.0000000 100.8288589 - 158 6 6 1992 77.0000000 95.4648987 - 159 7 6 1992 114.0000000 91.4872718 - 160 8 6 1992 167.0000000 101.6262742 - 161 9 6 1992 116.0000000 93.4866374 - 162 10 6 1992 91.0000000 82.2750876 - 163 11 6 1992 85.0000000 79.4309937 - 164 12 6 1992 68.0000000 76.8987067 - 165 13 6 1992 71.0000000 74.6196295 - 166 14 6 1992 63.0000000 72.5243653 - 167 15 6 1992 59.0000000 70.5927981 - 168 16 6 1992 46.0000000 68.8064705 - 169 17 6 1992 44.0000000 67.1493474 - 170 18 6 1992 39.0000000 65.6074599 - 171 19 6 1992 41.0000000 64.1768288 - 172 20 6 1992 44.0000000 64.8965699 - 173 21 6 1992 39.0000000 63.6918127 - 174 22 6 1992 32.0000000 60.9668865 - 175 23 6 1992 40.0000000 62.1120474 - 176 24 6 1992 41.0000000 73.0281809 - 177 25 6 1992 42.0000000 70.4903991 - 178 26 6 1992 42.0000000 62.4267566 - 179 27 6 1992 48.0000000 59.5572039 - 180 28 6 1992 37.0000000 58.3098354 - 181 29 6 1992 40.0000000 57.1854449 - 182 30 6 1992 29.0000000 56.1331486 - 183 1 7 1992 30.0000000 55.8126944 - 184 2 7 1992 36.0000000 54.9356308 - 185 3 7 1992 29.0000000 55.9972353 - 186 4 7 1992 36.0000000 70.2249390 - 187 5 7 1992 50.0000000 85.9133184 - 188 6 7 1992 78.0000000 89.5858483 - 189 7 7 1992 54.0000000 74.5856531 - 190 8 7 1992 57.0000000 62.2427257 - 191 9 7 1992 51.0000000 60.4112477 - 192 10 7 1992 47.0000000 74.4404412 - 193 11 7 1992 46.0000000 96.7952660 - 194 12 7 1992 76.0000000 91.2891648 - 195 13 7 1992 72.0000000 82.2096747 - 196 14 7 1992 67.0000000 71.8687296 - 197 15 7 1992 63.0000000 69.0075894 - 198 16 7 1992 47.0000000 66.6941389 - 199 17 7 1992 47.0000000 64.5797940 - 200 18 7 1992 42.0000000 62.6412849 - 201 19 7 1992 41.0000000 60.8584775 - 202 20 7 1992 39.0000000 59.2138952 - 203 21 7 1992 37.0000000 57.9141818 - 204 22 7 1992 33.0000000 59.9317684 - 205 23 7 1992 33.0000000 56.4506636 - 206 24 7 1992 33.0000000 54.9207173 - 207 25 7 1992 37.0000000 53.7027553 - 208 26 7 1992 26.0000000 52.5588783 - 209 27 7 1992 24.0000000 51.4851788 - 210 28 7 1992 26.0000000 50.4748198 - 211 29 7 1992 29.0000000 49.5217326 - 212 30 7 1992 19.0000000 48.6205241 - 213 31 7 1992 22.0000000 48.6598564 - 214 1 8 1992 28.0000000 50.8615888 - 215 2 8 1992 35.0000000 46.9331627 - 216 3 8 1992 29.0000000 46.0096540 - 217 4 8 1992 36.0000000 45.2583204 - 218 5 8 1992 52.0000000 44.5417284 - 219 6 8 1992 74.0000000 43.8568139 - 220 7 8 1992 54.0000000 43.2008380 - 221 8 8 1992 57.0000000 42.5713492 - 222 9 8 1992 48.0000000 44.4086720 - 223 10 8 1992 47.0000000 44.3077070 - 224 11 8 1992 46.0000000 49.1696137 - 225 12 8 1992 75.0000000 52.6936027 - 226 13 8 1992 73.0000000 53.9753647 - 227 14 8 1992 66.0000000 54.7499444 - 228 15 8 1992 60.0000000 54.5083730 - 229 16 8 1992 47.0000000 42.8778102 - 230 17 8 1992 46.0000000 41.7789789 - 231 18 8 1992 42.0000000 41.0249188 - 232 19 8 1992 41.0000000 40.4848521 - 233 20 8 1992 40.0000000 46.6366290 - 234 21 8 1992 37.0000000 44.6431293 - 235 22 8 1992 32.0000000 41.0242777 - 236 23 8 1992 32.0000000 41.0572265 - 237 24 8 1992 32.0000000 38.8588131 - 238 25 8 1992 36.0000000 37.9826278 - 239 26 8 1992 27.0000000 37.3634273 - 240 27 8 1992 25.0000000 36.7779529 - 241 28 8 1992 25.0000000 36.7417968 - 242 29 8 1992 28.0000000 40.7387592 - 243 30 8 1992 20.0000000 57.9211271 - 244 31 8 1992 22.0000000 81.5928458 - 245 1 9 1992 49.0000000 104.9791123 - 246 2 9 1992 77.0000000 72.3793075 - 247 3 9 1992 67.0000000 67.8056741 - 248 4 9 1992 45.0000000 67.5829469 - 249 5 9 1992 44.0000000 63.2946926 - 250 6 9 1992 64.0000000 54.3831508 - 251 7 9 1992 52.0000000 51.8548172 - 252 8 9 1992 40.0000000 49.8330253 - 253 9 9 1992 30.0000000 48.0015126 - 254 10 9 1992 34.0000000 46.3368479 - 255 11 9 1992 32.0000000 44.9244322 - 256 12 9 1992 36.0000000 44.2002153 - 257 13 9 1992 28.0000000 42.6308127 - 258 14 9 1992 33.0000000 42.1339362 - 259 15 9 1992 35.0000000 45.1941122 - 260 16 9 1992 30.0000000 40.7336143 - 261 17 9 1992 32.0000000 39.5128928 - 262 18 9 1992 29.0000000 38.5310570 - 263 19 9 1992 30.0000000 38.2054770 - 264 20 9 1992 28.0000000 37.0509508 - 265 21 9 1992 29.0000000 36.1562102 - 266 22 9 1992 29.0000000 35.3994753 - 267 23 9 1992 27.0000000 34.7000585 - 268 24 9 1992 27.0000000 34.0362395 - 269 25 9 1992 23.0000000 33.4022240 - 270 26 9 1992 28.0000000 32.8024757 - 271 27 9 1992 25.0000000 32.2337660 - 272 28 9 1992 25.0000000 31.9040736 - 273 29 9 1992 27.0000000 36.6017328 - 274 30 9 1992 25.0000000 31.9382836 - 275 1 10 1992 27.0000000 31.5211673 - 276 2 10 1992 33.0000000 31.7726787 - 277 3 10 1992 29.0000000 36.2074004 - 278 4 10 1992 31.0000000 31.6109390 - 279 5 10 1992 25.0000000 42.9630661 - 280 6 10 1992 25.0000000 50.8161416 - 281 7 10 1992 36.0000000 42.3292810 - 282 8 10 1992 42.0000000 33.4904002 + 1 1 1 1992 140.0000000 106.5063248 + 2 2 1 1992 126.0000000 103.0863965 + 3 3 1 1992 117.0000000 100.4506958 + 4 4 1 1992 114.0000000 100.0148772 + 5 5 1 1992 108.0000000 97.5268099 + 6 6 1 1992 108.0000000 93.8464685 + 7 7 1 1992 101.0000000 91.2415306 + 8 8 1 1992 97.0000000 91.3018284 + 9 9 1 1992 89.0000000 97.8630724 + 10 10 1 1992 111.0000000 122.1312938 + 11 11 1 1992 135.0000000 113.6981192 + 12 12 1 1992 171.0000000 99.2769002 + 13 13 1 1992 125.0000000 96.0651834 + 14 14 1 1992 111.0000000 93.2173018 + 15 15 1 1992 100.0000000 90.6039049 + 16 16 1 1992 87.0000000 88.3087367 + 17 17 1 1992 75.0000000 86.0812048 + 18 18 1 1992 79.0000000 83.9950243 + 19 19 1 1992 70.0000000 87.4711378 + 20 20 1 1992 72.0000000 83.9868489 + 21 21 1 1992 87.0000000 82.1694239 + 22 22 1 1992 79.0000000 79.0489582 + 23 23 1 1992 71.0000000 77.3909405 + 24 24 1 1992 66.0000000 75.8375435 + 25 25 1 1992 67.0000000 74.3776052 + 26 26 1 1992 65.0000000 73.0017334 + 27 27 1 1992 59.0000000 71.7016397 + 28 28 1 1992 57.0000000 70.4741025 + 29 29 1 1992 54.0000000 69.4782380 + 30 30 1 1992 59.0000000 69.9797540 + 31 31 1 1992 57.0000000 73.7439791 + 32 1 2 1992 56.0000000 75.3972017 + 33 2 2 1992 54.0000000 72.9189767 + 34 3 2 1992 58.0000000 70.6669736 + 35 4 2 1992 63.0000000 100.0390839 + 36 5 2 1992 76.0000000 130.0244149 + 37 6 2 1992 250.0000000 125.6578361 + 38 7 2 1992 346.0000000 110.4084284 + 39 8 2 1992 241.0000000 102.5409194 + 40 9 2 1992 180.0000000 103.6405351 + 41 10 2 1992 164.0000000 111.6380232 + 42 11 2 1992 183.0000000 122.5059466 + 43 12 2 1992 215.0000000 137.7419078 + 44 13 2 1992 265.0000000 137.4301787 + 45 14 2 1992 287.0000000 146.4663524 + 46 15 2 1992 272.0000000 143.2570639 + 47 16 2 1992 253.0000000 163.1552396 + 48 17 2 1992 301.0000000 161.1982162 + 49 18 2 1992 275.0000000 141.8187346 + 50 19 2 1992 224.0000000 127.7256369 + 51 20 2 1992 194.0000000 117.4979032 + 52 21 2 1992 173.0000000 110.7925606 + 53 22 2 1992 157.0000000 105.6926995 + 54 23 2 1992 142.0000000 101.7312651 + 55 24 2 1992 133.0000000 99.6025717 + 56 25 2 1992 128.0000000 97.4538882 + 57 26 2 1992 125.0000000 93.3404961 + 58 27 2 1992 125.0000000 90.1507672 + 59 28 2 1992 110.0000000 87.2951565 + 60 29 2 1992 107.0000000 84.6742581 + 61 1 3 1992 97.0000000 82.3167738 + 62 2 3 1992 97.0000000 80.3474635 + 63 3 3 1992 86.0000000 82.5754559 + 64 4 3 1992 93.0000000 79.2421810 + 65 5 3 1992 86.0000000 77.0313975 + 66 6 3 1992 82.0000000 75.2304396 + 67 7 3 1992 80.0000000 73.4898256 + 68 8 3 1992 77.0000000 71.8574831 + 69 9 3 1992 73.0000000 70.3291308 + 70 10 3 1992 76.0000000 68.9632652 + 71 11 3 1992 68.0000000 67.7843271 + 72 12 3 1992 70.0000000 104.2768269 + 73 13 3 1992 116.0000000 149.2808669 + 74 14 3 1992 206.0000000 167.9712547 + 75 15 3 1992 433.0000000 189.8717117 + 76 16 3 1992 495.0000000 219.7594537 + 77 17 3 1992 331.0000000 193.9879623 + 78 18 3 1992 240.0000000 170.1973561 + 79 19 3 1992 215.0000000 150.8135506 + 80 20 3 1992 185.0000000 134.7466278 + 81 21 3 1992 185.0000000 128.4040383 + 82 22 3 1992 185.0000000 152.6696439 + 83 23 3 1992 213.0000000 228.7356554 + 84 24 3 1992 466.0000000 259.5259630 + 85 25 3 1992 580.0000000 281.5883661 + 86 26 3 1992 566.0000000 268.1735042 + 87 27 3 1992 487.0000000 242.6690783 + 88 28 3 1992 387.0000000 222.2943824 + 89 29 3 1992 311.0000000 202.9160079 + 90 30 3 1992 270.0000000 182.5759119 + 91 31 3 1992 246.0000000 166.1345591 + 92 1 4 1992 229.0000000 182.1372360 + 93 2 4 1992 222.0000000 181.2847274 + 94 3 4 1992 217.0000000 176.7938553 + 95 4 4 1992 208.0000000 227.4941258 + 96 5 4 1992 220.0000000 231.7608253 + 97 6 4 1992 210.0000000 206.8618852 + 98 7 4 1992 190.0000000 181.7313115 + 99 8 4 1992 173.0000000 161.3310209 + 100 9 4 1992 166.0000000 144.5134588 + 101 10 4 1992 133.0000000 131.0911417 + 102 11 4 1992 126.0000000 120.3196342 + 103 12 4 1992 124.0000000 112.7272945 + 104 13 4 1992 116.0000000 107.8947210 + 105 14 4 1992 112.0000000 107.9622851 + 106 15 4 1992 111.0000000 130.1470744 + 107 16 4 1992 137.0000000 146.9641908 + 108 17 4 1992 206.0000000 135.4762205 + 109 18 4 1992 176.0000000 134.5579104 + 110 19 4 1992 161.0000000 124.5484158 + 111 20 4 1992 161.0000000 117.8542520 + 112 21 4 1992 139.0000000 112.7794138 + 113 22 4 1992 139.0000000 108.4582746 + 114 23 4 1992 123.0000000 104.5508104 + 115 24 4 1992 119.0000000 100.9998214 + 116 25 4 1992 111.0000000 97.7639704 + 117 26 4 1992 94.0000000 94.8412245 + 118 27 4 1992 94.0000000 93.6318178 + 119 28 4 1992 102.0000000 99.8000264 + 120 29 4 1992 120.0000000 98.6691464 + 121 30 4 1992 120.0000000 95.0542072 + 122 1 5 1992 114.0000000 105.9640674 + 123 2 5 1992 115.0000000 136.9742757 + 124 3 5 1992 206.0000000 116.0007511 + 125 4 5 1992 215.0000000 108.6167169 + 126 5 5 1992 125.0000000 104.0886300 + 127 6 5 1992 123.0000000 100.3748759 + 128 7 5 1992 113.0000000 97.0378432 + 129 8 5 1992 77.0000000 93.9946260 + 130 9 5 1992 83.0000000 91.4104686 + 131 10 5 1992 83.0000000 100.2739264 + 132 11 5 1992 96.0000000 99.8168480 + 133 12 5 1992 120.0000000 89.9655263 + 134 13 5 1992 80.0000000 85.9666316 + 135 14 5 1992 76.0000000 83.6879152 + 136 15 5 1992 69.0000000 81.6411039 + 137 16 5 1992 63.0000000 79.7387265 + 138 17 5 1992 61.0000000 77.9653960 + 139 18 5 1992 60.0000000 76.3076281 + 140 19 5 1992 59.0000000 74.7535757 + 141 20 5 1992 67.0000000 73.2928546 + 142 21 5 1992 51.0000000 71.9195048 + 143 22 5 1992 44.0000000 70.6234398 + 144 23 5 1992 42.0000000 69.3909761 + 145 24 5 1992 51.0000000 68.2292910 + 146 25 5 1992 42.0000000 67.5257402 + 147 26 5 1992 54.0000000 76.5141830 + 148 27 5 1992 53.0000000 70.7644297 + 149 28 5 1992 59.0000000 65.5287849 + 150 29 5 1992 55.0000000 72.3937588 + 151 30 5 1992 54.0000000 74.3553165 + 152 31 5 1992 48.0000000 66.6795836 + 153 1 6 1992 63.0000000 69.6557614 + 154 2 6 1992 61.0000000 70.9205135 + 155 3 6 1992 55.0000000 68.8425148 + 156 4 6 1992 75.0000000 82.2330699 + 157 5 6 1992 53.0000000 100.8288592 + 158 6 6 1992 77.0000000 95.4648990 + 159 7 6 1992 114.0000000 91.4872720 + 160 8 6 1992 167.0000000 101.6262745 + 161 9 6 1992 116.0000000 93.4866376 + 162 10 6 1992 91.0000000 82.2750878 + 163 11 6 1992 85.0000000 79.4309939 + 164 12 6 1992 68.0000000 76.8987069 + 165 13 6 1992 71.0000000 74.6196297 + 166 14 6 1992 63.0000000 72.5243655 + 167 15 6 1992 59.0000000 70.5927983 + 168 16 6 1992 46.0000000 68.8064706 + 169 17 6 1992 44.0000000 67.1493476 + 170 18 6 1992 39.0000000 65.6074601 + 171 19 6 1992 41.0000000 64.1768290 + 172 20 6 1992 44.0000000 64.8965701 + 173 21 6 1992 39.0000000 63.6918128 + 174 22 6 1992 32.0000000 60.9668867 + 175 23 6 1992 40.0000000 62.1120475 + 176 24 6 1992 41.0000000 73.0281811 + 177 25 6 1992 42.0000000 70.4903993 + 178 26 6 1992 42.0000000 62.4267568 + 179 27 6 1992 48.0000000 59.5572040 + 180 28 6 1992 37.0000000 58.3098356 + 181 29 6 1992 40.0000000 57.1854451 + 182 30 6 1992 29.0000000 56.1331488 + 183 1 7 1992 30.0000000 55.8126945 + 184 2 7 1992 36.0000000 54.9356309 + 185 3 7 1992 29.0000000 55.9972354 + 186 4 7 1992 36.0000000 70.2249392 + 187 5 7 1992 50.0000000 85.9133186 + 188 6 7 1992 78.0000000 89.5858485 + 189 7 7 1992 54.0000000 74.5856533 + 190 8 7 1992 57.0000000 62.2427259 + 191 9 7 1992 51.0000000 60.4112478 + 192 10 7 1992 47.0000000 74.4404414 + 193 11 7 1992 46.0000000 96.7952663 + 194 12 7 1992 76.0000000 91.2891651 + 195 13 7 1992 72.0000000 82.2096749 + 196 14 7 1992 67.0000000 71.8687298 + 197 15 7 1992 63.0000000 69.0075896 + 198 16 7 1992 47.0000000 66.6941390 + 199 17 7 1992 47.0000000 64.5797942 + 200 18 7 1992 42.0000000 62.6412851 + 201 19 7 1992 41.0000000 60.8584777 + 202 20 7 1992 39.0000000 59.2138953 + 203 21 7 1992 37.0000000 57.9141819 + 204 22 7 1992 33.0000000 59.9317685 + 205 23 7 1992 33.0000000 56.4506637 + 206 24 7 1992 33.0000000 54.9207174 + 207 25 7 1992 37.0000000 53.7027554 + 208 26 7 1992 26.0000000 52.5588785 + 209 27 7 1992 24.0000000 51.4851789 + 210 28 7 1992 26.0000000 50.4748200 + 211 29 7 1992 29.0000000 49.5217327 + 212 30 7 1992 19.0000000 48.6205243 + 213 31 7 1992 22.0000000 48.6598565 + 214 1 8 1992 28.0000000 50.8615889 + 215 2 8 1992 35.0000000 46.9331628 + 216 3 8 1992 29.0000000 46.0096541 + 217 4 8 1992 36.0000000 45.2583205 + 218 5 8 1992 52.0000000 44.5417286 + 219 6 8 1992 74.0000000 43.8568140 + 220 7 8 1992 54.0000000 43.2008381 + 221 8 8 1992 57.0000000 42.5713493 + 222 9 8 1992 48.0000000 44.4086721 + 223 10 8 1992 47.0000000 44.3077071 + 224 11 8 1992 46.0000000 49.1696138 + 225 12 8 1992 75.0000000 52.6936029 + 226 13 8 1992 73.0000000 53.9753648 + 227 14 8 1992 66.0000000 54.7499446 + 228 15 8 1992 60.0000000 54.5083731 + 229 16 8 1992 47.0000000 42.8778103 + 230 17 8 1992 46.0000000 41.7789790 + 231 18 8 1992 42.0000000 41.0249189 + 232 19 8 1992 41.0000000 40.4848522 + 233 20 8 1992 40.0000000 46.6366291 + 234 21 8 1992 37.0000000 44.6431294 + 235 22 8 1992 32.0000000 41.0242778 + 236 23 8 1992 32.0000000 41.0572266 + 237 24 8 1992 32.0000000 38.8588132 + 238 25 8 1992 36.0000000 37.9826279 + 239 26 8 1992 27.0000000 37.3634274 + 240 27 8 1992 25.0000000 36.7779530 + 241 28 8 1992 25.0000000 36.7417969 + 242 29 8 1992 28.0000000 40.7387593 + 243 30 8 1992 20.0000000 57.9211273 + 244 31 8 1992 22.0000000 81.5928460 + 245 1 9 1992 49.0000000 104.9791126 + 246 2 9 1992 77.0000000 72.3793077 + 247 3 9 1992 67.0000000 67.8056742 + 248 4 9 1992 45.0000000 67.5829471 + 249 5 9 1992 44.0000000 63.2946928 + 250 6 9 1992 64.0000000 54.3831509 + 251 7 9 1992 52.0000000 51.8548173 + 252 8 9 1992 40.0000000 49.8330254 + 253 9 9 1992 30.0000000 48.0015127 + 254 10 9 1992 34.0000000 46.3368480 + 255 11 9 1992 32.0000000 44.9244323 + 256 12 9 1992 36.0000000 44.2002154 + 257 13 9 1992 28.0000000 42.6308128 + 258 14 9 1992 33.0000000 42.1339363 + 259 15 9 1992 35.0000000 45.1941123 + 260 16 9 1992 30.0000000 40.7336144 + 261 17 9 1992 32.0000000 39.5128929 + 262 18 9 1992 29.0000000 38.5310571 + 263 19 9 1992 30.0000000 38.2054771 + 264 20 9 1992 28.0000000 37.0509509 + 265 21 9 1992 29.0000000 36.1562103 + 266 22 9 1992 29.0000000 35.3994754 + 267 23 9 1992 27.0000000 34.7000586 + 268 24 9 1992 27.0000000 34.0362396 + 269 25 9 1992 23.0000000 33.4022241 + 270 26 9 1992 28.0000000 32.8024758 + 271 27 9 1992 25.0000000 32.2337661 + 272 28 9 1992 25.0000000 31.9040737 + 273 29 9 1992 27.0000000 36.6017329 + 274 30 9 1992 25.0000000 31.9382837 + 275 1 10 1992 27.0000000 31.5211674 + 276 2 10 1992 33.0000000 31.7726788 + 277 3 10 1992 29.0000000 36.2074005 + 278 4 10 1992 31.0000000 31.6109391 + 279 5 10 1992 25.0000000 42.9630662 + 280 6 10 1992 25.0000000 50.8161418 + 281 7 10 1992 36.0000000 42.3292811 + 282 8 10 1992 42.0000000 33.4904003 283 9 10 1992 43.0000000 32.9962780 - 284 10 10 1992 26.0000000 40.0208052 - 285 11 10 1992 27.0000000 41.0091469 - 286 12 10 1992 27.0000000 34.4135121 - 287 13 10 1992 26.0000000 33.3615449 - 288 14 10 1992 26.0000000 32.6560512 - 289 15 10 1992 23.0000000 41.1100333 - 290 16 10 1992 21.0000000 48.7824702 - 291 17 10 1992 26.0000000 37.4533147 - 292 18 10 1992 34.0000000 42.9128697 - 293 19 10 1992 37.0000000 37.4409313 - 294 20 10 1992 31.0000000 44.1394064 - 295 21 10 1992 31.0000000 45.2112780 - 296 22 10 1992 35.0000000 43.9976083 - 297 23 10 1992 33.0000000 58.9864543 - 298 24 10 1992 40.0000000 124.1328147 - 299 25 10 1992 74.0000000 160.8899851 - 300 26 10 1992 161.0000000 184.1121805 - 301 27 10 1992 285.0000000 188.4909983 - 302 28 10 1992 244.0000000 207.2488329 - 303 29 10 1992 263.0000000 231.0449199 - 304 30 10 1992 276.0000000 202.5067340 - 305 31 10 1992 186.0000000 170.1148371 - 306 1 11 1992 154.0000000 146.9069183 - 307 2 11 1992 112.0000000 143.5856501 - 308 3 11 1992 104.0000000 147.4141306 - 309 4 11 1992 96.0000000 144.0157251 - 310 5 11 1992 99.0000000 128.0449817 - 311 6 11 1992 126.0000000 112.3368952 - 312 7 11 1992 91.0000000 101.0316487 - 313 8 11 1992 84.0000000 95.3200843 - 314 9 11 1992 81.0000000 98.1233850 - 315 10 11 1992 85.0000000 119.9242741 - 316 11 11 1992 126.0000000 197.9349593 - 317 12 11 1992 279.0000000 253.0296430 - 318 13 11 1992 390.0000000 271.6664035 - 319 14 11 1992 294.0000000 275.6005564 - 320 15 11 1992 260.0000000 324.4870536 - 321 16 11 1992 398.0000000 470.1410455 - 322 17 11 1992 520.0000000 489.2145703 - 323 18 11 1992 487.0000000 448.2871859 - 324 19 11 1992 380.0000000 463.9776678 - 325 20 11 1992 385.0000000 413.6096442 - 326 21 11 1992 351.0000000 391.7731812 - 327 22 11 1992 309.0000000 490.7316505 - 328 23 11 1992 587.0000000 435.0755840 - 329 24 11 1992 661.0000000 369.4546439 - 330 25 11 1992 447.0000000 346.0393057 - 331 26 11 1992 361.0000000 373.4790563 - 332 27 11 1992 351.0000000 365.6931597 - 333 28 11 1992 353.0000000 372.8558002 - 334 29 11 1992 369.0000000 454.2617728 - 335 30 11 1992 452.0000000 478.3085317 - 336 1 12 1992 441.0000000 406.0848307 - 337 2 12 1992 348.0000000 401.7079970 - 338 3 12 1992 394.0000000 458.0508056 - 339 4 12 1992 455.0000000 477.8084226 - 340 5 12 1992 491.0000000 538.2496192 - 341 6 12 1992 469.0000000 480.6315710 - 342 7 12 1992 364.0000000 460.6904155 - 343 8 12 1992 338.0000000 415.7504551 - 344 9 12 1992 334.0000000 352.0338417 - 345 10 12 1992 268.0000000 295.1434737 - 346 11 12 1992 236.0000000 278.0183306 - 347 12 12 1992 230.0000000 287.2880716 - 348 13 12 1992 239.0000000 269.8926951 - 349 14 12 1992 256.0000000 231.3427171 - 350 15 12 1992 217.0000000 205.5110838 - 351 16 12 1992 201.0000000 191.3780939 - 352 17 12 1992 188.0000000 181.7244768 - 353 18 12 1992 176.0000000 174.5791000 - 354 19 12 1992 170.0000000 163.2334223 - 355 20 12 1992 168.0000000 158.5520347 - 356 21 12 1992 131.0000000 160.5230609 - 357 22 12 1992 133.0000000 165.4215481 - 358 23 12 1992 134.0000000 154.0693156 - 359 24 12 1992 127.0000000 145.5322823 - 360 25 12 1992 117.0000000 138.6180355 - 361 26 12 1992 113.0000000 132.4336384 - 362 27 12 1992 100.0000000 126.8806189 - 363 28 12 1992 94.0000000 121.8767670 - 364 29 12 1992 87.0000000 117.3520885 - 365 30 12 1992 86.0000000 113.2467641 - 366 31 12 1992 81.0000000 109.5094890 - 367 1 1 1993 77.0000000 106.0961131 - 368 2 1 1993 76.0000000 102.9685231 - 369 3 1 1993 61.0000000 100.0937186 - 370 4 1 1993 61.0000000 97.4430452 - 371 5 1 1993 57.0000000 94.9915557 - 372 6 1 1993 66.0000000 106.4317251 - 373 7 1 1993 67.0000000 128.4943638 - 374 8 1 1993 84.0000000 132.5024429 - 375 9 1 1993 90.0000000 142.8992842 - 376 10 1 1993 113.0000000 175.9550074 - 377 11 1 1993 265.0000000 328.4723783 - 378 12 1 1993 559.0000000 533.1629376 - 379 13 1 1993 832.0000000 559.4519078 - 380 14 1 1993 601.0000000 500.1575921 - 381 15 1 1993 436.0000000 412.3594988 - 382 16 1 1993 339.0000000 340.1439828 - 383 17 1 1993 292.0000000 288.2787774 - 384 18 1 1993 247.0000000 252.8659005 - 385 19 1 1993 218.0000000 225.8142586 - 386 20 1 1993 205.0000000 204.7597986 - 387 21 1 1993 190.0000000 191.4786502 - 388 22 1 1993 176.0000000 183.5315667 - 389 23 1 1993 173.0000000 178.4508021 - 390 24 1 1993 173.0000000 200.2793049 - 391 25 1 1993 199.0000000 310.6660213 - 392 26 1 1993 361.0000000 297.6874323 - 393 27 1 1993 295.0000000 279.9567573 - 394 28 1 1993 238.0000000 305.9057223 - 395 29 1 1993 263.0000000 295.6940318 - 396 30 1 1993 245.0000000 266.8638786 - 397 31 1 1993 222.0000000 233.3870902 - 398 1 2 1993 199.0000000 207.9121085 - 399 2 2 1993 186.0000000 187.7738076 - 400 3 2 1993 171.0000000 171.8852172 - 401 4 2 1993 157.0000000 160.1667744 - 402 5 2 1993 159.0000000 151.4758548 - 403 6 2 1993 129.0000000 144.3919433 - 404 7 2 1993 119.0000000 138.4897805 - 405 8 2 1993 119.0000000 133.0339773 - 406 9 2 1993 105.0000000 128.0590565 - 407 10 2 1993 106.0000000 123.5492494 - 408 11 2 1993 105.0000000 119.4470217 - 409 12 2 1993 95.0000000 115.7029823 - 410 13 2 1993 91.0000000 112.2745907 - 411 14 2 1993 88.0000000 109.1250892 - 412 15 2 1993 84.0000000 106.2226201 - 413 16 2 1993 83.0000000 103.7692447 - 414 17 2 1993 79.0000000 102.9348329 - 415 18 2 1993 78.0000000 105.5598108 - 416 19 2 1993 84.0000000 103.9991765 - 417 20 2 1993 91.0000000 114.7101000 - 418 21 2 1993 91.0000000 123.7612673 - 419 22 2 1993 90.0000000 122.1108518 - 420 23 2 1993 103.0000000 118.0400249 - 421 24 2 1993 94.0000000 112.9294141 - 422 25 2 1993 81.0000000 109.0279297 - 423 26 2 1993 78.0000000 105.6132473 - 424 27 2 1993 75.0000000 105.1433477 - 425 28 2 1993 76.0000000 106.0287455 - 426 1 3 1993 80.0000000 102.0468760 - 427 2 3 1993 75.0000000 100.1226348 - 428 3 3 1993 76.0000000 99.1444865 - 429 4 3 1993 72.0000000 96.3303174 - 430 5 3 1993 65.0000000 93.7884111 - 431 6 3 1993 64.0000000 91.4985266 - 432 7 3 1993 64.0000000 89.4005740 - 433 8 3 1993 68.0000000 89.0096446 - 434 9 3 1993 68.0000000 86.8360577 - 435 10 3 1993 67.0000000 85.7665353 - 436 11 3 1993 61.0000000 86.6021967 - 437 12 3 1993 57.0000000 87.5366869 - 438 13 3 1993 58.0000000 86.7790760 - 439 14 3 1993 54.0000000 84.5414796 - 440 15 3 1993 66.0000000 82.7723251 - 441 16 3 1993 54.0000000 81.1792559 - 442 17 3 1993 57.0000000 79.6974350 - 443 18 3 1993 57.0000000 78.3415471 - 444 19 3 1993 52.0000000 77.0282956 - 445 20 3 1993 57.0000000 75.7391724 - 446 21 3 1993 58.0000000 74.7727649 - 447 22 3 1993 57.0000000 85.0770404 - 448 23 3 1993 56.0000000 99.3570130 - 449 24 3 1993 63.0000000 87.4131836 - 450 25 3 1993 76.0000000 84.7731328 - 451 26 3 1993 56.0000000 82.6926922 - 452 27 3 1993 59.0000000 80.7575974 - 453 28 3 1993 59.0000000 78.9526380 - 454 29 3 1993 54.0000000 77.2644453 - 455 30 3 1993 48.0000000 75.6812410 - 456 31 3 1993 55.0000000 74.1926247 - 457 1 4 1993 48.0000000 73.1495511 - 458 2 4 1993 53.0000000 76.8413589 - 459 3 4 1993 47.0000000 76.3505338 - 460 4 4 1993 59.0000000 81.0862809 - 461 5 4 1993 53.0000000 98.0023837 - 462 6 4 1993 64.0000000 103.1809894 - 463 7 4 1993 63.0000000 91.8914877 - 464 8 4 1993 75.0000000 90.2107524 - 465 9 4 1993 64.0000000 86.8243483 - 466 10 4 1993 59.0000000 86.1983312 - 467 11 4 1993 60.0000000 93.8991617 - 468 12 4 1993 63.0000000 92.6649006 - 469 13 4 1993 69.0000000 90.6624647 - 470 14 4 1993 79.0000000 90.1596597 - 471 15 4 1993 82.0000000 86.9275082 - 472 16 4 1993 68.0000000 84.7689615 - 473 17 4 1993 56.0000000 82.6508792 - 474 18 4 1993 59.0000000 80.2925376 - 475 19 4 1993 61.0000000 78.1489387 - 476 20 4 1993 62.0000000 76.1082572 - 477 21 4 1993 57.0000000 74.2159589 - 478 22 4 1993 53.0000000 72.4610859 - 479 23 4 1993 47.0000000 70.8275086 - 480 24 4 1993 46.0000000 69.2954177 - 481 25 4 1993 47.0000000 67.8597457 - 482 26 4 1993 45.0000000 66.5109034 - 483 27 4 1993 43.0000000 65.2403658 - 484 28 4 1993 41.0000000 64.0407572 - 485 29 4 1993 38.0000000 62.9216113 - 486 30 4 1993 39.0000000 62.3250934 - 487 1 5 1993 40.0000000 61.3199177 - 488 2 5 1993 41.0000000 61.5676588 - 489 3 5 1993 45.0000000 61.8345215 - 490 4 5 1993 49.0000000 59.7651022 - 491 5 5 1993 40.0000000 58.6725268 - 492 6 5 1993 43.0000000 57.8746867 - 493 7 5 1993 38.0000000 57.5398896 - 494 8 5 1993 38.0000000 57.6164858 - 495 9 5 1993 43.0000000 55.8834719 - 496 10 5 1993 44.0000000 56.4171670 - 497 11 5 1993 41.0000000 56.1534896 - 498 12 5 1993 51.0000000 62.9016507 - 499 13 5 1993 63.0000000 98.1487530 - 500 14 5 1993 68.0000000 81.2117833 - 501 15 5 1993 77.0000000 64.9097583 - 502 16 5 1993 77.0000000 62.8919984 - 503 17 5 1993 59.0000000 61.1914573 - 504 18 5 1993 49.0000000 59.6397909 - 505 19 5 1993 43.0000000 64.0800308 - 506 20 5 1993 44.0000000 69.0395397 - 507 21 5 1993 48.0000000 72.7217471 - 508 22 5 1993 44.0000000 62.1096217 - 509 23 5 1993 46.0000000 60.0566643 - 510 24 5 1993 40.0000000 58.5283220 - 511 25 5 1993 43.0000000 57.1137787 - 512 26 5 1993 30.0000000 56.5800932 - 513 27 5 1993 45.0000000 63.0154970 - 514 28 5 1993 43.0000000 72.3037647 - 515 29 5 1993 44.0000000 64.4727532 - 516 30 5 1993 54.0000000 63.1573542 - 517 31 5 1993 56.0000000 65.9852242 - 518 1 6 1993 44.0000000 58.5236944 - 519 2 6 1993 43.0000000 58.1216046 - 520 3 6 1993 33.0000000 64.1347591 - 521 4 6 1993 45.0000000 60.2113428 - 522 5 6 1993 46.0000000 56.6161272 - 523 6 6 1993 42.0000000 55.0361934 - 524 7 6 1993 40.0000000 53.6953958 - 525 8 6 1993 30.0000000 52.4494327 - 526 9 6 1993 31.0000000 51.3174664 - 527 10 6 1993 32.0000000 50.6610292 - 528 11 6 1993 25.0000000 49.9264543 - 529 12 6 1993 33.0000000 52.1188540 - 530 13 6 1993 29.0000000 50.1609402 - 531 14 6 1993 40.0000000 50.9911403 - 532 15 6 1993 42.0000000 53.9426068 - 533 16 6 1993 37.0000000 51.0289098 - 534 17 6 1993 46.0000000 50.2721370 - 535 18 6 1993 47.0000000 48.1066946 - 536 19 6 1993 50.0000000 47.4816603 - 537 20 6 1993 43.0000000 69.4893282 - 538 21 6 1993 69.0000000 76.4214806 - 539 22 6 1993 61.0000000 62.2293304 - 540 23 6 1993 67.0000000 94.0519850 - 541 24 6 1993 77.0000000 69.7749093 - 542 25 6 1993 87.0000000 65.5568730 - 543 26 6 1993 55.0000000 62.9902412 - 544 27 6 1993 43.0000000 60.7233511 - 545 28 6 1993 40.0000000 58.6615428 - 546 29 6 1993 30.0000000 56.7797114 - 547 30 6 1993 40.0000000 55.0563513 - 548 1 7 1993 40.0000000 54.1820588 - 549 2 7 1993 27.0000000 56.4745808 - 550 3 7 1993 34.0000000 52.4462855 - 551 4 7 1993 30.0000000 50.8851776 - 552 5 7 1993 31.0000000 49.6765909 - 553 6 7 1993 27.0000000 48.3924253 - 554 7 7 1993 31.0000000 47.2433729 - 555 8 7 1993 26.0000000 46.1899483 - 556 9 7 1993 23.0000000 45.3374602 - 557 10 7 1993 24.0000000 46.6654129 - 558 11 7 1993 25.0000000 46.7979421 - 559 12 7 1993 34.0000000 60.4396159 - 560 13 7 1993 40.0000000 61.3461685 - 561 14 7 1993 41.0000000 72.5596105 - 562 15 7 1993 46.0000000 72.5531894 - 563 16 7 1993 39.0000000 53.3195243 - 564 17 7 1993 43.0000000 51.6061235 - 565 18 7 1993 35.0000000 50.9272672 - 566 19 7 1993 49.0000000 65.9678154 - 567 20 7 1993 38.0000000 71.8569355 - 568 21 7 1993 41.0000000 62.8560764 - 569 22 7 1993 45.0000000 64.1628568 - 570 23 7 1993 41.0000000 54.8360946 - 571 24 7 1993 42.0000000 52.8369827 - 572 25 7 1993 40.0000000 51.2807133 - 573 26 7 1993 35.0000000 49.8094453 - 574 27 7 1993 40.0000000 70.7658205 - 575 28 7 1993 40.0000000 67.5449720 - 576 29 7 1993 36.0000000 52.8435817 - 577 30 7 1993 40.0000000 91.2574482 - 578 31 7 1993 61.0000000 106.6482125 - 579 1 8 1993 36.0000000 67.6062564 - 580 2 8 1993 46.0000000 63.8495045 - 581 3 8 1993 32.0000000 60.9886540 - 582 4 8 1993 38.0000000 58.4148650 - 583 5 8 1993 32.0000000 56.0918802 - 584 6 8 1993 25.0000000 54.0020380 - 585 7 8 1993 26.0000000 52.0922530 - 586 8 8 1993 29.0000000 50.3484230 - 587 9 8 1993 29.0000000 54.8917137 - 588 10 8 1993 28.0000000 60.6657554 - 589 11 8 1993 37.0000000 54.6439218 - 590 12 8 1993 40.0000000 49.2683567 - 591 13 8 1993 49.0000000 47.5347037 - 592 14 8 1993 32.0000000 48.2359115 - 593 15 8 1993 37.0000000 46.7932763 - 594 16 8 1993 37.0000000 44.6635972 - 595 17 8 1993 27.0000000 43.4729291 - 596 18 8 1993 24.0000000 42.3848484 - 597 19 8 1993 24.0000000 41.3732814 - 598 20 8 1993 22.0000000 40.4302777 - 599 21 8 1993 21.0000000 39.5488330 - 600 22 8 1993 16.0000000 38.8713173 - 601 23 8 1993 21.0000000 43.6847030 - 602 24 8 1993 27.0000000 41.6125426 - 603 25 8 1993 26.0000000 38.0694335 - 604 26 8 1993 23.0000000 37.2085349 - 605 27 8 1993 21.0000000 37.0298595 - 606 28 8 1993 28.0000000 43.7256032 - 607 29 8 1993 17.0000000 37.0619068 - 608 30 8 1993 24.0000000 36.0418497 - 609 31 8 1993 25.0000000 35.3812001 - 610 1 9 1993 25.0000000 34.7549456 - 611 2 9 1993 19.0000000 34.1600019 - 612 3 9 1993 17.0000000 34.1989697 - 613 4 9 1993 16.0000000 43.1556384 - 614 5 9 1993 19.0000000 36.0120181 - 615 6 9 1993 23.0000000 34.0096480 - 616 7 9 1993 25.0000000 53.0459516 - 617 8 9 1993 34.0000000 51.6840501 - 618 9 9 1993 31.0000000 55.1336749 - 619 10 9 1993 35.0000000 91.4586655 - 620 11 9 1993 53.0000000 109.5215837 - 621 12 9 1993 71.0000000 123.7538603 - 622 13 9 1993 74.0000000 139.4915640 - 623 14 9 1993 87.0000000 180.8010772 - 624 15 9 1993 173.0000000 170.4688008 - 625 16 9 1993 117.0000000 142.8604386 - 626 17 9 1993 93.0000000 121.0970133 - 627 18 9 1993 77.0000000 109.7218568 - 628 19 9 1993 62.0000000 100.8553793 - 629 20 9 1993 54.0000000 93.5500862 - 630 21 9 1993 48.0000000 90.0220042 - 631 22 9 1993 46.0000000 104.9082185 - 632 23 9 1993 55.0000000 120.6715547 - 633 24 9 1993 66.0000000 120.0835491 - 634 25 9 1993 64.0000000 120.7186291 - 635 26 9 1993 52.0000000 110.0483616 - 636 27 9 1993 68.0000000 98.6153260 - 637 28 9 1993 69.0000000 100.4092508 - 638 29 9 1993 62.0000000 103.1804986 - 639 30 9 1993 76.0000000 92.7421070 - 640 1 10 1993 72.0000000 112.2459861 - 641 2 10 1993 68.0000000 122.5899695 - 642 3 10 1993 72.0000000 116.2548453 - 643 4 10 1993 78.0000000 123.8298341 - 644 5 10 1993 116.0000000 176.7225051 - 645 6 10 1993 131.0000000 215.3401288 - 646 7 10 1993 180.0000000 193.3515230 - 647 8 10 1993 203.0000000 183.3150600 - 648 9 10 1993 164.0000000 200.5592411 - 649 10 10 1993 178.0000000 201.9760009 - 650 11 10 1993 161.0000000 254.4433566 - 651 12 10 1993 287.0000000 247.2602559 - 652 13 10 1993 360.0000000 314.9291994 - 653 14 10 1993 374.0000000 343.1328737 - 654 15 10 1993 297.0000000 303.2600326 - 655 16 10 1993 247.0000000 290.5000492 - 656 17 10 1993 273.0000000 304.8553672 - 657 18 10 1993 261.0000000 277.1682503 - 658 19 10 1993 265.0000000 247.5597185 - 659 20 10 1993 230.0000000 213.1440116 - 660 21 10 1993 199.0000000 186.2322097 - 661 22 10 1993 173.0000000 173.1926267 - 662 23 10 1993 182.0000000 187.0852818 - 663 24 10 1993 203.0000000 203.9065999 - 664 25 10 1993 213.0000000 182.3480039 - 665 26 10 1993 180.0000000 159.8580248 - 666 27 10 1993 154.0000000 143.1960398 - 667 28 10 1993 118.0000000 132.0504818 - 668 29 10 1993 112.0000000 123.9867356 - 669 30 10 1993 98.0000000 117.1490132 - 670 31 10 1993 97.0000000 111.1112071 - 671 1 11 1993 91.0000000 105.7193282 - 672 2 11 1993 85.0000000 100.8873581 - 673 3 11 1993 75.0000000 96.5423757 - 674 4 11 1993 76.0000000 92.6223076 - 675 5 11 1993 78.0000000 89.0741106 - 676 6 11 1993 72.0000000 85.9030002 - 677 7 11 1993 76.0000000 85.6259107 - 678 8 11 1993 69.0000000 83.5533131 - 679 9 11 1993 66.0000000 81.2155380 - 680 10 11 1993 71.0000000 80.1228709 - 681 11 11 1993 64.0000000 86.0384673 - 682 12 11 1993 67.0000000 97.7644836 - 683 13 11 1993 80.0000000 95.1783552 - 684 14 11 1993 78.0000000 116.3260067 - 685 15 11 1993 80.0000000 131.9125873 - 686 16 11 1993 86.0000000 124.3110800 - 687 17 11 1993 125.0000000 113.8774493 - 688 18 11 1993 96.0000000 107.7991061 - 689 19 11 1993 82.0000000 102.6370548 - 690 20 11 1993 77.0000000 98.0362830 - 691 21 11 1993 67.0000000 93.8974684 - 692 22 11 1993 71.0000000 90.1614146 - 693 23 11 1993 61.0000000 86.7776480 - 694 24 11 1993 42.0000000 83.7029530 - 695 25 11 1993 63.0000000 80.9108527 - 696 26 11 1993 57.0000000 79.8923062 - 697 27 11 1993 58.0000000 77.1995240 - 698 28 11 1993 49.0000000 74.9235781 - 699 29 11 1993 50.0000000 72.8664182 - 700 30 11 1993 55.0000000 70.9632570 - 701 1 12 1993 54.0000000 69.1976727 - 702 2 12 1993 54.0000000 73.8349834 - 703 3 12 1993 50.0000000 74.4285128 - 704 4 12 1993 51.0000000 74.6761360 - 705 5 12 1993 62.0000000 72.2169137 - 706 6 12 1993 62.0000000 69.5167068 - 707 7 12 1993 71.0000000 94.6233878 - 708 8 12 1993 79.0000000 147.3901050 - 709 9 12 1993 153.0000000 188.9636525 - 710 10 12 1993 291.0000000 222.1665595 - 711 11 12 1993 332.0000000 322.7363465 - 712 12 12 1993 465.0000000 381.0395948 - 713 13 12 1993 518.0000000 439.1672858 - 714 14 12 1993 539.0000000 484.5065022 - 715 15 12 1993 559.0000000 471.9612373 - 716 16 12 1993 500.0000000 538.5773629 - 717 17 12 1993 526.0000000 568.5169256 - 718 18 12 1993 583.0000000 599.6017026 - 719 19 12 1993 677.0000000 623.1634080 - 720 20 12 1993 781.0000000 909.1655598 - 721 21 12 1993 1180.0000000 1110.6116137 - 722 22 12 1993 1460.0000000 1093.4319762 - 723 23 12 1993 1600.0000000 1135.1732318 - 724 24 12 1993 1410.0000000 1164.5301010 - 725 25 12 1993 1230.0000000 1037.0395396 - 726 26 12 1993 1070.0000000 845.9114222 - 727 27 12 1993 746.0000000 692.6352534 - 728 28 12 1993 542.0000000 583.1046211 - 729 29 12 1993 492.0000000 539.0547847 - 730 30 12 1993 491.0000000 588.7355810 - 731 31 12 1993 617.0000000 720.9219791 + 284 10 10 1992 26.0000000 40.0208053 + 285 11 10 1992 27.0000000 41.0091470 + 286 12 10 1992 27.0000000 34.4135122 + 287 13 10 1992 26.0000000 33.3615450 + 288 14 10 1992 26.0000000 32.6560513 + 289 15 10 1992 23.0000000 41.1100334 + 290 16 10 1992 21.0000000 48.7824703 + 291 17 10 1992 26.0000000 37.4533148 + 292 18 10 1992 34.0000000 42.9128698 + 293 19 10 1992 37.0000000 37.4409314 + 294 20 10 1992 31.0000000 44.1394065 + 295 21 10 1992 31.0000000 45.2112782 + 296 22 10 1992 35.0000000 43.9976084 + 297 23 10 1992 33.0000000 58.9864544 + 298 24 10 1992 40.0000000 124.1328150 + 299 25 10 1992 74.0000000 160.8899855 + 300 26 10 1992 161.0000000 184.1121810 + 301 27 10 1992 285.0000000 188.4909988 + 302 28 10 1992 244.0000000 207.2488334 + 303 29 10 1992 263.0000000 231.0449205 + 304 30 10 1992 276.0000000 202.5067345 + 305 31 10 1992 186.0000000 170.1148376 + 306 1 11 1992 154.0000000 146.9069187 + 307 2 11 1992 112.0000000 143.5856505 + 308 3 11 1992 104.0000000 147.4141310 + 309 4 11 1992 96.0000000 144.0157255 + 310 5 11 1992 99.0000000 128.0449820 + 311 6 11 1992 126.0000000 112.3368955 + 312 7 11 1992 91.0000000 101.0316489 + 313 8 11 1992 84.0000000 95.3200845 + 314 9 11 1992 81.0000000 98.1233852 + 315 10 11 1992 85.0000000 119.9242744 + 316 11 11 1992 126.0000000 197.9349598 + 317 12 11 1992 279.0000000 253.0296437 + 318 13 11 1992 390.0000000 271.6664042 + 319 14 11 1992 294.0000000 275.6005571 + 320 15 11 1992 260.0000000 324.4870544 + 321 16 11 1992 398.0000000 470.1410467 + 322 17 11 1992 520.0000000 489.2145715 + 323 18 11 1992 487.0000000 448.2871871 + 324 19 11 1992 380.0000000 463.9776689 + 325 20 11 1992 385.0000000 413.6096453 + 326 21 11 1992 351.0000000 391.7731822 + 327 22 11 1992 309.0000000 490.7316517 + 328 23 11 1992 587.0000000 435.0755851 + 329 24 11 1992 661.0000000 369.4546448 + 330 25 11 1992 447.0000000 346.0393065 + 331 26 11 1992 361.0000000 373.4790573 + 332 27 11 1992 351.0000000 365.6931606 + 333 28 11 1992 353.0000000 372.8558011 + 334 29 11 1992 369.0000000 454.2617739 + 335 30 11 1992 452.0000000 478.3085329 + 336 1 12 1992 441.0000000 406.0848317 + 337 2 12 1992 348.0000000 401.7079980 + 338 3 12 1992 394.0000000 458.0508067 + 339 4 12 1992 455.0000000 477.8084239 + 340 5 12 1992 491.0000000 538.2496206 + 341 6 12 1992 469.0000000 480.6315722 + 342 7 12 1992 364.0000000 460.6904166 + 343 8 12 1992 338.0000000 415.7504562 + 344 9 12 1992 334.0000000 352.0338426 + 345 10 12 1992 268.0000000 295.1434744 + 346 11 12 1992 236.0000000 278.0183313 + 347 12 12 1992 230.0000000 287.2880723 + 348 13 12 1992 239.0000000 269.8926958 + 349 14 12 1992 256.0000000 231.3427177 + 350 15 12 1992 217.0000000 205.5110844 + 351 16 12 1992 201.0000000 191.3780943 + 352 17 12 1992 188.0000000 181.7244773 + 353 18 12 1992 176.0000000 174.5791004 + 354 19 12 1992 170.0000000 163.2334227 + 355 20 12 1992 168.0000000 158.5520351 + 356 21 12 1992 131.0000000 160.5230613 + 357 22 12 1992 133.0000000 165.4215485 + 358 23 12 1992 134.0000000 154.0693160 + 359 24 12 1992 127.0000000 145.5322827 + 360 25 12 1992 117.0000000 138.6180359 + 361 26 12 1992 113.0000000 132.4336387 + 362 27 12 1992 100.0000000 126.8806192 + 363 28 12 1992 94.0000000 121.8767674 + 364 29 12 1992 87.0000000 117.3520888 + 365 30 12 1992 86.0000000 113.2467644 + 366 31 12 1992 81.0000000 109.5094893 diff --git a/check/case_04/output_save/b6_daily_discharge.out b/check/case_04/output_save/b6_daily_discharge.out index 97639f2f..4bd2f1fc 100644 --- a/check/case_04/output_save/b6_daily_discharge.out +++ b/check/case_04/output_save/b6_daily_discharge.out @@ -1,1097 +1,366 @@ No Day Mon Year Qobs_0000000045 Qsim_0000000045 - 1 1 1 1991 -9999.0000000 199.8875372 - 2 2 1 1991 -9999.0000000 225.5778549 - 3 3 1 1991 -9999.0000000 199.2650932 - 4 4 1 1991 -9999.0000000 191.4582720 - 5 5 1 1991 -9999.0000000 210.3900873 - 6 6 1 1991 -9999.0000000 206.5318823 - 7 7 1 1991 -9999.0000000 202.3885676 - 8 8 1 1991 -9999.0000000 206.1618949 - 9 9 1 1991 -9999.0000000 198.4156262 - 10 10 1 1991 -9999.0000000 180.0588616 - 11 11 1 1991 -9999.0000000 165.9830002 - 12 12 1 1991 -9999.0000000 163.2932590 - 13 13 1 1991 -9999.0000000 171.4816303 - 14 14 1 1991 -9999.0000000 166.2972928 - 15 15 1 1991 -9999.0000000 148.0931290 - 16 16 1 1991 -9999.0000000 133.5211724 - 17 17 1 1991 -9999.0000000 124.1462965 - 18 18 1 1991 -9999.0000000 117.6237939 - 19 19 1 1991 -9999.0000000 111.8494902 - 20 20 1 1991 -9999.0000000 106.7381654 - 21 21 1 1991 -9999.0000000 102.4658235 - 22 22 1 1991 -9999.0000000 98.7720914 - 23 23 1 1991 -9999.0000000 95.4638842 - 24 24 1 1991 -9999.0000000 92.4202820 - 25 25 1 1991 -9999.0000000 89.6078334 - 26 26 1 1991 -9999.0000000 87.0038856 - 27 27 1 1991 -9999.0000000 84.5881895 - 28 28 1 1991 -9999.0000000 82.3426301 - 29 29 1 1991 -9999.0000000 80.2509876 - 30 30 1 1991 -9999.0000000 78.2987280 - 31 31 1 1991 -9999.0000000 76.4728176 - 32 1 2 1991 -9999.0000000 74.7615587 - 33 2 2 1991 -9999.0000000 73.1544447 - 34 3 2 1991 -9999.0000000 71.6420318 - 35 4 2 1991 -9999.0000000 70.2158249 - 36 5 2 1991 -9999.0000000 68.8681767 - 37 6 2 1991 -9999.0000000 67.5921981 - 38 7 2 1991 -9999.0000000 66.3816785 - 39 8 2 1991 -9999.0000000 65.2310147 - 40 9 2 1991 -9999.0000000 76.2594659 - 41 10 2 1991 -9999.0000000 177.3895190 - 42 11 2 1991 -9999.0000000 258.1878966 - 43 12 2 1991 -9999.0000000 220.6125272 - 44 13 2 1991 -9999.0000000 192.7876112 - 45 14 2 1991 -9999.0000000 170.2062023 - 46 15 2 1991 -9999.0000000 151.3417669 - 47 16 2 1991 -9999.0000000 135.6033665 - 48 17 2 1991 -9999.0000000 122.7274251 - 49 18 2 1991 -9999.0000000 112.8611435 - 50 19 2 1991 -9999.0000000 104.6491014 - 51 20 2 1991 -9999.0000000 100.8780471 - 52 21 2 1991 -9999.0000000 101.2109765 - 53 22 2 1991 -9999.0000000 106.1303713 - 54 23 2 1991 -9999.0000000 114.3848888 - 55 24 2 1991 -9999.0000000 130.2884251 - 56 25 2 1991 -9999.0000000 142.7161833 - 57 26 2 1991 -9999.0000000 137.9451549 - 58 27 2 1991 -9999.0000000 130.2210003 - 59 28 2 1991 -9999.0000000 120.5524519 - 60 1 3 1991 -9999.0000000 110.7460287 - 61 2 3 1991 -9999.0000000 104.1673651 - 62 3 3 1991 -9999.0000000 101.8358152 - 63 4 3 1991 -9999.0000000 101.2822942 - 64 5 3 1991 -9999.0000000 101.0187104 - 65 6 3 1991 -9999.0000000 105.3501999 - 66 7 3 1991 -9999.0000000 122.1353039 - 67 8 3 1991 -9999.0000000 153.9319915 - 68 9 3 1991 -9999.0000000 176.0761460 - 69 10 3 1991 -9999.0000000 182.7047310 - 70 11 3 1991 -9999.0000000 180.6748934 - 71 12 3 1991 -9999.0000000 166.0009671 - 72 13 3 1991 -9999.0000000 154.7918297 - 73 14 3 1991 -9999.0000000 146.6934419 - 74 15 3 1991 -9999.0000000 141.4002052 - 75 16 3 1991 -9999.0000000 138.8714965 - 76 17 3 1991 -9999.0000000 135.9574946 - 77 18 3 1991 -9999.0000000 137.4196895 - 78 19 3 1991 -9999.0000000 143.3575726 - 79 20 3 1991 -9999.0000000 144.6101650 - 80 21 3 1991 -9999.0000000 147.7362852 - 81 22 3 1991 -9999.0000000 168.6994378 - 82 23 3 1991 -9999.0000000 213.1892938 - 83 24 3 1991 -9999.0000000 218.7221845 - 84 25 3 1991 -9999.0000000 260.6675315 - 85 26 3 1991 -9999.0000000 279.7971584 - 86 27 3 1991 -9999.0000000 289.1365026 - 87 28 3 1991 -9999.0000000 282.8771576 - 88 29 3 1991 -9999.0000000 244.1978284 - 89 30 3 1991 -9999.0000000 216.9558535 - 90 31 3 1991 -9999.0000000 191.8355348 - 91 1 4 1991 -9999.0000000 172.6018165 - 92 2 4 1991 -9999.0000000 157.3703721 - 93 3 4 1991 -9999.0000000 149.2509262 - 94 4 4 1991 -9999.0000000 146.9055364 - 95 5 4 1991 -9999.0000000 164.0979621 - 96 6 4 1991 -9999.0000000 170.5508459 - 97 7 4 1991 -9999.0000000 154.2608361 - 98 8 4 1991 -9999.0000000 140.1419861 - 99 9 4 1991 -9999.0000000 128.1709676 - 100 10 4 1991 -9999.0000000 118.7434341 - 101 11 4 1991 -9999.0000000 111.1136984 - 102 12 4 1991 -9999.0000000 105.0169972 - 103 13 4 1991 -9999.0000000 100.5215526 - 104 14 4 1991 -9999.0000000 96.1500100 - 105 15 4 1991 -9999.0000000 92.4138975 - 106 16 4 1991 -9999.0000000 92.4196996 - 107 17 4 1991 -9999.0000000 122.2971339 - 108 18 4 1991 -9999.0000000 124.2616194 - 109 19 4 1991 -9999.0000000 116.4802990 - 110 20 4 1991 -9999.0000000 111.5452328 - 111 21 4 1991 -9999.0000000 108.6081796 - 112 22 4 1991 -9999.0000000 105.2821676 - 113 23 4 1991 -9999.0000000 101.2343344 - 114 24 4 1991 -9999.0000000 98.5357691 - 115 25 4 1991 -9999.0000000 96.2927086 - 116 26 4 1991 -9999.0000000 94.4259944 - 117 27 4 1991 -9999.0000000 92.2157522 - 118 28 4 1991 -9999.0000000 90.3140732 - 119 29 4 1991 -9999.0000000 93.9719615 - 120 30 4 1991 -9999.0000000 96.1169054 - 121 1 5 1991 -9999.0000000 98.4832838 - 122 2 5 1991 -9999.0000000 197.8022370 - 123 3 5 1991 -9999.0000000 368.7278977 - 124 4 5 1991 -9999.0000000 500.8692279 - 125 5 5 1991 -9999.0000000 520.5915131 - 126 6 5 1991 -9999.0000000 461.4823442 - 127 7 5 1991 -9999.0000000 400.6206664 - 128 8 5 1991 -9999.0000000 348.3993927 - 129 9 5 1991 -9999.0000000 358.3273533 - 130 10 5 1991 -9999.0000000 512.0239857 - 131 11 5 1991 -9999.0000000 577.2891033 - 132 12 5 1991 -9999.0000000 489.6990500 - 133 13 5 1991 -9999.0000000 419.9770501 - 134 14 5 1991 -9999.0000000 357.9828939 - 135 15 5 1991 -9999.0000000 383.0460775 - 136 16 5 1991 -9999.0000000 414.0560425 - 137 17 5 1991 -9999.0000000 389.6575227 - 138 18 5 1991 -9999.0000000 370.7960502 - 139 19 5 1991 -9999.0000000 323.8788246 - 140 20 5 1991 -9999.0000000 278.9264325 - 141 21 5 1991 -9999.0000000 241.2487342 - 142 22 5 1991 -9999.0000000 209.6954900 - 143 23 5 1991 -9999.0000000 183.8840110 - 144 24 5 1991 -9999.0000000 163.1385092 - 145 25 5 1991 -9999.0000000 145.0296425 - 146 26 5 1991 -9999.0000000 131.7698910 - 147 27 5 1991 -9999.0000000 122.9879794 - 148 28 5 1991 -9999.0000000 115.8346757 - 149 29 5 1991 -9999.0000000 110.3639003 - 150 30 5 1991 -9999.0000000 105.4606328 - 151 31 5 1991 -9999.0000000 101.1006900 - 152 1 6 1991 -9999.0000000 97.1731287 - 153 2 6 1991 -9999.0000000 93.7288554 - 154 3 6 1991 -9999.0000000 131.3864239 - 155 4 6 1991 -9999.0000000 257.5056792 - 156 5 6 1991 -9999.0000000 320.3939188 - 157 6 6 1991 -9999.0000000 329.4861802 - 158 7 6 1991 -9999.0000000 346.9170446 - 159 8 6 1991 -9999.0000000 295.6577220 - 160 9 6 1991 -9999.0000000 254.7460692 - 161 10 6 1991 -9999.0000000 220.8198992 - 162 11 6 1991 -9999.0000000 192.4021540 - 163 12 6 1991 -9999.0000000 168.7853297 - 164 13 6 1991 -9999.0000000 150.0349877 - 165 14 6 1991 -9999.0000000 134.7197387 - 166 15 6 1991 -9999.0000000 122.9651395 - 167 16 6 1991 -9999.0000000 115.1861530 - 168 17 6 1991 -9999.0000000 153.9711875 - 169 18 6 1991 -9999.0000000 169.6143007 - 170 19 6 1991 -9999.0000000 152.8694846 - 171 20 6 1991 -9999.0000000 144.1701938 - 172 21 6 1991 -9999.0000000 129.2002906 - 173 22 6 1991 -9999.0000000 119.1192725 - 174 23 6 1991 -9999.0000000 111.2840737 - 175 24 6 1991 -9999.0000000 105.8523166 - 176 25 6 1991 -9999.0000000 100.9094072 - 177 26 6 1991 -9999.0000000 102.0628437 - 178 27 6 1991 -9999.0000000 191.7964121 - 179 28 6 1991 -9999.0000000 224.0728912 - 180 29 6 1991 -9999.0000000 182.5141824 - 181 30 6 1991 -9999.0000000 161.6290547 - 182 1 7 1991 -9999.0000000 144.1532348 - 183 2 7 1991 -9999.0000000 130.3399775 - 184 3 7 1991 -9999.0000000 119.1800318 - 185 4 7 1991 -9999.0000000 109.8166646 - 186 5 7 1991 -9999.0000000 102.2137828 - 187 6 7 1991 -9999.0000000 96.2890139 - 188 7 7 1991 -9999.0000000 92.2247403 - 189 8 7 1991 -9999.0000000 90.4377928 - 190 9 7 1991 -9999.0000000 90.3390080 - 191 10 7 1991 -9999.0000000 86.4655052 - 192 11 7 1991 -9999.0000000 82.9523799 - 193 12 7 1991 -9999.0000000 80.3887189 - 194 13 7 1991 -9999.0000000 79.9519278 - 195 14 7 1991 -9999.0000000 123.5812000 - 196 15 7 1991 -9999.0000000 107.8245677 - 197 16 7 1991 -9999.0000000 92.4883042 - 198 17 7 1991 -9999.0000000 101.8934638 - 199 18 7 1991 -9999.0000000 106.4426385 - 200 19 7 1991 -9999.0000000 94.5837484 - 201 20 7 1991 -9999.0000000 88.2839965 - 202 21 7 1991 -9999.0000000 109.7854110 - 203 22 7 1991 -9999.0000000 110.6226257 - 204 23 7 1991 -9999.0000000 97.3309075 - 205 24 7 1991 -9999.0000000 116.1246966 - 206 25 7 1991 -9999.0000000 198.9400922 - 207 26 7 1991 -9999.0000000 206.6548125 - 208 27 7 1991 -9999.0000000 169.4933683 - 209 28 7 1991 -9999.0000000 164.3088383 - 210 29 7 1991 -9999.0000000 160.6726266 - 211 30 7 1991 -9999.0000000 140.1998380 - 212 31 7 1991 -9999.0000000 148.4282715 - 213 1 8 1991 -9999.0000000 149.9416303 - 214 2 8 1991 -9999.0000000 129.5103241 - 215 3 8 1991 -9999.0000000 116.8541590 - 216 4 8 1991 -9999.0000000 107.1191983 - 217 5 8 1991 -9999.0000000 99.3139060 - 218 6 8 1991 -9999.0000000 93.4237541 - 219 7 8 1991 -9999.0000000 89.4420523 - 220 8 8 1991 -9999.0000000 85.9782837 - 221 9 8 1991 -9999.0000000 82.8023066 - 222 10 8 1991 -9999.0000000 79.8848494 - 223 11 8 1991 -9999.0000000 77.1998477 - 224 12 8 1991 -9999.0000000 83.2190639 - 225 13 8 1991 -9999.0000000 85.3514880 - 226 14 8 1991 -9999.0000000 100.7916365 - 227 15 8 1991 -9999.0000000 91.7049796 - 228 16 8 1991 -9999.0000000 83.3080555 - 229 17 8 1991 -9999.0000000 79.7577627 - 230 18 8 1991 -9999.0000000 149.6305524 - 231 19 8 1991 -9999.0000000 152.3620460 - 232 20 8 1991 -9999.0000000 123.6455424 - 233 21 8 1991 -9999.0000000 111.1930785 - 234 22 8 1991 -9999.0000000 101.8826541 - 235 23 8 1991 -9999.0000000 95.2912525 - 236 24 8 1991 -9999.0000000 90.7511357 - 237 25 8 1991 -9999.0000000 87.9367561 - 238 26 8 1991 -9999.0000000 86.6022033 - 239 27 8 1991 -9999.0000000 82.2220206 - 240 28 8 1991 -9999.0000000 78.6117131 - 241 29 8 1991 -9999.0000000 81.1660035 - 242 30 8 1991 -9999.0000000 79.2003128 - 243 31 8 1991 -9999.0000000 74.4190372 - 244 1 9 1991 -9999.0000000 71.9102370 - 245 2 9 1991 -9999.0000000 69.5958440 - 246 3 9 1991 -9999.0000000 67.4567588 - 247 4 9 1991 -9999.0000000 65.4759112 - 248 5 9 1991 -9999.0000000 63.6380313 - 249 6 9 1991 -9999.0000000 61.9294484 - 250 7 9 1991 -9999.0000000 60.3424429 - 251 8 9 1991 -9999.0000000 58.8758067 - 252 9 9 1991 -9999.0000000 57.4871137 - 253 10 9 1991 -9999.0000000 56.1835221 - 254 11 9 1991 -9999.0000000 54.9594710 - 255 12 9 1991 -9999.0000000 71.1301445 - 256 13 9 1991 -9999.0000000 67.0637814 - 257 14 9 1991 -9999.0000000 61.4016812 - 258 15 9 1991 -9999.0000000 59.5393333 - 259 16 9 1991 -9999.0000000 56.5918291 - 260 17 9 1991 -9999.0000000 55.1194803 - 261 18 9 1991 -9999.0000000 53.8213917 - 262 19 9 1991 -9999.0000000 52.6047199 - 263 20 9 1991 -9999.0000000 51.4620993 - 264 21 9 1991 -9999.0000000 50.3868476 - 265 22 9 1991 -9999.0000000 84.2630740 - 266 23 9 1991 -9999.0000000 107.9071785 - 267 24 9 1991 -9999.0000000 92.0526014 - 268 25 9 1991 -9999.0000000 79.7110543 - 269 26 9 1991 -9999.0000000 100.2930436 - 270 27 9 1991 -9999.0000000 105.3812642 - 271 28 9 1991 -9999.0000000 95.6794508 - 272 29 9 1991 -9999.0000000 113.9753273 - 273 30 9 1991 -9999.0000000 183.1417501 - 274 1 10 1991 -9999.0000000 201.3504912 - 275 2 10 1991 -9999.0000000 161.9277387 - 276 3 10 1991 -9999.0000000 140.7101321 - 277 4 10 1991 -9999.0000000 122.9614808 - 278 5 10 1991 -9999.0000000 109.0724657 - 279 6 10 1991 -9999.0000000 98.2811503 - 280 7 10 1991 -9999.0000000 91.8681342 - 281 8 10 1991 -9999.0000000 115.7882017 - 282 9 10 1991 -9999.0000000 114.1610991 - 283 10 10 1991 -9999.0000000 97.8914745 - 284 11 10 1991 -9999.0000000 89.3655885 - 285 12 10 1991 -9999.0000000 145.5339335 - 286 13 10 1991 -9999.0000000 205.0158137 - 287 14 10 1991 -9999.0000000 236.0530116 - 288 15 10 1991 -9999.0000000 263.9005417 - 289 16 10 1991 -9999.0000000 241.9107164 - 290 17 10 1991 -9999.0000000 220.6014040 - 291 18 10 1991 -9999.0000000 348.0607681 - 292 19 10 1991 -9999.0000000 483.5238819 - 293 20 10 1991 -9999.0000000 472.1901855 - 294 21 10 1991 -9999.0000000 398.9238593 - 295 22 10 1991 -9999.0000000 340.1455613 - 296 23 10 1991 -9999.0000000 290.8749378 - 297 24 10 1991 -9999.0000000 250.7837119 - 298 25 10 1991 -9999.0000000 216.8015316 - 299 26 10 1991 -9999.0000000 187.3517292 - 300 27 10 1991 -9999.0000000 162.0481831 - 301 28 10 1991 -9999.0000000 140.9000143 - 302 29 10 1991 -9999.0000000 124.2409038 - 303 30 10 1991 -9999.0000000 111.7162929 - 304 31 10 1991 -9999.0000000 102.8829497 - 305 1 11 1991 -9999.0000000 97.1567642 - 306 2 11 1991 -9999.0000000 92.7331476 - 307 3 11 1991 -9999.0000000 93.4221777 - 308 4 11 1991 -9999.0000000 245.3429673 - 309 5 11 1991 -9999.0000000 385.5806504 - 310 6 11 1991 -9999.0000000 340.8514158 - 311 7 11 1991 -9999.0000000 289.3527513 - 312 8 11 1991 -9999.0000000 248.7496240 - 313 9 11 1991 -9999.0000000 246.8686713 - 314 10 11 1991 -9999.0000000 241.0648918 - 315 11 11 1991 -9999.0000000 205.0326554 - 316 12 11 1991 -9999.0000000 177.2767977 - 317 13 11 1991 -9999.0000000 209.2261568 - 318 14 11 1991 -9999.0000000 333.7955341 - 319 15 11 1991 -9999.0000000 458.3611985 - 320 16 11 1991 -9999.0000000 596.8114242 - 321 17 11 1991 -9999.0000000 636.9071791 - 322 18 11 1991 -9999.0000000 537.4814887 - 323 19 11 1991 -9999.0000000 605.3318743 - 324 20 11 1991 -9999.0000000 847.7270770 - 325 21 11 1991 -9999.0000000 1004.5568649 - 326 22 11 1991 -9999.0000000 970.5674674 - 327 23 11 1991 -9999.0000000 850.3695715 - 328 24 11 1991 -9999.0000000 770.2698359 - 329 25 11 1991 -9999.0000000 693.6818295 - 330 26 11 1991 -9999.0000000 592.3540111 - 331 27 11 1991 -9999.0000000 508.3180352 - 332 28 11 1991 -9999.0000000 437.4291292 - 333 29 11 1991 -9999.0000000 376.8558844 - 334 30 11 1991 -9999.0000000 324.8789846 - 335 1 12 1991 -9999.0000000 281.3953058 - 336 2 12 1991 -9999.0000000 245.0430186 - 337 3 12 1991 -9999.0000000 214.8564063 - 338 4 12 1991 -9999.0000000 189.6106542 - 339 5 12 1991 -9999.0000000 168.3654503 - 340 6 12 1991 -9999.0000000 150.4340553 - 341 7 12 1991 -9999.0000000 136.2905087 - 342 8 12 1991 -9999.0000000 126.7302091 - 343 9 12 1991 -9999.0000000 120.5221474 - 344 10 12 1991 -9999.0000000 115.6244165 - 345 11 12 1991 -9999.0000000 111.2758171 - 346 12 12 1991 -9999.0000000 107.2883027 - 347 13 12 1991 -9999.0000000 103.6223163 - 348 14 12 1991 -9999.0000000 100.2520615 - 349 15 12 1991 -9999.0000000 97.1719221 - 350 16 12 1991 -9999.0000000 94.2939334 - 351 17 12 1991 -9999.0000000 91.6197395 - 352 18 12 1991 -9999.0000000 89.1367836 - 353 19 12 1991 -9999.0000000 86.8268300 - 354 20 12 1991 -9999.0000000 85.9189370 - 355 21 12 1991 -9999.0000000 84.8011422 - 356 22 12 1991 -9999.0000000 86.6339530 - 357 23 12 1991 -9999.0000000 88.1296592 - 358 24 12 1991 -9999.0000000 85.8252906 - 359 25 12 1991 -9999.0000000 83.2843040 - 360 26 12 1991 -9999.0000000 81.3746925 - 361 27 12 1991 -9999.0000000 79.4268120 - 362 28 12 1991 -9999.0000000 78.5237787 - 363 29 12 1991 -9999.0000000 76.9763619 - 364 30 12 1991 -9999.0000000 75.2521202 - 365 31 12 1991 -9999.0000000 73.6924825 - 366 1 1 1992 -9999.0000000 72.1956539 - 367 2 1 1992 -9999.0000000 73.7839482 - 368 3 1 1992 -9999.0000000 75.1131836 - 369 4 1 1992 -9999.0000000 73.5590243 - 370 5 1 1992 -9999.0000000 73.9308606 - 371 6 1 1992 -9999.0000000 74.5411767 - 372 7 1 1992 -9999.0000000 73.3749144 - 373 8 1 1992 -9999.0000000 71.9489844 - 374 9 1 1992 -9999.0000000 73.6688024 - 375 10 1 1992 -9999.0000000 90.9214840 - 376 11 1 1992 -9999.0000000 93.4723013 - 377 12 1 1992 -9999.0000000 87.6560228 - 378 13 1 1992 -9999.0000000 84.1898265 - 379 14 1 1992 -9999.0000000 81.0664582 - 380 15 1 1992 -9999.0000000 79.0049783 - 381 16 1 1992 -9999.0000000 77.3681555 - 382 17 1 1992 -9999.0000000 74.6216038 - 383 18 1 1992 -9999.0000000 72.3697079 - 384 19 1 1992 -9999.0000000 70.4616078 - 385 20 1 1992 -9999.0000000 68.6832919 - 386 21 1 1992 -9999.0000000 67.0225769 - 387 22 1 1992 -9999.0000000 65.4687459 - 388 23 1 1992 -9999.0000000 64.0119316 - 389 24 1 1992 -9999.0000000 62.6432693 - 390 25 1 1992 -9999.0000000 61.3547890 - 391 26 1 1992 -9999.0000000 60.1393197 - 392 27 1 1992 -9999.0000000 58.9904047 - 393 28 1 1992 -9999.0000000 57.9022257 - 394 29 1 1992 -9999.0000000 56.8894014 - 395 30 1 1992 -9999.0000000 57.2367287 - 396 31 1 1992 -9999.0000000 57.8571389 - 397 1 2 1992 -9999.0000000 57.0739030 - 398 2 2 1992 -9999.0000000 56.1628050 - 399 3 2 1992 -9999.0000000 55.3285119 - 400 4 2 1992 -9999.0000000 55.9211144 - 401 5 2 1992 -9999.0000000 58.6241954 - 402 6 2 1992 -9999.0000000 66.0775763 - 403 7 2 1992 -9999.0000000 73.8837052 - 404 8 2 1992 -9999.0000000 76.4750034 - 405 9 2 1992 -9999.0000000 79.0472142 - 406 10 2 1992 -9999.0000000 109.1621570 - 407 11 2 1992 -9999.0000000 118.2892807 - 408 12 2 1992 -9999.0000000 113.3644470 - 409 13 2 1992 -9999.0000000 121.6952307 - 410 14 2 1992 -9999.0000000 122.5960223 - 411 15 2 1992 -9999.0000000 113.1761302 - 412 16 2 1992 -9999.0000000 128.5744093 - 413 17 2 1992 -9999.0000000 135.9566772 - 414 18 2 1992 -9999.0000000 119.3976523 - 415 19 2 1992 -9999.0000000 108.0280289 - 416 20 2 1992 -9999.0000000 100.0436181 - 417 21 2 1992 -9999.0000000 93.4991387 - 418 22 2 1992 -9999.0000000 88.5695728 - 419 23 2 1992 -9999.0000000 84.6083246 - 420 24 2 1992 -9999.0000000 82.9658051 - 421 25 2 1992 -9999.0000000 80.7745332 - 422 26 2 1992 -9999.0000000 77.7632334 - 423 27 2 1992 -9999.0000000 75.3272155 - 424 28 2 1992 -9999.0000000 73.0483985 - 425 29 2 1992 -9999.0000000 71.1826701 - 426 1 3 1992 -9999.0000000 69.2524725 - 427 2 3 1992 -9999.0000000 66.9737807 - 428 3 3 1992 -9999.0000000 64.9447454 - 429 4 3 1992 -9999.0000000 64.8562209 - 430 5 3 1992 -9999.0000000 65.1158306 - 431 6 3 1992 -9999.0000000 64.9803944 - 432 7 3 1992 -9999.0000000 62.6053036 - 433 8 3 1992 -9999.0000000 59.3343826 - 434 9 3 1992 -9999.0000000 57.1538535 - 435 10 3 1992 -9999.0000000 55.4521011 - 436 11 3 1992 -9999.0000000 54.0433698 - 437 12 3 1992 -9999.0000000 52.8078245 - 438 13 3 1992 -9999.0000000 51.9622622 - 439 14 3 1992 -9999.0000000 61.4568668 - 440 15 3 1992 -9999.0000000 59.4281821 - 441 16 3 1992 -9999.0000000 55.4975582 - 442 17 3 1992 -9999.0000000 53.8504575 - 443 18 3 1992 -9999.0000000 52.4373188 - 444 19 3 1992 -9999.0000000 51.2072712 - 445 20 3 1992 -9999.0000000 51.0973662 - 446 21 3 1992 -9999.0000000 61.3306272 - 447 22 3 1992 -9999.0000000 60.9953097 - 448 23 3 1992 -9999.0000000 107.5453683 - 449 24 3 1992 -9999.0000000 287.4379905 - 450 25 3 1992 -9999.0000000 397.8475603 - 451 26 3 1992 -9999.0000000 378.7870542 - 452 27 3 1992 -9999.0000000 374.3051807 - 453 28 3 1992 -9999.0000000 363.3586607 - 454 29 3 1992 -9999.0000000 339.0897437 - 455 30 3 1992 -9999.0000000 314.6500529 - 456 31 3 1992 -9999.0000000 379.4818081 - 457 1 4 1992 -9999.0000000 435.6010005 - 458 2 4 1992 -9999.0000000 401.4416617 - 459 3 4 1992 -9999.0000000 373.8684507 - 460 4 4 1992 -9999.0000000 383.9395953 - 461 5 4 1992 -9999.0000000 413.6576186 - 462 6 4 1992 -9999.0000000 440.4214175 - 463 7 4 1992 -9999.0000000 392.0809103 - 464 8 4 1992 -9999.0000000 334.0275099 - 465 9 4 1992 -9999.0000000 285.5523290 - 466 10 4 1992 -9999.0000000 245.3039352 - 467 11 4 1992 -9999.0000000 212.4198578 - 468 12 4 1992 -9999.0000000 185.5994313 - 469 13 4 1992 -9999.0000000 170.4147457 - 470 14 4 1992 -9999.0000000 156.9614896 - 471 15 4 1992 -9999.0000000 199.0062405 - 472 16 4 1992 -9999.0000000 266.8689986 - 473 17 4 1992 -9999.0000000 253.1764762 - 474 18 4 1992 -9999.0000000 217.2638297 - 475 19 4 1992 -9999.0000000 191.0292381 - 476 20 4 1992 -9999.0000000 170.3082562 - 477 21 4 1992 -9999.0000000 151.5162523 - 478 22 4 1992 -9999.0000000 138.0644003 - 479 23 4 1992 -9999.0000000 128.3310239 - 480 24 4 1992 -9999.0000000 121.9178151 - 481 25 4 1992 -9999.0000000 120.5968384 - 482 26 4 1992 -9999.0000000 122.2694527 - 483 27 4 1992 -9999.0000000 120.9163962 - 484 28 4 1992 -9999.0000000 115.3181423 - 485 29 4 1992 -9999.0000000 229.7820052 - 486 30 4 1992 -9999.0000000 332.0476694 - 487 1 5 1992 -9999.0000000 300.9572999 - 488 2 5 1992 -9999.0000000 260.4332759 - 489 3 5 1992 -9999.0000000 228.8560280 - 490 4 5 1992 -9999.0000000 202.0460042 - 491 5 5 1992 -9999.0000000 179.4249492 - 492 6 5 1992 -9999.0000000 162.0747171 - 493 7 5 1992 -9999.0000000 148.7189658 - 494 8 5 1992 -9999.0000000 138.9831787 - 495 9 5 1992 -9999.0000000 128.7516392 - 496 10 5 1992 -9999.0000000 116.8395349 - 497 11 5 1992 -9999.0000000 128.4803660 - 498 12 5 1992 -9999.0000000 127.4995771 - 499 13 5 1992 -9999.0000000 112.8691906 - 500 14 5 1992 -9999.0000000 105.1862217 - 501 15 5 1992 -9999.0000000 99.0225417 - 502 16 5 1992 -9999.0000000 93.7840883 - 503 17 5 1992 -9999.0000000 89.1612731 - 504 18 5 1992 -9999.0000000 85.0607599 - 505 19 5 1992 -9999.0000000 83.9141450 - 506 20 5 1992 -9999.0000000 81.9498260 - 507 21 5 1992 -9999.0000000 77.5500304 - 508 22 5 1992 -9999.0000000 75.0290932 - 509 23 5 1992 -9999.0000000 74.9259714 - 510 24 5 1992 -9999.0000000 73.3833721 - 511 25 5 1992 -9999.0000000 70.2532577 - 512 26 5 1992 -9999.0000000 68.2511632 - 513 27 5 1992 -9999.0000000 66.3907658 - 514 28 5 1992 -9999.0000000 64.6595764 - 515 29 5 1992 -9999.0000000 63.4635210 - 516 30 5 1992 -9999.0000000 62.1072753 - 517 31 5 1992 -9999.0000000 60.9291585 - 518 1 6 1992 -9999.0000000 63.7258851 - 519 2 6 1992 -9999.0000000 61.5038001 - 520 3 6 1992 -9999.0000000 66.9225161 - 521 4 6 1992 -9999.0000000 89.3781081 - 522 5 6 1992 -9999.0000000 80.0239771 - 523 6 6 1992 -9999.0000000 72.0669731 - 524 7 6 1992 -9999.0000000 71.8968321 - 525 8 6 1992 -9999.0000000 80.3666640 - 526 9 6 1992 -9999.0000000 76.9936839 - 527 10 6 1992 -9999.0000000 72.9194268 - 528 11 6 1992 -9999.0000000 80.8896021 - 529 12 6 1992 -9999.0000000 131.2691818 - 530 13 6 1992 -9999.0000000 135.5847671 - 531 14 6 1992 -9999.0000000 115.5109826 - 532 15 6 1992 -9999.0000000 105.5041670 - 533 16 6 1992 -9999.0000000 97.3370631 - 534 17 6 1992 -9999.0000000 90.6459245 - 535 18 6 1992 -9999.0000000 85.4908488 - 536 19 6 1992 -9999.0000000 85.6902784 - 537 20 6 1992 -9999.0000000 87.9594317 - 538 21 6 1992 -9999.0000000 81.7426022 - 539 22 6 1992 -9999.0000000 76.3470924 - 540 23 6 1992 -9999.0000000 77.5914020 - 541 24 6 1992 -9999.0000000 75.3353527 - 542 25 6 1992 -9999.0000000 72.2735375 - 543 26 6 1992 -9999.0000000 70.5172682 - 544 27 6 1992 -9999.0000000 66.8871224 - 545 28 6 1992 -9999.0000000 64.6564079 - 546 29 6 1992 -9999.0000000 62.5968659 - 547 30 6 1992 -9999.0000000 60.6918059 - 548 1 7 1992 -9999.0000000 58.9262982 - 549 2 7 1992 -9999.0000000 57.2898893 - 550 3 7 1992 -9999.0000000 55.7719620 - 551 4 7 1992 -9999.0000000 62.4316550 - 552 5 7 1992 -9999.0000000 78.7289760 - 553 6 7 1992 -9999.0000000 72.5021349 - 554 7 7 1992 -9999.0000000 64.7193414 - 555 8 7 1992 -9999.0000000 61.2720621 - 556 9 7 1992 -9999.0000000 61.9195257 - 557 10 7 1992 -9999.0000000 61.0844132 - 558 11 7 1992 -9999.0000000 90.9546760 - 559 12 7 1992 -9999.0000000 94.9046778 - 560 13 7 1992 -9999.0000000 78.2196958 - 561 14 7 1992 -9999.0000000 72.4304907 - 562 15 7 1992 -9999.0000000 68.1972265 - 563 16 7 1992 -9999.0000000 90.5760525 - 564 17 7 1992 -9999.0000000 87.4446823 - 565 18 7 1992 -9999.0000000 76.0402969 - 566 19 7 1992 -9999.0000000 71.4780600 - 567 20 7 1992 -9999.0000000 67.5421799 - 568 21 7 1992 -9999.0000000 64.4663845 - 569 22 7 1992 -9999.0000000 62.0166540 - 570 23 7 1992 -9999.0000000 60.1293139 - 571 24 7 1992 -9999.0000000 58.2439606 - 572 25 7 1992 -9999.0000000 56.7878428 - 573 26 7 1992 -9999.0000000 55.3801659 - 574 27 7 1992 -9999.0000000 54.5269594 - 575 28 7 1992 -9999.0000000 53.4103029 - 576 29 7 1992 -9999.0000000 50.8840710 - 577 30 7 1992 -9999.0000000 49.5031267 - 578 31 7 1992 -9999.0000000 48.2168823 - 579 1 8 1992 -9999.0000000 47.2969013 - 580 2 8 1992 -9999.0000000 46.3668601 - 581 3 8 1992 -9999.0000000 44.9531310 - 582 4 8 1992 -9999.0000000 45.6373369 - 583 5 8 1992 -9999.0000000 44.7427423 - 584 6 8 1992 -9999.0000000 42.8064968 - 585 7 8 1992 -9999.0000000 41.9228402 - 586 8 8 1992 -9999.0000000 41.0887981 - 587 9 8 1992 -9999.0000000 40.3000471 - 588 10 8 1992 -9999.0000000 41.2085282 - 589 11 8 1992 -9999.0000000 40.6006137 - 590 12 8 1992 -9999.0000000 38.6172829 - 591 13 8 1992 -9999.0000000 37.9395183 - 592 14 8 1992 -9999.0000000 37.6651439 - 593 15 8 1992 -9999.0000000 39.0003659 - 594 16 8 1992 -9999.0000000 37.0938458 - 595 17 8 1992 -9999.0000000 35.8395912 - 596 18 8 1992 -9999.0000000 35.2772971 - 597 19 8 1992 -9999.0000000 34.7382598 - 598 20 8 1992 -9999.0000000 34.2206566 - 599 21 8 1992 -9999.0000000 33.7228341 - 600 22 8 1992 -9999.0000000 46.7158434 - 601 23 8 1992 -9999.0000000 43.2704257 - 602 24 8 1992 -9999.0000000 35.9034648 - 603 25 8 1992 -9999.0000000 34.2140822 - 604 26 8 1992 -9999.0000000 33.6344175 - 605 27 8 1992 -9999.0000000 33.0812167 - 606 28 8 1992 -9999.0000000 32.5523366 - 607 29 8 1992 -9999.0000000 33.2291414 - 608 30 8 1992 -9999.0000000 38.5864535 - 609 31 8 1992 -9999.0000000 62.6145621 - 610 1 9 1992 -9999.0000000 78.5005409 - 611 2 9 1992 -9999.0000000 61.3271252 - 612 3 9 1992 -9999.0000000 49.8909539 - 613 4 9 1992 -9999.0000000 146.4636080 - 614 5 9 1992 -9999.0000000 123.1432920 - 615 6 9 1992 -9999.0000000 89.1327665 - 616 7 9 1992 -9999.0000000 80.1947812 - 617 8 9 1992 -9999.0000000 73.4564186 - 618 9 9 1992 -9999.0000000 67.7158614 - 619 10 9 1992 -9999.0000000 62.7841886 - 620 11 9 1992 -9999.0000000 58.5387223 - 621 12 9 1992 -9999.0000000 54.8449825 - 622 13 9 1992 -9999.0000000 51.6507725 - 623 14 9 1992 -9999.0000000 49.7481211 - 624 15 9 1992 -9999.0000000 48.2960117 - 625 16 9 1992 -9999.0000000 45.8556367 - 626 17 9 1992 -9999.0000000 44.1836377 - 627 18 9 1992 -9999.0000000 42.6438795 - 628 19 9 1992 -9999.0000000 41.2234072 - 629 20 9 1992 -9999.0000000 39.9106367 - 630 21 9 1992 -9999.0000000 38.6952001 - 631 22 9 1992 -9999.0000000 37.5678108 - 632 23 9 1992 -9999.0000000 38.9287843 - 633 24 9 1992 -9999.0000000 60.2797283 - 634 25 9 1992 -9999.0000000 49.1937973 - 635 26 9 1992 -9999.0000000 40.8941865 - 636 27 9 1992 -9999.0000000 40.0042206 - 637 28 9 1992 -9999.0000000 42.2416937 - 638 29 9 1992 -9999.0000000 59.9277613 - 639 30 9 1992 -9999.0000000 71.1545119 - 640 1 10 1992 -9999.0000000 58.8317334 - 641 2 10 1992 -9999.0000000 53.1427884 - 642 3 10 1992 -9999.0000000 103.2676623 - 643 4 10 1992 -9999.0000000 180.9942787 - 644 5 10 1992 -9999.0000000 279.8270525 - 645 6 10 1992 -9999.0000000 326.1151293 - 646 7 10 1992 -9999.0000000 283.0465791 - 647 8 10 1992 -9999.0000000 235.6881181 - 648 9 10 1992 -9999.0000000 199.1159744 - 649 10 10 1992 -9999.0000000 236.8157055 - 650 11 10 1992 -9999.0000000 292.8269055 - 651 12 10 1992 -9999.0000000 296.4960529 - 652 13 10 1992 -9999.0000000 265.8479077 - 653 14 10 1992 -9999.0000000 222.7633570 - 654 15 10 1992 -9999.0000000 190.1545411 - 655 16 10 1992 -9999.0000000 247.1449208 - 656 17 10 1992 -9999.0000000 564.7551405 - 657 18 10 1992 -9999.0000000 822.1190133 - 658 19 10 1992 -9999.0000000 757.4661763 - 659 20 10 1992 -9999.0000000 665.3800288 - 660 21 10 1992 -9999.0000000 704.7216443 - 661 22 10 1992 -9999.0000000 697.2719983 - 662 23 10 1992 -9999.0000000 577.7611738 - 663 24 10 1992 -9999.0000000 492.5151287 - 664 25 10 1992 -9999.0000000 435.2279499 - 665 26 10 1992 -9999.0000000 376.2949663 - 666 27 10 1992 -9999.0000000 319.8831974 - 667 28 10 1992 -9999.0000000 339.2611884 - 668 29 10 1992 -9999.0000000 562.7347517 - 669 30 10 1992 -9999.0000000 775.4300028 - 670 31 10 1992 -9999.0000000 831.4180485 - 671 1 11 1992 -9999.0000000 794.9804817 - 672 2 11 1992 -9999.0000000 753.4987645 - 673 3 11 1992 -9999.0000000 753.8653431 - 674 4 11 1992 -9999.0000000 701.4588363 - 675 5 11 1992 -9999.0000000 586.6648044 - 676 6 11 1992 -9999.0000000 497.3934227 - 677 7 11 1992 -9999.0000000 423.3553834 - 678 8 11 1992 -9999.0000000 361.8148581 - 679 9 11 1992 -9999.0000000 310.5513199 - 680 10 11 1992 -9999.0000000 268.2758734 - 681 11 11 1992 -9999.0000000 248.9854265 - 682 12 11 1992 -9999.0000000 246.9271195 - 683 13 11 1992 -9999.0000000 237.3058223 - 684 14 11 1992 -9999.0000000 212.9574466 - 685 15 11 1992 -9999.0000000 264.4542831 - 686 16 11 1992 -9999.0000000 594.4479127 - 687 17 11 1992 -9999.0000000 813.7103918 - 688 18 11 1992 -9999.0000000 707.4695059 - 689 19 11 1992 -9999.0000000 595.2295327 - 690 20 11 1992 -9999.0000000 504.7541377 - 691 21 11 1992 -9999.0000000 430.1047329 - 692 22 11 1992 -9999.0000000 370.3179297 - 693 23 11 1992 -9999.0000000 321.9568856 - 694 24 11 1992 -9999.0000000 279.4948771 - 695 25 11 1992 -9999.0000000 241.7643823 - 696 26 11 1992 -9999.0000000 210.8951480 - 697 27 11 1992 -9999.0000000 185.0754986 - 698 28 11 1992 -9999.0000000 163.9491935 - 699 29 11 1992 -9999.0000000 147.4215323 - 700 30 11 1992 -9999.0000000 135.3387486 - 701 1 12 1992 -9999.0000000 128.0400661 - 702 2 12 1992 -9999.0000000 208.3266907 - 703 3 12 1992 -9999.0000000 410.4317460 - 704 4 12 1992 -9999.0000000 547.8396545 - 705 5 12 1992 -9999.0000000 841.2364962 - 706 6 12 1992 -9999.0000000 1042.8646445 - 707 7 12 1992 -9999.0000000 865.9883730 - 708 8 12 1992 -9999.0000000 756.6167374 - 709 9 12 1992 -9999.0000000 666.1998865 - 710 10 12 1992 -9999.0000000 573.7866880 - 711 11 12 1992 -9999.0000000 490.3526730 - 712 12 12 1992 -9999.0000000 420.3634768 - 713 13 12 1992 -9999.0000000 361.9435425 - 714 14 12 1992 -9999.0000000 312.8720571 - 715 15 12 1992 -9999.0000000 272.4054039 - 716 16 12 1992 -9999.0000000 238.7767644 - 717 17 12 1992 -9999.0000000 210.2052324 - 718 18 12 1992 -9999.0000000 186.7731067 - 719 19 12 1992 -9999.0000000 167.2691942 - 720 20 12 1992 -9999.0000000 150.9303722 - 721 21 12 1992 -9999.0000000 138.9226260 - 722 22 12 1992 -9999.0000000 131.7449391 - 723 23 12 1992 -9999.0000000 126.3509874 - 724 24 12 1992 -9999.0000000 121.6028728 - 725 25 12 1992 -9999.0000000 117.3270472 - 726 26 12 1992 -9999.0000000 113.3988256 - 727 27 12 1992 -9999.0000000 109.7801671 - 728 28 12 1992 -9999.0000000 106.4399490 - 729 29 12 1992 -9999.0000000 103.3504353 - 730 30 12 1992 -9999.0000000 100.4868855 - 731 31 12 1992 -9999.0000000 97.8272119 - 732 1 1 1993 -9999.0000000 95.3516778 - 733 2 1 1993 -9999.0000000 93.0426327 - 734 3 1 1993 -9999.0000000 90.8842778 - 735 4 1 1993 -9999.0000000 88.8624606 - 736 5 1 1993 -9999.0000000 86.9644930 - 737 6 1 1993 -9999.0000000 85.1789901 - 738 7 1 1993 -9999.0000000 83.6369181 - 739 8 1 1993 -9999.0000000 83.5864200 - 740 9 1 1993 -9999.0000000 83.6087319 - 741 10 1 1993 -9999.0000000 82.6106027 - 742 11 1 1993 -9999.0000000 93.2211982 - 743 12 1 1993 -9999.0000000 111.4122037 - 744 13 1 1993 -9999.0000000 121.1360308 - 745 14 1 1993 -9999.0000000 132.1795617 - 746 15 1 1993 -9999.0000000 132.1878206 - 747 16 1 1993 -9999.0000000 131.1820661 - 748 17 1 1993 -9999.0000000 129.2431877 - 749 18 1 1993 -9999.0000000 123.1107203 - 750 19 1 1993 -9999.0000000 114.4395783 - 751 20 1 1993 -9999.0000000 108.8497296 - 752 21 1 1993 -9999.0000000 107.8377520 - 753 22 1 1993 -9999.0000000 106.9057539 - 754 23 1 1993 -9999.0000000 103.4841312 - 755 24 1 1993 -9999.0000000 99.7507945 - 756 25 1 1993 -9999.0000000 96.7173767 - 757 26 1 1993 -9999.0000000 93.5239095 - 758 27 1 1993 -9999.0000000 90.2708322 - 759 28 1 1993 -9999.0000000 87.2923671 - 760 29 1 1993 -9999.0000000 84.6361669 - 761 30 1 1993 -9999.0000000 82.3813324 - 762 31 1 1993 -9999.0000000 80.1158574 - 763 1 2 1993 -9999.0000000 78.1352883 - 764 2 2 1993 -9999.0000000 76.2895596 - 765 3 2 1993 -9999.0000000 74.6051459 - 766 4 2 1993 -9999.0000000 73.0318415 - 767 5 2 1993 -9999.0000000 71.4994424 - 768 6 2 1993 -9999.0000000 70.0559293 - 769 7 2 1993 -9999.0000000 68.6934542 - 770 8 2 1993 -9999.0000000 67.4048202 - 771 9 2 1993 -9999.0000000 66.1835472 - 772 10 2 1993 -9999.0000000 65.0237961 - 773 11 2 1993 -9999.0000000 63.9203014 - 774 12 2 1993 -9999.0000000 62.8683115 - 775 13 2 1993 -9999.0000000 61.8635354 - 776 14 2 1993 -9999.0000000 60.9020953 - 777 15 2 1993 -9999.0000000 59.9804839 - 778 16 2 1993 -9999.0000000 59.0955273 - 779 17 2 1993 -9999.0000000 58.2443509 - 780 18 2 1993 -9999.0000000 57.4243493 - 781 19 2 1993 -9999.0000000 56.6397710 - 782 20 2 1993 -9999.0000000 55.8966112 - 783 21 2 1993 -9999.0000000 55.1612891 - 784 22 2 1993 -9999.0000000 54.4423255 - 785 23 2 1993 -9999.0000000 53.7448724 - 786 24 2 1993 -9999.0000000 53.0674486 - 787 25 2 1993 -9999.0000000 52.4087046 - 788 26 2 1993 -9999.0000000 51.7674102 - 789 27 2 1993 -9999.0000000 51.3032118 - 790 28 2 1993 -9999.0000000 51.9603001 - 791 1 3 1993 50.5000000 51.0057785 - 792 2 3 1993 48.5000000 50.6891158 - 793 3 3 1993 46.6000000 50.1830828 - 794 4 3 1993 46.6000000 49.5697883 - 795 5 3 1993 48.5000000 48.9345271 - 796 6 3 1993 47.5000000 48.3194234 - 797 7 3 1993 68.8000000 47.8098664 - 798 8 3 1993 52.6000000 47.4653668 - 799 9 3 1993 39.8000000 47.2499024 - 800 10 3 1993 43.8000000 47.2475098 - 801 11 3 1993 42.2000000 46.9177755 - 802 12 3 1993 42.2000000 46.4690988 - 803 13 3 1993 38.3000000 46.0612857 - 804 14 3 1993 42.2000000 45.6562417 - 805 15 3 1993 44.7000000 45.1767737 - 806 16 3 1993 44.7000000 44.5886216 - 807 17 3 1993 43.8000000 44.0053915 - 808 18 3 1993 44.7000000 43.4397056 - 809 19 3 1993 44.7000000 42.8903584 - 810 20 3 1993 43.0000000 42.3562498 - 811 21 3 1993 41.3000000 41.8363765 - 812 22 3 1993 41.3000000 41.3298228 - 813 23 3 1993 41.3000000 50.4360332 - 814 24 3 1993 44.7000000 87.1111223 - 815 25 3 1993 70.0000000 90.8975366 - 816 26 3 1993 106.0000000 81.6342970 - 817 27 3 1993 88.2000000 77.2904413 - 818 28 3 1993 82.9000000 74.0268661 - 819 29 3 1993 63.8000000 71.0419700 - 820 30 3 1993 54.9000000 68.0709136 - 821 31 3 1993 52.6000000 65.5448832 - 822 1 4 1993 50.5000000 65.5930786 - 823 2 4 1993 50.5000000 65.5464062 - 824 3 4 1993 53.7000000 64.6399913 - 825 4 4 1993 60.1000000 64.2480293 - 826 5 4 1993 56.0000000 61.9580428 - 827 6 4 1993 56.0000000 60.6420683 - 828 7 4 1993 54.9000000 59.5932622 - 829 8 4 1993 56.5000000 57.9510987 - 830 9 4 1993 53.7000000 56.3540251 - 831 10 4 1993 51.6000000 63.5861906 - 832 11 4 1993 56.0000000 110.0209838 - 833 12 4 1993 106.0000000 137.4285627 - 834 13 4 1993 158.0000000 170.6536008 - 835 14 4 1993 222.0000000 187.2585362 - 836 15 4 1993 209.0000000 177.4269516 - 837 16 4 1993 194.0000000 158.4379646 - 838 17 4 1993 158.0000000 138.3838258 - 839 18 4 1993 126.0000000 122.7081540 - 840 19 4 1993 113.0000000 109.3940186 - 841 20 4 1993 106.0000000 98.6729690 - 842 21 4 1993 100.0000000 91.1768172 - 843 22 4 1993 98.9000000 85.2114664 - 844 23 4 1993 94.8000000 80.4213275 - 845 24 4 1993 90.8000000 76.2060612 - 846 25 4 1993 88.2000000 72.4215426 - 847 26 4 1993 82.9000000 69.0830443 - 848 27 4 1993 77.7000000 66.1391729 - 849 28 4 1993 75.1000000 63.5722453 - 850 29 4 1993 76.4000000 61.4739781 - 851 30 4 1993 75.1000000 67.7331494 - 852 1 5 1993 73.8000000 66.7584469 - 853 2 5 1993 68.8000000 61.8263528 - 854 3 5 1993 67.5000000 59.6448936 - 855 4 5 1993 66.3000000 57.9184456 - 856 5 5 1993 67.5000000 57.1228553 - 857 6 5 1993 66.3000000 55.0251283 - 858 7 5 1993 68.8000000 55.3538966 - 859 8 5 1993 63.8000000 62.3383861 - 860 9 5 1993 62.6000000 60.8170264 - 861 10 5 1993 61.3000000 55.8860308 - 862 11 5 1993 60.1000000 53.6137816 - 863 12 5 1993 65.0000000 51.9224432 - 864 13 5 1993 62.6000000 50.4952949 - 865 14 5 1993 58.9000000 49.1896902 - 866 15 5 1993 57.2000000 52.1044677 - 867 16 5 1993 56.0000000 53.0902181 - 868 17 5 1993 56.0000000 49.5704208 - 869 18 5 1993 54.9000000 48.1261129 - 870 19 5 1993 54.9000000 46.7759644 - 871 20 5 1993 56.0000000 45.5530342 - 872 21 5 1993 56.0000000 44.6670440 - 873 22 5 1993 54.9000000 43.3045552 - 874 23 5 1993 52.6000000 42.2758607 - 875 24 5 1993 51.6000000 41.3101705 - 876 25 5 1993 48.5000000 40.4027919 - 877 26 5 1993 47.5000000 39.5485723 - 878 27 5 1993 45.6000000 38.7428616 - 879 28 5 1993 45.6000000 55.0966858 - 880 29 5 1993 53.7000000 48.5742104 - 881 30 5 1993 53.7000000 40.2982754 - 882 31 5 1993 49.5000000 39.3581480 - 883 1 6 1993 51.6000000 38.4752317 - 884 2 6 1993 47.5000000 39.6455210 - 885 3 6 1993 47.5000000 69.6341024 - 886 4 6 1993 53.7000000 59.1521197 - 887 5 6 1993 51.6000000 48.3354942 - 888 6 6 1993 52.6000000 46.4727206 - 889 7 6 1993 48.5000000 45.3769577 - 890 8 6 1993 52.6000000 43.9303946 - 891 9 6 1993 50.5000000 42.3942063 - 892 10 6 1993 46.6000000 42.0155328 - 893 11 6 1993 46.6000000 47.5571556 - 894 12 6 1993 47.5000000 49.1458605 - 895 13 6 1993 45.6000000 44.9422773 - 896 14 6 1993 44.7000000 41.3753076 - 897 15 6 1993 52.6000000 40.1182065 - 898 16 6 1993 48.5000000 38.9821914 - 899 17 6 1993 51.6000000 46.2860300 - 900 18 6 1993 52.6000000 43.7534705 - 901 19 6 1993 47.5000000 39.5223273 - 902 20 6 1993 44.7000000 41.3675552 - 903 21 6 1993 45.6000000 44.7093142 - 904 22 6 1993 48.5000000 40.1531643 - 905 23 6 1993 47.5000000 57.8838785 - 906 24 6 1993 58.9000000 72.1777015 - 907 25 6 1993 62.6000000 58.6185210 - 908 26 6 1993 60.1000000 51.5771091 - 909 27 6 1993 60.1000000 49.0454845 - 910 28 6 1993 56.0000000 51.4427869 - 911 29 6 1993 57.2000000 51.0354869 - 912 30 6 1993 53.7000000 46.8552917 - 913 1 7 1993 49.5000000 44.9769704 - 914 2 7 1993 48.5000000 43.3256652 - 915 3 7 1993 54.9000000 41.8039745 - 916 4 7 1993 49.5000000 40.3993655 - 917 5 7 1993 43.8000000 39.1006177 - 918 6 7 1993 43.0000000 58.1188094 - 919 7 7 1993 44.7000000 51.0222933 - 920 8 7 1993 41.3000000 43.4410115 - 921 9 7 1993 38.3000000 41.6339253 - 922 10 7 1993 39.1000000 42.1454969 - 923 11 7 1993 37.6000000 76.8101164 - 924 12 7 1993 38.3000000 66.9356870 - 925 13 7 1993 66.3000000 50.8436647 - 926 14 7 1993 53.7000000 47.6970630 - 927 15 7 1993 44.7000000 45.0732090 - 928 16 7 1993 43.0000000 43.2198711 - 929 17 7 1993 37.6000000 41.6007721 - 930 18 7 1993 37.0000000 48.3538591 - 931 19 7 1993 37.0000000 50.8464495 - 932 20 7 1993 39.8000000 52.5718460 - 933 21 7 1993 46.6000000 49.9234123 - 934 22 7 1993 48.5000000 44.1586580 - 935 23 7 1993 45.6000000 41.3146194 - 936 24 7 1993 45.6000000 38.8906920 - 937 25 7 1993 42.2000000 37.2302677 - 938 26 7 1993 43.8000000 85.9467965 - 939 27 7 1993 73.8000000 70.4630076 - 940 28 7 1993 57.7000000 53.5164816 - 941 29 7 1993 53.7000000 49.8005858 - 942 30 7 1993 49.5000000 46.5868279 - 943 31 7 1993 43.8000000 43.8706809 - 944 1 8 1993 40.6000000 41.9561574 - 945 2 8 1993 37.6000000 40.3208897 - 946 3 8 1993 39.1000000 38.8173260 - 947 4 8 1993 37.6000000 37.4340672 - 948 5 8 1993 36.3000000 36.1592498 - 949 6 8 1993 39.1000000 37.9016918 - 950 7 8 1993 41.3000000 35.2421859 - 951 8 8 1993 39.1000000 34.6243272 - 952 9 8 1993 39.8000000 45.1930468 - 953 10 8 1993 43.0000000 36.7686681 - 954 11 8 1993 37.0000000 33.2161515 - 955 12 8 1993 37.0000000 32.2361672 - 956 13 8 1993 36.3000000 31.3254567 - 957 14 8 1993 37.6000000 30.4775679 - 958 15 8 1993 34.5000000 29.6867084 - 959 16 8 1993 35.1000000 28.9476683 - 960 17 8 1993 35.1000000 30.2252887 - 961 18 8 1993 35.7000000 29.6021221 - 962 19 8 1993 35.1000000 27.8420692 - 963 20 8 1993 35.1000000 27.0094646 - 964 21 8 1993 33.3000000 26.4230341 - 965 22 8 1993 32.8000000 25.8702153 - 966 23 8 1993 34.5000000 25.3483697 - 967 24 8 1993 33.9000000 33.6589133 - 968 25 8 1993 37.6000000 87.5704786 - 969 26 8 1993 53.7000000 65.8786298 - 970 27 8 1993 81.6000000 70.8250253 - 971 28 8 1993 76.4000000 74.0511694 - 972 29 8 1993 77.7000000 59.9244383 - 973 30 8 1993 68.8000000 53.2978984 - 974 31 8 1993 56.5000000 49.5576599 - 975 1 9 1993 52.6000000 46.8597454 - 976 2 9 1993 48.5000000 44.4276539 - 977 3 9 1993 43.8000000 62.1496132 - 978 4 9 1993 76.4000000 93.2294331 - 979 5 9 1993 131.0000000 94.2118386 - 980 6 9 1993 124.0000000 79.8583131 - 981 7 9 1993 96.2000000 71.8178230 - 982 8 9 1993 75.1000000 68.6307816 - 983 9 9 1993 62.6000000 92.0986681 - 984 10 9 1993 88.2000000 144.6765695 - 985 11 9 1993 177.0000000 149.0129210 - 986 12 9 1993 186.0000000 126.5146555 - 987 13 9 1993 140.0000000 125.9950894 - 988 14 9 1993 133.0000000 155.7508849 - 989 15 9 1993 206.0000000 161.2600518 - 990 16 9 1993 152.0000000 171.9937310 - 991 17 9 1993 142.0000000 216.4082343 - 992 18 9 1993 186.0000000 217.1622608 - 993 19 9 1993 221.0000000 181.5803888 - 994 20 9 1993 171.0000000 154.3731397 - 995 21 9 1993 139.0000000 132.0040893 - 996 22 9 1993 111.0000000 113.6557701 - 997 23 9 1993 103.0000000 98.7917413 - 998 24 9 1993 85.5000000 99.5728660 - 999 25 9 1993 79.0000000 218.9791792 - 1000 26 9 1993 226.0000000 340.6763679 - 1001 27 9 1993 396.0000000 333.5856030 - 1002 28 9 1993 306.0000000 286.9771372 - 1003 29 9 1993 263.0000000 308.5372318 - 1004 30 9 1993 297.0000000 311.5658309 - 1005 1 10 1993 249.0000000 338.2890617 - 1006 2 10 1993 358.0000000 514.2801297 - 1007 3 10 1993 667.0000000 564.7014247 - 1008 4 10 1993 476.0000000 464.3617234 - 1009 5 10 1993 328.0000000 389.4763669 - 1010 6 10 1993 260.0000000 434.2224228 - 1011 7 10 1993 419.0000000 520.6425342 - 1012 8 10 1993 495.0000000 606.5018001 - 1013 9 10 1993 581.0000000 635.1586059 - 1014 10 10 1993 545.0000000 527.2574179 - 1015 11 10 1993 396.0000000 440.5332735 - 1016 12 10 1993 311.0000000 376.3643070 - 1017 13 10 1993 258.0000000 331.2849866 - 1018 14 10 1993 262.0000000 350.9355121 - 1019 15 10 1993 304.0000000 370.2887818 - 1020 16 10 1993 265.0000000 322.3823682 - 1021 17 10 1993 256.0000000 280.5891864 - 1022 18 10 1993 237.0000000 292.9978871 - 1023 19 10 1993 244.0000000 289.8152009 - 1024 20 10 1993 241.0000000 258.6788608 - 1025 21 10 1993 244.0000000 554.1576876 - 1026 22 10 1993 803.0000000 960.2530307 - 1027 23 10 1993 1185.0000000 1097.6051171 - 1028 24 10 1993 993.0000000 1059.8745399 - 1029 25 10 1993 774.0000000 906.9409143 - 1030 26 10 1993 609.0000000 761.2156541 - 1031 27 10 1993 493.0000000 642.3566831 - 1032 28 10 1993 444.0000000 544.5794980 - 1033 29 10 1993 392.0000000 463.7029774 - 1034 30 10 1993 334.0000000 396.3259328 - 1035 31 10 1993 306.0000000 339.8518287 - 1036 1 11 1993 265.0000000 292.2751143 - 1037 2 11 1993 263.0000000 253.5237768 - 1038 3 11 1993 248.0000000 225.6789995 - 1039 4 11 1993 239.0000000 198.8331828 - 1040 5 11 1993 219.0000000 279.4510054 - 1041 6 11 1993 302.0000000 386.3368194 - 1042 7 11 1993 330.0000000 414.2069450 - 1043 8 11 1993 358.0000000 414.6729430 - 1044 9 11 1993 396.0000000 377.7054238 - 1045 10 11 1993 339.0000000 325.2835421 - 1046 11 11 1993 286.0000000 320.9690140 - 1047 12 11 1993 286.0000000 377.9553805 - 1048 13 11 1993 274.0000000 390.5560914 - 1049 14 11 1993 281.0000000 341.1376117 - 1050 15 11 1993 293.0000000 318.0040573 - 1051 16 11 1993 322.0000000 294.3182093 - 1052 17 11 1993 304.0000000 259.5928617 - 1053 18 11 1993 276.0000000 226.4585137 - 1054 19 11 1993 248.0000000 198.7211616 - 1055 20 11 1993 234.0000000 176.2520218 - 1056 21 11 1993 219.0000000 158.5783050 - 1057 22 11 1993 216.0000000 143.8383575 - 1058 23 11 1993 209.0000000 131.7255853 - 1059 24 11 1993 178.0000000 122.7035740 - 1060 25 11 1993 188.0000000 116.0874730 - 1061 26 11 1993 183.0000000 111.1413897 - 1062 27 11 1993 171.0000000 107.0028658 - 1063 28 11 1993 169.0000000 103.2182655 - 1064 29 11 1993 164.0000000 99.7369477 - 1065 30 11 1993 142.0000000 96.5284526 - 1066 1 12 1993 130.0000000 93.5656233 - 1067 2 12 1993 134.0000000 90.8242257 - 1068 3 12 1993 126.0000000 88.4025780 - 1069 4 12 1993 114.0000000 90.0298621 - 1070 5 12 1993 116.0000000 90.8948830 - 1071 6 12 1993 114.0000000 89.4791440 - 1072 7 12 1993 124.0000000 87.3940013 - 1073 8 12 1993 121.0000000 88.1791983 - 1074 9 12 1993 124.0000000 102.0934911 - 1075 10 12 1993 172.0000000 115.6875763 - 1076 11 12 1993 174.0000000 162.5048323 - 1077 12 12 1993 188.0000000 180.8009176 - 1078 13 12 1993 174.0000000 200.5494532 - 1079 14 12 1993 178.0000000 396.9599771 - 1080 15 12 1993 565.0000000 551.5549513 - 1081 16 12 1993 506.0000000 532.9676363 - 1082 17 12 1993 424.0000000 483.2845466 - 1083 18 12 1993 343.0000000 413.5224087 - 1084 19 12 1993 286.0000000 359.0887811 - 1085 20 12 1993 258.0000000 325.1826218 - 1086 21 12 1993 237.0000000 349.1355170 - 1087 22 12 1993 246.0000000 346.6403495 - 1088 23 12 1993 239.0000000 293.9527720 - 1089 24 12 1993 224.0000000 353.4198015 - 1090 25 12 1993 337.0000000 417.8622093 - 1091 26 12 1993 288.0000000 356.7830955 - 1092 27 12 1993 248.0000000 307.8652397 - 1093 28 12 1993 219.0000000 266.9440498 - 1094 29 12 1993 204.0000000 233.0223892 - 1095 30 12 1993 188.0000000 204.7428846 - 1096 31 12 1993 175.0000000 185.6154638 + 1 1 1 1991 -9999.0000000 84.0451965 + 2 2 1 1991 -9999.0000000 71.5795191 + 3 3 1 1991 -9999.0000000 69.3914580 + 4 4 1 1991 -9999.0000000 69.6696624 + 5 5 1 1991 -9999.0000000 76.0176584 + 6 6 1 1991 -9999.0000000 60.8850598 + 7 7 1 1991 -9999.0000000 64.6737846 + 8 8 1 1991 -9999.0000000 62.8327816 + 9 9 1 1991 -9999.0000000 57.9555711 + 10 10 1 1991 -9999.0000000 56.4962682 + 11 11 1 1991 -9999.0000000 56.1674988 + 12 12 1 1991 -9999.0000000 60.6418420 + 13 13 1 1991 -9999.0000000 59.5941382 + 14 14 1 1991 -9999.0000000 53.1783245 + 15 15 1 1991 -9999.0000000 50.5106018 + 16 16 1 1991 -9999.0000000 49.3768028 + 17 17 1 1991 -9999.0000000 48.3145197 + 18 18 1 1991 -9999.0000000 47.3138157 + 19 19 1 1991 -9999.0000000 46.3692874 + 20 20 1 1991 -9999.0000000 45.4760588 + 21 21 1 1991 -9999.0000000 44.6297267 + 22 22 1 1991 -9999.0000000 43.8263118 + 23 23 1 1991 -9999.0000000 43.0622161 + 24 24 1 1991 -9999.0000000 42.3341835 + 25 25 1 1991 -9999.0000000 41.6392656 + 26 26 1 1991 -9999.0000000 40.9747908 + 27 27 1 1991 -9999.0000000 40.3383368 + 28 28 1 1991 -9999.0000000 39.7277056 + 29 29 1 1991 -9999.0000000 39.1409017 + 30 30 1 1991 -9999.0000000 38.5761122 + 31 31 1 1991 -9999.0000000 38.0316885 + 32 1 2 1991 -9999.0000000 37.5061313 + 33 2 2 1991 -9999.0000000 36.9980754 + 34 3 2 1991 -9999.0000000 36.5062771 + 35 4 2 1991 -9999.0000000 36.0296029 + 36 5 2 1991 -9999.0000000 35.5670186 + 37 6 2 1991 -9999.0000000 35.1175803 + 38 7 2 1991 -9999.0000000 34.6804256 + 39 8 2 1991 -9999.0000000 34.2547663 + 40 9 2 1991 -9999.0000000 42.9579021 + 41 10 2 1991 -9999.0000000 90.4670536 + 42 11 2 1991 -9999.0000000 55.3363029 + 43 12 2 1991 -9999.0000000 44.1009208 + 44 13 2 1991 -9999.0000000 42.8500820 + 45 14 2 1991 -9999.0000000 41.7078634 + 46 15 2 1991 -9999.0000000 40.6426408 + 47 16 2 1991 -9999.0000000 39.6473024 + 48 17 2 1991 -9999.0000000 38.7154550 + 49 18 2 1991 -9999.0000000 37.8420730 + 50 19 2 1991 -9999.0000000 37.0343410 + 51 20 2 1991 -9999.0000000 37.2914174 + 52 21 2 1991 -9999.0000000 38.0024318 + 53 22 2 1991 -9999.0000000 40.5165278 + 54 23 2 1991 -9999.0000000 42.0894176 + 55 24 2 1991 -9999.0000000 47.4851443 + 56 25 2 1991 -9999.0000000 47.4222126 + 57 26 2 1991 -9999.0000000 42.6559335 + 58 27 2 1991 -9999.0000000 40.3479566 + 59 28 2 1991 -9999.0000000 38.2656429 + 60 1 3 1991 -9999.0000000 37.0790622 + 61 2 3 1991 -9999.0000000 36.5111452 + 62 3 3 1991 -9999.0000000 36.5436919 + 63 4 3 1991 -9999.0000000 36.5798674 + 64 5 3 1991 -9999.0000000 36.7789391 + 65 6 3 1991 -9999.0000000 39.6233133 + 66 7 3 1991 -9999.0000000 47.4446376 + 67 8 3 1991 -9999.0000000 54.3203174 + 68 9 3 1991 -9999.0000000 49.5846904 + 69 10 3 1991 -9999.0000000 48.4122660 + 70 11 3 1991 -9999.0000000 44.6313552 + 71 12 3 1991 -9999.0000000 41.6591661 + 72 13 3 1991 -9999.0000000 40.6998279 + 73 14 3 1991 -9999.0000000 39.8331570 + 74 15 3 1991 -9999.0000000 39.2325960 + 75 16 3 1991 -9999.0000000 38.0272649 + 76 17 3 1991 -9999.0000000 36.9061723 + 77 18 3 1991 -9999.0000000 37.5276633 + 78 19 3 1991 -9999.0000000 37.0338690 + 79 20 3 1991 -9999.0000000 36.5075078 + 80 21 3 1991 -9999.0000000 36.4474359 + 81 22 3 1991 -9999.0000000 44.0484026 + 82 23 3 1991 -9999.0000000 52.7413773 + 83 24 3 1991 -9999.0000000 46.3903054 + 84 25 3 1991 -9999.0000000 76.2769004 + 85 26 3 1991 -9999.0000000 67.9830093 + 86 27 3 1991 -9999.0000000 79.2673337 + 87 28 3 1991 -9999.0000000 65.0612952 + 88 29 3 1991 -9999.0000000 58.1529273 + 89 30 3 1991 -9999.0000000 54.3097972 + 90 31 3 1991 -9999.0000000 51.0958942 + 91 1 4 1991 -9999.0000000 49.3420556 + 92 2 4 1991 -9999.0000000 48.2209879 + 93 3 4 1991 -9999.0000000 46.5979551 + 94 4 4 1991 -9999.0000000 44.9518177 + 95 5 4 1991 -9999.0000000 57.8904891 + 96 6 4 1991 -9999.0000000 55.6549402 + 97 7 4 1991 -9999.0000000 47.9760201 + 98 8 4 1991 -9999.0000000 45.0054578 + 99 9 4 1991 -9999.0000000 42.7413664 + 100 10 4 1991 -9999.0000000 41.0322933 + 101 11 4 1991 -9999.0000000 39.5506098 + 102 12 4 1991 -9999.0000000 38.2079860 + 103 13 4 1991 -9999.0000000 37.2432963 + 104 14 4 1991 -9999.0000000 35.8852856 + 105 15 4 1991 -9999.0000000 34.6566195 + 106 16 4 1991 -9999.0000000 33.5884123 + 107 17 4 1991 -9999.0000000 60.2261520 + 108 18 4 1991 -9999.0000000 50.7114970 + 109 19 4 1991 -9999.0000000 45.4939399 + 110 20 4 1991 -9999.0000000 43.3762974 + 111 21 4 1991 -9999.0000000 43.6167801 + 112 22 4 1991 -9999.0000000 42.5266697 + 113 23 4 1991 -9999.0000000 41.5844705 + 114 24 4 1991 -9999.0000000 40.8651346 + 115 25 4 1991 -9999.0000000 40.3205616 + 116 26 4 1991 -9999.0000000 39.9423217 + 117 27 4 1991 -9999.0000000 39.2500826 + 118 28 4 1991 -9999.0000000 38.7906467 + 119 29 4 1991 -9999.0000000 42.8321299 + 120 30 4 1991 -9999.0000000 42.0730452 + 121 1 5 1991 -9999.0000000 39.1380754 + 122 2 5 1991 -9999.0000000 111.1807382 + 123 3 5 1991 -9999.0000000 183.1317176 + 124 4 5 1991 -9999.0000000 249.1342335 + 125 5 5 1991 -9999.0000000 258.3613359 + 126 6 5 1991 -9999.0000000 230.4604351 + 127 7 5 1991 -9999.0000000 200.9671648 + 128 8 5 1991 -9999.0000000 176.5086693 + 129 9 5 1991 -9999.0000000 195.7922925 + 130 10 5 1991 -9999.0000000 317.9764224 + 131 11 5 1991 -9999.0000000 361.6474269 + 132 12 5 1991 -9999.0000000 301.4959244 + 133 13 5 1991 -9999.0000000 256.5518756 + 134 14 5 1991 -9999.0000000 216.4817677 + 135 15 5 1991 -9999.0000000 247.0947376 + 136 16 5 1991 -9999.0000000 271.2552561 + 137 17 5 1991 -9999.0000000 257.8328756 + 138 18 5 1991 -9999.0000000 247.0727123 + 139 19 5 1991 -9999.0000000 213.8559167 + 140 20 5 1991 -9999.0000000 181.8502230 + 141 21 5 1991 -9999.0000000 155.2993121 + 142 22 5 1991 -9999.0000000 133.8336241 + 143 23 5 1991 -9999.0000000 116.6994829 + 144 24 5 1991 -9999.0000000 103.6566259 + 145 25 5 1991 -9999.0000000 93.3516992 + 146 26 5 1991 -9999.0000000 86.3408445 + 147 27 5 1991 -9999.0000000 81.9115907 + 148 28 5 1991 -9999.0000000 77.2180894 + 149 29 5 1991 -9999.0000000 73.0214460 + 150 30 5 1991 -9999.0000000 69.2937099 + 151 31 5 1991 -9999.0000000 65.9565007 + 152 1 6 1991 -9999.0000000 63.0653860 + 153 2 6 1991 -9999.0000000 60.4339422 + 154 3 6 1991 -9999.0000000 97.0854773 + 155 4 6 1991 -9999.0000000 199.9623018 + 156 5 6 1991 -9999.0000000 236.7064788 + 157 6 6 1991 -9999.0000000 248.1653511 + 158 7 6 1991 -9999.0000000 263.0496107 + 159 8 6 1991 -9999.0000000 220.4198488 + 160 9 6 1991 -9999.0000000 187.5809081 + 161 10 6 1991 -9999.0000000 161.2366754 + 162 11 6 1991 -9999.0000000 139.9178747 + 163 12 6 1991 -9999.0000000 122.0807461 + 164 13 6 1991 -9999.0000000 107.3493749 + 165 14 6 1991 -9999.0000000 95.9676361 + 166 15 6 1991 -9999.0000000 88.2934578 + 167 16 6 1991 -9999.0000000 82.8054528 + 168 17 6 1991 -9999.0000000 120.1136043 + 169 18 6 1991 -9999.0000000 130.1913273 + 170 19 6 1991 -9999.0000000 115.5811508 + 171 20 6 1991 -9999.0000000 107.8980345 + 172 21 6 1991 -9999.0000000 95.8076759 + 173 22 6 1991 -9999.0000000 87.3282117 + 174 23 6 1991 -9999.0000000 81.4304323 + 175 24 6 1991 -9999.0000000 76.9779413 + 176 25 6 1991 -9999.0000000 72.8112550 + 177 26 6 1991 -9999.0000000 74.5077757 + 178 27 6 1991 -9999.0000000 160.0563200 + 179 28 6 1991 -9999.0000000 184.1267701 + 180 29 6 1991 -9999.0000000 144.9224763 + 181 30 6 1991 -9999.0000000 126.5033508 + 182 1 7 1991 -9999.0000000 112.0498794 + 183 2 7 1991 -9999.0000000 100.2331769 + 184 3 7 1991 -9999.0000000 90.2632321 + 185 4 7 1991 -9999.0000000 81.9966111 + 186 5 7 1991 -9999.0000000 75.5124099 + 187 6 7 1991 -9999.0000000 71.0001882 + 188 7 7 1991 -9999.0000000 67.5730084 + 189 8 7 1991 -9999.0000000 66.2790901 + 190 9 7 1991 -9999.0000000 66.5326260 + 191 10 7 1991 -9999.0000000 63.0535958 + 192 11 7 1991 -9999.0000000 59.9536383 + 193 12 7 1991 -9999.0000000 57.7832914 + 194 13 7 1991 -9999.0000000 57.7108639 + 195 14 7 1991 -9999.0000000 100.6659978 + 196 15 7 1991 -9999.0000000 82.7960170 + 197 16 7 1991 -9999.0000000 68.4921983 + 198 17 7 1991 -9999.0000000 77.7906253 + 199 18 7 1991 -9999.0000000 81.5046641 + 200 19 7 1991 -9999.0000000 70.5127661 + 201 20 7 1991 -9999.0000000 65.4397193 + 202 21 7 1991 -9999.0000000 86.6436620 + 203 22 7 1991 -9999.0000000 86.2151156 + 204 23 7 1991 -9999.0000000 73.7399183 + 205 24 7 1991 -9999.0000000 92.6336235 + 206 25 7 1991 -9999.0000000 170.1215964 + 207 26 7 1991 -9999.0000000 168.6615004 + 208 27 7 1991 -9999.0000000 135.4553889 + 209 28 7 1991 -9999.0000000 132.7570772 + 210 29 7 1991 -9999.0000000 130.6469257 + 211 30 7 1991 -9999.0000000 113.5530795 + 212 31 7 1991 -9999.0000000 122.1312314 + 213 1 8 1991 -9999.0000000 122.9354402 + 214 2 8 1991 -9999.0000000 104.5081681 + 215 3 8 1991 -9999.0000000 93.9565395 + 216 4 8 1991 -9999.0000000 85.2109114 + 217 5 8 1991 -9999.0000000 78.2139340 + 218 6 8 1991 -9999.0000000 73.2234132 + 219 7 8 1991 -9999.0000000 69.8316458 + 220 8 8 1991 -9999.0000000 66.7877959 + 221 9 8 1991 -9999.0000000 64.0046332 + 222 10 8 1991 -9999.0000000 61.4556322 + 223 11 8 1991 -9999.0000000 59.1171638 + 224 12 8 1991 -9999.0000000 65.2877486 + 225 13 8 1991 -9999.0000000 67.2880622 + 226 14 8 1991 -9999.0000000 82.3440105 + 227 15 8 1991 -9999.0000000 72.5838744 + 228 16 8 1991 -9999.0000000 64.7329492 + 229 17 8 1991 -9999.0000000 61.6073721 + 230 18 8 1991 -9999.0000000 128.4775617 + 231 19 8 1991 -9999.0000000 122.9467351 + 232 20 8 1991 -9999.0000000 97.1225283 + 233 21 8 1991 -9999.0000000 87.8625406 + 234 22 8 1991 -9999.0000000 80.9887455 + 235 23 8 1991 -9999.0000000 76.4317858 + 236 24 8 1991 -9999.0000000 72.7395620 + 237 25 8 1991 -9999.0000000 70.3805186 + 238 26 8 1991 -9999.0000000 69.4163695 + 239 27 8 1991 -9999.0000000 65.4065348 + 240 28 8 1991 -9999.0000000 62.1683891 + 241 29 8 1991 -9999.0000000 64.9954394 + 242 30 8 1991 -9999.0000000 63.1782396 + 243 31 8 1991 -9999.0000000 58.7183090 + 244 1 9 1991 -9999.0000000 56.5192977 + 245 2 9 1991 -9999.0000000 54.4962052 + 246 3 9 1991 -9999.0000000 52.6317513 + 247 4 9 1991 -9999.0000000 50.9104832 + 248 5 9 1991 -9999.0000000 49.3185703 + 249 6 9 1991 -9999.0000000 47.8436246 + 250 7 9 1991 -9999.0000000 46.4786964 + 251 8 9 1991 -9999.0000000 45.2228578 + 252 9 9 1991 -9999.0000000 44.0371728 + 253 10 9 1991 -9999.0000000 42.9283193 + 254 11 9 1991 -9999.0000000 41.8912864 + 255 12 9 1991 -9999.0000000 58.0773267 + 256 13 9 1991 -9999.0000000 53.7811887 + 257 14 9 1991 -9999.0000000 48.2348062 + 258 15 9 1991 -9999.0000000 46.5309547 + 259 16 9 1991 -9999.0000000 43.7811799 + 260 17 9 1991 -9999.0000000 42.5082808 + 261 18 9 1991 -9999.0000000 41.4011907 + 262 19 9 1991 -9999.0000000 40.3673565 + 263 20 9 1991 -9999.0000000 39.4001224 + 264 21 9 1991 -9999.0000000 38.4934458 + 265 22 9 1991 -9999.0000000 72.1297070 + 266 23 9 1991 -9999.0000000 94.2729222 + 267 24 9 1991 -9999.0000000 76.8797956 + 268 25 9 1991 -9999.0000000 65.5469450 + 269 26 9 1991 -9999.0000000 86.4226850 + 270 27 9 1991 -9999.0000000 91.3184733 + 271 28 9 1991 -9999.0000000 81.9781897 + 272 29 9 1991 -9999.0000000 100.5874344 + 273 30 9 1991 -9999.0000000 168.1402668 + 274 1 10 1991 -9999.0000000 184.1906106 + 275 2 10 1991 -9999.0000000 145.7855559 + 276 3 10 1991 -9999.0000000 125.4703540 + 277 4 10 1991 -9999.0000000 108.8577622 + 278 5 10 1991 -9999.0000000 96.0799823 + 279 6 10 1991 -9999.0000000 85.7924352 + 280 7 10 1991 -9999.0000000 79.9030525 + 281 8 10 1991 -9999.0000000 103.3316994 + 282 9 10 1991 -9999.0000000 100.5133042 + 283 10 10 1991 -9999.0000000 85.3663345 + 284 11 10 1991 -9999.0000000 77.4278693 + 285 12 10 1991 -9999.0000000 132.7258128 + 286 13 10 1991 -9999.0000000 189.3607854 + 287 14 10 1991 -9999.0000000 218.5159946 + 288 15 10 1991 -9999.0000000 243.9508547 + 289 16 10 1991 -9999.0000000 221.7987855 + 290 17 10 1991 -9999.0000000 201.8622155 + 291 18 10 1991 -9999.0000000 325.4231795 + 292 19 10 1991 -9999.0000000 454.9378835 + 293 20 10 1991 -9999.0000000 443.7051762 + 294 21 10 1991 -9999.0000000 373.5628305 + 295 22 10 1991 -9999.0000000 317.4953952 + 296 23 10 1991 -9999.0000000 270.4888491 + 297 24 10 1991 -9999.0000000 232.2852598 + 298 25 10 1991 -9999.0000000 199.9022150 + 299 26 10 1991 -9999.0000000 171.8078419 + 300 27 10 1991 -9999.0000000 147.6525937 + 301 28 10 1991 -9999.0000000 128.1005490 + 302 29 10 1991 -9999.0000000 112.9954450 + 303 30 10 1991 -9999.0000000 101.0798696 + 304 31 10 1991 -9999.0000000 92.9009064 + 305 1 11 1991 -9999.0000000 87.5985503 + 306 2 11 1991 -9999.0000000 83.3732986 + 307 3 11 1991 -9999.0000000 84.2117916 + 308 4 11 1991 -9999.0000000 233.4936509 + 309 5 11 1991 -9999.0000000 369.2943284 + 310 6 11 1991 -9999.0000000 324.5799443 + 311 7 11 1991 -9999.0000000 274.4485987 + 312 8 11 1991 -9999.0000000 235.0353762 + 313 9 11 1991 -9999.0000000 233.5551984 + 314 10 11 1991 -9999.0000000 227.7519776 + 315 11 11 1991 -9999.0000000 192.6658838 + 316 12 11 1991 -9999.0000000 165.7222538 + 317 13 11 1991 -9999.0000000 197.8739167 + 318 14 11 1991 -9999.0000000 321.4592842 + 319 15 11 1991 -9999.0000000 444.5702732 + 320 16 11 1991 -9999.0000000 581.1674450 + 321 17 11 1991 -9999.0000000 620.6986963 + 322 18 11 1991 -9999.0000000 522.7858621 + 323 19 11 1991 -9999.0000000 590.4431155 + 324 20 11 1991 -9999.0000000 830.6209957 + 325 21 11 1991 -9999.0000000 986.7338426 + 326 22 11 1991 -9999.0000000 953.6724536 + 327 23 11 1991 -9999.0000000 834.9895308 + 328 24 11 1991 -9999.0000000 756.0296492 + 329 25 11 1991 -9999.0000000 680.4330436 + 330 26 11 1991 -9999.0000000 580.2159411 + 331 27 11 1991 -9999.0000000 497.1133412 + 332 28 11 1991 -9999.0000000 427.0106996 + 333 29 11 1991 -9999.0000000 367.1001274 + 334 30 11 1991 -9999.0000000 315.6794847 + 335 1 12 1991 -9999.0000000 272.6676294 + 336 2 12 1991 -9999.0000000 236.7187804 + 337 3 12 1991 -9999.0000000 206.8791284 + 338 4 12 1991 -9999.0000000 181.9323029 + 339 5 12 1991 -9999.0000000 160.9473826 + 340 6 12 1991 -9999.0000000 143.2659102 + 341 7 12 1991 -9999.0000000 129.5235376 + 342 8 12 1991 -9999.0000000 120.2304176 + 343 9 12 1991 -9999.0000000 114.1543972 + 344 10 12 1991 -9999.0000000 109.3464919 + 345 11 12 1991 -9999.0000000 105.0793966 + 346 12 12 1991 -9999.0000000 101.1701631 + 347 13 12 1991 -9999.0000000 97.5799590 + 348 14 12 1991 -9999.0000000 94.2831994 + 349 15 12 1991 -9999.0000000 91.2744508 + 350 16 12 1991 -9999.0000000 88.4659345 + 351 17 12 1991 -9999.0000000 85.8594372 + 352 18 12 1991 -9999.0000000 83.4425333 + 353 19 12 1991 -9999.0000000 81.1971061 + 354 20 12 1991 -9999.0000000 80.3460727 + 355 21 12 1991 -9999.0000000 79.2792974 + 356 22 12 1991 -9999.0000000 81.1583189 + 357 23 12 1991 -9999.0000000 82.6952614 + 358 24 12 1991 -9999.0000000 80.4576829 + 359 25 12 1991 -9999.0000000 77.9781102 + 360 26 12 1991 -9999.0000000 76.1261377 + 361 27 12 1991 -9999.0000000 74.2365539 + 362 28 12 1991 -9999.0000000 73.3892881 + 363 29 12 1991 -9999.0000000 71.8904326 + 364 30 12 1991 -9999.0000000 70.2218559 + 365 31 12 1991 -9999.0000000 68.7169280 diff --git a/check/case_04/simulation_mhm_case04.ini b/check/case_04/simulation_mhm_case04.ini new file mode 100644 index 00000000..d949ec0d --- /dev/null +++ b/check/case_04/simulation_mhm_case04.ini @@ -0,0 +1,42 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_04 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig__nbasins = 6 +nml__mainconfig__resolution_hydrology = 24000, 12000, 24000, 24000, 12000, 24000 +nml__mainconfig__l0basin = 1, 1, 2, 3, 4, 5 +nml__mainconfig_mhm_mrm__dir_restartin = ../../test_basin/restart/, ../../test_basin/restart/, ../../test_basin_2/restart/, ../../test_basin/restart/, ../../test_basin/restart/, ../../test_basin_2/restart/ +nml__mainconfig_mhm_mrm__resolution_Routing = 24000, 24000, 24000, 24000, 12000, 24000 +nml__directories_general__dir_morpho = ../../test_basin/input/morph/, ../../test_basin/input/morph/, ../../test_basin_2/input/morph/, ../../test_basin/input/morph/, ../../test_basin/input/morph/, ../../test_basin_2/input/morph/ +nml__directories_general__dir_lcover = ../../test_basin/input/luse/, ../../test_basin/input/luse/, ../../test_basin_2/input/luse/, ../../test_basin/input/luse/, ../../test_basin/input/luse/, ../../test_basin_2/input/luse/ +nml__directories_general__dir_restartout = output_b1/b1_, output_b1/b2_, output_b1/b3_, output_b1/b4_,output_b1/b5_, output_b1/b6_ +nml__directories_general__dir_out = output_b1/b1_, output_b1/b2_, output_b1/b3_, output_b1/b4_,output_b1/b5_, output_b1/b6_ +nml__directories_general__file_latlon = ../../test_basin/input/latlon/latlon_1.nc, ../../test_basin/input/latlon/latlon_2.nc, ../../test_basin_2/input/latlon/latlon.nc, ../../test_basin/input/latlon/latlon_1.nc, ../../test_basin/input/latlon/latlon_2.nc, ../../test_basin_2/input/latlon/latlon.nc +nml__directories_mhm__dir_precipitation = ../../test_basin/input/meteo/pre/, ../../test_basin/input/meteo/pre/, ../../test_basin_2/input/meteo/pre/, ../../test_basin/input/meteo/pre/, ../../test_basin/input/meteo/pre/, ../../test_basin_2/input/meteo/pre/ +nml__directories_mhm__dir_temperature = ../../test_basin/input/meteo/tavg/, ../../test_basin/input/meteo/tavg/, ../../test_basin_2/input/meteo/tavg/, ../../test_basin/input/meteo/tavg/, ../../test_basin/input/meteo/tavg/, ../../test_basin_2/input/meteo/tavg/ +nml__directories_mhm__dir_referenceet = ../../test_basin/input/meteo/pet/, ../../test_basin/input/meteo/pet/, ../../test_basin_2/input/meteo/pet/, ../../test_basin/input/meteo/pet/, ../../test_basin/input/meteo/pet/, ../../test_basin_2/input/meteo/pet/ +nml__directories_mhm__time_step_model_inputs = 0, 0, 0, 0, 0, 0 +nml__directories_mrm__dir_gauges = ../../test_basin/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin_2/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin_2/input/gauge/ +nml__directories_mrm__dir_total_runoff = ../../test_basin/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin_2/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin_2/input/gauge/ +nml__time_periods__warming_days = 180, 180, 180, 360, 50, 0 +nml__time_periods__eval_per(1) = {ystart: 1990, mstart: 7, dstart: 1, yend: 1990, mend: 12, dend: 31} +nml__time_periods__eval_per(2) = {ystart: 1991, mstart: 1, dstart: 1, yend: 1992, mend: 12, dend: 31} +nml__time_periods__eval_per(3) = {ystart: 1993, mstart: 1, dstart: 1, yend: 1993, mend: 12, dend: 31} +nml__time_periods__eval_per(4) = {ystart: 1990, mstart: 7, dstart: 1, yend: 1990, mend: 12, dend: 31} +nml__time_periods__eval_per(5) = {ystart: 1992, mstart: 1, dstart: 1, yend: 1992, mend: 12, dend: 31} +nml__time_periods__eval_per(6) = {ystart: 1991, mstart: 1, dstart: 1, yend: 1991, mend: 12, dend: 31} +nml__evaluation_gauges__ngaugestotal = 6 +nml__evaluation_gauges__nogauges_basin = 1, 1, 1, 1, 1, 1 +nml__evaluation_gauges__gauge_id = [398], [398], [45], [398], [398], [45] +nml__evaluation_gauges__gauge_filename = [00398.txt], [00398.txt], [45.txt], [00398.txt], [00398.txt], [45.txt] diff --git a/check/case_05/mhm.nml b/check/case_05/mhm.nml index 0711dd81..e16a72c9 100644 --- a/check/case_05/mhm.nml +++ b/check/case_05/mhm.nml @@ -1,657 +1,179 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" +&directories_general + dir_lcover(1:3) = '../../test_basin/input/luse/', '../../test_basin/input/luse/', + '../../test_basin/input/luse/' + dir_morpho(1:3) = '../../test_basin/input/morph/', '../../test_basin/input/morph/', + '../../test_basin/input/morph/' + dir_out(1:3) = 'output_b1/b1_', 'output_b1/b2_', 'output_b1/b3_' + dir_restartout(1:3) = 'output_b1/b1_', 'output_b1/b2_', 'output_b1/b3_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1:3) = '../../test_basin/input/latlon/latlon_1.nc', '../../test_basin/input/latlon/latlon_1.nc', + '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 + +&directories_mhm + dir_absvappressure(1:3) = '../../test_basin/input/meteo/', '../../test_basin/input/meteo/', + '../../test_basin/input/meteo/' + dir_maxtemperature(1:3) = '../../test_basin/input/meteo/', '../../test_basin/input/meteo/', + '../../test_basin/input/meteo/' + dir_mintemperature(1:3) = '../../test_basin/input/meteo/', '../../test_basin/input/meteo/', + '../../test_basin/input/meteo/' + dir_netradiation(1:3) = '../../test_basin/input/meteo/', '../../test_basin/input/meteo/', + '../../test_basin/input/meteo/' + dir_precipitation(1:3) = '../../test_basin/input/meteo/pre/', '../../test_basin/input/meteo/pre/', + '../../test_basin/input/meteo/pre/' + dir_referenceet(1:3) = '../../test_basin/input/meteo/pet/', '../../test_basin/input/meteo/pet/', + '../../test_basin/input/meteo/pet/' + dir_temperature(1:3) = '../../test_basin/input/meteo/tavg/', '../../test_basin/input/meteo/tavg/', + '../../test_basin/input/meteo/tavg/' + dir_windspeed(1:3) = '../../test_basin/input/meteo/', '../../test_basin/input/meteo/', + '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1:3) = 0, 0, 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" -dir_Gauges(3) = "../../test_basin/input/gauge/" +&directories_mpr + dir_gridded_lai(1:3) = '../../test_basin/input/lai/', '../../test_basin/input/lai/', + '../../test_basin/input/lai/' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -&directories_general -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/b1_" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 3 -!> directory where morphological files are located -dir_Morpho(3) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(3) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(3) = "restart/" -!> directory where restart output should be written -dir_RestartOut(3) = "output_b1/b3_" -!> directory where output should be written -dir_Out(3) = "output_b1/b3_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(3) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1:3) = '../../test_basin/input/gauge/', '../../test_basin/input/gauge/', + '../../test_basin/input/gauge/' + dir_total_runoff(1:3) = '../../test_basin/input/gauge/', '../../test_basin/input/gauge/', + '../../test_basin/input/gauge/' / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_mHM -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -! -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" -! -!**** for Basin 3 -!> directory where meteorological input is located -dir_Precipitation(3) = "../../test_basin/input/meteo/pre/" -dir_Temperature(3) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(3) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(3) = "../../test_basin/input/meteo/" -dir_MaxTemperature(3) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(3) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(3) = "../../test_basin/input/meteo/" -dir_windspeed(3) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(3) = "../../test_basin/input/lai/" + +&evaluation_gauges + gauge_filename(1,1:2) = '00398.txt', '00333.txt' + gauge_filename(2,1:2) = '00398.txt', '00333.txt' + gauge_filename(3,1:2) = '00398.txt', '00333.txt' + gauge_id(1,1:2) = 398, 333 + gauge_id(2,1:2) = 398, 333 + gauge_id(3,1:2) = 398, 333 + ngaugestotal = 6 + nogauges_basin(1:3) = 2, 2, 2 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&inflow_gauges + inflowgauge_filename(1,1) = '00333.txt' + inflowgauge_filename(2,1) = '00333.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_headwater(2,1) = .true. + inflowgauge_id(1,1) = 333 + inflowgauge_id(2,1) = 333 + ninflowgaugestotal = 2 + noinflowgauges_basin(1:3) = 1, 1, 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 3 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -resolution_Hydrology(3) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -resolution_Routing(3) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -L0Basin(3) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = -2 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 360 -warming_Days(3) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1990 -eval_Per(3)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -eval_Per(3)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -eval_Per(3)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -eval_Per(3)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -eval_Per(3)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -eval_Per(3)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 -time_step_model_inputs(3) = 0 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1:3) = 1, 1, 1 + nbasins = 3 + resolution_hydrology(1:3) = 24000, 24000, 24000 + write_restart = .true. +/ -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' +&mainconfig_mhm_mrm + dir_restartin(1:3) = '../../test_basin/restart/', '../../test_basin/restart/', + '../../test_basin/restart/' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1:3) = 24000, 24000, 24000 + timestep = 1 +/ -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = -2 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 6 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 2 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -!> id of gauge(2) for subbasin(1) --> (1,2) -Gauge_id(1,2) = 333 -!> name of file with timeseries of gauge(2) for subbasin(1) --> (1,2) -gauge_filename(1,2) = "00333.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 2 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -!> id of gauge(2) for subbasin(2) --> (2,2) -Gauge_id(2,2) = 333 -!> name of file with timeseries of gauge(2) for subbasin(2) --> (2,2) -gauge_filename(2,2) = "00333.txt" -! -!> basin 3 -!> number of gauges for subbasin (3) -NoGauges_basin(3) = 2 -!> id of gauge(1) for subbasin(2) --> (3,1) -Gauge_id(3,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(3) --> (3,1) -Gauge_filename(3,1) = "00398.txt" -!> id of gauge(2) for subbasin(2) --> (2,2) -Gauge_id(3,2) = 333 -!> name of file with timeseries of gauge(2) for subbasin(3) --> (3,2) -gauge_filename(3,2) = "00333.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 1 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 333 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00333.txt" -!> consider flows from upstream/headwater cells of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_Headwater(1,1) = .FALSE. -! -!> basin 2 -!> number of gauges for subbasin (2) -NoInflowGauges_basin(2) = 1 -!> id of inflow gauge(1) for subbasin(2) --> (2,1) -InflowGauge_id(2,1) = 333 -!> name of file with timeseries of inflow gauge(1) for subbasin(2) --> (2,1) -InflowGauge_filename(2,1) = "00333.txt" -!> consider flows from upstream/headwater cells of inflow gauge(1) for subbasin(2) --> (2,1) -InflowGauge_Headwater(2,1) = .TRUE. -! -!> basin 3 -!> number of gauges for subbasin (3) -NoInflowGauges_basin(3) = 0 +&processselection + processcase(1:10) = 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + eval_per(2)%dend = 30 + eval_per(2)%dstart = 1 + eval_per(2)%mend = 6 + eval_per(2)%mstart = 7 + eval_per(2)%yend = 1991 + eval_per(2)%ystart = 1990 + eval_per(3)%dend = 30 + eval_per(3)%dstart = 1 + eval_per(3)%mend = 6 + eval_per(3)%mstart = 7 + eval_per(3)%yend = 1991 + eval_per(3)%ystart = 1990 + warming_days(1:3) = 181, 181, 181 / diff --git a/check/case_05/output_save/ConfigFile.log b/check/case_05/output_save/ConfigFile.log index e3315291..542a1e85 100644 --- a/check/case_05/output_save/ConfigFile.log +++ b/check/case_05/output_save/ConfigFile.log @@ -1,22 +1,41 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N Number of basins 3 -Total No. of nodes 102 -Total No. of reaches 101 -No. of cells L0 46545 -No. of cells L1 102 -No. of cells L11 102 Total No. of gauges 6 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 6 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. + Basin 2 +No. of cells L0 46545 + Basin 2 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 6 Basin 2 Hydrology Resolution [m] 24000. Basin 2 Routing Resolution [m] 24000. + Basin 3 +No. of cells L0 46545 + Basin 3 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 6 Basin 3 Hydrology Resolution [m] 24000. Basin 3 Routing Resolution [m] 24000. Flag READ restart F @@ -27,63 +46,45 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 ------------------------------------------------------------- Model Run Periods for Basin 2 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 ------------------------------------------------------------- Model Run Periods for Basin 3 ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- Land Cover Observations for Basin 4 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 3 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -147,19 +148,19 @@ Simulation Period (1)+(2) 6 1 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 - 2 1 6310.000 714.000 - 3 2 1600.000 11.000 - 4 2 6310.000 714.000 - 5 3 1600.000 11.000 - 6 3 6310.000 714.000 + 1 1 932.000 16.000 + 2 1 3710.000 781.000 + 3 2 932.000 16.000 + 4 2 3710.000 781.000 + 5 3 932.000 16.000 + 6 3 3710.000 781.000 -------------------------------------------------- Basin Inflow Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 6310.000 678.000 - 2 2 6310.000 678.000 + 1 1 5130.000 781.000 + 2 2 5130.000 781.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -228,40 +229,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -369,80 +370,80 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 35 1 126.750 - 36 2 229.750 - 37 3 107.750 - 38 4 312.500 - 39 5 573.750 - 40 6 314.250 - 41 7 42.500 - 42 8 524.750 - 43 9 576.000 - 44 10 146.500 - 45 11 470.000 - 46 12 576.000 - 47 13 414.500 - 48 14 340.750 - 49 15 9.000 - 50 16 230.250 - 51 17 576.000 - 52 18 576.000 - 53 19 527.250 - 54 20 48.250 - 55 21 10.500 - 56 22 545.000 - 57 23 576.000 - 58 24 576.000 - 59 25 318.500 - 60 26 456.250 - 61 27 551.250 - 62 28 576.000 - 63 29 337.000 - 64 30 3.250 - 65 31 198.000 - 66 32 555.250 - 67 33 89.000 - 68 34 121.750 + 1 1 126.750 + 2 2 229.750 + 3 3 107.750 + 4 4 312.500 + 5 5 573.750 + 6 6 314.250 + 7 7 42.500 + 8 8 524.750 + 9 9 576.000 + 10 10 146.500 + 11 11 470.000 + 12 12 576.000 + 13 13 414.500 + 14 14 340.750 + 15 15 9.000 + 16 16 230.250 + 17 17 576.000 + 18 18 576.000 + 19 19 527.250 + 20 20 48.250 + 21 21 10.500 + 22 22 545.000 + 23 23 576.000 + 24 24 576.000 + 25 25 318.500 + 26 26 456.250 + 27 27 551.250 + 28 28 576.000 + 29 29 337.000 + 30 30 3.250 + 31 31 198.000 + 32 32 555.250 + 33 33 89.000 + 34 34 121.750 ------------------------------ Total[km2] 11636.250 @@ -510,81 +511,81 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 69 1 - 70 2 - 71 3 - 72 4 - 73 5 - 74 6 - 75 7 - 76 8 - 77 9 - 78 10 - 79 11 - 80 12 - 81 13 - 82 14 - 83 15 - 84 16 - 85 17 - 86 18 - 87 19 - 88 20 - 89 21 - 90 22 - 91 23 - 92 24 - 93 25 - 94 26 - 95 27 - 96 28 - 97 29 - 98 30 - 99 31 - 100 32 - 101 33 - 102 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective Cell Cell Id Area Id [-] [km2] ------------------------------ - 69 1 126.750 - 70 2 229.750 - 71 3 107.750 - 72 4 312.500 - 73 5 573.750 - 74 6 314.250 - 75 7 42.500 - 76 8 524.750 - 77 9 576.000 - 78 10 146.500 - 79 11 470.000 - 80 12 576.000 - 81 13 414.500 - 82 14 340.750 - 83 15 9.000 - 84 16 230.250 - 85 17 576.000 - 86 18 576.000 - 87 19 527.250 - 88 20 48.250 - 89 21 10.500 - 90 22 545.000 - 91 23 576.000 - 92 24 576.000 - 93 25 318.500 - 94 26 456.250 - 95 27 551.250 - 96 28 576.000 - 97 29 337.000 - 98 30 3.250 - 99 31 198.000 - 100 32 555.250 - 101 33 89.000 - 102 34 121.750 + 1 1 126.750 + 2 2 229.750 + 3 3 107.750 + 4 4 312.500 + 5 5 573.750 + 6 6 314.250 + 7 7 42.500 + 8 8 524.750 + 9 9 576.000 + 10 10 146.500 + 11 11 470.000 + 12 12 576.000 + 13 13 414.500 + 14 14 340.750 + 15 15 9.000 + 16 16 230.250 + 17 17 576.000 + 18 18 576.000 + 19 19 527.250 + 20 20 48.250 + 21 21 10.500 + 22 22 545.000 + 23 23 576.000 + 24 24 576.000 + 25 25 318.500 + 26 26 456.250 + 27 27 551.250 + 28 28 576.000 + 29 29 337.000 + 30 30 3.250 + 31 31 198.000 + 32 32 555.250 + 33 33 89.000 + 34 34 121.750 ------------------------------ Total[km2] 11636.250 - + diff --git a/check/case_05/output_save/b1_daily_discharge.out b/check/case_05/output_save/b1_daily_discharge.out index 61623a60..b58cd23b 100644 --- a/check/case_05/output_save/b1_daily_discharge.out +++ b/check/case_05/output_save/b1_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 Qobs_0000000333 Qsim_0000000333 - 1 1 1 1990 157.0000000 1266.9614717 1210.0000000 1210.0000000 - 2 2 1 1990 129.0000000 1171.8667245 1120.0000000 1120.0000000 - 3 3 1 1990 117.0000000 1110.2597612 1070.0000000 1070.0000000 - 4 4 1 1990 111.0000000 1065.8040986 1030.0000000 1030.0000000 - 5 5 1 1990 112.0000000 1031.6029180 1000.0000000 1000.0000000 - 6 6 1 1990 93.0000000 1011.4790256 985.0000000 985.0000000 - 7 7 1 1990 87.0000000 976.4585682 946.0000000 946.0000000 - 8 8 1 1990 84.0000000 947.6910124 922.0000000 922.0000000 - 9 9 1 1990 80.0000000 920.9528826 896.0000000 896.0000000 - 10 10 1 1990 78.0000000 910.8560515 892.0000000 892.0000000 - 11 11 1 1990 78.0000000 903.5829314 885.0000000 885.0000000 - 12 12 1 1990 77.0000000 903.4357333 888.0000000 888.0000000 - 13 13 1 1990 76.0000000 899.8603455 882.0000000 882.0000000 - 14 14 1 1990 73.0000000 869.9474243 840.0000000 840.0000000 - 15 15 1 1990 66.0000000 863.3002456 837.0000000 837.0000000 - 16 16 1 1990 76.0000000 850.1487724 824.0000000 824.0000000 - 17 17 1 1990 73.0000000 842.0489739 818.0000000 818.0000000 - 18 18 1 1990 71.0000000 847.2292321 829.0000000 829.0000000 - 19 19 1 1990 90.0000000 868.0553149 851.0000000 851.0000000 - 20 20 1 1990 82.0000000 859.8246198 830.0000000 830.0000000 - 21 21 1 1990 80.0000000 854.6634558 833.0000000 833.0000000 - 22 22 1 1990 81.0000000 848.1902038 826.0000000 826.0000000 - 23 23 1 1990 97.0000000 890.4235869 797.0000000 797.0000000 - 24 24 1 1990 198.0000000 902.5040947 807.0000000 807.0000000 - 25 25 1 1990 392.0000000 1056.6508916 949.0000000 949.0000000 - 26 26 1 1990 519.0000000 1254.6010428 1170.0000000 1170.0000000 - 27 27 1 1990 565.0000000 1407.3252000 1330.0000000 1330.0000000 - 28 28 1 1990 331.0000000 1542.6755953 1480.0000000 1480.0000000 - 29 29 1 1990 293.0000000 1536.8120055 1450.0000000 1450.0000000 - 30 30 1 1990 302.0000000 1385.2264706 1280.0000000 1280.0000000 - 31 31 1 1990 233.0000000 1266.5282987 1190.0000000 1190.0000000 - 32 1 2 1990 198.0000000 1197.7881845 1120.0000000 1120.0000000 - 33 2 2 1990 183.0000000 1133.1965072 1060.0000000 1060.0000000 - 34 3 2 1990 206.0000000 1091.4030444 1030.0000000 1030.0000000 - 35 4 2 1990 215.0000000 1062.3863388 1010.0000000 1010.0000000 - 36 5 2 1990 183.0000000 1060.3708493 1020.0000000 1020.0000000 - 37 6 2 1990 159.0000000 1029.6216868 982.0000000 982.0000000 - 38 7 2 1990 167.0000000 1003.1601973 963.0000000 963.0000000 - 39 8 2 1990 138.0000000 968.3517871 927.0000000 927.0000000 - 40 9 2 1990 126.0000000 949.4554878 916.0000000 916.0000000 - 41 10 2 1990 131.0000000 965.2751403 888.0000000 888.0000000 - 42 11 2 1990 173.0000000 989.5226965 910.0000000 910.0000000 - 43 12 2 1990 240.0000000 1063.5773133 985.0000000 985.0000000 - 44 13 2 1990 270.0000000 1181.2204348 1080.0000000 1080.0000000 - 45 14 2 1990 458.0000000 1415.8869689 1230.0000000 1230.0000000 - 46 15 2 1990 996.0000000 1872.5672159 1750.0000000 1750.0000000 - 47 16 2 1990 1370.0000000 3388.1043816 3620.0000000 3620.0000000 - 48 17 2 1990 1540.0000000 4710.3177424 4830.0000000 4830.0000000 - 49 18 2 1990 1210.0000000 5188.8135115 5130.0000000 5130.0000000 - 50 19 2 1990 616.0000000 4979.0930685 4800.0000000 4800.0000000 - 51 20 2 1990 465.0000000 4406.5203554 4180.0000000 4180.0000000 - 52 21 2 1990 373.0000000 3725.1804197 3500.0000000 3500.0000000 - 53 22 2 1990 298.0000000 3142.0020659 2960.0000000 2960.0000000 - 54 23 2 1990 270.0000000 2725.9967181 2590.0000000 2590.0000000 - 55 24 2 1990 234.0000000 2443.6003019 2340.0000000 2340.0000000 - 56 25 2 1990 218.0000000 2271.1936711 2190.0000000 2190.0000000 - 57 26 2 1990 203.0000000 2170.6213023 2020.0000000 2020.0000000 - 58 27 2 1990 314.0000000 2234.2350114 2100.0000000 2100.0000000 - 59 28 2 1990 520.0000000 2748.0856436 2700.0000000 2700.0000000 - 60 1 3 1990 689.0000000 3307.1911427 3240.0000000 3240.0000000 - 61 2 3 1990 777.0000000 3805.3551873 3760.0000000 3760.0000000 - 62 3 3 1990 584.0000000 4024.4255709 3930.0000000 3930.0000000 - 63 4 3 1990 429.0000000 3953.9934813 3820.0000000 3820.0000000 - 64 5 3 1990 365.0000000 3662.4717612 3500.0000000 3500.0000000 - 65 6 3 1990 281.0000000 3226.5868576 3050.0000000 3050.0000000 - 66 7 3 1990 257.0000000 2841.8888656 2700.0000000 2700.0000000 - 67 8 3 1990 231.0000000 2553.6275658 2440.0000000 2440.0000000 - 68 9 3 1990 211.0000000 2342.5503652 2250.0000000 2250.0000000 - 69 10 3 1990 191.0000000 2171.8132330 2090.0000000 2090.0000000 - 70 11 3 1990 182.0000000 2047.0922672 1980.0000000 1980.0000000 - 71 12 3 1990 173.0000000 1918.7705359 1850.0000000 1850.0000000 - 72 13 3 1990 159.0000000 1801.6516197 1740.0000000 1740.0000000 - 73 14 3 1990 153.0000000 1720.2579816 1670.0000000 1670.0000000 - 74 15 3 1990 141.0000000 1640.5462869 1590.0000000 1590.0000000 - 75 16 3 1990 136.0000000 1589.6288256 1550.0000000 1550.0000000 - 76 17 3 1990 130.0000000 1571.1883470 1540.0000000 1540.0000000 - 77 18 3 1990 123.0000000 1528.9119174 1490.0000000 1490.0000000 - 78 19 3 1990 115.0000000 1462.2102611 1420.0000000 1420.0000000 - 79 20 3 1990 113.0000000 1414.3625489 1380.0000000 1380.0000000 - 80 21 3 1990 102.0000000 1412.1039246 1390.0000000 1390.0000000 - 81 22 3 1990 105.0000000 1375.1419016 1340.0000000 1340.0000000 - 82 23 3 1990 106.0000000 1332.2874952 1300.0000000 1300.0000000 - 83 24 3 1990 87.0000000 1329.9911087 1310.0000000 1310.0000000 - 84 25 3 1990 80.0000000 1339.2134968 1320.0000000 1320.0000000 - 85 26 3 1990 84.0000000 1356.3010373 1340.0000000 1340.0000000 - 86 27 3 1990 82.0000000 1337.1459589 1310.0000000 1310.0000000 - 87 28 3 1990 91.0000000 1330.4127570 1310.0000000 1310.0000000 - 88 29 3 1990 97.0000000 1345.8855189 1330.0000000 1330.0000000 - 89 30 3 1990 110.0000000 1411.1865218 1410.0000000 1410.0000000 - 90 31 3 1990 97.0000000 1444.3320981 1430.0000000 1430.0000000 - 91 1 4 1990 93.0000000 1402.0928808 1370.0000000 1370.0000000 - 92 2 4 1990 85.0000000 1372.4708808 1350.0000000 1350.0000000 - 93 3 4 1990 84.0000000 1377.0830333 1360.0000000 1360.0000000 - 94 4 4 1990 81.0000000 1379.6661780 1360.0000000 1360.0000000 - 95 5 4 1990 81.0000000 1362.7765398 1340.0000000 1340.0000000 - 96 6 4 1990 76.0000000 1334.5605381 1310.0000000 1310.0000000 - 97 7 4 1990 72.0000000 1280.9531674 1250.0000000 1250.0000000 - 98 8 4 1990 68.0000000 1259.0971805 1240.0000000 1240.0000000 - 99 9 4 1990 72.0000000 1240.9835794 1220.0000000 1220.0000000 - 100 10 4 1990 65.0000000 1236.0449833 1220.0000000 1220.0000000 - 101 11 4 1990 62.0000000 1220.2706037 1200.0000000 1200.0000000 - 102 12 4 1990 62.0000000 1230.8652537 1220.0000000 1220.0000000 - 103 13 4 1990 65.0000000 1244.2943564 1230.0000000 1230.0000000 - 104 14 4 1990 68.0000000 1258.2308967 1230.0000000 1230.0000000 - 105 15 4 1990 75.0000000 1231.5436690 1200.0000000 1200.0000000 - 106 16 4 1990 90.0000000 1254.3508094 1240.0000000 1240.0000000 - 107 17 4 1990 92.0000000 1315.7265328 1310.0000000 1310.0000000 - 108 18 4 1990 94.0000000 1376.9882175 1370.0000000 1370.0000000 - 109 19 4 1990 110.0000000 1390.1580421 1370.0000000 1370.0000000 - 110 20 4 1990 99.0000000 1397.0833435 1380.0000000 1380.0000000 - 111 21 4 1990 86.0000000 1398.8204360 1380.0000000 1380.0000000 - 112 22 4 1990 86.0000000 1372.5936041 1340.0000000 1340.0000000 - 113 23 4 1990 86.0000000 1316.8060798 1280.0000000 1280.0000000 - 114 24 4 1990 88.0000000 1262.0397811 1230.0000000 1230.0000000 - 115 25 4 1990 93.0000000 1365.4132569 1380.0000000 1380.0000000 - 116 26 4 1990 99.0000000 1499.1877997 1510.0000000 1510.0000000 - 117 27 4 1990 86.0000000 1512.7455769 1490.0000000 1490.0000000 - 118 28 4 1990 74.0000000 1492.0893878 1470.0000000 1470.0000000 - 119 29 4 1990 72.0000000 1440.6327181 1410.0000000 1410.0000000 - 120 30 4 1990 77.0000000 1380.0861731 1350.0000000 1350.0000000 - 121 1 5 1990 56.0000000 1365.8732168 1350.0000000 1350.0000000 - 122 2 5 1990 64.0000000 1303.6953324 1270.0000000 1270.0000000 - 123 3 5 1990 58.0000000 1254.1294623 1230.0000000 1230.0000000 - 124 4 5 1990 50.0000000 1229.1663102 1210.0000000 1210.0000000 - 125 5 5 1990 50.0000000 1201.0877720 1180.0000000 1180.0000000 - 126 6 5 1990 50.0000000 1201.6081863 1190.0000000 1190.0000000 - 127 7 5 1990 50.0000000 1203.5781954 1190.0000000 1190.0000000 - 128 8 5 1990 53.0000000 1226.4274826 1220.0000000 1220.0000000 - 129 9 5 1990 62.0000000 1279.3448593 1280.0000000 1280.0000000 - 130 10 5 1990 64.0000000 1327.8991407 1320.0000000 1320.0000000 - 131 11 5 1990 65.0000000 1335.5600471 1320.0000000 1320.0000000 - 132 12 5 1990 75.0000000 1341.2855458 1330.0000000 1330.0000000 - 133 13 5 1990 71.0000000 1404.9605689 1410.0000000 1410.0000000 - 134 14 5 1990 63.0000000 1415.2228021 1400.0000000 1400.0000000 - 135 15 5 1990 61.0000000 1374.0964988 1350.0000000 1350.0000000 - 136 16 5 1990 49.0000000 1362.4210434 1350.0000000 1350.0000000 - 137 17 5 1990 46.0000000 1369.8830091 1360.0000000 1360.0000000 - 138 18 5 1990 46.0000000 1371.9293334 1360.0000000 1360.0000000 - 139 19 5 1990 48.0000000 1371.7039915 1360.0000000 1360.0000000 - 140 20 5 1990 41.0000000 1371.4910104 1360.0000000 1360.0000000 - 141 21 5 1990 45.0000000 1356.0721741 1340.0000000 1340.0000000 - 142 22 5 1990 52.0000000 1366.8540695 1360.0000000 1360.0000000 - 143 23 5 1990 50.0000000 1394.6726101 1390.0000000 1390.0000000 - 144 24 5 1990 56.0000000 1416.7233008 1410.0000000 1410.0000000 - 145 25 5 1990 41.0000000 1436.4465984 1430.0000000 1430.0000000 - 146 26 5 1990 40.0000000 1479.3958013 1480.0000000 1480.0000000 - 147 27 5 1990 39.0000000 1552.3550220 1560.0000000 1560.0000000 - 148 28 5 1990 39.0000000 1717.0406899 1750.0000000 1750.0000000 - 149 29 5 1990 33.0000000 1683.1478273 1650.0000000 1650.0000000 - 150 30 5 1990 37.0000000 1559.8439068 1520.0000000 1520.0000000 - 151 31 5 1990 30.0000000 1483.6935470 1460.0000000 1460.0000000 - 152 1 6 1990 37.0000000 1452.1360163 1430.0000000 1430.0000000 - 153 2 6 1990 36.0000000 1412.0835241 1390.0000000 1390.0000000 - 154 3 6 1990 40.0000000 1405.3267697 1370.0000000 1370.0000000 - 155 4 6 1990 45.0000000 1402.2416677 1390.0000000 1390.0000000 - 156 5 6 1990 39.0000000 1410.2115445 1400.0000000 1400.0000000 - 157 6 6 1990 48.0000000 1381.3307028 1360.0000000 1360.0000000 - 158 7 6 1990 39.0000000 1437.5106623 1420.0000000 1420.0000000 - 159 8 6 1990 49.0000000 1531.1512645 1530.0000000 1530.0000000 - 160 9 6 1990 84.0000000 1610.2443716 1600.0000000 1600.0000000 - 161 10 6 1990 91.0000000 1696.5105155 1700.0000000 1700.0000000 - 162 11 6 1990 80.0000000 1879.1331734 1910.0000000 1910.0000000 - 163 12 6 1990 66.0000000 1987.9582647 1990.0000000 1990.0000000 - 164 13 6 1990 53.0000000 2044.0229238 2040.0000000 2040.0000000 - 165 14 6 1990 64.0000000 2039.3097830 2020.0000000 2020.0000000 - 166 15 6 1990 55.0000000 2041.8139791 2030.0000000 2030.0000000 - 167 16 6 1990 54.0000000 2051.2360243 2040.0000000 2040.0000000 - 168 17 6 1990 42.0000000 2022.1390311 2000.0000000 2000.0000000 - 169 18 6 1990 48.0000000 1919.9491155 1880.0000000 1880.0000000 - 170 19 6 1990 48.0000000 1827.5581733 1790.0000000 1790.0000000 - 171 20 6 1990 60.0000000 1793.7557839 1770.0000000 1770.0000000 - 172 21 6 1990 75.0000000 1786.3674567 1770.0000000 1770.0000000 - 173 22 6 1990 78.0000000 1831.0046920 1830.0000000 1830.0000000 - 174 23 6 1990 66.0000000 2007.3696818 2040.0000000 2040.0000000 - 175 24 6 1990 63.0000000 2037.9391574 2020.0000000 2020.0000000 - 176 25 6 1990 52.0000000 1924.6903603 1880.0000000 1880.0000000 - 177 26 6 1990 49.0000000 1799.6415406 1760.0000000 1760.0000000 - 178 27 6 1990 44.0000000 1723.5282653 1690.0000000 1690.0000000 - 179 28 6 1990 51.0000000 1735.0110428 1730.0000000 1730.0000000 - 180 29 6 1990 61.0000000 1740.6789776 1710.0000000 1710.0000000 - 181 30 6 1990 81.0000000 1801.6651272 1780.0000000 1780.0000000 - 182 1 7 1990 79.0000000 1774.2545038 1740.0000000 1740.0000000 - 183 2 7 1990 92.0000000 1862.9758430 1870.0000000 1870.0000000 - 184 3 7 1990 72.0000000 2014.8750969 2030.0000000 2030.0000000 - 185 4 7 1990 58.0000000 2068.0702268 2050.0000000 2050.0000000 - 186 5 7 1990 69.0000000 2082.6731465 2040.0000000 2040.0000000 - 187 6 7 1990 94.0000000 2137.3285353 2130.0000000 2130.0000000 - 188 7 7 1990 199.0000000 2246.0938231 2240.0000000 2240.0000000 - 189 8 7 1990 133.0000000 2336.8836934 2330.0000000 2330.0000000 - 190 9 7 1990 124.0000000 2407.7608639 2400.0000000 2400.0000000 - 191 10 7 1990 123.0000000 2391.2270265 2360.0000000 2360.0000000 - 192 11 7 1990 99.0000000 2311.1695479 2270.0000000 2270.0000000 - 193 12 7 1990 88.0000000 2304.7183037 2290.0000000 2290.0000000 - 194 13 7 1990 84.0000000 2238.6923420 2200.0000000 2200.0000000 - 195 14 7 1990 72.0000000 2147.6558973 2110.0000000 2110.0000000 - 196 15 7 1990 55.0000000 2049.0160592 2010.0000000 2010.0000000 - 197 16 7 1990 65.0000000 1948.1877950 1910.0000000 1910.0000000 - 198 17 7 1990 50.0000000 1855.1588164 1820.0000000 1820.0000000 - 199 18 7 1990 50.0000000 1772.2039139 1740.0000000 1740.0000000 - 200 19 7 1990 46.0000000 1714.7433600 1690.0000000 1690.0000000 - 201 20 7 1990 44.0000000 1656.4813126 1630.0000000 1630.0000000 - 202 21 7 1990 42.0000000 1603.6990225 1580.0000000 1580.0000000 - 203 22 7 1990 37.0000000 1522.3879300 1490.0000000 1490.0000000 - 204 23 7 1990 38.0000000 1462.8336378 1440.0000000 1440.0000000 - 205 24 7 1990 44.0000000 1427.8849973 1410.0000000 1410.0000000 - 206 25 7 1990 30.0000000 1389.8234531 1370.0000000 1370.0000000 - 207 26 7 1990 26.0000000 1341.7896118 1320.0000000 1320.0000000 - 208 27 7 1990 31.0000000 1291.4951583 1270.0000000 1270.0000000 - 209 28 7 1990 33.0000000 1260.7289195 1240.0000000 1240.0000000 - 210 29 7 1990 42.0000000 1220.5796797 1200.0000000 1200.0000000 - 211 30 7 1990 36.0000000 1179.0189881 1160.0000000 1160.0000000 - 212 31 7 1990 34.0000000 1169.6106957 1160.0000000 1160.0000000 - 213 1 8 1990 25.0000000 1246.5097665 1260.0000000 1260.0000000 - 214 2 8 1990 22.0000000 1261.4181293 1250.0000000 1250.0000000 - 215 3 8 1990 28.0000000 1204.9154446 1180.0000000 1180.0000000 - 216 4 8 1990 25.0000000 1150.1441637 1130.0000000 1130.0000000 - 217 5 8 1990 19.0000000 1107.6708786 1090.0000000 1090.0000000 - 218 6 8 1990 22.0000000 1067.4943643 1050.0000000 1050.0000000 - 219 7 8 1990 19.0000000 1058.1868796 1050.0000000 1050.0000000 - 220 8 8 1990 22.0000000 1058.0300940 1050.0000000 1050.0000000 - 221 9 8 1990 19.0000000 1050.1671512 1040.0000000 1040.0000000 - 222 10 8 1990 20.0000000 1047.7412857 1040.0000000 1040.0000000 - 223 11 8 1990 19.0000000 1016.7491162 1000.0000000 1000.0000000 - 224 12 8 1990 19.0000000 1002.0804612 993.0000000 993.0000000 - 225 13 8 1990 22.0000000 979.8152162 963.0000000 963.0000000 - 226 14 8 1990 36.0000000 973.0831566 956.0000000 956.0000000 - 227 15 8 1990 31.0000000 995.1087696 988.0000000 988.0000000 - 228 16 8 1990 30.0000000 1042.8607814 1040.0000000 1040.0000000 - 229 17 8 1990 28.0000000 1072.8210494 1070.0000000 1070.0000000 - 230 18 8 1990 34.0000000 1078.2889214 1070.0000000 1070.0000000 - 231 19 8 1990 21.0000000 1047.2218769 1030.0000000 1030.0000000 - 232 20 8 1990 30.0000000 1030.1716543 1020.0000000 1020.0000000 - 233 21 8 1990 22.0000000 1019.9904164 1010.0000000 1010.0000000 - 234 22 8 1990 21.0000000 1025.2502152 1020.0000000 1020.0000000 - 235 23 8 1990 23.0000000 988.0317355 969.0000000 969.0000000 - 236 24 8 1990 20.0000000 949.9972069 935.0000000 935.0000000 - 237 25 8 1990 29.0000000 933.6092833 924.0000000 924.0000000 - 238 26 8 1990 20.0000000 935.5994511 930.0000000 930.0000000 - 239 27 8 1990 22.0000000 932.2151252 924.0000000 924.0000000 - 240 28 8 1990 23.0000000 951.5527624 951.0000000 951.0000000 - 241 29 8 1990 35.0000000 959.9229304 954.0000000 954.0000000 - 242 30 8 1990 51.0000000 998.3031879 947.0000000 947.0000000 - 243 31 8 1990 80.0000000 1002.8506704 958.0000000 958.0000000 - 244 1 9 1990 56.0000000 1006.6209887 995.0000000 995.0000000 - 245 2 9 1990 33.0000000 1045.3150246 1040.0000000 1040.0000000 - 246 3 9 1990 27.0000000 1077.7640265 1070.0000000 1070.0000000 - 247 4 9 1990 27.0000000 1068.3496005 1050.0000000 1050.0000000 - 248 5 9 1990 28.0000000 1055.3119559 1040.0000000 1040.0000000 - 249 6 9 1990 26.0000000 1029.1796334 1010.0000000 1010.0000000 - 250 7 9 1990 24.0000000 1011.7346891 991.0000000 991.0000000 - 251 8 9 1990 33.0000000 1019.1469101 1010.0000000 1010.0000000 - 252 9 9 1990 26.0000000 1021.5805897 1010.0000000 1010.0000000 - 253 10 9 1990 27.0000000 1028.7344065 1020.0000000 1020.0000000 - 254 11 9 1990 22.0000000 1045.9426321 1040.0000000 1040.0000000 - 255 12 9 1990 22.0000000 1017.6532007 998.0000000 998.0000000 - 256 13 9 1990 21.0000000 970.6082951 950.0000000 950.0000000 - 257 14 9 1990 22.0000000 928.4014379 910.0000000 910.0000000 - 258 15 9 1990 22.0000000 882.6558468 863.0000000 863.0000000 - 259 16 9 1990 22.0000000 859.2555669 847.0000000 847.0000000 - 260 17 9 1990 20.0000000 842.1946650 830.0000000 830.0000000 - 261 18 9 1990 22.0000000 856.5588515 854.0000000 854.0000000 - 262 19 9 1990 16.0000000 844.0549159 831.0000000 831.0000000 - 263 20 9 1990 22.0000000 813.8854948 799.0000000 799.0000000 - 264 21 9 1990 19.0000000 804.5864479 790.0000000 790.0000000 - 265 22 9 1990 32.0000000 841.0570490 805.0000000 805.0000000 - 266 23 9 1990 27.0000000 907.3604863 913.0000000 913.0000000 - 267 24 9 1990 45.0000000 998.4521348 998.0000000 998.0000000 - 268 25 9 1990 42.0000000 1129.4795973 1150.0000000 1150.0000000 - 269 26 9 1990 39.0000000 1347.4955576 1390.0000000 1390.0000000 - 270 27 9 1990 30.0000000 1424.8137244 1420.0000000 1420.0000000 - 271 28 9 1990 28.0000000 1330.7743193 1290.0000000 1290.0000000 - 272 29 9 1990 30.0000000 1215.6697696 1180.0000000 1180.0000000 - 273 30 9 1990 30.0000000 1151.5149102 1110.0000000 1110.0000000 - 274 1 10 1990 56.0000000 1154.8004635 1130.0000000 1130.0000000 - 275 2 10 1990 72.0000000 1133.7856104 1110.0000000 1110.0000000 - 276 3 10 1990 73.0000000 1276.9780135 1290.0000000 1290.0000000 - 277 4 10 1990 68.0000000 1427.1590599 1440.0000000 1440.0000000 - 278 5 10 1990 53.0000000 1395.9731081 1360.0000000 1360.0000000 - 279 6 10 1990 42.0000000 1345.5927326 1320.0000000 1320.0000000 - 280 7 10 1990 33.0000000 1389.3565077 1390.0000000 1390.0000000 - 281 8 10 1990 42.0000000 1334.9466894 1300.0000000 1300.0000000 - 282 9 10 1990 34.0000000 1228.6486330 1190.0000000 1190.0000000 - 283 10 10 1990 36.0000000 1148.7312476 1120.0000000 1120.0000000 - 284 11 10 1990 36.0000000 1124.3241151 1110.0000000 1110.0000000 - 285 12 10 1990 28.0000000 1090.5557958 1070.0000000 1070.0000000 - 286 13 10 1990 32.0000000 1042.2789905 1020.0000000 1020.0000000 - 287 14 10 1990 27.0000000 1008.7438204 992.0000000 992.0000000 - 288 15 10 1990 35.0000000 967.2058704 947.0000000 947.0000000 - 289 16 10 1990 42.0000000 925.1121844 906.0000000 906.0000000 - 290 17 10 1990 35.0000000 897.3399596 881.0000000 881.0000000 - 291 18 10 1990 39.0000000 890.0044625 880.0000000 880.0000000 - 292 19 10 1990 34.0000000 882.8457804 872.0000000 872.0000000 - 293 20 10 1990 32.0000000 878.3603728 869.0000000 869.0000000 - 294 21 10 1990 34.0000000 866.5610345 855.0000000 855.0000000 - 295 22 10 1990 27.0000000 839.9306545 825.0000000 825.0000000 - 296 23 10 1990 31.0000000 817.3818601 805.0000000 805.0000000 - 297 24 10 1990 28.0000000 818.7404115 813.0000000 813.0000000 - 298 25 10 1990 25.0000000 813.5917028 803.0000000 803.0000000 - 299 26 10 1990 29.0000000 807.9304835 789.0000000 789.0000000 - 300 27 10 1990 31.0000000 806.8222381 781.0000000 781.0000000 - 301 28 10 1990 65.0000000 883.8337077 786.0000000 786.0000000 - 302 29 10 1990 69.0000000 945.8934831 891.0000000 891.0000000 - 303 30 10 1990 157.0000000 1042.6734945 1010.0000000 1010.0000000 - 304 31 10 1990 190.0000000 1192.0533059 1180.0000000 1180.0000000 - 305 1 11 1990 115.0000000 1484.4471640 1510.0000000 1510.0000000 - 306 2 11 1990 104.0000000 1659.5898178 1640.0000000 1640.0000000 - 307 3 11 1990 100.0000000 1767.0585858 1750.0000000 1750.0000000 - 308 4 11 1990 131.0000000 1750.0994743 1700.0000000 1700.0000000 - 309 5 11 1990 130.0000000 1711.3679865 1670.0000000 1670.0000000 - 310 6 11 1990 115.0000000 1708.8946857 1680.0000000 1680.0000000 - 311 7 11 1990 102.0000000 1739.3634865 1720.0000000 1720.0000000 - 312 8 11 1990 95.0000000 1715.3043122 1680.0000000 1680.0000000 - 313 9 11 1990 81.0000000 1603.8159559 1550.0000000 1550.0000000 - 314 10 11 1990 66.0000000 1486.5146137 1430.0000000 1430.0000000 - 315 11 11 1990 67.0000000 1383.7025512 1320.0000000 1320.0000000 - 316 12 11 1990 74.0000000 1304.1523944 1260.0000000 1260.0000000 - 317 13 11 1990 109.0000000 1335.1729441 1310.0000000 1310.0000000 - 318 14 11 1990 92.0000000 1584.2729181 1610.0000000 1610.0000000 - 319 15 11 1990 92.0000000 1722.8394906 1710.0000000 1710.0000000 - 320 16 11 1990 155.0000000 1726.0124122 1690.0000000 1690.0000000 - 321 17 11 1990 159.0000000 1846.1132651 1850.0000000 1850.0000000 - 322 18 11 1990 131.0000000 2057.5876155 2070.0000000 2070.0000000 - 323 19 11 1990 161.0000000 2124.2153637 2090.0000000 2090.0000000 - 324 20 11 1990 196.0000000 2267.6868524 2220.0000000 2220.0000000 - 325 21 11 1990 336.0000000 2550.7414968 2560.0000000 2560.0000000 - 326 22 11 1990 566.0000000 2852.8860569 2870.0000000 2870.0000000 - 327 23 11 1990 373.0000000 2969.9244269 2940.0000000 2940.0000000 - 328 24 11 1990 293.0000000 3031.2983991 3000.0000000 3000.0000000 - 329 25 11 1990 264.0000000 3026.3311518 2970.0000000 2970.0000000 - 330 26 11 1990 226.0000000 2813.1232608 2710.0000000 2710.0000000 - 331 27 11 1990 201.0000000 2501.8006773 2390.0000000 2390.0000000 - 332 28 11 1990 180.0000000 2286.4213854 2210.0000000 2210.0000000 - 333 29 11 1990 161.0000000 2133.3775310 2060.0000000 2060.0000000 - 334 30 11 1990 149.0000000 2002.9197807 1940.0000000 1940.0000000 - 335 1 12 1990 134.0000000 1879.1997692 1820.0000000 1820.0000000 - 336 2 12 1990 113.0000000 1772.1417591 1720.0000000 1720.0000000 - 337 3 12 1990 99.0000000 1669.9373833 1620.0000000 1620.0000000 - 338 4 12 1990 107.0000000 1575.8354959 1530.0000000 1530.0000000 - 339 5 12 1990 99.0000000 1515.0152911 1480.0000000 1480.0000000 - 340 6 12 1990 89.0000000 1478.9002755 1450.0000000 1450.0000000 - 341 7 12 1990 77.0000000 1424.3916050 1390.0000000 1390.0000000 - 342 8 12 1990 71.0000000 1363.1763278 1330.0000000 1330.0000000 - 343 9 12 1990 68.0000000 1302.0910860 1270.0000000 1270.0000000 - 344 10 12 1990 73.0000000 1241.1193291 1210.0000000 1210.0000000 - 345 11 12 1990 84.0000000 1203.3908657 1180.0000000 1180.0000000 - 346 12 12 1990 88.0000000 1218.3901038 1190.0000000 1190.0000000 - 347 13 12 1990 92.0000000 1246.5236998 1220.0000000 1220.0000000 - 348 14 12 1990 128.0000000 1233.1461538 1200.0000000 1200.0000000 - 349 15 12 1990 136.0000000 1217.4289589 1190.0000000 1190.0000000 - 350 16 12 1990 114.0000000 1205.6830783 1180.0000000 1180.0000000 - 351 17 12 1990 101.0000000 1155.5797155 1120.0000000 1120.0000000 - 352 18 12 1990 93.0000000 1101.9373979 1070.0000000 1070.0000000 - 353 19 12 1990 85.0000000 1081.5889682 1060.0000000 1060.0000000 - 354 20 12 1990 81.0000000 1062.7973981 1040.0000000 1040.0000000 - 355 21 12 1990 106.0000000 1087.1871072 1040.0000000 1040.0000000 - 356 22 12 1990 159.0000000 1107.6111033 1040.0000000 1040.0000000 - 357 23 12 1990 250.0000000 1152.7758656 1090.0000000 1090.0000000 - 358 24 12 1990 298.0000000 1239.9861581 1200.0000000 1200.0000000 - 359 25 12 1990 261.0000000 1372.6272780 1320.0000000 1320.0000000 - 360 26 12 1990 228.0000000 1502.1285261 1410.0000000 1410.0000000 - 361 27 12 1990 409.0000000 1603.3031680 1510.0000000 1510.0000000 - 362 28 12 1990 486.0000000 1759.6368181 1680.0000000 1680.0000000 - 363 29 12 1990 440.0000000 2076.6008477 1970.0000000 1970.0000000 - 364 30 12 1990 486.0000000 2311.5391557 2190.0000000 2190.0000000 - 365 31 12 1990 774.0000000 2545.3201944 2440.0000000 2440.0000000 - 366 1 1 1991 889.0000000 3002.1973195 2950.0000000 2950.0000000 - 367 2 1 1991 863.0000000 3429.9289338 3300.0000000 3300.0000000 - 368 3 1 1991 875.0000000 3714.4730631 3520.0000000 3520.0000000 - 369 4 1 1991 932.0000000 3885.3693886 3700.0000000 3700.0000000 - 370 5 1 1991 826.0000000 3931.9080963 3710.0000000 3710.0000000 - 371 6 1 1991 731.0000000 3844.7042440 3620.0000000 3620.0000000 - 372 7 1 1991 613.0000000 3653.2540376 3430.0000000 3430.0000000 - 373 8 1 1991 610.0000000 3404.7717675 3180.0000000 3180.0000000 - 374 9 1 1991 686.0000000 3304.0495727 3130.0000000 3130.0000000 - 375 10 1 1991 556.0000000 3386.3931484 3200.0000000 3200.0000000 - 376 11 1 1991 669.0000000 3321.9908032 3080.0000000 3080.0000000 - 377 12 1 1991 828.0000000 3207.0431978 3010.0000000 3010.0000000 - 378 13 1 1991 735.0000000 3094.1877471 2930.0000000 2930.0000000 - 379 14 1 1991 513.0000000 3002.6004597 2870.0000000 2870.0000000 - 380 15 1 1991 411.0000000 2836.3058598 2700.0000000 2700.0000000 - 381 16 1 1991 345.0000000 2641.4828530 2520.0000000 2520.0000000 - 382 17 1 1991 293.0000000 2424.8621784 2310.0000000 2310.0000000 - 383 18 1 1991 251.0000000 2236.4873109 2140.0000000 2140.0000000 - 384 19 1 1991 222.0000000 2098.6721675 2020.0000000 2020.0000000 - 385 20 1 1991 215.0000000 1982.1988307 1910.0000000 1910.0000000 - 386 21 1 1991 213.0000000 1855.7964077 1780.0000000 1780.0000000 - 387 22 1 1991 202.0000000 1758.0660656 1690.0000000 1690.0000000 - 388 23 1 1991 200.0000000 1687.5852654 1630.0000000 1630.0000000 - 389 24 1 1991 192.0000000 1624.9057823 1570.0000000 1570.0000000 - 390 25 1 1991 176.0000000 1531.3488357 1470.0000000 1470.0000000 - 391 26 1 1991 164.0000000 1459.8689511 1410.0000000 1410.0000000 - 392 27 1 1991 157.0000000 1413.1125602 1370.0000000 1370.0000000 - 393 28 1 1991 134.0000000 1363.4579755 1320.0000000 1320.0000000 - 394 29 1 1991 130.0000000 1311.7309829 1270.0000000 1270.0000000 - 395 30 1 1991 119.0000000 1275.6182202 1240.0000000 1240.0000000 - 396 31 1 1991 107.0000000 1259.6664314 1230.0000000 1230.0000000 - 397 1 2 1991 112.0000000 1232.9964695 1200.0000000 1200.0000000 - 398 2 2 1991 109.0000000 1194.1641152 1160.0000000 1160.0000000 - 399 3 2 1991 101.0000000 1160.8689167 1130.0000000 1130.0000000 - 400 4 2 1991 98.0000000 1137.6684848 1110.0000000 1110.0000000 - 401 5 2 1991 84.0000000 1116.8368602 1090.0000000 1090.0000000 - 402 6 2 1991 93.0000000 1096.0789222 1070.0000000 1070.0000000 - 403 7 2 1991 80.0000000 1067.6714906 1040.0000000 1040.0000000 - 404 8 2 1991 73.0000000 1037.0364920 1010.0000000 1010.0000000 - 405 9 2 1991 89.0000000 1037.3114640 1020.0000000 1020.0000000 - 406 10 2 1991 84.0000000 1046.7733879 1030.0000000 1030.0000000 - 407 11 2 1991 78.0000000 1056.2759828 1040.0000000 1040.0000000 - 408 12 2 1991 79.0000000 1058.1002230 1040.0000000 1040.0000000 - 409 13 2 1991 77.0000000 1034.5276078 1010.0000000 1010.0000000 - 410 14 2 1991 80.0000000 1013.3857146 992.0000000 992.0000000 - 411 15 2 1991 72.0000000 996.5552809 976.0000000 976.0000000 - 412 16 2 1991 78.0000000 1004.2323187 989.0000000 989.0000000 - 413 17 2 1991 74.0000000 1015.2213584 1000.0000000 1000.0000000 - 414 18 2 1991 77.0000000 1013.4126372 995.0000000 995.0000000 - 415 19 2 1991 73.0000000 1002.9874301 978.0000000 978.0000000 - 416 20 2 1991 69.0000000 981.0781782 952.0000000 952.0000000 - 417 21 2 1991 74.0000000 991.8024650 959.0000000 959.0000000 - 418 22 2 1991 81.0000000 991.4350416 959.0000000 959.0000000 - 419 23 2 1991 110.0000000 1004.1597315 979.0000000 979.0000000 - 420 24 2 1991 180.0000000 1038.6023893 1020.0000000 1020.0000000 - 421 25 2 1991 213.0000000 1077.2718648 1060.0000000 1060.0000000 - 422 26 2 1991 222.0000000 1123.5992016 1110.0000000 1110.0000000 - 423 27 2 1991 208.0000000 1181.0043094 1170.0000000 1170.0000000 - 424 28 2 1991 211.0000000 1240.8822086 1230.0000000 1230.0000000 - 425 1 3 1991 214.0000000 1262.7154830 1240.0000000 1240.0000000 - 426 2 3 1991 208.0000000 1262.8225200 1230.0000000 1230.0000000 - 427 3 3 1991 221.0000000 1281.1252657 1260.0000000 1260.0000000 - 428 4 3 1991 281.0000000 1308.8710023 1290.0000000 1290.0000000 - 429 5 3 1991 219.0000000 1329.8083455 1310.0000000 1310.0000000 - 430 6 3 1991 190.0000000 1371.8064909 1360.0000000 1360.0000000 - 431 7 3 1991 173.0000000 1366.7928525 1340.0000000 1340.0000000 - 432 8 3 1991 164.0000000 1338.1295008 1310.0000000 1310.0000000 - 433 9 3 1991 142.0000000 1314.9630883 1290.0000000 1290.0000000 - 434 10 3 1991 133.0000000 1317.4316573 1300.0000000 1300.0000000 - 435 11 3 1991 133.0000000 1326.9011067 1310.0000000 1310.0000000 - 436 12 3 1991 118.0000000 1359.3631368 1350.0000000 1350.0000000 - 437 13 3 1991 127.0000000 1360.1560809 1340.0000000 1340.0000000 - 438 14 3 1991 113.0000000 1341.8624246 1320.0000000 1320.0000000 - 439 15 3 1991 107.0000000 1321.3318906 1300.0000000 1300.0000000 - 440 16 3 1991 100.0000000 1300.8443486 1280.0000000 1280.0000000 - 441 17 3 1991 100.0000000 1257.2510205 1230.0000000 1230.0000000 - 442 18 3 1991 95.0000000 1206.8487716 1180.0000000 1180.0000000 - 443 19 3 1991 98.0000000 1210.2706796 1160.0000000 1160.0000000 - 444 20 3 1991 119.0000000 1214.6520647 1180.0000000 1180.0000000 - 445 21 3 1991 159.0000000 1295.5212921 1260.0000000 1260.0000000 - 446 22 3 1991 196.0000000 1426.7824421 1410.0000000 1410.0000000 - 447 23 3 1991 242.0000000 1546.4687572 1530.0000000 1530.0000000 - 448 24 3 1991 216.0000000 1700.7604197 1700.0000000 1700.0000000 - 449 25 3 1991 180.0000000 1836.4609561 1830.0000000 1830.0000000 - 450 26 3 1991 145.0000000 1778.6508806 1720.0000000 1720.0000000 - 451 27 3 1991 127.0000000 1658.6251282 1600.0000000 1600.0000000 - 452 28 3 1991 117.0000000 1567.4453621 1520.0000000 1520.0000000 - 453 29 3 1991 109.0000000 1531.9297055 1500.0000000 1500.0000000 - 454 30 3 1991 106.0000000 1518.0434880 1490.0000000 1490.0000000 - 455 31 3 1991 99.0000000 1475.7596010 1440.0000000 1440.0000000 - 456 1 4 1991 96.0000000 1416.7723432 1380.0000000 1380.0000000 - 457 2 4 1991 88.0000000 1363.3473651 1330.0000000 1330.0000000 - 458 3 4 1991 87.0000000 1320.0384808 1290.0000000 1290.0000000 - 459 4 4 1991 82.0000000 1294.7824488 1270.0000000 1270.0000000 - 460 5 4 1991 84.0000000 1251.0629117 1220.0000000 1220.0000000 - 461 6 4 1991 67.0000000 1207.9874288 1180.0000000 1180.0000000 - 462 7 4 1991 89.0000000 1205.9168787 1190.0000000 1190.0000000 - 463 8 4 1991 75.0000000 1238.4988364 1230.0000000 1230.0000000 - 464 9 4 1991 79.0000000 1247.0303956 1230.0000000 1230.0000000 - 465 10 4 1991 70.0000000 1246.4599735 1230.0000000 1230.0000000 - 466 11 4 1991 69.0000000 1238.2228773 1220.0000000 1220.0000000 - 467 12 4 1991 69.0000000 1220.0284195 1200.0000000 1200.0000000 - 468 13 4 1991 56.0000000 1176.4425718 1150.0000000 1150.0000000 - 469 14 4 1991 63.0000000 1133.7492422 1110.0000000 1110.0000000 - 470 15 4 1991 58.0000000 1101.0861397 1080.0000000 1080.0000000 - 471 16 4 1991 56.0000000 1078.4500865 1060.0000000 1060.0000000 - 472 17 4 1991 54.0000000 1050.4089412 1030.0000000 1030.0000000 - 473 18 4 1991 57.0000000 1035.5529177 1020.0000000 1020.0000000 - 474 19 4 1991 53.0000000 1017.7887073 1000.0000000 1000.0000000 - 475 20 4 1991 53.0000000 1043.8603297 1040.0000000 1040.0000000 - 476 21 4 1991 65.0000000 1060.4455509 1050.0000000 1050.0000000 - 477 22 4 1991 69.0000000 1026.0347917 1000.0000000 1000.0000000 - 478 23 4 1991 61.0000000 1022.6840021 1010.0000000 1010.0000000 - 479 24 4 1991 56.0000000 1038.5921242 1030.0000000 1030.0000000 - 480 25 4 1991 56.0000000 1058.2749709 1050.0000000 1050.0000000 - 481 26 4 1991 53.0000000 1039.4060892 1020.0000000 1020.0000000 - 482 27 4 1991 49.0000000 1032.2739761 1020.0000000 1020.0000000 - 483 28 4 1991 53.0000000 1024.3006467 1010.0000000 1010.0000000 - 484 29 4 1991 48.0000000 1002.9447636 982.0000000 982.0000000 - 485 30 4 1991 57.0000000 1015.2834050 983.0000000 983.0000000 - 486 1 5 1991 69.0000000 1086.9851399 1090.0000000 1090.0000000 - 487 2 5 1991 89.0000000 1146.0203522 1140.0000000 1140.0000000 - 488 3 5 1991 105.0000000 1195.2389501 1190.0000000 1190.0000000 - 489 4 5 1991 79.0000000 1267.6845453 1270.0000000 1270.0000000 - 490 5 5 1991 69.0000000 1277.6189362 1260.0000000 1260.0000000 - 491 6 5 1991 71.0000000 1267.0388364 1250.0000000 1250.0000000 - 492 7 5 1991 60.0000000 1233.3668657 1210.0000000 1210.0000000 - 493 8 5 1991 64.0000000 1216.0289968 1200.0000000 1200.0000000 - 494 9 5 1991 59.0000000 1205.5879340 1190.0000000 1190.0000000 - 495 10 5 1991 57.0000000 1156.6097483 1130.0000000 1130.0000000 - 496 11 5 1991 55.0000000 1111.6664673 1090.0000000 1090.0000000 - 497 12 5 1991 53.0000000 1094.4665607 1080.0000000 1080.0000000 - 498 13 5 1991 52.0000000 1277.0150150 1320.0000000 1320.0000000 - 499 14 5 1991 50.0000000 1794.4859348 1920.0000000 1920.0000000 - 500 15 5 1991 52.0000000 2031.7299395 2050.0000000 2050.0000000 - 501 16 5 1991 54.0000000 1883.7414569 1820.0000000 1820.0000000 - 502 17 5 1991 54.0000000 1753.7799490 1720.0000000 1720.0000000 - 503 18 5 1991 55.0000000 1738.4053032 1730.0000000 1730.0000000 - 504 19 5 1991 48.0000000 1740.4692645 1730.0000000 1730.0000000 - 505 20 5 1991 48.0000000 1732.5464387 1720.0000000 1720.0000000 - 506 21 5 1991 49.0000000 1714.6355527 1700.0000000 1700.0000000 - 507 22 5 1991 41.0000000 1640.4474573 1610.0000000 1610.0000000 - 508 23 5 1991 40.0000000 1557.9865231 1530.0000000 1530.0000000 - 509 24 5 1991 40.0000000 1493.2491626 1470.0000000 1470.0000000 - 510 25 5 1991 39.0000000 1433.0905656 1410.0000000 1410.0000000 - 511 26 5 1991 43.0000000 1380.6540249 1360.0000000 1360.0000000 - 512 27 5 1991 39.0000000 1338.2242287 1320.0000000 1320.0000000 - 513 28 5 1991 36.0000000 1282.6565924 1260.0000000 1260.0000000 - 514 29 5 1991 33.0000000 1261.0972978 1250.0000000 1250.0000000 - 515 30 5 1991 39.0000000 1243.2551725 1230.0000000 1230.0000000 - 516 31 5 1991 34.0000000 1230.8471583 1220.0000000 1220.0000000 - 517 1 6 1991 37.0000000 1205.2995294 1190.0000000 1190.0000000 - 518 2 6 1991 35.0000000 1175.1852956 1160.0000000 1160.0000000 - 519 3 6 1991 29.0000000 1145.0748106 1130.0000000 1130.0000000 - 520 4 6 1991 33.0000000 1130.3971371 1120.0000000 1120.0000000 - 521 5 6 1991 34.0000000 1151.1520240 1150.0000000 1150.0000000 - 522 6 6 1991 32.0000000 1210.4578401 1200.0000000 1200.0000000 - 523 7 6 1991 38.0000000 1263.3623597 1260.0000000 1260.0000000 - 524 8 6 1991 39.0000000 1325.0996819 1330.0000000 1330.0000000 - 525 9 6 1991 41.0000000 1387.6747554 1390.0000000 1390.0000000 - 526 10 6 1991 44.0000000 1401.1062986 1380.0000000 1380.0000000 - 527 11 6 1991 48.0000000 1454.0266418 1460.0000000 1460.0000000 - 528 12 6 1991 42.0000000 1501.2882458 1500.0000000 1500.0000000 - 529 13 6 1991 37.0000000 1517.9440381 1510.0000000 1510.0000000 - 530 14 6 1991 39.0000000 1497.3226882 1480.0000000 1480.0000000 - 531 15 6 1991 35.0000000 1466.6251655 1450.0000000 1450.0000000 - 532 16 6 1991 31.0000000 1451.7772012 1440.0000000 1440.0000000 - 533 17 6 1991 33.0000000 1426.1015935 1410.0000000 1410.0000000 - 534 18 6 1991 31.0000000 1550.1954035 1580.0000000 1580.0000000 - 535 19 6 1991 28.0000000 1959.2486817 2060.0000000 2060.0000000 - 536 20 6 1991 60.0000000 2457.4658402 2540.0000000 2540.0000000 - 537 21 6 1991 48.0000000 2639.9933579 2650.0000000 2650.0000000 - 538 22 6 1991 54.0000000 2585.4689412 2550.0000000 2550.0000000 - 539 23 6 1991 63.0000000 2506.1636840 2470.0000000 2470.0000000 - 540 24 6 1991 41.0000000 2446.4442538 2420.0000000 2420.0000000 - 541 25 6 1991 42.0000000 2370.4123195 2340.0000000 2340.0000000 - 542 26 6 1991 43.0000000 2305.3407873 2280.0000000 2280.0000000 - 543 27 6 1991 38.0000000 2214.0024996 2170.0000000 2170.0000000 - 544 28 6 1991 38.0000000 2161.2306005 2140.0000000 2140.0000000 - 545 29 6 1991 35.0000000 2167.5383199 2160.0000000 2160.0000000 - 546 30 6 1991 41.0000000 2210.1507377 2210.0000000 2210.0000000 - 547 1 7 1991 41.0000000 2244.2372631 2240.0000000 2240.0000000 - 548 2 7 1991 38.0000000 2250.6533171 2240.0000000 2240.0000000 - 549 3 7 1991 34.0000000 2180.8204904 2150.0000000 2150.0000000 - 550 4 7 1991 27.0000000 2059.5957391 2020.0000000 2020.0000000 - 551 5 7 1991 31.0000000 1944.6898761 1910.0000000 1910.0000000 - 552 6 7 1991 30.0000000 1865.2604661 1840.0000000 1840.0000000 - 553 7 7 1991 26.0000000 1789.5904333 1760.0000000 1760.0000000 - 554 8 7 1991 30.0000000 1716.1535203 1690.0000000 1690.0000000 - 555 9 7 1991 31.0000000 1660.4712818 1640.0000000 1640.0000000 - 556 10 7 1991 23.0000000 1664.1992945 1660.0000000 1660.0000000 - 557 11 7 1991 35.0000000 1668.5164259 1660.0000000 1660.0000000 - 558 12 7 1991 19.0000000 1652.8524985 1640.0000000 1640.0000000 - 559 13 7 1991 24.0000000 1644.0053593 1620.0000000 1620.0000000 - 560 14 7 1991 26.0000000 1647.6102971 1640.0000000 1640.0000000 - 561 15 7 1991 27.0000000 1680.1095861 1680.0000000 1680.0000000 - 562 16 7 1991 41.0000000 1696.6530334 1690.0000000 1690.0000000 - 563 17 7 1991 34.0000000 1714.0808231 1710.0000000 1710.0000000 - 564 18 7 1991 27.0000000 1702.9962219 1690.0000000 1690.0000000 - 565 19 7 1991 25.0000000 1644.2089918 1620.0000000 1620.0000000 - 566 20 7 1991 23.0000000 1674.2695137 1680.0000000 1680.0000000 - 567 21 7 1991 22.0000000 1680.0526496 1670.0000000 1670.0000000 - 568 22 7 1991 27.0000000 1615.8510681 1590.0000000 1590.0000000 - 569 23 7 1991 23.0000000 1566.5245897 1550.0000000 1550.0000000 - 570 24 7 1991 21.0000000 1534.2661766 1520.0000000 1520.0000000 - 571 25 7 1991 23.0000000 1538.6628194 1520.0000000 1520.0000000 - 572 26 7 1991 33.0000000 1553.8573282 1550.0000000 1550.0000000 - 573 27 7 1991 23.0000000 1581.1819930 1580.0000000 1580.0000000 - 574 28 7 1991 29.0000000 1626.3702465 1630.0000000 1630.0000000 - 575 29 7 1991 30.0000000 1730.1495842 1750.0000000 1750.0000000 - 576 30 7 1991 35.0000000 1740.8965682 1720.0000000 1720.0000000 - 577 31 7 1991 27.0000000 1652.2129913 1620.0000000 1620.0000000 - 578 1 8 1991 45.0000000 1589.1565924 1570.0000000 1570.0000000 - 579 2 8 1991 47.0000000 1616.0721301 1620.0000000 1620.0000000 - 580 3 8 1991 40.0000000 1627.2856753 1620.0000000 1620.0000000 - 581 4 8 1991 35.0000000 1549.9419768 1520.0000000 1520.0000000 - 582 5 8 1991 26.0000000 1511.4767273 1500.0000000 1500.0000000 - 583 6 8 1991 23.0000000 1475.8776665 1460.0000000 1460.0000000 - 584 7 8 1991 30.0000000 1430.3460657 1410.0000000 1410.0000000 - 585 8 8 1991 33.0000000 1396.4393977 1380.0000000 1380.0000000 - 586 9 8 1991 30.0000000 1348.6481552 1330.0000000 1330.0000000 - 587 10 8 1991 28.0000000 1313.4859501 1300.0000000 1300.0000000 - 588 11 8 1991 19.0000000 1283.3266779 1270.0000000 1270.0000000 - 589 12 8 1991 20.0000000 1237.7486351 1220.0000000 1220.0000000 - 590 13 8 1991 16.0000000 1203.0387951 1190.0000000 1190.0000000 - 591 14 8 1991 18.0000000 1188.3375509 1180.0000000 1180.0000000 - 592 15 8 1991 18.0000000 1170.5000693 1160.0000000 1160.0000000 - 593 16 8 1991 20.0000000 1150.3842966 1140.0000000 1140.0000000 - 594 17 8 1991 16.0000000 1130.2749088 1120.0000000 1120.0000000 - 595 18 8 1991 15.0000000 1110.1713225 1100.0000000 1100.0000000 - 596 19 8 1991 15.0000000 1074.6436765 1060.0000000 1060.0000000 - 597 20 8 1991 14.0000000 1042.2648531 1030.0000000 1030.0000000 - 598 21 8 1991 15.0000000 1027.6050937 1020.0000000 1020.0000000 - 599 22 8 1991 13.0000000 1017.5200135 1010.0000000 1010.0000000 - 600 23 8 1991 12.0000000 1006.6671480 999.0000000 999.0000000 - 601 24 8 1991 11.0000000 1004.8467310 1000.0000000 1000.0000000 - 602 25 8 1991 12.0000000 1020.4296870 1020.0000000 1020.0000000 - 603 26 8 1991 11.0000000 996.3840101 983.0000000 983.0000000 - 604 27 8 1991 13.0000000 967.0292565 956.0000000 956.0000000 - 605 28 8 1991 11.0000000 938.4193319 927.0000000 927.0000000 - 606 29 8 1991 12.0000000 921.6980646 914.0000000 914.0000000 - 607 30 8 1991 12.0000000 904.0066099 895.0000000 895.0000000 - 608 31 8 1991 11.0000000 884.1744271 875.0000000 875.0000000 - 609 1 9 1991 11.0000000 860.2600418 850.0000000 850.0000000 - 610 2 9 1991 17.0000000 825.9474784 813.0000000 813.0000000 - 611 3 9 1991 11.0000000 789.6632032 777.0000000 777.0000000 - 612 4 9 1991 12.0000000 792.1820973 791.0000000 791.0000000 - 613 5 9 1991 11.0000000 791.4711592 786.0000000 786.0000000 - 614 6 9 1991 11.0000000 784.1049965 778.0000000 778.0000000 - 615 7 9 1991 18.0000000 781.4547270 777.0000000 777.0000000 - 616 8 9 1991 11.0000000 771.9192029 765.0000000 765.0000000 - 617 9 9 1991 13.0000000 739.0412921 726.0000000 726.0000000 - 618 10 9 1991 12.0000000 730.0812262 726.0000000 726.0000000 - 619 11 9 1991 11.0000000 737.0927224 733.0000000 733.0000000 - 620 12 9 1991 20.0000000 741.7717308 738.0000000 738.0000000 - 621 13 9 1991 21.0000000 782.2008066 790.0000000 790.0000000 - 622 14 9 1991 29.0000000 824.1193859 829.0000000 829.0000000 - 623 15 9 1991 28.0000000 835.2957363 832.0000000 832.0000000 - 624 16 9 1991 20.0000000 792.7297540 776.0000000 776.0000000 - 625 17 9 1991 20.0000000 758.2827124 748.0000000 748.0000000 - 626 18 9 1991 20.0000000 749.5224970 745.0000000 745.0000000 - 627 19 9 1991 12.0000000 768.0778325 770.0000000 770.0000000 - 628 20 9 1991 11.0000000 766.8032945 761.0000000 761.0000000 - 629 21 9 1991 11.0000000 736.1585734 724.0000000 724.0000000 - 630 22 9 1991 22.0000000 720.5135106 714.0000000 714.0000000 - 631 23 9 1991 14.0000000 748.2144824 753.0000000 753.0000000 - 632 24 9 1991 48.0000000 846.9170486 870.0000000 870.0000000 - 633 25 9 1991 45.0000000 928.0831427 905.0000000 905.0000000 - 634 26 9 1991 80.0000000 913.7174335 894.0000000 894.0000000 - 635 27 9 1991 61.0000000 883.9172016 870.0000000 870.0000000 - 636 28 9 1991 61.0000000 919.2865526 900.0000000 900.0000000 - 637 29 9 1991 65.0000000 977.5222751 983.0000000 983.0000000 - 638 30 9 1991 63.0000000 1021.1679045 1020.0000000 1020.0000000 - 639 1 10 1991 90.0000000 1020.5583724 1010.0000000 1010.0000000 - 640 2 10 1991 59.0000000 1008.1759830 998.0000000 998.0000000 - 641 3 10 1991 45.0000000 1037.4612214 1040.0000000 1040.0000000 - 642 4 10 1991 42.0000000 1054.4357189 1050.0000000 1050.0000000 - 643 5 10 1991 41.0000000 1085.9339512 1070.0000000 1070.0000000 - 644 6 10 1991 41.0000000 1100.2645574 1090.0000000 1090.0000000 - 645 7 10 1991 73.0000000 1107.2966178 1100.0000000 1100.0000000 - 646 8 10 1991 96.0000000 1092.9408599 1080.0000000 1080.0000000 - 647 9 10 1991 61.0000000 1095.6222611 1090.0000000 1090.0000000 - 648 10 10 1991 44.0000000 1066.6327987 1050.0000000 1050.0000000 - 649 11 10 1991 42.0000000 1026.2575882 1010.0000000 1010.0000000 - 650 12 10 1991 41.0000000 1007.3876699 986.0000000 986.0000000 - 651 13 10 1991 42.0000000 970.9844675 954.0000000 954.0000000 - 652 14 10 1991 61.0000000 958.5045446 950.0000000 950.0000000 - 653 15 10 1991 55.0000000 985.7500270 987.0000000 987.0000000 - 654 16 10 1991 41.0000000 991.9001980 979.0000000 979.0000000 - 655 17 10 1991 48.0000000 978.4589013 960.0000000 960.0000000 - 656 18 10 1991 52.0000000 995.6036794 977.0000000 977.0000000 - 657 19 10 1991 66.0000000 988.5809868 975.0000000 975.0000000 - 658 20 10 1991 59.0000000 979.1371757 966.0000000 966.0000000 - 659 21 10 1991 71.0000000 981.5400009 973.0000000 973.0000000 - 660 22 10 1991 74.0000000 973.6924731 962.0000000 962.0000000 - 661 23 10 1991 70.0000000 963.7031693 953.0000000 953.0000000 - 662 24 10 1991 59.0000000 951.1392879 940.0000000 940.0000000 - 663 25 10 1991 57.0000000 928.4513423 915.0000000 915.0000000 - 664 26 10 1991 57.0000000 893.0339332 877.0000000 877.0000000 - 665 27 10 1991 51.0000000 863.9402863 851.0000000 851.0000000 - 666 28 10 1991 47.0000000 836.8503824 824.0000000 824.0000000 - 667 29 10 1991 48.0000000 823.4474405 815.0000000 815.0000000 - 668 30 10 1991 45.0000000 801.0623251 788.0000000 788.0000000 - 669 31 10 1991 43.0000000 796.4957749 790.0000000 790.0000000 - 670 1 11 1991 40.0000000 796.9770273 776.0000000 776.0000000 - 671 2 11 1991 47.0000000 792.1899463 781.0000000 781.0000000 - 672 3 11 1991 46.0000000 797.8876694 785.0000000 785.0000000 - 673 4 11 1991 76.0000000 822.0612415 802.0000000 802.0000000 - 674 5 11 1991 60.0000000 848.7729604 840.0000000 840.0000000 - 675 6 11 1991 132.0000000 954.7943065 970.0000000 970.0000000 - 676 7 11 1991 133.0000000 1141.9187872 1160.0000000 1160.0000000 - 677 8 11 1991 113.0000000 1211.7755963 1190.0000000 1190.0000000 - 678 9 11 1991 120.0000000 1210.7104476 1190.0000000 1190.0000000 - 679 10 11 1991 141.0000000 1222.6255164 1210.0000000 1210.0000000 - 680 11 11 1991 208.0000000 1224.4873192 1180.0000000 1180.0000000 - 681 12 11 1991 166.0000000 1288.6979092 1240.0000000 1240.0000000 - 682 13 11 1991 183.0000000 1280.7340625 1220.0000000 1220.0000000 - 683 14 11 1991 299.0000000 1299.2715509 1240.0000000 1240.0000000 - 684 15 11 1991 521.0000000 1477.1094050 1480.0000000 1480.0000000 - 685 16 11 1991 443.0000000 1784.6304532 1820.0000000 1820.0000000 - 686 17 11 1991 304.0000000 1803.5081200 1750.0000000 1750.0000000 - 687 18 11 1991 231.0000000 1693.2995669 1610.0000000 1610.0000000 - 688 19 11 1991 192.0000000 1624.0755875 1570.0000000 1570.0000000 - 689 20 11 1991 199.0000000 1600.3477181 1560.0000000 1560.0000000 - 690 21 11 1991 201.0000000 1647.6646065 1630.0000000 1630.0000000 - 691 22 11 1991 173.0000000 1652.7553916 1620.0000000 1620.0000000 - 692 23 11 1991 159.0000000 1616.8872002 1580.0000000 1580.0000000 - 693 24 11 1991 160.0000000 1528.2177118 1480.0000000 1480.0000000 - 694 25 11 1991 146.0000000 1402.9853743 1350.0000000 1350.0000000 - 695 26 11 1991 110.0000000 1286.5780049 1240.0000000 1240.0000000 - 696 27 11 1991 114.0000000 1213.5313350 1180.0000000 1180.0000000 - 697 28 11 1991 97.0000000 1182.9571847 1160.0000000 1160.0000000 - 698 29 11 1991 89.0000000 1138.5425245 1110.0000000 1110.0000000 - 699 30 11 1991 73.0000000 1087.4127728 1060.0000000 1060.0000000 - 700 1 12 1991 69.0000000 1036.4057534 1010.0000000 1010.0000000 - 701 2 12 1991 67.0000000 991.6776454 968.0000000 968.0000000 - 702 3 12 1991 63.0000000 958.9006854 939.0000000 939.0000000 - 703 4 12 1991 58.0000000 941.5204295 926.0000000 926.0000000 - 704 5 12 1991 59.0000000 927.8690642 913.0000000 913.0000000 - 705 6 12 1991 53.0000000 908.1097178 892.0000000 892.0000000 - 706 7 12 1991 54.0000000 881.9495883 865.0000000 865.0000000 - 707 8 12 1991 51.0000000 861.4112460 847.0000000 847.0000000 - 708 9 12 1991 47.0000000 839.8879477 825.0000000 825.0000000 - 709 10 12 1991 42.0000000 808.2320760 791.0000000 791.0000000 - 710 11 12 1991 40.0000000 795.4697098 785.0000000 785.0000000 - 711 12 12 1991 39.0000000 799.9378280 793.0000000 793.0000000 - 712 13 12 1991 36.0000000 794.5181495 784.0000000 784.0000000 - 713 14 12 1991 37.0000000 773.6661414 760.0000000 760.0000000 - 714 15 12 1991 32.0000000 757.1229481 746.0000000 746.0000000 - 715 16 12 1991 37.0000000 739.0020100 726.0000000 726.0000000 - 716 17 12 1991 62.0000000 800.5850815 754.0000000 754.0000000 - 717 18 12 1991 118.0000000 831.6122409 802.0000000 802.0000000 - 718 19 12 1991 170.0000000 948.4548138 918.0000000 918.0000000 - 719 20 12 1991 229.0000000 1175.3035197 1170.0000000 1170.0000000 - 720 21 12 1991 448.0000000 1543.1886633 1540.0000000 1540.0000000 - 721 22 12 1991 464.0000000 1922.6892770 1920.0000000 1920.0000000 - 722 23 12 1991 675.0000000 2474.3440988 2540.0000000 2540.0000000 - 723 24 12 1991 844.0000000 3312.4652834 3460.0000000 3460.0000000 - 724 25 12 1991 569.0000000 3874.8354257 3930.0000000 3930.0000000 - 725 26 12 1991 358.0000000 3828.3947527 3740.0000000 3740.0000000 - 726 27 12 1991 279.0000000 3340.6088693 3170.0000000 3170.0000000 - 727 28 12 1991 238.0000000 2820.2736182 2670.0000000 2670.0000000 - 728 29 12 1991 201.0000000 2448.1901055 2340.0000000 2340.0000000 - 729 30 12 1991 185.0000000 2177.1372369 2090.0000000 2090.0000000 - 730 31 12 1991 165.0000000 1947.8548376 1870.0000000 1870.0000000 - 731 1 1 1992 140.0000000 1764.2963603 1700.0000000 1700.0000000 - 732 2 1 1992 126.0000000 1623.2764632 1570.0000000 1570.0000000 - 733 3 1 1992 117.0000000 1530.1896461 1490.0000000 1490.0000000 - 734 4 1 1992 114.0000000 1436.1144873 1390.0000000 1390.0000000 - 735 5 1 1992 108.0000000 1373.7922452 1340.0000000 1340.0000000 - 736 6 1 1992 108.0000000 1360.2469900 1340.0000000 1340.0000000 - 737 7 1 1992 101.0000000 1343.4814514 1320.0000000 1320.0000000 - 738 8 1 1992 97.0000000 1347.9483559 1330.0000000 1330.0000000 - 739 9 1 1992 89.0000000 1322.8270326 1290.0000000 1290.0000000 - 740 10 1 1992 111.0000000 1296.7477779 1260.0000000 1260.0000000 - 741 11 1 1992 135.0000000 1308.1850922 1290.0000000 1290.0000000 - 742 12 1 1992 171.0000000 1381.8099612 1380.0000000 1380.0000000 - 743 13 1 1992 125.0000000 1439.4197435 1430.0000000 1430.0000000 - 744 14 1 1992 111.0000000 1372.3430663 1330.0000000 1330.0000000 - 745 15 1 1992 100.0000000 1278.8525047 1240.0000000 1240.0000000 - 746 16 1 1992 87.0000000 1218.6373920 1190.0000000 1190.0000000 - 747 17 1 1992 75.0000000 1183.1073762 1160.0000000 1160.0000000 - 748 18 1 1992 79.0000000 1136.8185799 1110.0000000 1110.0000000 - 749 19 1 1992 70.0000000 1115.4018432 1090.0000000 1090.0000000 - 750 20 1 1992 72.0000000 1101.6586626 1080.0000000 1080.0000000 - 751 21 1 1992 87.0000000 1104.8961588 1090.0000000 1090.0000000 - 752 22 1 1992 79.0000000 1083.0613083 1060.0000000 1060.0000000 - 753 23 1 1992 71.0000000 1052.1976081 1030.0000000 1030.0000000 - 754 24 1 1992 66.0000000 1015.2508246 992.0000000 992.0000000 - 755 25 1 1992 67.0000000 989.6683547 971.0000000 971.0000000 - 756 26 1 1992 65.0000000 961.0959053 941.0000000 941.0000000 - 757 27 1 1992 59.0000000 934.3839774 916.0000000 916.0000000 - 758 28 1 1992 57.0000000 920.4559154 906.0000000 906.0000000 - 759 29 1 1992 54.0000000 905.5045558 890.0000000 890.0000000 - 760 30 1 1992 59.0000000 897.2187422 884.0000000 884.0000000 - 761 31 1 1992 57.0000000 891.7177163 879.0000000 879.0000000 - 762 1 2 1992 56.0000000 880.8855431 867.0000000 867.0000000 - 763 2 2 1992 54.0000000 865.4062332 851.0000000 851.0000000 - 764 3 2 1992 58.0000000 850.9447063 837.0000000 837.0000000 - 765 4 2 1992 63.0000000 867.0495452 839.0000000 839.0000000 - 766 5 2 1992 76.0000000 887.8309751 873.0000000 873.0000000 - 767 6 2 1992 250.0000000 978.7759682 985.0000000 985.0000000 - 768 7 2 1992 346.0000000 1292.2321750 1360.0000000 1360.0000000 - 769 8 2 1992 241.0000000 1669.9937887 1740.0000000 1740.0000000 - 770 9 2 1992 180.0000000 1661.4772096 1610.0000000 1610.0000000 - 771 10 2 1992 164.0000000 1487.6706728 1420.0000000 1420.0000000 - 772 11 2 1992 183.0000000 1385.3184042 1320.0000000 1320.0000000 - 773 12 2 1992 215.0000000 1396.3528091 1360.0000000 1360.0000000 - 774 13 2 1992 265.0000000 1482.6553301 1460.0000000 1460.0000000 - 775 14 2 1992 287.0000000 1579.1372770 1550.0000000 1550.0000000 - 776 15 2 1992 272.0000000 1676.9251212 1650.0000000 1650.0000000 - 777 16 2 1992 253.0000000 1766.9481041 1730.0000000 1730.0000000 - 778 17 2 1992 301.0000000 1740.0659419 1680.0000000 1680.0000000 - 779 18 2 1992 275.0000000 1783.6424914 1760.0000000 1760.0000000 - 780 19 2 1992 224.0000000 1812.8471650 1780.0000000 1780.0000000 - 781 20 2 1992 194.0000000 1728.9283062 1670.0000000 1670.0000000 - 782 21 2 1992 173.0000000 1585.5021946 1520.0000000 1520.0000000 - 783 22 2 1992 157.0000000 1471.6738706 1420.0000000 1420.0000000 - 784 23 2 1992 142.0000000 1408.0673442 1370.0000000 1370.0000000 - 785 24 2 1992 133.0000000 1340.7169269 1300.0000000 1300.0000000 - 786 25 2 1992 128.0000000 1292.1629655 1260.0000000 1260.0000000 - 787 26 2 1992 125.0000000 1273.8019233 1250.0000000 1250.0000000 - 788 27 2 1992 125.0000000 1254.7494968 1230.0000000 1230.0000000 - 789 28 2 1992 110.0000000 1233.5572089 1210.0000000 1210.0000000 - 790 29 2 1992 107.0000000 1204.7770673 1180.0000000 1180.0000000 - 791 1 3 1992 97.0000000 1181.5910605 1160.0000000 1160.0000000 - 792 2 3 1992 97.0000000 1145.4072496 1120.0000000 1120.0000000 - 793 3 3 1992 86.0000000 1112.3451404 1090.0000000 1090.0000000 - 794 4 3 1992 93.0000000 1097.0620124 1080.0000000 1080.0000000 - 795 5 3 1992 86.0000000 1094.1499263 1080.0000000 1080.0000000 - 796 6 3 1992 82.0000000 1085.8750517 1070.0000000 1070.0000000 - 797 7 3 1992 80.0000000 1075.3411288 1060.0000000 1060.0000000 - 798 8 3 1992 77.0000000 1057.1381001 1040.0000000 1040.0000000 - 799 9 3 1992 73.0000000 1052.1213078 1040.0000000 1040.0000000 - 800 10 3 1992 76.0000000 1028.6141477 1010.0000000 1010.0000000 - 801 11 3 1992 68.0000000 1003.7644730 987.0000000 987.0000000 - 802 12 3 1992 70.0000000 1026.0038318 984.0000000 984.0000000 - 803 13 3 1992 116.0000000 1062.7669788 1020.0000000 1020.0000000 - 804 14 3 1992 206.0000000 1271.4750730 1290.0000000 1290.0000000 - 805 15 3 1992 433.0000000 1549.0008288 1560.0000000 1560.0000000 - 806 16 3 1992 495.0000000 1851.5315909 1880.0000000 1880.0000000 - 807 17 3 1992 331.0000000 2288.8373570 2360.0000000 2360.0000000 - 808 18 3 1992 240.0000000 2618.4114583 2650.0000000 2650.0000000 - 809 19 3 1992 215.0000000 2512.0272902 2430.0000000 2430.0000000 - 810 20 3 1992 185.0000000 2227.7946560 2130.0000000 2130.0000000 - 811 21 3 1992 185.0000000 2008.3334058 1930.0000000 1930.0000000 - 812 22 3 1992 185.0000000 1916.8185518 1850.0000000 1850.0000000 - 813 23 3 1992 213.0000000 1969.0988135 1930.0000000 1930.0000000 - 814 24 3 1992 466.0000000 2339.5792652 2390.0000000 2390.0000000 - 815 25 3 1992 580.0000000 2794.8974379 2850.0000000 2850.0000000 - 816 26 3 1992 566.0000000 3155.5526624 3180.0000000 3180.0000000 - 817 27 3 1992 487.0000000 3180.0814318 3120.0000000 3120.0000000 - 818 28 3 1992 387.0000000 2959.9801788 2860.0000000 2860.0000000 - 819 29 3 1992 311.0000000 2673.1736627 2570.0000000 2570.0000000 - 820 30 3 1992 270.0000000 2442.1763588 2360.0000000 2360.0000000 - 821 31 3 1992 246.0000000 2268.2526870 2200.0000000 2200.0000000 - 822 1 4 1992 229.0000000 2145.1444153 2090.0000000 2090.0000000 - 823 2 4 1992 222.0000000 2090.1187567 2040.0000000 2040.0000000 - 824 3 4 1992 217.0000000 2083.4080787 2050.0000000 2050.0000000 - 825 4 4 1992 208.0000000 2050.6405124 2010.0000000 2010.0000000 - 826 5 4 1992 220.0000000 2116.2997484 2110.0000000 2110.0000000 - 827 6 4 1992 210.0000000 2414.8146272 2470.0000000 2470.0000000 - 828 7 4 1992 190.0000000 2564.6927111 2560.0000000 2560.0000000 - 829 8 4 1992 173.0000000 2506.4961051 2460.0000000 2460.0000000 - 830 9 4 1992 166.0000000 2343.3410342 2280.0000000 2280.0000000 - 831 10 4 1992 133.0000000 2154.3451818 2090.0000000 2090.0000000 - 832 11 4 1992 126.0000000 1986.3443593 1930.0000000 1930.0000000 - 833 12 4 1992 124.0000000 1863.8919463 1820.0000000 1820.0000000 - 834 13 4 1992 116.0000000 1729.8355298 1680.0000000 1680.0000000 - 835 14 4 1992 112.0000000 1636.7146017 1600.0000000 1600.0000000 - 836 15 4 1992 111.0000000 1611.2196473 1580.0000000 1580.0000000 - 837 16 4 1992 137.0000000 1587.8774062 1560.0000000 1560.0000000 - 838 17 4 1992 206.0000000 1591.9458519 1570.0000000 1570.0000000 - 839 18 4 1992 176.0000000 1601.0713055 1580.0000000 1580.0000000 - 840 19 4 1992 161.0000000 1562.4781463 1530.0000000 1530.0000000 - 841 20 4 1992 161.0000000 1503.5744380 1470.0000000 1470.0000000 - 842 21 4 1992 139.0000000 1488.7999837 1470.0000000 1470.0000000 - 843 22 4 1992 139.0000000 1487.8485526 1470.0000000 1470.0000000 - 844 23 4 1992 123.0000000 1502.4225591 1490.0000000 1490.0000000 - 845 24 4 1992 119.0000000 1498.5075943 1480.0000000 1480.0000000 - 846 25 4 1992 111.0000000 1510.9550311 1500.0000000 1500.0000000 - 847 26 4 1992 94.0000000 1553.4965147 1550.0000000 1550.0000000 - 848 27 4 1992 94.0000000 1548.9610986 1530.0000000 1530.0000000 - 849 28 4 1992 102.0000000 1567.4771250 1560.0000000 1560.0000000 - 850 29 4 1992 120.0000000 1605.4887006 1600.0000000 1600.0000000 - 851 30 4 1992 120.0000000 1667.7515321 1670.0000000 1670.0000000 - 852 1 5 1992 114.0000000 1773.5643343 1780.0000000 1780.0000000 - 853 2 5 1992 115.0000000 1835.1978801 1830.0000000 1830.0000000 - 854 3 5 1992 206.0000000 1890.8993679 1890.0000000 1890.0000000 - 855 4 5 1992 215.0000000 1888.6023647 1870.0000000 1870.0000000 - 856 5 5 1992 125.0000000 1844.9315327 1820.0000000 1820.0000000 - 857 6 5 1992 123.0000000 1771.3073863 1740.0000000 1740.0000000 - 858 7 5 1992 113.0000000 1721.7272775 1700.0000000 1700.0000000 - 859 8 5 1992 77.0000000 1681.3251846 1660.0000000 1660.0000000 - 860 9 5 1992 83.0000000 1664.5432960 1650.0000000 1650.0000000 - 861 10 5 1992 83.0000000 1666.0971002 1640.0000000 1640.0000000 - 862 11 5 1992 96.0000000 1664.0053038 1640.0000000 1640.0000000 - 863 12 5 1992 120.0000000 1672.0227644 1660.0000000 1660.0000000 - 864 13 5 1992 80.0000000 1674.8352803 1660.0000000 1660.0000000 - 865 14 5 1992 76.0000000 1666.4731716 1650.0000000 1650.0000000 - 866 15 5 1992 69.0000000 1648.1729913 1630.0000000 1630.0000000 - 867 16 5 1992 63.0000000 1627.6419815 1610.0000000 1610.0000000 - 868 17 5 1992 61.0000000 1622.5883840 1610.0000000 1610.0000000 - 869 18 5 1992 60.0000000 1637.5772822 1630.0000000 1630.0000000 - 870 19 5 1992 59.0000000 1649.4598163 1640.0000000 1640.0000000 - 871 20 5 1992 67.0000000 1651.3757671 1640.0000000 1640.0000000 - 872 21 5 1992 51.0000000 1651.0361090 1640.0000000 1640.0000000 - 873 22 5 1992 44.0000000 1673.8669458 1670.0000000 1670.0000000 - 874 23 5 1992 42.0000000 1695.8627496 1690.0000000 1690.0000000 - 875 24 5 1992 51.0000000 1677.0210596 1660.0000000 1660.0000000 - 876 25 5 1992 42.0000000 1654.5415953 1640.0000000 1640.0000000 - 877 26 5 1992 54.0000000 1651.9598586 1630.0000000 1630.0000000 - 878 27 5 1992 53.0000000 1627.8597267 1610.0000000 1610.0000000 - 879 28 5 1992 59.0000000 1612.9945813 1600.0000000 1600.0000000 - 880 29 5 1992 55.0000000 1594.2927980 1570.0000000 1570.0000000 - 881 30 5 1992 54.0000000 1553.1968931 1530.0000000 1530.0000000 - 882 31 5 1992 48.0000000 1533.6109406 1520.0000000 1520.0000000 - 883 1 6 1992 63.0000000 1508.5386853 1490.0000000 1490.0000000 - 884 2 6 1992 61.0000000 1501.8863804 1490.0000000 1490.0000000 - 885 3 6 1992 55.0000000 1564.6749132 1570.0000000 1570.0000000 - 886 4 6 1992 75.0000000 1747.2479844 1780.0000000 1780.0000000 - 887 5 6 1992 53.0000000 2115.6556886 2190.0000000 2190.0000000 - 888 6 6 1992 77.0000000 2206.5995736 2190.0000000 2190.0000000 - 889 7 6 1992 114.0000000 2218.7053951 2210.0000000 2210.0000000 - 890 8 6 1992 167.0000000 2159.0428500 2110.0000000 2110.0000000 - 891 9 6 1992 116.0000000 2143.7356819 2130.0000000 2130.0000000 - 892 10 6 1992 91.0000000 2152.4041701 2140.0000000 2140.0000000 - 893 11 6 1992 85.0000000 2099.7649181 2070.0000000 2070.0000000 - 894 12 6 1992 68.0000000 2021.4276365 1990.0000000 1990.0000000 - 895 13 6 1992 71.0000000 1933.1616098 1900.0000000 1900.0000000 - 896 14 6 1992 63.0000000 1873.4864769 1850.0000000 1850.0000000 - 897 15 6 1992 59.0000000 1784.4273263 1750.0000000 1750.0000000 - 898 16 6 1992 46.0000000 1699.4147596 1670.0000000 1670.0000000 - 899 17 6 1992 44.0000000 1626.7263924 1600.0000000 1600.0000000 - 900 18 6 1992 39.0000000 1571.7871853 1550.0000000 1550.0000000 - 901 19 6 1992 41.0000000 1536.9819896 1520.0000000 1520.0000000 - 902 20 6 1992 44.0000000 1625.6940952 1640.0000000 1640.0000000 - 903 21 6 1992 39.0000000 1744.1489947 1760.0000000 1760.0000000 - 904 22 6 1992 32.0000000 1777.8732025 1770.0000000 1770.0000000 - 905 23 6 1992 40.0000000 1652.0423807 1600.0000000 1600.0000000 - 906 24 6 1992 41.0000000 1617.1145831 1590.0000000 1590.0000000 - 907 25 6 1992 42.0000000 1716.1818263 1730.0000000 1730.0000000 - 908 26 6 1992 42.0000000 1774.3781575 1770.0000000 1770.0000000 - 909 27 6 1992 48.0000000 1874.9179616 1890.0000000 1890.0000000 - 910 28 6 1992 37.0000000 1940.3455129 1940.0000000 1940.0000000 - 911 29 6 1992 40.0000000 1827.8238282 1780.0000000 1780.0000000 - 912 30 6 1992 29.0000000 1675.0741352 1630.0000000 1630.0000000 - 913 1 7 1992 30.0000000 1578.8616251 1550.0000000 1550.0000000 - 914 2 7 1992 36.0000000 1521.5289406 1500.0000000 1500.0000000 - 915 3 7 1992 29.0000000 1479.5656306 1460.0000000 1460.0000000 - 916 4 7 1992 36.0000000 1470.4942024 1460.0000000 1460.0000000 - 917 5 7 1992 50.0000000 1524.0526048 1510.0000000 1510.0000000 - 918 6 7 1992 78.0000000 1548.7596072 1530.0000000 1530.0000000 - 919 7 7 1992 54.0000000 1605.9265875 1610.0000000 1610.0000000 - 920 8 7 1992 57.0000000 1599.0727240 1580.0000000 1580.0000000 - 921 9 7 1992 51.0000000 1568.4962917 1550.0000000 1550.0000000 - 922 10 7 1992 47.0000000 1551.0277407 1520.0000000 1520.0000000 - 923 11 7 1992 46.0000000 1595.0118611 1580.0000000 1580.0000000 - 924 12 7 1992 76.0000000 1669.5801014 1670.0000000 1670.0000000 - 925 13 7 1992 72.0000000 1770.1367405 1780.0000000 1780.0000000 - 926 14 7 1992 67.0000000 1848.3574534 1850.0000000 1850.0000000 - 927 15 7 1992 63.0000000 1871.2554773 1860.0000000 1860.0000000 - 928 16 7 1992 47.0000000 1803.3825729 1770.0000000 1770.0000000 - 929 17 7 1992 47.0000000 1705.0177347 1670.0000000 1670.0000000 - 930 18 7 1992 42.0000000 1635.2921748 1610.0000000 1610.0000000 - 931 19 7 1992 41.0000000 1613.3393486 1600.0000000 1600.0000000 - 932 20 7 1992 39.0000000 1564.2907600 1540.0000000 1540.0000000 - 933 21 7 1992 37.0000000 1496.3521854 1470.0000000 1470.0000000 - 934 22 7 1992 33.0000000 1503.1008876 1500.0000000 1500.0000000 - 935 23 7 1992 33.0000000 1625.2981347 1650.0000000 1650.0000000 - 936 24 7 1992 33.0000000 1736.4442600 1750.0000000 1750.0000000 - 937 25 7 1992 37.0000000 1766.6925618 1760.0000000 1760.0000000 - 938 26 7 1992 26.0000000 1637.5377386 1590.0000000 1590.0000000 - 939 27 7 1992 24.0000000 1521.2730603 1490.0000000 1490.0000000 - 940 28 7 1992 26.0000000 1459.6000641 1440.0000000 1440.0000000 - 941 29 7 1992 29.0000000 1393.9431550 1370.0000000 1370.0000000 - 942 30 7 1992 19.0000000 1346.8784589 1330.0000000 1330.0000000 - 943 31 7 1992 22.0000000 1322.1126377 1310.0000000 1310.0000000 - 944 1 8 1992 28.0000000 1317.5333690 1310.0000000 1310.0000000 - 945 2 8 1992 35.0000000 1332.6735526 1330.0000000 1330.0000000 - 946 3 8 1992 29.0000000 1313.9322545 1300.0000000 1300.0000000 - 947 4 8 1992 36.0000000 1268.3495980 1250.0000000 1250.0000000 - 948 5 8 1992 52.0000000 1225.9203185 1210.0000000 1210.0000000 - 949 6 8 1992 74.0000000 1208.9288505 1200.0000000 1200.0000000 - 950 7 8 1992 54.0000000 1183.3717079 1170.0000000 1170.0000000 - 951 8 8 1992 57.0000000 1153.2508689 1140.0000000 1140.0000000 - 952 9 8 1992 48.0000000 1124.5725529 1110.0000000 1110.0000000 - 953 10 8 1992 47.0000000 1101.5792311 1090.0000000 1090.0000000 - 954 11 8 1992 46.0000000 1102.1063775 1090.0000000 1090.0000000 - 955 12 8 1992 75.0000000 1093.4138273 1080.0000000 1080.0000000 - 956 13 8 1992 73.0000000 1131.0494598 1120.0000000 1120.0000000 - 957 14 8 1992 66.0000000 1165.4505552 1160.0000000 1160.0000000 - 958 15 8 1992 60.0000000 1161.7759883 1150.0000000 1150.0000000 - 959 16 8 1992 47.0000000 1135.1474188 1120.0000000 1120.0000000 - 960 17 8 1992 46.0000000 1097.1344890 1080.0000000 1080.0000000 - 961 18 8 1992 42.0000000 1064.5762086 1050.0000000 1050.0000000 - 962 19 8 1992 41.0000000 1034.9656084 1020.0000000 1020.0000000 - 963 20 8 1992 40.0000000 1046.8180426 1040.0000000 1040.0000000 - 964 21 8 1992 37.0000000 1079.6149187 1080.0000000 1080.0000000 - 965 22 8 1992 32.0000000 1050.7974803 1030.0000000 1030.0000000 - 966 23 8 1992 32.0000000 1045.8110732 1040.0000000 1040.0000000 - 967 24 8 1992 32.0000000 1070.5227471 1070.0000000 1070.0000000 - 968 25 8 1992 36.0000000 1061.7176318 1050.0000000 1050.0000000 - 969 26 8 1992 27.0000000 1026.0740727 1010.0000000 1010.0000000 - 970 27 8 1992 25.0000000 1009.0201992 1000.0000000 1000.0000000 - 971 28 8 1992 25.0000000 995.9979809 985.0000000 985.0000000 - 972 29 8 1992 28.0000000 983.0273845 971.0000000 971.0000000 - 973 30 8 1992 20.0000000 983.5108189 968.0000000 968.0000000 - 974 31 8 1992 22.0000000 1003.4844213 977.0000000 977.0000000 - 975 1 9 1992 49.0000000 1059.8485966 1060.0000000 1060.0000000 - 976 2 9 1992 77.0000000 1172.6228389 1170.0000000 1170.0000000 - 977 3 9 1992 67.0000000 1273.1750359 1280.0000000 1280.0000000 - 978 4 9 1992 45.0000000 1287.4983565 1270.0000000 1270.0000000 - 979 5 9 1992 44.0000000 1267.9469656 1250.0000000 1250.0000000 - 980 6 9 1992 64.0000000 1285.5753231 1280.0000000 1280.0000000 - 981 7 9 1992 52.0000000 1337.9816429 1340.0000000 1340.0000000 - 982 8 9 1992 40.0000000 1327.8896605 1310.0000000 1310.0000000 - 983 9 9 1992 30.0000000 1266.4390346 1240.0000000 1240.0000000 - 984 10 9 1992 34.0000000 1211.3360655 1190.0000000 1190.0000000 - 985 11 9 1992 32.0000000 1168.6744305 1150.0000000 1150.0000000 - 986 12 9 1992 36.0000000 1135.9999378 1120.0000000 1120.0000000 - 987 13 9 1992 28.0000000 1105.5982271 1090.0000000 1090.0000000 - 988 14 9 1992 33.0000000 1091.7926012 1080.0000000 1080.0000000 - 989 15 9 1992 35.0000000 1073.6831530 1060.0000000 1060.0000000 - 990 16 9 1992 30.0000000 1075.8558253 1070.0000000 1070.0000000 - 991 17 9 1992 32.0000000 1085.5376402 1080.0000000 1080.0000000 - 992 18 9 1992 29.0000000 1048.9591439 1030.0000000 1030.0000000 - 993 19 9 1992 30.0000000 1014.1226572 1000.0000000 1000.0000000 - 994 20 9 1992 28.0000000 1014.7374798 1010.0000000 1010.0000000 - 995 21 9 1992 29.0000000 978.2252204 960.0000000 960.0000000 - 996 22 9 1992 29.0000000 948.0766899 936.0000000 936.0000000 - 997 23 9 1992 27.0000000 920.7998720 908.0000000 908.0000000 - 998 24 9 1992 27.0000000 892.6229876 880.0000000 880.0000000 - 999 25 9 1992 23.0000000 882.2025165 875.0000000 875.0000000 - 1000 26 9 1992 28.0000000 856.9915700 844.0000000 844.0000000 - 1001 27 9 1992 25.0000000 843.5927888 836.0000000 836.0000000 - 1002 28 9 1992 25.0000000 822.3475168 811.0000000 811.0000000 - 1003 29 9 1992 27.0000000 806.4836342 798.0000000 798.0000000 - 1004 30 9 1992 25.0000000 828.0819476 830.0000000 830.0000000 - 1005 1 10 1992 27.0000000 839.9137410 836.0000000 836.0000000 - 1006 2 10 1992 33.0000000 830.3805969 822.0000000 822.0000000 - 1007 3 10 1992 29.0000000 834.0254545 831.0000000 831.0000000 - 1008 4 10 1992 31.0000000 849.1035413 848.0000000 848.0000000 - 1009 5 10 1992 25.0000000 856.6846358 846.0000000 846.0000000 - 1010 6 10 1992 25.0000000 885.7898314 881.0000000 881.0000000 - 1011 7 10 1992 36.0000000 887.9858083 881.0000000 881.0000000 - 1012 8 10 1992 42.0000000 882.0856976 875.0000000 875.0000000 - 1013 9 10 1992 43.0000000 863.5884080 853.0000000 853.0000000 - 1014 10 10 1992 26.0000000 849.1600442 841.0000000 841.0000000 - 1015 11 10 1992 27.0000000 830.0835282 820.0000000 820.0000000 - 1016 12 10 1992 27.0000000 815.9021933 808.0000000 808.0000000 - 1017 13 10 1992 26.0000000 818.4434617 815.0000000 815.0000000 - 1018 14 10 1992 26.0000000 805.3820324 796.0000000 796.0000000 - 1019 15 10 1992 23.0000000 800.5112892 787.0000000 787.0000000 - 1020 16 10 1992 21.0000000 794.4271683 788.0000000 788.0000000 - 1021 17 10 1992 26.0000000 790.2068073 784.0000000 784.0000000 - 1022 18 10 1992 34.0000000 779.8983967 772.0000000 772.0000000 - 1023 19 10 1992 37.0000000 787.0576883 785.0000000 785.0000000 - 1024 20 10 1992 31.0000000 845.1081891 846.0000000 846.0000000 - 1025 21 10 1992 31.0000000 844.6492381 830.0000000 830.0000000 - 1026 22 10 1992 35.0000000 831.1283497 821.0000000 821.0000000 - 1027 23 10 1992 33.0000000 864.6093527 854.0000000 854.0000000 - 1028 24 10 1992 40.0000000 946.6939804 914.0000000 914.0000000 - 1029 25 10 1992 74.0000000 1029.7246314 998.0000000 998.0000000 - 1030 26 10 1992 161.0000000 1268.1259799 1310.0000000 1310.0000000 - 1031 27 10 1992 285.0000000 1730.4379134 1790.0000000 1790.0000000 - 1032 28 10 1992 244.0000000 2019.3198198 2030.0000000 2030.0000000 - 1033 29 10 1992 263.0000000 2007.9577187 1950.0000000 1950.0000000 - 1034 30 10 1992 276.0000000 1990.7464106 1960.0000000 1960.0000000 - 1035 31 10 1992 186.0000000 2166.0945966 2190.0000000 2190.0000000 - 1036 1 11 1992 154.0000000 2239.1015797 2220.0000000 2220.0000000 - 1037 2 11 1992 112.0000000 2072.0645731 1980.0000000 1980.0000000 - 1038 3 11 1992 104.0000000 1858.0292269 1780.0000000 1780.0000000 - 1039 4 11 1992 96.0000000 1722.1005344 1670.0000000 1670.0000000 - 1040 5 11 1992 99.0000000 1655.7130111 1620.0000000 1620.0000000 - 1041 6 11 1992 126.0000000 1642.2512846 1620.0000000 1620.0000000 - 1042 7 11 1992 91.0000000 1656.1927206 1640.0000000 1640.0000000 - 1043 8 11 1992 84.0000000 1631.1140457 1600.0000000 1600.0000000 - 1044 9 11 1992 81.0000000 1574.2260376 1530.0000000 1530.0000000 - 1045 10 11 1992 85.0000000 1522.9763927 1470.0000000 1470.0000000 - 1046 11 11 1992 126.0000000 1506.6218719 1440.0000000 1440.0000000 - 1047 12 11 1992 279.0000000 1573.2763483 1540.0000000 1540.0000000 - 1048 13 11 1992 390.0000000 1793.7795889 1810.0000000 1810.0000000 - 1049 14 11 1992 294.0000000 2072.7576916 2090.0000000 2090.0000000 - 1050 15 11 1992 260.0000000 2144.2905383 2080.0000000 2080.0000000 - 1051 16 11 1992 398.0000000 2183.8832613 2110.0000000 2110.0000000 - 1052 17 11 1992 520.0000000 2282.6118181 2240.0000000 2240.0000000 - 1053 18 11 1992 487.0000000 2578.6163665 2580.0000000 2580.0000000 - 1054 19 11 1992 380.0000000 2770.8720382 2730.0000000 2730.0000000 - 1055 20 11 1992 385.0000000 2721.8380638 2640.0000000 2640.0000000 - 1056 21 11 1992 351.0000000 2732.2922563 2660.0000000 2660.0000000 - 1057 22 11 1992 309.0000000 2823.1633412 2770.0000000 2770.0000000 - 1058 23 11 1992 587.0000000 2979.9607478 2960.0000000 2960.0000000 - 1059 24 11 1992 661.0000000 3394.1098850 3440.0000000 3440.0000000 - 1060 25 11 1992 447.0000000 3783.1282913 3780.0000000 3780.0000000 - 1061 26 11 1992 361.0000000 3799.2827951 3710.0000000 3710.0000000 - 1062 27 11 1992 351.0000000 3577.1411083 3440.0000000 3440.0000000 - 1063 28 11 1992 353.0000000 3368.0183994 3220.0000000 3220.0000000 - 1064 29 11 1992 369.0000000 3378.1650042 3280.0000000 3280.0000000 - 1065 30 11 1992 452.0000000 3449.5927124 3370.0000000 3370.0000000 - 1066 1 12 1992 441.0000000 3474.2207592 3400.0000000 3400.0000000 - 1067 2 12 1992 348.0000000 3522.3340343 3400.0000000 3400.0000000 - 1068 3 12 1992 394.0000000 3492.5658388 3350.0000000 3350.0000000 - 1069 4 12 1992 455.0000000 3425.7110956 3250.0000000 3250.0000000 - 1070 5 12 1992 491.0000000 3382.8786080 3240.0000000 3240.0000000 - 1071 6 12 1992 469.0000000 3343.6959127 3210.0000000 3210.0000000 - 1072 7 12 1992 364.0000000 3332.1676470 3210.0000000 3210.0000000 - 1073 8 12 1992 338.0000000 3343.2637589 3250.0000000 3250.0000000 - 1074 9 12 1992 334.0000000 3240.2212585 3130.0000000 3130.0000000 - 1075 10 12 1992 268.0000000 3128.2486967 3040.0000000 3040.0000000 - 1076 11 12 1992 236.0000000 3121.0472566 3040.0000000 3040.0000000 - 1077 12 12 1992 230.0000000 3059.6067273 2960.0000000 2960.0000000 - 1078 13 12 1992 239.0000000 2996.1445043 2920.0000000 2920.0000000 - 1079 14 12 1992 256.0000000 2937.5314381 2870.0000000 2870.0000000 - 1080 15 12 1992 217.0000000 2911.4780060 2860.0000000 2860.0000000 - 1081 16 12 1992 201.0000000 2804.6710159 2730.0000000 2730.0000000 - 1082 17 12 1992 188.0000000 2617.0351642 2530.0000000 2530.0000000 - 1083 18 12 1992 176.0000000 2421.3733947 2340.0000000 2340.0000000 - 1084 19 12 1992 170.0000000 2252.7470953 2180.0000000 2180.0000000 - 1085 20 12 1992 168.0000000 2133.6356019 2070.0000000 2070.0000000 - 1086 21 12 1992 131.0000000 2031.8283355 1970.0000000 1970.0000000 - 1087 22 12 1992 133.0000000 1970.6789122 1920.0000000 1920.0000000 - 1088 23 12 1992 134.0000000 1994.1789807 1970.0000000 1970.0000000 - 1089 24 12 1992 127.0000000 1956.4591431 1910.0000000 1910.0000000 - 1090 25 12 1992 117.0000000 1863.3647370 1810.0000000 1810.0000000 - 1091 26 12 1992 113.0000000 1738.2464896 1680.0000000 1680.0000000 - 1092 27 12 1992 100.0000000 1629.6417290 1580.0000000 1580.0000000 - 1093 28 12 1992 94.0000000 1543.5173016 1500.0000000 1500.0000000 - 1094 29 12 1992 87.0000000 1462.1326780 1420.0000000 1420.0000000 - 1095 30 12 1992 86.0000000 1411.7538500 1380.0000000 1380.0000000 - 1096 31 12 1992 81.0000000 1355.2152957 1320.0000000 1320.0000000 - 1097 1 1 1993 77.0000000 1309.6475785 1280.0000000 1280.0000000 - 1098 2 1 1993 76.0000000 1261.0341375 1230.0000000 1230.0000000 - 1099 3 1 1993 61.0000000 1210.2216943 1180.0000000 1180.0000000 - 1100 4 1 1993 61.0000000 1167.1999127 1140.0000000 1140.0000000 - 1101 5 1 1993 57.0000000 1149.6745062 1130.0000000 1130.0000000 - 1102 6 1 1993 66.0000000 1159.2096177 1130.0000000 1130.0000000 - 1103 7 1 1993 67.0000000 1180.9167390 1150.0000000 1150.0000000 - 1104 8 1 1993 84.0000000 1236.7033084 1220.0000000 1220.0000000 - 1105 9 1 1993 90.0000000 1335.5809134 1320.0000000 1320.0000000 - 1106 10 1 1993 113.0000000 1446.0743368 1380.0000000 1380.0000000 - 1107 11 1 1993 265.0000000 1603.0600392 1400.0000000 1400.0000000 - 1108 12 1 1993 559.0000000 1829.2503174 1620.0000000 1620.0000000 - 1109 13 1 1993 832.0000000 2232.1482600 2110.0000000 2110.0000000 - 1110 14 1 1993 601.0000000 2427.1361447 2270.0000000 2270.0000000 - 1111 15 1 1993 436.0000000 2402.3422157 2240.0000000 2240.0000000 - 1112 16 1 1993 339.0000000 2273.3847204 2120.0000000 2120.0000000 - 1113 17 1 1993 292.0000000 2102.9665085 1960.0000000 1960.0000000 - 1114 18 1 1993 247.0000000 1907.4764477 1770.0000000 1770.0000000 - 1115 19 1 1993 218.0000000 1750.4978546 1640.0000000 1640.0000000 - 1116 20 1 1993 205.0000000 1631.9476752 1540.0000000 1540.0000000 - 1117 21 1 1993 190.0000000 1565.1727607 1490.0000000 1490.0000000 - 1118 22 1 1993 176.0000000 1504.9430558 1430.0000000 1430.0000000 - 1119 23 1 1993 173.0000000 1477.4236730 1420.0000000 1420.0000000 - 1120 24 1 1993 173.0000000 1485.9091847 1420.0000000 1420.0000000 - 1121 25 1 1993 199.0000000 1512.9210462 1460.0000000 1460.0000000 - 1122 26 1 1993 361.0000000 1588.3815060 1550.0000000 1550.0000000 - 1123 27 1 1993 295.0000000 1733.5865163 1710.0000000 1710.0000000 - 1124 28 1 1993 238.0000000 1788.9324221 1740.0000000 1740.0000000 - 1125 29 1 1993 263.0000000 1755.0646823 1690.0000000 1690.0000000 - 1126 30 1 1993 245.0000000 1816.1061356 1790.0000000 1790.0000000 - 1127 31 1 1993 222.0000000 1957.7932993 1950.0000000 1950.0000000 - 1128 1 2 1993 199.0000000 1929.2487099 1870.0000000 1870.0000000 - 1129 2 2 1993 186.0000000 1776.9366822 1700.0000000 1700.0000000 - 1130 3 2 1993 171.0000000 1627.5459472 1560.0000000 1560.0000000 - 1131 4 2 1993 157.0000000 1547.0250049 1500.0000000 1500.0000000 - 1132 5 2 1993 159.0000000 1485.0422091 1440.0000000 1440.0000000 - 1133 6 2 1993 129.0000000 1423.2803008 1380.0000000 1380.0000000 - 1134 7 2 1993 119.0000000 1384.9138116 1350.0000000 1350.0000000 - 1135 8 2 1993 119.0000000 1330.3620250 1290.0000000 1290.0000000 - 1136 9 2 1993 105.0000000 1284.5260085 1250.0000000 1250.0000000 - 1137 10 2 1993 106.0000000 1243.3883648 1210.0000000 1210.0000000 - 1138 11 2 1993 105.0000000 1217.7918988 1190.0000000 1190.0000000 - 1139 12 2 1993 95.0000000 1181.4349160 1150.0000000 1150.0000000 - 1140 13 2 1993 91.0000000 1163.7376337 1140.0000000 1140.0000000 - 1141 14 2 1993 88.0000000 1145.2577965 1120.0000000 1120.0000000 - 1142 15 2 1993 84.0000000 1124.5598782 1100.0000000 1100.0000000 - 1143 16 2 1993 83.0000000 1088.5562323 1060.0000000 1060.0000000 - 1144 17 2 1993 79.0000000 1056.1939735 1030.0000000 1030.0000000 - 1145 18 2 1993 78.0000000 1056.5295632 1040.0000000 1040.0000000 - 1146 19 2 1993 84.0000000 1074.1322546 1060.0000000 1060.0000000 - 1147 20 2 1993 91.0000000 1114.9677016 1100.0000000 1100.0000000 - 1148 21 2 1993 91.0000000 1147.8000334 1130.0000000 1130.0000000 - 1149 22 2 1993 90.0000000 1215.7234016 1210.0000000 1210.0000000 - 1150 23 2 1993 103.0000000 1224.6125338 1200.0000000 1200.0000000 - 1151 24 2 1993 94.0000000 1190.5176634 1160.0000000 1160.0000000 - 1152 25 2 1993 81.0000000 1134.2322631 1100.0000000 1100.0000000 - 1153 26 2 1993 78.0000000 1081.3168369 1050.0000000 1050.0000000 - 1154 27 2 1993 75.0000000 1064.2082264 1040.0000000 1040.0000000 - 1155 28 2 1993 76.0000000 1052.9414156 1030.0000000 1030.0000000 - 1156 1 3 1993 80.0000000 1042.4038948 1020.0000000 1020.0000000 - 1157 2 3 1993 75.0000000 1024.7230293 1000.0000000 1000.0000000 - 1158 3 3 1993 76.0000000 1001.0278714 976.0000000 976.0000000 - 1159 4 3 1993 72.0000000 995.5901298 977.0000000 977.0000000 - 1160 5 3 1993 65.0000000 987.4552992 967.0000000 967.0000000 - 1161 6 3 1993 64.0000000 971.4641310 950.0000000 950.0000000 - 1162 7 3 1993 64.0000000 956.9997153 937.0000000 937.0000000 - 1163 8 3 1993 68.0000000 965.8676362 953.0000000 953.0000000 - 1164 9 3 1993 68.0000000 995.2899027 987.0000000 987.0000000 - 1165 10 3 1993 67.0000000 1004.9462532 990.0000000 990.0000000 - 1166 11 3 1993 61.0000000 981.3202216 959.0000000 959.0000000 - 1167 12 3 1993 57.0000000 980.0398409 967.0000000 967.0000000 - 1168 13 3 1993 58.0000000 981.5260391 967.0000000 967.0000000 - 1169 14 3 1993 54.0000000 1005.8937771 999.0000000 999.0000000 - 1170 15 3 1993 66.0000000 1029.1089452 1020.0000000 1020.0000000 - 1171 16 3 1993 54.0000000 1041.3425506 1030.0000000 1030.0000000 - 1172 17 3 1993 57.0000000 1035.6495573 1020.0000000 1020.0000000 - 1173 18 3 1993 57.0000000 1048.5448938 1040.0000000 1040.0000000 - 1174 19 3 1993 52.0000000 1091.4537711 1090.0000000 1090.0000000 - 1175 20 3 1993 57.0000000 1156.6602413 1160.0000000 1160.0000000 - 1176 21 3 1993 58.0000000 1187.8936173 1180.0000000 1180.0000000 - 1177 22 3 1993 57.0000000 1180.2312489 1160.0000000 1160.0000000 - 1178 23 3 1993 56.0000000 1129.1494161 1100.0000000 1100.0000000 - 1179 24 3 1993 63.0000000 1106.3853050 1090.0000000 1090.0000000 - 1180 25 3 1993 76.0000000 1150.0269708 1150.0000000 1150.0000000 - 1181 26 3 1993 56.0000000 1201.9771502 1200.0000000 1200.0000000 - 1182 27 3 1993 59.0000000 1220.8064878 1210.0000000 1210.0000000 - 1183 28 3 1993 59.0000000 1199.6566076 1180.0000000 1180.0000000 - 1184 29 3 1993 54.0000000 1161.6694127 1140.0000000 1140.0000000 - 1185 30 3 1993 48.0000000 1113.6990307 1090.0000000 1090.0000000 - 1186 31 3 1993 55.0000000 1071.1731512 1050.0000000 1050.0000000 - 1187 1 4 1993 48.0000000 1061.9336362 1050.0000000 1050.0000000 - 1188 2 4 1993 53.0000000 1054.1801370 1040.0000000 1040.0000000 - 1189 3 4 1993 47.0000000 1059.3821166 1050.0000000 1050.0000000 - 1190 4 4 1993 59.0000000 1082.7072476 1070.0000000 1070.0000000 - 1191 5 4 1993 53.0000000 1108.6854880 1090.0000000 1090.0000000 - 1192 6 4 1993 64.0000000 1101.7349364 1080.0000000 1080.0000000 - 1193 7 4 1993 63.0000000 1089.1581731 1070.0000000 1070.0000000 - 1194 8 4 1993 75.0000000 1140.1564798 1140.0000000 1140.0000000 - 1195 9 4 1993 64.0000000 1309.7939277 1340.0000000 1340.0000000 - 1196 10 4 1993 59.0000000 1463.0336529 1480.0000000 1480.0000000 - 1197 11 4 1993 60.0000000 1519.4909209 1510.0000000 1510.0000000 - 1198 12 4 1993 63.0000000 1503.4540618 1480.0000000 1480.0000000 - 1199 13 4 1993 69.0000000 1526.2826053 1520.0000000 1520.0000000 - 1200 14 4 1993 79.0000000 1566.0704090 1560.0000000 1560.0000000 - 1201 15 4 1993 82.0000000 1574.7958379 1560.0000000 1560.0000000 - 1202 16 4 1993 68.0000000 1520.2709221 1490.0000000 1490.0000000 - 1203 17 4 1993 56.0000000 1442.0528112 1410.0000000 1410.0000000 - 1204 18 4 1993 59.0000000 1361.5915913 1330.0000000 1330.0000000 - 1205 19 4 1993 61.0000000 1312.0271484 1290.0000000 1290.0000000 - 1206 20 4 1993 62.0000000 1310.2118548 1300.0000000 1300.0000000 - 1207 21 4 1993 57.0000000 1312.1392325 1300.0000000 1300.0000000 - 1208 22 4 1993 53.0000000 1288.6664597 1270.0000000 1270.0000000 - 1209 23 4 1993 47.0000000 1242.9324523 1220.0000000 1220.0000000 - 1210 24 4 1993 46.0000000 1200.3626089 1180.0000000 1180.0000000 - 1211 25 4 1993 47.0000000 1175.5270806 1160.0000000 1160.0000000 - 1212 26 4 1993 45.0000000 1147.5651876 1130.0000000 1130.0000000 - 1213 27 4 1993 43.0000000 1117.3338398 1100.0000000 1100.0000000 - 1214 28 4 1993 41.0000000 1102.5461386 1090.0000000 1090.0000000 - 1215 29 4 1993 38.0000000 1107.7713533 1100.0000000 1100.0000000 - 1216 30 4 1993 39.0000000 1087.0658602 1070.0000000 1070.0000000 - 1217 1 5 1993 40.0000000 1087.8144117 1080.0000000 1080.0000000 - 1218 2 5 1993 41.0000000 1205.5568469 1230.0000000 1230.0000000 - 1219 3 5 1993 45.0000000 1170.2152011 1140.0000000 1140.0000000 - 1220 4 5 1993 49.0000000 1141.7534985 1130.0000000 1130.0000000 - 1221 5 5 1993 40.0000000 1154.7279722 1150.0000000 1150.0000000 - 1222 6 5 1993 43.0000000 1166.8747666 1160.0000000 1160.0000000 - 1223 7 5 1993 38.0000000 1161.9838982 1150.0000000 1150.0000000 - 1224 8 5 1993 38.0000000 1191.3951658 1190.0000000 1190.0000000 - 1225 9 5 1993 43.0000000 1176.0615386 1160.0000000 1160.0000000 - 1226 10 5 1993 44.0000000 1138.1511466 1120.0000000 1120.0000000 - 1227 11 5 1993 41.0000000 1130.3380367 1120.0000000 1120.0000000 - 1228 12 5 1993 51.0000000 1113.2682427 1090.0000000 1090.0000000 - 1229 13 5 1993 63.0000000 1173.4214973 1140.0000000 1140.0000000 - 1230 14 5 1993 68.0000000 1215.2205336 1210.0000000 1210.0000000 - 1231 15 5 1993 77.0000000 1241.4236891 1230.0000000 1230.0000000 - 1232 16 5 1993 77.0000000 1237.4217189 1220.0000000 1220.0000000 - 1233 17 5 1993 59.0000000 1218.9023417 1200.0000000 1200.0000000 - 1234 18 5 1993 49.0000000 1182.7970656 1160.0000000 1160.0000000 - 1235 19 5 1993 43.0000000 1163.3990886 1140.0000000 1140.0000000 - 1236 20 5 1993 44.0000000 1188.9547592 1180.0000000 1180.0000000 - 1237 21 5 1993 48.0000000 1209.6273076 1200.0000000 1200.0000000 - 1238 22 5 1993 44.0000000 1228.8740820 1220.0000000 1220.0000000 - 1239 23 5 1993 46.0000000 1340.8293642 1360.0000000 1360.0000000 - 1240 24 5 1993 40.0000000 1426.2683176 1430.0000000 1430.0000000 - 1241 25 5 1993 43.0000000 1349.1857487 1310.0000000 1310.0000000 - 1242 26 5 1993 30.0000000 1276.0118009 1250.0000000 1250.0000000 - 1243 27 5 1993 45.0000000 1233.7895763 1210.0000000 1210.0000000 - 1244 28 5 1993 43.0000000 1216.2871940 1200.0000000 1200.0000000 - 1245 29 5 1993 44.0000000 1242.3553630 1240.0000000 1240.0000000 - 1246 30 5 1993 54.0000000 1292.1901143 1290.0000000 1290.0000000 - 1247 31 5 1993 56.0000000 1317.8714524 1310.0000000 1310.0000000 - 1248 1 6 1993 44.0000000 1290.1428313 1270.0000000 1270.0000000 - 1249 2 6 1993 43.0000000 1243.9824633 1220.0000000 1220.0000000 - 1250 3 6 1993 33.0000000 1247.7656438 1240.0000000 1240.0000000 - 1251 4 6 1993 45.0000000 1289.3212377 1290.0000000 1290.0000000 - 1252 5 6 1993 46.0000000 1362.0810211 1370.0000000 1370.0000000 - 1253 6 6 1993 42.0000000 1372.2975931 1360.0000000 1360.0000000 - 1254 7 6 1993 40.0000000 1338.8318791 1320.0000000 1320.0000000 - 1255 8 6 1993 30.0000000 1298.5365230 1280.0000000 1280.0000000 - 1256 9 6 1993 31.0000000 1265.9792671 1250.0000000 1250.0000000 - 1257 10 6 1993 32.0000000 1235.7282274 1220.0000000 1220.0000000 - 1258 11 6 1993 25.0000000 1205.4963862 1190.0000000 1190.0000000 - 1259 12 6 1993 33.0000000 1214.0003501 1210.0000000 1210.0000000 - 1260 13 6 1993 29.0000000 1249.2732493 1250.0000000 1250.0000000 - 1261 14 6 1993 40.0000000 1313.2202927 1320.0000000 1320.0000000 - 1262 15 6 1993 42.0000000 1352.0209544 1350.0000000 1350.0000000 - 1263 16 6 1993 37.0000000 1365.8760060 1360.0000000 1360.0000000 - 1264 17 6 1993 46.0000000 1375.6947865 1370.0000000 1370.0000000 - 1265 18 6 1993 47.0000000 1408.6590239 1410.0000000 1410.0000000 - 1266 19 6 1993 50.0000000 1433.0610530 1430.0000000 1430.0000000 - 1267 20 6 1993 43.0000000 1498.4328396 1500.0000000 1500.0000000 - 1268 21 6 1993 69.0000000 1487.2409760 1470.0000000 1470.0000000 - 1269 22 6 1993 61.0000000 1485.9433810 1480.0000000 1480.0000000 - 1270 23 6 1993 67.0000000 1518.8785916 1520.0000000 1520.0000000 - 1271 24 6 1993 77.0000000 1612.6783315 1630.0000000 1630.0000000 - 1272 25 6 1993 87.0000000 1776.4914390 1810.0000000 1810.0000000 - 1273 26 6 1993 55.0000000 1910.0265699 1930.0000000 1930.0000000 - 1274 27 6 1993 43.0000000 1906.4264659 1890.0000000 1890.0000000 - 1275 28 6 1993 40.0000000 1796.8393879 1760.0000000 1760.0000000 - 1276 29 6 1993 30.0000000 1658.9790051 1620.0000000 1620.0000000 - 1277 30 6 1993 40.0000000 1572.8444288 1550.0000000 1550.0000000 - 1278 1 7 1993 40.0000000 1525.8588302 1510.0000000 1510.0000000 - 1279 2 7 1993 27.0000000 1478.0215047 1460.0000000 1460.0000000 - 1280 3 7 1993 34.0000000 1435.6198404 1420.0000000 1420.0000000 - 1281 4 7 1993 30.0000000 1403.2239334 1390.0000000 1390.0000000 - 1282 5 7 1993 31.0000000 1373.4170245 1360.0000000 1360.0000000 - 1283 6 7 1993 27.0000000 1350.7842513 1340.0000000 1340.0000000 - 1284 7 7 1993 31.0000000 1361.5433243 1360.0000000 1360.0000000 - 1285 8 7 1993 26.0000000 1520.3117445 1560.0000000 1560.0000000 - 1286 9 7 1993 23.0000000 1658.5027766 1680.0000000 1680.0000000 - 1287 10 7 1993 24.0000000 1577.8334523 1540.0000000 1540.0000000 - 1288 11 7 1993 25.0000000 1484.0378244 1460.0000000 1460.0000000 - 1289 12 7 1993 34.0000000 1467.0379914 1460.0000000 1460.0000000 - 1290 13 7 1993 40.0000000 1707.3576657 1770.0000000 1770.0000000 - 1291 14 7 1993 41.0000000 2056.8745129 2110.0000000 2110.0000000 - 1292 15 7 1993 46.0000000 2190.8324819 2200.0000000 2200.0000000 - 1293 16 7 1993 39.0000000 2176.2660019 2160.0000000 2160.0000000 - 1294 17 7 1993 43.0000000 2097.4881291 2070.0000000 2070.0000000 - 1295 18 7 1993 35.0000000 2099.8744222 2100.0000000 2100.0000000 - 1296 19 7 1993 49.0000000 2136.1061512 2120.0000000 2120.0000000 - 1297 20 7 1993 38.0000000 2150.9800908 2140.0000000 2140.0000000 - 1298 21 7 1993 41.0000000 2175.2500699 2170.0000000 2170.0000000 - 1299 22 7 1993 45.0000000 2194.2849593 2190.0000000 2190.0000000 - 1300 23 7 1993 41.0000000 2159.6516962 2140.0000000 2140.0000000 - 1301 24 7 1993 42.0000000 2155.7110704 2150.0000000 2150.0000000 - 1302 25 7 1993 40.0000000 2127.2288922 2110.0000000 2110.0000000 - 1303 26 7 1993 35.0000000 2086.7446700 2070.0000000 2070.0000000 - 1304 27 7 1993 40.0000000 2045.0366962 2000.0000000 2000.0000000 - 1305 28 7 1993 40.0000000 1995.2129333 1970.0000000 1970.0000000 - 1306 29 7 1993 36.0000000 1996.9289489 1990.0000000 1990.0000000 - 1307 30 7 1993 40.0000000 2050.5880263 2020.0000000 2020.0000000 - 1308 31 7 1993 61.0000000 1994.6118341 1960.0000000 1960.0000000 - 1309 1 8 1993 36.0000000 1898.2770320 1860.0000000 1860.0000000 - 1310 2 8 1993 46.0000000 1866.6530045 1850.0000000 1850.0000000 - 1311 3 8 1993 32.0000000 1863.4300344 1850.0000000 1850.0000000 - 1312 4 8 1993 38.0000000 1754.5898547 1710.0000000 1710.0000000 - 1313 5 8 1993 32.0000000 1660.1326271 1630.0000000 1630.0000000 - 1314 6 8 1993 25.0000000 1633.4682629 1620.0000000 1620.0000000 - 1315 7 8 1993 26.0000000 1630.5843286 1620.0000000 1620.0000000 - 1316 8 8 1993 29.0000000 1560.6137578 1530.0000000 1530.0000000 - 1317 9 8 1993 29.0000000 1518.9885003 1500.0000000 1500.0000000 - 1318 10 8 1993 28.0000000 1487.5402676 1470.0000000 1470.0000000 - 1319 11 8 1993 37.0000000 1502.5191173 1500.0000000 1500.0000000 - 1320 12 8 1993 40.0000000 1570.6680727 1580.0000000 1580.0000000 - 1321 13 8 1993 49.0000000 1642.5685980 1650.0000000 1650.0000000 - 1322 14 8 1993 32.0000000 1589.9738155 1560.0000000 1560.0000000 - 1323 15 8 1993 37.0000000 1498.8826969 1470.0000000 1470.0000000 - 1324 16 8 1993 37.0000000 1439.3676800 1420.0000000 1420.0000000 - 1325 17 8 1993 27.0000000 1381.3556941 1360.0000000 1360.0000000 - 1326 18 8 1993 24.0000000 1328.7984178 1310.0000000 1310.0000000 - 1327 19 8 1993 24.0000000 1293.9784100 1280.0000000 1280.0000000 - 1328 20 8 1993 22.0000000 1248.3198894 1230.0000000 1230.0000000 - 1329 21 8 1993 21.0000000 1221.2527448 1210.0000000 1210.0000000 - 1330 22 8 1993 16.0000000 1177.9137221 1160.0000000 1160.0000000 - 1331 23 8 1993 21.0000000 1143.1832450 1130.0000000 1130.0000000 - 1332 24 8 1993 27.0000000 1128.4546495 1120.0000000 1120.0000000 - 1333 25 8 1993 26.0000000 1187.7294274 1200.0000000 1200.0000000 - 1334 26 8 1993 23.0000000 1244.4376894 1250.0000000 1250.0000000 - 1335 27 8 1993 21.0000000 1255.7263835 1250.0000000 1250.0000000 - 1336 28 8 1993 28.0000000 1232.4532437 1220.0000000 1220.0000000 - 1337 29 8 1993 17.0000000 1248.6201172 1250.0000000 1250.0000000 - 1338 30 8 1993 24.0000000 1432.7996025 1480.0000000 1480.0000000 - 1339 31 8 1993 25.0000000 1600.9748984 1630.0000000 1630.0000000 - 1340 1 9 1993 25.0000000 1558.0067777 1530.0000000 1530.0000000 - 1341 2 9 1993 19.0000000 1457.9108339 1430.0000000 1430.0000000 - 1342 3 9 1993 17.0000000 1396.3952019 1380.0000000 1380.0000000 - 1343 4 9 1993 16.0000000 1377.1777061 1370.0000000 1370.0000000 - 1344 5 9 1993 19.0000000 1382.5250823 1380.0000000 1380.0000000 - 1345 6 9 1993 23.0000000 1400.1602430 1400.0000000 1400.0000000 - 1346 7 9 1993 25.0000000 1450.9177351 1440.0000000 1440.0000000 - 1347 8 9 1993 34.0000000 1426.6010037 1410.0000000 1410.0000000 - 1348 9 9 1993 31.0000000 1397.2424876 1380.0000000 1380.0000000 - 1349 10 9 1993 35.0000000 1405.6546026 1380.0000000 1380.0000000 - 1350 11 9 1993 53.0000000 1473.7447328 1460.0000000 1460.0000000 - 1351 12 9 1993 71.0000000 1586.2787702 1590.0000000 1590.0000000 - 1352 13 9 1993 74.0000000 1700.0595449 1680.0000000 1680.0000000 - 1353 14 9 1993 87.0000000 1707.1557940 1660.0000000 1660.0000000 - 1354 15 9 1993 173.0000000 1713.6701471 1660.0000000 1660.0000000 - 1355 16 9 1993 117.0000000 1771.9450018 1760.0000000 1760.0000000 - 1356 17 9 1993 93.0000000 1834.8543300 1820.0000000 1820.0000000 - 1357 18 9 1993 77.0000000 1791.9406977 1750.0000000 1750.0000000 - 1358 19 9 1993 62.0000000 1719.6532726 1680.0000000 1680.0000000 - 1359 20 9 1993 54.0000000 1616.8020045 1570.0000000 1570.0000000 - 1360 21 9 1993 48.0000000 1531.4336703 1490.0000000 1490.0000000 - 1361 22 9 1993 46.0000000 1492.0616301 1450.0000000 1450.0000000 - 1362 23 9 1993 55.0000000 1451.2177399 1410.0000000 1410.0000000 - 1363 24 9 1993 66.0000000 1417.8420870 1370.0000000 1370.0000000 - 1364 25 9 1993 64.0000000 1411.7219528 1380.0000000 1380.0000000 - 1365 26 9 1993 52.0000000 1439.3974562 1420.0000000 1420.0000000 - 1366 27 9 1993 68.0000000 1391.4222616 1350.0000000 1350.0000000 - 1367 28 9 1993 69.0000000 1373.2865022 1350.0000000 1350.0000000 - 1368 29 9 1993 62.0000000 1402.2684153 1390.0000000 1390.0000000 - 1369 30 9 1993 76.0000000 1440.9643915 1430.0000000 1430.0000000 - 1370 1 10 1993 72.0000000 1464.1054928 1440.0000000 1440.0000000 - 1371 2 10 1993 68.0000000 1484.8542241 1470.0000000 1470.0000000 - 1372 3 10 1993 72.0000000 1550.6453048 1550.0000000 1550.0000000 - 1373 4 10 1993 78.0000000 1752.3510085 1780.0000000 1780.0000000 - 1374 5 10 1993 116.0000000 1994.4153961 1970.0000000 1970.0000000 - 1375 6 10 1993 131.0000000 2034.1962457 1990.0000000 1990.0000000 - 1376 7 10 1993 180.0000000 1944.1634704 1880.0000000 1880.0000000 - 1377 8 10 1993 203.0000000 1852.7634518 1800.0000000 1800.0000000 - 1378 9 10 1993 164.0000000 1810.1295972 1770.0000000 1770.0000000 - 1379 10 10 1993 178.0000000 1856.1048773 1830.0000000 1830.0000000 - 1380 11 10 1993 161.0000000 2024.6885799 2030.0000000 2030.0000000 - 1381 12 10 1993 287.0000000 2230.8558695 2240.0000000 2240.0000000 - 1382 13 10 1993 360.0000000 2317.9904619 2270.0000000 2270.0000000 - 1383 14 10 1993 374.0000000 2284.5539044 2210.0000000 2210.0000000 - 1384 15 10 1993 297.0000000 2256.1925319 2200.0000000 2200.0000000 - 1385 16 10 1993 247.0000000 2226.4613765 2170.0000000 2170.0000000 - 1386 17 10 1993 273.0000000 2236.6956674 2200.0000000 2200.0000000 - 1387 18 10 1993 261.0000000 2261.5481663 2230.0000000 2230.0000000 - 1388 19 10 1993 265.0000000 2226.3184657 2180.0000000 2180.0000000 - 1389 20 10 1993 230.0000000 2165.5762852 2120.0000000 2120.0000000 - 1390 21 10 1993 199.0000000 2090.8346934 2040.0000000 2040.0000000 - 1391 22 10 1993 173.0000000 2032.5613139 1990.0000000 1990.0000000 - 1392 23 10 1993 182.0000000 2008.8011818 1970.0000000 1970.0000000 - 1393 24 10 1993 203.0000000 2032.4570186 2010.0000000 2010.0000000 - 1394 25 10 1993 213.0000000 2122.9921818 2120.0000000 2120.0000000 - 1395 26 10 1993 180.0000000 2130.5207588 2100.0000000 2100.0000000 - 1396 27 10 1993 154.0000000 2031.4550556 1980.0000000 1980.0000000 - 1397 28 10 1993 118.0000000 1894.3321063 1840.0000000 1840.0000000 - 1398 29 10 1993 112.0000000 1791.4063808 1750.0000000 1750.0000000 - 1399 30 10 1993 98.0000000 1707.7903892 1670.0000000 1670.0000000 - 1400 31 10 1993 97.0000000 1649.7499560 1620.0000000 1620.0000000 - 1401 1 11 1993 91.0000000 1575.5487984 1540.0000000 1540.0000000 - 1402 2 11 1993 85.0000000 1510.0320960 1480.0000000 1480.0000000 - 1403 3 11 1993 75.0000000 1456.8979378 1430.0000000 1430.0000000 - 1404 4 11 1993 76.0000000 1398.4196993 1370.0000000 1370.0000000 - 1405 5 11 1993 78.0000000 1360.8750820 1340.0000000 1340.0000000 - 1406 6 11 1993 72.0000000 1314.8231299 1290.0000000 1290.0000000 - 1407 7 11 1993 76.0000000 1297.0500606 1280.0000000 1280.0000000 - 1408 8 11 1993 69.0000000 1294.0720285 1280.0000000 1280.0000000 - 1409 9 11 1993 66.0000000 1362.4208414 1370.0000000 1370.0000000 - 1410 10 11 1993 71.0000000 1414.5105254 1410.0000000 1410.0000000 - 1411 11 11 1993 64.0000000 1362.8818463 1330.0000000 1330.0000000 - 1412 12 11 1993 67.0000000 1327.4960016 1310.0000000 1310.0000000 - 1413 13 11 1993 80.0000000 1321.1045931 1300.0000000 1300.0000000 - 1414 14 11 1993 78.0000000 1347.3175123 1320.0000000 1320.0000000 - 1415 15 11 1993 80.0000000 1383.7827521 1370.0000000 1370.0000000 - 1416 16 11 1993 86.0000000 1383.6478161 1360.0000000 1360.0000000 - 1417 17 11 1993 125.0000000 1441.5718495 1440.0000000 1440.0000000 - 1418 18 11 1993 96.0000000 1497.1729859 1490.0000000 1490.0000000 - 1419 19 11 1993 82.0000000 1453.4795298 1420.0000000 1420.0000000 - 1420 20 11 1993 77.0000000 1374.7671265 1340.0000000 1340.0000000 - 1421 21 11 1993 67.0000000 1317.0178943 1290.0000000 1290.0000000 - 1422 22 11 1993 71.0000000 1266.2161043 1240.0000000 1240.0000000 - 1423 23 11 1993 61.0000000 1215.4945392 1190.0000000 1190.0000000 - 1424 24 11 1993 42.0000000 1195.7021861 1180.0000000 1180.0000000 - 1425 25 11 1993 63.0000000 1177.3986281 1160.0000000 1160.0000000 - 1426 26 11 1993 57.0000000 1149.1499371 1130.0000000 1130.0000000 - 1427 27 11 1993 58.0000000 1118.6644529 1100.0000000 1100.0000000 - 1428 28 11 1993 49.0000000 1103.6513285 1090.0000000 1090.0000000 - 1429 29 11 1993 50.0000000 1070.1030564 1050.0000000 1050.0000000 - 1430 30 11 1993 55.0000000 1037.4474473 1020.0000000 1020.0000000 - 1431 1 12 1993 54.0000000 1030.2514617 1020.0000000 1020.0000000 - 1432 2 12 1993 54.0000000 995.9023133 971.0000000 971.0000000 - 1433 3 12 1993 50.0000000 988.2673357 978.0000000 978.0000000 - 1434 4 12 1993 51.0000000 983.4860847 968.0000000 968.0000000 - 1435 5 12 1993 62.0000000 967.6428537 952.0000000 952.0000000 - 1436 6 12 1993 62.0000000 963.9647991 953.0000000 953.0000000 - 1437 7 12 1993 71.0000000 967.8491127 930.0000000 930.0000000 - 1438 8 12 1993 79.0000000 990.7432313 945.0000000 945.0000000 - 1439 9 12 1993 153.0000000 1049.6992256 1030.0000000 1030.0000000 - 1440 10 12 1993 291.0000000 1272.5230114 1250.0000000 1250.0000000 - 1441 11 12 1993 332.0000000 1565.3287825 1560.0000000 1560.0000000 - 1442 12 12 1993 465.0000000 1837.4656523 1770.0000000 1770.0000000 - 1443 13 12 1993 518.0000000 2072.0963050 1980.0000000 1980.0000000 - 1444 14 12 1993 539.0000000 2337.8456068 2280.0000000 2280.0000000 - 1445 15 12 1993 559.0000000 2520.7926999 2420.0000000 2420.0000000 - 1446 16 12 1993 500.0000000 2574.1335252 2430.0000000 2430.0000000 - 1447 17 12 1993 526.0000000 2535.8528983 2370.0000000 2370.0000000 - 1448 18 12 1993 583.0000000 2567.8746434 2440.0000000 2440.0000000 - 1449 19 12 1993 677.0000000 2933.8633019 2810.0000000 2810.0000000 - 1450 20 12 1993 781.0000000 3366.4169033 3090.0000000 3090.0000000 - 1451 21 12 1993 1180.0000000 4377.3322722 4300.0000000 4300.0000000 - 1452 22 12 1993 1460.0000000 5773.3128737 5750.0000000 5750.0000000 - 1453 23 12 1993 1600.0000000 6534.4692991 6310.0000000 6310.0000000 - 1454 24 12 1993 1410.0000000 6376.0611819 5990.0000000 5990.0000000 - 1455 25 12 1993 1230.0000000 5867.8857734 5500.0000000 5500.0000000 - 1456 26 12 1993 1070.0000000 5403.7034137 5110.0000000 5110.0000000 - 1457 27 12 1993 746.0000000 4816.4330925 4510.0000000 4510.0000000 - 1458 28 12 1993 542.0000000 4118.7036993 3810.0000000 3810.0000000 - 1459 29 12 1993 492.0000000 3547.6343548 3260.0000000 3260.0000000 - 1460 30 12 1993 491.0000000 3179.2890036 2900.0000000 2900.0000000 - 1461 31 12 1993 617.0000000 3049.4644738 2790.0000000 2790.0000000 + 1 1 7 1990 79.0000000 1769.1844943 1740.0000000 1740.0000000 + 2 2 7 1990 92.0000000 1857.9888271 1870.0000000 1870.0000000 + 3 3 7 1990 72.0000000 2009.9957962 2030.0000000 2030.0000000 + 4 4 7 1990 58.0000000 2063.2110469 2050.0000000 2050.0000000 + 5 5 7 1990 69.0000000 2076.6919573 2040.0000000 2040.0000000 + 6 6 7 1990 94.0000000 2130.2991658 2130.0000000 2130.0000000 + 7 7 7 1990 199.0000000 2239.1649789 2240.0000000 2240.0000000 + 8 8 7 1990 133.0000000 2329.7752731 2330.0000000 2330.0000000 + 9 9 7 1990 124.0000000 2401.3823034 2400.0000000 2400.0000000 + 10 10 7 1990 123.0000000 2385.5327131 2360.0000000 2360.0000000 + 11 11 7 1990 99.0000000 2306.0723175 2270.0000000 2270.0000000 + 12 12 7 1990 88.0000000 2300.1402928 2290.0000000 2290.0000000 + 13 13 7 1990 84.0000000 2234.5671696 2200.0000000 2200.0000000 + 14 14 7 1990 72.0000000 2143.9267725 2110.0000000 2110.0000000 + 15 15 7 1990 55.0000000 2045.6342356 2010.0000000 2010.0000000 + 16 16 7 1990 65.0000000 1945.1113008 1910.0000000 1910.0000000 + 17 17 7 1990 50.0000000 1852.3514067 1820.0000000 1820.0000000 + 18 18 7 1990 50.0000000 1769.6342026 1740.0000000 1740.0000000 + 19 19 7 1990 46.0000000 1712.3840968 1690.0000000 1690.0000000 + 20 20 7 1990 44.0000000 1654.3087788 1630.0000000 1630.0000000 + 21 21 7 1990 42.0000000 1601.6925247 1580.0000000 1580.0000000 + 22 22 7 1990 37.0000000 1520.5293730 1490.0000000 1490.0000000 + 23 23 7 1990 38.0000000 1461.1071646 1440.0000000 1440.0000000 + 24 24 7 1990 44.0000000 1426.2766834 1410.0000000 1410.0000000 + 25 25 7 1990 30.0000000 1388.3210466 1370.0000000 1370.0000000 + 26 26 7 1990 26.0000000 1340.3823127 1320.0000000 1320.0000000 + 27 27 7 1990 31.0000000 1290.1734285 1270.0000000 1270.0000000 + 28 28 7 1990 33.0000000 1259.3881469 1240.0000000 1240.0000000 + 29 29 7 1990 42.0000000 1219.1979041 1200.0000000 1200.0000000 + 30 30 7 1990 36.0000000 1177.7147690 1160.0000000 1160.0000000 + 31 31 7 1990 34.0000000 1168.3814620 1160.0000000 1160.0000000 + 32 1 8 1990 25.0000000 1245.3482815 1260.0000000 1260.0000000 + 33 2 8 1990 22.0000000 1260.3179679 1250.0000000 1250.0000000 + 34 3 8 1990 28.0000000 1203.8708929 1180.0000000 1180.0000000 + 35 4 8 1990 25.0000000 1149.1501329 1130.0000000 1130.0000000 + 36 5 8 1990 19.0000000 1106.7228298 1090.0000000 1090.0000000 + 37 6 8 1990 22.0000000 1066.5882438 1050.0000000 1050.0000000 + 38 7 8 1990 19.0000000 1057.3190612 1050.0000000 1050.0000000 + 39 8 8 1990 22.0000000 1057.1973303 1050.0000000 1050.0000000 + 40 9 8 1990 19.0000000 1049.3665297 1040.0000000 1040.0000000 + 41 10 8 1990 20.0000000 1046.9701913 1040.0000000 1040.0000000 + 42 11 8 1990 19.0000000 1016.0051975 1000.0000000 1000.0000000 + 43 12 8 1990 19.0000000 1001.3616015 993.0000000 993.0000000 + 44 13 8 1990 22.0000000 979.0875259 963.0000000 963.0000000 + 45 14 8 1990 36.0000000 972.2683832 956.0000000 956.0000000 + 46 15 8 1990 31.0000000 994.1845873 988.0000000 988.0000000 + 47 16 8 1990 30.0000000 1041.8254128 1040.0000000 1040.0000000 + 48 17 8 1990 28.0000000 1071.7363236 1070.0000000 1070.0000000 + 49 18 8 1990 34.0000000 1077.2582225 1070.0000000 1070.0000000 + 50 19 8 1990 21.0000000 1046.2430418 1030.0000000 1030.0000000 + 51 20 8 1990 30.0000000 1029.2399428 1020.0000000 1020.0000000 + 52 21 8 1990 22.0000000 1019.1015097 1010.0000000 1010.0000000 + 53 22 8 1990 21.0000000 1024.4002697 1020.0000000 1020.0000000 + 54 23 8 1990 23.0000000 987.2173250 969.0000000 969.0000000 + 55 24 8 1990 20.0000000 949.2152726 935.0000000 935.0000000 + 56 25 8 1990 29.0000000 932.8548055 924.0000000 924.0000000 + 57 26 8 1990 20.0000000 934.8700564 930.0000000 930.0000000 + 58 27 8 1990 22.0000000 931.5110678 924.0000000 924.0000000 + 59 28 8 1990 23.0000000 950.8721890 951.0000000 951.0000000 + 60 29 8 1990 35.0000000 959.2639917 954.0000000 954.0000000 + 61 30 8 1990 51.0000000 997.2494331 947.0000000 947.0000000 + 62 31 8 1990 80.0000000 1000.2772164 958.0000000 958.0000000 + 63 1 9 1990 56.0000000 1003.2776694 995.0000000 995.0000000 + 64 2 9 1990 33.0000000 1042.2654440 1040.0000000 1040.0000000 + 65 3 9 1990 27.0000000 1074.9882689 1070.0000000 1070.0000000 + 66 4 9 1990 27.0000000 1065.8060732 1050.0000000 1050.0000000 + 67 5 9 1990 28.0000000 1052.9730518 1040.0000000 1040.0000000 + 68 6 9 1990 26.0000000 1027.0284646 1010.0000000 1010.0000000 + 69 7 9 1990 24.0000000 1009.6352740 991.0000000 991.0000000 + 70 8 9 1990 33.0000000 1017.0475553 1010.0000000 1010.0000000 + 71 9 9 1990 26.0000000 1019.6332849 1010.0000000 1010.0000000 + 72 10 9 1990 27.0000000 1026.9297942 1020.0000000 1020.0000000 + 73 11 9 1990 22.0000000 1044.2648025 1040.0000000 1040.0000000 + 74 12 9 1990 22.0000000 1016.0882800 998.0000000 998.0000000 + 75 13 9 1990 21.0000000 969.1441575 950.0000000 950.0000000 + 76 14 9 1990 22.0000000 927.0274616 910.0000000 910.0000000 + 77 15 9 1990 22.0000000 881.3627081 863.0000000 863.0000000 + 78 16 9 1990 22.0000000 858.0350647 847.0000000 847.0000000 + 79 17 9 1990 20.0000000 841.0395718 830.0000000 830.0000000 + 80 18 9 1990 22.0000000 855.4627857 854.0000000 854.0000000 + 81 19 9 1990 16.0000000 843.0122329 831.0000000 831.0000000 + 82 20 9 1990 22.0000000 812.8911927 799.0000000 799.0000000 + 83 21 9 1990 19.0000000 803.5704434 790.0000000 790.0000000 + 84 22 9 1990 32.0000000 839.5623636 805.0000000 805.0000000 + 85 23 9 1990 27.0000000 905.1790032 913.0000000 913.0000000 + 86 24 9 1990 45.0000000 996.1912601 998.0000000 998.0000000 + 87 25 9 1990 42.0000000 1127.2076403 1150.0000000 1150.0000000 + 88 26 9 1990 39.0000000 1345.4001058 1390.0000000 1390.0000000 + 89 27 9 1990 30.0000000 1422.8784849 1420.0000000 1420.0000000 + 90 28 9 1990 28.0000000 1328.9807013 1290.0000000 1290.0000000 + 91 29 9 1990 30.0000000 1213.9992932 1180.0000000 1180.0000000 + 92 30 9 1990 30.0000000 1149.5970435 1110.0000000 1110.0000000 + 93 1 10 1990 56.0000000 1152.1005389 1130.0000000 1130.0000000 + 94 2 10 1990 72.0000000 1130.7935216 1110.0000000 1110.0000000 + 95 3 10 1990 73.0000000 1273.8814040 1290.0000000 1290.0000000 + 96 4 10 1990 68.0000000 1423.7748013 1440.0000000 1440.0000000 + 97 5 10 1990 53.0000000 1392.8856962 1360.0000000 1360.0000000 + 98 6 10 1990 42.0000000 1342.7810647 1320.0000000 1320.0000000 + 99 7 10 1990 33.0000000 1386.7856379 1390.0000000 1390.0000000 + 100 8 10 1990 42.0000000 1332.5867540 1300.0000000 1300.0000000 + 101 9 10 1990 34.0000000 1226.4740225 1190.0000000 1190.0000000 + 102 10 10 1990 36.0000000 1146.7199291 1120.0000000 1120.0000000 + 103 11 10 1990 36.0000000 1122.4570745 1110.0000000 1110.0000000 + 104 12 10 1990 28.0000000 1088.8165767 1070.0000000 1070.0000000 + 105 13 10 1990 32.0000000 1040.6533107 1020.0000000 1020.0000000 + 106 14 10 1990 27.0000000 1007.2192528 992.0000000 992.0000000 + 107 15 10 1990 35.0000000 965.7645958 947.0000000 947.0000000 + 108 16 10 1990 42.0000000 923.7235656 906.0000000 906.0000000 + 109 17 10 1990 35.0000000 895.9765119 881.0000000 881.0000000 + 110 18 10 1990 39.0000000 888.6677445 880.0000000 880.0000000 + 111 19 10 1990 34.0000000 881.5776972 872.0000000 872.0000000 + 112 20 10 1990 32.0000000 877.1565627 869.0000000 869.0000000 + 113 21 10 1990 34.0000000 865.4151624 855.0000000 855.0000000 + 114 22 10 1990 27.0000000 838.8371364 825.0000000 825.0000000 + 115 23 10 1990 31.0000000 816.3357645 805.0000000 805.0000000 + 116 24 10 1990 28.0000000 817.7373749 813.0000000 813.0000000 + 117 25 10 1990 25.0000000 812.5994534 803.0000000 803.0000000 + 118 26 10 1990 29.0000000 806.8051646 789.0000000 789.0000000 + 119 27 10 1990 31.0000000 805.3535969 781.0000000 781.0000000 + 120 28 10 1990 65.0000000 879.8466093 786.0000000 786.0000000 + 121 29 10 1990 69.0000000 935.6277112 891.0000000 891.0000000 + 122 30 10 1990 157.0000000 1031.7503939 1010.0000000 1010.0000000 + 123 31 10 1990 190.0000000 1183.4311374 1180.0000000 1180.0000000 + 124 1 11 1990 115.0000000 1477.0330545 1510.0000000 1510.0000000 + 125 2 11 1990 104.0000000 1652.5015287 1640.0000000 1640.0000000 + 126 3 11 1990 100.0000000 1760.7247549 1750.0000000 1750.0000000 + 127 4 11 1990 131.0000000 1744.5304246 1700.0000000 1700.0000000 + 128 5 11 1990 130.0000000 1706.5135476 1670.0000000 1670.0000000 + 129 6 11 1990 115.0000000 1704.5568719 1680.0000000 1680.0000000 + 130 7 11 1990 102.0000000 1735.4509531 1720.0000000 1720.0000000 + 131 8 11 1990 95.0000000 1711.7592670 1680.0000000 1680.0000000 + 132 9 11 1990 81.0000000 1600.5895654 1550.0000000 1550.0000000 + 133 10 11 1990 66.0000000 1483.3316610 1430.0000000 1430.0000000 + 134 11 11 1990 67.0000000 1380.0006543 1320.0000000 1320.0000000 + 135 12 11 1990 74.0000000 1300.2337344 1260.0000000 1260.0000000 + 136 13 11 1990 109.0000000 1331.2954033 1310.0000000 1310.0000000 + 137 14 11 1990 92.0000000 1579.8680221 1610.0000000 1610.0000000 + 138 15 11 1990 92.0000000 1718.3168744 1710.0000000 1710.0000000 + 139 16 11 1990 155.0000000 1721.9314995 1690.0000000 1690.0000000 + 140 17 11 1990 159.0000000 1842.2758128 1850.0000000 1850.0000000 + 141 18 11 1990 131.0000000 2053.6347722 2070.0000000 2070.0000000 + 142 19 11 1990 161.0000000 2120.0370924 2090.0000000 2090.0000000 + 143 20 11 1990 196.0000000 2261.1276620 2220.0000000 2220.0000000 + 144 21 11 1990 336.0000000 2540.5305281 2560.0000000 2560.0000000 + 145 22 11 1990 566.0000000 2845.1824146 2870.0000000 2870.0000000 + 146 23 11 1990 373.0000000 2964.4182060 2940.0000000 2940.0000000 + 147 24 11 1990 293.0000000 3026.5539659 3000.0000000 3000.0000000 + 148 25 11 1990 264.0000000 3021.4148827 2970.0000000 2970.0000000 + 149 26 11 1990 226.0000000 2808.3319125 2710.0000000 2710.0000000 + 150 27 11 1990 201.0000000 2497.7150106 2390.0000000 2390.0000000 + 151 28 11 1990 180.0000000 2282.7285039 2210.0000000 2210.0000000 + 152 29 11 1990 161.0000000 2129.8128694 2060.0000000 2060.0000000 + 153 30 11 1990 149.0000000 1999.3143928 1940.0000000 1940.0000000 + 154 1 12 1990 134.0000000 1875.9117126 1820.0000000 1820.0000000 + 155 2 12 1990 113.0000000 1769.1325111 1720.0000000 1720.0000000 + 156 3 12 1990 99.0000000 1667.1717550 1620.0000000 1620.0000000 + 157 4 12 1990 107.0000000 1573.2760975 1530.0000000 1530.0000000 + 158 5 12 1990 99.0000000 1512.6306574 1480.0000000 1480.0000000 + 159 6 12 1990 89.0000000 1476.6803116 1450.0000000 1450.0000000 + 160 7 12 1990 77.0000000 1422.3163442 1390.0000000 1390.0000000 + 161 8 12 1990 71.0000000 1361.2286275 1330.0000000 1330.0000000 + 162 9 12 1990 68.0000000 1300.2561998 1270.0000000 1270.0000000 + 163 10 12 1990 73.0000000 1239.3845346 1210.0000000 1210.0000000 + 164 11 12 1990 84.0000000 1201.7451554 1180.0000000 1180.0000000 + 165 12 12 1990 88.0000000 1216.5014976 1190.0000000 1190.0000000 + 166 13 12 1990 92.0000000 1243.9883402 1220.0000000 1220.0000000 + 167 14 12 1990 128.0000000 1230.4412290 1200.0000000 1200.0000000 + 168 15 12 1990 136.0000000 1214.8744603 1190.0000000 1190.0000000 + 169 16 12 1990 114.0000000 1203.3204357 1180.0000000 1180.0000000 + 170 17 12 1990 101.0000000 1153.3846064 1120.0000000 1120.0000000 + 171 18 12 1990 93.0000000 1099.8890563 1070.0000000 1070.0000000 + 172 19 12 1990 85.0000000 1079.6696573 1060.0000000 1060.0000000 + 173 20 12 1990 81.0000000 1060.9919162 1040.0000000 1040.0000000 + 174 21 12 1990 106.0000000 1084.7756806 1040.0000000 1040.0000000 + 175 22 12 1990 159.0000000 1102.8204128 1040.0000000 1040.0000000 + 176 23 12 1990 250.0000000 1144.9319995 1090.0000000 1090.0000000 + 177 24 12 1990 298.0000000 1232.3376110 1200.0000000 1200.0000000 + 178 25 12 1990 261.0000000 1364.9790991 1320.0000000 1320.0000000 + 179 26 12 1990 228.0000000 1492.2706770 1410.0000000 1410.0000000 + 180 27 12 1990 409.0000000 1592.5642580 1510.0000000 1510.0000000 + 181 28 12 1990 486.0000000 1749.4874279 1680.0000000 1680.0000000 + 182 29 12 1990 440.0000000 2065.1175061 1970.0000000 1970.0000000 + 183 30 12 1990 486.0000000 2298.9004693 2190.0000000 2190.0000000 + 184 31 12 1990 774.0000000 2534.1281707 2440.0000000 2440.0000000 + 185 1 1 1991 889.0000000 2991.2894305 2950.0000000 2950.0000000 + 186 2 1 1991 863.0000000 3418.3019738 3300.0000000 3300.0000000 + 187 3 1 1991 875.0000000 3701.5054245 3520.0000000 3520.0000000 + 188 4 1 1991 932.0000000 3872.9937384 3700.0000000 3700.0000000 + 189 5 1 1991 826.0000000 3920.7334383 3710.0000000 3710.0000000 + 190 6 1 1991 731.0000000 3834.3243960 3620.0000000 3620.0000000 + 191 7 1 1991 613.0000000 3644.3350983 3430.0000000 3430.0000000 + 192 8 1 1991 610.0000000 3396.7501809 3180.0000000 3180.0000000 + 193 9 1 1991 686.0000000 3296.6229980 3130.0000000 3130.0000000 + 194 10 1 1991 556.0000000 3378.5396721 3200.0000000 3200.0000000 + 195 11 1 1991 669.0000000 3313.5220726 3080.0000000 3080.0000000 + 196 12 1 1991 828.0000000 3199.6080998 3010.0000000 3010.0000000 + 197 13 1 1991 735.0000000 3088.0842349 2930.0000000 2930.0000000 + 198 14 1 1991 513.0000000 2997.5337057 2870.0000000 2870.0000000 + 199 15 1 1991 411.0000000 2832.0461290 2700.0000000 2700.0000000 + 200 16 1 1991 345.0000000 2637.8569261 2520.0000000 2520.0000000 + 201 17 1 1991 293.0000000 2421.9622178 2310.0000000 2310.0000000 + 202 18 1 1991 251.0000000 2234.1550684 2140.0000000 2140.0000000 + 203 19 1 1991 222.0000000 2096.8516503 2020.0000000 2020.0000000 + 204 20 1 1991 215.0000000 1980.5304720 1910.0000000 1910.0000000 + 205 21 1 1991 213.0000000 1854.1856634 1780.0000000 1780.0000000 + 206 22 1 1991 202.0000000 1756.4298500 1690.0000000 1690.0000000 + 207 23 1 1991 200.0000000 1685.9698681 1630.0000000 1630.0000000 + 208 24 1 1991 192.0000000 1623.3560082 1570.0000000 1570.0000000 + 209 25 1 1991 176.0000000 1529.8711261 1470.0000000 1470.0000000 + 210 26 1 1991 164.0000000 1458.4537252 1410.0000000 1410.0000000 + 211 27 1 1991 157.0000000 1411.7550791 1370.0000000 1370.0000000 + 212 28 1 1991 134.0000000 1362.1517797 1320.0000000 1320.0000000 + 213 29 1 1991 130.0000000 1310.4705539 1270.0000000 1270.0000000 + 214 30 1 1991 119.0000000 1274.3988283 1240.0000000 1240.0000000 + 215 31 1 1991 107.0000000 1258.4840091 1230.0000000 1230.0000000 + 216 1 2 1991 112.0000000 1231.8475074 1200.0000000 1200.0000000 + 217 2 2 1991 109.0000000 1193.0455762 1160.0000000 1160.0000000 + 218 3 2 1991 101.0000000 1159.7781642 1130.0000000 1130.0000000 + 219 4 2 1991 98.0000000 1136.6032232 1110.0000000 1110.0000000 + 220 5 2 1991 84.0000000 1115.7950851 1090.0000000 1090.0000000 + 221 6 2 1991 93.0000000 1095.0588780 1070.0000000 1070.0000000 + 222 7 2 1991 80.0000000 1066.6716361 1040.0000000 1040.0000000 + 223 8 2 1991 73.0000000 1036.0554697 1010.0000000 1010.0000000 + 224 9 2 1991 89.0000000 1036.3480754 1020.0000000 1020.0000000 + 225 10 2 1991 84.0000000 1045.8265717 1030.0000000 1030.0000000 + 226 11 2 1991 78.0000000 1055.3447968 1040.0000000 1040.0000000 + 227 12 2 1991 79.0000000 1057.1838286 1040.0000000 1040.0000000 + 228 13 2 1991 77.0000000 1033.6252562 1010.0000000 1010.0000000 + 229 14 2 1991 80.0000000 1012.4967355 992.0000000 992.0000000 + 230 15 2 1991 72.0000000 995.6790725 976.0000000 976.0000000 + 231 16 2 1991 78.0000000 1003.3517768 989.0000000 989.0000000 + 232 17 2 1991 74.0000000 1014.3213572 1000.0000000 1000.0000000 + 233 18 2 1991 77.0000000 1012.5284205 995.0000000 995.0000000 + 234 19 2 1991 73.0000000 1002.0743204 978.0000000 978.0000000 + 235 20 2 1991 69.0000000 980.0629332 952.0000000 952.0000000 + 236 21 2 1991 74.0000000 990.6324014 959.0000000 959.0000000 + 237 22 2 1991 81.0000000 990.1311246 959.0000000 959.0000000 + 238 23 2 1991 110.0000000 1002.9109199 979.0000000 979.0000000 + 239 24 2 1991 180.0000000 1037.4153532 1020.0000000 1020.0000000 + 240 25 2 1991 213.0000000 1076.1391850 1060.0000000 1060.0000000 + 241 26 2 1991 222.0000000 1122.5145818 1110.0000000 1110.0000000 + 242 27 2 1991 208.0000000 1179.9480184 1170.0000000 1170.0000000 + 243 28 2 1991 211.0000000 1239.8353464 1230.0000000 1230.0000000 + 244 1 3 1991 214.0000000 1261.6815986 1240.0000000 1240.0000000 + 245 2 3 1991 208.0000000 1261.7222394 1230.0000000 1230.0000000 + 246 3 3 1991 221.0000000 1279.9938272 1260.0000000 1260.0000000 + 247 4 3 1991 281.0000000 1307.7896868 1290.0000000 1290.0000000 + 248 5 3 1991 219.0000000 1328.7732537 1310.0000000 1310.0000000 + 249 6 3 1991 190.0000000 1370.8115066 1360.0000000 1360.0000000 + 250 7 3 1991 173.0000000 1365.8333695 1340.0000000 1340.0000000 + 251 8 3 1991 164.0000000 1337.2025451 1310.0000000 1310.0000000 + 252 9 3 1991 142.0000000 1314.0658517 1290.0000000 1290.0000000 + 253 10 3 1991 133.0000000 1316.5586330 1300.0000000 1300.0000000 + 254 11 3 1991 133.0000000 1326.0485260 1310.0000000 1310.0000000 + 255 12 3 1991 118.0000000 1358.5334200 1350.0000000 1350.0000000 + 256 13 3 1991 127.0000000 1359.3475696 1340.0000000 1340.0000000 + 257 14 3 1991 113.0000000 1341.0733903 1320.0000000 1320.0000000 + 258 15 3 1991 107.0000000 1320.5608174 1300.0000000 1300.0000000 + 259 16 3 1991 100.0000000 1300.0899034 1280.0000000 1280.0000000 + 260 17 3 1991 100.0000000 1256.5120279 1230.0000000 1230.0000000 + 261 18 3 1991 95.0000000 1206.1240086 1180.0000000 1180.0000000 + 262 19 3 1991 98.0000000 1209.3617905 1160.0000000 1160.0000000 + 263 20 3 1991 119.0000000 1213.4042859 1180.0000000 1180.0000000 + 264 21 3 1991 159.0000000 1294.0999316 1260.0000000 1260.0000000 + 265 22 3 1991 196.0000000 1425.0978366 1410.0000000 1410.0000000 + 266 23 3 1991 242.0000000 1544.9687616 1530.0000000 1530.0000000 + 267 24 3 1991 216.0000000 1699.3927483 1700.0000000 1700.0000000 + 268 25 3 1991 180.0000000 1835.2310659 1830.0000000 1830.0000000 + 269 26 3 1991 145.0000000 1777.5068182 1720.0000000 1720.0000000 + 270 27 3 1991 127.0000000 1657.5483081 1600.0000000 1600.0000000 + 271 28 3 1991 117.0000000 1566.4273537 1520.0000000 1520.0000000 + 272 29 3 1991 109.0000000 1530.9633630 1500.0000000 1500.0000000 + 273 30 3 1991 106.0000000 1517.1227319 1490.0000000 1490.0000000 + 274 31 3 1991 99.0000000 1474.8792401 1440.0000000 1440.0000000 + 275 1 4 1991 96.0000000 1415.9279294 1380.0000000 1380.0000000 + 276 2 4 1991 88.0000000 1362.5350747 1330.0000000 1330.0000000 + 277 3 4 1991 87.0000000 1319.2550163 1290.0000000 1290.0000000 + 278 4 4 1991 82.0000000 1294.0198090 1270.0000000 1270.0000000 + 279 5 4 1991 84.0000000 1250.3177250 1220.0000000 1220.0000000 + 280 6 4 1991 67.0000000 1207.2644721 1180.0000000 1180.0000000 + 281 7 4 1991 89.0000000 1205.2122387 1190.0000000 1190.0000000 + 282 8 4 1991 75.0000000 1237.8100967 1230.0000000 1230.0000000 + 283 9 4 1991 79.0000000 1246.3589359 1230.0000000 1230.0000000 + 284 10 4 1991 70.0000000 1245.8049102 1230.0000000 1230.0000000 + 285 11 4 1991 69.0000000 1237.5829389 1220.0000000 1220.0000000 + 286 12 4 1991 69.0000000 1219.4024855 1200.0000000 1200.0000000 + 287 13 4 1991 56.0000000 1175.8296521 1150.0000000 1150.0000000 + 288 14 4 1991 63.0000000 1133.1484601 1110.0000000 1110.0000000 + 289 15 4 1991 58.0000000 1100.4967168 1080.0000000 1080.0000000 + 290 16 4 1991 56.0000000 1077.8713300 1060.0000000 1060.0000000 + 291 17 4 1991 54.0000000 1049.8402332 1030.0000000 1030.0000000 + 292 18 4 1991 57.0000000 1034.9931539 1020.0000000 1020.0000000 + 293 19 4 1991 53.0000000 1017.2336267 1000.0000000 1000.0000000 + 294 20 4 1991 53.0000000 1043.3104614 1040.0000000 1040.0000000 + 295 21 4 1991 65.0000000 1059.9043588 1050.0000000 1050.0000000 + 296 22 4 1991 69.0000000 1025.4922251 1000.0000000 1000.0000000 + 297 23 4 1991 61.0000000 1022.1312243 1010.0000000 1010.0000000 + 298 24 4 1991 56.0000000 1038.0466983 1030.0000000 1030.0000000 + 299 25 4 1991 56.0000000 1057.7395886 1050.0000000 1050.0000000 + 300 26 4 1991 53.0000000 1038.8801577 1020.0000000 1020.0000000 + 301 27 4 1991 49.0000000 1031.7569662 1020.0000000 1020.0000000 + 302 28 4 1991 53.0000000 1023.7920842 1010.0000000 1010.0000000 + 303 29 4 1991 48.0000000 1002.4317140 982.0000000 982.0000000 + 304 30 4 1991 57.0000000 1014.6993067 983.0000000 983.0000000 + 305 1 5 1991 69.0000000 1086.3143527 1090.0000000 1090.0000000 + 306 2 5 1991 89.0000000 1145.3730323 1140.0000000 1140.0000000 + 307 3 5 1991 105.0000000 1194.6160485 1190.0000000 1190.0000000 + 308 4 5 1991 79.0000000 1267.0835046 1270.0000000 1270.0000000 + 309 5 5 1991 69.0000000 1277.0376389 1260.0000000 1260.0000000 + 310 6 5 1991 71.0000000 1266.4754862 1250.0000000 1250.0000000 + 311 7 5 1991 60.0000000 1232.8198389 1210.0000000 1210.0000000 + 312 8 5 1991 64.0000000 1215.4968754 1200.0000000 1200.0000000 + 313 9 5 1991 59.0000000 1205.0694763 1190.0000000 1190.0000000 + 314 10 5 1991 57.0000000 1156.1038640 1130.0000000 1130.0000000 + 315 11 5 1991 55.0000000 1111.1721966 1090.0000000 1090.0000000 + 316 12 5 1991 53.0000000 1093.9830565 1080.0000000 1080.0000000 + 317 13 5 1991 52.0000000 1276.5415277 1320.0000000 1320.0000000 + 318 14 5 1991 50.0000000 1794.0207093 1920.0000000 1920.0000000 + 319 15 5 1991 52.0000000 2031.2711473 2050.0000000 2050.0000000 + 320 16 5 1991 54.0000000 1883.2904687 1820.0000000 1820.0000000 + 321 17 5 1991 54.0000000 1753.3371008 1720.0000000 1720.0000000 + 322 18 5 1991 55.0000000 1737.9701300 1730.0000000 1730.0000000 + 323 19 5 1991 48.0000000 1740.0413491 1730.0000000 1730.0000000 + 324 20 5 1991 48.0000000 1732.1254069 1720.0000000 1720.0000000 + 325 21 5 1991 49.0000000 1714.2210679 1700.0000000 1700.0000000 + 326 22 5 1991 41.0000000 1640.0392158 1610.0000000 1610.0000000 + 327 23 5 1991 40.0000000 1557.5842505 1530.0000000 1530.0000000 + 328 24 5 1991 40.0000000 1492.8526104 1470.0000000 1470.0000000 + 329 25 5 1991 39.0000000 1432.6995079 1410.0000000 1410.0000000 + 330 26 5 1991 43.0000000 1380.2682561 1360.0000000 1360.0000000 + 331 27 5 1991 39.0000000 1337.8435612 1320.0000000 1320.0000000 + 332 28 5 1991 36.0000000 1282.2808544 1260.0000000 1260.0000000 + 333 29 5 1991 33.0000000 1260.7263317 1250.0000000 1250.0000000 + 334 30 5 1991 39.0000000 1242.8888334 1230.0000000 1230.0000000 + 335 31 5 1991 34.0000000 1230.4853127 1220.0000000 1220.0000000 + 336 1 6 1991 37.0000000 1204.9420538 1190.0000000 1190.0000000 + 337 2 6 1991 35.0000000 1174.8320758 1160.0000000 1160.0000000 + 338 3 6 1991 29.0000000 1144.7257402 1130.0000000 1130.0000000 + 339 4 6 1991 33.0000000 1130.0521172 1120.0000000 1120.0000000 + 340 5 6 1991 34.0000000 1150.8109623 1150.0000000 1150.0000000 + 341 6 6 1991 32.0000000 1210.1064206 1200.0000000 1200.0000000 + 342 7 6 1991 38.0000000 1262.9821309 1260.0000000 1260.0000000 + 343 8 6 1991 39.0000000 1324.7149133 1330.0000000 1330.0000000 + 344 9 6 1991 41.0000000 1387.2921834 1390.0000000 1390.0000000 + 345 10 6 1991 44.0000000 1400.7083380 1380.0000000 1380.0000000 + 346 11 6 1991 48.0000000 1453.6183108 1460.0000000 1460.0000000 + 347 12 6 1991 42.0000000 1500.8908271 1500.0000000 1500.0000000 + 348 13 6 1991 37.0000000 1517.5550703 1510.0000000 1510.0000000 + 349 14 6 1991 39.0000000 1496.9390338 1480.0000000 1480.0000000 + 350 15 6 1991 35.0000000 1466.2503073 1450.0000000 1450.0000000 + 351 16 6 1991 31.0000000 1451.4113669 1440.0000000 1440.0000000 + 352 17 6 1991 33.0000000 1425.7438510 1410.0000000 1410.0000000 + 353 18 6 1991 31.0000000 1549.8445842 1580.0000000 1580.0000000 + 354 19 6 1991 28.0000000 1958.9033590 2060.0000000 2060.0000000 + 355 20 6 1991 60.0000000 2457.0926451 2540.0000000 2540.0000000 + 356 21 6 1991 48.0000000 2639.5671893 2650.0000000 2650.0000000 + 357 22 6 1991 54.0000000 2585.0499641 2550.0000000 2550.0000000 + 358 23 6 1991 63.0000000 2505.7336449 2470.0000000 2470.0000000 + 359 24 6 1991 41.0000000 2446.0066619 2420.0000000 2420.0000000 + 360 25 6 1991 42.0000000 2369.9899665 2340.0000000 2340.0000000 + 361 26 6 1991 43.0000000 2304.9342899 2280.0000000 2280.0000000 + 362 27 6 1991 38.0000000 2213.5913118 2170.0000000 2170.0000000 + 363 28 6 1991 38.0000000 2160.8058879 2140.0000000 2140.0000000 + 364 29 6 1991 35.0000000 2167.1287189 2160.0000000 2160.0000000 + 365 30 6 1991 41.0000000 2209.7566621 2210.0000000 2210.0000000 diff --git a/check/case_05/output_save/b2_daily_discharge.out b/check/case_05/output_save/b2_daily_discharge.out index dba7583c..ca4da602 100644 --- a/check/case_05/output_save/b2_daily_discharge.out +++ b/check/case_05/output_save/b2_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 Qobs_0000000333 Qsim_0000000333 - 1 1 1 1990 157.0000000 1367.3817667 1210.0000000 1308.9923452 - 2 2 1 1990 129.0000000 1266.3270031 1120.0000000 1213.1926055 - 3 3 1 1990 117.0000000 1199.4202807 1070.0000000 1158.0309112 - 4 4 1 1990 111.0000000 1150.2362293 1030.0000000 1113.4223631 - 5 5 1 1990 112.0000000 1111.8362649 1000.0000000 1079.4163489 - 6 6 1 1990 93.0000000 1088.1551381 985.0000000 1060.8418186 - 7 7 1 1990 87.0000000 1049.6738097 946.0000000 1018.4599766 - 8 8 1 1990 84.0000000 1017.7904776 922.0000000 991.4350413 - 9 9 1 1990 80.0000000 988.2525469 896.0000000 962.6952463 - 10 10 1 1990 78.0000000 975.6053161 892.0000000 956.1979046 - 11 11 1 1990 78.0000000 966.0075711 885.0000000 946.9221061 - 12 12 1 1990 77.0000000 963.7376380 888.0000000 947.8421267 - 13 13 1 1990 76.0000000 958.2180458 882.0000000 939.9358932 - 14 14 1 1990 73.0000000 926.7065155 840.0000000 896.4682563 - 15 15 1 1990 66.0000000 923.4794500 837.0000000 899.5385710 - 16 16 1 1990 76.0000000 912.5729790 824.0000000 884.7174303 - 17 17 1 1990 73.0000000 905.5940596 818.0000000 884.3771193 - 18 18 1 1990 71.0000000 914.0789627 829.0000000 893.7383617 - 19 19 1 1990 90.0000000 929.1845651 851.0000000 911.6408949 - 20 20 1 1990 82.0000000 920.5950773 830.0000000 891.3159734 - 21 21 1 1990 80.0000000 915.3018039 833.0000000 892.8269517 - 22 22 1 1990 81.0000000 905.9785168 826.0000000 883.3151232 - 23 23 1 1990 97.0000000 977.8776845 797.0000000 900.4267714 - 24 24 1 1990 198.0000000 1017.8185514 807.0000000 918.7248582 - 25 25 1 1990 392.0000000 1194.6363039 949.0000000 1102.6015920 - 26 26 1 1990 519.0000000 1423.7988430 1170.0000000 1333.0241285 - 27 27 1 1990 565.0000000 1552.1982679 1330.0000000 1470.4793116 - 28 28 1 1990 331.0000000 1683.0708843 1480.0000000 1626.8628683 - 29 29 1 1990 293.0000000 1693.2960370 1450.0000000 1602.0302088 - 30 30 1 1990 302.0000000 1519.7424519 1280.0000000 1410.6197403 - 31 31 1 1990 233.0000000 1386.1032037 1190.0000000 1306.7946734 - 32 1 2 1990 198.0000000 1319.4553381 1120.0000000 1246.6387596 - 33 2 2 1990 183.0000000 1275.8751008 1060.0000000 1208.1319535 - 34 3 2 1990 206.0000000 1244.3325559 1030.0000000 1178.3992686 - 35 4 2 1990 215.0000000 1193.6352247 1010.0000000 1137.4950031 - 36 5 2 1990 183.0000000 1177.3101737 1020.0000000 1134.2112260 - 37 6 2 1990 159.0000000 1136.0378730 982.0000000 1086.6283880 - 38 7 2 1990 167.0000000 1102.9862170 963.0000000 1061.5515384 - 39 8 2 1990 138.0000000 1064.3855039 927.0000000 1023.5585718 - 40 9 2 1990 126.0000000 1045.4232974 916.0000000 1010.2588803 - 41 10 2 1990 131.0000000 1094.7174642 888.0000000 1038.8014620 - 42 11 2 1990 173.0000000 1164.2955132 910.0000000 1082.2555807 - 43 12 2 1990 240.0000000 1264.0617316 985.0000000 1207.2795605 - 44 13 2 1990 270.0000000 1521.2103381 1080.0000000 1466.8415330 - 45 14 2 1990 458.0000000 2041.1731921 1230.0000000 1943.1916408 - 46 15 2 1990 996.0000000 2740.5729138 1750.0000000 2610.9372437 - 47 16 2 1990 1370.0000000 4165.0788456 3620.0000000 4365.3808595 - 48 17 2 1990 1540.0000000 5350.2231065 4830.0000000 5442.0688534 - 49 18 2 1990 1210.0000000 5714.9916718 5130.0000000 5633.0930507 - 50 19 2 1990 616.0000000 5411.9559182 4800.0000000 5214.1565528 - 51 20 2 1990 465.0000000 4764.0810594 4180.0000000 4522.4485195 - 52 21 2 1990 373.0000000 4021.8480296 3500.0000000 3784.5024947 - 53 22 2 1990 298.0000000 3390.2110129 2960.0000000 3198.6453614 - 54 23 2 1990 270.0000000 2936.3109348 2590.0000000 2793.0305821 - 55 24 2 1990 234.0000000 2625.2783485 2340.0000000 2516.1515094 - 56 25 2 1990 218.0000000 2431.2115312 2190.0000000 2345.7549591 - 57 26 2 1990 203.0000000 2372.4191641 2020.0000000 2256.9201110 - 58 27 2 1990 314.0000000 2609.4005270 2100.0000000 2515.2414646 - 59 28 2 1990 520.0000000 3289.4286061 2700.0000000 3273.5156223 - 60 1 3 1990 689.0000000 3917.6110461 3240.0000000 3839.5745457 - 61 2 3 1990 777.0000000 4337.5108404 3760.0000000 4269.8292180 - 62 3 3 1990 584.0000000 4463.9508386 3930.0000000 4350.7452192 - 63 4 3 1990 429.0000000 4318.2443598 3820.0000000 4169.5145450 - 64 5 3 1990 365.0000000 3968.4267238 3500.0000000 3794.2581095 - 65 6 3 1990 281.0000000 3484.3589694 3050.0000000 3297.8585595 - 66 7 3 1990 257.0000000 3060.5728603 2700.0000000 2911.2282373 - 67 8 3 1990 231.0000000 2743.4935843 2440.0000000 2624.4404177 - 68 9 3 1990 211.0000000 2510.9677545 2250.0000000 2414.1775735 - 69 10 3 1990 191.0000000 2324.0287971 2090.0000000 2239.2626827 - 70 11 3 1990 182.0000000 2188.2397103 1980.0000000 2119.3093315 - 71 12 3 1990 173.0000000 2052.7992053 1850.0000000 1982.5629364 - 72 13 3 1990 159.0000000 1929.7123437 1740.0000000 1866.8697583 - 73 14 3 1990 153.0000000 1844.8152632 1670.0000000 1793.9622475 - 74 15 3 1990 141.0000000 1761.3275661 1590.0000000 1709.6427613 - 75 16 3 1990 136.0000000 1705.2653369 1550.0000000 1664.6280168 - 76 17 3 1990 130.0000000 1682.5799277 1540.0000000 1650.4769438 - 77 18 3 1990 123.0000000 1636.4481913 1490.0000000 1596.7039002 - 78 19 3 1990 115.0000000 1566.2335599 1420.0000000 1523.2633515 - 79 20 3 1990 113.0000000 1515.2204417 1380.0000000 1480.1912240 - 80 21 3 1990 102.0000000 1510.1326734 1390.0000000 1487.4004101 - 81 22 3 1990 105.0000000 1470.5864590 1340.0000000 1434.9292822 - 82 23 3 1990 106.0000000 1425.5037325 1300.0000000 1392.6926597 - 83 24 3 1990 87.0000000 1421.2773925 1310.0000000 1400.9224351 - 84 25 3 1990 80.0000000 1429.0629930 1320.0000000 1409.4303024 - 85 26 3 1990 84.0000000 1443.8963629 1340.0000000 1427.1362711 - 86 27 3 1990 82.0000000 1423.0696715 1310.0000000 1395.7143974 - 87 28 3 1990 91.0000000 1424.3928322 1310.0000000 1409.8398271 - 88 29 3 1990 97.0000000 1447.0404579 1330.0000000 1427.5766414 - 89 30 3 1990 110.0000000 1504.7229970 1410.0000000 1502.6158567 - 90 31 3 1990 97.0000000 1534.7924919 1430.0000000 1519.9090743 - 91 1 4 1990 93.0000000 1490.2152124 1370.0000000 1457.6124026 - 92 2 4 1990 85.0000000 1458.4269913 1350.0000000 1435.4827417 - 93 3 4 1990 84.0000000 1466.2908724 1360.0000000 1451.7323916 - 94 4 4 1990 81.0000000 1472.4939965 1360.0000000 1450.9497177 - 95 5 4 1990 81.0000000 1449.9370873 1340.0000000 1427.0188410 - 96 6 4 1990 76.0000000 1420.5439284 1310.0000000 1395.4787996 - 97 7 4 1990 72.0000000 1364.6352839 1250.0000000 1333.1576848 - 98 8 4 1990 68.0000000 1340.7825048 1240.0000000 1321.2691427 - 99 9 4 1990 72.0000000 1320.9018001 1220.0000000 1299.5315486 - 100 10 4 1990 65.0000000 1314.3470029 1220.0000000 1297.9658390 - 101 11 4 1990 62.0000000 1297.9387595 1200.0000000 1277.5290642 - 102 12 4 1990 62.0000000 1309.7261189 1220.0000000 1299.3718814 - 103 13 4 1990 65.0000000 1326.7785403 1230.0000000 1312.3965160 - 104 14 4 1990 68.0000000 1352.4495523 1230.0000000 1330.0876289 - 105 15 4 1990 75.0000000 1333.2389862 1200.0000000 1299.7248629 - 106 16 4 1990 90.0000000 1352.1681850 1240.0000000 1337.2500263 - 107 17 4 1990 92.0000000 1412.0287312 1310.0000000 1407.2917783 - 108 18 4 1990 94.0000000 1474.1809432 1370.0000000 1466.4244351 - 109 19 4 1990 110.0000000 1482.6597528 1370.0000000 1461.6763556 - 110 20 4 1990 99.0000000 1486.5349018 1380.0000000 1468.8001646 - 111 21 4 1990 86.0000000 1485.5481667 1380.0000000 1466.1393642 - 112 22 4 1990 86.0000000 1459.7473537 1340.0000000 1427.6947968 - 113 23 4 1990 86.0000000 1411.9858622 1280.0000000 1377.4731943 - 114 24 4 1990 88.0000000 1359.4301521 1230.0000000 1325.9867248 - 115 25 4 1990 93.0000000 1456.1552405 1380.0000000 1470.1170169 - 116 26 4 1990 99.0000000 1586.9261711 1510.0000000 1597.1672944 - 117 27 4 1990 86.0000000 1598.4901926 1490.0000000 1575.3025291 - 118 28 4 1990 74.0000000 1575.5658555 1470.0000000 1552.9657535 - 119 29 4 1990 72.0000000 1521.8003355 1410.0000000 1490.6669795 - 120 30 4 1990 77.0000000 1459.1289011 1350.0000000 1428.5790042 - 121 1 5 1990 56.0000000 1442.9455041 1350.0000000 1426.6415442 - 122 2 5 1990 64.0000000 1378.9353703 1270.0000000 1344.8388456 - 123 3 5 1990 58.0000000 1327.6611631 1230.0000000 1303.1570369 - 124 4 5 1990 50.0000000 1301.1009937 1210.0000000 1281.5838790 - 125 5 5 1990 50.0000000 1271.5256299 1180.0000000 1250.1085514 - 126 6 5 1990 50.0000000 1270.6416100 1190.0000000 1258.7252425 - 127 7 5 1990 50.0000000 1271.5410107 1190.0000000 1257.7649066 - 128 8 5 1990 53.0000000 1294.7770702 1220.0000000 1288.3017029 - 129 9 5 1990 62.0000000 1346.8067622 1280.0000000 1347.2205733 - 130 10 5 1990 64.0000000 1397.8395158 1320.0000000 1390.9104540 - 131 11 5 1990 65.0000000 1407.4470411 1320.0000000 1391.1228210 - 132 12 5 1990 75.0000000 1408.0977143 1330.0000000 1396.5118943 - 133 13 5 1990 71.0000000 1470.2808550 1410.0000000 1475.0920507 - 134 14 5 1990 63.0000000 1479.4496089 1400.0000000 1463.9413679 - 135 15 5 1990 61.0000000 1438.0530839 1350.0000000 1413.8262385 - 136 16 5 1990 49.0000000 1425.2138160 1350.0000000 1412.5814282 - 137 17 5 1990 46.0000000 1431.3879588 1360.0000000 1421.2568834 - 138 18 5 1990 46.0000000 1432.3714343 1360.0000000 1420.2067615 - 139 19 5 1990 48.0000000 1431.1367713 1360.0000000 1419.2089708 - 140 20 5 1990 41.0000000 1430.1635045 1360.0000000 1418.4992293 - 141 21 5 1990 45.0000000 1421.6787043 1340.0000000 1408.4355944 - 142 22 5 1990 52.0000000 1432.1880512 1360.0000000 1422.8107986 - 143 23 5 1990 50.0000000 1460.3856246 1390.0000000 1457.8611786 - 144 24 5 1990 56.0000000 1486.1360662 1410.0000000 1479.2455251 - 145 25 5 1990 41.0000000 1501.9235428 1430.0000000 1493.8829183 - 146 26 5 1990 40.0000000 1539.9871183 1480.0000000 1540.2920989 - 147 27 5 1990 39.0000000 1611.6731846 1560.0000000 1619.0388157 - 148 28 5 1990 39.0000000 1775.1673727 1750.0000000 1807.8646847 - 149 29 5 1990 33.0000000 1740.1557500 1650.0000000 1706.7614849 - 150 30 5 1990 37.0000000 1615.7983480 1520.0000000 1575.7219902 - 151 31 5 1990 30.0000000 1538.6532337 1460.0000000 1514.7398352 - 152 1 6 1990 37.0000000 1510.3435112 1430.0000000 1488.6936484 - 153 2 6 1990 36.0000000 1472.4510238 1390.0000000 1450.4870043 - 154 3 6 1990 40.0000000 1478.8181191 1370.0000000 1448.9346117 - 155 4 6 1990 45.0000000 1471.3386252 1390.0000000 1454.1709352 - 156 5 6 1990 39.0000000 1469.0453241 1400.0000000 1458.5520196 - 157 6 6 1990 48.0000000 1438.9052238 1360.0000000 1417.2884639 - 158 7 6 1990 39.0000000 1527.0493957 1420.0000000 1523.9111184 - 159 8 6 1990 49.0000000 1634.5245667 1530.0000000 1625.3337720 - 160 9 6 1990 84.0000000 1699.6256448 1600.0000000 1690.4043556 - 161 10 6 1990 91.0000000 1781.7477101 1700.0000000 1782.7906490 - 162 11 6 1990 80.0000000 1956.1932524 1910.0000000 1986.3190781 - 163 12 6 1990 66.0000000 2061.9421055 1990.0000000 2063.3942739 - 164 13 6 1990 53.0000000 2115.6399837 2040.0000000 2111.0631891 - 165 14 6 1990 64.0000000 2108.3351789 2020.0000000 2088.4340324 - 166 15 6 1990 55.0000000 2108.3789611 2030.0000000 2096.0588913 - 167 16 6 1990 54.0000000 2115.6642235 2040.0000000 2103.9656593 - 168 17 6 1990 42.0000000 2084.6118750 2000.0000000 2062.0487591 - 169 18 6 1990 48.0000000 1981.6518972 1880.0000000 1941.6424677 - 170 19 6 1990 48.0000000 1903.9874950 1790.0000000 1871.4459902 - 171 20 6 1990 60.0000000 1884.9226683 1770.0000000 1863.0995483 - 172 21 6 1990 75.0000000 1874.0801949 1770.0000000 1854.3466303 - 173 22 6 1990 78.0000000 1907.8194744 1830.0000000 1906.0064753 - 174 23 6 1990 66.0000000 2080.0254960 2040.0000000 2112.2409886 - 175 24 6 1990 63.0000000 2108.2052893 2020.0000000 2089.6268271 - 176 25 6 1990 52.0000000 1992.3769947 1880.0000000 1947.1523484 - 177 26 6 1990 49.0000000 1865.0724028 1760.0000000 1824.9426073 - 178 27 6 1990 44.0000000 1793.4489224 1690.0000000 1761.6950999 - 179 28 6 1990 51.0000000 1804.3105308 1730.0000000 1797.4992854 - 180 29 6 1990 61.0000000 1821.7165826 1710.0000000 1797.1070031 - 181 30 6 1990 81.0000000 1905.3988569 1780.0000000 1886.7974994 - 182 1 7 1990 79.0000000 1865.9613071 1740.0000000 1826.2220718 - 183 2 7 1990 92.0000000 1943.3214822 1870.0000000 1949.8499295 - 184 3 7 1990 72.0000000 2103.1962754 2030.0000000 2122.6975727 - 185 4 7 1990 58.0000000 2172.3074219 2050.0000000 2155.5082260 - 186 5 7 1990 69.0000000 2200.6011081 2040.0000000 2163.8546523 - 187 6 7 1990 94.0000000 2255.0959131 2130.0000000 2241.9701224 - 188 7 7 1990 199.0000000 2357.8343125 2240.0000000 2356.0980594 - 189 8 7 1990 133.0000000 2454.3530024 2330.0000000 2443.8457876 - 190 9 7 1990 124.0000000 2509.9679676 2400.0000000 2500.1265352 - 191 10 7 1990 123.0000000 2486.1295639 2360.0000000 2453.6036262 - 192 11 7 1990 99.0000000 2400.8111188 2270.0000000 2358.5929860 - 193 12 7 1990 88.0000000 2390.0652108 2290.0000000 2374.4418363 - 194 13 7 1990 84.0000000 2320.2403335 2200.0000000 2280.7331909 - 195 14 7 1990 72.0000000 2225.7795872 2110.0000000 2187.3878111 - 196 15 7 1990 55.0000000 2124.0433483 2010.0000000 2084.3606108 - 197 16 7 1990 65.0000000 2020.4064971 1910.0000000 1981.6128638 - 198 17 7 1990 50.0000000 1924.8222266 1820.0000000 1889.1111988 - 199 18 7 1990 50.0000000 1839.5355117 1740.0000000 1806.8267715 - 200 19 7 1990 46.0000000 1779.9407952 1690.0000000 1754.7345774 - 201 20 7 1990 44.0000000 1719.7197962 1630.0000000 1692.8128809 - 202 21 7 1990 42.0000000 1665.1342205 1580.0000000 1641.0427382 - 203 22 7 1990 37.0000000 1582.1584402 1490.0000000 1549.4075974 - 204 23 7 1990 38.0000000 1521.0631180 1440.0000000 1497.8929618 - 205 24 7 1990 44.0000000 1484.6839971 1410.0000000 1466.4861061 - 206 25 7 1990 30.0000000 1445.2909959 1370.0000000 1425.1758356 - 207 26 7 1990 26.0000000 1396.0145655 1320.0000000 1373.9522818 - 208 27 7 1990 31.0000000 1344.5574245 1270.0000000 1322.8067279 - 209 28 7 1990 33.0000000 1313.1144440 1240.0000000 1292.2012470 - 210 29 7 1990 42.0000000 1271.7334691 1200.0000000 1250.9155371 - 211 30 7 1990 36.0000000 1229.1820835 1160.0000000 1209.9457805 - 212 31 7 1990 34.0000000 1218.8439208 1160.0000000 1209.0277631 - 213 1 8 1990 25.0000000 1294.8630255 1260.0000000 1308.1585489 - 214 2 8 1990 22.0000000 1308.9367213 1250.0000000 1297.3336518 - 215 3 8 1990 28.0000000 1251.6405591 1180.0000000 1226.5490672 - 216 4 8 1990 25.0000000 1196.1133174 1130.0000000 1175.8012148 - 217 5 8 1990 19.0000000 1153.0094341 1090.0000000 1135.1900375 - 218 6 8 1990 22.0000000 1112.0869593 1050.0000000 1094.4341385 - 219 7 8 1990 19.0000000 1102.1133871 1050.0000000 1093.7785760 - 220 8 8 1990 22.0000000 1101.3194377 1050.0000000 1093.1471423 - 221 9 8 1990 19.0000000 1092.8435863 1040.0000000 1082.5395034 - 222 10 8 1990 20.0000000 1089.8271327 1040.0000000 1081.9537696 - 223 11 8 1990 19.0000000 1058.2649506 1000.0000000 1041.3882366 - 224 12 8 1990 19.0000000 1043.0452831 993.0000000 1033.8413651 - 225 13 8 1990 22.0000000 1025.0707453 963.0000000 1009.9006997 - 226 14 8 1990 36.0000000 1032.3959473 956.0000000 1018.5837816 - 227 15 8 1990 31.0000000 1046.6416249 988.0000000 1034.8716112 - 228 16 8 1990 30.0000000 1090.0948957 1040.0000000 1089.5789068 - 229 17 8 1990 28.0000000 1119.8966241 1070.0000000 1114.7337515 - 230 18 8 1990 34.0000000 1119.7664160 1070.0000000 1111.3119744 - 231 19 8 1990 21.0000000 1087.9914043 1030.0000000 1070.6128513 - 232 20 8 1990 30.0000000 1070.2692207 1020.0000000 1059.9485575 - 233 21 8 1990 22.0000000 1059.4483017 1010.0000000 1049.3158312 - 234 22 8 1990 21.0000000 1064.0977234 1020.0000000 1058.7117756 - 235 23 8 1990 23.0000000 1026.2955237 969.0000000 1007.1338135 - 236 24 8 1990 20.0000000 987.7015747 935.0000000 972.5796482 - 237 25 8 1990 29.0000000 970.7819276 924.0000000 961.0567785 - 238 26 8 1990 20.0000000 973.3562810 930.0000000 967.8505368 - 239 27 8 1990 22.0000000 970.8496368 924.0000000 962.4791903 - 240 28 8 1990 23.0000000 988.1215426 951.0000000 987.3724012 - 241 29 8 1990 35.0000000 995.4721909 954.0000000 989.4397315 - 242 30 8 1990 51.0000000 1081.4809811 947.0000000 1049.4243757 - 243 31 8 1990 80.0000000 1085.1778688 958.0000000 1025.5859805 - 244 1 9 1990 56.0000000 1056.5102441 995.0000000 1042.7896825 - 245 2 9 1990 33.0000000 1090.5129097 1040.0000000 1084.8644067 - 246 3 9 1990 27.0000000 1121.7913905 1070.0000000 1113.8181124 - 247 4 9 1990 27.0000000 1115.7483548 1050.0000000 1098.5907021 - 248 5 9 1990 28.0000000 1102.1352683 1040.0000000 1085.4180418 - 249 6 9 1990 26.0000000 1071.6997322 1010.0000000 1052.3798740 - 250 7 9 1990 24.0000000 1055.9741602 991.0000000 1035.5796683 - 251 8 9 1990 33.0000000 1062.0905064 1010.0000000 1052.3319898 - 252 9 9 1990 26.0000000 1061.8452211 1010.0000000 1050.0300315 - 253 10 9 1990 27.0000000 1068.0040203 1020.0000000 1059.0523921 - 254 11 9 1990 22.0000000 1084.2885910 1040.0000000 1078.1437931 - 255 12 9 1990 22.0000000 1055.1385966 998.0000000 1035.2967529 - 256 13 9 1990 21.0000000 1007.2898050 950.0000000 986.5049914 - 257 14 9 1990 22.0000000 964.3299154 910.0000000 945.7628508 - 258 15 9 1990 22.0000000 917.8770100 863.0000000 898.0653401 - 259 16 9 1990 22.0000000 893.8105968 847.0000000 881.4080476 - 260 17 9 1990 20.0000000 876.1207267 830.0000000 863.7870675 - 261 18 9 1990 22.0000000 889.8895498 854.0000000 887.1989354 - 262 19 9 1990 16.0000000 876.8206939 831.0000000 863.6405734 - 263 20 9 1990 22.0000000 846.1139829 799.0000000 831.1092427 - 264 21 9 1990 19.0000000 842.2069503 790.0000000 830.3725306 - 265 22 9 1990 32.0000000 918.2450699 805.0000000 894.9203968 - 266 23 9 1990 27.0000000 988.0745819 913.0000000 985.0445731 - 267 24 9 1990 45.0000000 1055.3566543 998.0000000 1052.2180365 - 268 25 9 1990 42.0000000 1177.4148332 1150.0000000 1197.0293683 - 269 26 9 1990 39.0000000 1392.8314678 1390.0000000 1434.9517793 - 270 27 9 1990 30.0000000 1468.5292222 1420.0000000 1463.3652440 - 271 28 9 1990 28.0000000 1373.0106418 1290.0000000 1331.9160383 - 272 29 9 1990 30.0000000 1256.5520348 1180.0000000 1220.5885889 - 273 30 9 1990 30.0000000 1230.8103701 1110.0000000 1206.5290940 - 274 1 10 1990 56.0000000 1277.1259060 1130.0000000 1254.5536494 - 275 2 10 1990 72.0000000 1236.6331887 1110.0000000 1202.6050558 - 276 3 10 1990 73.0000000 1368.1003853 1290.0000000 1385.4470170 - 277 4 10 1990 68.0000000 1519.5053377 1440.0000000 1528.7698385 - 278 5 10 1990 53.0000000 1477.7524622 1360.0000000 1440.3404805 - 279 6 10 1990 42.0000000 1421.1140570 1320.0000000 1394.4481383 - 280 7 10 1990 33.0000000 1460.4736879 1390.0000000 1460.2166813 - 281 8 10 1990 42.0000000 1402.3788678 1300.0000000 1366.6345866 - 282 9 10 1990 34.0000000 1292.6704258 1190.0000000 1253.2972947 - 283 10 10 1990 36.0000000 1209.7117053 1120.0000000 1180.3280584 - 284 11 10 1990 36.0000000 1182.5627593 1110.0000000 1167.6494584 - 285 12 10 1990 28.0000000 1146.3155497 1070.0000000 1125.2261491 - 286 13 10 1990 32.0000000 1095.7912576 1020.0000000 1073.0276546 - 287 14 10 1990 27.0000000 1060.2127631 992.0000000 1043.0276179 - 288 15 10 1990 35.0000000 1017.4228352 947.0000000 997.2394523 - 289 16 10 1990 42.0000000 976.1030876 906.0000000 956.5283096 - 290 17 10 1990 35.0000000 957.1589859 881.0000000 944.8134224 - 291 18 10 1990 39.0000000 949.7034112 880.0000000 936.4672191 - 292 19 10 1990 34.0000000 933.7978838 872.0000000 922.5134084 - 293 20 10 1990 32.0000000 927.4694186 869.0000000 917.7123114 - 294 21 10 1990 34.0000000 913.9938521 855.0000000 902.0696054 - 295 22 10 1990 27.0000000 885.8272180 825.0000000 870.5631375 - 296 23 10 1990 31.0000000 861.8666966 805.0000000 849.1779461 - 297 24 10 1990 28.0000000 861.9245431 813.0000000 855.9009271 - 298 25 10 1990 25.0000000 856.2819682 803.0000000 846.2039280 - 299 26 10 1990 29.0000000 861.6543020 789.0000000 845.7325470 - 300 27 10 1990 31.0000000 860.7846692 781.0000000 832.7168098 - 301 28 10 1990 65.0000000 995.2984973 786.0000000 924.2605682 - 302 29 10 1990 69.0000000 1100.6883599 891.0000000 1043.3169716 - 303 30 10 1990 157.0000000 1188.4517844 1010.0000000 1149.8574504 - 304 31 10 1990 190.0000000 1320.7347857 1180.0000000 1307.9803703 - 305 1 11 1990 115.0000000 1612.8762113 1510.0000000 1639.1905465 - 306 2 11 1990 104.0000000 1797.8665918 1640.0000000 1784.0209761 - 307 3 11 1990 100.0000000 1922.1437465 1750.0000000 1904.8947728 - 308 4 11 1990 131.0000000 1903.9170620 1700.0000000 1855.4125325 - 309 5 11 1990 130.0000000 1861.3358960 1670.0000000 1815.0344487 - 310 6 11 1990 115.0000000 1840.1144164 1680.0000000 1807.2318637 - 311 7 11 1990 102.0000000 1854.5240605 1720.0000000 1831.8886028 - 312 8 11 1990 95.0000000 1817.0251419 1680.0000000 1778.9432200 - 313 9 11 1990 81.0000000 1694.5471619 1550.0000000 1638.8356494 - 314 10 11 1990 66.0000000 1577.5655974 1430.0000000 1523.9460511 - 315 11 11 1990 67.0000000 1499.7751725 1320.0000000 1446.8067902 - 316 12 11 1990 74.0000000 1443.1173139 1260.0000000 1393.8314628 - 317 13 11 1990 109.0000000 1458.6603872 1310.0000000 1434.0108563 - 318 14 11 1990 92.0000000 1726.1895243 1610.0000000 1761.1239596 - 319 15 11 1990 92.0000000 1888.2113514 1710.0000000 1874.6344399 - 320 16 11 1990 155.0000000 1882.6877160 1690.0000000 1842.1527270 - 321 17 11 1990 159.0000000 1988.6616560 1850.0000000 1993.6066071 - 322 18 11 1990 131.0000000 2211.4357874 2070.0000000 2226.6296543 - 323 19 11 1990 161.0000000 2289.2227033 2090.0000000 2257.8336406 - 324 20 11 1990 196.0000000 2504.1387243 2220.0000000 2494.2243614 - 325 21 11 1990 336.0000000 2877.7701399 2560.0000000 2878.6196942 - 326 22 11 1990 566.0000000 3156.6507168 2870.0000000 3179.5125490 - 327 23 11 1990 373.0000000 3287.5515861 2940.0000000 3251.3837212 - 328 24 11 1990 293.0000000 3319.7922523 3000.0000000 3283.3394455 - 329 25 11 1990 264.0000000 3294.9011926 2970.0000000 3235.0316535 - 330 26 11 1990 226.0000000 3056.7976975 2710.0000000 2944.5820648 - 331 27 11 1990 201.0000000 2709.2969667 2390.0000000 2590.5241962 - 332 28 11 1990 180.0000000 2465.4325007 2210.0000000 2382.7414213 - 333 29 11 1990 161.0000000 2293.0822245 2060.0000000 2219.7856783 - 334 30 11 1990 149.0000000 2154.9176953 1940.0000000 2086.5547131 - 335 1 12 1990 134.0000000 2012.1677011 1820.0000000 1949.6590271 - 336 2 12 1990 113.0000000 1892.5737949 1720.0000000 1838.1640026 - 337 3 12 1990 99.0000000 1782.2995432 1620.0000000 1730.9613726 - 338 4 12 1990 107.0000000 1682.3640727 1530.0000000 1635.3058589 - 339 5 12 1990 99.0000000 1616.3837708 1480.0000000 1580.2363838 - 340 6 12 1990 89.0000000 1575.5409406 1450.0000000 1545.6316182 - 341 7 12 1990 77.0000000 1516.7959099 1390.0000000 1481.4953507 - 342 8 12 1990 71.0000000 1451.7597896 1330.0000000 1417.7620851 - 343 9 12 1990 68.0000000 1387.2176566 1270.0000000 1354.3820311 - 344 10 12 1990 73.0000000 1323.1086520 1210.0000000 1291.3123733 - 345 11 12 1990 84.0000000 1282.5243903 1180.0000000 1258.5161793 - 346 12 12 1990 88.0000000 1301.4771681 1190.0000000 1276.1604657 - 347 13 12 1990 92.0000000 1333.9276368 1220.0000000 1306.5884658 - 348 14 12 1990 128.0000000 1317.6567679 1200.0000000 1283.3159135 - 349 15 12 1990 136.0000000 1298.0901441 1190.0000000 1269.8703330 - 350 16 12 1990 114.0000000 1283.2474824 1180.0000000 1256.9145313 - 351 17 12 1990 101.0000000 1230.4085699 1120.0000000 1194.2394693 - 352 18 12 1990 93.0000000 1174.2819335 1070.0000000 1141.8081434 - 353 19 12 1990 85.0000000 1151.6695190 1060.0000000 1129.5907110 - 354 20 12 1990 81.0000000 1130.8077165 1040.0000000 1107.5614799 - 355 21 12 1990 106.0000000 1163.5237630 1040.0000000 1120.5930825 - 356 22 12 1990 159.0000000 1193.4423816 1040.0000000 1127.6136506 - 357 23 12 1990 250.0000000 1249.0210094 1090.0000000 1188.4558199 - 358 24 12 1990 298.0000000 1336.5748823 1200.0000000 1294.2319077 - 359 25 12 1990 261.0000000 1498.7988545 1320.0000000 1466.1612114 - 360 26 12 1990 228.0000000 1715.3885791 1410.0000000 1643.3624740 - 361 27 12 1990 409.0000000 1886.5474183 1510.0000000 1803.1646918 - 362 28 12 1990 486.0000000 2064.9677982 1680.0000000 1982.4025158 - 363 29 12 1990 440.0000000 2438.7566937 1970.0000000 2370.5133870 - 364 30 12 1990 486.0000000 2810.5431074 2190.0000000 2711.7050391 - 365 31 12 1990 774.0000000 3142.7583559 2440.0000000 3053.9486444 - 366 1 1 1991 889.0000000 3637.5962300 2950.0000000 3581.5570284 - 367 2 1 1991 863.0000000 4070.8894778 3300.0000000 3956.7114600 - 368 3 1 1991 875.0000000 4383.7693251 3520.0000000 4173.7236091 - 369 4 1 1991 932.0000000 4481.4319313 3700.0000000 4282.9641375 - 370 5 1 1991 826.0000000 4483.8368839 3710.0000000 4255.5313656 - 371 6 1 1991 731.0000000 4365.1092830 3620.0000000 4131.8545703 - 372 7 1 1991 613.0000000 4157.6164450 3430.0000000 3939.8699233 - 373 8 1 1991 610.0000000 3908.6557299 3180.0000000 3669.0161019 - 374 9 1 1991 686.0000000 3747.6725374 3130.0000000 3566.4891571 - 375 10 1 1991 556.0000000 3826.5180891 3200.0000000 3647.6541459 - 376 11 1 1991 669.0000000 3786.9786457 3080.0000000 3550.1209660 - 377 12 1 1991 828.0000000 3664.4824305 3010.0000000 3450.3079511 - 378 13 1 1991 735.0000000 3473.1460521 2930.0000000 3293.1864589 - 379 14 1 1991 513.0000000 3318.0631775 2870.0000000 3172.7222220 - 380 15 1 1991 411.0000000 3100.3967286 2700.0000000 2953.7537347 - 381 16 1 1991 345.0000000 2864.1475242 2520.0000000 2734.6408425 - 382 17 1 1991 293.0000000 2616.9177355 2310.0000000 2496.4580675 - 383 18 1 1991 251.0000000 2407.0946775 2140.0000000 2306.6615632 - 384 19 1 1991 222.0000000 2254.1638301 2020.0000000 2172.6596761 - 385 20 1 1991 215.0000000 2127.4279879 1910.0000000 2053.5454412 - 386 21 1 1991 213.0000000 1996.5638374 1780.0000000 1920.9924109 - 387 22 1 1991 202.0000000 1897.7044120 1690.0000000 1828.7792883 - 388 23 1 1991 200.0000000 1822.2454646 1630.0000000 1762.9609304 - 389 24 1 1991 192.0000000 1753.2701662 1570.0000000 1697.0366202 - 390 25 1 1991 176.0000000 1654.2116954 1470.0000000 1591.6903264 - 391 26 1 1991 164.0000000 1577.8117698 1410.0000000 1526.8879649 - 392 27 1 1991 157.0000000 1526.6227284 1370.0000000 1482.5576685 - 393 28 1 1991 134.0000000 1472.9599161 1320.0000000 1428.6387379 - 394 29 1 1991 130.0000000 1417.5953983 1270.0000000 1375.0793460 - 395 30 1 1991 119.0000000 1378.1698242 1240.0000000 1341.8350919 - 396 31 1 1991 107.0000000 1359.1904409 1230.0000000 1328.8678148 - 397 1 2 1991 112.0000000 1329.7440753 1200.0000000 1296.1446168 - 398 2 2 1991 109.0000000 1288.3571088 1160.0000000 1253.6370549 - 399 3 2 1991 101.0000000 1252.7036167 1130.0000000 1221.3204697 - 400 4 2 1991 98.0000000 1227.3190804 1110.0000000 1199.1734255 - 401 5 2 1991 84.0000000 1204.4582668 1090.0000000 1177.1772420 - 402 6 2 1991 93.0000000 1181.8092275 1070.0000000 1155.3156013 - 403 7 2 1991 80.0000000 1151.6340563 1040.0000000 1123.5742158 - 404 8 2 1991 73.0000000 1119.3417644 1010.0000000 1091.9405484 - 405 9 2 1991 89.0000000 1118.0585380 1020.0000000 1100.4035750 - 406 10 2 1991 84.0000000 1126.0513608 1030.0000000 1108.9535818 - 407 11 2 1991 78.0000000 1134.1651298 1040.0000000 1117.5819937 - 408 12 2 1991 79.0000000 1134.6730199 1040.0000000 1116.2812260 - 409 13 2 1991 77.0000000 1109.8496227 1010.0000000 1085.0445585 - 410 14 2 1991 80.0000000 1087.5163865 992.0000000 1065.8660266 - 411 15 2 1991 72.0000000 1069.5486019 976.0000000 1048.7403273 - 412 16 2 1991 78.0000000 1076.7091104 989.0000000 1061.7406720 - 413 17 2 1991 74.0000000 1087.6997068 1000.0000000 1072.0523042 - 414 18 2 1991 77.0000000 1084.5982857 995.0000000 1065.9526306 - 415 19 2 1991 73.0000000 1080.7401686 978.0000000 1060.5324183 - 416 20 2 1991 69.0000000 1072.6931882 952.0000000 1045.3052708 - 417 21 2 1991 74.0000000 1102.1581930 959.0000000 1076.0655978 - 418 22 2 1991 81.0000000 1116.1608798 959.0000000 1083.0166072 - 419 23 2 1991 110.0000000 1127.5466528 979.0000000 1102.2653148 - 420 24 2 1991 180.0000000 1160.0146747 1020.0000000 1140.7637647 - 421 25 2 1991 213.0000000 1197.6589879 1060.0000000 1179.8510172 - 422 26 2 1991 222.0000000 1242.1492734 1110.0000000 1228.4671392 - 423 27 2 1991 208.0000000 1299.8350183 1170.0000000 1288.2415651 - 424 28 2 1991 211.0000000 1354.5500190 1230.0000000 1342.0521787 - 425 1 3 1991 214.0000000 1370.6156946 1240.0000000 1346.9959697 - 426 2 3 1991 208.0000000 1373.2462636 1230.0000000 1342.3375998 - 427 3 3 1991 221.0000000 1392.9857808 1260.0000000 1370.3164663 - 428 4 3 1991 281.0000000 1414.2518753 1290.0000000 1394.4105965 - 429 5 3 1991 219.0000000 1431.1085711 1310.0000000 1410.4220701 - 430 6 3 1991 190.0000000 1469.4080580 1360.0000000 1456.8039843 - 431 7 3 1991 173.0000000 1461.0309052 1340.0000000 1433.5113266 - 432 8 3 1991 164.0000000 1429.5579198 1310.0000000 1400.9333667 - 433 9 3 1991 142.0000000 1404.8936003 1290.0000000 1379.7466198 - 434 10 3 1991 133.0000000 1407.6211451 1300.0000000 1389.8972717 - 435 11 3 1991 133.0000000 1414.5260947 1310.0000000 1397.1486256 - 436 12 3 1991 118.0000000 1444.3902471 1350.0000000 1434.4729263 - 437 13 3 1991 127.0000000 1442.8441596 1340.0000000 1422.1794955 - 438 14 3 1991 113.0000000 1422.3926920 1320.0000000 1400.0596441 - 439 15 3 1991 107.0000000 1399.8631170 1300.0000000 1378.0944608 - 440 16 3 1991 100.0000000 1377.5182651 1280.0000000 1356.2674145 - 441 17 3 1991 100.0000000 1332.1944163 1230.0000000 1304.5640013 - 442 18 3 1991 95.0000000 1280.1753031 1180.0000000 1252.9714666 - 443 19 3 1991 98.0000000 1309.3323651 1160.0000000 1271.9885767 - 444 20 3 1991 119.0000000 1328.8938642 1180.0000000 1287.4231798 - 445 21 3 1991 159.0000000 1410.4136429 1260.0000000 1382.6474427 - 446 22 3 1991 196.0000000 1559.2994048 1410.0000000 1540.8178245 - 447 23 3 1991 242.0000000 1669.8542813 1530.0000000 1651.4371220 - 448 24 3 1991 216.0000000 1815.3898286 1700.0000000 1813.2549838 - 449 25 3 1991 180.0000000 1945.4360709 1830.0000000 1937.7890147 - 450 26 3 1991 145.0000000 1882.9683948 1720.0000000 1823.6109475 - 451 27 3 1991 127.0000000 1760.1520310 1600.0000000 1700.5322061 - 452 28 3 1991 117.0000000 1664.3224250 1520.0000000 1615.9905366 - 453 29 3 1991 109.0000000 1625.0797592 1500.0000000 1592.3485060 - 454 30 3 1991 106.0000000 1607.8188208 1490.0000000 1579.0480161 - 455 31 3 1991 99.0000000 1562.4687488 1440.0000000 1526.0469862 - 456 1 4 1991 96.0000000 1500.6864049 1380.0000000 1463.3092439 - 457 2 4 1991 88.0000000 1444.7051794 1330.0000000 1410.8035962 - 458 3 4 1991 87.0000000 1399.0510023 1290.0000000 1368.5030635 - 459 4 4 1991 82.0000000 1371.8296918 1270.0000000 1346.6983088 - 460 5 4 1991 84.0000000 1326.7063392 1220.0000000 1295.2418442 - 461 6 4 1991 67.0000000 1281.6559627 1180.0000000 1253.2542049 - 462 7 4 1991 89.0000000 1277.8642430 1190.0000000 1261.5837196 - 463 8 4 1991 75.0000000 1308.9613482 1230.0000000 1300.1494926 - 464 9 4 1991 79.0000000 1316.0751819 1230.0000000 1298.7120330 - 465 10 4 1991 70.0000000 1314.0667994 1230.0000000 1297.2869267 - 466 11 4 1991 69.0000000 1304.4644249 1220.0000000 1285.9410655 - 467 12 4 1991 69.0000000 1284.9862263 1200.0000000 1264.6748201 - 468 13 4 1991 56.0000000 1240.1913609 1150.0000000 1213.4832271 - 469 14 4 1991 63.0000000 1196.3692270 1110.0000000 1172.3706633 - 470 15 4 1991 58.0000000 1162.6247221 1080.0000000 1141.2972182 - 471 16 4 1991 56.0000000 1138.9573660 1060.0000000 1120.2788629 - 472 17 4 1991 54.0000000 1109.9357125 1030.0000000 1089.3090564 - 473 18 4 1991 57.0000000 1094.1490657 1020.0000000 1078.3914123 - 474 19 4 1991 53.0000000 1076.4817762 1000.0000000 1058.7845495 - 475 20 4 1991 53.0000000 1102.5140785 1040.0000000 1098.7757272 - 476 21 4 1991 65.0000000 1118.2158094 1050.0000000 1107.3025335 - 477 22 4 1991 69.0000000 1083.7949599 1000.0000000 1058.3034326 - 478 23 4 1991 61.0000000 1081.8180989 1010.0000000 1069.0629198 - 479 24 4 1991 56.0000000 1096.1243295 1030.0000000 1086.9942668 - 480 25 4 1991 56.0000000 1114.5126145 1050.0000000 1106.0142124 - 481 26 4 1991 53.0000000 1094.7445776 1020.0000000 1075.1426537 - 482 27 4 1991 49.0000000 1086.7726530 1020.0000000 1074.3132134 - 483 28 4 1991 53.0000000 1078.0604491 1010.0000000 1063.5970832 - 484 29 4 1991 48.0000000 1057.3998307 982.0000000 1036.5368378 - 485 30 4 1991 57.0000000 1097.4711106 983.0000000 1076.9891067 - 486 1 5 1991 69.0000000 1175.5229473 1090.0000000 1170.7038510 - 487 2 5 1991 89.0000000 1215.9905093 1140.0000000 1209.2756999 - 488 3 5 1991 105.0000000 1262.4408885 1190.0000000 1256.7626501 - 489 4 5 1991 79.0000000 1333.1211215 1270.0000000 1335.0757934 - 490 5 5 1991 69.0000000 1341.7284224 1260.0000000 1323.8951780 - 491 6 5 1991 71.0000000 1329.9045534 1250.0000000 1312.4504677 - 492 7 5 1991 60.0000000 1294.4507272 1210.0000000 1270.7308460 - 493 8 5 1991 64.0000000 1275.6493435 1200.0000000 1259.3028400 - 494 9 5 1991 59.0000000 1263.8551043 1190.0000000 1247.9698097 - 495 10 5 1991 57.0000000 1216.2225971 1130.0000000 1190.7702393 - 496 11 5 1991 55.0000000 1173.5268235 1090.0000000 1150.9654921 - 497 12 5 1991 53.0000000 1153.1780683 1080.0000000 1138.4485489 - 498 13 5 1991 52.0000000 1334.1140433 1320.0000000 1376.8235665 - 499 14 5 1991 50.0000000 1851.1807060 1920.0000000 1976.8852237 - 500 15 5 1991 52.0000000 2093.3478525 2050.0000000 2113.1454431 - 501 16 5 1991 54.0000000 1946.1602290 1820.0000000 1881.1479907 - 502 17 5 1991 54.0000000 1811.4600935 1720.0000000 1777.3741028 - 503 18 5 1991 55.0000000 1794.8245664 1730.0000000 1786.1461081 - 504 19 5 1991 48.0000000 1795.7220068 1730.0000000 1784.9955040 - 505 20 5 1991 48.0000000 1786.6988010 1720.0000000 1773.9093540 - 506 21 5 1991 49.0000000 1767.7476118 1700.0000000 1752.8820483 - 507 22 5 1991 41.0000000 1692.5741110 1610.0000000 1661.9085283 - 508 23 5 1991 40.0000000 1609.1779941 1530.0000000 1580.9842264 - 509 24 5 1991 40.0000000 1543.5514489 1470.0000000 1520.1050140 - 510 25 5 1991 39.0000000 1482.5458443 1410.0000000 1459.2671569 - 511 26 5 1991 43.0000000 1429.3010145 1360.0000000 1408.4672739 - 512 27 5 1991 39.0000000 1386.0985144 1320.0000000 1367.7023014 - 513 28 5 1991 36.0000000 1329.7909188 1260.0000000 1306.9694615 - 514 29 5 1991 33.0000000 1307.5218318 1250.0000000 1296.2662331 - 515 30 5 1991 39.0000000 1288.9977406 1230.0000000 1275.5903264 - 516 31 5 1991 34.0000000 1275.9334603 1220.0000000 1264.9396609 - 517 1 6 1991 37.0000000 1249.7533313 1190.0000000 1234.3123439 - 518 2 6 1991 35.0000000 1219.0286039 1160.0000000 1203.7066535 - 519 3 6 1991 29.0000000 1188.3280292 1130.0000000 1173.1210210 - 520 4 6 1991 33.0000000 1173.0792102 1120.0000000 1162.5540174 - 521 5 6 1991 34.0000000 1193.8897373 1150.0000000 1192.6882193 - 522 6 6 1991 32.0000000 1258.5474228 1200.0000000 1249.7047624 - 523 7 6 1991 38.0000000 1317.3429878 1260.0000000 1315.1187328 - 524 8 6 1991 39.0000000 1374.6486986 1330.0000000 1377.1193877 - 525 9 6 1991 41.0000000 1436.5044325 1390.0000000 1441.2494167 - 526 10 6 1991 44.0000000 1454.4302329 1380.0000000 1431.5319680 - 527 11 6 1991 48.0000000 1499.0954884 1460.0000000 1504.5918617 - 528 12 6 1991 42.0000000 1545.1741412 1500.0000000 1543.7042504 - 529 13 6 1991 37.0000000 1561.0533688 1510.0000000 1552.9380251 - 530 14 6 1991 39.0000000 1539.7072713 1480.0000000 1522.2260722 - 531 15 6 1991 35.0000000 1509.2989455 1450.0000000 1492.7118658 - 532 16 6 1991 31.0000000 1497.7957959 1440.0000000 1487.0454542 - 533 17 6 1991 33.0000000 1475.7340144 1410.0000000 1459.4757563 - 534 18 6 1991 31.0000000 1596.9462986 1580.0000000 1626.2162577 - 535 19 6 1991 28.0000000 2003.0815514 2060.0000000 2103.6435395 - 536 20 6 1991 60.0000000 2521.6059080 2540.0000000 2612.3906238 - 537 21 6 1991 48.0000000 2701.1090873 2650.0000000 2704.1277860 - 538 22 6 1991 54.0000000 2635.8885497 2550.0000000 2600.5288746 - 539 23 6 1991 63.0000000 2557.6520349 2470.0000000 2521.4936412 - 540 24 6 1991 41.0000000 2494.2272073 2420.0000000 2467.3245942 - 541 25 6 1991 42.0000000 2416.7257913 2340.0000000 2386.0412290 - 542 26 6 1991 43.0000000 2350.7863928 2280.0000000 2325.2848819 - 543 27 6 1991 38.0000000 2262.8132958 2170.0000000 2219.7748585 - 544 28 6 1991 38.0000000 2212.7216049 2140.0000000 2190.9444221 - 545 29 6 1991 35.0000000 2214.1745871 2160.0000000 2206.2757134 - 546 30 6 1991 41.0000000 2254.8519078 2210.0000000 2254.4505902 - 547 1 7 1991 41.0000000 2287.8826906 2240.0000000 2283.4146838 - 548 2 7 1991 38.0000000 2293.3153401 2240.0000000 2282.4460640 - 549 3 7 1991 34.0000000 2222.5612517 2150.0000000 2191.5381554 - 550 4 7 1991 27.0000000 2100.4714003 2020.0000000 2060.6851352 - 551 5 7 1991 31.0000000 1984.7512751 1910.0000000 1949.8818184 - 552 6 7 1991 30.0000000 1904.5536946 1840.0000000 1879.1235808 - 553 7 7 1991 26.0000000 1836.0717505 1760.0000000 1808.5986874 - 554 8 7 1991 30.0000000 1760.5030232 1690.0000000 1732.3270864 - 555 9 7 1991 31.0000000 1699.4231180 1640.0000000 1678.7743566 - 556 10 7 1991 23.0000000 1702.3935230 1660.0000000 1698.0271618 - 557 11 7 1991 35.0000000 1705.9958529 1660.0000000 1697.3215080 - 558 12 7 1991 19.0000000 1692.2134568 1640.0000000 1680.1013622 - 559 13 7 1991 24.0000000 1701.6124259 1620.0000000 1683.1565576 - 560 14 7 1991 26.0000000 1704.1340367 1640.0000000 1691.7997716 - 561 15 7 1991 27.0000000 1723.6830810 1680.0000000 1722.8771332 - 562 16 7 1991 41.0000000 1737.1283315 1690.0000000 1730.2513273 - 563 17 7 1991 34.0000000 1753.6040049 1710.0000000 1749.3145557 - 564 18 7 1991 27.0000000 1741.6520124 1690.0000000 1728.4758259 - 565 19 7 1991 25.0000000 1682.0795106 1620.0000000 1657.6881906 - 566 20 7 1991 23.0000000 1711.3575448 1680.0000000 1716.9148843 - 567 21 7 1991 22.0000000 1716.4008361 1670.0000000 1706.1850665 - 568 22 7 1991 27.0000000 1651.5016182 1590.0000000 1625.4965197 - 569 23 7 1991 23.0000000 1601.5371047 1550.0000000 1584.8824131 - 570 24 7 1991 21.0000000 1571.7672841 1520.0000000 1557.9806704 - 571 25 7 1991 23.0000000 1589.8913459 1520.0000000 1575.8608762 - 572 26 7 1991 33.0000000 1605.4255284 1550.0000000 1597.9914196 - 573 27 7 1991 23.0000000 1621.9332919 1580.0000000 1619.9044617 - 574 28 7 1991 29.0000000 1663.7005095 1630.0000000 1667.1266866 - 575 29 7 1991 30.0000000 1766.6143190 1750.0000000 1786.2750516 - 576 30 7 1991 35.0000000 1787.4174085 1720.0000000 1770.2587431 - 577 31 7 1991 27.0000000 1700.2216312 1620.0000000 1664.8907585 - 578 1 8 1991 45.0000000 1627.4459235 1570.0000000 1608.0548413 - 579 2 8 1991 47.0000000 1653.3614235 1620.0000000 1657.0813517 - 580 3 8 1991 40.0000000 1663.6897697 1620.0000000 1656.2100436 - 581 4 8 1991 35.0000000 1585.5191946 1520.0000000 1555.3956821 - 582 5 8 1991 26.0000000 1546.2796626 1500.0000000 1534.6326979 - 583 6 8 1991 23.0000000 1509.9538308 1460.0000000 1493.9161435 - 584 7 8 1991 30.0000000 1463.9627378 1410.0000000 1443.4914693 - 585 8 8 1991 33.0000000 1429.3416279 1380.0000000 1412.7685483 - 586 9 8 1991 30.0000000 1380.9310537 1330.0000000 1362.1452980 - 587 10 8 1991 28.0000000 1345.1796272 1300.0000000 1331.5633247 - 588 11 8 1991 19.0000000 1314.4616455 1270.0000000 1301.0112003 - 589 12 8 1991 20.0000000 1268.3526756 1220.0000000 1250.4862780 - 590 13 8 1991 16.0000000 1233.1372579 1190.0000000 1219.9861844 - 591 14 8 1991 18.0000000 1217.9536015 1180.0000000 1209.5087888 - 592 15 8 1991 18.0000000 1199.6549111 1160.0000000 1189.0521759 - 593 16 8 1991 20.0000000 1179.0973670 1140.0000000 1168.6146217 - 594 17 8 1991 16.0000000 1158.5640548 1120.0000000 1148.1945732 - 595 18 8 1991 15.0000000 1138.0529567 1100.0000000 1127.7906292 - 596 19 8 1991 15.0000000 1102.1329164 1060.0000000 1087.4015244 - 597 20 8 1991 14.0000000 1069.3756459 1030.0000000 1057.0261152 - 598 21 8 1991 15.0000000 1054.3503276 1020.0000000 1046.6633663 - 599 22 8 1991 13.0000000 1043.9267865 1010.0000000 1036.3346273 - 600 23 8 1991 12.0000000 1033.4797026 999.0000000 1025.7943511 - 601 24 8 1991 11.0000000 1030.9709390 1000.0000000 1026.0061308 - 602 25 8 1991 12.0000000 1045.9183702 1020.0000000 1045.4147419 - 603 26 8 1991 11.0000000 1021.5533962 983.0000000 1008.0976832 - 604 27 8 1991 13.0000000 991.8882711 956.0000000 980.7892276 - 605 28 8 1991 11.0000000 962.9761366 927.0000000 951.4888085 - 606 29 8 1991 12.0000000 945.9602935 914.0000000 938.1959097 - 607 30 8 1991 12.0000000 927.9814167 895.0000000 918.9100605 - 608 31 8 1991 11.0000000 907.8685264 875.0000000 898.6308310 - 609 1 9 1991 11.0000000 886.6857460 850.0000000 877.0954514 - 610 2 9 1991 17.0000000 851.8451283 813.0000000 838.1638862 - 611 3 9 1991 11.0000000 812.7996846 777.0000000 800.0731625 - 612 4 9 1991 12.0000000 815.0452283 791.0000000 813.8016229 - 613 5 9 1991 11.0000000 814.0676061 786.0000000 808.5363339 - 614 6 9 1991 11.0000000 806.4407175 778.0000000 800.2769205 - 615 7 9 1991 18.0000000 803.5353313 777.0000000 799.0230408 - 616 8 9 1991 11.0000000 793.7499808 765.0000000 786.7743823 - 617 9 9 1991 13.0000000 760.6272423 726.0000000 747.5306593 - 618 10 9 1991 12.0000000 753.1231391 726.0000000 749.2817596 - 619 11 9 1991 11.0000000 787.6116136 733.0000000 793.6997797 - 620 12 9 1991 20.0000000 785.7225688 738.0000000 772.0671959 - 621 13 9 1991 21.0000000 805.8140516 790.0000000 813.5136354 - 622 14 9 1991 29.0000000 847.3105908 829.0000000 852.0981252 - 623 15 9 1991 28.0000000 858.0879191 832.0000000 854.7037641 - 624 16 9 1991 20.0000000 815.1429765 776.0000000 798.3293555 - 625 17 9 1991 20.0000000 780.3354547 748.0000000 769.9724452 - 626 18 9 1991 20.0000000 771.2300342 745.0000000 766.6307311 - 627 19 9 1991 12.0000000 789.4550068 770.0000000 791.3035968 - 628 20 9 1991 11.0000000 787.8637525 761.0000000 781.9898386 - 629 21 9 1991 11.0000000 756.9148271 724.0000000 744.6883495 - 630 22 9 1991 22.0000000 764.4195799 714.0000000 767.5936830 - 631 23 9 1991 14.0000000 791.0041460 753.0000000 786.8558410 - 632 24 9 1991 48.0000000 870.5717373 870.0000000 893.5301397 - 633 25 9 1991 45.0000000 985.6329364 905.0000000 975.7618639 - 634 26 9 1991 80.0000000 986.8680549 894.0000000 964.5761096 - 635 27 9 1991 61.0000000 944.7100150 870.0000000 925.9625406 - 636 28 9 1991 61.0000000 988.3973193 900.0000000 976.2662601 - 637 29 9 1991 65.0000000 1059.0239701 983.0000000 1065.6189541 - 638 30 9 1991 63.0000000 1094.7755758 1020.0000000 1087.6247877 - 639 1 10 1991 90.0000000 1078.8261603 1010.0000000 1067.5605416 - 640 2 10 1991 59.0000000 1062.5278091 998.0000000 1051.5503375 - 641 3 10 1991 45.0000000 1088.3344950 1040.0000000 1090.1510630 - 642 4 10 1991 42.0000000 1102.2930249 1050.0000000 1097.2155315 - 643 5 10 1991 41.0000000 1166.2680003 1070.0000000 1165.2269445 - 644 6 10 1991 41.0000000 1193.6138577 1090.0000000 1174.5057976 - 645 7 10 1991 73.0000000 1176.2174888 1100.0000000 1166.9160771 - 646 8 10 1991 96.0000000 1155.1371610 1080.0000000 1141.2466037 - 647 9 10 1991 61.0000000 1153.8572376 1090.0000000 1147.3935175 - 648 10 10 1991 44.0000000 1121.3530049 1050.0000000 1103.9721076 - 649 11 10 1991 42.0000000 1078.0930493 1010.0000000 1061.3003641 - 650 12 10 1991 41.0000000 1075.3960544 986.0000000 1062.1216636 - 651 13 10 1991 42.0000000 1044.8647590 954.0000000 1021.8578407 - 652 14 10 1991 61.0000000 1016.7144476 950.0000000 1007.4384736 - 653 15 10 1991 55.0000000 1040.7289635 987.0000000 1041.2862038 - 654 16 10 1991 41.0000000 1045.4886025 979.0000000 1033.0703188 - 655 17 10 1991 48.0000000 1045.3047940 960.0000000 1031.4269212 - 656 18 10 1991 52.0000000 1078.6798094 977.0000000 1062.3819145 - 657 19 10 1991 66.0000000 1065.1167699 975.0000000 1047.5172470 - 658 20 10 1991 59.0000000 1047.4405920 966.0000000 1033.9314194 - 659 21 10 1991 71.0000000 1046.3190793 973.0000000 1036.7179159 - 660 22 10 1991 74.0000000 1033.7866479 962.0000000 1021.2961356 - 661 23 10 1991 70.0000000 1020.5068357 953.0000000 1009.1008576 - 662 24 10 1991 59.0000000 1005.0405269 940.0000000 993.2824753 - 663 25 10 1991 57.0000000 979.7540044 915.0000000 965.7449004 - 664 26 10 1991 57.0000000 941.9917125 877.0000000 925.4536368 - 665 27 10 1991 51.0000000 910.7765135 851.0000000 897.3795808 - 666 28 10 1991 47.0000000 881.7655412 824.0000000 868.5012936 - 667 29 10 1991 48.0000000 866.6145606 815.0000000 857.7888034 - 668 30 10 1991 45.0000000 847.0579387 788.0000000 836.2439847 - 669 31 10 1991 43.0000000 844.7636979 790.0000000 836.2901767 - 670 1 11 1991 40.0000000 845.1343110 776.0000000 826.3722472 - 671 2 11 1991 47.0000000 850.0024221 781.0000000 841.2223372 - 672 3 11 1991 46.0000000 882.2145011 785.0000000 879.4941469 - 673 4 11 1991 76.0000000 932.1153175 802.0000000 912.4279348 - 674 5 11 1991 60.0000000 957.2465214 840.0000000 948.5500055 - 675 6 11 1991 132.0000000 1058.1335560 970.0000000 1069.5966451 - 676 7 11 1991 133.0000000 1241.3886020 1160.0000000 1262.1310920 - 677 8 11 1991 113.0000000 1332.4857915 1190.0000000 1319.3716319 - 678 9 11 1991 120.0000000 1349.1002095 1190.0000000 1325.5498874 - 679 10 11 1991 141.0000000 1346.6610426 1210.0000000 1329.9297689 - 680 11 11 1991 208.0000000 1354.1510636 1180.0000000 1318.1762278 - 681 12 11 1991 166.0000000 1454.8848637 1240.0000000 1414.8867601 - 682 13 11 1991 183.0000000 1526.5380477 1220.0000000 1505.2838353 - 683 14 11 1991 299.0000000 1681.6696201 1240.0000000 1628.0408073 - 684 15 11 1991 521.0000000 1841.4104462 1480.0000000 1832.7336692 - 685 16 11 1991 443.0000000 2099.3216940 1820.0000000 2123.5817123 - 686 17 11 1991 304.0000000 2069.3558754 1750.0000000 2004.7085030 - 687 18 11 1991 231.0000000 1936.1341769 1610.0000000 1856.4486718 - 688 19 11 1991 192.0000000 1870.2382034 1570.0000000 1811.1661110 - 689 20 11 1991 199.0000000 1826.6035839 1560.0000000 1783.8602754 - 690 21 11 1991 201.0000000 1856.1217034 1630.0000000 1831.0238836 - 691 22 11 1991 173.0000000 1829.6160272 1620.0000000 1790.4540570 - 692 23 11 1991 159.0000000 1768.7090179 1580.0000000 1727.1686400 - 693 24 11 1991 160.0000000 1661.8687825 1480.0000000 1610.0201160 - 694 25 11 1991 146.0000000 1521.7394994 1350.0000000 1465.6912202 - 695 26 11 1991 110.0000000 1392.7139723 1240.0000000 1343.5707695 - 696 27 11 1991 114.0000000 1310.6411511 1180.0000000 1275.7580783 - 697 28 11 1991 97.0000000 1274.8072706 1160.0000000 1250.7835284 - 698 29 11 1991 89.0000000 1225.9210701 1110.0000000 1196.4207797 - 699 30 11 1991 73.0000000 1170.7695578 1060.0000000 1142.4936824 - 700 1 12 1991 69.0000000 1116.1341422 1010.0000000 1088.9483211 - 701 2 12 1991 67.0000000 1068.1230321 968.0000000 1043.7383433 - 702 3 12 1991 63.0000000 1032.3671183 939.0000000 1011.8237692 - 703 4 12 1991 58.0000000 1012.2762119 926.0000000 996.1700114 - 704 5 12 1991 59.0000000 996.1515069 913.0000000 980.7470619 - 705 6 12 1991 53.0000000 974.1291860 892.0000000 957.5288149 - 706 7 12 1991 54.0000000 945.8929588 865.0000000 928.4925008 - 707 8 12 1991 51.0000000 923.4448699 847.0000000 908.6182112 - 708 9 12 1991 47.0000000 900.1601970 825.0000000 884.8884986 - 709 10 12 1991 42.0000000 866.8755391 791.0000000 849.2880386 - 710 11 12 1991 40.0000000 852.6030894 785.0000000 841.8033426 - 711 12 12 1991 39.0000000 855.6675855 793.0000000 848.4225143 - 712 13 12 1991 36.0000000 848.9399341 784.0000000 838.1350417 - 713 14 12 1991 37.0000000 826.8660346 760.0000000 812.9316187 - 714 15 12 1991 32.0000000 809.1785497 746.0000000 797.8039926 - 715 16 12 1991 37.0000000 802.0597555 726.0000000 795.9157701 - 716 17 12 1991 62.0000000 922.1599541 754.0000000 895.9435705 - 717 18 12 1991 118.0000000 1010.2215297 802.0000000 986.7308762 - 718 19 12 1991 170.0000000 1197.8699228 918.0000000 1200.6692249 - 719 20 12 1991 229.0000000 1523.1478413 1170.0000000 1517.2168446 - 720 21 12 1991 448.0000000 1956.7342980 1540.0000000 2007.5430574 - 721 22 12 1991 464.0000000 2508.8691853 1920.0000000 2502.3731576 - 722 23 12 1991 675.0000000 3010.7043763 2540.0000000 3062.5816636 - 723 24 12 1991 844.0000000 3779.7825426 3460.0000000 3908.3079331 - 724 25 12 1991 569.0000000 4261.6955865 3930.0000000 4300.6955782 - 725 26 12 1991 358.0000000 4150.7619513 3740.0000000 4049.7906349 - 726 27 12 1991 279.0000000 3614.5203625 3170.0000000 3434.5721823 - 727 28 12 1991 238.0000000 3054.2181958 2670.0000000 2895.3230586 - 728 29 12 1991 201.0000000 2647.3831078 2340.0000000 2532.2408934 - 729 30 12 1991 185.0000000 2348.9754849 2090.0000000 2256.6242032 - 730 31 12 1991 165.0000000 2098.9338971 1870.0000000 2016.9645721 - 731 1 1 1992 140.0000000 1899.2705292 1700.0000000 1831.8238117 - 732 2 1 1992 126.0000000 1745.6155857 1570.0000000 1690.1631725 - 733 3 1 1992 117.0000000 1644.3423171 1490.0000000 1602.5122024 - 734 4 1 1992 114.0000000 1544.3452616 1390.0000000 1497.3909154 - 735 5 1 1992 108.0000000 1478.4784455 1340.0000000 1443.6498010 - 736 6 1 1992 108.0000000 1460.3951306 1340.0000000 1439.1629089 - 737 7 1 1992 101.0000000 1439.5908655 1320.0000000 1415.2494863 - 738 8 1 1992 97.0000000 1440.4892615 1330.0000000 1421.9169779 - 739 9 1 1992 89.0000000 1428.5147062 1290.0000000 1403.6941327 - 740 10 1 1992 111.0000000 1428.5491008 1260.0000000 1395.5650162 - 741 11 1 1992 135.0000000 1439.8462387 1290.0000000 1417.0617359 - 742 12 1 1992 171.0000000 1501.5279760 1380.0000000 1498.1791587 - 743 13 1 1992 125.0000000 1552.8603124 1430.0000000 1542.1241297 - 744 14 1 1992 111.0000000 1480.2784672 1330.0000000 1436.7607042 - 745 15 1 1992 100.0000000 1381.8894949 1240.0000000 1342.0315939 - 746 16 1 1992 87.0000000 1317.4111257 1190.0000000 1287.8288373 - 747 17 1 1992 75.0000000 1277.9097997 1160.0000000 1253.9365729 - 748 18 1 1992 79.0000000 1228.0040299 1110.0000000 1200.4092574 - 749 19 1 1992 70.0000000 1203.3175454 1090.0000000 1177.2104253 - 750 20 1 1992 72.0000000 1188.1823406 1080.0000000 1167.1279614 - 751 21 1 1992 87.0000000 1190.6727875 1090.0000000 1174.5760728 - 752 22 1 1992 79.0000000 1165.4566762 1060.0000000 1141.7882662 - 753 23 1 1992 71.0000000 1132.0287001 1030.0000000 1109.2756759 - 754 24 1 1992 66.0000000 1092.7329941 992.0000000 1068.9724043 - 755 25 1 1992 67.0000000 1064.9919919 971.0000000 1045.8542909 - 756 26 1 1992 65.0000000 1034.4297340 941.0000000 1013.9003527 - 757 27 1 1992 59.0000000 1005.8778668 916.0000000 987.0923193 - 758 28 1 1992 57.0000000 990.2650444 906.0000000 975.4566696 - 759 29 1 1992 54.0000000 974.0414469 890.0000000 958.3361726 - 760 30 1 1992 59.0000000 967.6351046 884.0000000 955.8298298 - 761 31 1 1992 57.0000000 969.6388742 879.0000000 958.8963112 - 762 1 2 1992 56.0000000 961.0452993 867.0000000 946.7798917 - 763 2 2 1992 54.0000000 943.9632726 851.0000000 928.5600002 - 764 3 2 1992 58.0000000 927.4434649 837.0000000 913.7604817 - 765 4 2 1992 63.0000000 981.0574799 839.0000000 973.1400736 - 766 5 2 1992 76.0000000 1048.0925649 873.0000000 1037.9122629 - 767 6 2 1992 250.0000000 1167.1158568 985.0000000 1170.3554166 - 768 7 2 1992 346.0000000 1456.2354658 1360.0000000 1519.1533191 - 769 8 2 1992 241.0000000 1815.4065694 1740.0000000 1881.7564413 - 770 9 2 1992 180.0000000 1798.6111589 1610.0000000 1749.4119153 - 771 10 2 1992 164.0000000 1630.3942515 1420.0000000 1559.7287480 - 772 11 2 1992 183.0000000 1530.0908685 1320.0000000 1471.8765274 - 773 12 2 1992 215.0000000 1566.9891991 1360.0000000 1533.6804993 - 774 13 2 1992 265.0000000 1667.3008118 1460.0000000 1648.6289729 - 775 14 2 1992 287.0000000 1773.9939551 1550.0000000 1743.0430203 - 776 15 2 1992 272.0000000 1872.2264959 1650.0000000 1850.9906929 - 777 16 2 1992 253.0000000 1985.8034154 1730.0000000 1952.7322200 - 778 17 2 1992 301.0000000 1955.7597105 1680.0000000 1887.9621135 - 779 18 2 1992 275.0000000 1967.4901607 1760.0000000 1937.7707639 - 780 19 2 1992 224.0000000 1972.2609952 1780.0000000 1934.6242471 - 781 20 2 1992 194.0000000 1870.1333652 1670.0000000 1807.8733839 - 782 21 2 1992 173.0000000 1714.1327079 1520.0000000 1646.5277222 - 783 22 2 1992 157.0000000 1592.7885528 1420.0000000 1539.8206981 - 784 23 2 1992 142.0000000 1524.2074760 1370.0000000 1485.4823887 - 785 24 2 1992 133.0000000 1453.9594259 1300.0000000 1412.4081922 - 786 25 2 1992 128.0000000 1400.9022946 1260.0000000 1367.4042684 - 787 26 2 1992 125.0000000 1377.5754525 1250.0000000 1352.7817380 - 788 27 2 1992 125.0000000 1354.4131149 1230.0000000 1328.7833921 - 789 28 2 1992 110.0000000 1329.5130058 1210.0000000 1305.1561135 - 790 29 2 1992 107.0000000 1297.3602838 1180.0000000 1271.8544821 - 791 1 3 1992 97.0000000 1271.0972937 1160.0000000 1248.8401527 - 792 2 3 1992 97.0000000 1233.8151446 1120.0000000 1209.0433434 - 793 3 3 1992 86.0000000 1202.1596072 1090.0000000 1178.9335996 - 794 4 3 1992 93.0000000 1182.7043458 1080.0000000 1165.0495233 - 795 5 3 1992 86.0000000 1177.2941716 1080.0000000 1162.6017860 - 796 6 3 1992 82.0000000 1166.7193509 1070.0000000 1150.3432317 - 797 7 3 1992 80.0000000 1154.0586724 1060.0000000 1138.2534299 - 798 8 3 1992 77.0000000 1133.8836295 1040.0000000 1116.3144729 - 799 9 3 1992 73.0000000 1127.0333510 1040.0000000 1114.5106148 - 800 10 3 1992 76.0000000 1101.8288178 1010.0000000 1082.8530388 - 801 11 3 1992 68.0000000 1075.4566456 987.0000000 1058.3534709 - 802 12 3 1992 70.0000000 1124.8306217 984.0000000 1096.7076609 - 803 13 3 1992 116.0000000 1219.3987761 1020.0000000 1191.0525777 - 804 14 3 1992 206.0000000 1480.4186364 1290.0000000 1505.9519364 - 805 15 3 1992 433.0000000 1805.0974740 1560.0000000 1831.3107576 - 806 16 3 1992 495.0000000 2135.7227669 1880.0000000 2155.8429071 - 807 17 3 1992 331.0000000 2528.1269594 2360.0000000 2590.5729652 - 808 18 3 1992 240.0000000 2823.2914654 2650.0000000 2848.0683132 - 809 19 3 1992 215.0000000 2689.3589134 2430.0000000 2601.8534172 - 810 20 3 1992 185.0000000 2383.5650872 2130.0000000 2281.6329644 - 811 21 3 1992 185.0000000 2151.9180931 1930.0000000 2073.1309345 - 812 22 3 1992 185.0000000 2105.9993748 1850.0000000 2066.2864266 - 813 23 3 1992 213.0000000 2256.6021041 1930.0000000 2228.8172326 - 814 24 3 1992 466.0000000 2669.4184031 2390.0000000 2733.8832220 - 815 25 3 1992 580.0000000 3147.6372717 2850.0000000 3194.5562579 - 816 26 3 1992 566.0000000 3474.7899021 3180.0000000 3489.9339825 - 817 27 3 1992 487.0000000 3463.0178737 3120.0000000 3397.2972174 - 818 28 3 1992 387.0000000 3217.2545529 2860.0000000 3109.8633550 - 819 29 3 1992 311.0000000 2899.2112370 2570.0000000 2789.0851315 - 820 30 3 1992 270.0000000 2641.0799734 2360.0000000 2553.3932412 - 821 31 3 1992 246.0000000 2456.9737565 2200.0000000 2393.4832699 - 822 1 4 1992 229.0000000 2352.1078591 2090.0000000 2293.8185161 - 823 2 4 1992 222.0000000 2281.1656222 2040.0000000 2230.5647429 - 824 3 4 1992 217.0000000 2294.5760460 2050.0000000 2278.5547872 - 825 4 4 1992 208.0000000 2323.4477270 2010.0000000 2282.1365883 - 826 5 4 1992 220.0000000 2367.3528000 2110.0000000 2353.6565023 - 827 6 4 1992 210.0000000 2632.8866111 2470.0000000 2681.2446948 - 828 7 4 1992 190.0000000 2755.1947649 2560.0000000 2744.9267718 - 829 8 4 1992 173.0000000 2674.4032548 2460.0000000 2623.3759372 - 830 9 4 1992 166.0000000 2493.5709566 2280.0000000 2426.8633974 - 831 10 4 1992 133.0000000 2291.0100170 2090.0000000 2223.8758144 - 832 11 4 1992 126.0000000 2111.6597029 1930.0000000 2053.1991634 - 833 12 4 1992 124.0000000 1981.9271544 1820.0000000 1936.8832232 - 834 13 4 1992 116.0000000 1843.2921777 1680.0000000 1792.5086697 - 835 14 4 1992 112.0000000 1752.4695470 1600.0000000 1717.7039699 - 836 15 4 1992 111.0000000 1753.2969801 1580.0000000 1731.4800024 - 837 16 4 1992 137.0000000 1742.5627958 1560.0000000 1710.3096977 - 838 17 4 1992 206.0000000 1736.1569748 1570.0000000 1715.3099987 - 839 18 4 1992 176.0000000 1744.0005914 1580.0000000 1720.4640890 - 840 19 4 1992 161.0000000 1695.1187052 1530.0000000 1661.0461215 - 841 20 4 1992 161.0000000 1629.8335310 1470.0000000 1594.9601864 - 842 21 4 1992 139.0000000 1609.6482107 1470.0000000 1589.6919732 - 843 22 4 1992 139.0000000 1603.8413712 1470.0000000 1584.9506185 - 844 23 4 1992 123.0000000 1614.0328596 1490.0000000 1600.6675811 - 845 24 4 1992 119.0000000 1606.1483302 1480.0000000 1586.7850482 - 846 25 4 1992 111.0000000 1614.9878850 1500.0000000 1603.2535259 - 847 26 4 1992 94.0000000 1654.3583969 1550.0000000 1650.2087894 - 848 27 4 1992 94.0000000 1651.4979823 1530.0000000 1633.3971719 - 849 28 4 1992 102.0000000 1674.2715269 1560.0000000 1666.7188652 - 850 29 4 1992 120.0000000 1709.7505392 1600.0000000 1703.9583527 - 851 30 4 1992 120.0000000 1768.0175620 1670.0000000 1769.6239563 - 852 1 5 1992 114.0000000 1897.9197893 1780.0000000 1917.1466666 - 853 2 5 1992 115.0000000 1976.2120205 1830.0000000 1964.5034570 - 854 3 5 1992 206.0000000 2014.6772837 1890.0000000 2012.1977869 - 855 4 5 1992 215.0000000 2005.6141004 1870.0000000 1985.8998296 - 856 5 5 1992 125.0000000 1957.3203876 1820.0000000 1931.3996960 - 857 6 5 1992 123.0000000 1879.5330257 1740.0000000 1847.3288562 - 858 7 5 1992 113.0000000 1826.1735650 1700.0000000 1803.6305387 - 859 8 5 1992 77.0000000 1782.3292233 1660.0000000 1760.2595740 - 860 9 5 1992 83.0000000 1762.4222936 1650.0000000 1747.2078303 - 861 10 5 1992 83.0000000 1762.8609323 1640.0000000 1736.7113786 - 862 11 5 1992 96.0000000 1759.6916618 1640.0000000 1735.1730678 - 863 12 5 1992 120.0000000 1764.9495837 1660.0000000 1752.3231982 - 864 13 5 1992 80.0000000 1764.8839281 1660.0000000 1749.5039399 - 865 14 5 1992 76.0000000 1754.2109883 1650.0000000 1737.2337643 - 866 15 5 1992 69.0000000 1733.7695000 1630.0000000 1715.1285626 - 867 16 5 1992 63.0000000 1711.2482955 1610.0000000 1693.1706246 - 868 17 5 1992 61.0000000 1704.3396151 1610.0000000 1691.3444193 - 869 18 5 1992 60.0000000 1717.5944851 1630.0000000 1709.6362965 - 870 19 5 1992 59.0000000 1727.8516704 1640.0000000 1718.0342331 - 871 20 5 1992 67.0000000 1728.2449897 1640.0000000 1716.5358942 - 872 21 5 1992 51.0000000 1726.4827349 1640.0000000 1715.1329154 - 873 22 5 1992 44.0000000 1747.9627302 1670.0000000 1743.7944813 - 874 23 5 1992 42.0000000 1768.6677373 1690.0000000 1762.5192524 - 875 24 5 1992 51.0000000 1749.0459229 1660.0000000 1731.8484466 - 876 25 5 1992 42.0000000 1725.4488879 1640.0000000 1710.6177261 - 877 26 5 1992 54.0000000 1724.0600337 1630.0000000 1702.5485419 - 878 27 5 1992 53.0000000 1698.0875997 1610.0000000 1679.5113758 - 879 28 5 1992 59.0000000 1681.4036623 1600.0000000 1668.1610043 - 880 29 5 1992 55.0000000 1666.0577045 1570.0000000 1643.3995556 - 881 30 5 1992 54.0000000 1626.7872001 1530.0000000 1601.9749462 - 882 31 5 1992 48.0000000 1604.5129796 1520.0000000 1591.5135718 - 883 1 6 1992 63.0000000 1582.5976118 1490.0000000 1563.9646899 - 884 2 6 1992 61.0000000 1574.3999678 1490.0000000 1562.0651692 - 885 3 6 1992 55.0000000 1637.9690233 1570.0000000 1644.8395631 - 886 4 6 1992 75.0000000 1835.5754943 1780.0000000 1872.8956091 - 887 5 6 1992 53.0000000 2212.1426230 2190.0000000 2285.8033021 - 888 6 6 1992 77.0000000 2302.9602080 2190.0000000 2287.2754540 - 889 7 6 1992 114.0000000 2314.1177752 2210.0000000 2304.2246411 - 890 8 6 1992 167.0000000 2254.0637860 2110.0000000 2205.4051472 - 891 9 6 1992 116.0000000 2234.0049412 2130.0000000 2218.7928226 - 892 10 6 1992 91.0000000 2237.3880035 2140.0000000 2224.3998870 - 893 11 6 1992 85.0000000 2182.0989687 2070.0000000 2151.7462849 - 894 12 6 1992 68.0000000 2101.2700851 1990.0000000 2069.2989885 - 895 13 6 1992 71.0000000 2010.7030770 1900.0000000 1977.0412388 - 896 14 6 1992 63.0000000 1948.9075360 1850.0000000 1924.9592553 - 897 15 6 1992 59.0000000 1857.8886099 1750.0000000 1823.0337074 - 898 16 6 1992 46.0000000 1771.0594760 1670.0000000 1741.2476955 - 899 17 6 1992 44.0000000 1696.6824890 1600.0000000 1669.5864093 - 900 18 6 1992 39.0000000 1640.1764767 1550.0000000 1618.0520292 - 901 19 6 1992 41.0000000 1603.9469739 1520.0000000 1586.6538601 - 902 20 6 1992 44.0000000 1691.3399409 1640.0000000 1705.3554279 - 903 21 6 1992 39.0000000 1808.5300182 1760.0000000 1824.0947190 - 904 22 6 1992 32.0000000 1841.0252099 1770.0000000 1832.8803831 - 905 23 6 1992 40.0000000 1714.2222443 1600.0000000 1661.9874262 - 906 24 6 1992 41.0000000 1681.3990466 1590.0000000 1654.9448324 - 907 25 6 1992 42.0000000 1780.5526436 1730.0000000 1793.6725717 - 908 26 6 1992 42.0000000 1835.4547852 1770.0000000 1830.7791273 - 909 27 6 1992 48.0000000 1934.6364876 1890.0000000 1949.4834107 - 910 28 6 1992 37.0000000 1999.0557846 1940.0000000 1998.4866436 - 911 29 6 1992 40.0000000 1885.5739638 1780.0000000 1837.5368881 - 912 30 6 1992 29.0000000 1732.5429542 1630.0000000 1687.3663371 - 913 1 7 1992 30.0000000 1636.5438897 1550.0000000 1607.5489590 - 914 2 7 1992 36.0000000 1577.3411314 1500.0000000 1555.6181673 - 915 3 7 1992 29.0000000 1542.8383036 1460.0000000 1525.7691181 - 916 4 7 1992 36.0000000 1542.8904330 1460.0000000 1532.6768485 - 917 5 7 1992 50.0000000 1600.2667119 1510.0000000 1588.1419474 - 918 6 7 1992 78.0000000 1628.2413678 1530.0000000 1609.6942508 - 919 7 7 1992 54.0000000 1675.7367491 1610.0000000 1676.7890213 - 920 8 7 1992 57.0000000 1662.0220315 1580.0000000 1642.5767369 - 921 9 7 1992 51.0000000 1630.7429718 1550.0000000 1612.1375645 - 922 10 7 1992 47.0000000 1622.7206802 1520.0000000 1595.3342723 - 923 11 7 1992 46.0000000 1679.9853935 1580.0000000 1666.3153520 - 924 12 7 1992 76.0000000 1756.3448362 1670.0000000 1756.7332934 - 925 13 7 1992 72.0000000 1849.5539462 1780.0000000 1857.0011802 - 926 14 7 1992 67.0000000 1919.9653444 1850.0000000 1921.0508719 - 927 15 7 1992 63.0000000 1940.5129632 1860.0000000 1928.7486838 - 928 16 7 1992 47.0000000 1870.4888146 1770.0000000 1836.6395775 - 929 17 7 1992 47.0000000 1770.1485907 1670.0000000 1734.7015652 - 930 18 7 1992 42.0000000 1698.6037589 1610.0000000 1672.9155170 - 931 19 7 1992 41.0000000 1674.9705610 1600.0000000 1661.2647454 - 932 20 7 1992 39.0000000 1624.3654547 1540.0000000 1599.7346558 - 933 21 7 1992 37.0000000 1557.7408580 1470.0000000 1531.7724297 - 934 22 7 1992 33.0000000 1563.8306615 1500.0000000 1560.1069037 - 935 23 7 1992 33.0000000 1682.9043200 1650.0000000 1707.3041334 - 936 24 7 1992 33.0000000 1792.7674503 1750.0000000 1806.0418174 - 937 25 7 1992 37.0000000 1821.8156797 1760.0000000 1814.8592685 - 938 26 7 1992 26.0000000 1691.5344119 1590.0000000 1643.7486362 - 939 27 7 1992 24.0000000 1574.2097728 1490.0000000 1542.7029690 - 940 28 7 1992 26.0000000 1511.5369547 1440.0000000 1491.7160902 - 941 29 7 1992 29.0000000 1444.9347171 1370.0000000 1420.7825020 - 942 30 7 1992 19.0000000 1396.9741547 1330.0000000 1379.8973030 - 943 31 7 1992 22.0000000 1374.6565387 1310.0000000 1363.0531703 - 944 1 8 1992 28.0000000 1368.8607847 1310.0000000 1360.6254494 - 945 2 8 1992 35.0000000 1381.0764272 1330.0000000 1378.2160023 - 946 3 8 1992 29.0000000 1361.5367414 1300.0000000 1347.4274589 - 947 4 8 1992 36.0000000 1315.1937524 1250.0000000 1296.6751888 - 948 5 8 1992 52.0000000 1272.0381697 1210.0000000 1255.9562457 - 949 6 8 1992 74.0000000 1254.3514856 1200.0000000 1245.2677609 - 950 7 8 1992 54.0000000 1228.1275777 1170.0000000 1214.6071628 - 951 8 8 1992 57.0000000 1197.3660584 1140.0000000 1183.9721429 - 952 9 8 1992 48.0000000 1170.9399559 1110.0000000 1156.8247303 - 953 10 8 1992 47.0000000 1146.3381555 1090.0000000 1134.1242386 - 954 11 8 1992 46.0000000 1151.4576972 1090.0000000 1141.5372285 - 955 12 8 1992 75.0000000 1140.9706656 1080.0000000 1125.3221251 - 956 13 8 1992 73.0000000 1174.9359798 1120.0000000 1164.3822370 - 957 14 8 1992 66.0000000 1217.9097389 1160.0000000 1214.9787113 - 958 15 8 1992 60.0000000 1211.4052485 1150.0000000 1196.6296229 - 959 16 8 1992 47.0000000 1177.6825788 1120.0000000 1162.3743093 - 960 17 8 1992 46.0000000 1138.9811692 1080.0000000 1121.6940133 - 961 18 8 1992 42.0000000 1105.7672005 1050.0000000 1091.0452802 - 962 19 8 1992 41.0000000 1075.5404540 1020.0000000 1060.4404171 - 963 20 8 1992 40.0000000 1091.9470835 1040.0000000 1086.7527248 - 964 21 8 1992 37.0000000 1122.4680462 1080.0000000 1121.1637150 - 965 22 8 1992 32.0000000 1092.6384116 1030.0000000 1072.0114057 - 966 23 8 1992 32.0000000 1086.8588336 1040.0000000 1080.7310896 - 967 24 8 1992 32.0000000 1109.6097572 1070.0000000 1108.9479681 - 968 25 8 1992 36.0000000 1100.1708772 1050.0000000 1088.3209839 - 969 26 8 1992 27.0000000 1063.9772433 1010.0000000 1047.7830940 - 970 27 8 1992 25.0000000 1046.3812600 1000.0000000 1037.2358061 - 971 28 8 1992 25.0000000 1032.8852298 985.0000000 1021.7781576 - 972 29 8 1992 28.0000000 1027.0735590 971.0000000 1018.0196131 - 973 30 8 1992 20.0000000 1034.0929232 968.0000000 1017.7363492 - 974 31 8 1992 22.0000000 1084.7343922 977.0000000 1072.8831967 - 975 1 9 1992 49.0000000 1137.5091112 1060.0000000 1123.8835165 - 976 2 9 1992 77.0000000 1228.4646923 1170.0000000 1226.9484708 - 977 3 9 1992 67.0000000 1333.8939906 1280.0000000 1342.0796082 - 978 4 9 1992 45.0000000 1350.2444475 1270.0000000 1332.5738631 - 979 5 9 1992 44.0000000 1324.5121783 1250.0000000 1304.6278506 - 980 6 9 1992 64.0000000 1335.9994150 1280.0000000 1329.9998963 - 981 7 9 1992 52.0000000 1386.6235490 1340.0000000 1388.2607865 - 982 8 9 1992 40.0000000 1374.9214477 1310.0000000 1356.6806343 - 983 9 9 1992 30.0000000 1311.9873067 1240.0000000 1285.2276983 - 984 10 9 1992 34.0000000 1255.5412144 1190.0000000 1233.9195135 - 985 11 9 1992 32.0000000 1212.4350402 1150.0000000 1193.6261067 - 986 12 9 1992 36.0000000 1178.7571000 1120.0000000 1162.5179788 - 987 13 9 1992 28.0000000 1146.9951883 1090.0000000 1131.1523304 - 988 14 9 1992 33.0000000 1134.1273313 1080.0000000 1123.4075844 - 989 15 9 1992 35.0000000 1117.1583303 1060.0000000 1102.2697283 - 990 16 9 1992 30.0000000 1115.6455817 1070.0000000 1109.5696744 - 991 17 9 1992 32.0000000 1124.3922143 1080.0000000 1118.6498726 - 992 18 9 1992 29.0000000 1087.3456065 1030.0000000 1068.3746370 - 993 19 9 1992 30.0000000 1052.1734173 1000.0000000 1037.7627302 - 994 20 9 1992 28.0000000 1051.4421384 1010.0000000 1046.5326658 - 995 21 9 1992 29.0000000 1014.1959466 960.0000000 995.8090701 - 996 22 9 1992 29.0000000 983.3671981 936.0000000 971.1463940 - 997 23 9 1992 27.0000000 955.4960835 908.0000000 942.5559779 - 998 24 9 1992 27.0000000 926.6849088 880.0000000 913.9243679 - 999 25 9 1992 23.0000000 915.6748377 875.0000000 908.3416980 - 1000 26 9 1992 28.0000000 889.9035009 844.0000000 876.7876124 - 1001 27 9 1992 25.0000000 875.9745684 836.0000000 868.2655204 - 1002 28 9 1992 25.0000000 857.0140921 811.0000000 847.0091047 - 1003 29 9 1992 27.0000000 842.3940080 798.0000000 832.5951556 - 1004 30 9 1992 25.0000000 860.1590791 830.0000000 861.9974302 - 1005 1 10 1992 27.0000000 872.0069648 836.0000000 867.9925506 - 1006 2 10 1992 33.0000000 864.7875469 822.0000000 857.4704956 - 1007 3 10 1992 29.0000000 869.0198494 831.0000000 864.9886425 - 1008 4 10 1992 31.0000000 882.1284775 848.0000000 881.6569683 - 1009 5 10 1992 25.0000000 897.1813990 846.0000000 888.2675986 - 1010 6 10 1992 25.0000000 929.8885015 881.0000000 925.4588068 - 1011 7 10 1992 36.0000000 925.8555136 881.0000000 916.5044476 - 1012 8 10 1992 42.0000000 915.1989645 875.0000000 907.9500382 - 1013 9 10 1992 43.0000000 899.1746448 853.0000000 889.8879428 - 1014 10 10 1992 26.0000000 890.6792467 841.0000000 883.2411002 - 1015 11 10 1992 27.0000000 868.6694873 820.0000000 856.9525950 - 1016 12 10 1992 27.0000000 849.9755841 808.0000000 841.8916396 - 1017 13 10 1992 26.0000000 851.7433267 815.0000000 848.1300361 - 1018 14 10 1992 26.0000000 837.9573258 796.0000000 828.4159138 - 1019 15 10 1992 23.0000000 841.4186062 787.0000000 832.2503751 - 1020 16 10 1992 21.0000000 838.4418970 788.0000000 828.8465623 - 1021 17 10 1992 26.0000000 829.1788109 784.0000000 825.2683651 - 1022 18 10 1992 34.0000000 821.0931485 772.0000000 810.9937281 - 1023 19 10 1992 37.0000000 823.9178664 785.0000000 821.6874977 - 1024 20 10 1992 31.0000000 882.1156165 846.0000000 883.4789111 - 1025 21 10 1992 31.0000000 884.5057161 830.0000000 870.5293640 - 1026 22 10 1992 35.0000000 871.7382905 821.0000000 860.4099803 - 1027 23 10 1992 33.0000000 922.8528596 854.0000000 921.2734004 - 1028 24 10 1992 40.0000000 1041.7477800 914.0000000 1016.2000752 - 1029 25 10 1992 74.0000000 1166.7388370 998.0000000 1150.8464094 - 1030 26 10 1992 161.0000000 1429.3084924 1310.0000000 1462.1174429 - 1031 27 10 1992 285.0000000 1886.2260060 1790.0000000 1953.3842048 - 1032 28 10 1992 244.0000000 2202.9531224 2030.0000000 2221.2886848 - 1033 29 10 1992 263.0000000 2207.2077807 1950.0000000 2143.6437692 - 1034 30 10 1992 276.0000000 2158.0972769 1960.0000000 2121.0321783 - 1035 31 10 1992 186.0000000 2309.7462502 2190.0000000 2329.1870779 - 1036 1 11 1992 154.0000000 2364.4183350 2220.0000000 2341.5261786 - 1037 2 11 1992 112.0000000 2190.8183017 1980.0000000 2101.5400138 - 1038 3 11 1992 104.0000000 1986.8576175 1780.0000000 1909.3386782 - 1039 4 11 1992 96.0000000 1847.1146846 1670.0000000 1791.4034088 - 1040 5 11 1992 99.0000000 1764.8058489 1620.0000000 1726.0265967 - 1041 6 11 1992 126.0000000 1738.2905780 1620.0000000 1713.4832361 - 1042 7 11 1992 91.0000000 1742.2827759 1640.0000000 1724.3809738 - 1043 8 11 1992 84.0000000 1711.3762703 1600.0000000 1679.2328454 - 1044 9 11 1992 81.0000000 1653.7752248 1530.0000000 1610.6964807 - 1045 10 11 1992 85.0000000 1630.6977644 1470.0000000 1592.3998019 - 1046 11 11 1992 126.0000000 1681.5669516 1440.0000000 1629.2165459 - 1047 12 11 1992 279.0000000 1798.0260088 1540.0000000 1773.1523753 - 1048 13 11 1992 390.0000000 2037.5136956 1810.0000000 2053.8646566 - 1049 14 11 1992 294.0000000 2323.8441286 2090.0000000 2347.7219229 - 1050 15 11 1992 260.0000000 2471.2602862 2080.0000000 2441.8334537 - 1051 16 11 1992 398.0000000 2632.0021790 2110.0000000 2564.3293275 - 1052 17 11 1992 520.0000000 2713.7023433 2240.0000000 2656.7930685 - 1053 18 11 1992 487.0000000 2981.0069273 2580.0000000 2991.6843799 - 1054 19 11 1992 380.0000000 3185.0028671 2730.0000000 3132.8216406 - 1055 20 11 1992 385.0000000 3079.4458556 2640.0000000 2982.7854311 - 1056 21 11 1992 351.0000000 3099.6616889 2660.0000000 3059.2049697 - 1057 22 11 1992 309.0000000 3266.4846996 2770.0000000 3199.4577811 - 1058 23 11 1992 587.0000000 3350.3580299 2960.0000000 3314.8203645 - 1059 24 11 1992 661.0000000 3701.6133699 3440.0000000 3735.5445868 - 1060 25 11 1992 447.0000000 4077.0288570 3780.0000000 4086.0744956 - 1061 26 11 1992 361.0000000 4124.9047265 3710.0000000 4031.2638551 - 1062 27 11 1992 351.0000000 3883.1451248 3440.0000000 3740.9023388 - 1063 28 11 1992 353.0000000 3683.2772314 3220.0000000 3553.3826608 - 1064 29 11 1992 369.0000000 3768.8467318 3280.0000000 3680.4696355 - 1065 30 11 1992 452.0000000 3839.7537400 3370.0000000 3745.4859322 - 1066 1 12 1992 441.0000000 3798.0564834 3400.0000000 3711.3776708 - 1067 2 12 1992 348.0000000 3836.6353186 3400.0000000 3728.7828361 - 1068 3 12 1992 394.0000000 3844.6714536 3350.0000000 3698.4755996 - 1069 4 12 1992 455.0000000 3797.3918440 3250.0000000 3643.4198887 - 1070 5 12 1992 491.0000000 3799.4090564 3240.0000000 3641.6037825 - 1071 6 12 1992 469.0000000 3705.6123486 3210.0000000 3570.3413088 - 1072 7 12 1992 364.0000000 3684.0909690 3210.0000000 3555.3368149 - 1073 8 12 1992 338.0000000 3658.6731473 3250.0000000 3554.4298327 - 1074 9 12 1992 334.0000000 3508.3011952 3130.0000000 3387.7798670 - 1075 10 12 1992 268.0000000 3354.2829532 3040.0000000 3257.9337544 - 1076 11 12 1992 236.0000000 3329.5033797 3040.0000000 3251.7430018 - 1077 12 12 1992 230.0000000 3277.0272586 2960.0000000 3177.0560478 - 1078 13 12 1992 239.0000000 3201.1643144 2920.0000000 3117.3726859 - 1079 14 12 1992 256.0000000 3113.0218214 2870.0000000 3040.8094527 - 1080 15 12 1992 217.0000000 3070.3725122 2860.0000000 3016.2953367 - 1081 16 12 1992 201.0000000 2954.6220187 2730.0000000 2878.6357812 - 1082 17 12 1992 188.0000000 2763.4908953 2530.0000000 2675.7981130 - 1083 18 12 1992 176.0000000 2560.7865991 2340.0000000 2476.7039268 - 1084 19 12 1992 170.0000000 2382.4539808 2180.0000000 2308.1365872 - 1085 20 12 1992 168.0000000 2258.2522237 2070.0000000 2194.5407196 - 1086 21 12 1992 131.0000000 2160.8663307 1970.0000000 2100.9432171 - 1087 22 12 1992 133.0000000 2100.3089692 1920.0000000 2047.3930327 - 1088 23 12 1992 134.0000000 2115.7287331 1970.0000000 2090.2511366 - 1089 24 12 1992 127.0000000 2072.7465496 1910.0000000 2025.1843493 - 1090 25 12 1992 117.0000000 1975.0170279 1810.0000000 1920.6563651 - 1091 26 12 1992 113.0000000 1845.7082965 1680.0000000 1786.5595623 - 1092 27 12 1992 100.0000000 1733.3022963 1580.0000000 1682.8404769 - 1093 28 12 1992 94.0000000 1643.7183429 1500.0000000 1599.4531932 - 1094 29 12 1992 87.0000000 1559.1749855 1420.0000000 1516.3581513 - 1095 30 12 1992 86.0000000 1505.9028747 1380.0000000 1473.5211628 - 1096 31 12 1992 81.0000000 1446.7058776 1320.0000000 1410.9125955 - 1097 1 1 1993 77.0000000 1398.6879695 1280.0000000 1368.5066958 - 1098 2 1 1993 76.0000000 1347.8094343 1230.0000000 1316.2810219 - 1099 3 1 1993 61.0000000 1294.8967771 1180.0000000 1264.2159689 - 1100 4 1 1993 61.0000000 1249.9219683 1140.0000000 1222.2943700 - 1101 5 1 1993 57.0000000 1230.5752012 1130.0000000 1210.5011588 - 1102 6 1 1993 66.0000000 1244.5697509 1130.0000000 1219.4483920 - 1103 7 1 1993 67.0000000 1281.0350999 1150.0000000 1251.5268808 - 1104 8 1 1993 84.0000000 1343.1306369 1220.0000000 1328.2289481 - 1105 9 1 1993 90.0000000 1442.8988168 1320.0000000 1424.9452857 - 1106 10 1 1993 113.0000000 1557.3204973 1380.0000000 1495.9912294 - 1107 11 1 1993 265.0000000 1790.5415679 1400.0000000 1627.6104411 - 1108 12 1 1993 559.0000000 2146.9476871 1620.0000000 1949.8549068 - 1109 13 1 1993 832.0000000 2576.5939174 2110.0000000 2448.7950662 - 1110 14 1 1993 601.0000000 2732.9651699 2270.0000000 2563.5804504 - 1111 15 1 1993 436.0000000 2656.2949598 2240.0000000 2483.6703990 - 1112 16 1 1993 339.0000000 2486.3437180 2120.0000000 2324.8907110 - 1113 17 1 1993 292.0000000 2283.7678720 1960.0000000 2134.6771017 - 1114 18 1 1993 247.0000000 2066.5435520 1770.0000000 1925.7672650 - 1115 19 1 1993 218.0000000 1897.8580568 1640.0000000 1785.2865630 - 1116 20 1 1993 205.0000000 1770.7557845 1540.0000000 1677.0014334 - 1117 21 1 1993 190.0000000 1696.6197548 1490.0000000 1619.9501024 - 1118 22 1 1993 176.0000000 1631.9155489 1430.0000000 1557.2973565 - 1119 23 1 1993 173.0000000 1605.7594848 1420.0000000 1547.6579050 - 1120 24 1 1993 173.0000000 1658.4013005 1420.0000000 1625.1850803 - 1121 25 1 1993 199.0000000 1785.0322427 1460.0000000 1726.6559164 - 1122 26 1 1993 361.0000000 1820.7240446 1550.0000000 1775.2618415 - 1123 27 1 1993 295.0000000 1965.9858191 1710.0000000 1954.0339219 - 1124 28 1 1993 238.0000000 2047.4954039 1740.0000000 1995.4413292 - 1125 29 1 1993 263.0000000 1997.2602361 1690.0000000 1925.8405977 - 1126 30 1 1993 245.0000000 2027.8529515 1790.0000000 1995.0094885 - 1127 31 1 1993 222.0000000 2142.0651519 1950.0000000 2129.0177013 - 1128 1 2 1993 199.0000000 2093.3279994 1870.0000000 2030.1720138 - 1129 2 2 1993 186.0000000 1925.5230368 1700.0000000 1845.5826621 - 1130 3 2 1993 171.0000000 1764.1111002 1560.0000000 1694.2610414 - 1131 4 2 1993 157.0000000 1675.3509360 1500.0000000 1626.8944694 - 1132 5 2 1993 159.0000000 1607.4924935 1440.0000000 1561.2456971 - 1133 6 2 1993 129.0000000 1540.7343390 1380.0000000 1496.3862735 - 1134 7 2 1993 119.0000000 1497.8765810 1350.0000000 1461.9962650 - 1135 8 2 1993 119.0000000 1439.2541786 1290.0000000 1398.0144055 - 1136 9 2 1993 105.0000000 1389.7166515 1250.0000000 1354.3909050 - 1137 10 2 1993 106.0000000 1345.2022452 1210.0000000 1311.0828872 - 1138 11 2 1993 105.0000000 1316.5154755 1190.0000000 1288.0533159 - 1139 12 2 1993 95.0000000 1277.3214990 1150.0000000 1245.2701057 - 1140 13 2 1993 91.0000000 1257.0117531 1140.0000000 1232.7053824 - 1141 14 2 1993 88.0000000 1236.1189287 1120.0000000 1210.3348664 - 1142 15 2 1993 84.0000000 1213.1856343 1100.0000000 1188.1373561 - 1143 16 2 1993 83.0000000 1175.1050942 1060.0000000 1146.0942927 - 1144 17 2 1993 79.0000000 1142.5371575 1030.0000000 1117.2401042 - 1145 18 2 1993 78.0000000 1144.7613583 1040.0000000 1127.8318109 - 1146 19 2 1993 84.0000000 1161.0035997 1060.0000000 1147.3483487 - 1147 20 2 1993 91.0000000 1211.0187554 1100.0000000 1199.1561733 - 1148 21 2 1993 91.0000000 1248.1859182 1130.0000000 1229.5839844 - 1149 22 2 1993 90.0000000 1314.5474155 1210.0000000 1308.4345468 - 1150 23 2 1993 103.0000000 1320.2362590 1200.0000000 1294.5639924 - 1151 24 2 1993 94.0000000 1282.6809324 1160.0000000 1251.4879652 - 1152 25 2 1993 81.0000000 1223.5465141 1100.0000000 1188.6982404 - 1153 26 2 1993 78.0000000 1168.0285892 1050.0000000 1136.1478238 - 1154 27 2 1993 75.0000000 1149.6804839 1040.0000000 1126.2292871 - 1155 28 2 1993 76.0000000 1138.6184488 1030.0000000 1114.5199365 - 1156 1 3 1993 80.0000000 1125.0798488 1020.0000000 1102.2211165 - 1157 2 3 1993 75.0000000 1105.7060932 1000.0000000 1081.0090520 - 1158 3 3 1993 76.0000000 1081.3724270 976.0000000 1055.7304012 - 1159 4 3 1993 72.0000000 1073.7827579 977.0000000 1054.7760704 - 1160 5 3 1993 65.0000000 1063.8763782 967.0000000 1043.0332709 - 1161 6 3 1993 64.0000000 1046.2418408 950.0000000 1024.4352529 - 1162 7 3 1993 64.0000000 1030.7106041 937.0000000 1011.0329094 - 1163 8 3 1993 68.0000000 1039.6215804 953.0000000 1026.0902823 - 1164 9 3 1993 68.0000000 1067.2904311 987.0000000 1058.9226407 - 1165 10 3 1993 67.0000000 1077.1017542 990.0000000 1062.5389401 - 1166 11 3 1993 61.0000000 1054.8310470 959.0000000 1032.7868311 - 1167 12 3 1993 57.0000000 1054.7211742 967.0000000 1041.5522524 - 1168 13 3 1993 58.0000000 1054.8343232 967.0000000 1039.8185574 - 1169 14 3 1993 54.0000000 1077.5225143 999.0000000 1070.2710286 - 1170 15 3 1993 66.0000000 1099.2700981 1020.0000000 1089.8623603 - 1171 16 3 1993 54.0000000 1110.2237951 1030.0000000 1098.5979066 - 1172 17 3 1993 57.0000000 1103.3510000 1020.0000000 1087.4573754 - 1173 18 3 1993 57.0000000 1115.2336513 1040.0000000 1106.4471637 - 1174 19 3 1993 52.0000000 1157.0347949 1090.0000000 1155.3342215 - 1175 20 3 1993 57.0000000 1221.1808123 1160.0000000 1224.2847642 - 1176 21 3 1993 58.0000000 1252.4482471 1180.0000000 1244.8420111 - 1177 22 3 1993 57.0000000 1257.6101707 1160.0000000 1242.4991723 - 1178 23 3 1993 56.0000000 1211.1457407 1100.0000000 1178.9303865 - 1179 24 3 1993 63.0000000 1179.8019793 1090.0000000 1163.0022694 - 1180 25 3 1993 76.0000000 1221.6823745 1150.0000000 1221.2696319 - 1181 26 3 1993 56.0000000 1271.9891985 1200.0000000 1269.6514186 - 1182 27 3 1993 59.0000000 1289.2808201 1210.0000000 1278.1363896 - 1183 28 3 1993 59.0000000 1266.6886089 1180.0000000 1246.7145640 - 1184 29 3 1993 54.0000000 1227.3453495 1140.0000000 1205.3770627 - 1185 30 3 1993 48.0000000 1178.0970472 1090.0000000 1154.1159740 - 1186 31 3 1993 55.0000000 1134.3641456 1050.0000000 1112.9242372 - 1187 1 4 1993 48.0000000 1126.1944525 1050.0000000 1115.0134787 - 1188 2 4 1993 53.0000000 1121.2862083 1040.0000000 1107.2680357 - 1189 3 4 1993 47.0000000 1124.6425915 1050.0000000 1114.7329926 - 1190 4 4 1993 59.0000000 1149.8784961 1070.0000000 1139.2526582 - 1191 5 4 1993 53.0000000 1190.3132779 1090.0000000 1174.5399984 - 1192 6 4 1993 64.0000000 1184.1599747 1080.0000000 1159.9122418 - 1193 7 4 1993 63.0000000 1164.7842183 1070.0000000 1145.4982284 - 1194 8 4 1993 75.0000000 1214.4045289 1140.0000000 1213.7989598 - 1195 9 4 1993 64.0000000 1381.6805084 1340.0000000 1411.5297380 - 1196 10 4 1993 59.0000000 1537.6853929 1480.0000000 1555.5406177 - 1197 11 4 1993 60.0000000 1598.5792340 1510.0000000 1589.1773498 - 1198 12 4 1993 63.0000000 1580.3598818 1480.0000000 1556.8315845 - 1199 13 4 1993 69.0000000 1602.7189448 1520.0000000 1596.3885082 - 1200 14 4 1993 79.0000000 1640.8849772 1560.0000000 1634.4715088 - 1201 15 4 1993 82.0000000 1647.4782772 1560.0000000 1632.3487843 - 1202 16 4 1993 68.0000000 1591.6955408 1490.0000000 1561.0702160 - 1203 17 4 1993 56.0000000 1511.5784325 1410.0000000 1479.1571462 - 1204 18 4 1993 59.0000000 1429.4939903 1330.0000000 1397.5181384 - 1205 19 4 1993 61.0000000 1378.2658863 1290.0000000 1355.8664014 - 1206 20 4 1993 62.0000000 1374.8658128 1300.0000000 1364.3066392 - 1207 21 4 1993 57.0000000 1375.3134826 1300.0000000 1362.8494796 - 1208 22 4 1993 53.0000000 1350.4557577 1270.0000000 1331.4848822 - 1209 23 4 1993 47.0000000 1303.4223901 1220.0000000 1280.2039263 - 1210 24 4 1993 46.0000000 1259.6306257 1180.0000000 1238.9986728 - 1211 25 4 1993 47.0000000 1233.6433505 1160.0000000 1217.8620443 - 1212 26 4 1993 45.0000000 1204.5934007 1130.0000000 1186.7877216 - 1213 27 4 1993 43.0000000 1173.3318899 1100.0000000 1155.7700548 - 1214 28 4 1993 41.0000000 1157.6059434 1090.0000000 1144.8674655 - 1215 29 4 1993 38.0000000 1161.9784707 1100.0000000 1154.0054406 - 1216 30 4 1993 39.0000000 1140.3961567 1070.0000000 1123.1331652 - 1217 1 5 1993 40.0000000 1140.9483985 1080.0000000 1133.2271039 - 1218 2 5 1993 41.0000000 1259.9610230 1230.0000000 1284.4051462 - 1219 3 5 1993 45.0000000 1223.2281466 1140.0000000 1192.7039675 - 1220 4 5 1993 49.0000000 1193.2932012 1130.0000000 1181.3512896 - 1221 5 5 1993 40.0000000 1205.5332191 1150.0000000 1200.6643488 - 1222 6 5 1993 43.0000000 1217.0086290 1160.0000000 1209.9440950 - 1223 7 5 1993 38.0000000 1211.2982048 1150.0000000 1199.1494593 - 1224 8 5 1993 38.0000000 1240.0413963 1190.0000000 1238.5144231 - 1225 9 5 1993 43.0000000 1225.5858363 1160.0000000 1209.6144158 - 1226 10 5 1993 44.0000000 1186.8801856 1120.0000000 1168.5197265 - 1227 11 5 1993 41.0000000 1178.3504083 1120.0000000 1167.9583301 - 1228 12 5 1993 51.0000000 1164.6635544 1090.0000000 1142.1371703 - 1229 13 5 1993 63.0000000 1234.0564417 1140.0000000 1203.4407643 - 1230 14 5 1993 68.0000000 1271.7720616 1210.0000000 1263.7818424 - 1231 15 5 1993 77.0000000 1292.0156733 1230.0000000 1280.3907232 - 1232 16 5 1993 77.0000000 1287.1125667 1220.0000000 1269.4718993 - 1233 17 5 1993 59.0000000 1267.6429894 1200.0000000 1248.5294977 - 1234 18 5 1993 49.0000000 1230.6352374 1160.0000000 1207.6395096 - 1235 19 5 1993 43.0000000 1212.7269553 1140.0000000 1189.5701640 - 1236 20 5 1993 44.0000000 1246.9234062 1180.0000000 1240.7538963 - 1237 21 5 1993 48.0000000 1266.6102428 1200.0000000 1254.6429304 - 1238 22 5 1993 44.0000000 1278.7625550 1220.0000000 1269.6400265 - 1239 23 5 1993 46.0000000 1389.6605562 1360.0000000 1408.5988920 - 1240 24 5 1993 40.0000000 1474.1077325 1430.0000000 1477.6210201 - 1241 25 5 1993 43.0000000 1396.0918354 1310.0000000 1356.7002528 - 1242 26 5 1993 30.0000000 1322.6362377 1250.0000000 1296.5342079 - 1243 27 5 1993 45.0000000 1289.4214211 1210.0000000 1268.5676967 - 1244 28 5 1993 43.0000000 1275.9632184 1200.0000000 1258.4633107 - 1245 29 5 1993 44.0000000 1294.6823507 1240.0000000 1291.3038945 - 1246 30 5 1993 54.0000000 1346.0870980 1290.0000000 1345.8419373 - 1247 31 5 1993 56.0000000 1371.5750008 1310.0000000 1361.8332072 - 1248 1 6 1993 44.0000000 1339.0229988 1270.0000000 1318.6070866 - 1249 2 6 1993 43.0000000 1294.8405030 1220.0000000 1271.6463174 - 1250 3 6 1993 33.0000000 1303.0217728 1240.0000000 1295.0272262 - 1251 4 6 1993 45.0000000 1339.5373370 1290.0000000 1339.7355807 - 1252 5 6 1993 46.0000000 1410.1243317 1370.0000000 1417.7776297 - 1253 6 6 1993 42.0000000 1419.2113161 1360.0000000 1406.6663255 - 1254 7 6 1993 40.0000000 1384.6918151 1320.0000000 1365.6287128 - 1255 8 6 1993 30.0000000 1343.4105581 1280.0000000 1324.6573670 - 1256 9 6 1993 31.0000000 1310.7983229 1250.0000000 1294.7237414 - 1257 10 6 1993 32.0000000 1280.0143399 1220.0000000 1264.1377974 - 1258 11 6 1993 25.0000000 1250.3918664 1190.0000000 1235.2848687 - 1259 12 6 1993 33.0000000 1260.1408685 1210.0000000 1255.7016046 - 1260 13 6 1993 29.0000000 1293.2562332 1250.0000000 1293.9453141 - 1261 14 6 1993 40.0000000 1359.5265105 1320.0000000 1367.2049368 - 1262 15 6 1993 42.0000000 1399.5175915 1350.0000000 1396.8168295 - 1263 16 6 1993 37.0000000 1411.2766560 1360.0000000 1405.3371435 - 1264 17 6 1993 46.0000000 1419.3677067 1370.0000000 1413.4234914 - 1265 18 6 1993 47.0000000 1450.7396136 1410.0000000 1451.8785077 - 1266 19 6 1993 50.0000000 1478.7853690 1430.0000000 1476.6168358 - 1267 20 6 1993 43.0000000 1565.5412034 1500.0000000 1573.8207398 - 1268 21 6 1993 69.0000000 1548.0277462 1470.0000000 1524.8043318 - 1269 22 6 1993 61.0000000 1557.7623897 1480.0000000 1562.4784375 - 1270 23 6 1993 67.0000000 1599.7014403 1520.0000000 1593.3200355 - 1271 24 6 1993 77.0000000 1674.3583447 1630.0000000 1691.1037594 - 1272 25 6 1993 87.0000000 1835.5239110 1810.0000000 1868.5123935 - 1273 26 6 1993 55.0000000 1966.8654342 1930.0000000 1986.3646769 - 1274 27 6 1993 43.0000000 1961.2626410 1890.0000000 1944.4025061 - 1275 28 6 1993 40.0000000 1849.8420752 1760.0000000 1812.6050105 - 1276 29 6 1993 30.0000000 1710.2986345 1620.0000000 1670.9539947 - 1277 30 6 1993 40.0000000 1622.6227358 1550.0000000 1599.4466351 - 1278 1 7 1993 40.0000000 1577.2969599 1510.0000000 1561.9852802 - 1279 2 7 1993 27.0000000 1528.5698382 1460.0000000 1509.7832101 - 1280 3 7 1993 34.0000000 1483.0420936 1420.0000000 1467.1181138 - 1281 4 7 1993 30.0000000 1449.3588667 1390.0000000 1435.8543300 - 1282 5 7 1993 31.0000000 1418.3618241 1360.0000000 1404.6866976 - 1283 6 7 1993 27.0000000 1394.6305848 1340.0000000 1383.6042220 - 1284 7 7 1993 31.0000000 1404.3582240 1360.0000000 1402.5886134 - 1285 8 7 1993 26.0000000 1562.1624681 1560.0000000 1601.6390620 - 1286 9 7 1993 23.0000000 1701.5078299 1680.0000000 1723.0927794 - 1287 10 7 1993 24.0000000 1620.8988461 1540.0000000 1582.9041510 - 1288 11 7 1993 25.0000000 1532.0117087 1460.0000000 1510.6253966 - 1289 12 7 1993 34.0000000 1523.7637853 1460.0000000 1517.0423597 - 1290 13 7 1993 40.0000000 1759.7515002 1770.0000000 1820.3291255 - 1291 14 7 1993 41.0000000 2114.8768150 2110.0000000 2172.8900592 - 1292 15 7 1993 46.0000000 2247.5984771 2200.0000000 2252.5392952 - 1293 16 7 1993 39.0000000 2223.6496810 2160.0000000 2207.0901278 - 1294 17 7 1993 43.0000000 2144.3707164 2070.0000000 2116.7587953 - 1295 18 7 1993 35.0000000 2145.8813409 2100.0000000 2145.7344895 - 1296 19 7 1993 49.0000000 2190.3022291 2120.0000000 2177.6525124 - 1297 20 7 1993 38.0000000 2207.5102158 2140.0000000 2193.6322056 - 1298 21 7 1993 41.0000000 2231.4490867 2170.0000000 2228.7784158 - 1299 22 7 1993 45.0000000 2248.9403208 2190.0000000 2242.4118095 - 1300 23 7 1993 41.0000000 2207.7674235 2140.0000000 2187.7763106 - 1301 24 7 1993 42.0000000 2202.4741602 2150.0000000 2196.4856493 - 1302 25 7 1993 40.0000000 2172.8023549 2110.0000000 2155.3181945 - 1303 26 7 1993 35.0000000 2131.1651205 2070.0000000 2114.1480510 - 1304 27 7 1993 40.0000000 2095.5538947 2000.0000000 2052.9459338 - 1305 28 7 1993 40.0000000 2044.5280154 1970.0000000 2016.9884285 - 1306 29 7 1993 36.0000000 2040.5870075 1990.0000000 2033.3821042 - 1307 30 7 1993 40.0000000 2128.6849768 2020.0000000 2111.6949813 - 1308 31 7 1993 61.0000000 2070.3766240 1960.0000000 2024.9232875 - 1309 1 8 1993 36.0000000 1952.3796524 1860.0000000 1913.5925725 - 1310 2 8 1993 46.0000000 1918.6119653 1850.0000000 1901.4974458 - 1311 3 8 1993 32.0000000 1913.4443250 1850.0000000 1899.5946958 - 1312 4 8 1993 38.0000000 1802.8656430 1710.0000000 1757.9090809 - 1313 5 8 1993 32.0000000 1706.8950681 1630.0000000 1676.4246106 - 1314 6 8 1993 25.0000000 1678.7285203 1620.0000000 1664.9354567 - 1315 7 8 1993 26.0000000 1674.4780167 1620.0000000 1663.5971959 - 1316 8 8 1993 29.0000000 1603.2510717 1530.0000000 1572.3638401 - 1317 9 8 1993 29.0000000 1569.7318114 1500.0000000 1553.9468613 - 1318 10 8 1993 28.0000000 1539.9164196 1470.0000000 1520.3994867 - 1319 11 8 1993 37.0000000 1548.5370141 1500.0000000 1544.9994412 - 1320 12 8 1993 40.0000000 1613.0188475 1580.0000000 1622.0766192 - 1321 13 8 1993 49.0000000 1683.7578324 1650.0000000 1690.9360753 - 1322 14 8 1993 32.0000000 1633.1443935 1560.0000000 1603.5058702 - 1323 15 8 1993 37.0000000 1540.1363106 1470.0000000 1510.7069330 - 1324 16 8 1993 37.0000000 1478.5757703 1420.0000000 1458.9840756 - 1325 17 8 1993 27.0000000 1419.6115512 1360.0000000 1398.0474613 - 1326 18 8 1993 24.0000000 1366.1671170 1310.0000000 1347.1742093 - 1327 19 8 1993 24.0000000 1330.5183106 1280.0000000 1316.3579210 - 1328 20 8 1993 22.0000000 1284.0835297 1230.0000000 1265.5929353 - 1329 21 8 1993 21.0000000 1256.2875060 1210.0000000 1244.8742349 - 1330 22 8 1993 16.0000000 1214.9430232 1160.0000000 1197.9448241 - 1331 23 8 1993 21.0000000 1183.4512538 1130.0000000 1170.0488773 - 1332 24 8 1993 27.0000000 1164.9514312 1120.0000000 1155.7290194 - 1333 25 8 1993 26.0000000 1221.7573507 1200.0000000 1233.8742243 - 1334 26 8 1993 23.0000000 1277.8435680 1250.0000000 1283.2768445 - 1335 27 8 1993 21.0000000 1292.8519078 1250.0000000 1288.9353755 - 1336 28 8 1993 28.0000000 1270.4254774 1220.0000000 1256.2348474 - 1337 29 8 1993 17.0000000 1281.7481894 1250.0000000 1282.9839048 - 1338 30 8 1993 24.0000000 1465.3122978 1480.0000000 1512.3767078 - 1339 31 8 1993 25.0000000 1632.9048082 1630.0000000 1661.8008373 - 1340 1 9 1993 25.0000000 1589.3830925 1530.0000000 1561.2535569 - 1341 2 9 1993 19.0000000 1488.7602245 1430.0000000 1460.7324071 - 1342 3 9 1993 17.0000000 1431.4313923 1380.0000000 1416.9557151 - 1343 4 9 1993 16.0000000 1416.0256711 1370.0000000 1407.2347862 - 1344 5 9 1993 19.0000000 1414.3785636 1380.0000000 1411.6631442 - 1345 6 9 1993 23.0000000 1430.9923350 1400.0000000 1430.7078923 - 1346 7 9 1993 25.0000000 1491.4787277 1440.0000000 1484.1271652 - 1347 8 9 1993 34.0000000 1469.1630522 1410.0000000 1450.4307466 - 1348 9 9 1993 31.0000000 1453.4606499 1380.0000000 1443.4070596 - 1349 10 9 1993 35.0000000 1472.5836084 1380.0000000 1445.2788782 - 1350 11 9 1993 53.0000000 1562.7882619 1460.0000000 1559.0501725 - 1351 12 9 1993 71.0000000 1680.5867786 1590.0000000 1680.0851098 - 1352 13 9 1993 74.0000000 1815.2624296 1680.0000000 1807.9588077 - 1353 14 9 1993 87.0000000 1836.9409959 1660.0000000 1782.8009754 - 1354 15 9 1993 173.0000000 1823.9518041 1660.0000000 1768.5285210 - 1355 16 9 1993 117.0000000 1870.6373827 1760.0000000 1855.8243707 - 1356 17 9 1993 93.0000000 1923.3636984 1820.0000000 1906.9241743 - 1357 18 9 1993 77.0000000 1873.9613929 1750.0000000 1830.6729916 - 1358 19 9 1993 62.0000000 1796.0980927 1680.0000000 1755.3013248 - 1359 20 9 1993 54.0000000 1688.6036009 1570.0000000 1640.8329006 - 1360 21 9 1993 48.0000000 1599.7750759 1490.0000000 1557.8729522 - 1361 22 9 1993 46.0000000 1573.9846144 1450.0000000 1537.6359281 - 1362 23 9 1993 55.0000000 1539.9691325 1410.0000000 1496.3535809 - 1363 24 9 1993 66.0000000 1503.8673280 1370.0000000 1457.4322479 - 1364 25 9 1993 64.0000000 1499.1531544 1380.0000000 1466.5546796 - 1365 26 9 1993 52.0000000 1519.7524777 1420.0000000 1498.2403664 - 1366 27 9 1993 68.0000000 1467.5660417 1350.0000000 1426.6572172 - 1367 28 9 1993 69.0000000 1455.0865293 1350.0000000 1433.6237838 - 1368 29 9 1993 62.0000000 1482.7291192 1390.0000000 1467.8047362 - 1369 30 9 1993 76.0000000 1517.8576838 1430.0000000 1508.9343541 - 1370 1 10 1993 72.0000000 1558.9073506 1440.0000000 1539.4083425 - 1371 2 10 1993 68.0000000 1585.0997361 1470.0000000 1568.4807353 - 1372 3 10 1993 72.0000000 1649.3348665 1550.0000000 1649.2714082 - 1373 4 10 1993 78.0000000 1851.6237187 1780.0000000 1878.6763239 - 1374 5 10 1993 116.0000000 2124.9179930 1970.0000000 2117.1121926 - 1375 6 10 1993 131.0000000 2198.7800212 1990.0000000 2150.7814056 - 1376 7 10 1993 180.0000000 2094.2955947 1880.0000000 2028.2110405 - 1377 8 10 1993 203.0000000 2007.1087030 1800.0000000 1960.2370613 - 1378 9 10 1993 164.0000000 1975.1138127 1770.0000000 1930.5435776 - 1379 10 10 1993 178.0000000 2032.6998194 1830.0000000 2022.3996470 - 1380 11 10 1993 161.0000000 2239.9859790 2030.0000000 2240.0569674 - 1381 12 10 1993 287.0000000 2450.6710212 2240.0000000 2473.8611702 - 1382 13 10 1993 360.0000000 2594.9509837 2270.0000000 2553.4616706 - 1383 14 10 1993 374.0000000 2558.4975545 2210.0000000 2474.9672727 - 1384 15 10 1993 297.0000000 2496.5192136 2200.0000000 2437.7757288 - 1385 16 10 1993 247.0000000 2476.1292948 2170.0000000 2426.5819055 - 1386 17 10 1993 273.0000000 2496.7025330 2200.0000000 2454.3616999 - 1387 18 10 1993 261.0000000 2492.7637054 2230.0000000 2455.5691296 - 1388 19 10 1993 265.0000000 2430.3748363 2180.0000000 2377.0216840 - 1389 20 10 1993 230.0000000 2338.6650310 2120.0000000 2286.8560033 - 1390 21 10 1993 199.0000000 2240.4378343 2040.0000000 2186.2965904 - 1391 22 10 1993 173.0000000 2179.1820747 1990.0000000 2139.0838998 - 1392 23 10 1993 182.0000000 2173.8310225 1970.0000000 2140.8723074 - 1393 24 10 1993 203.0000000 2204.2760696 2010.0000000 2176.7697047 - 1394 25 10 1993 213.0000000 2271.7506851 2120.0000000 2263.9808579 - 1395 26 10 1993 180.0000000 2260.4061561 2100.0000000 2226.5819873 - 1396 27 10 1993 154.0000000 2148.9878412 1980.0000000 2095.4751981 - 1397 28 10 1993 118.0000000 2004.3807046 1840.0000000 1948.6160274 - 1398 29 10 1993 112.0000000 1895.4769427 1750.0000000 1852.7975764 - 1399 30 10 1993 98.0000000 1806.5335692 1670.0000000 1767.6058365 - 1400 31 10 1993 97.0000000 1743.7272766 1620.0000000 1712.9578122 - 1401 1 11 1993 91.0000000 1665.2486514 1540.0000000 1628.7830253 - 1402 2 11 1993 85.0000000 1595.8805467 1480.0000000 1565.0213590 - 1403 3 11 1993 75.0000000 1539.2677424 1430.0000000 1511.6213540 - 1404 4 11 1993 76.0000000 1477.6378643 1370.0000000 1448.5388145 - 1405 5 11 1993 78.0000000 1437.2292247 1340.0000000 1415.7356626 - 1406 6 11 1993 72.0000000 1388.5959881 1290.0000000 1363.2622884 - 1407 7 11 1993 76.0000000 1368.9057802 1280.0000000 1351.4400942 - 1408 8 11 1993 69.0000000 1364.6324464 1280.0000000 1350.4151204 - 1409 9 11 1993 66.0000000 1431.6128660 1370.0000000 1438.6431280 - 1410 10 11 1993 71.0000000 1482.8589674 1410.0000000 1479.0614062 - 1411 11 11 1993 64.0000000 1440.8435123 1330.0000000 1411.7115491 - 1412 12 11 1993 67.0000000 1410.6259036 1310.0000000 1390.6009792 - 1413 13 11 1993 80.0000000 1397.6302211 1300.0000000 1377.0196220 - 1414 14 11 1993 78.0000000 1441.5696501 1320.0000000 1421.7597141 - 1415 15 11 1993 80.0000000 1488.9684837 1370.0000000 1474.0504398 - 1416 16 11 1993 86.0000000 1483.3191840 1360.0000000 1456.7736401 - 1417 17 11 1993 125.0000000 1533.3450600 1440.0000000 1530.8140188 - 1418 18 11 1993 96.0000000 1584.9209047 1490.0000000 1576.8823672 - 1419 19 11 1993 82.0000000 1537.5854924 1420.0000000 1503.3223129 - 1420 20 11 1993 77.0000000 1455.5734826 1340.0000000 1420.0952049 - 1421 21 11 1993 67.0000000 1394.8264681 1290.0000000 1367.1613207 - 1422 22 11 1993 71.0000000 1341.2931693 1240.0000000 1314.4862677 - 1423 23 11 1993 61.0000000 1288.0755698 1190.0000000 1262.0402296 - 1424 24 11 1993 42.0000000 1265.9960371 1180.0000000 1249.7980580 - 1425 25 11 1993 63.0000000 1245.9553373 1160.0000000 1228.5946781 - 1426 26 11 1993 57.0000000 1217.0763175 1130.0000000 1197.2670087 - 1427 27 11 1993 58.0000000 1184.2324054 1100.0000000 1165.1629353 - 1428 28 11 1993 49.0000000 1167.4994214 1090.0000000 1153.4724455 - 1429 29 11 1993 50.0000000 1132.3541430 1050.0000000 1111.9017129 - 1430 30 11 1993 55.0000000 1098.2117506 1020.0000000 1080.4385440 - 1431 1 12 1993 54.0000000 1089.6281150 1020.0000000 1079.0721547 - 1432 2 12 1993 54.0000000 1057.5212225 971.0000000 1033.5076782 - 1433 3 12 1993 50.0000000 1050.1486824 978.0000000 1039.7880995 - 1434 4 12 1993 51.0000000 1044.7649334 968.0000000 1028.7728810 - 1435 5 12 1993 62.0000000 1026.8577107 952.0000000 1010.8586917 - 1436 6 12 1993 62.0000000 1021.7264941 953.0000000 1010.4623633 - 1437 7 12 1993 71.0000000 1039.7291974 930.0000000 1010.3480740 - 1438 8 12 1993 79.0000000 1108.2069929 945.0000000 1076.4753402 - 1439 9 12 1993 153.0000000 1192.8723224 1030.0000000 1167.8287172 - 1440 10 12 1993 291.0000000 1447.3213651 1250.0000000 1451.2979347 - 1441 11 12 1993 332.0000000 1823.4207784 1560.0000000 1821.0451219 - 1442 12 12 1993 465.0000000 2112.3612342 1770.0000000 2054.0409757 - 1443 13 12 1993 518.0000000 2391.1535909 1980.0000000 2315.1498302 - 1444 14 12 1993 539.0000000 2698.6421859 2280.0000000 2631.1347342 - 1445 15 12 1993 559.0000000 2870.4708751 2420.0000000 2786.2845901 - 1446 16 12 1993 500.0000000 2981.4033501 2430.0000000 2841.1500330 - 1447 17 12 1993 526.0000000 2969.3686657 2370.0000000 2815.9641406 - 1448 18 12 1993 583.0000000 3016.2518541 2440.0000000 2871.1541810 - 1449 19 12 1993 677.0000000 3390.5075581 2810.0000000 3306.8017319 - 1450 20 12 1993 781.0000000 4016.5310038 3090.0000000 3785.9911384 - 1451 21 12 1993 1180.0000000 5142.5065270 4300.0000000 5055.6453441 - 1452 22 12 1993 1460.0000000 6520.3151634 5750.0000000 6509.5460724 - 1453 23 12 1993 1600.0000000 7341.4626590 6310.0000000 7135.4076294 - 1454 24 12 1993 1410.0000000 7221.8675460 5990.0000000 6818.6299440 - 1455 25 12 1993 1230.0000000 6599.8006184 5500.0000000 6198.8455711 - 1456 26 12 1993 1070.0000000 6003.2707571 5110.0000000 5682.8908836 - 1457 27 12 1993 746.0000000 5310.6956070 4510.0000000 4983.9119141 - 1458 28 12 1993 542.0000000 4533.4675706 3810.0000000 4210.2929164 - 1459 29 12 1993 492.0000000 3931.1979172 3260.0000000 3647.7573438 - 1460 30 12 1993 491.0000000 3598.2476435 2900.0000000 3335.9888763 - 1461 31 12 1993 617.0000000 3630.7846165 2790.0000000 3444.3340301 + 1 1 7 1990 79.0000000 1836.2768423 1740.0000000 1801.4250230 + 2 2 7 1990 92.0000000 1914.2356236 1870.0000000 1925.9677274 + 3 3 7 1990 72.0000000 2074.7580805 2030.0000000 2099.0251957 + 4 4 7 1990 58.0000000 2142.5614690 2050.0000000 2130.1927080 + 5 5 7 1990 69.0000000 2167.3773736 2040.0000000 2135.6998890 + 6 6 7 1990 94.0000000 2217.0071054 2130.0000000 2210.8253406 + 7 7 7 1990 199.0000000 2320.7654572 2240.0000000 2325.4767847 + 8 8 7 1990 133.0000000 2413.2556800 2330.0000000 2409.9507042 + 9 9 7 1990 124.0000000 2473.9474865 2400.0000000 2471.5475120 + 10 10 7 1990 123.0000000 2453.9013518 2360.0000000 2427.5319663 + 11 11 7 1990 99.0000000 2371.1409833 2270.0000000 2334.3930260 + 12 12 7 1990 88.0000000 2362.3673874 2290.0000000 2351.6157454 + 13 13 7 1990 84.0000000 2294.2201854 2200.0000000 2259.0982728 + 14 14 7 1990 72.0000000 2201.2415539 2110.0000000 2166.8100282 + 15 15 7 1990 55.0000000 2100.8192510 2010.0000000 2064.7245123 + 16 16 7 1990 65.0000000 1998.3512438 1910.0000000 1962.8186965 + 17 17 7 1990 50.0000000 1903.8102659 1820.0000000 1871.0725138 + 18 18 7 1990 50.0000000 1819.4578887 1740.0000000 1789.4684330 + 19 19 7 1990 46.0000000 1760.7026970 1690.0000000 1737.9911007 + 20 20 7 1990 44.0000000 1701.2384975 1630.0000000 1676.6270395 + 21 21 7 1990 42.0000000 1647.3373589 1580.0000000 1625.3643924 + 22 22 7 1990 37.0000000 1564.9825626 1490.0000000 1534.1927067 + 23 23 7 1990 38.0000000 1504.4524513 1440.0000000 1483.1027484 + 24 24 7 1990 44.0000000 1468.5894064 1410.0000000 1452.0863449 + 25 25 7 1990 30.0000000 1429.6690976 1370.0000000 1411.1362502 + 26 26 7 1990 26.0000000 1380.8269712 1320.0000000 1360.2460281 + 27 27 7 1990 31.0000000 1329.7700937 1270.0000000 1309.4099526 + 28 28 7 1990 33.0000000 1298.5770288 1240.0000000 1279.0568386 + 29 29 7 1990 42.0000000 1257.3905760 1200.0000000 1238.0121163 + 30 30 7 1990 36.0000000 1215.1746232 1160.0000000 1197.3002216 + 31 31 7 1990 34.0000000 1205.1576403 1160.0000000 1196.6249090 + 32 1 8 1990 25.0000000 1281.4760560 1260.0000000 1295.9841245 + 33 2 8 1990 22.0000000 1295.8294922 1250.0000000 1285.3748265 + 34 3 8 1990 28.0000000 1238.7955223 1180.0000000 1214.7942846 + 35 4 8 1990 25.0000000 1183.5147085 1130.0000000 1164.2400449 + 36 5 8 1990 19.0000000 1140.6418278 1090.0000000 1123.8108172 + 37 6 8 1990 22.0000000 1099.9348832 1050.0000000 1083.2273249 + 38 7 8 1990 19.0000000 1090.1687737 1050.0000000 1082.7395884 + 39 8 8 1990 22.0000000 1089.5725404 1050.0000000 1082.2692519 + 40 9 8 1990 19.0000000 1081.2848911 1040.0000000 1071.8162452 + 41 10 8 1990 20.0000000 1078.4479950 1040.0000000 1071.3792362 + 42 11 8 1990 19.0000000 1047.0575003 1000.0000000 1030.9570185 + 43 12 8 1990 19.0000000 1032.0023421 993.0000000 1023.5484985 + 44 13 8 1990 22.0000000 1014.2295275 963.0000000 999.8280468 + 45 14 8 1990 36.0000000 1021.6104362 956.0000000 1008.5835134 + 46 15 8 1990 31.0000000 1035.2575893 988.0000000 1024.3289702 + 47 16 8 1990 30.0000000 1078.5902593 1040.0000000 1079.1295999 + 48 17 8 1990 28.0000000 1108.2546461 1070.0000000 1104.1581140 + 49 18 8 1990 34.0000000 1108.2653307 1070.0000000 1100.8855937 + 50 19 8 1990 21.0000000 1076.7302418 1030.0000000 1060.3720016 + 51 20 8 1990 30.0000000 1059.2326474 1020.0000000 1049.8829080 + 52 21 8 1990 22.0000000 1048.6224979 1010.0000000 1039.4161116 + 53 22 8 1990 21.0000000 1053.4703043 1020.0000000 1048.9696478 + 54 23 8 1990 23.0000000 1015.8553669 969.0000000 997.5417599 + 55 24 8 1990 20.0000000 977.4386699 935.0000000 963.1308752 + 56 25 8 1990 29.0000000 960.6835125 924.0000000 951.7426832 + 57 26 8 1990 20.0000000 963.3960398 930.0000000 958.6403545 + 58 27 8 1990 22.0000000 961.0070356 924.0000000 953.3630407 + 59 28 8 1990 23.0000000 978.4093797 951.0000000 978.3679242 + 60 29 8 1990 35.0000000 985.9028347 954.0000000 980.5570182 + 61 30 8 1990 51.0000000 1072.0108860 947.0000000 1040.9184559 + 62 31 8 1990 80.0000000 1071.9765332 958.0000000 1014.4542438 + 63 1 9 1990 56.0000000 1041.6608965 995.0000000 1031.2963904 + 64 2 9 1990 33.0000000 1076.2431399 1040.0000000 1073.7334606 + 65 3 9 1990 27.0000000 1108.1655150 1070.0000000 1103.0443464 + 66 4 9 1990 27.0000000 1102.6055626 1050.0000000 1088.0132724 + 67 5 9 1990 28.0000000 1089.2757453 1040.0000000 1074.9390215 + 68 6 9 1990 26.0000000 1059.2744899 1010.0000000 1042.1616571 + 69 7 9 1990 24.0000000 1043.8003326 991.0000000 1025.5274927 + 70 8 9 1990 33.0000000 1050.0280443 1010.0000000 1042.4078441 + 71 9 9 1990 26.0000000 1050.1364318 1010.0000000 1040.3266969 + 72 10 9 1990 27.0000000 1056.6842795 1020.0000000 1049.5908580 + 73 11 9 1990 22.0000000 1073.3230034 1040.0000000 1068.9056344 + 74 12 9 1990 22.0000000 1044.4966087 998.0000000 1026.2657272 + 75 13 9 1990 21.0000000 996.9444359 950.0000000 977.6666424 + 76 14 9 1990 22.0000000 954.2573421 910.0000000 937.1043249 + 77 15 9 1990 22.0000000 908.0561500 863.0000000 889.5751821 + 78 16 9 1990 22.0000000 884.2227509 847.0000000 873.0760255 + 79 17 9 1990 20.0000000 866.7492737 830.0000000 855.6040204 + 80 18 9 1990 22.0000000 880.7196835 854.0000000 879.1566434 + 81 19 9 1990 16.0000000 867.8391969 831.0000000 855.7316441 + 82 20 9 1990 22.0000000 837.3090315 799.0000000 823.3270131 + 83 21 9 1990 19.0000000 833.5092124 790.0000000 822.7003663 + 84 22 9 1990 32.0000000 909.0848788 805.0000000 887.0429400 + 85 23 9 1990 27.0000000 976.2201871 913.0000000 974.9531243 + 86 24 9 1990 45.0000000 1042.4473089 998.0000000 1041.5167088 + 87 25 9 1990 42.0000000 1164.5797540 1150.0000000 1186.5416634 + 88 26 9 1990 39.0000000 1380.5360573 1390.0000000 1424.8388204 + 89 27 9 1990 30.0000000 1456.7598747 1420.0000000 1453.6098392 + 90 28 9 1990 28.0000000 1361.7143408 1290.0000000 1322.4848084 + 91 29 9 1990 30.0000000 1245.6801754 1180.0000000 1211.4522998 + 92 30 9 1990 30.0000000 1219.7653772 1110.0000000 1197.0532260 + 93 1 10 1990 56.0000000 1262.2707961 1130.0000000 1241.4553631 + 94 2 10 1990 72.0000000 1217.2969359 1110.0000000 1185.8956140 + 95 3 10 1990 73.0000000 1348.9608431 1290.0000000 1369.4403392 + 96 4 10 1990 68.0000000 1499.7786845 1440.0000000 1512.4255339 + 97 5 10 1990 53.0000000 1458.8992118 1360.0000000 1424.8060888 + 98 6 10 1990 42.0000000 1403.5775134 1320.0000000 1379.9589740 + 99 7 10 1990 33.0000000 1444.1614305 1390.0000000 1446.6618390 + 100 8 10 1990 42.0000000 1387.0257583 1300.0000000 1353.7984151 + 101 9 10 1990 34.0000000 1278.1605666 1190.0000000 1241.1024329 + 102 10 10 1990 36.0000000 1195.9521904 1120.0000000 1168.7050470 + 103 11 10 1990 36.0000000 1169.4717555 1110.0000000 1156.5375350 + 104 12 10 1990 28.0000000 1133.8222144 1070.0000000 1114.5726705 + 105 13 10 1990 32.0000000 1083.8340786 1020.0000000 1062.7868729 + 106 14 10 1990 27.0000000 1048.7381767 992.0000000 1033.1596612 + 107 15 10 1990 35.0000000 1006.3405203 947.0000000 987.6520467 + 108 16 10 1990 42.0000000 965.2732370 906.0000000 947.1231694 + 109 17 10 1990 35.0000000 946.4580616 881.0000000 935.4160746 + 110 18 10 1990 39.0000000 938.5643871 880.0000000 926.6273501 + 111 19 10 1990 34.0000000 922.8996600 872.0000000 912.9622468 + 112 20 10 1990 32.0000000 916.9680433 869.0000000 908.4864355 + 113 21 10 1990 34.0000000 903.8526501 855.0000000 893.1395507 + 114 22 10 1990 27.0000000 876.0139332 825.0000000 861.9030095 + 115 23 10 1990 31.0000000 852.3529359 805.0000000 840.7649542 + 116 24 10 1990 28.0000000 852.6852546 813.0000000 847.7149634 + 117 25 10 1990 25.0000000 847.2393119 803.0000000 838.1756550 + 118 26 10 1990 29.0000000 852.5025798 789.0000000 837.6481987 + 119 27 10 1990 31.0000000 850.8501043 781.0000000 824.1855770 + 120 28 10 1990 65.0000000 982.3912134 786.0000000 914.5607107 + 121 29 10 1990 69.0000000 1074.8650591 891.0000000 1025.7622814 + 122 30 10 1990 157.0000000 1155.2331827 1010.0000000 1127.3006904 + 123 31 10 1990 190.0000000 1291.0597153 1180.0000000 1287.3578811 + 124 1 11 1990 115.0000000 1585.8565597 1510.0000000 1619.7597925 + 125 2 11 1990 104.0000000 1771.4330015 1640.0000000 1764.4339218 + 126 3 11 1990 100.0000000 1895.1906784 1750.0000000 1884.2920507 + 127 4 11 1990 131.0000000 1878.4503726 1700.0000000 1835.6073227 + 128 5 11 1990 130.0000000 1837.3315721 1670.0000000 1796.3780312 + 129 6 11 1990 115.0000000 1818.8712358 1680.0000000 1790.6891819 + 130 7 11 1990 102.0000000 1835.0789323 1720.0000000 1816.6325544 + 131 8 11 1990 95.0000000 1799.0917148 1680.0000000 1764.8173504 + 132 9 11 1990 81.0000000 1678.3671127 1550.0000000 1626.2807193 + 133 10 11 1990 66.0000000 1562.6042733 1430.0000000 1512.1792860 + 134 11 11 1990 67.0000000 1483.3809175 1320.0000000 1433.4514587 + 135 12 11 1990 74.0000000 1423.8538200 1260.0000000 1378.4108619 + 136 13 11 1990 109.0000000 1440.0116966 1310.0000000 1419.3667034 + 137 14 11 1990 92.0000000 1706.9486675 1610.0000000 1745.8664898 + 138 15 11 1990 92.0000000 1865.4732792 1710.0000000 1856.0246224 + 139 16 11 1990 155.0000000 1861.4734496 1690.0000000 1825.6325577 + 140 17 11 1990 159.0000000 1969.8074684 1850.0000000 1978.7310638 + 141 18 11 1990 131.0000000 2192.3726881 2070.0000000 2211.3207033 + 142 19 11 1990 161.0000000 2268.3042774 2090.0000000 2240.4108542 + 143 20 11 1990 196.0000000 2475.5824307 2220.0000000 2468.7808549 + 144 21 11 1990 336.0000000 2830.8821147 2560.0000000 2841.5548160 + 145 22 11 1990 566.0000000 3115.0769868 2870.0000000 3146.2928321 + 146 23 11 1990 373.0000000 3250.4531770 2940.0000000 3220.5070254 + 147 24 11 1990 293.0000000 3286.7336985 3000.0000000 3255.6658900 + 148 25 11 1990 264.0000000 3264.1222169 2970.0000000 3209.6062437 + 149 26 11 1990 226.0000000 3028.5273729 2710.0000000 2921.9283554 + 150 27 11 1990 201.0000000 2685.2823261 2390.0000000 2571.2246596 + 151 28 11 1990 180.0000000 2444.2688517 2210.0000000 2365.9348086 + 152 29 11 1990 161.0000000 2275.3825472 2060.0000000 2205.9983655 + 153 30 11 1990 149.0000000 2138.0237552 1940.0000000 2073.7127019 + 154 1 12 1990 134.0000000 1997.4342752 1820.0000000 1938.4773601 + 155 2 12 1990 113.0000000 1878.9790677 1720.0000000 1827.7594246 + 156 3 12 1990 99.0000000 1769.6570531 1620.0000000 1721.1903303 + 157 4 12 1990 107.0000000 1670.3642029 1530.0000000 1625.9574793 + 158 5 12 1990 99.0000000 1604.9423861 1480.0000000 1571.2616430 + 159 6 12 1990 89.0000000 1564.6085550 1450.0000000 1536.9928181 + 160 7 12 1990 77.0000000 1506.3168529 1390.0000000 1473.1576347 + 161 8 12 1990 71.0000000 1441.6857914 1330.0000000 1409.6953655 + 162 9 12 1990 68.0000000 1377.5070991 1270.0000000 1346.5603135 + 163 10 12 1990 73.0000000 1313.7255378 1210.0000000 1283.7131263 + 164 11 12 1990 84.0000000 1273.4374886 1180.0000000 1251.1198111 + 165 12 12 1990 88.0000000 1292.3508667 1190.0000000 1268.8784139 + 166 13 12 1990 92.0000000 1323.6659495 1220.0000000 1298.7826679 + 167 14 12 1990 128.0000000 1307.0616499 1200.0000000 1275.4388619 + 168 15 12 1990 136.0000000 1287.8148118 1190.0000000 1262.2040536 + 169 16 12 1990 114.0000000 1273.4110984 1180.0000000 1249.4949941 + 170 17 12 1990 101.0000000 1220.9674417 1120.0000000 1187.0423779 + 171 18 12 1990 93.0000000 1165.1935131 1070.0000000 1134.8124417 + 172 19 12 1990 85.0000000 1142.8972598 1060.0000000 1122.7782020 + 173 20 12 1990 81.0000000 1122.3201197 1040.0000000 1100.9163856 + 174 21 12 1990 106.0000000 1154.6204627 1040.0000000 1114.0210126 + 175 22 12 1990 159.0000000 1181.3556640 1040.0000000 1120.1237644 + 176 23 12 1990 250.0000000 1233.1297524 1090.0000000 1180.2383132 + 177 24 12 1990 298.0000000 1320.2182998 1200.0000000 1285.4895295 + 178 25 12 1990 261.0000000 1482.0648742 1320.0000000 1456.1064768 + 179 26 12 1990 228.0000000 1689.1050765 1410.0000000 1624.8307816 + 180 27 12 1990 409.0000000 1852.4309908 1510.0000000 1779.1091008 + 181 28 12 1990 486.0000000 2029.5394029 1680.0000000 1957.2343161 + 182 29 12 1990 440.0000000 2401.2910388 1970.0000000 2343.4622985 + 183 30 12 1990 486.0000000 2768.0703153 2190.0000000 2681.7502968 + 184 31 12 1990 774.0000000 3102.0251334 2440.0000000 3024.5720199 + 185 1 1 1991 889.0000000 3598.0703556 2950.0000000 3553.2942385 + 186 2 1 1991 863.0000000 4031.8529488 3300.0000000 3929.2303793 + 187 3 1 1991 875.0000000 4343.4888366 3520.0000000 4146.8851509 + 188 4 1 1991 932.0000000 4444.3899294 3700.0000000 4258.9071565 + 189 5 1 1991 826.0000000 4450.2892684 3710.0000000 4233.5407613 + 190 6 1 1991 731.0000000 4334.0279941 3620.0000000 4111.5926968 + 191 7 1 1991 613.0000000 4129.5981004 3430.0000000 3920.9337716 + 192 8 1 1991 610.0000000 3882.3611060 3180.0000000 3651.1416790 + 193 9 1 1991 686.0000000 3723.7741272 3130.0000000 3550.3082164 + 194 10 1 1991 556.0000000 3802.7435024 3200.0000000 3631.5724603 + 195 11 1 1991 669.0000000 3761.9568981 3080.0000000 3533.5587814 + 196 12 1 1991 828.0000000 3641.0905847 3010.0000000 3434.7723311 + 197 13 1 1991 735.0000000 3453.1576478 2930.0000000 3279.7425448 + 198 14 1 1991 513.0000000 3300.8704428 2870.0000000 3160.9444212 + 199 15 1 1991 411.0000000 3085.4018859 2700.0000000 2943.2943397 + 200 16 1 1991 345.0000000 2851.2595639 2520.0000000 2725.7985554 + 201 17 1 1991 293.0000000 2606.3386671 2310.0000000 2489.0236819 + 202 18 1 1991 251.0000000 2398.0106783 2140.0000000 2300.0851026 + 203 19 1 1991 222.0000000 2246.0902294 2020.0000000 2166.4654310 + 204 20 1 1991 215.0000000 2119.7417655 1910.0000000 2047.5699044 + 205 21 1 1991 213.0000000 1989.0730303 1780.0000000 1915.1104657 + 206 22 1 1991 202.0000000 1890.1786661 1690.0000000 1822.8981642 + 207 23 1 1991 200.0000000 1814.8038700 1630.0000000 1757.1691804 + 208 24 1 1991 192.0000000 1746.0489190 1570.0000000 1691.4003715 + 209 25 1 1991 176.0000000 1647.2111742 1470.0000000 1586.1994970 + 210 26 1 1991 164.0000000 1571.0083723 1410.0000000 1521.5288220 + 211 27 1 1991 157.0000000 1519.9995675 1370.0000000 1477.3184936 + 212 28 1 1991 134.0000000 1466.5001352 1320.0000000 1423.5094922 + 213 29 1 1991 130.0000000 1411.2845437 1270.0000000 1370.0513942 + 214 30 1 1991 119.0000000 1371.9954559 1240.0000000 1336.9009755 + 215 31 1 1991 107.0000000 1353.1418119 1230.0000000 1324.0210665 + 216 1 2 1991 112.0000000 1323.8118666 1200.0000000 1291.3796067 + 217 2 2 1991 109.0000000 1282.5332108 1160.0000000 1248.9488631 + 218 3 2 1991 101.0000000 1246.9809470 1130.0000000 1216.7047803 + 219 4 2 1991 98.0000000 1221.6914321 1110.0000000 1194.6264380 + 220 5 2 1991 84.0000000 1198.9201808 1090.0000000 1172.6955972 + 221 6 2 1991 93.0000000 1176.3558862 1070.0000000 1150.8963186 + 222 7 2 1991 80.0000000 1146.2611934 1040.0000000 1119.2146407 + 223 8 2 1991 73.0000000 1114.0455886 1010.0000000 1087.6383079 + 224 9 2 1991 89.0000000 1112.8356687 1020.0000000 1096.1565397 + 225 10 2 1991 84.0000000 1120.8987729 1030.0000000 1104.7598339 + 226 11 2 1991 78.0000000 1129.0801074 1040.0000000 1113.4397992 + 227 12 2 1991 79.0000000 1129.6531159 1040.0000000 1112.1890114 + 228 13 2 1991 77.0000000 1104.8926246 1010.0000000 1081.0008907 + 229 14 2 1991 80.0000000 1082.6202869 992.0000000 1061.8695951 + 230 15 2 1991 72.0000000 1064.7115735 976.0000000 1044.7899298 + 231 16 2 1991 78.0000000 1071.9027427 989.0000000 1057.8128147 + 232 17 2 1991 74.0000000 1082.8728774 1000.0000000 1068.1354756 + 233 18 2 1991 77.0000000 1079.8345689 995.0000000 1062.0840098 + 234 19 2 1991 73.0000000 1075.9321439 978.0000000 1056.5798412 + 235 20 2 1991 69.0000000 1067.5026652 952.0000000 1041.0714900 + 236 21 2 1991 74.0000000 1096.4787725 959.0000000 1071.4383418 + 237 22 2 1991 81.0000000 1109.9027600 959.0000000 1078.0100199 + 238 23 2 1991 110.0000000 1121.3220435 979.0000000 1097.3385319 + 239 24 2 1991 180.0000000 1154.0000241 1020.0000000 1135.9725904 + 240 25 2 1991 213.0000000 1191.8582949 1060.0000000 1175.2188474 + 241 26 2 1991 222.0000000 1236.5483450 1110.0000000 1223.9815241 + 242 27 2 1991 208.0000000 1294.3584554 1170.0000000 1283.8371101 + 243 28 2 1991 211.0000000 1349.1780000 1230.0000000 1337.7563239 + 244 1 3 1991 214.0000000 1365.3836150 1240.0000000 1342.8218255 + 245 2 3 1991 208.0000000 1367.9816406 1230.0000000 1338.1568701 + 246 3 3 1991 221.0000000 1387.6485846 1260.0000000 1366.1247156 + 247 4 3 1991 281.0000000 1409.0708009 1290.0000000 1390.3374664 + 248 5 3 1991 219.0000000 1426.0857117 1310.0000000 1406.4584116 + 249 6 3 1991 190.0000000 1464.5269254 1360.0000000 1452.9397832 + 250 7 3 1991 173.0000000 1456.2779661 1340.0000000 1429.7379518 + 251 8 3 1991 164.0000000 1424.9190966 1310.0000000 1397.2372381 + 252 9 3 1991 142.0000000 1400.3465457 1290.0000000 1376.1106168 + 253 10 3 1991 133.0000000 1403.1524243 1300.0000000 1386.3121355 + 254 11 3 1991 133.0000000 1410.1330532 1310.0000000 1393.6231026 + 255 12 3 1991 118.0000000 1440.0868370 1350.0000000 1431.0142790 + 256 13 3 1991 127.0000000 1438.6260154 1340.0000000 1418.7839139 + 257 14 3 1991 113.0000000 1418.2539499 1320.0000000 1396.7231141 + 258 15 3 1991 107.0000000 1395.7986247 1300.0000000 1374.8134497 + 259 16 3 1991 100.0000000 1373.5234810 1280.0000000 1353.0388030 + 260 17 3 1991 100.0000000 1328.2653245 1230.0000000 1301.3850257 + 261 18 3 1991 95.0000000 1276.3081575 1180.0000000 1249.8396701 + 262 19 3 1991 98.0000000 1305.1660294 1160.0000000 1268.6118905 + 263 20 3 1991 119.0000000 1323.8798005 1180.0000000 1283.6295148 + 264 21 3 1991 159.0000000 1405.1702505 1260.0000000 1378.7720881 + 265 22 3 1991 196.0000000 1553.5239579 1410.0000000 1536.6954223 + 266 23 3 1991 242.0000000 1664.2868128 1530.0000000 1647.4156267 + 267 24 3 1991 216.0000000 1810.1596429 1700.0000000 1809.4284899 + 268 25 3 1991 180.0000000 1940.4934665 1830.0000000 1934.1077861 + 269 26 3 1991 145.0000000 1878.2414672 1720.0000000 1820.0544856 + 270 27 3 1991 127.0000000 1755.6010286 1600.0000000 1697.0821520 + 271 28 3 1991 117.0000000 1659.9349674 1520.0000000 1612.6438899 + 272 29 3 1991 109.0000000 1620.8397775 1500.0000000 1589.0954583 + 273 30 3 1991 106.0000000 1603.7111244 1490.0000000 1575.8797689 + 274 31 3 1991 99.0000000 1558.4803120 1440.0000000 1522.9559674 + 275 1 4 1991 96.0000000 1496.8060186 1380.0000000 1460.2889135 + 276 2 4 1991 88.0000000 1440.9231647 1330.0000000 1407.8482860 + 277 3 4 1991 87.0000000 1395.3589734 1290.0000000 1365.6078438 + 278 4 4 1991 82.0000000 1368.2135650 1270.0000000 1343.8562399 + 279 5 4 1991 84.0000000 1323.1570605 1220.0000000 1292.4491277 + 280 6 4 1991 67.0000000 1278.1783833 1180.0000000 1250.5105811 + 281 7 4 1991 89.0000000 1274.4503310 1190.0000000 1258.8839394 + 282 8 4 1991 75.0000000 1305.6028774 1230.0000000 1297.4885437 + 283 9 4 1991 79.0000000 1312.7743513 1230.0000000 1296.0920804 + 284 10 4 1991 70.0000000 1310.8227965 1230.0000000 1294.7069556 + 285 11 4 1991 69.0000000 1301.2740317 1220.0000000 1283.3991531 + 286 12 4 1991 69.0000000 1281.8465387 1200.0000000 1262.1692279 + 287 13 4 1991 56.0000000 1237.0997908 1150.0000000 1211.0123954 + 288 14 4 1991 63.0000000 1193.3234607 1110.0000000 1169.9331904 + 289 15 4 1991 58.0000000 1159.6226889 1080.0000000 1138.8918414 + 290 16 4 1991 56.0000000 1135.9972038 1060.0000000 1117.9044388 + 291 17 4 1991 54.0000000 1107.0157421 1030.0000000 1086.9645466 + 292 18 4 1991 57.0000000 1091.2670569 1020.0000000 1076.0756087 + 293 19 4 1991 53.0000000 1073.6255126 1000.0000000 1056.4860324 + 294 20 4 1991 53.0000000 1099.6774682 1040.0000000 1096.4938448 + 295 21 4 1991 65.0000000 1115.4134638 1050.0000000 1105.0478244 + 296 22 4 1991 69.0000000 1081.0154946 1000.0000000 1056.0703232 + 297 23 4 1991 61.0000000 1079.0419514 1010.0000000 1066.8428676 + 298 24 4 1991 56.0000000 1093.3767845 1030.0000000 1084.7984409 + 299 25 4 1991 56.0000000 1111.8024486 1050.0000000 1103.8456035 + 300 26 4 1991 53.0000000 1092.0705593 1020.0000000 1073.0005592 + 301 27 4 1991 49.0000000 1084.1334789 1020.0000000 1072.1968731 + 302 28 4 1991 53.0000000 1075.4547999 1010.0000000 1061.5055513 + 303 29 4 1991 48.0000000 1054.8055992 982.0000000 1034.4569481 + 304 30 4 1991 57.0000000 1094.7500139 983.0000000 1074.8062627 + 305 1 5 1991 69.0000000 1172.5212919 1090.0000000 1168.3615309 + 306 2 5 1991 89.0000000 1213.0372748 1140.0000000 1206.9821091 + 307 3 5 1991 105.0000000 1259.5640138 1190.0000000 1254.5198033 + 308 4 5 1991 79.0000000 1330.3109116 1270.0000000 1332.8759010 + 309 5 5 1991 69.0000000 1338.9799886 1260.0000000 1321.7377952 + 310 6 5 1991 71.0000000 1327.2158761 1250.0000000 1310.3344494 + 311 7 5 1991 60.0000000 1291.8180810 1210.0000000 1268.6539582 + 312 8 5 1991 64.0000000 1273.0688364 1200.0000000 1257.2626369 + 313 9 5 1991 59.0000000 1261.3232361 1190.0000000 1245.9641197 + 314 10 5 1991 57.0000000 1213.7348993 1130.0000000 1188.7945292 + 315 11 5 1991 55.0000000 1171.0757839 1090.0000000 1149.0147113 + 316 12 5 1991 53.0000000 1150.7654715 1080.0000000 1136.5258670 + 317 13 5 1991 52.0000000 1331.7394196 1320.0000000 1374.9287881 + 318 14 5 1991 50.0000000 1848.8383858 1920.0000000 1975.0123370 + 319 15 5 1991 52.0000000 2091.0252004 2050.0000000 2111.2833899 + 320 16 5 1991 54.0000000 1943.8580410 1820.0000000 1879.3016608 + 321 17 5 1991 54.0000000 1809.1910315 1720.0000000 1775.5539259 + 322 18 5 1991 55.0000000 1792.5891545 1730.0000000 1784.3516571 + 323 19 5 1991 48.0000000 1793.5187717 1730.0000000 1783.2257430 + 324 20 5 1991 48.0000000 1784.5264046 1720.0000000 1772.1633405 + 325 21 5 1991 49.0000000 1765.6048424 1700.0000000 1751.1589260 + 326 22 5 1991 41.0000000 1690.4598682 1610.0000000 1660.2075170 + 327 23 5 1991 40.0000000 1607.0912761 1530.0000000 1579.3046134 + 328 24 5 1991 40.0000000 1541.4913411 1470.0000000 1518.4461464 + 329 25 5 1991 39.0000000 1480.5115093 1410.0000000 1457.6284347 + 330 26 5 1991 43.0000000 1427.2916837 1360.0000000 1406.8481445 + 331 27 5 1991 39.0000000 1384.1134805 1320.0000000 1366.1022543 + 332 28 5 1991 36.0000000 1327.8295287 1260.0000000 1305.3880236 + 333 29 5 1991 33.0000000 1305.5834811 1250.0000000 1294.7029650 + 334 30 5 1991 39.0000000 1287.0818686 1230.0000000 1274.0448189 + 335 31 5 1991 34.0000000 1274.0395453 1220.0000000 1263.4115315 + 336 1 6 1991 37.0000000 1247.8808864 1190.0000000 1232.8012348 + 337 2 6 1991 35.0000000 1217.1771736 1160.0000000 1202.2122282 + 338 3 6 1991 29.0000000 1186.4971866 1130.0000000 1171.6429632 + 339 4 6 1991 33.0000000 1171.2685537 1120.0000000 1161.0920283 + 340 5 6 1991 34.0000000 1192.0984417 1150.0000000 1191.2412990 + 341 6 6 1991 32.0000000 1256.7530875 1200.0000000 1248.2612270 + 342 7 6 1991 38.0000000 1315.5124894 1260.0000000 1313.6663368 + 343 8 6 1991 39.0000000 1372.8115483 1330.0000000 1375.6693037 + 344 9 6 1991 41.0000000 1434.6792776 1390.0000000 1439.8069225 + 345 10 6 1991 44.0000000 1452.5824425 1380.0000000 1430.0809364 + 346 11 6 1991 48.0000000 1497.2439397 1460.0000000 1503.1524952 + 347 12 6 1991 42.0000000 1543.3535240 1500.0000000 1542.2857944 + 348 13 6 1991 37.0000000 1559.2615266 1510.0000000 1551.5396569 + 349 14 6 1991 39.0000000 1537.9397603 1480.0000000 1520.8463754 + 350 15 6 1991 35.0000000 1507.5583731 1450.0000000 1491.3502006 + 351 16 6 1991 31.0000000 1496.0794402 1440.0000000 1485.6975511 + 352 17 6 1991 33.0000000 1474.0339602 1410.0000000 1458.1349698 + 353 18 6 1991 31.0000000 1595.2627934 1580.0000000 1624.8865372 + 354 19 6 1991 28.0000000 2001.4188415 2060.0000000 2102.3299763 + 355 20 6 1991 60.0000000 2519.8983582 2540.0000000 2611.0335393 + 356 21 6 1991 48.0000000 2699.2530446 2650.0000000 2702.6941076 + 357 22 6 1991 54.0000000 2634.0499848 2550.0000000 2599.1119773 + 358 23 6 1991 63.0000000 2555.8072522 2470.0000000 2520.0799321 + 359 24 6 1991 41.0000000 2492.3917430 2420.0000000 2465.9327946 + 360 25 6 1991 42.0000000 2414.9348102 2340.0000000 2384.6793380 + 361 26 6 1991 43.0000000 2349.0397438 2280.0000000 2323.9508796 + 362 27 6 1991 38.0000000 2261.0788434 2170.0000000 2218.4526080 + 363 28 6 1991 38.0000000 2210.9761286 2140.0000000 2189.6252595 + 364 29 6 1991 35.0000000 2212.4611450 2160.0000000 2204.9772998 + 365 30 6 1991 41.0000000 2253.1788361 2210.0000000 2253.1772386 diff --git a/check/case_05/output_save/b3_daily_discharge.out b/check/case_05/output_save/b3_daily_discharge.out index 56386cd2..7fae087b 100644 --- a/check/case_05/output_save/b3_daily_discharge.out +++ b/check/case_05/output_save/b3_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 Qobs_0000000333 Qsim_0000000333 - 1 1 1 1990 157.0000000 134.5284631 1210.0000000 98.9923452 - 2 2 1 1990 129.0000000 125.7590302 1120.0000000 93.1926055 - 3 3 1 1990 117.0000000 117.9936287 1070.0000000 88.0309112 - 4 4 1 1990 111.0000000 111.0949080 1030.0000000 83.4223631 - 5 5 1 1990 112.0000000 104.9802738 1000.0000000 79.4163489 - 6 6 1 1990 93.0000000 99.7271425 985.0000000 75.8418186 - 7 7 1 1990 87.0000000 94.7610217 946.0000000 72.4599766 - 8 8 1 1990 84.0000000 90.3056847 922.0000000 69.4350413 - 9 9 1 1990 80.0000000 86.3106881 896.0000000 66.6952463 - 10 10 1 1990 78.0000000 82.6911838 892.0000000 64.1979046 - 11 11 1 1990 78.0000000 79.4078399 885.0000000 61.9221061 - 12 12 1 1990 77.0000000 76.4232370 888.0000000 59.8421267 - 13 13 1 1990 76.0000000 74.8468477 882.0000000 57.9358932 - 14 14 1 1990 73.0000000 77.1081286 840.0000000 56.4682563 - 15 15 1 1990 66.0000000 85.7938506 837.0000000 62.5385710 - 16 16 1 1990 76.0000000 85.6020496 824.0000000 60.7174303 - 17 17 1 1990 73.0000000 86.2228613 818.0000000 66.3771193 - 18 18 1 1990 71.0000000 87.5928259 829.0000000 64.7383617 - 19 19 1 1990 90.0000000 83.2122917 851.0000000 60.6408949 - 20 20 1 1990 82.0000000 85.7958841 830.0000000 61.3159734 - 21 21 1 1990 80.0000000 82.9874027 833.0000000 59.8269517 - 22 22 1 1990 81.0000000 78.3787857 826.0000000 57.3151232 - 23 23 1 1990 97.0000000 174.2502268 797.0000000 103.4267714 - 24 24 1 1990 198.0000000 213.1038813 807.0000000 111.7248582 - 25 25 1 1990 392.0000000 278.0879931 949.0000000 153.6015920 - 26 26 1 1990 519.0000000 304.3046421 1170.0000000 163.0241285 - 27 27 1 1990 565.0000000 258.7635535 1330.0000000 140.4793116 - 28 28 1 1990 331.0000000 237.3508391 1480.0000000 146.8628683 - 29 29 1 1990 293.0000000 236.4400478 1450.0000000 152.0302088 - 30 30 1 1990 302.0000000 200.8918380 1280.0000000 130.6197403 - 31 31 1 1990 233.0000000 175.5352301 1190.0000000 116.7946734 - 32 1 2 1990 198.0000000 183.4580257 1120.0000000 126.6387596 - 33 2 2 1990 183.0000000 202.1631188 1060.0000000 148.1319535 - 34 3 2 1990 206.0000000 207.4765646 1030.0000000 148.3992686 - 35 4 2 1990 215.0000000 179.0645640 1010.0000000 127.4950031 - 36 5 2 1990 183.0000000 159.5955037 1020.0000000 114.2112260 - 37 6 2 1990 159.0000000 145.3536182 982.0000000 104.6283880 - 38 7 2 1990 167.0000000 135.6440892 963.0000000 98.5515384 - 39 8 2 1990 138.0000000 129.1583149 927.0000000 96.5585718 - 40 9 2 1990 126.0000000 126.9094339 916.0000000 94.2588803 - 41 10 2 1990 131.0000000 200.3185395 888.0000000 150.8014620 - 42 11 2 1990 173.0000000 259.3232394 910.0000000 172.2555807 - 43 12 2 1990 240.0000000 296.2017084 985.0000000 222.2795605 - 44 13 2 1990 270.0000000 462.9209759 1080.0000000 386.8415330 - 45 14 2 1990 458.0000000 845.4531462 1230.0000000 713.1916408 - 46 15 2 1990 996.0000000 1109.4100865 1750.0000000 860.9372437 - 47 16 2 1990 1370.0000000 972.4356012 3620.0000000 745.3808595 - 48 17 2 1990 1540.0000000 796.7480808 4830.0000000 612.0688534 - 49 18 2 1990 1210.0000000 653.5515900 5130.0000000 503.0930507 - 50 19 2 1990 616.0000000 536.5400240 4800.0000000 414.1565528 - 51 20 2 1990 465.0000000 442.3905827 4180.0000000 342.4485195 - 52 21 2 1990 373.0000000 366.4455689 3500.0000000 284.5024947 - 53 22 2 1990 298.0000000 306.8031746 2960.0000000 238.6453614 - 54 23 2 1990 270.0000000 261.7537116 2590.0000000 203.0305821 - 55 24 2 1990 234.0000000 228.1450895 2340.0000000 176.1515094 - 56 25 2 1990 218.0000000 206.9315756 2190.0000000 155.7549591 - 57 26 2 1990 203.0000000 313.5685490 2020.0000000 236.9201110 - 58 27 2 1990 314.0000000 527.6831671 2100.0000000 415.2414646 - 59 28 2 1990 520.0000000 726.5484199 2700.0000000 573.5156223 - 60 1 3 1990 689.0000000 801.0188836 3240.0000000 599.5745457 - 61 2 3 1990 777.0000000 696.3480169 3760.0000000 509.8292180 - 62 3 3 1990 584.0000000 572.8014573 3930.0000000 420.7452192 - 63 4 3 1990 429.0000000 473.1057291 3820.0000000 349.5145450 - 64 5 3 1990 365.0000000 395.2961558 3500.0000000 294.2581095 - 65 6 3 1990 281.0000000 331.5191065 3050.0000000 247.8585595 - 66 7 3 1990 257.0000000 280.5862984 2700.0000000 211.2282373 - 67 8 3 1990 231.0000000 244.0749953 2440.0000000 184.4404177 - 68 9 3 1990 211.0000000 217.5464779 2250.0000000 164.1775735 - 69 10 3 1990 191.0000000 197.4635118 2090.0000000 149.2626827 - 70 11 3 1990 182.0000000 183.1010764 1980.0000000 139.3093315 - 71 12 3 1990 173.0000000 173.0899114 1850.0000000 132.5629364 - 72 13 3 1990 159.0000000 164.5737101 1740.0000000 126.8697583 - 73 14 3 1990 153.0000000 158.8179506 1670.0000000 123.9622475 - 74 15 3 1990 141.0000000 153.0449237 1590.0000000 119.6427613 - 75 16 3 1990 136.0000000 146.1240153 1550.0000000 114.6280168 - 76 17 3 1990 130.0000000 140.2945971 1540.0000000 110.4769438 - 77 18 3 1990 123.0000000 135.0215401 1490.0000000 106.7039002 - 78 19 3 1990 115.0000000 130.2362479 1420.0000000 103.2633515 - 79 20 3 1990 113.0000000 126.0791201 1380.0000000 100.1912240 - 80 21 3 1990 102.0000000 122.4180032 1390.0000000 97.4004101 - 81 22 3 1990 105.0000000 119.1598080 1340.0000000 94.9292822 - 82 23 3 1990 106.0000000 116.3624112 1300.0000000 92.6926597 - 83 24 3 1990 87.0000000 113.5627223 1310.0000000 90.9224351 - 84 25 3 1990 80.0000000 111.3483233 1320.0000000 89.4303024 - 85 26 3 1990 84.0000000 108.4670235 1340.0000000 87.1362711 - 86 27 3 1990 82.0000000 106.2136810 1310.0000000 85.7143974 - 87 28 3 1990 91.0000000 114.3928319 1310.0000000 99.8398271 - 88 29 3 1990 97.0000000 121.6111183 1330.0000000 97.5766414 - 89 30 3 1990 110.0000000 113.0056389 1410.0000000 92.6158567 - 90 31 3 1990 97.0000000 109.3631531 1430.0000000 89.9090743 - 91 1 4 1990 93.0000000 106.5032313 1370.0000000 87.6124026 - 92 2 4 1990 85.0000000 103.8563303 1350.0000000 85.4827417 - 93 3 4 1990 84.0000000 108.5762024 1360.0000000 91.7323916 - 94 4 4 1990 81.0000000 112.4939966 1360.0000000 90.9497177 - 95 5 4 1990 81.0000000 105.3664268 1340.0000000 87.0188410 - 96 6 4 1990 76.0000000 103.6879375 1310.0000000 85.4787996 - 97 7 4 1990 72.0000000 100.9233023 1250.0000000 83.1576848 - 98 8 4 1990 68.0000000 98.4971741 1240.0000000 81.2691427 - 99 9 4 1990 72.0000000 96.3311396 1220.0000000 79.5315486 - 100 10 4 1990 65.0000000 94.3470028 1220.0000000 77.9658390 - 101 11 4 1990 62.0000000 93.3680991 1200.0000000 77.5290642 - 102 12 4 1990 62.0000000 94.2967791 1220.0000000 79.3718814 - 103 13 4 1990 65.0000000 99.0638707 1230.0000000 82.3965160 - 104 14 4 1990 68.0000000 122.4495524 1230.0000000 100.0876289 - 105 15 4 1990 75.0000000 126.3829956 1200.0000000 99.7248629 - 106 16 4 1990 90.0000000 121.3095055 1240.0000000 97.2500263 - 107 17 4 1990 92.0000000 118.0260431 1310.0000000 97.2917783 - 108 18 4 1990 94.0000000 117.8929252 1370.0000000 96.4244351 - 109 19 4 1990 110.0000000 112.6597534 1370.0000000 91.6763556 - 110 20 4 1990 99.0000000 108.8202320 1380.0000000 88.8001646 - 111 21 4 1990 86.0000000 105.5481668 1380.0000000 86.1393642 - 112 22 4 1990 86.0000000 110.6060328 1340.0000000 87.6947968 - 113 23 4 1990 86.0000000 118.2738805 1280.0000000 97.4731943 - 114 24 4 1990 88.0000000 118.0035005 1230.0000000 95.9867248 - 115 25 4 1990 93.0000000 110.4351933 1380.0000000 90.1170169 - 116 26 4 1990 99.0000000 106.6354654 1510.0000000 87.1672944 - 117 27 4 1990 86.0000000 103.9195334 1490.0000000 85.3025291 - 118 28 4 1990 74.0000000 100.9951949 1470.0000000 82.9657535 - 119 29 4 1990 72.0000000 98.0883540 1410.0000000 80.6669795 - 120 30 4 1990 77.0000000 95.4169192 1350.0000000 78.5790042 - 121 1 5 1990 56.0000000 92.9455035 1350.0000000 76.6415442 - 122 2 5 1990 64.0000000 90.6527285 1270.0000000 74.8388456 - 123 3 5 1990 58.0000000 88.5198415 1230.0000000 73.1570369 - 124 4 5 1990 50.0000000 86.5303329 1210.0000000 71.5838790 - 125 5 5 1990 50.0000000 84.6696390 1180.0000000 70.1085514 - 126 6 5 1990 50.0000000 82.9269399 1190.0000000 68.7252425 - 127 7 5 1990 50.0000000 81.5410108 1190.0000000 67.7649066 - 128 8 5 1990 53.0000000 81.6330609 1220.0000000 68.3017029 - 129 9 5 1990 62.0000000 80.5187438 1280.0000000 67.2205733 - 130 10 5 1990 64.0000000 86.9808373 1320.0000000 70.9104540 - 131 11 5 1990 65.0000000 87.4470415 1320.0000000 71.1228210 - 132 12 5 1990 75.0000000 80.3830445 1330.0000000 66.5118943 - 133 13 5 1990 71.0000000 78.5634969 1410.0000000 65.0920507 - 134 14 5 1990 63.0000000 77.1642794 1400.0000000 63.9413679 - 135 15 5 1990 61.0000000 76.6264327 1350.0000000 63.8262385 - 136 16 5 1990 49.0000000 75.2138155 1350.0000000 62.5814282 - 137 17 5 1990 46.0000000 73.6732891 1360.0000000 61.2568834 - 138 18 5 1990 46.0000000 72.3714344 1360.0000000 60.2067615 - 139 19 5 1990 48.0000000 71.1367713 1360.0000000 59.2089708 - 140 20 5 1990 41.0000000 70.1635045 1360.0000000 58.4992293 - 141 21 5 1990 45.0000000 77.1080439 1340.0000000 68.4355944 - 142 22 5 1990 52.0000000 76.7587115 1360.0000000 62.8107986 - 143 23 5 1990 50.0000000 77.2416154 1390.0000000 67.8611786 - 144 24 5 1990 56.0000000 80.7067269 1410.0000000 69.2455251 - 145 25 5 1990 41.0000000 76.4942035 1430.0000000 63.8829183 - 146 26 5 1990 40.0000000 71.4137695 1480.0000000 60.2920989 - 147 27 5 1990 39.0000000 69.9558268 1560.0000000 59.0388157 - 148 28 5 1990 39.0000000 68.5886476 1750.0000000 57.8646847 - 149 29 5 1990 33.0000000 67.3024496 1650.0000000 56.7614849 - 150 30 5 1990 37.0000000 66.0890542 1520.0000000 55.7219902 - 151 31 5 1990 30.0000000 64.9412511 1460.0000000 54.7398352 - 152 1 6 1990 37.0000000 73.4875200 1430.0000000 58.6936484 - 153 2 6 1990 36.0000000 73.3097026 1390.0000000 60.4870043 - 154 3 6 1990 40.0000000 104.2474582 1370.0000000 78.9346117 - 155 4 6 1990 45.0000000 85.9092854 1390.0000000 64.1709352 - 156 5 6 1990 39.0000000 71.3306545 1400.0000000 58.5520196 - 157 6 6 1990 48.0000000 69.7639030 1360.0000000 57.2884639 - 158 7 6 1990 39.0000000 120.7613767 1420.0000000 103.9111184 - 159 8 6 1990 49.0000000 129.6631997 1530.0000000 95.3337720 - 160 9 6 1990 84.0000000 115.6229574 1600.0000000 90.4043556 - 161 10 6 1990 91.0000000 104.6010129 1700.0000000 82.7906490 - 162 11 6 1990 80.0000000 94.1851879 1910.0000000 76.3190781 - 163 12 6 1990 66.0000000 90.2247493 1990.0000000 73.3942739 - 164 13 6 1990 53.0000000 87.0666356 2040.0000000 71.0631891 - 165 14 6 1990 64.0000000 83.7645190 2020.0000000 68.4340324 - 166 15 6 1990 55.0000000 80.6642912 2030.0000000 66.0588913 - 167 16 6 1990 54.0000000 77.9495538 2040.0000000 63.9656593 - 168 17 6 1990 42.0000000 75.4705542 2000.0000000 62.0487591 - 169 18 6 1990 48.0000000 74.2279343 1880.0000000 61.6424677 - 170 19 6 1990 48.0000000 93.4195219 1790.0000000 81.4459902 - 171 20 6 1990 60.0000000 110.3520070 1770.0000000 93.0995483 - 172 21 6 1990 75.0000000 104.0801947 1770.0000000 84.3466303 - 173 22 6 1990 78.0000000 91.5314557 1830.0000000 76.0064753 - 174 23 6 1990 66.0000000 88.0174311 2040.0000000 72.2409886 - 175 24 6 1990 63.0000000 83.6346309 2020.0000000 69.6268271 - 176 25 6 1990 52.0000000 80.3823714 1880.0000000 67.1523484 - 177 26 6 1990 49.0000000 77.6484388 1760.0000000 64.9426073 - 178 27 6 1990 44.0000000 87.4516098 1690.0000000 71.6950999 - 179 28 6 1990 51.0000000 83.4518510 1730.0000000 67.4992854 - 180 29 6 1990 61.0000000 107.1459225 1710.0000000 87.1070031 - 181 30 6 1990 81.0000000 141.3961683 1780.0000000 106.7974994 - 182 1 7 1990 79.0000000 116.8199870 1740.0000000 86.2220718 - 183 2 7 1990 92.0000000 103.0307747 1870.0000000 79.8499295 - 184 3 7 1990 72.0000000 109.7615601 2030.0000000 92.6975727 - 185 4 7 1990 58.0000000 126.8780839 2050.0000000 105.5082260 - 186 5 7 1990 69.0000000 158.3157781 2040.0000000 123.8546523 - 187 6 7 1990 94.0000000 145.6638850 2130.0000000 111.9701224 - 188 7 7 1990 199.0000000 142.9729457 2240.0000000 116.0980594 - 189 8 7 1990 133.0000000 144.9209754 2330.0000000 113.8457876 - 190 9 7 1990 124.0000000 125.9652800 2400.0000000 100.1265352 - 191 10 7 1990 123.0000000 116.9882437 2360.0000000 93.6036262 - 192 11 7 1990 99.0000000 110.2431465 2270.0000000 88.5929860 - 193 12 7 1990 88.0000000 104.6358703 2290.0000000 84.4418363 - 194 13 7 1990 84.0000000 99.6723617 2200.0000000 80.7331909 - 195 14 7 1990 72.0000000 95.2116144 2110.0000000 77.3878111 - 196 15 7 1990 55.0000000 91.1900453 2010.0000000 74.3606108 - 197 16 7 1990 65.0000000 87.5531940 1910.0000000 71.6128638 - 198 17 7 1990 50.0000000 84.2542537 1820.0000000 69.1111988 - 199 18 7 1990 50.0000000 81.2528691 1740.0000000 66.8267715 - 200 19 7 1990 46.0000000 78.5141434 1690.0000000 64.7345774 - 201 20 7 1990 44.0000000 76.0078144 1630.0000000 62.8128809 - 202 21 7 1990 42.0000000 73.7075688 1580.0000000 61.0427382 - 203 22 7 1990 37.0000000 71.5904678 1490.0000000 59.4075974 - 204 23 7 1990 38.0000000 69.6364661 1440.0000000 57.8929618 - 205 24 7 1990 44.0000000 67.8280059 1410.0000000 56.4861061 - 206 25 7 1990 30.0000000 66.1496747 1370.0000000 55.1758356 - 207 26 7 1990 26.0000000 64.5879141 1320.0000000 53.9522818 - 208 27 7 1990 31.0000000 63.1307729 1270.0000000 52.8067279 - 209 28 7 1990 33.0000000 66.2584528 1240.0000000 52.2012470 - 210 29 7 1990 42.0000000 62.5921479 1200.0000000 50.9155371 - 211 30 7 1990 36.0000000 60.0407622 1160.0000000 49.9457805 - 212 31 7 1990 34.0000000 58.8439204 1160.0000000 49.0277631 - 213 1 8 1990 25.0000000 57.7163276 1260.0000000 48.1585489 - 214 2 8 1990 22.0000000 56.6513920 1250.0000000 47.3336518 - 215 3 8 1990 28.0000000 55.6432475 1180.0000000 46.5490672 - 216 4 8 1990 25.0000000 54.6866657 1130.0000000 45.8012148 - 217 5 8 1990 19.0000000 53.8681127 1090.0000000 45.1900375 - 218 6 8 1990 22.0000000 52.9456381 1050.0000000 44.4341385 - 219 7 8 1990 19.0000000 52.1133867 1050.0000000 43.7785760 - 220 8 8 1990 22.0000000 51.3194377 1050.0000000 43.1471423 - 221 9 8 1990 19.0000000 50.5582561 1040.0000000 42.5395034 - 222 10 8 1990 20.0000000 49.8271326 1040.0000000 41.9537696 - 223 11 8 1990 19.0000000 49.1236297 1000.0000000 41.3882366 - 224 12 8 1990 19.0000000 48.4455516 993.0000000 40.8413651 - 225 13 8 1990 22.0000000 55.2147546 963.0000000 46.9006997 - 226 14 8 1990 36.0000000 74.7962158 956.0000000 62.5837816 - 227 15 8 1990 31.0000000 65.9546815 988.0000000 46.8716112 - 228 16 8 1990 30.0000000 61.9786131 1040.0000000 49.5789068 - 229 17 8 1990 28.0000000 56.7526152 1070.0000000 44.7337515 - 230 18 8 1990 34.0000000 49.7664163 1070.0000000 41.3119744 - 231 19 8 1990 21.0000000 48.8500835 1030.0000000 40.6128513 - 232 20 8 1990 30.0000000 47.9838901 1020.0000000 39.9485575 - 233 21 8 1990 22.0000000 47.1629713 1010.0000000 39.3158312 - 234 22 8 1990 21.0000000 46.3830535 1020.0000000 38.7117756 - 235 23 8 1990 23.0000000 45.6403397 969.0000000 38.1338135 - 236 24 8 1990 20.0000000 44.9314515 935.0000000 37.5796482 - 237 25 8 1990 29.0000000 44.2680640 924.0000000 37.0567785 - 238 26 8 1990 20.0000000 44.7274790 930.0000000 37.8505368 - 239 27 8 1990 22.0000000 45.4784387 924.0000000 38.4791903 - 240 28 8 1990 23.0000000 43.2919341 951.0000000 36.3724012 - 241 29 8 1990 35.0000000 42.1577902 954.0000000 35.4397315 - 242 30 8 1990 51.0000000 132.8812500 947.0000000 102.4243757 - 243 31 8 1990 80.0000000 129.6917320 958.0000000 67.5859805 - 244 1 9 1990 56.0000000 69.9659660 995.0000000 47.7896825 - 245 2 9 1990 33.0000000 60.7968961 1040.0000000 44.8644067 - 246 3 9 1990 27.0000000 58.6473816 1070.0000000 43.8181124 - 247 4 9 1990 27.0000000 61.1776947 1050.0000000 48.5907021 - 248 5 9 1990 28.0000000 59.8499379 1040.0000000 45.4180418 - 249 6 9 1990 26.0000000 54.8437415 1010.0000000 42.3798740 - 250 7 9 1990 24.0000000 60.6320325 991.0000000 44.5796683 - 251 8 9 1990 33.0000000 56.4326337 1010.0000000 42.3319898 - 252 9 9 1990 26.0000000 51.8452212 1010.0000000 40.0300315 - 253 10 9 1990 27.0000000 50.2893505 1020.0000000 39.0523921 - 254 11 9 1990 22.0000000 48.8592516 1040.0000000 38.1437931 - 255 12 9 1990 22.0000000 47.5402099 998.0000000 37.2967529 - 256 13 9 1990 21.0000000 46.3202196 950.0000000 36.5049914 - 257 14 9 1990 22.0000000 45.1885941 910.0000000 35.7628508 - 258 15 9 1990 22.0000000 44.1359576 863.0000000 35.0653401 - 259 16 9 1990 22.0000000 43.1540680 847.0000000 34.4080476 - 260 17 9 1990 20.0000000 42.2356651 830.0000000 33.7870675 - 261 18 9 1990 22.0000000 41.3743421 854.0000000 33.1989354 - 262 19 9 1990 16.0000000 40.5644346 831.0000000 32.6405734 - 263 20 9 1990 22.0000000 39.8009260 799.0000000 32.1092427 - 264 21 9 1990 19.0000000 50.1501528 790.0000000 40.3725306 - 265 22 9 1990 32.0000000 116.6730652 805.0000000 89.9203968 - 266 23 9 1990 27.0000000 99.7561484 913.0000000 72.0445731 - 267 24 9 1990 45.0000000 76.7819622 998.0000000 54.2180365 - 268 25 9 1990 42.0000000 62.1518533 1150.0000000 47.0293683 - 269 26 9 1990 39.0000000 57.6793944 1390.0000000 44.9517793 - 270 27 9 1990 30.0000000 55.3852152 1420.0000000 43.3652440 - 271 28 9 1990 28.0000000 53.3013492 1290.0000000 41.9160383 - 272 29 9 1990 30.0000000 51.4134012 1180.0000000 40.5885889 - 273 30 9 1990 30.0000000 104.8130575 1110.0000000 96.5290940 - 274 1 10 1990 56.0000000 151.6965657 1130.0000000 124.5536494 - 275 2 10 1990 72.0000000 122.0625285 1110.0000000 92.6050558 - 276 3 10 1990 73.0000000 119.2363290 1290.0000000 95.4470170 - 277 4 10 1990 68.0000000 113.7852927 1440.0000000 88.7698385 - 278 5 10 1990 53.0000000 99.4698219 1360.0000000 80.3404805 - 279 6 10 1990 42.0000000 91.9727353 1320.0000000 74.4481383 - 280 7 10 1990 33.0000000 86.4709990 1390.0000000 70.2166813 - 281 8 10 1990 42.0000000 81.8108966 1300.0000000 66.6345866 - 282 9 10 1990 34.0000000 77.5317925 1190.0000000 63.2972947 - 283 10 10 1990 36.0000000 73.7143928 1120.0000000 60.3280584 - 284 11 10 1990 36.0000000 70.2774284 1110.0000000 57.6494584 - 285 12 10 1990 28.0000000 67.1742288 1070.0000000 55.2261491 - 286 13 10 1990 32.0000000 64.3646061 1020.0000000 53.0276546 - 287 14 10 1990 27.0000000 61.8138381 992.0000000 51.0276179 - 288 15 10 1990 35.0000000 60.1388489 947.0000000 50.2394523 - 289 16 10 1990 42.0000000 60.7332332 906.0000000 50.5283096 - 290 17 10 1990 35.0000000 70.4456600 881.0000000 63.8134224 - 291 18 10 1990 39.0000000 69.4748780 880.0000000 56.4672191 - 292 19 10 1990 34.0000000 59.9696196 872.0000000 50.5134084 - 293 20 10 1990 32.0000000 57.7838195 869.0000000 48.7123114 - 294 21 10 1990 34.0000000 55.7943898 855.0000000 47.0696054 - 295 22 10 1990 27.0000000 53.9712272 825.0000000 45.5631375 - 296 23 10 1990 31.0000000 52.2960359 805.0000000 44.1779461 - 297 24 10 1990 28.0000000 50.7528071 813.0000000 42.9009271 - 298 25 10 1990 25.0000000 50.9966381 803.0000000 43.2039280 - 299 26 10 1990 29.0000000 69.4548396 789.0000000 56.7325470 - 300 27 10 1990 31.0000000 77.9564049 781.0000000 51.7168098 - 301 28 10 1990 65.0000000 210.4411624 786.0000000 138.2605682 - 302 29 10 1990 69.0000000 233.6843272 891.0000000 152.3169716 - 303 30 10 1990 157.0000000 205.6472150 1010.0000000 139.8574504 - 304 31 10 1990 190.0000000 179.5854005 1180.0000000 127.9803703 - 305 1 11 1990 115.0000000 178.2921101 1510.0000000 129.1905465 - 306 2 11 1990 104.0000000 187.5758878 1640.0000000 144.0209761 - 307 3 11 1990 100.0000000 197.2823801 1750.0000000 154.8947728 - 308 4 11 1990 131.0000000 192.4904119 1700.0000000 155.4125325 - 309 5 11 1990 130.0000000 184.4799048 1670.0000000 145.0344487 - 310 6 11 1990 115.0000000 162.3997464 1680.0000000 127.2318637 - 311 7 11 1990 102.0000000 143.6653814 1720.0000000 111.8886028 - 312 8 11 1990 95.0000000 127.8838215 1680.0000000 98.9432200 - 313 9 11 1990 81.0000000 114.8378687 1550.0000000 88.8356494 - 314 10 11 1990 66.0000000 120.1416335 1430.0000000 93.9460511 - 315 11 11 1990 67.0000000 154.6365390 1320.0000000 126.8067902 - 316 12 11 1990 74.0000000 169.4053315 1260.0000000 133.8314628 - 317 13 11 1990 109.0000000 160.0870377 1310.0000000 124.0108563 - 318 14 11 1990 92.0000000 184.7494313 1610.0000000 151.1239596 - 319 15 11 1990 92.0000000 201.0646565 1710.0000000 164.6344399 - 320 16 11 1990 155.0000000 188.1170566 1690.0000000 152.1527270 - 321 17 11 1990 159.0000000 175.2269393 1850.0000000 143.6066071 - 322 18 11 1990 131.0000000 191.7130537 2070.0000000 156.6296543 - 323 19 11 1990 161.0000000 203.7933659 2090.0000000 167.8336406 - 324 20 11 1990 196.0000000 313.8480173 2220.0000000 274.2243614 - 325 21 11 1990 336.0000000 395.4713685 2560.0000000 318.6196942 - 326 22 11 1990 566.0000000 357.4959568 2870.0000000 309.5125490 - 327 23 11 1990 373.0000000 363.5489006 2940.0000000 311.3837212 - 328 24 11 1990 293.0000000 333.5042343 3000.0000000 283.3394455 - 329 25 11 1990 264.0000000 318.0452026 2970.0000000 265.0316535 - 330 26 11 1990 226.0000000 287.3791115 2710.0000000 234.5820648 - 331 27 11 1990 201.0000000 246.1663973 2390.0000000 200.5241962 - 332 28 11 1990 180.0000000 214.2965538 2210.0000000 172.7414213 - 333 29 11 1990 161.0000000 198.8022695 2060.0000000 159.7856783 - 334 30 11 1990 149.0000000 187.4937312 1940.0000000 146.5547131 - 335 1 12 1990 134.0000000 164.7437374 1820.0000000 129.6590271 - 336 2 12 1990 113.0000000 149.7204916 1720.0000000 118.1640026 - 337 3 12 1990 99.0000000 139.4462400 1620.0000000 110.9613726 - 338 4 12 1990 107.0000000 131.7960998 1530.0000000 105.3058589 - 339 5 12 1990 99.0000000 124.9571188 1480.0000000 100.2363838 - 340 6 12 1990 89.0000000 118.6849495 1450.0000000 95.6316182 - 341 7 12 1990 77.0000000 113.0839283 1390.0000000 91.4953507 - 342 8 12 1990 71.0000000 108.0478077 1330.0000000 87.7620851 - 343 9 12 1990 68.0000000 103.5056747 1270.0000000 84.3820311 - 344 10 12 1990 73.0000000 99.3966701 1210.0000000 81.3123733 - 345 11 12 1990 84.0000000 95.6683991 1180.0000000 78.5161793 - 346 12 12 1990 88.0000000 113.7624981 1190.0000000 86.1604657 - 347 13 12 1990 92.0000000 120.7836275 1220.0000000 86.5884658 - 348 14 12 1990 128.0000000 113.0861077 1200.0000000 83.3159135 - 349 15 12 1990 136.0000000 105.8048137 1190.0000000 79.8703330 - 350 16 12 1990 114.0000000 100.9621521 1180.0000000 76.9145313 - 351 17 12 1990 101.0000000 96.6965885 1120.0000000 74.2394693 - 352 18 12 1990 93.0000000 92.8552818 1070.0000000 71.8081434 - 353 19 12 1990 85.0000000 89.3841883 1060.0000000 69.5907110 - 354 20 12 1990 81.0000000 86.2370560 1040.0000000 67.5614799 - 355 21 12 1990 106.0000000 123.5237628 1040.0000000 80.5930825 - 356 22 12 1990 159.0000000 153.4423816 1040.0000000 87.6136506 - 357 23 12 1990 250.0000000 170.4476605 1090.0000000 98.4558199 - 358 24 12 1990 298.0000000 161.7135151 1200.0000000 94.2319077 - 359 25 12 1990 261.0000000 206.2228181 1320.0000000 146.1612114 - 360 26 12 1990 228.0000000 325.9565522 1410.0000000 233.3624740 - 361 27 12 1990 409.0000000 399.4007214 1510.0000000 293.1646918 - 362 28 12 1990 486.0000000 423.8184128 1680.0000000 302.4025158 - 363 29 12 1990 440.0000000 535.0312716 1970.0000000 400.5133870 - 364 30 12 1990 486.0000000 670.8203750 2190.0000000 521.7050391 - 365 31 12 1990 774.0000000 759.8916134 2440.0000000 613.9486444 - 366 1 1 1991 889.0000000 804.1480735 2950.0000000 631.5570284 - 367 2 1 1991 863.0000000 850.8760403 3300.0000000 656.7114600 - 368 3 1 1991 875.0000000 914.0465933 3520.0000000 653.7236091 - 369 4 1 1991 932.0000000 822.5678774 3700.0000000 582.9641375 - 370 5 1 1991 826.0000000 776.1222159 3710.0000000 545.5313656 - 371 6 1 1991 731.0000000 724.5413111 3620.0000000 511.8545703 - 372 7 1 1991 613.0000000 684.1951700 3430.0000000 509.8699233 - 373 8 1 1991 610.0000000 671.5224726 3180.0000000 489.0161019 - 374 9 1 1991 686.0000000 606.2458839 3130.0000000 436.4891571 - 375 10 1 1991 556.0000000 642.5154001 3200.0000000 447.6541459 - 376 11 1 1991 669.0000000 679.5546837 3080.0000000 470.1209660 - 377 12 1 1991 828.0000000 638.4851178 3010.0000000 440.3079511 - 378 13 1 1991 735.0000000 524.8634097 2930.0000000 363.1864589 - 379 14 1 1991 513.0000000 434.3511954 2870.0000000 302.7222220 - 380 15 1 1991 411.0000000 361.5461144 2700.0000000 253.7537347 - 381 16 1 1991 345.0000000 303.0115787 2520.0000000 214.6408425 - 382 17 1 1991 293.0000000 258.9257992 2310.0000000 186.4580675 - 383 18 1 1991 251.0000000 228.2440617 2140.0000000 166.6615632 - 384 19 1 1991 222.0000000 206.7398659 2020.0000000 152.6596761 - 385 20 1 1991 215.0000000 192.2893543 1910.0000000 143.5454412 - 386 21 1 1991 213.0000000 186.8545435 1780.0000000 140.9924109 - 387 22 1 1991 202.0000000 187.1364388 1690.0000000 138.7792883 - 388 23 1 1991 200.0000000 178.5334824 1630.0000000 132.9609304 - 389 24 1 1991 192.0000000 169.5581843 1570.0000000 127.0366202 - 390 25 1 1991 176.0000000 161.3583927 1470.0000000 121.6903264 - 391 26 1 1991 164.0000000 154.0997875 1410.0000000 116.8879649 - 392 27 1 1991 157.0000000 147.4814070 1370.0000000 112.5576685 - 393 28 1 1991 134.0000000 141.5332647 1320.0000000 108.6387379 - 394 29 1 1991 130.0000000 136.1687467 1270.0000000 105.0793460 - 395 30 1 1991 119.0000000 131.3138330 1240.0000000 101.8350919 - 396 31 1 1991 107.0000000 126.9051104 1230.0000000 98.8678148 - 397 1 2 1991 112.0000000 122.8880845 1200.0000000 96.1446168 - 398 2 2 1991 109.0000000 119.2157876 1160.0000000 93.6370549 - 399 3 2 1991 101.0000000 115.8476256 1130.0000000 91.3204697 - 400 4 2 1991 98.0000000 112.7484197 1110.0000000 89.1734255 - 401 5 2 1991 84.0000000 109.8876062 1090.0000000 87.1772420 - 402 6 2 1991 93.0000000 107.2385668 1070.0000000 85.3156013 - 403 7 2 1991 80.0000000 104.7780655 1040.0000000 83.5742158 - 404 8 2 1991 73.0000000 102.4857735 1010.0000000 81.9405484 - 405 9 2 1991 89.0000000 100.3438680 1020.0000000 80.4035750 - 406 10 2 1991 84.0000000 98.3366911 1030.0000000 78.9535818 - 407 11 2 1991 78.0000000 96.4504601 1040.0000000 77.5819937 - 408 12 2 1991 79.0000000 94.6730200 1040.0000000 76.2812260 - 409 13 2 1991 77.0000000 92.9936321 1010.0000000 75.0445585 - 410 14 2 1991 80.0000000 91.4027918 992.0000000 73.8660266 - 411 15 2 1991 72.0000000 89.8920734 976.0000000 72.7403273 - 412 16 2 1991 78.0000000 90.6800396 989.0000000 72.7406720 - 413 17 2 1991 74.0000000 90.2135701 1000.0000000 72.0523042 - 414 18 2 1991 77.0000000 88.4556207 995.0000000 70.9526306 - 415 19 2 1991 73.0000000 98.8551072 978.0000000 82.5324183 - 416 20 2 1991 69.0000000 114.7513295 952.0000000 93.3052708 - 417 21 2 1991 74.0000000 144.7579239 959.0000000 117.0655978 - 418 22 2 1991 81.0000000 157.1608798 959.0000000 124.0166072 - 419 23 2 1991 110.0000000 153.1173133 979.0000000 123.2653148 - 420 24 2 1991 180.0000000 149.3845288 1020.0000000 120.7637647 - 421 25 2 1991 213.0000000 146.8003091 1060.0000000 119.8510172 - 422 26 2 1991 222.0000000 143.5759248 1110.0000000 118.4671392 - 423 27 2 1991 208.0000000 143.5470001 1170.0000000 118.2415651 - 424 28 2 1991 211.0000000 138.2620009 1230.0000000 112.0521787 - 425 1 3 1991 214.0000000 132.9010254 1240.0000000 106.9959697 - 426 2 3 1991 208.0000000 140.9609335 1230.0000000 112.3375998 - 427 3 3 1991 221.0000000 139.8417713 1260.0000000 110.3164663 - 428 4 3 1991 281.0000000 131.1078662 1290.0000000 104.4105965 - 429 5 3 1991 219.0000000 125.6792319 1310.0000000 100.4220701 - 430 6 3 1991 190.0000000 120.8347092 1360.0000000 96.8039843 - 431 7 3 1991 173.0000000 116.4602453 1340.0000000 93.5113266 - 432 8 3 1991 164.0000000 112.7019290 1310.0000000 90.9333667 - 433 9 3 1991 142.0000000 110.3229396 1290.0000000 89.7466198 - 434 10 3 1991 133.0000000 109.9064751 1300.0000000 89.8972717 - 435 11 3 1991 133.0000000 106.8114250 1310.0000000 87.1486256 - 436 12 3 1991 118.0000000 103.5315681 1350.0000000 84.4729263 - 437 13 3 1991 127.0000000 100.5588298 1340.0000000 82.1794955 - 438 14 3 1991 113.0000000 97.8220315 1320.0000000 80.0596441 - 439 15 3 1991 107.0000000 95.2924564 1300.0000000 78.0944608 - 440 16 3 1991 100.0000000 92.9476045 1280.0000000 76.2674145 - 441 17 3 1991 100.0000000 90.7677650 1230.0000000 74.5640013 - 442 18 3 1991 95.0000000 88.7486515 1180.0000000 72.9714666 - 443 19 3 1991 98.0000000 144.7617042 1160.0000000 111.9885767 - 444 20 3 1991 119.0000000 153.4645245 1180.0000000 107.4231798 - 445 21 3 1991 159.0000000 168.6962849 1260.0000000 122.6474427 - 446 22 3 1991 196.0000000 183.5793588 1410.0000000 130.8178245 - 447 23 3 1991 242.0000000 167.2782454 1530.0000000 121.4371220 - 448 24 3 1991 216.0000000 154.2404434 1700.0000000 113.2549838 - 449 25 3 1991 180.0000000 145.1453653 1830.0000000 107.7890147 - 450 26 3 1991 145.0000000 137.8297636 1720.0000000 103.6109475 - 451 27 3 1991 127.0000000 132.7280673 1600.0000000 100.5322061 - 452 28 3 1991 117.0000000 126.0397821 1520.0000000 95.9905366 - 453 29 3 1991 109.0000000 120.5090980 1500.0000000 92.3485060 - 454 30 3 1991 106.0000000 115.5334904 1490.0000000 89.0480161 - 455 31 3 1991 99.0000000 111.0420976 1440.0000000 86.0469862 - 456 1 4 1991 96.0000000 106.9744231 1380.0000000 83.3092439 - 457 2 4 1991 88.0000000 103.2785278 1330.0000000 80.8035962 - 458 3 4 1991 87.0000000 99.9096810 1290.0000000 78.5030635 - 459 4 4 1991 82.0000000 97.2590310 1270.0000000 76.6983088 - 460 5 4 1991 84.0000000 95.2796879 1220.0000000 75.2418442 - 461 6 4 1991 67.0000000 92.5146413 1180.0000000 73.2542049 - 462 7 4 1991 89.0000000 90.1495729 1190.0000000 71.5837196 - 463 8 4 1991 75.0000000 88.1026691 1230.0000000 70.1494926 - 464 9 4 1991 79.0000000 86.0751823 1230.0000000 68.7120330 - 465 10 4 1991 70.0000000 84.0667994 1230.0000000 67.2869267 - 466 11 4 1991 69.0000000 82.1790947 1220.0000000 65.9410655 - 467 12 4 1991 69.0000000 80.4155658 1200.0000000 64.6748201 - 468 13 4 1991 56.0000000 78.7647096 1150.0000000 63.4832271 - 469 14 4 1991 63.0000000 77.2279056 1110.0000000 62.3706633 - 470 15 4 1991 58.0000000 75.7687310 1080.0000000 61.2972182 - 471 16 4 1991 56.0000000 74.3867052 1060.0000000 60.2788629 - 472 17 4 1991 54.0000000 73.0797216 1030.0000000 59.3090564 - 473 18 4 1991 57.0000000 71.8637352 1020.0000000 58.3914123 - 474 19 4 1991 53.0000000 71.9111157 1000.0000000 58.7845495 - 475 20 4 1991 53.0000000 71.6553992 1040.0000000 58.7757272 - 476 21 4 1991 65.0000000 70.5011400 1050.0000000 57.3025335 - 477 22 4 1991 69.0000000 72.3683089 1000.0000000 58.3034326 - 478 23 4 1991 61.0000000 74.1034286 1010.0000000 59.0629198 - 479 24 4 1991 56.0000000 70.6949901 1030.0000000 56.9942668 - 480 25 4 1991 56.0000000 69.0832751 1050.0000000 56.0142124 - 481 26 4 1991 53.0000000 67.8885871 1020.0000000 55.1426537 - 482 27 4 1991 49.0000000 66.7726527 1020.0000000 54.3132134 - 483 28 4 1991 53.0000000 65.7751189 1010.0000000 53.5970832 - 484 29 4 1991 48.0000000 69.0009060 982.0000000 54.5368378 - 485 30 4 1991 57.0000000 114.6996433 983.0000000 93.9891067 - 486 1 5 1991 69.0000000 109.9759806 1090.0000000 80.7038510 - 487 2 5 1991 89.0000000 87.4171614 1140.0000000 69.2756999 - 488 3 5 1991 105.0000000 83.8675401 1190.0000000 66.7626501 - 489 4 5 1991 79.0000000 81.4037637 1270.0000000 65.0757934 - 490 5 5 1991 69.0000000 79.4430930 1260.0000000 63.8951780 - 491 6 5 1991 71.0000000 77.6192231 1250.0000000 62.4504677 - 492 7 5 1991 60.0000000 75.3094062 1210.0000000 60.7308460 - 493 8 5 1991 64.0000000 73.3640129 1200.0000000 59.3028400 - 494 9 5 1991 59.0000000 71.5697740 1190.0000000 57.9698097 - 495 10 5 1991 57.0000000 72.5106157 1130.0000000 60.7702393 - 496 11 5 1991 55.0000000 74.3855020 1090.0000000 60.9654921 - 497 12 5 1991 53.0000000 70.8927377 1080.0000000 58.4485489 - 498 13 5 1991 52.0000000 68.9619684 1320.0000000 56.8235665 - 499 14 5 1991 50.0000000 68.3005213 1920.0000000 56.8852237 - 500 15 5 1991 52.0000000 73.0571511 2050.0000000 63.1454431 - 501 16 5 1991 54.0000000 73.5976353 1820.0000000 61.1479907 - 502 17 5 1991 54.0000000 68.6067891 1720.0000000 57.3741028 - 503 18 5 1991 55.0000000 67.1098957 1730.0000000 56.1461081 - 504 19 5 1991 48.0000000 65.7220069 1730.0000000 54.9955040 - 505 20 5 1991 48.0000000 64.4134708 1720.0000000 53.9093540 - 506 21 5 1991 49.0000000 63.1769513 1700.0000000 52.8820483 - 507 22 5 1991 41.0000000 62.0061389 1610.0000000 51.9085283 - 508 23 5 1991 40.0000000 60.8953515 1530.0000000 50.9842264 - 509 24 5 1991 40.0000000 59.8394669 1470.0000000 50.1050140 - 510 25 5 1991 39.0000000 58.8338624 1410.0000000 49.2671569 - 511 26 5 1991 43.0000000 57.8743628 1360.0000000 48.4672739 - 512 27 5 1991 39.0000000 56.9571931 1320.0000000 47.7023014 - 513 28 5 1991 36.0000000 56.0789371 1260.0000000 46.9694615 - 514 29 5 1991 33.0000000 55.2365010 1250.0000000 46.2662331 - 515 30 5 1991 39.0000000 54.4270800 1230.0000000 45.5903264 - 516 31 5 1991 34.0000000 53.6481299 1220.0000000 44.9396609 - 517 1 6 1991 37.0000000 52.8973406 1190.0000000 44.3123439 - 518 2 6 1991 35.0000000 52.1726129 1160.0000000 43.7066535 - 519 3 6 1991 29.0000000 51.4720383 1130.0000000 43.1210210 - 520 4 6 1991 33.0000000 50.7938797 1120.0000000 42.5540174 - 521 5 6 1991 34.0000000 50.7457278 1150.0000000 42.6882193 - 522 6 6 1991 32.0000000 69.9740742 1200.0000000 49.7047624 - 523 7 6 1991 38.0000000 71.0549696 1260.0000000 55.1187328 - 524 8 6 1991 39.0000000 60.6460107 1330.0000000 47.1193877 - 525 9 6 1991 41.0000000 60.2164145 1390.0000000 51.2494167 - 526 10 6 1991 44.0000000 72.1449033 1380.0000000 51.5319680 - 527 11 6 1991 48.0000000 57.3781300 1460.0000000 44.5918617 - 528 12 6 1991 42.0000000 54.3154628 1500.0000000 43.7042504 - 529 13 6 1991 37.0000000 53.3386994 1510.0000000 42.9380251 - 530 14 6 1991 39.0000000 52.8512807 1480.0000000 42.2260722 - 531 15 6 1991 35.0000000 52.4429546 1450.0000000 42.7118658 - 532 16 6 1991 31.0000000 55.5104653 1440.0000000 47.0454542 - 533 17 6 1991 33.0000000 58.8780236 1410.0000000 49.4757563 - 534 18 6 1991 31.0000000 55.7969120 1580.0000000 46.2162577 - 535 19 6 1991 28.0000000 52.7774035 2060.0000000 43.6435395 - 536 20 6 1991 60.0000000 91.3017630 2540.0000000 72.3906238 - 537 21 6 1991 48.0000000 76.2477243 2650.0000000 54.1277860 - 538 22 6 1991 54.0000000 63.0352486 2550.0000000 50.5288746 - 539 23 6 1991 63.0000000 69.3693922 2470.0000000 51.4936412 - 540 24 6 1991 41.0000000 62.8005554 2420.0000000 47.3245942 - 541 25 6 1991 42.0000000 58.4431491 2340.0000000 46.0412290 - 542 26 6 1991 43.0000000 57.0744107 2280.0000000 45.2848819 - 543 27 6 1991 38.0000000 67.6746629 2170.0000000 49.7748585 - 544 28 6 1991 38.0000000 65.8656132 2140.0000000 50.9444221 - 545 29 6 1991 35.0000000 58.7452473 2160.0000000 46.2757134 - 546 30 6 1991 41.0000000 56.2785591 2210.0000000 44.4505902 - 547 1 7 1991 41.0000000 54.7386818 2240.0000000 43.4146838 - 548 2 7 1991 38.0000000 53.3153404 2240.0000000 42.4460640 - 549 3 7 1991 34.0000000 51.9932797 2150.0000000 41.5381554 - 550 4 7 1991 27.0000000 50.7621066 2020.0000000 40.6851352 - 551 5 7 1991 31.0000000 49.6126415 1910.0000000 39.8818184 - 552 6 7 1991 30.0000000 48.5563820 1840.0000000 39.1235808 - 553 7 7 1991 26.0000000 57.7891081 1760.0000000 48.5986874 - 554 8 7 1991 30.0000000 54.5057109 1690.0000000 42.3270864 - 555 9 7 1991 31.0000000 47.9964662 1640.0000000 38.7743566 - 556 10 7 1991 23.0000000 46.9641829 1660.0000000 38.0271618 - 557 11 7 1991 35.0000000 45.9958531 1660.0000000 37.3215080 - 558 12 7 1991 19.0000000 47.6427963 1640.0000000 40.1013622 - 559 13 7 1991 24.0000000 77.0417653 1620.0000000 63.1565576 - 560 14 7 1991 26.0000000 68.7046970 1640.0000000 51.7997716 - 561 15 7 1991 27.0000000 52.8244021 1680.0000000 42.8771332 - 562 16 7 1991 41.0000000 49.4136621 1690.0000000 40.2513273 - 563 17 7 1991 34.0000000 48.1746655 1710.0000000 39.3145557 - 564 18 7 1991 27.0000000 47.0813521 1690.0000000 38.4758259 - 565 19 7 1991 25.0000000 46.0821989 1620.0000000 37.6881906 - 566 20 7 1991 23.0000000 45.0695255 1680.0000000 36.9148843 - 567 21 7 1991 22.0000000 44.1155065 1670.0000000 36.1850665 - 568 22 7 1991 27.0000000 43.2189763 1590.0000000 35.4965197 - 569 23 7 1991 23.0000000 42.3957831 1550.0000000 34.8824131 - 570 24 7 1991 21.0000000 44.9112931 1520.0000000 37.9806704 - 571 25 7 1991 23.0000000 69.8913457 1520.0000000 55.8608762 - 572 26 7 1991 33.0000000 62.2815190 1550.0000000 47.9914196 - 573 27 7 1991 23.0000000 48.7892829 1580.0000000 39.9044617 - 574 28 7 1991 29.0000000 45.1271609 1630.0000000 37.1266866 - 575 29 7 1991 30.0000000 44.0382821 1750.0000000 36.2750516 - 576 30 7 1991 35.0000000 60.5614190 1720.0000000 50.2587431 - 577 31 7 1991 27.0000000 57.3683287 1620.0000000 44.8907585 - 578 1 8 1991 45.0000000 46.0192715 1570.0000000 38.0548413 - 579 2 8 1991 47.0000000 44.7880741 1620.0000000 37.0813517 - 580 3 8 1991 40.0000000 43.6897702 1620.0000000 36.2100436 - 581 4 8 1991 35.0000000 42.6658925 1520.0000000 35.3956821 - 582 5 8 1991 26.0000000 41.7090012 1500.0000000 34.6326979 - 583 6 8 1991 23.0000000 40.8125097 1460.0000000 33.9161435 - 584 7 8 1991 30.0000000 42.5360863 1410.0000000 33.4914693 - 585 8 8 1991 33.0000000 42.4856367 1380.0000000 32.7685483 - 586 9 8 1991 30.0000000 39.5044024 1330.0000000 32.1452980 - 587 10 8 1991 28.0000000 38.3236361 1300.0000000 31.5633247 - 588 11 8 1991 19.0000000 37.6056546 1270.0000000 31.0112003 - 589 12 8 1991 20.0000000 36.9260242 1220.0000000 30.4862780 - 590 13 8 1991 16.0000000 36.2812667 1190.0000000 29.9861844 - 591 14 8 1991 18.0000000 35.6682710 1180.0000000 29.5087888 - 592 15 8 1991 18.0000000 35.0842506 1160.0000000 29.0521759 - 593 16 8 1991 20.0000000 34.5267064 1140.0000000 28.6146217 - 594 17 8 1991 16.0000000 33.9933942 1120.0000000 28.1945732 - 595 18 8 1991 15.0000000 33.4822961 1100.0000000 27.7906292 - 596 19 8 1991 15.0000000 32.9915954 1060.0000000 27.4015244 - 597 20 8 1991 14.0000000 32.5196548 1030.0000000 27.0261152 - 598 21 8 1991 15.0000000 32.0649971 1020.0000000 26.6633663 - 599 22 8 1991 13.0000000 31.6414562 1010.0000000 26.3346273 - 600 23 8 1991 12.0000000 31.9658393 999.0000000 26.7943511 - 601 24 8 1991 11.0000000 31.1994720 1000.0000000 26.0061308 - 602 25 8 1991 12.0000000 30.4890306 1020.0000000 25.4147419 - 603 26 8 1991 11.0000000 30.0976746 983.0000000 25.0976832 - 604 27 8 1991 13.0000000 29.7178791 956.0000000 24.7892276 - 605 28 8 1991 11.0000000 29.3486787 927.0000000 24.4888085 - 606 29 8 1991 12.0000000 28.9893640 914.0000000 24.1959097 - 607 30 8 1991 12.0000000 28.6392892 895.0000000 23.9100605 - 608 31 8 1991 11.0000000 28.2978658 875.0000000 23.6308310 - 609 1 9 1991 11.0000000 30.9724203 850.0000000 27.0954514 - 610 2 9 1991 17.0000000 30.3894063 813.0000000 25.1638862 - 611 3 9 1991 11.0000000 27.5724955 777.0000000 23.0731625 - 612 4 9 1991 12.0000000 27.2446903 791.0000000 22.8016229 - 613 5 9 1991 11.0000000 26.9249411 786.0000000 22.5363339 - 614 6 9 1991 11.0000000 26.6124533 778.0000000 22.2769205 - 615 7 9 1991 18.0000000 26.3067982 777.0000000 22.0230408 - 616 8 9 1991 11.0000000 26.0075845 765.0000000 21.7743823 - 617 9 9 1991 13.0000000 25.7144543 726.0000000 21.5306593 - 618 10 9 1991 12.0000000 27.1231387 726.0000000 23.2817596 - 619 11 9 1991 11.0000000 56.2113447 733.0000000 60.6997797 - 620 12 9 1991 20.0000000 48.8652340 738.0000000 34.0671959 - 621 13 9 1991 21.0000000 27.6977687 790.0000000 23.5136354 - 622 14 9 1991 29.0000000 27.2233791 829.0000000 23.0981252 - 623 15 9 1991 28.0000000 26.7735185 832.0000000 22.7037641 - 624 16 9 1991 20.0000000 26.3451274 776.0000000 22.3293555 - 625 17 9 1991 20.0000000 25.9365296 748.0000000 21.9724452 - 626 18 9 1991 20.0000000 25.5444348 745.0000000 21.6307311 - 627 19 9 1991 12.0000000 25.1683323 770.0000000 21.3035968 - 628 20 9 1991 11.0000000 24.8069555 761.0000000 20.9898386 - 629 21 9 1991 11.0000000 24.4591052 724.0000000 20.6883495 - 630 22 9 1991 22.0000000 48.1342493 714.0000000 53.5936830 - 631 23 9 1991 14.0000000 46.9169337 753.0000000 33.8558410 - 632 24 9 1991 48.0000000 27.3101012 870.0000000 23.5301397 - 633 25 9 1991 45.0000000 88.6315933 905.0000000 70.7618639 - 634 26 9 1991 80.0000000 90.3541920 894.0000000 70.5761096 - 635 27 9 1991 61.0000000 69.2252224 870.0000000 55.9625406 - 636 28 9 1991 61.0000000 95.2533098 900.0000000 76.2662601 - 637 29 9 1991 65.0000000 94.9922112 983.0000000 82.6189541 - 638 30 9 1991 63.0000000 83.2312984 1020.0000000 67.6247877 - 639 1 10 1991 90.0000000 66.5408305 1010.0000000 57.5605416 - 640 2 10 1991 59.0000000 61.7854127 998.0000000 53.5503375 - 641 3 10 1991 45.0000000 57.9328818 1040.0000000 50.1510630 - 642 4 10 1991 42.0000000 54.5783555 1050.0000000 47.2155315 - 643 5 10 1991 41.0000000 100.8386609 1070.0000000 95.2269445 - 644 6 10 1991 41.0000000 108.1845183 1090.0000000 84.5057976 - 645 7 10 1991 73.0000000 78.5028192 1100.0000000 66.9160771 - 646 8 10 1991 96.0000000 70.5665007 1080.0000000 61.2466037 - 647 9 10 1991 61.0000000 66.1425676 1090.0000000 57.3935175 - 648 10 10 1991 44.0000000 62.2116842 1050.0000000 53.9721076 - 649 11 10 1991 42.0000000 58.9517281 1010.0000000 51.3003641 - 650 12 10 1991 41.0000000 83.9112615 986.0000000 76.1216636 - 651 13 10 1991 42.0000000 83.5517021 954.0000000 67.8578407 - 652 14 10 1991 61.0000000 65.8003152 950.0000000 57.4384736 - 653 15 10 1991 55.0000000 62.1846853 987.0000000 54.2862038 - 654 16 10 1991 41.0000000 64.6603387 979.0000000 54.0703188 - 655 17 10 1991 48.0000000 80.9626665 960.0000000 71.4269212 - 656 18 10 1991 52.0000000 105.5648706 977.0000000 85.3819145 - 657 19 10 1991 66.0000000 89.6597040 975.0000000 72.5172470 - 658 20 10 1991 59.0000000 79.3837948 966.0000000 67.9314194 - 659 21 10 1991 71.0000000 74.9188104 973.0000000 63.7179159 - 660 22 10 1991 74.0000000 69.2727847 962.0000000 59.2961356 - 661 23 10 1991 70.0000000 65.4500384 953.0000000 56.1008576 - 662 24 10 1991 59.0000000 62.0695976 940.0000000 53.2824753 - 663 25 10 1991 57.0000000 59.0406788 915.0000000 50.7449004 - 664 26 10 1991 57.0000000 56.3074574 877.0000000 48.4536368 - 665 27 10 1991 51.0000000 53.8346546 851.0000000 46.3795808 - 666 28 10 1991 47.0000000 51.5951494 824.0000000 44.5012936 - 667 29 10 1991 48.0000000 49.5577631 815.0000000 42.7888034 - 668 30 10 1991 45.0000000 52.8875471 788.0000000 48.2439847 - 669 31 10 1991 43.0000000 55.2207637 790.0000000 46.2901767 - 670 1 11 1991 40.0000000 65.9348487 776.0000000 50.3722472 - 671 2 11 1991 47.0000000 70.1450870 781.0000000 60.2223372 - 672 3 11 1991 46.0000000 98.1286333 785.0000000 94.4941469 - 673 4 11 1991 76.0000000 134.0003790 802.0000000 110.4279348 - 674 5 11 1991 60.0000000 125.9307764 840.0000000 108.5500055 - 675 6 11 1991 132.0000000 117.8428492 970.0000000 99.5966451 - 676 7 11 1991 133.0000000 124.8098773 1160.0000000 102.1310920 - 677 8 11 1991 113.0000000 149.3417840 1190.0000000 129.3716319 - 678 9 11 1991 120.0000000 159.1002098 1190.0000000 135.5498874 - 679 10 11 1991 141.0000000 141.2317030 1210.0000000 119.9297689 - 680 11 11 1991 208.0000000 167.2950731 1180.0000000 138.1762278 - 681 12 11 1991 166.0000000 228.5968448 1240.0000000 174.8867601 - 682 13 11 1991 183.0000000 301.9673879 1220.0000000 285.2838353 - 683 14 11 1991 299.0000000 446.2402804 1240.0000000 388.0408073 - 684 15 11 1991 521.0000000 416.2583716 1480.0000000 352.7336692 - 685 16 11 1991 443.0000000 357.0229237 1820.0000000 303.5817123 - 686 17 11 1991 304.0000000 303.3585671 1750.0000000 254.7085030 - 687 18 11 1991 231.0000000 294.1395532 1610.0000000 246.4486718 - 688 19 11 1991 192.0000000 291.0968812 1570.0000000 241.1661110 - 689 20 11 1991 199.0000000 264.3182533 1560.0000000 223.8602754 - 690 21 11 1991 201.0000000 242.1190148 1630.0000000 201.0238836 - 691 22 11 1991 173.0000000 207.3306977 1620.0000000 170.4540570 - 692 23 11 1991 159.0000000 179.5676969 1580.0000000 147.1686400 - 693 24 11 1991 160.0000000 159.0154800 1480.0000000 130.0201160 - 694 25 11 1991 146.0000000 142.0302056 1350.0000000 115.6912202 - 695 26 11 1991 110.0000000 127.5753386 1240.0000000 103.5707695 - 696 27 11 1991 114.0000000 116.9291688 1180.0000000 95.7580783 - 697 28 11 1991 97.0000000 110.2366096 1160.0000000 90.7835284 - 698 29 11 1991 89.0000000 104.4944188 1110.0000000 86.4207797 - 699 30 11 1991 73.0000000 99.3429062 1060.0000000 82.4936824 - 700 1 12 1991 69.0000000 94.7074906 1010.0000000 78.9483211 - 701 2 12 1991 67.0000000 90.5246447 968.0000000 75.7383433 - 702 3 12 1991 63.0000000 86.7396602 939.0000000 72.8237692 - 703 4 12 1991 58.0000000 83.3052823 926.0000000 70.1700114 - 704 5 12 1991 59.0000000 80.1805775 913.0000000 67.7470619 - 705 6 12 1991 53.0000000 77.3299924 892.0000000 65.5288149 - 706 7 12 1991 54.0000000 74.7225670 865.0000000 63.4925008 - 707 8 12 1991 51.0000000 72.3312753 847.0000000 61.6182112 - 708 9 12 1991 47.0000000 70.1324703 825.0000000 59.8884986 - 709 10 12 1991 42.0000000 68.1054162 791.0000000 58.2880386 - 710 11 12 1991 40.0000000 66.2318909 785.0000000 56.8033426 - 711 12 12 1991 39.0000000 64.4958496 793.0000000 55.4225143 - 712 13 12 1991 36.0000000 62.8831370 784.0000000 54.1350417 - 713 14 12 1991 37.0000000 61.3812420 760.0000000 52.9316187 - 714 15 12 1991 32.0000000 59.9790872 746.0000000 51.8039926 - 715 16 12 1991 37.0000000 71.4890949 726.0000000 69.9157701 - 716 17 12 1991 62.0000000 174.5588785 754.0000000 141.9435705 - 717 18 12 1991 118.0000000 219.1911151 802.0000000 184.7308762 - 718 19 12 1991 170.0000000 306.3797538 918.0000000 282.6692249 - 719 20 12 1991 229.0000000 410.7381638 1170.0000000 347.2168446 - 720 21 12 1991 448.0000000 501.2915185 1540.0000000 467.5430574 - 721 22 12 1991 464.0000000 675.7117371 1920.0000000 582.3731576 - 722 23 12 1991 675.0000000 612.3948534 2540.0000000 522.5816636 - 723 24 12 1991 844.0000000 530.0329285 3460.0000000 448.3079331 - 724 25 12 1991 569.0000000 439.1061155 3930.0000000 370.6955782 - 725 26 12 1991 358.0000000 367.3406817 3740.0000000 309.7906349 - 726 27 12 1991 279.0000000 314.2565383 3170.0000000 264.5721823 - 727 28 12 1991 238.0000000 269.9516794 2670.0000000 225.3230586 - 728 29 12 1991 201.0000000 231.9672058 2340.0000000 192.2408934 - 729 30 12 1991 185.0000000 201.8422263 2090.0000000 166.6242032 - 730 31 12 1991 165.0000000 178.6566299 1870.0000000 146.9645721 - 731 1 1 1992 140.0000000 160.4199134 1700.0000000 131.8238117 - 732 2 1 1992 126.0000000 145.9062913 1570.0000000 120.1631725 - 733 3 1 1992 117.0000000 136.0596741 1490.0000000 112.5122024 - 734 4 1 1992 114.0000000 131.4919586 1390.0000000 107.3909154 - 735 5 1 1992 108.0000000 127.0517934 1340.0000000 103.6498010 - 736 6 1 1992 108.0000000 120.3951301 1340.0000000 99.1629089 - 737 7 1 1992 101.0000000 115.0202051 1320.0000000 95.2494863 - 738 8 1 1992 97.0000000 112.7745916 1330.0000000 91.9169779 - 739 9 1 1992 89.0000000 129.3733855 1290.0000000 113.6941327 - 740 10 1 1992 111.0000000 161.6931098 1260.0000000 135.5650162 - 741 11 1 1992 135.0000000 156.7022291 1290.0000000 127.0617359 - 742 12 1 1992 171.0000000 142.0959482 1380.0000000 118.1791587 - 743 13 1 1992 125.0000000 134.2869643 1430.0000000 112.1241297 - 744 14 1 1992 111.0000000 127.4251655 1330.0000000 106.7607042 - 745 15 1 1992 100.0000000 121.3215219 1240.0000000 102.0315939 - 746 16 1 1992 87.0000000 115.9844737 1190.0000000 97.8288373 - 747 17 1 1992 75.0000000 111.0538086 1160.0000000 93.9365729 - 748 18 1 1992 79.0000000 106.5773786 1110.0000000 90.4092574 - 749 19 1 1992 70.0000000 108.7468845 1090.0000000 87.2104253 - 750 20 1 1992 72.0000000 105.8970101 1080.0000000 87.1279614 - 751 21 1 1992 87.0000000 102.9581176 1090.0000000 84.5760728 - 752 22 1 1992 79.0000000 98.6006856 1060.0000000 81.7882662 - 753 23 1 1992 71.0000000 95.1727091 1030.0000000 79.2756759 - 754 24 1 1992 66.0000000 92.0487390 992.0000000 76.9724043 - 755 25 1 1992 67.0000000 89.1927981 971.0000000 74.8542909 - 756 26 1 1992 65.0000000 86.5737432 941.0000000 72.9003527 - 757 27 1 1992 59.0000000 84.1645409 916.0000000 71.0923193 - 758 28 1 1992 57.0000000 81.9797139 906.0000000 69.4566696 - 759 29 1 1992 54.0000000 80.3849185 890.0000000 68.3361726 - 760 30 1 1992 59.0000000 82.2639063 884.0000000 71.8298298 - 761 31 1 1992 57.0000000 89.4962090 879.0000000 79.8963112 - 762 1 2 1992 56.0000000 91.3029030 867.0000000 79.7798917 - 763 2 2 1992 54.0000000 89.3067442 851.0000000 77.5600002 - 764 3 2 1992 58.0000000 87.2440025 837.0000000 76.7604817 - 765 4 2 1992 63.0000000 142.5145458 839.0000000 134.1400736 - 766 5 2 1992 76.0000000 182.8626877 873.0000000 164.9122629 - 767 6 2 1992 250.0000000 207.7115556 985.0000000 185.3554166 - 768 7 2 1992 346.0000000 181.9353500 1360.0000000 159.1533191 - 769 8 2 1992 241.0000000 162.2491213 1740.0000000 141.7564413 - 770 9 2 1992 180.0000000 158.9018697 1610.0000000 139.4119153 - 771 10 2 1992 164.0000000 166.9729762 1420.0000000 139.7287480 - 772 11 2 1992 183.0000000 187.2375645 1320.0000000 151.8765274 - 773 12 2 1992 215.0000000 216.1305190 1360.0000000 173.6804993 - 774 13 2 1992 265.0000000 230.1541144 1460.0000000 188.6289729 - 775 14 2 1992 287.0000000 244.5619281 1550.0000000 193.0430203 - 776 15 2 1992 272.0000000 245.0797989 1650.0000000 200.9906929 - 777 16 2 1992 253.0000000 274.0860581 1730.0000000 222.7322200 - 778 17 2 1992 301.0000000 264.3330602 1680.0000000 207.9621135 - 779 18 2 1992 275.0000000 225.7728019 1760.0000000 177.7707639 - 780 19 2 1992 224.0000000 196.8316564 1780.0000000 154.6242471 - 781 20 2 1992 194.0000000 174.9947330 1670.0000000 137.8733839 - 782 21 2 1992 173.0000000 159.8527536 1520.0000000 126.5277222 - 783 22 2 1992 157.0000000 149.9352492 1420.0000000 119.8206981 - 784 23 2 1992 142.0000000 142.7808239 1370.0000000 115.4823887 - 785 24 2 1992 133.0000000 137.9621139 1300.0000000 112.4081922 - 786 25 2 1992 128.0000000 131.7609730 1260.0000000 107.4042684 - 787 26 2 1992 125.0000000 125.2901219 1250.0000000 102.7817380 - 788 27 2 1992 125.0000000 119.8424544 1230.0000000 98.7833921 - 789 28 2 1992 110.0000000 114.9423452 1210.0000000 95.1561135 - 790 29 2 1992 107.0000000 110.5042929 1180.0000000 91.8544821 - 791 1 3 1992 97.0000000 106.5266330 1160.0000000 88.8401527 - 792 2 3 1992 97.0000000 104.6738235 1120.0000000 89.0433434 - 793 3 3 1992 86.0000000 105.3036162 1090.0000000 88.9335996 - 794 4 3 1992 93.0000000 100.4190153 1080.0000000 85.0495233 - 795 5 3 1992 86.0000000 97.2941715 1080.0000000 82.6017860 - 796 6 3 1992 82.0000000 94.4340207 1070.0000000 80.3432317 - 797 7 3 1992 80.0000000 91.7733421 1060.0000000 78.2534299 - 798 8 3 1992 77.0000000 89.3129690 1040.0000000 76.3144729 - 799 9 3 1992 73.0000000 87.0333508 1040.0000000 74.5106148 - 800 10 3 1992 76.0000000 84.9728271 1010.0000000 72.8530388 - 801 11 3 1992 68.0000000 83.2003858 987.0000000 71.3534709 - 802 12 3 1992 70.0000000 140.1450225 984.0000000 112.7076609 - 803 13 3 1992 116.0000000 207.6259648 1020.0000000 171.0525777 - 804 14 3 1992 206.0000000 252.1225526 1290.0000000 215.9519364 - 805 15 3 1992 433.0000000 306.8013925 1560.0000000 271.3107576 - 806 16 3 1992 495.0000000 328.8533364 1880.0000000 275.8429071 - 807 17 3 1992 331.0000000 277.8228129 2360.0000000 230.5729652 - 808 18 3 1992 240.0000000 239.5660464 2650.0000000 198.0683132 - 809 19 3 1992 215.0000000 209.0816514 2430.0000000 171.8534172 - 810 20 3 1992 185.0000000 185.0051786 2130.0000000 151.6329644 - 811 21 3 1992 185.0000000 176.2114859 1930.0000000 143.1309345 - 812 22 3 1992 185.0000000 237.7167312 1850.0000000 216.2864266 - 813 23 3 1992 213.0000000 344.8847451 1930.0000000 298.8172326 - 814 24 3 1992 466.0000000 384.5435938 2390.0000000 343.8832220 - 815 25 3 1992 580.0000000 402.7624661 2850.0000000 344.5562579 - 816 26 3 1992 566.0000000 370.2058037 3180.0000000 309.9339825 - 817 27 3 1992 487.0000000 329.3058956 3120.0000000 277.2972174 - 818 28 3 1992 387.0000000 297.8359666 2860.0000000 249.8633550 - 819 29 3 1992 311.0000000 262.9366582 2570.0000000 219.0851315 - 820 30 3 1992 270.0000000 233.0880360 2360.0000000 193.3932412 - 821 31 3 1992 246.0000000 220.4084710 2200.0000000 193.4832699 - 822 1 4 1992 229.0000000 236.9692252 2090.0000000 203.8185161 - 823 2 4 1992 222.0000000 229.7389700 2040.0000000 190.5647429 - 824 3 4 1992 217.0000000 246.8613757 2050.0000000 228.5547872 - 825 4 4 1992 208.0000000 304.3064063 2010.0000000 272.1365883 - 826 5 4 1992 220.0000000 280.2061018 2110.0000000 243.6565023 - 827 6 4 1992 210.0000000 245.1584999 2470.0000000 211.2446948 - 828 7 4 1992 190.0000000 215.7627403 2560.0000000 184.9267718 - 829 8 4 1992 173.0000000 191.5499535 2460.0000000 163.3759372 - 830 9 4 1992 166.0000000 172.4350117 2280.0000000 146.8633974 - 831 10 4 1992 133.0000000 157.5887412 2090.0000000 133.8758144 - 832 11 4 1992 126.0000000 145.0944176 1930.0000000 123.1991634 - 833 12 4 1992 124.0000000 136.7885205 1820.0000000 116.8832232 - 834 13 4 1992 116.0000000 131.2975536 1680.0000000 112.5086697 - 835 14 4 1992 112.0000000 134.1869039 1600.0000000 117.7039699 - 836 15 4 1992 111.0000000 168.7263189 1580.0000000 151.4800024 - 837 16 4 1992 137.0000000 177.9921352 1560.0000000 150.3096977 - 838 17 4 1992 206.0000000 168.4423048 1570.0000000 145.3099987 - 839 18 4 1992 176.0000000 166.2859217 1580.0000000 140.4640890 - 840 19 4 1992 161.0000000 153.6920542 1530.0000000 131.0461215 - 841 20 4 1992 161.0000000 146.1215493 1470.0000000 124.9601864 - 842 21 4 1992 139.0000000 139.6482101 1470.0000000 119.6919732 - 843 22 4 1992 139.0000000 133.8413712 1470.0000000 114.9506185 - 844 23 4 1992 123.0000000 128.6035200 1490.0000000 110.6675811 - 845 24 4 1992 119.0000000 123.8630002 1480.0000000 106.7850482 - 846 25 4 1992 111.0000000 119.5585453 1500.0000000 103.2535259 - 847 26 4 1992 94.0000000 115.7850482 1550.0000000 100.2087894 - 848 27 4 1992 94.0000000 116.9273224 1530.0000000 103.3971719 - 849 28 4 1992 102.0000000 121.1275173 1560.0000000 106.7188652 - 850 29 4 1992 120.0000000 118.8918604 1600.0000000 103.9583527 - 851 30 4 1992 120.0000000 114.0148739 1670.0000000 99.6239563 - 852 1 5 1992 114.0000000 143.0584224 1780.0000000 137.1466666 - 853 2 5 1992 115.0000000 157.6386726 1830.0000000 134.5034570 - 854 3 5 1992 206.0000000 138.3892655 1890.0000000 122.1977869 - 855 4 5 1992 215.0000000 131.0434406 1870.0000000 115.8998296 - 856 5 5 1992 125.0000000 125.8937363 1820.0000000 111.3996960 - 857 6 5 1992 123.0000000 121.2503835 1740.0000000 107.3288562 - 858 7 5 1992 113.0000000 117.0322434 1700.0000000 103.6305387 - 859 8 5 1992 77.0000000 113.1879021 1660.0000000 100.2595740 - 860 9 5 1992 83.0000000 110.1369630 1650.0000000 97.2078303 - 861 10 5 1992 83.0000000 120.5756020 1640.0000000 96.7113786 - 862 11 5 1992 96.0000000 119.6916617 1640.0000000 95.1730678 - 863 12 5 1992 120.0000000 109.5202441 1660.0000000 92.3231982 - 864 13 5 1992 80.0000000 104.8839283 1660.0000000 89.5039399 - 865 14 5 1992 76.0000000 101.9256581 1650.0000000 87.2337643 - 866 15 5 1992 69.0000000 99.1988395 1630.0000000 85.1285626 - 867 16 5 1992 63.0000000 96.6776349 1610.0000000 83.1706246 - 868 17 5 1992 61.0000000 94.3396149 1610.0000000 81.3444193 - 869 18 5 1992 60.0000000 92.1651455 1630.0000000 79.6362965 - 870 19 5 1992 59.0000000 90.1370008 1640.0000000 78.0342331 - 871 20 5 1992 67.0000000 88.2449898 1640.0000000 76.5358942 - 872 21 5 1992 51.0000000 86.4827349 1640.0000000 75.1329154 - 873 22 5 1992 44.0000000 84.8187208 1670.0000000 73.7944813 - 874 23 5 1992 42.0000000 83.2383980 1690.0000000 72.5192524 - 875 24 5 1992 51.0000000 82.1899325 1660.0000000 71.8484466 - 876 25 5 1992 42.0000000 80.8782272 1640.0000000 70.6177261 - 877 26 5 1992 54.0000000 91.7747033 1630.0000000 72.5485419 - 878 27 5 1992 53.0000000 83.5169392 1610.0000000 69.5113758 - 879 28 5 1992 59.0000000 79.1183319 1600.0000000 68.1610043 - 880 29 5 1992 55.0000000 89.2017137 1570.0000000 73.3995556 - 881 30 5 1992 54.0000000 87.6458790 1530.0000000 71.9749462 - 882 31 5 1992 48.0000000 82.2276490 1520.0000000 71.5135718 - 883 1 6 1992 63.0000000 85.7416210 1490.0000000 73.9646899 - 884 2 6 1992 61.0000000 84.3999675 1490.0000000 72.0651692 - 885 3 6 1992 55.0000000 86.2516650 1570.0000000 74.8395631 - 886 4 6 1992 75.0000000 103.5674297 1780.0000000 92.8956091 - 887 5 6 1992 53.0000000 115.8411639 2190.0000000 95.8033021 - 888 6 6 1992 77.0000000 112.9602119 2190.0000000 97.2754540 - 889 7 6 1992 114.0000000 108.6884357 2210.0000000 94.2246411 - 890 8 6 1992 167.0000000 121.2104840 2110.0000000 95.4051472 - 891 9 6 1992 116.0000000 108.5756007 2130.0000000 88.7928226 - 892 10 6 1992 91.0000000 99.6733339 2140.0000000 84.3998870 - 893 11 6 1992 85.0000000 96.1016573 2070.0000000 81.7462849 - 894 12 6 1992 68.0000000 92.9874427 1990.0000000 79.2989885 - 895 13 6 1992 71.0000000 90.1351043 1900.0000000 77.0412388 - 896 14 6 1992 63.0000000 87.4808841 1850.0000000 74.9592553 - 897 15 6 1992 59.0000000 85.0353072 1750.0000000 73.0337074 - 898 16 6 1992 46.0000000 82.7768333 1670.0000000 71.2476955 - 899 17 6 1992 44.0000000 80.6851767 1600.0000000 69.5864093 - 900 18 6 1992 39.0000000 78.7498249 1550.0000000 68.0520292 - 901 19 6 1992 41.0000000 77.0909828 1520.0000000 66.6538601 - 902 20 6 1992 44.0000000 78.7639033 1640.0000000 65.3554279 - 903 21 6 1992 39.0000000 75.9539820 1760.0000000 64.0947190 - 904 22 6 1992 32.0000000 73.3105413 1770.0000000 62.8803831 - 905 23 6 1992 40.0000000 75.3716307 1600.0000000 61.9874262 - 906 24 6 1992 41.0000000 89.1137147 1590.0000000 64.9448324 - 907 25 6 1992 42.0000000 82.5472665 1730.0000000 63.6725717 - 908 26 6 1992 42.0000000 74.5961074 1770.0000000 60.7791273 - 909 27 6 1992 48.0000000 72.0604506 1890.0000000 59.4834107 - 910 28 6 1992 37.0000000 70.4824368 1940.0000000 58.4866436 - 911 29 6 1992 40.0000000 69.0086808 1780.0000000 57.5368881 - 912 30 6 1992 29.0000000 68.2629994 1630.0000000 57.3663371 - 913 1 7 1992 30.0000000 68.2612465 1550.0000000 57.5489590 - 914 2 7 1992 36.0000000 65.9144796 1500.0000000 55.6181673 - 915 3 7 1992 29.0000000 73.6969822 1460.0000000 65.7691181 - 916 4 7 1992 36.0000000 82.8904326 1460.0000000 72.6768485 - 917 5 7 1992 50.0000000 101.6933630 1510.0000000 78.1419474 - 918 6 7 1992 78.0000000 102.8120287 1530.0000000 79.6942508 - 919 7 7 1992 54.0000000 84.0193910 1610.0000000 66.7890213 - 920 8 7 1992 57.0000000 75.1660416 1580.0000000 62.5767369 - 921 9 7 1992 51.0000000 73.8869809 1550.0000000 62.1375645 - 922 10 7 1992 47.0000000 95.8646893 1520.0000000 75.3342723 - 923 11 7 1992 46.0000000 113.6973745 1580.0000000 86.3153520 - 924 12 7 1992 76.0000000 106.9128087 1670.0000000 86.7332934 - 925 13 7 1992 72.0000000 94.6925794 1780.0000000 77.0011802 - 926 14 7 1992 67.0000000 85.9626570 1850.0000000 71.0508719 - 927 15 7 1992 63.0000000 82.7982941 1860.0000000 68.7486838 - 928 16 7 1992 47.0000000 79.9208427 1770.0000000 66.6395775 - 929 17 7 1992 47.0000000 77.2952877 1670.0000000 64.7015652 - 930 18 7 1992 42.0000000 74.8917766 1610.0000000 62.9155170 - 931 19 7 1992 41.0000000 72.6852302 1600.0000000 61.2647454 - 932 20 7 1992 39.0000000 70.6534733 1540.0000000 59.7346558 - 933 21 7 1992 37.0000000 71.7435459 1470.0000000 61.7724297 - 934 22 7 1992 33.0000000 70.6866515 1500.0000000 60.1069037 - 935 23 7 1992 33.0000000 67.1842735 1650.0000000 57.3041334 - 936 24 7 1992 33.0000000 65.6207539 1750.0000000 56.0418174 - 937 25 7 1992 37.0000000 64.1010109 1760.0000000 54.8592685 - 938 26 7 1992 26.0000000 62.6837983 1590.0000000 53.7486362 - 939 27 7 1992 24.0000000 61.3564690 1490.0000000 52.7029690 - 940 28 7 1992 26.0000000 60.1103026 1440.0000000 51.7160902 - 941 29 7 1992 29.0000000 58.9374051 1370.0000000 50.7825020 - 942 30 7 1992 19.0000000 57.8328331 1330.0000000 49.8973030 - 943 31 7 1992 22.0000000 60.0858779 1310.0000000 53.0531703 - 944 1 8 1992 28.0000000 58.8607845 1310.0000000 50.6254494 - 945 2 8 1992 35.0000000 55.6470876 1330.0000000 48.2160023 - 946 3 8 1992 29.0000000 54.6807510 1300.0000000 47.4274589 - 947 4 8 1992 36.0000000 53.7671011 1250.0000000 46.6751888 - 948 5 8 1992 52.0000000 52.8968483 1210.0000000 45.9562457 - 949 6 8 1992 74.0000000 52.0661550 1200.0000000 45.2677609 - 950 7 8 1992 54.0000000 51.2715870 1170.0000000 44.6071628 - 951 8 8 1992 57.0000000 50.5100675 1140.0000000 43.9721429 - 952 9 8 1992 48.0000000 54.0839649 1110.0000000 46.8247303 - 953 10 8 1992 47.0000000 51.7674947 1090.0000000 44.1242386 - 954 11 8 1992 46.0000000 61.4576970 1090.0000000 51.5372285 - 955 12 8 1992 75.0000000 58.6853354 1080.0000000 45.3221251 - 956 13 8 1992 73.0000000 64.0773006 1120.0000000 44.3822370 - 957 14 8 1992 66.0000000 67.0510601 1160.0000000 54.9787113 - 958 15 8 1992 60.0000000 59.1199187 1150.0000000 46.6296229 - 959 16 8 1992 47.0000000 50.8265881 1120.0000000 42.3743093 - 960 17 8 1992 46.0000000 49.8398480 1080.0000000 41.6940133 - 961 18 8 1992 42.0000000 48.9112094 1050.0000000 41.0452802 - 962 19 8 1992 41.0000000 48.6844630 1020.0000000 40.4404171 - 963 20 8 1992 40.0000000 56.5177437 1040.0000000 46.7527248 - 964 21 8 1992 37.0000000 51.6093673 1080.0000000 41.1637150 - 965 22 8 1992 32.0000000 51.2117609 1030.0000000 42.0114057 - 966 23 8 1992 32.0000000 49.1441633 1040.0000000 40.7310896 - 967 24 8 1992 32.0000000 46.4657480 1070.0000000 38.9479681 - 968 25 8 1992 36.0000000 45.6002171 1050.0000000 38.3209839 - 969 26 8 1992 27.0000000 44.8359223 1010.0000000 37.7830940 - 970 27 8 1992 25.0000000 44.0959294 1000.0000000 37.2358061 - 971 28 8 1992 25.0000000 44.4572343 985.0000000 36.7781576 - 972 29 8 1992 28.0000000 52.8740966 971.0000000 47.0196131 - 973 30 8 1992 20.0000000 65.4073240 968.0000000 49.7363492 - 974 31 8 1992 22.0000000 109.7911894 977.0000000 95.8831967 - 975 1 9 1992 49.0000000 96.4773521 1060.0000000 63.8835165 - 976 2 9 1992 77.0000000 83.6033255 1170.0000000 56.9484708 - 977 3 9 1992 67.0000000 79.0326241 1280.0000000 62.0796082 - 978 4 9 1992 45.0000000 77.9591183 1270.0000000 62.5738631 - 979 5 9 1992 44.0000000 69.9415177 1250.0000000 54.6278506 - 980 6 9 1992 64.0000000 62.8554055 1280.0000000 49.9998963 - 981 7 9 1992 52.0000000 60.3355306 1340.0000000 48.2607865 - 982 8 9 1992 40.0000000 58.0654576 1310.0000000 46.6806343 - 983 9 9 1992 30.0000000 55.9899949 1240.0000000 45.2276983 - 984 10 9 1992 34.0000000 54.1145627 1190.0000000 43.9195135 - 985 11 9 1992 32.0000000 53.2937188 1150.0000000 43.6261067 - 986 12 9 1992 36.0000000 51.9011089 1120.0000000 42.5179788 - 987 13 9 1992 28.0000000 50.1391974 1090.0000000 41.1523304 - 988 14 9 1992 33.0000000 51.8420008 1080.0000000 43.4075844 - 989 15 9 1992 35.0000000 52.5876698 1060.0000000 42.2697283 - 990 16 9 1992 30.0000000 47.9309117 1070.0000000 39.5696744 - 991 17 9 1992 32.0000000 46.6775446 1080.0000000 38.6498726 - 992 18 9 1992 29.0000000 45.9189555 1030.0000000 38.3746370 - 993 19 9 1992 30.0000000 45.3174262 1000.0000000 37.7627302 - 994 20 9 1992 28.0000000 43.7274684 1010.0000000 36.5326658 - 995 21 9 1992 29.0000000 42.7692956 960.0000000 35.8090701 - 996 22 9 1992 29.0000000 41.8824051 936.0000000 35.1463940 - 997 23 9 1992 27.0000000 41.0971587 908.0000000 34.5559779 - 998 24 9 1992 27.0000000 40.2859839 880.0000000 33.9243679 - 999 25 9 1992 23.0000000 39.5321723 875.0000000 33.3416980 - 1000 26 9 1992 28.0000000 38.8189772 844.0000000 32.7876124 - 1001 27 9 1992 25.0000000 38.1463040 836.0000000 32.2655204 - 1002 28 9 1992 25.0000000 40.3007665 811.0000000 36.0091047 - 1003 29 9 1992 27.0000000 41.4230784 798.0000000 34.5951556 - 1004 30 9 1992 25.0000000 37.4721356 830.0000000 31.9974302 - 1005 1 10 1992 27.0000000 37.3781633 836.0000000 31.9925506 - 1006 2 10 1992 33.0000000 39.5880846 822.0000000 35.4704956 - 1007 3 10 1992 29.0000000 40.0766464 831.0000000 33.9886425 - 1008 4 10 1992 31.0000000 38.0135390 848.0000000 33.6569683 - 1009 5 10 1992 25.0000000 50.7243331 846.0000000 42.2675986 - 1010 6 10 1992 25.0000000 56.8871573 881.0000000 44.4588068 - 1011 7 10 1992 36.0000000 44.8555139 881.0000000 35.5044476 - 1012 8 10 1992 42.0000000 38.8277663 875.0000000 32.9500382 - 1013 9 10 1992 43.0000000 41.1469183 853.0000000 36.8879428 - 1014 10 10 1992 26.0000000 46.9368502 841.0000000 42.2411002 - 1015 11 10 1992 27.0000000 43.8702937 820.0000000 36.9525950 - 1016 12 10 1992 27.0000000 39.2331877 808.0000000 33.8916396 - 1017 13 10 1992 26.0000000 38.3430577 815.0000000 33.1300361 - 1018 14 10 1992 26.0000000 37.6151985 796.0000000 32.4159138 - 1019 15 10 1992 23.0000000 52.3618088 787.0000000 45.2503751 - 1020 16 10 1992 21.0000000 50.6704300 788.0000000 40.8465623 - 1021 17 10 1992 26.0000000 44.2646789 784.0000000 41.2683651 - 1022 18 10 1992 34.0000000 46.3507522 772.0000000 38.9937281 - 1023 19 10 1992 37.0000000 41.8887956 785.0000000 36.6874977 - 1024 20 10 1992 31.0000000 50.0561309 846.0000000 37.4789111 - 1025 21 10 1992 31.0000000 50.8491883 830.0000000 40.5293640 - 1026 22 10 1992 35.0000000 48.6814932 821.0000000 39.4099803 - 1027 23 10 1992 33.0000000 76.3944492 854.0000000 67.2734004 - 1028 24 10 1992 40.0000000 141.4597616 914.0000000 102.2000752 - 1029 25 10 1992 74.0000000 187.9356114 998.0000000 152.8464094 - 1030 26 10 1992 161.0000000 190.6107959 1310.0000000 152.1174429 - 1031 27 10 1992 285.0000000 205.9218594 1790.0000000 163.3842048 - 1032 28 10 1992 244.0000000 227.8010522 2030.0000000 191.2886848 - 1033 29 10 1992 263.0000000 238.9251413 1950.0000000 193.6437692 - 1034 30 10 1992 276.0000000 200.3826063 1960.0000000 161.0321783 - 1035 31 10 1992 186.0000000 172.3088453 2190.0000000 139.1870779 - 1036 1 11 1992 154.0000000 151.2743278 2220.0000000 121.5261786 - 1037 2 11 1992 112.0000000 155.9703767 1980.0000000 121.5400138 - 1038 3 11 1992 104.0000000 161.1510109 1780.0000000 129.3386782 - 1039 4 11 1992 96.0000000 151.9760503 1670.0000000 121.4034088 - 1040 5 11 1992 99.0000000 133.3791967 1620.0000000 106.0265967 - 1041 6 11 1992 126.0000000 118.2905775 1620.0000000 93.4832361 - 1042 7 11 1992 91.0000000 106.8534364 1640.0000000 84.3809738 - 1043 8 11 1992 84.0000000 102.2349496 1600.0000000 79.2328454 - 1044 9 11 1992 81.0000000 107.7779129 1530.0000000 80.6964807 - 1045 10 11 1992 85.0000000 146.9857824 1470.0000000 122.3998019 - 1046 11 11 1992 126.0000000 234.7109604 1440.0000000 189.2165459 - 1047 12 11 1992 279.0000000 280.8793107 1540.0000000 233.1523753 - 1048 13 11 1992 390.0000000 289.2176124 1810.0000000 243.8646566 - 1049 14 11 1992 294.0000000 297.8333773 2090.0000000 257.7219229 - 1050 15 11 1992 260.0000000 388.9749587 2080.0000000 361.8334537 - 1051 16 11 1992 398.0000000 528.8581695 2110.0000000 454.3293275 - 1052 17 11 1992 520.0000000 503.4116364 2240.0000000 416.7930685 - 1053 18 11 1992 487.0000000 478.7081559 2580.0000000 411.6843799 - 1054 19 11 1992 380.0000000 489.2828237 2730.0000000 402.8216406 - 1055 20 11 1992 385.0000000 418.8778851 2640.0000000 342.7854311 - 1056 21 11 1992 351.0000000 444.2323485 2660.0000000 399.2049697 - 1057 22 11 1992 309.0000000 521.6233322 2770.0000000 429.4577811 - 1058 23 11 1992 587.0000000 433.7793050 2960.0000000 354.8203645 - 1059 24 11 1992 661.0000000 371.3092221 3440.0000000 295.5445868 - 1060 25 11 1992 447.0000000 374.7300890 3780.0000000 306.0744956 - 1061 26 11 1992 361.0000000 398.9074183 3710.0000000 321.2638551 - 1062 27 11 1992 351.0000000 381.4412082 3440.0000000 300.9023388 - 1063 28 11 1992 353.0000000 412.9999640 3220.0000000 333.3826608 - 1064 29 11 1992 369.0000000 502.5587110 3280.0000000 400.4696355 - 1065 30 11 1992 452.0000000 490.3217125 3370.0000000 375.4859322 - 1066 1 12 1992 441.0000000 404.9124749 3400.0000000 311.3776708 - 1067 2 12 1992 348.0000000 436.6353189 3400.0000000 328.7828361 - 1068 3 12 1992 394.0000000 483.2448025 3350.0000000 348.4755996 - 1069 4 12 1992 455.0000000 524.5385413 3250.0000000 393.4198887 - 1070 5 12 1992 491.0000000 557.1237252 3240.0000000 401.6037825 - 1071 6 12 1992 469.0000000 488.7563579 3210.0000000 360.3413088 - 1072 7 12 1992 364.0000000 474.0909687 3210.0000000 345.3368149 - 1073 8 12 1992 338.0000000 417.8144681 3250.0000000 304.4298327 - 1074 9 12 1992 334.0000000 350.8772330 3130.0000000 257.7798670 - 1075 10 12 1992 268.0000000 293.7149801 3040.0000000 217.9337544 - 1076 11 12 1992 236.0000000 289.5033789 3040.0000000 211.7430018 - 1077 12 12 1992 230.0000000 298.7446169 2960.0000000 217.0560478 - 1078 13 12 1992 239.0000000 272.0229928 2920.0000000 197.3726859 - 1079 14 12 1992 256.0000000 231.5951700 2870.0000000 170.8094527 - 1080 15 12 1992 217.0000000 208.0871815 2860.0000000 156.2953367 - 1081 16 12 1992 201.0000000 194.9127258 2730.0000000 148.6357812 - 1082 17 12 1992 188.0000000 187.7842897 2530.0000000 145.7981130 - 1083 18 12 1992 176.0000000 177.3653230 2340.0000000 136.7039268 - 1084 19 12 1992 170.0000000 165.8886955 2180.0000000 128.1365872 - 1085 20 12 1992 168.0000000 163.1135898 2070.0000000 124.5407196 - 1086 21 12 1992 131.0000000 168.0130275 1970.0000000 130.9432171 - 1087 22 12 1992 133.0000000 168.8823172 1920.0000000 127.3930327 - 1088 23 12 1992 134.0000000 157.1553837 1970.0000000 120.2511366 - 1089 24 12 1992 127.0000000 149.0345687 1910.0000000 115.1843493 - 1090 25 12 1992 117.0000000 142.1637252 1810.0000000 110.6563651 - 1091 26 12 1992 113.0000000 135.9990027 1680.0000000 106.5595623 - 1092 27 12 1992 100.0000000 130.4489928 1580.0000000 102.8404769 - 1093 28 12 1992 94.0000000 125.4357002 1500.0000000 99.4531932 - 1094 29 12 1992 87.0000000 120.8923430 1420.0000000 96.3581513 - 1095 30 12 1992 86.0000000 116.7615531 1380.0000000 93.5211628 - 1096 31 12 1992 81.0000000 112.9938959 1320.0000000 90.9125955 - 1097 1 1 1993 77.0000000 109.5466480 1280.0000000 88.5066958 - 1098 2 1 1993 76.0000000 106.3827828 1230.0000000 86.2810219 - 1099 3 1 1993 61.0000000 103.4701255 1180.0000000 84.2159689 - 1100 4 1 1993 61.0000000 100.7806469 1140.0000000 82.2943700 - 1101 5 1 1993 57.0000000 98.2898706 1130.0000000 80.5011588 - 1102 6 1 1993 66.0000000 114.5697508 1130.0000000 89.4483920 - 1103 7 1 1993 67.0000000 135.6057603 1150.0000000 101.5268808 - 1104 8 1 1993 84.0000000 139.1279486 1220.0000000 108.2289481 - 1105 9 1 1993 90.0000000 145.7521196 1320.0000000 104.9452857 - 1106 10 1 1993 113.0000000 191.0324796 1380.0000000 115.9912294 - 1107 11 1 1993 265.0000000 395.1122289 1400.0000000 227.6104411 - 1108 12 1 1993 559.0000000 577.2249521 1620.0000000 329.8549068 - 1109 13 1 1993 832.0000000 578.5751002 2110.0000000 338.7950662 - 1110 14 1 1993 601.0000000 499.5304581 2270.0000000 293.5804504 - 1111 15 1 1993 436.0000000 409.4389707 2240.0000000 243.6703990 - 1112 16 1 1993 339.0000000 338.9197551 2120.0000000 204.8907110 - 1113 17 1 1993 292.0000000 287.2025874 1960.0000000 174.6771017 - 1114 18 1 1993 247.0000000 253.1222763 1770.0000000 155.7672650 - 1115 19 1 1993 218.0000000 228.1487622 1640.0000000 145.2865630 - 1116 20 1 1993 205.0000000 207.9024810 1540.0000000 137.0014334 - 1117 21 1 1993 190.0000000 195.1931028 1490.0000000 129.9501024 - 1118 22 1 1993 176.0000000 188.2035671 1430.0000000 127.2973565 - 1119 23 1 1993 173.0000000 183.4741540 1420.0000000 127.6579050 - 1120 24 1 1993 173.0000000 238.4013004 1420.0000000 205.1850803 - 1121 25 1 1993 199.0000000 334.1735636 1460.0000000 266.6559164 - 1122 26 1 1993 361.0000000 291.2920170 1550.0000000 225.2618415 - 1123 27 1 1993 295.0000000 292.5511035 1710.0000000 244.0339219 - 1124 28 1 1993 238.0000000 314.3513961 1740.0000000 255.4413292 - 1125 29 1 1993 263.0000000 295.8335853 1690.0000000 235.8405977 - 1126 30 1 1993 245.0000000 260.7062532 1790.0000000 205.0094885 - 1127 31 1 1993 222.0000000 228.6304364 1950.0000000 179.0177013 - 1128 1 2 1993 199.0000000 205.0453592 1870.0000000 160.1720138 - 1129 2 2 1993 186.0000000 186.6724224 1700.0000000 145.5826621 - 1130 3 2 1993 171.0000000 172.1164755 1560.0000000 134.2610414 - 1131 4 2 1993 157.0000000 161.6389534 1500.0000000 126.8944694 - 1132 5 2 1993 159.0000000 153.7805117 1440.0000000 121.2456971 - 1133 6 2 1993 129.0000000 147.0223571 1380.0000000 116.3862735 - 1134 7 2 1993 119.0000000 141.0205897 1350.0000000 111.9962650 - 1135 8 2 1993 119.0000000 135.5421970 1290.0000000 108.0144055 - 1136 9 2 1993 105.0000000 130.5753300 1250.0000000 104.3909050 - 1137 10 2 1993 106.0000000 126.0609239 1210.0000000 101.0828872 - 1138 11 2 1993 105.0000000 121.9448146 1190.0000000 98.0533159 - 1139 12 2 1993 95.0000000 118.1801779 1150.0000000 95.2701057 - 1140 13 2 1993 91.0000000 114.7264225 1140.0000000 92.7053824 - 1141 14 2 1993 88.0000000 111.5482682 1120.0000000 90.3348664 - 1142 15 2 1993 84.0000000 108.6149736 1100.0000000 88.1373561 - 1143 16 2 1993 83.0000000 105.9637731 1060.0000000 86.0942927 - 1144 17 2 1993 79.0000000 105.6811664 1030.0000000 87.2401042 - 1145 18 2 1993 78.0000000 107.0466883 1040.0000000 87.8318109 - 1146 19 2 1993 84.0000000 105.5742602 1060.0000000 87.3483487 - 1147 20 2 1993 91.0000000 120.1600765 1100.0000000 99.1561733 - 1148 21 2 1993 91.0000000 125.0419092 1130.0000000 99.5839844 - 1149 22 2 1993 90.0000000 122.8300576 1210.0000000 98.4345468 - 1150 23 2 1993 103.0000000 117.9509295 1200.0000000 94.5639924 - 1151 24 2 1993 94.0000000 113.5396114 1160.0000000 91.4879652 - 1152 25 2 1993 81.0000000 109.8345324 1100.0000000 88.6982404 - 1153 26 2 1993 78.0000000 106.6019375 1050.0000000 86.1478238 - 1154 27 2 1993 75.0000000 107.3951532 1040.0000000 86.2292871 - 1155 28 2 1993 76.0000000 106.3331185 1030.0000000 84.5199365 - 1156 1 3 1993 80.0000000 102.7945185 1020.0000000 82.2211165 - 1157 2 3 1993 75.0000000 101.1354327 1000.0000000 81.0090520 - 1158 3 3 1993 76.0000000 99.8876343 976.0000000 79.7304012 - 1159 4 3 1993 72.0000000 97.0112906 977.0000000 77.7760704 - 1160 5 3 1993 65.0000000 94.5910480 967.0000000 76.0332709 - 1161 6 3 1993 64.0000000 92.3567793 950.0000000 74.4352529 - 1162 7 3 1993 64.0000000 90.7396747 937.0000000 74.0329094 - 1163 8 3 1993 68.0000000 90.2781087 953.0000000 73.0902823 - 1164 9 3 1993 68.0000000 88.0605540 987.0000000 71.9226407 - 1165 10 3 1993 67.0000000 87.7873536 990.0000000 72.5389401 - 1166 11 3 1993 61.0000000 88.7465234 959.0000000 73.7868311 - 1167 12 3 1993 57.0000000 89.5494381 967.0000000 74.5522524 - 1168 13 3 1993 58.0000000 87.8343233 967.0000000 72.8185574 - 1169 14 3 1993 54.0000000 85.8355710 999.0000000 71.2710286 - 1170 15 3 1993 66.0000000 84.0692919 1020.0000000 69.8623603 - 1171 16 3 1993 54.0000000 82.5091255 1030.0000000 68.5979066 - 1172 17 3 1993 57.0000000 81.0656699 1020.0000000 67.4573754 - 1173 18 3 1993 57.0000000 79.8043117 1040.0000000 66.4471637 - 1174 19 3 1993 52.0000000 78.4614462 1090.0000000 65.3342215 - 1175 20 3 1993 57.0000000 77.1781243 1160.0000000 64.2847642 - 1176 21 3 1993 58.0000000 77.0189082 1180.0000000 64.8420111 - 1177 22 3 1993 57.0000000 93.0395105 1160.0000000 82.4991723 - 1178 23 3 1993 56.0000000 97.4337592 1100.0000000 78.9303865 - 1179 24 3 1993 63.0000000 87.5166485 1090.0000000 73.0022694 - 1180 25 3 1993 76.0000000 85.3943557 1150.0000000 71.2696319 - 1181 26 3 1993 56.0000000 83.4158502 1200.0000000 69.6514186 - 1182 27 3 1993 59.0000000 81.5661508 1210.0000000 68.1363896 - 1183 28 3 1993 59.0000000 79.8326184 1180.0000000 66.7145640 - 1184 29 3 1993 54.0000000 78.2040283 1140.0000000 65.3770627 - 1185 30 3 1993 48.0000000 76.6703957 1090.0000000 64.1159740 - 1186 31 3 1993 55.0000000 75.2228242 1050.0000000 62.9242372 - 1187 1 4 1993 48.0000000 76.1944521 1050.0000000 65.0134787 - 1188 2 4 1993 53.0000000 79.0008781 1040.0000000 67.2680357 - 1189 3 4 1993 47.0000000 76.9279216 1050.0000000 64.7329926 - 1190 4 4 1993 59.0000000 84.4491567 1070.0000000 69.2526582 - 1191 5 4 1993 53.0000000 104.8839385 1090.0000000 84.5399984 - 1192 6 4 1993 64.0000000 101.8746446 1080.0000000 79.9122418 - 1193 7 4 1993 63.0000000 92.4988880 1070.0000000 75.4982284 - 1194 8 4 1993 75.0000000 90.4018403 1140.0000000 73.7989598 - 1195 9 4 1993 64.0000000 87.3871134 1340.0000000 71.5297380 - 1196 10 4 1993 59.0000000 89.6800179 1480.0000000 75.5406177 - 1197 11 4 1993 60.0000000 95.4352260 1510.0000000 79.1773498 - 1198 12 4 1993 63.0000000 93.5038915 1480.0000000 76.8315845 - 1199 13 4 1993 69.0000000 91.8602654 1520.0000000 76.3885082 - 1200 14 4 1993 79.0000000 90.0262985 1560.0000000 74.4715088 - 1201 15 4 1993 82.0000000 87.4782776 1560.0000000 72.3487843 - 1202 16 4 1993 68.0000000 85.6982293 1490.0000000 71.0702160 - 1203 17 4 1993 56.0000000 83.2957901 1410.0000000 69.1571462 - 1204 18 4 1993 59.0000000 81.2113478 1330.0000000 67.5181384 - 1205 19 4 1993 61.0000000 79.1245646 1290.0000000 65.8664014 - 1206 20 4 1993 62.0000000 77.1511426 1300.0000000 64.3066392 - 1207 21 4 1993 57.0000000 75.3134827 1300.0000000 62.8494796 - 1208 22 4 1993 53.0000000 73.5997671 1270.0000000 61.4848822 - 1209 23 4 1993 47.0000000 71.9957387 1220.0000000 60.2039263 - 1210 24 4 1993 46.0000000 70.4893044 1180.0000000 58.9986728 - 1211 25 4 1993 47.0000000 69.0726897 1160.0000000 57.8620443 - 1212 26 4 1993 45.0000000 67.7374098 1130.0000000 56.7877216 - 1213 27 4 1993 43.0000000 66.4758990 1100.0000000 55.7700548 - 1214 28 4 1993 41.0000000 65.3206129 1090.0000000 54.8674655 - 1215 29 4 1993 38.0000000 64.2638008 1100.0000000 54.0054406 - 1216 30 4 1993 39.0000000 63.5401661 1070.0000000 53.1331652 - 1217 1 5 1993 40.0000000 63.2337284 1080.0000000 53.2271039 - 1218 2 5 1993 41.0000000 64.2409763 1230.0000000 54.4051462 - 1219 3 5 1993 45.0000000 62.6601761 1140.0000000 52.7039675 - 1220 4 5 1993 49.0000000 61.0078702 1130.0000000 51.3512896 - 1221 5 5 1993 40.0000000 60.1038795 1150.0000000 50.6643488 - 1222 6 5 1993 43.0000000 59.2939594 1160.0000000 49.9440950 - 1223 7 5 1993 38.0000000 59.0128746 1150.0000000 49.1494593 - 1224 8 5 1993 38.0000000 59.1827171 1190.0000000 48.5144231 - 1225 9 5 1993 43.0000000 58.7298460 1160.0000000 49.6144158 - 1226 10 5 1993 44.0000000 57.7388645 1120.0000000 48.5197265 - 1227 11 5 1993 41.0000000 58.3504079 1120.0000000 47.9583301 - 1228 12 5 1993 51.0000000 67.8075637 1090.0000000 52.1371703 - 1229 13 5 1993 63.0000000 105.4830925 1140.0000000 63.4407643 - 1230 14 5 1993 68.0000000 77.7693736 1210.0000000 53.7818424 - 1231 15 5 1993 77.0000000 66.5863344 1230.0000000 50.3907232 - 1232 16 5 1993 77.0000000 64.8272367 1220.0000000 49.4718993 - 1233 17 5 1993 59.0000000 63.0723289 1200.0000000 48.5294977 - 1234 18 5 1993 49.0000000 61.4939163 1160.0000000 47.6395096 - 1235 19 5 1993 43.0000000 68.1562945 1140.0000000 49.5701640 - 1236 20 5 1993 44.0000000 76.0647269 1180.0000000 60.7538963 - 1237 21 5 1993 48.0000000 71.1809036 1200.0000000 54.6429304 - 1238 22 5 1993 44.0000000 63.3332156 1220.0000000 49.6400265 - 1239 23 5 1993 46.0000000 61.6551794 1360.0000000 48.5988920 - 1240 24 5 1993 40.0000000 60.1050454 1430.0000000 47.6210201 - 1241 25 5 1993 43.0000000 58.6678735 1310.0000000 46.7002528 - 1242 26 5 1993 30.0000000 58.9242553 1250.0000000 46.5342079 - 1243 27 5 1993 45.0000000 70.2800997 1210.0000000 58.5676967 - 1244 28 5 1993 43.0000000 73.6778878 1200.0000000 58.4633107 - 1245 29 5 1993 44.0000000 63.8236715 1240.0000000 51.3038945 - 1246 30 5 1993 54.0000000 67.5137495 1290.0000000 55.8419373 - 1247 31 5 1993 56.0000000 66.1456617 1310.0000000 51.8332072 - 1248 1 6 1993 44.0000000 59.8816782 1270.0000000 48.6070866 - 1249 2 6 1993 43.0000000 63.4138515 1220.0000000 51.6463174 - 1250 3 6 1993 33.0000000 67.5924328 1240.0000000 55.0272262 - 1251 4 6 1993 45.0000000 60.9639882 1290.0000000 49.7355807 - 1252 5 6 1993 46.0000000 58.4069739 1370.0000000 47.7776297 - 1253 6 6 1993 42.0000000 56.9259867 1360.0000000 46.6663255 - 1254 7 6 1993 40.0000000 55.5504941 1320.0000000 45.6287128 - 1255 8 6 1993 30.0000000 54.2692369 1280.0000000 44.6573670 - 1256 9 6 1993 31.0000000 53.9423318 1250.0000000 44.7237414 - 1257 10 6 1993 32.0000000 53.1583490 1220.0000000 44.1377974 - 1258 11 6 1993 25.0000000 53.5358755 1190.0000000 45.2848687 - 1259 12 6 1993 33.0000000 54.7115286 1210.0000000 45.7016046 - 1260 13 6 1993 29.0000000 52.3975542 1250.0000000 43.9453141 - 1261 14 6 1993 40.0000000 55.5238224 1320.0000000 47.2049368 - 1262 15 6 1993 42.0000000 56.3735829 1350.0000000 46.8168295 - 1263 16 6 1993 37.0000000 53.5619865 1360.0000000 45.3371435 - 1264 17 6 1993 46.0000000 51.6530370 1370.0000000 43.4234914 - 1265 18 6 1993 47.0000000 49.8809346 1410.0000000 41.8785077 - 1266 19 6 1993 50.0000000 53.3560298 1430.0000000 46.6168358 - 1267 20 6 1993 43.0000000 81.5385151 1500.0000000 73.8207398 - 1268 21 6 1993 69.0000000 71.1717562 1470.0000000 54.8043318 - 1269 22 6 1993 61.0000000 80.0477196 1480.0000000 82.4784375 - 1270 23 6 1993 67.0000000 88.8427613 1520.0000000 73.3200355 - 1271 24 6 1993 77.0000000 69.4969775 1630.0000000 61.1037594 - 1272 25 6 1993 87.0000000 66.6598559 1810.0000000 58.5123935 - 1273 26 6 1993 55.0000000 64.2893985 1930.0000000 56.3646769 - 1274 27 6 1993 43.0000000 62.1213213 1890.0000000 54.4025061 - 1275 28 6 1993 40.0000000 60.1327820 1760.0000000 52.6050105 - 1276 29 6 1993 30.0000000 58.3040102 1620.0000000 50.9539947 - 1277 30 6 1993 40.0000000 56.6254229 1550.0000000 49.4466351 - 1278 1 7 1993 40.0000000 58.1556384 1510.0000000 51.9852802 - 1279 2 7 1993 27.0000000 57.1431867 1460.0000000 49.7832101 - 1280 3 7 1993 34.0000000 53.9007723 1420.0000000 47.1181138 - 1281 4 7 1993 30.0000000 52.5028757 1390.0000000 45.8543300 - 1282 5 7 1993 31.0000000 51.5058332 1360.0000000 44.6866976 - 1283 6 7 1993 27.0000000 50.0599241 1340.0000000 43.6042220 - 1284 7 7 1993 31.0000000 48.9288843 1360.0000000 42.5886134 - 1285 8 7 1993 26.0000000 47.8690726 1560.0000000 41.6390620 - 1286 9 7 1993 23.0000000 48.9317945 1680.0000000 43.0927794 - 1287 10 7 1993 24.0000000 48.9042242 1540.0000000 42.9041510 - 1288 11 7 1993 25.0000000 53.7290656 1460.0000000 50.6253966 - 1289 12 7 1993 34.0000000 63.7637845 1460.0000000 57.0423597 - 1290 13 7 1993 40.0000000 60.5967369 1770.0000000 50.3291255 - 1291 14 7 1993 41.0000000 82.5780454 2110.0000000 62.8900592 - 1292 15 7 1993 46.0000000 68.1664523 2200.0000000 52.5392952 - 1293 16 7 1993 39.0000000 54.5083610 2160.0000000 47.0901278 - 1294 17 7 1993 43.0000000 53.8027441 2070.0000000 46.7587953 - 1295 18 7 1993 35.0000000 52.7373306 2100.0000000 45.7344895 - 1296 19 7 1993 49.0000000 74.8728898 2120.0000000 57.6525124 - 1297 20 7 1993 38.0000000 72.0808764 2140.0000000 53.6322056 - 1298 21 7 1993 41.0000000 68.3050776 2170.0000000 58.7784158 - 1299 22 7 1993 45.0000000 63.5109816 2190.0000000 52.4118095 - 1300 23 7 1993 41.0000000 56.3407726 2140.0000000 47.7763106 - 1301 24 7 1993 42.0000000 54.7594899 2150.0000000 46.4856493 - 1302 25 7 1993 40.0000000 53.6610341 2110.0000000 45.3181945 - 1303 26 7 1993 35.0000000 52.0237993 2070.0000000 44.1480510 - 1304 27 7 1993 40.0000000 79.5565828 2000.0000000 52.9459338 - 1305 28 7 1993 40.0000000 67.6720240 1970.0000000 46.9884285 - 1306 29 7 1993 36.0000000 55.1576676 1990.0000000 43.3821042 - 1307 30 7 1993 40.0000000 115.5409676 2020.0000000 91.6949813 - 1308 31 7 1993 61.0000000 96.6646430 1960.0000000 64.9232875 - 1309 1 8 1993 36.0000000 69.5263496 1860.0000000 53.5925725 - 1310 2 8 1993 46.0000000 66.3266341 1850.0000000 51.4974458 - 1311 3 8 1993 32.0000000 63.4443249 1850.0000000 49.5946958 - 1312 4 8 1993 38.0000000 60.8710200 1710.0000000 47.9090809 - 1313 5 8 1993 32.0000000 58.6124251 1630.0000000 46.4246106 - 1314 6 8 1993 25.0000000 56.4431893 1620.0000000 44.9354567 - 1315 7 8 1993 26.0000000 54.4780166 1620.0000000 43.5971959 - 1316 8 8 1993 29.0000000 52.6830997 1530.0000000 42.3638401 - 1317 9 8 1993 29.0000000 62.8758199 1500.0000000 53.9468613 - 1318 10 8 1993 28.0000000 63.0604287 1470.0000000 50.3994867 - 1319 11 8 1993 37.0000000 55.3930045 1500.0000000 44.9994412 - 1320 12 8 1993 40.0000000 51.3014895 1580.0000000 42.0766192 - 1321 13 8 1993 49.0000000 49.7551447 1650.0000000 40.9360753 - 1322 14 8 1993 32.0000000 52.5764222 1560.0000000 43.5058702 - 1323 15 8 1993 37.0000000 49.5683378 1470.0000000 40.7069330 - 1324 16 8 1993 37.0000000 47.1491183 1420.0000000 38.9840756 - 1325 17 8 1993 27.0000000 45.8995694 1360.0000000 38.0474613 - 1326 18 8 1993 24.0000000 44.7404653 1310.0000000 37.1742093 - 1327 19 8 1993 24.0000000 43.6623195 1280.0000000 36.3579210 - 1328 20 8 1993 22.0000000 42.6568783 1230.0000000 35.5929353 - 1329 21 8 1993 21.0000000 41.7168451 1210.0000000 34.8742349 - 1330 22 8 1993 16.0000000 43.5163719 1160.0000000 37.9448241 - 1331 23 8 1993 21.0000000 46.5952627 1130.0000000 40.0488773 - 1332 24 8 1993 27.0000000 42.6661007 1120.0000000 35.7290194 - 1333 25 8 1993 26.0000000 40.0399923 1200.0000000 33.8742243 - 1334 26 8 1993 23.0000000 39.2702199 1250.0000000 33.2768445 - 1335 27 8 1993 21.0000000 42.8519083 1250.0000000 38.9353755 - 1336 28 8 1993 28.0000000 43.5694868 1220.0000000 36.2348474 - 1337 29 8 1993 17.0000000 38.6041798 1250.0000000 32.9839048 - 1338 30 8 1993 24.0000000 37.8748931 1480.0000000 32.3767078 - 1339 31 8 1993 25.0000000 37.1847637 1630.0000000 31.8008373 - 1340 1 9 1993 25.0000000 36.5297918 1530.0000000 31.2535569 - 1341 2 9 1993 19.0000000 35.9069214 1430.0000000 30.7324071 - 1342 3 9 1993 17.0000000 40.0047402 1380.0000000 36.9557151 - 1343 4 9 1993 16.0000000 43.7403404 1370.0000000 37.2347862 - 1344 5 9 1993 19.0000000 36.6638937 1380.0000000 31.6631442 - 1345 6 9 1993 23.0000000 35.5629955 1400.0000000 30.7078923 - 1346 7 9 1993 25.0000000 60.6200487 1440.0000000 44.1271652 - 1347 8 9 1993 34.0000000 52.3070619 1410.0000000 40.4307466 - 1348 9 9 1993 31.0000000 66.6046589 1380.0000000 63.4070596 - 1349 10 9 1993 35.0000000 92.5836081 1380.0000000 65.2788782 - 1350 11 9 1993 53.0000000 121.0709036 1460.0000000 99.0501725 - 1351 12 9 1993 71.0000000 120.2960722 1590.0000000 90.0851098 - 1352 13 9 1993 74.0000000 155.8304028 1680.0000000 127.9588077 - 1353 14 9 1993 87.0000000 172.3703363 1660.0000000 122.8009754 - 1354 15 9 1993 173.0000000 163.9518039 1660.0000000 108.5285210 - 1355 16 9 1993 117.0000000 133.4906849 1760.0000000 95.8243707 - 1356 17 9 1993 93.0000000 117.0756806 1820.0000000 86.9241743 - 1357 18 9 1993 77.0000000 107.9640819 1750.0000000 80.6729916 - 1358 19 9 1993 62.0000000 100.1007805 1680.0000000 75.3013248 - 1359 20 9 1993 54.0000000 93.4649678 1570.0000000 70.8329006 - 1360 21 9 1993 48.0000000 91.4924332 1490.0000000 67.8729522 - 1361 22 9 1993 46.0000000 114.8432927 1450.0000000 87.6359281 - 1362 23 9 1993 55.0000000 120.8278113 1410.0000000 86.3535809 - 1363 24 9 1993 66.0000000 124.7260068 1370.0000000 87.4322479 - 1364 25 9 1993 64.0000000 121.4384843 1380.0000000 86.5546796 - 1365 26 9 1993 52.0000000 108.8937986 1420.0000000 78.2403664 - 1366 27 9 1993 68.0000000 101.5687306 1350.0000000 76.6572172 - 1367 28 9 1993 69.0000000 105.0865286 1350.0000000 83.6237838 - 1368 29 9 1993 62.0000000 101.8704401 1390.0000000 77.8047362 - 1369 30 9 1993 76.0000000 96.9990050 1430.0000000 78.9343541 - 1370 1 10 1993 72.0000000 121.1926812 1440.0000000 99.4083425 - 1371 2 10 1993 68.0000000 121.9557268 1470.0000000 98.4807353 - 1372 3 10 1993 72.0000000 117.6175085 1550.0000000 99.2714082 - 1373 4 10 1993 78.0000000 124.1863144 1780.0000000 98.6763239 - 1374 5 10 1993 116.0000000 198.3392693 1970.0000000 147.1121926 - 1375 6 10 1993 131.0000000 213.3506835 1990.0000000 160.7814056 - 1376 7 10 1993 180.0000000 189.1569626 1880.0000000 148.2110405 - 1377 8 10 1993 203.0000000 188.8260602 1800.0000000 160.2370613 - 1378 9 10 1993 164.0000000 198.2578213 1770.0000000 160.5435776 - 1379 10 10 1993 178.0000000 216.4118004 1830.0000000 192.3996470 - 1380 11 10 1993 161.0000000 255.6925839 2030.0000000 210.0569674 - 1381 12 10 1993 287.0000000 258.6629577 2240.0000000 233.8611702 - 1382 13 10 1993 360.0000000 331.8069764 2270.0000000 283.4616706 - 1383 14 10 1993 374.0000000 334.7855735 2210.0000000 264.9672727 - 1384 15 10 1993 297.0000000 294.2338828 2200.0000000 237.7757288 - 1385 16 10 1993 247.0000000 299.2733041 2170.0000000 256.5819055 - 1386 17 10 1993 273.0000000 303.5585233 2200.0000000 254.3616999 - 1387 18 10 1993 261.0000000 269.6196964 2230.0000000 225.5691296 - 1388 19 10 1993 265.0000000 238.9481855 2180.0000000 197.0216840 - 1389 20 10 1993 230.0000000 204.9530492 2120.0000000 166.8560033 - 1390 21 10 1993 199.0000000 182.1551920 2040.0000000 146.2965904 - 1391 22 10 1993 173.0000000 177.7554228 1990.0000000 149.0838998 - 1392 23 10 1993 182.0000000 199.2603616 1970.0000000 170.8723074 - 1393 24 10 1993 203.0000000 203.4173903 2010.0000000 166.7697047 - 1394 25 10 1993 213.0000000 176.8893179 2120.0000000 143.9808579 - 1395 26 10 1993 180.0000000 155.8354967 2100.0000000 126.5819873 - 1396 27 10 1993 154.0000000 141.5638784 1980.0000000 115.4751981 - 1397 28 10 1993 118.0000000 132.3860804 1840.0000000 108.6160274 - 1398 29 10 1993 112.0000000 124.9089694 1750.0000000 102.7975764 - 1399 30 10 1993 98.0000000 118.2509266 1670.0000000 97.6058365 - 1400 31 10 1993 97.0000000 112.3006247 1620.0000000 92.9578122 - 1401 1 11 1993 91.0000000 106.9660092 1540.0000000 88.7830253 - 1402 2 11 1993 85.0000000 102.1685646 1480.0000000 85.0213590 - 1403 3 11 1993 75.0000000 97.8410908 1430.0000000 81.6213540 - 1404 4 11 1993 76.0000000 93.9258825 1370.0000000 78.5388145 - 1405 5 11 1993 78.0000000 90.3732335 1340.0000000 75.7356626 - 1406 6 11 1993 72.0000000 87.1693368 1290.0000000 73.2622884 - 1407 7 11 1993 76.0000000 86.6204495 1280.0000000 71.4400942 - 1408 8 11 1993 69.0000000 84.6324463 1280.0000000 70.4151204 - 1409 9 11 1993 66.0000000 82.1808380 1370.0000000 68.6431280 - 1410 10 11 1993 71.0000000 82.0002892 1410.0000000 69.0614062 - 1411 11 11 1993 64.0000000 92.5608710 1330.0000000 81.7115491 - 1412 12 11 1993 67.0000000 96.0552424 1310.0000000 80.6009792 - 1413 13 11 1993 80.0000000 95.3448907 1300.0000000 77.0196220 - 1414 14 11 1993 78.0000000 126.1403105 1320.0000000 101.7597141 - 1415 15 11 1993 80.0000000 130.3951349 1370.0000000 104.0504398 - 1416 16 11 1993 86.0000000 121.0338543 1360.0000000 96.7736401 - 1417 17 11 1993 125.0000000 111.6277016 1440.0000000 90.8140188 - 1418 18 11 1993 96.0000000 106.3475566 1490.0000000 86.8823672 - 1419 19 11 1993 82.0000000 101.5881814 1420.0000000 83.3223129 - 1420 20 11 1993 77.0000000 97.2908402 1340.0000000 80.0952049 - 1421 21 11 1993 67.0000000 93.3998162 1290.0000000 77.1613207 - 1422 22 11 1993 71.0000000 89.8665177 1240.0000000 74.4862677 - 1423 23 11 1993 61.0000000 86.6489182 1190.0000000 72.0402296 - 1424 24 11 1993 42.0000000 83.7107064 1180.0000000 69.7980580 - 1425 25 11 1993 63.0000000 81.3846768 1160.0000000 68.5946781 - 1426 26 11 1993 57.0000000 80.2203266 1130.0000000 67.2670087 - 1427 27 11 1993 58.0000000 77.3764145 1100.0000000 65.1629353 - 1428 28 11 1993 49.0000000 75.2140909 1090.0000000 63.4724455 - 1429 29 11 1993 50.0000000 73.2128220 1050.0000000 61.9017129 - 1430 30 11 1993 55.0000000 71.3557596 1020.0000000 60.4385440 - 1431 1 12 1993 54.0000000 69.6281147 1020.0000000 59.0721547 - 1432 2 12 1993 54.0000000 75.3231045 971.0000000 62.5076782 - 1433 3 12 1993 50.0000000 73.7484131 978.0000000 61.7880995 - 1434 4 12 1993 51.0000000 74.4796032 968.0000000 60.7728810 - 1435 5 12 1993 62.0000000 71.2011822 952.0000000 58.8586917 - 1436 6 12 1993 62.0000000 68.9550270 953.0000000 57.4623633 - 1437 7 12 1993 71.0000000 104.4729379 930.0000000 80.3480740 - 1438 8 12 1993 79.0000000 166.6349880 945.0000000 131.4753402 - 1439 9 12 1993 153.0000000 182.2976294 1030.0000000 137.8287172 - 1440 10 12 1993 291.0000000 247.5986307 1250.0000000 201.2979347 - 1441 11 12 1993 332.0000000 334.2660172 1560.0000000 261.0451219 - 1442 12 12 1993 465.0000000 390.3531718 1770.0000000 284.0409757 - 1443 13 12 1993 518.0000000 459.1455275 1980.0000000 335.1498302 - 1444 14 12 1993 539.0000000 487.2020945 2280.0000000 351.1347342 - 1445 15 12 1993 559.0000000 482.4655011 2420.0000000 366.2845901 - 1446 16 12 1993 500.0000000 553.6886816 2430.0000000 411.1500330 - 1447 17 12 1993 526.0000000 585.6566845 2370.0000000 445.9641406 - 1448 18 12 1993 583.0000000 592.2491650 2440.0000000 431.1541810 - 1449 19 12 1993 677.0000000 665.0647768 2810.0000000 496.8017319 - 1450 20 12 1993 781.0000000 990.5202534 3090.0000000 695.9911384 - 1451 21 12 1993 1180.0000000 1119.0314860 4300.0000000 755.6453441 - 1452 22 12 1993 1460.0000000 1101.6880565 5750.0000000 759.5460724 - 1453 23 12 1993 1600.0000000 1159.4411651 6310.0000000 825.4076294 - 1454 24 12 1993 1410.0000000 1158.7369844 5990.0000000 828.6299440 - 1455 25 12 1993 1230.0000000 987.8194347 5500.0000000 698.8455711 - 1456 26 12 1993 1070.0000000 804.1428739 5110.0000000 572.8908836 - 1457 27 12 1993 746.0000000 663.5757902 4510.0000000 473.9119141 - 1458 28 12 1993 542.0000000 563.4944496 3810.0000000 400.2929164 - 1459 29 12 1993 492.0000000 545.5047485 3260.0000000 387.7573438 - 1460 30 12 1993 491.0000000 615.9757504 2900.0000000 435.9888763 - 1461 31 12 1993 617.0000000 815.6459807 2790.0000000 654.3340301 + 1 1 7 1990 79.0000000 87.1355221 1740.0000000 61.4250230 + 2 2 7 1990 92.0000000 73.9449161 1870.0000000 55.9677274 + 3 3 7 1990 72.0000000 81.3233652 2030.0000000 69.0251957 + 4 4 7 1990 58.0000000 97.1321310 2050.0000000 80.1927080 + 5 5 7 1990 69.0000000 125.0920436 2040.0000000 95.6998890 + 6 6 7 1990 94.0000000 107.5750773 2130.0000000 80.8253406 + 7 7 7 1990 199.0000000 105.9040904 2240.0000000 85.4767847 + 8 8 7 1990 133.0000000 103.8236530 2330.0000000 79.9507042 + 9 9 7 1990 124.0000000 89.9447989 2400.0000000 71.5475120 + 10 10 7 1990 123.0000000 84.7600316 2360.0000000 67.5319663 + 11 11 7 1990 99.0000000 80.5730110 2270.0000000 64.3930260 + 12 12 7 1990 88.0000000 76.9380470 2290.0000000 61.6157454 + 13 13 7 1990 84.0000000 73.6522137 2200.0000000 59.0982728 + 14 14 7 1990 72.0000000 70.6735811 2110.0000000 56.8100282 + 15 15 7 1990 55.0000000 67.9659480 2010.0000000 54.7245123 + 16 16 7 1990 65.0000000 65.4979406 1910.0000000 52.8186965 + 17 17 7 1990 50.0000000 63.2422930 1820.0000000 51.0725138 + 18 18 7 1990 50.0000000 61.1752461 1740.0000000 49.4684330 + 19 19 7 1990 46.0000000 59.2760451 1690.0000000 47.9911007 + 20 20 7 1990 44.0000000 57.5265157 1630.0000000 46.6270395 + 21 21 7 1990 42.0000000 55.9107072 1580.0000000 45.3643924 + 22 22 7 1990 37.0000000 54.4145901 1490.0000000 44.1927067 + 23 23 7 1990 38.0000000 53.0257994 1440.0000000 43.1027484 + 24 24 7 1990 44.0000000 51.7334153 1410.0000000 42.0863449 + 25 25 7 1990 30.0000000 50.5277765 1370.0000000 41.1362502 + 26 26 7 1990 26.0000000 49.4003198 1320.0000000 40.2460281 + 27 27 7 1990 31.0000000 48.3434422 1270.0000000 39.4099526 + 28 28 7 1990 33.0000000 51.7210377 1240.0000000 39.0568386 + 29 29 7 1990 42.0000000 48.2492549 1200.0000000 38.0121163 + 30 30 7 1990 36.0000000 46.0333020 1160.0000000 37.3002216 + 31 31 7 1990 34.0000000 45.1576399 1160.0000000 36.6249090 + 32 1 8 1990 25.0000000 44.3293582 1260.0000000 35.9841245 + 33 2 8 1990 22.0000000 43.5441629 1250.0000000 35.3748265 + 34 3 8 1990 28.0000000 42.7982107 1180.0000000 34.7942846 + 35 4 8 1990 25.0000000 42.0880567 1130.0000000 34.2400449 + 36 5 8 1990 19.0000000 41.5005065 1090.0000000 33.8108172 + 37 6 8 1990 22.0000000 40.7935619 1050.0000000 33.2273249 + 38 7 8 1990 19.0000000 40.1687733 1050.0000000 32.7395884 + 39 8 8 1990 22.0000000 39.5725404 1050.0000000 32.2692519 + 40 9 8 1990 19.0000000 38.9995609 1040.0000000 31.8162452 + 41 10 8 1990 20.0000000 38.4479949 1040.0000000 31.3792362 + 42 11 8 1990 19.0000000 37.9161794 1000.0000000 30.9570185 + 43 12 8 1990 19.0000000 37.4026105 993.0000000 30.5484985 + 44 13 8 1990 22.0000000 44.3735367 963.0000000 36.8280468 + 45 14 8 1990 36.0000000 64.0107048 956.0000000 52.5835134 + 46 15 8 1990 31.0000000 54.5706460 988.0000000 36.3289702 + 47 16 8 1990 30.0000000 50.4739768 1040.0000000 39.1295999 + 48 17 8 1990 28.0000000 45.1106373 1070.0000000 34.1581140 + 49 18 8 1990 34.0000000 38.2653310 1070.0000000 30.8855937 + 50 19 8 1990 21.0000000 37.5889209 1030.0000000 30.3720016 + 51 20 8 1990 30.0000000 36.9473168 1020.0000000 29.8829080 + 52 21 8 1990 22.0000000 36.3371676 1010.0000000 29.4161116 + 53 22 8 1990 21.0000000 35.7556345 1020.0000000 28.9696478 + 54 23 8 1990 23.0000000 35.2001829 969.0000000 28.5417599 + 55 24 8 1990 20.0000000 34.6685466 935.0000000 28.1308752 + 56 25 8 1990 29.0000000 34.1696490 924.0000000 27.7426832 + 57 26 8 1990 20.0000000 34.7672378 930.0000000 28.6403545 + 58 27 8 1990 22.0000000 35.6358375 924.0000000 29.3630407 + 59 28 8 1990 23.0000000 33.5797713 951.0000000 27.3679242 + 60 29 8 1990 35.0000000 32.5884340 954.0000000 26.5570182 + 61 30 8 1990 51.0000000 123.4111549 947.0000000 93.9184559 + 62 31 8 1990 80.0000000 116.4903963 958.0000000 56.4542438 + 63 1 9 1990 56.0000000 55.1166184 995.0000000 36.2963904 + 64 2 9 1990 33.0000000 46.5271262 1040.0000000 33.7334606 + 65 3 9 1990 27.0000000 45.0215060 1070.0000000 33.0443464 + 66 4 9 1990 27.0000000 48.0349024 1050.0000000 38.0132724 + 67 5 9 1990 28.0000000 46.9904149 1040.0000000 34.9390215 + 68 6 9 1990 26.0000000 42.4184992 1010.0000000 32.1616571 + 69 7 9 1990 24.0000000 48.4582049 991.0000000 34.5274927 + 70 8 9 1990 33.0000000 44.3701715 1010.0000000 32.4078441 + 71 9 9 1990 26.0000000 40.1364320 1010.0000000 30.3266969 + 72 10 9 1990 27.0000000 38.9696098 1020.0000000 29.5908580 + 73 11 9 1990 22.0000000 37.8936639 1040.0000000 28.9056344 + 74 12 9 1990 22.0000000 36.8982220 998.0000000 28.2657272 + 75 13 9 1990 21.0000000 35.9748505 950.0000000 27.6666424 + 76 14 9 1990 22.0000000 35.1160208 910.0000000 27.1043249 + 77 15 9 1990 22.0000000 34.3150976 863.0000000 26.5751821 + 78 16 9 1990 22.0000000 33.5662221 847.0000000 26.0760255 + 79 17 9 1990 20.0000000 32.8642122 830.0000000 25.6040204 + 80 18 9 1990 22.0000000 32.2044759 854.0000000 25.1566434 + 81 19 9 1990 16.0000000 31.5829377 831.0000000 24.7316441 + 82 20 9 1990 22.0000000 30.9959746 799.0000000 24.3270131 + 83 21 9 1990 19.0000000 41.4524149 790.0000000 32.7003663 + 84 22 9 1990 32.0000000 107.5128740 805.0000000 82.0429400 + 85 23 9 1990 27.0000000 87.9017536 913.0000000 61.9531243 + 86 24 9 1990 45.0000000 63.8726168 998.0000000 43.5167088 + 87 25 9 1990 42.0000000 49.3167741 1150.0000000 36.5416634 + 88 26 9 1990 39.0000000 45.3839839 1390.0000000 34.8388204 + 89 27 9 1990 30.0000000 43.6158677 1420.0000000 33.6098392 + 90 28 9 1990 28.0000000 42.0050483 1290.0000000 32.4848084 + 91 29 9 1990 30.0000000 40.5415417 1180.0000000 31.4522998 + 92 30 9 1990 30.0000000 93.7680646 1110.0000000 87.0532260 + 93 1 10 1990 56.0000000 136.8414558 1130.0000000 111.4553631 + 94 2 10 1990 72.0000000 102.7262756 1110.0000000 75.8956140 + 95 3 10 1990 73.0000000 100.0967868 1290.0000000 79.4403392 + 96 4 10 1990 68.0000000 94.0586395 1440.0000000 72.4255339 + 97 5 10 1990 53.0000000 80.6165716 1360.0000000 64.8060888 + 98 6 10 1990 42.0000000 74.4361918 1320.0000000 59.9589740 + 99 7 10 1990 33.0000000 70.1587416 1390.0000000 56.6618390 + 100 8 10 1990 42.0000000 66.4577870 1300.0000000 53.7984151 + 101 9 10 1990 34.0000000 63.0219333 1190.0000000 51.1024329 + 102 10 10 1990 36.0000000 59.9548778 1120.0000000 48.7050470 + 103 11 10 1990 36.0000000 57.1864246 1110.0000000 46.5375350 + 104 12 10 1990 28.0000000 54.6808935 1070.0000000 44.5726705 + 105 13 10 1990 32.0000000 52.4074271 1020.0000000 42.7868729 + 106 14 10 1990 27.0000000 50.3392516 992.0000000 41.1596612 + 107 15 10 1990 35.0000000 49.0565340 947.0000000 40.6520467 + 108 16 10 1990 42.0000000 49.9033827 906.0000000 41.1231694 + 109 17 10 1990 35.0000000 59.7447356 881.0000000 54.4160746 + 110 18 10 1990 39.0000000 58.3358539 880.0000000 46.6273501 + 111 19 10 1990 34.0000000 49.0713958 872.0000000 40.9622468 + 112 20 10 1990 32.0000000 47.2824442 869.0000000 39.4864355 + 113 21 10 1990 34.0000000 45.6531878 855.0000000 38.1395507 + 114 22 10 1990 27.0000000 44.1579424 825.0000000 36.9030095 + 115 23 10 1990 31.0000000 42.7822752 805.0000000 35.7649542 + 116 24 10 1990 28.0000000 41.5135186 813.0000000 34.7149634 + 117 25 10 1990 25.0000000 41.9539817 803.0000000 35.1756550 + 118 26 10 1990 29.0000000 60.3031174 789.0000000 48.6481987 + 119 27 10 1990 31.0000000 68.0218400 781.0000000 43.1855770 + 120 28 10 1990 65.0000000 197.5338784 786.0000000 128.5607107 + 121 29 10 1990 69.0000000 207.8610264 891.0000000 134.7622814 + 122 30 10 1990 157.0000000 172.4286132 1010.0000000 117.3006904 + 123 31 10 1990 190.0000000 149.9103301 1180.0000000 107.3578811 + 124 1 11 1990 115.0000000 151.2724585 1510.0000000 109.7597925 + 125 2 11 1990 104.0000000 161.1422975 1640.0000000 124.4339218 + 126 3 11 1990 100.0000000 170.3293121 1750.0000000 134.2920507 + 127 4 11 1990 131.0000000 167.0237226 1700.0000000 135.6073227 + 128 5 11 1990 130.0000000 160.4755810 1670.0000000 126.3780312 + 129 6 11 1990 115.0000000 141.1565657 1680.0000000 110.6891819 + 130 7 11 1990 102.0000000 124.2202533 1720.0000000 96.6325544 + 131 8 11 1990 95.0000000 109.9503943 1680.0000000 84.8173504 + 132 9 11 1990 81.0000000 98.6578194 1550.0000000 76.2807193 + 133 10 11 1990 66.0000000 105.1803094 1430.0000000 82.1792860 + 134 11 11 1990 67.0000000 138.2422840 1320.0000000 113.4514587 + 135 12 11 1990 74.0000000 150.1418377 1260.0000000 118.4108619 + 136 13 11 1990 109.0000000 141.4383471 1310.0000000 109.3667034 + 137 14 11 1990 92.0000000 165.5085745 1610.0000000 135.8664898 + 138 15 11 1990 92.0000000 178.3265843 1710.0000000 146.0246224 + 139 16 11 1990 155.0000000 166.9027901 1690.0000000 135.6325577 + 140 17 11 1990 159.0000000 156.3727517 1850.0000000 128.7310638 + 141 18 11 1990 131.0000000 172.6499544 2070.0000000 141.3207033 + 142 19 11 1990 161.0000000 182.8749400 2090.0000000 150.4108542 + 143 20 11 1990 196.0000000 285.2917237 2220.0000000 248.7808549 + 144 21 11 1990 336.0000000 348.5833433 2560.0000000 281.5548160 + 145 22 11 1990 566.0000000 315.9222268 2870.0000000 276.2928321 + 146 23 11 1990 373.0000000 326.4504916 2940.0000000 280.5070254 + 147 24 11 1990 293.0000000 300.4456804 3000.0000000 255.6658900 + 148 25 11 1990 264.0000000 287.2662268 2970.0000000 239.6062437 + 149 26 11 1990 226.0000000 259.1087870 2710.0000000 211.9283554 + 150 27 11 1990 201.0000000 222.1517566 2390.0000000 181.2246596 + 151 28 11 1990 180.0000000 193.1329047 2210.0000000 155.9348086 + 152 29 11 1990 161.0000000 181.1025922 2060.0000000 145.9983655 + 153 30 11 1990 149.0000000 170.5997911 1940.0000000 133.7127019 + 154 1 12 1990 134.0000000 150.0103115 1820.0000000 118.4773601 + 155 2 12 1990 113.0000000 136.1257644 1720.0000000 107.7594246 + 156 3 12 1990 99.0000000 126.8037499 1620.0000000 101.1903303 + 157 4 12 1990 107.0000000 119.7962300 1530.0000000 95.9574793 + 158 5 12 1990 99.0000000 113.5157342 1480.0000000 91.2616430 + 159 6 12 1990 89.0000000 107.7525639 1450.0000000 86.9928181 + 160 7 12 1990 77.0000000 102.6048713 1390.0000000 83.1576347 + 161 8 12 1990 71.0000000 97.9738095 1330.0000000 79.6953655 + 162 9 12 1990 68.0000000 93.7951172 1270.0000000 76.5603135 + 163 10 12 1990 73.0000000 90.0135560 1210.0000000 73.7131263 + 164 11 12 1990 84.0000000 86.5814974 1180.0000000 71.1198111 + 165 12 12 1990 88.0000000 104.6361966 1190.0000000 78.8784139 + 166 13 12 1990 92.0000000 110.5219402 1220.0000000 78.7826679 + 167 14 12 1990 128.0000000 102.4909897 1200.0000000 75.4388619 + 168 15 12 1990 136.0000000 95.5294814 1190.0000000 72.2040536 + 169 16 12 1990 114.0000000 91.1257681 1180.0000000 69.4949941 + 170 17 12 1990 101.0000000 87.2554603 1120.0000000 67.0423779 + 171 18 12 1990 93.0000000 83.7668615 1070.0000000 64.8124417 + 172 19 12 1990 85.0000000 80.6119291 1060.0000000 62.7782020 + 173 20 12 1990 81.0000000 77.7494591 1040.0000000 60.9163856 + 174 21 12 1990 106.0000000 114.6204625 1040.0000000 74.0210126 + 175 22 12 1990 159.0000000 141.3556640 1040.0000000 80.1237644 + 176 23 12 1990 250.0000000 154.5564034 1090.0000000 90.2383132 + 177 24 12 1990 298.0000000 145.3569327 1200.0000000 85.4895295 + 178 25 12 1990 261.0000000 189.4888379 1320.0000000 136.1064768 + 179 26 12 1990 228.0000000 299.6730496 1410.0000000 214.8307816 + 180 27 12 1990 409.0000000 365.2842939 1510.0000000 269.1091008 + 181 28 12 1990 486.0000000 388.3900175 1680.0000000 277.2343161 + 182 29 12 1990 440.0000000 497.5656167 1970.0000000 373.4622985 + 183 30 12 1990 486.0000000 628.3475828 2190.0000000 491.7502968 + 184 31 12 1990 774.0000000 719.1583910 2440.0000000 584.5720199 + 185 1 1 1991 889.0000000 764.6221990 2950.0000000 603.2942385 + 186 2 1 1991 863.0000000 811.8395113 3300.0000000 629.2303793 + 187 3 1 1991 875.0000000 873.7661048 3520.0000000 626.8851509 + 188 4 1 1991 932.0000000 785.5258755 3700.0000000 558.9071565 + 189 5 1 1991 826.0000000 742.5746004 3710.0000000 523.5407613 + 190 6 1 1991 731.0000000 693.4600222 3620.0000000 491.5926968 + 191 7 1 1991 613.0000000 656.1768254 3430.0000000 490.9337716 + 192 8 1 1991 610.0000000 645.2278487 3180.0000000 471.1416790 + 193 9 1 1991 686.0000000 582.3474737 3130.0000000 420.3082164 + 194 10 1 1991 556.0000000 618.7408134 3200.0000000 431.5724603 + 195 11 1 1991 669.0000000 654.5329362 3080.0000000 453.5587814 + 196 12 1 1991 828.0000000 615.0932721 3010.0000000 424.7723311 + 197 13 1 1991 735.0000000 504.8750054 2930.0000000 349.7425448 + 198 14 1 1991 513.0000000 417.1584608 2870.0000000 290.9444212 + 199 15 1 1991 411.0000000 346.5512717 2700.0000000 243.2943397 + 200 16 1 1991 345.0000000 290.1236183 2520.0000000 205.7985554 + 201 17 1 1991 293.0000000 248.3467308 2310.0000000 179.0236819 + 202 18 1 1991 251.0000000 219.1600626 2140.0000000 160.0851026 + 203 19 1 1991 222.0000000 198.6662651 2020.0000000 146.4654310 + 204 20 1 1991 215.0000000 184.6031319 1910.0000000 137.5699044 + 205 21 1 1991 213.0000000 179.3637364 1780.0000000 135.1104657 + 206 22 1 1991 202.0000000 179.6106929 1690.0000000 132.8981642 + 207 23 1 1991 200.0000000 171.0918878 1630.0000000 127.1691804 + 208 24 1 1991 192.0000000 162.3369371 1570.0000000 121.4003715 + 209 25 1 1991 176.0000000 154.3578715 1470.0000000 116.1994970 + 210 26 1 1991 164.0000000 147.2963901 1410.0000000 111.5288220 + 211 27 1 1991 157.0000000 140.8582460 1370.0000000 107.3184936 + 212 28 1 1991 134.0000000 135.0734838 1320.0000000 103.5094922 + 213 29 1 1991 130.0000000 129.8578922 1270.0000000 100.0513942 + 214 30 1 1991 119.0000000 125.1394648 1240.0000000 96.9009755 + 215 31 1 1991 107.0000000 120.8564814 1230.0000000 94.0210665 + 216 1 2 1991 112.0000000 116.9558758 1200.0000000 91.3796067 + 217 2 2 1991 109.0000000 113.3918896 1160.0000000 88.9488631 + 218 3 2 1991 101.0000000 110.1249560 1130.0000000 86.7047803 + 219 4 2 1991 98.0000000 107.1207714 1110.0000000 84.6264380 + 220 5 2 1991 84.0000000 104.3495202 1090.0000000 82.6955972 + 221 6 2 1991 93.0000000 101.7852256 1070.0000000 80.8963186 + 222 7 2 1991 80.0000000 99.4052026 1040.0000000 79.2146407 + 223 8 2 1991 73.0000000 97.1895977 1010.0000000 77.6383079 + 224 9 2 1991 89.0000000 95.1209986 1020.0000000 76.1565397 + 225 10 2 1991 84.0000000 93.1841032 1030.0000000 74.7598339 + 226 11 2 1991 78.0000000 91.3654377 1040.0000000 73.4397992 + 227 12 2 1991 79.0000000 89.6531160 1040.0000000 72.1890114 + 228 13 2 1991 77.0000000 88.0366339 1010.0000000 71.0008907 + 229 14 2 1991 80.0000000 86.5066923 992.0000000 69.8695951 + 230 15 2 1991 72.0000000 85.0550450 976.0000000 68.7899298 + 231 16 2 1991 78.0000000 85.8736718 989.0000000 68.8128147 + 232 17 2 1991 74.0000000 85.3867407 1000.0000000 68.1354756 + 233 18 2 1991 77.0000000 83.6919039 995.0000000 67.0840098 + 234 19 2 1991 73.0000000 94.0470825 978.0000000 78.5798412 + 235 20 2 1991 69.0000000 109.5608065 952.0000000 89.0714900 + 236 21 2 1991 74.0000000 139.0785034 959.0000000 112.4383418 + 237 22 2 1991 81.0000000 150.9027601 959.0000000 119.0100199 + 238 23 2 1991 110.0000000 146.8927039 979.0000000 118.3385319 + 239 24 2 1991 180.0000000 143.3698782 1020.0000000 115.9725904 + 240 25 2 1991 213.0000000 140.9996162 1060.0000000 115.2188474 + 241 26 2 1991 222.0000000 137.9749965 1110.0000000 113.9815241 + 242 27 2 1991 208.0000000 138.0704372 1170.0000000 113.8371101 + 243 28 2 1991 211.0000000 132.8899819 1230.0000000 107.7563239 + 244 1 3 1991 214.0000000 127.6689458 1240.0000000 102.8218255 + 245 2 3 1991 208.0000000 135.6963105 1230.0000000 108.1568701 + 246 3 3 1991 221.0000000 134.5045752 1260.0000000 106.1247156 + 247 4 3 1991 281.0000000 125.9267919 1290.0000000 100.3374664 + 248 5 3 1991 219.0000000 120.6563725 1310.0000000 96.4584116 + 249 6 3 1991 190.0000000 115.9535767 1360.0000000 92.9397832 + 250 7 3 1991 173.0000000 111.7073062 1340.0000000 89.7379518 + 251 8 3 1991 164.0000000 108.0631057 1310.0000000 87.2372381 + 252 9 3 1991 142.0000000 105.7758850 1290.0000000 86.1106168 + 253 10 3 1991 133.0000000 105.4377544 1300.0000000 86.3121355 + 254 11 3 1991 133.0000000 102.4183835 1310.0000000 83.6231026 + 255 12 3 1991 118.0000000 99.2281580 1350.0000000 81.0142790 + 256 13 3 1991 127.0000000 96.3406856 1340.0000000 78.7839139 + 257 14 3 1991 113.0000000 93.6832894 1320.0000000 76.7231141 + 258 15 3 1991 107.0000000 91.2279641 1300.0000000 74.8134497 + 259 16 3 1991 100.0000000 88.9528204 1280.0000000 73.0388030 + 260 17 3 1991 100.0000000 86.8386732 1230.0000000 71.3850257 + 261 18 3 1991 95.0000000 84.8815059 1180.0000000 69.8396701 + 262 19 3 1991 98.0000000 140.5953685 1160.0000000 108.6118905 + 263 20 3 1991 119.0000000 148.4504607 1180.0000000 103.6295148 + 264 21 3 1991 159.0000000 163.4528924 1260.0000000 118.7720881 + 265 22 3 1991 196.0000000 177.8039119 1410.0000000 126.6954223 + 266 23 3 1991 242.0000000 161.7107768 1530.0000000 117.4156267 + 267 24 3 1991 216.0000000 149.0102577 1700.0000000 109.4284899 + 268 25 3 1991 180.0000000 140.2027609 1830.0000000 104.1077861 + 269 26 3 1991 145.0000000 133.1028361 1720.0000000 100.0544856 + 270 27 3 1991 127.0000000 128.1770650 1600.0000000 97.0821520 + 271 28 3 1991 117.0000000 121.6523245 1520.0000000 92.6438899 + 272 29 3 1991 109.0000000 116.2691163 1500.0000000 89.0954583 + 273 30 3 1991 106.0000000 111.4257940 1490.0000000 85.8797689 + 274 31 3 1991 99.0000000 107.0536608 1440.0000000 82.9559674 + 275 1 4 1991 96.0000000 103.0940369 1380.0000000 80.2889135 + 276 2 4 1991 88.0000000 99.4965131 1330.0000000 77.8482860 + 277 3 4 1991 87.0000000 96.2176520 1290.0000000 75.6078438 + 278 4 4 1991 82.0000000 93.6429041 1270.0000000 73.8562399 + 279 5 4 1991 84.0000000 91.7304092 1220.0000000 72.4491277 + 280 6 4 1991 67.0000000 89.0370619 1180.0000000 70.5105811 + 281 7 4 1991 89.0000000 86.7356608 1190.0000000 68.8839394 + 282 8 4 1991 75.0000000 84.7441984 1230.0000000 67.4885437 + 283 9 4 1991 79.0000000 82.7743517 1230.0000000 66.0920804 + 284 10 4 1991 70.0000000 80.8227965 1230.0000000 64.7069556 + 285 11 4 1991 69.0000000 78.9887015 1220.0000000 63.3991531 + 286 12 4 1991 69.0000000 77.2758782 1200.0000000 62.1692279 + 287 13 4 1991 56.0000000 75.6731395 1150.0000000 61.0123954 + 288 14 4 1991 63.0000000 74.1821394 1110.0000000 59.9331904 + 289 15 4 1991 58.0000000 72.7666979 1080.0000000 58.8918414 + 290 16 4 1991 56.0000000 71.4265431 1060.0000000 57.9044388 + 291 17 4 1991 54.0000000 70.1597512 1030.0000000 56.9645466 + 292 18 4 1991 57.0000000 68.9817264 1020.0000000 56.0756087 + 293 19 4 1991 53.0000000 69.0548521 1000.0000000 56.4860324 + 294 20 4 1991 53.0000000 68.8187889 1040.0000000 56.4938448 + 295 21 4 1991 65.0000000 67.6987944 1050.0000000 55.0478244 + 296 22 4 1991 69.0000000 69.5888436 1000.0000000 56.0703232 + 297 23 4 1991 61.0000000 71.3272811 1010.0000000 56.8428676 + 298 24 4 1991 56.0000000 67.9474450 1030.0000000 54.7984409 + 299 25 4 1991 56.0000000 66.3731093 1050.0000000 53.8456035 + 300 26 4 1991 53.0000000 65.2145689 1020.0000000 53.0005592 + 301 27 4 1991 49.0000000 64.1334786 1020.0000000 52.1968731 + 302 28 4 1991 53.0000000 63.1694696 1010.0000000 51.5055513 + 303 29 4 1991 48.0000000 66.4066745 982.0000000 52.4569481 + 304 30 4 1991 57.0000000 111.9785467 983.0000000 91.8062627 + 305 1 5 1991 69.0000000 106.9743252 1090.0000000 78.3615309 + 306 2 5 1991 89.0000000 84.4639269 1140.0000000 66.9821091 + 307 3 5 1991 105.0000000 80.9906653 1190.0000000 64.5198033 + 308 4 5 1991 79.0000000 78.5935539 1270.0000000 62.8759010 + 309 5 5 1991 69.0000000 76.6946591 1260.0000000 61.7377952 + 310 6 5 1991 71.0000000 74.9305458 1250.0000000 60.3344494 + 311 7 5 1991 60.0000000 72.6767601 1210.0000000 58.6539582 + 312 8 5 1991 64.0000000 70.7835058 1200.0000000 57.2626369 + 313 9 5 1991 59.0000000 69.0379058 1190.0000000 55.9641197 + 314 10 5 1991 57.0000000 70.0229179 1130.0000000 58.7945292 + 315 11 5 1991 55.0000000 71.9344624 1090.0000000 59.0147113 + 316 12 5 1991 53.0000000 68.4801409 1080.0000000 56.5258670 + 317 13 5 1991 52.0000000 66.5873448 1320.0000000 54.9287881 + 318 14 5 1991 50.0000000 65.9582012 1920.0000000 55.0123370 + 319 15 5 1991 52.0000000 70.7344990 2050.0000000 61.2833899 + 320 16 5 1991 54.0000000 71.2954472 1820.0000000 59.3016608 + 321 17 5 1991 54.0000000 66.3377271 1720.0000000 55.5539259 + 322 18 5 1991 55.0000000 64.8744837 1730.0000000 54.3516571 + 323 19 5 1991 48.0000000 63.5187718 1730.0000000 53.2257430 + 324 20 5 1991 48.0000000 62.2410744 1720.0000000 52.1633405 + 325 21 5 1991 49.0000000 61.0341818 1700.0000000 51.1589260 + 326 22 5 1991 41.0000000 59.8918961 1610.0000000 50.2075170 + 327 23 5 1991 40.0000000 58.8086335 1530.0000000 49.3046134 + 328 24 5 1991 40.0000000 57.7793590 1470.0000000 48.4461464 + 329 25 5 1991 39.0000000 56.7995274 1410.0000000 47.6284347 + 330 26 5 1991 43.0000000 55.8650321 1360.0000000 46.8481445 + 331 27 5 1991 39.0000000 54.9721591 1320.0000000 46.1022543 + 332 28 5 1991 36.0000000 54.1175470 1260.0000000 45.3880236 + 333 29 5 1991 33.0000000 53.2981503 1250.0000000 44.7029650 + 334 30 5 1991 39.0000000 52.5112081 1230.0000000 44.0448189 + 335 31 5 1991 34.0000000 51.7542149 1220.0000000 43.4115315 + 336 1 6 1991 37.0000000 51.0248956 1190.0000000 42.8012348 + 337 2 6 1991 35.0000000 50.3211827 1160.0000000 42.2122282 + 338 3 6 1991 29.0000000 49.6411957 1130.0000000 41.6429632 + 339 4 6 1991 33.0000000 48.9832232 1120.0000000 41.0920283 + 340 5 6 1991 34.0000000 48.9544322 1150.0000000 41.2412990 + 341 6 6 1991 32.0000000 68.1797389 1200.0000000 48.2612270 + 342 7 6 1991 38.0000000 69.2244711 1260.0000000 53.6663368 + 343 8 6 1991 39.0000000 58.8088604 1330.0000000 45.6693037 + 344 9 6 1991 41.0000000 58.3912596 1390.0000000 49.8069225 + 345 10 6 1991 44.0000000 70.2971129 1380.0000000 50.0809364 + 346 11 6 1991 48.0000000 55.5265813 1460.0000000 43.1524952 + 347 12 6 1991 42.0000000 52.4948456 1500.0000000 42.2857944 + 348 13 6 1991 37.0000000 51.5468572 1510.0000000 41.5396569 + 349 14 6 1991 39.0000000 51.0837697 1480.0000000 40.8463754 + 350 15 6 1991 35.0000000 50.7023821 1450.0000000 41.3502006 + 351 16 6 1991 31.0000000 53.7941097 1440.0000000 45.6975511 + 352 17 6 1991 33.0000000 57.1779695 1410.0000000 48.1349698 + 353 18 6 1991 31.0000000 54.1134068 1580.0000000 44.8865372 + 354 19 6 1991 28.0000000 51.1146935 2060.0000000 42.3299763 + 355 20 6 1991 60.0000000 89.5942132 2540.0000000 71.0335393 + 356 21 6 1991 48.0000000 74.3916816 2650.0000000 52.6941076 + 357 22 6 1991 54.0000000 61.1966837 2550.0000000 49.1119773 + 358 23 6 1991 63.0000000 67.5246095 2470.0000000 50.0799321 + 359 24 6 1991 41.0000000 60.9650912 2420.0000000 45.9327946 + 360 25 6 1991 42.0000000 56.6521680 2340.0000000 44.6793380 + 361 26 6 1991 43.0000000 55.3277617 2280.0000000 43.9508796 + 362 27 6 1991 38.0000000 65.9402104 2170.0000000 48.4526080 + 363 28 6 1991 38.0000000 64.1201368 2140.0000000 49.6252595 + 364 29 6 1991 35.0000000 57.0318052 2160.0000000 44.9772998 + 365 30 6 1991 41.0000000 54.6054874 2210.0000000 43.1772386 diff --git a/check/case_05/simulation_mhm_case05.ini b/check/case_05/simulation_mhm_case05.ini new file mode 100644 index 00000000..3a03e18d --- /dev/null +++ b/check/case_05/simulation_mhm_case05.ini @@ -0,0 +1,53 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_05 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig__nbasins = 3 +nml__mainconfig__resolution_hydrology = [24000, 24000, 24000] +nml__mainconfig__l0basin = [1, 1, 1] +nml__mainconfig_mhm_mrm__dir_restartin = [../../test_basin/restart/, ../../test_basin/restart/, ../../test_basin/restart/] +nml__mainconfig_mhm_mrm__resolution_Routing = [24000, 24000, 24000] +nml__directories_general__dir_morpho = [../../test_basin/input/morph/, ../../test_basin/input/morph/, ../../test_basin/input/morph/] +nml__directories_general__dir_lcover = [../../test_basin/input/luse/, ../../test_basin/input/luse/, ../../test_basin/input/luse/] +nml__directories_general__dir_restartout = [output_b1/b1_, output_b1/b2_, output_b1/b3_] +nml__directories_general__dir_out = [output_b1/b1_, output_b1/b2_, output_b1/b3_] +nml__directories_general__file_latlon = [../../test_basin/input/latlon/latlon_1.nc, ../../test_basin/input/latlon/latlon_1.nc, ../../test_basin/input/latlon/latlon_1.nc] +nml__directories_mhm__dir_precipitation = [../../test_basin/input/meteo/pre/, ../../test_basin/input/meteo/pre/, ../../test_basin/input/meteo/pre/] +nml__directories_mhm__dir_temperature = [../../test_basin/input/meteo/tavg/, ../../test_basin/input/meteo/tavg/, ../../test_basin/input/meteo/tavg/] +nml__directories_mhm__dir_referenceet = [../../test_basin/input/meteo/pet/, ../../test_basin/input/meteo/pet/, ../../test_basin/input/meteo/pet/] +nml__directories_mhm__dir_mintemperature = [../../test_basin/input/meteo/, ../../test_basin/input/meteo/, ../../test_basin/input/meteo/] +nml__directories_mhm__dir_maxtemperature = [../../test_basin/input/meteo/, ../../test_basin/input/meteo/, ../../test_basin/input/meteo/] +nml__directories_mhm__dir_netradiation = [../../test_basin/input/meteo/, ../../test_basin/input/meteo/, ../../test_basin/input/meteo/] +nml__directories_mhm__dir_absvappressure = [../../test_basin/input/meteo/, ../../test_basin/input/meteo/, ../../test_basin/input/meteo/] +nml__directories_mhm__dir_windspeed = [../../test_basin/input/meteo/, ../../test_basin/input/meteo/, ../../test_basin/input/meteo/] +nml__directories_mhm__time_step_model_inputs = [0, 0, 0] +nml__directories_mrm__dir_gauges = [../../test_basin/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin/input/gauge/] +nml__directories_mrm__dir_total_runoff = [../../test_basin/input/gauge/, ../../test_basin/input/gauge/, ../../test_basin/input/gauge/] +nml__time_periods__warming_days = [181, 181, 181] +nml__time_periods__eval_per(1) = {ystart: 1990, mstart: 7, dstart: 1, yend: 1991, mend: 6, dend: 30} +nml__time_periods__eval_per(2) = {ystart: 1990, mstart: 7, dstart: 1, yend: 1991, mend: 6, dend: 30} +nml__time_periods__eval_per(3) = {ystart: 1990, mstart: 7, dstart: 1, yend: 1991, mend: 6, dend: 30} +nml__lai_data_information__timestep_lai_input = -2 +nml__directories_mpr__dir_gridded_lai = [../../test_basin/input/lai/, ../../test_basin/input/lai/, ../../test_basin/input/lai/] +nml__evaluation_gauges__ngaugestotal = 6 +nml__evaluation_gauges__nogauges_basin = [2, 2, 2] +nml__evaluation_gauges__gauge_id = [398, 333], [398, 333], [398, 333] +nml__evaluation_gauges__gauge_filename = [00398.txt, 00333.txt], [00398.txt, 00333.txt], [00398.txt, 00333.txt] +nml__inflow_gauges__ninflowgaugestotal = 2 +nml__inflow_gauges__noinflowgauges_basin = [1, 1, 0] +nml__inflow_gauges__inflowgauge_id = [333], [333] +nml__inflow_gauges__inflowgauge_filename = [00333.txt], [00333.txt] +nml__inflow_gauges__inflowgauge_headwater = [False], [True] + +mhm_outputs__nloutputresults__timestep_model_outputs = 336 diff --git a/check/case_06/mhm.nml b/check/case_06/mhm.nml index 29cca469..f177c05d 100644 --- a/check/case_06/mhm.nml +++ b/check/case_06/mhm.nml @@ -1,574 +1,147 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ -! -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -&directories_general -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/b1_" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_mHM -! -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "../../test_basin/input/optional_data/" -dir_soil_moisture(2) = "../../test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 2 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .true. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 28 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 540 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1991 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' - -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' -/ -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. +/ + +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 28 + opti_method = 1 + optimize = .true. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 +/ + +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' +/ + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. +/ + +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 6 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optional_data + dir_soil_moisture(1) = '../../test_basin/input/optional_data/' + nsoilhorizons_sm_input = 1 + timestep_sm_input = -2 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 6 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_06/output_save/ConfigFile.log b/check/case_06/output_save/ConfigFile.log index b310724b..98b4d40b 100644 --- a/check/case_06/output_save/ConfigFile.log +++ b/check/case_06/output_save/ConfigFile.log @@ -1,22 +1,23 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.7 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N -Number of basins 2 -Total No. of nodes 68 -Total No. of reaches 67 -No. of cells L0 46545 -No. of cells L1 68 -No. of cells L11 68 -Total No. of gauges 2 +Number of basins 1 +Total No. of gauges 1 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 1 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. -Basin 2 Hydrology Resolution [m] 24000. -Basin 2 Routing Resolution [m] 24000. Flag READ restart F Flag WRITE restart T @@ -25,42 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - -------------------------------------------------------------- - Model Run Periods for Basin 2 -------------------------------------------------------------- - From To - Day Month Year Day Month Year -Warming Period (1) 10 7 1989 31 12 1990 -Evaluation Period (2) 1 1 1991 31 12 1993 -Simulation Period (1)+(2) 10 7 1989 31 12 1993 - - --------------------------------------------------- - Land Cover Observations for Basin 3 --------------------------------------------------- - Year Land cover scene Land Cover File - - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 2 lc_1990.asc - 1990 2 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -124,8 +98,7 @@ Simulation Period (1)+(2) 10 7 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 - 2 2 1600.000 11.000 + 1 1 932.000 16.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -194,40 +167,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -271,145 +244,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - --------------------------------------------------------------------------------- - Directory list --------------------------------------------------------------------------------- -Directory to morphological input ../../test_basin/input/morph/ -Directory to land cover input ../../test_basin/input/luse/ -Directory to gauging station input ../../test_basin/input/gauge/ -Directory to precipitation input ../../test_basin/input/meteo/pre/ -Directory to temperature input ../../test_basin/input/meteo/tavg/ -Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/b2_ -Directory to write output when restarted output_b1/b2_ - ------------------------------- -River Network (Routing level) ------------------------------- - Label 0 = intermediate draining cell - Label 1 = headwater cell - Label 2 = sink cell - ---------------------------------------------------------------------------- - Overall From To Routing Label Length Mean - Link Routing Routing Sequence Slope - Id Node Node [km] [o/oo] ---------------------------------------------------------------------------- - 35 1 5 1 1 7.536 0.100 - 40 7 3 2 1 28.349 0.100 - 43 10 9 3 1 9.243 1.190 - 44 11 8 4 1 40.042 0.999 - 48 15 14 5 1 27.728 0.938 - 53 20 19 6 1 28.435 1.653 - 54 21 16 7 1 21.728 4.786 - 58 25 24 8 1 32.127 4.171 - 63 30 26 9 1 28.642 3.840 - 66 33 29 10 1 27.142 13.116 - 67 34 32 11 1 31.763 2.613 - 36 3 4 12 0 29.642 0.100 - 41 8 4 13 0 1.414 0.100 - 47 14 13 14 0 38.213 0.576 - 49 16 17 15 0 9.985 0.100 - 52 19 18 16 0 33.799 1.036 - 59 26 22 17 0 61.734 0.794 - 62 29 28 18 0 6.243 3.204 - 65 32 31 19 0 16.399 1.342 - 37 4 5 20 0 38.420 0.833 - 46 13 12 21 0 42.127 0.166 - 51 18 17 22 0 42.542 0.282 - 61 28 24 23 0 32.835 1.980 - 64 31 27 24 0 32.728 2.781 - 57 24 23 25 0 34.420 1.133 - 60 27 23 26 0 29.799 1.141 - 56 23 22 27 0 0.707 0.100 - 55 22 17 28 0 38.456 0.364 - 50 17 12 29 0 35.885 1.728 - 45 12 9 30 0 30.263 0.100 - 42 9 5 31 0 24.399 0.100 - 38 5 6 32 0 5.036 0.100 - 39 6 2 33 2 14.692 0.100 - --------------------- - Overall Basin - Cell Routing - Id Node Id --------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 - ------------------------------- - Modeling Routing Effective - Cell Cell Id Area - Id [-] [km2] ------------------------------- - 35 1 126.750 - 36 2 229.750 - 37 3 107.750 - 38 4 312.500 - 39 5 573.750 - 40 6 314.250 - 41 7 42.500 - 42 8 524.750 - 43 9 576.000 - 44 10 146.500 - 45 11 470.000 - 46 12 576.000 - 47 13 414.500 - 48 14 340.750 - 49 15 9.000 - 50 16 230.250 - 51 17 576.000 - 52 18 576.000 - 53 19 527.250 - 54 20 48.250 - 55 21 10.500 - 56 22 545.000 - 57 23 576.000 - 58 24 576.000 - 59 25 318.500 - 60 26 456.250 - 61 27 551.250 - 62 28 576.000 - 63 29 337.000 - 64 30 3.250 - 65 31 198.000 - 66 32 555.250 - 67 33 89.000 - 68 34 121.750 ------------------------------- - Total[km2] 11636.250 - - + diff --git a/check/case_06/output_save/FinalParam.nml b/check/case_06/output_save/FinalParam.nml index 12aa095b..d27dfb3e 100644 --- a/check/case_06/output_save/FinalParam.nml +++ b/check/case_06/output_save/FinalParam.nml @@ -1,92 +1,146 @@ !global_parameters - !PARAMETER lower_bound upper_bound value FLAG SCALING + !PARAMETER lower_bound upper_bound value FLAG + SCALING ! interception &interception1 - canopyInterceptionFactor = 0.1500000000000000 , 0.4000000000000000 , 0.1702726528592087 , 1 , 1 + canopyInterceptionFactor = 0.150000000000000 , 0.400000000000000 + , 0.234992182414766 , 1 , 1 / ! snow &snow1 - snowTreshholdTemperature = -2.0000000000000000 , 2.0000000000000000 , 1.1397656552965350 , 1 , 1 - degreeDayFactor_forest = 1.0000000000000000E-04 , 4.0000000000000000 , 2.3345459263980697 , 1 , 1 - degreeDayFactor_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.6246737517542684 , 1 , 1 - degreeDayFactor_pervious = 0.0000000000000000 , 2.0000000000000000 , 0.8886902848126816 , 1 , 1 - increaseDegreeDayFactorByPrecip = 0.1000000000000000 , 0.9000000000000000 , 0.6526370534505126 , 1 , 1 - maxDegreeDayFactor_forest = 0.0000000000000000 , 8.0000000000000000 , 3.0000000000000000 , 1 , 1 - maxDegreeDayFactor_impervious = 0.0000000000000000 , 8.0000000000000000 , 4.3361937741322478 , 1 , 1 - maxDegreeDayFactor_pervious = 0.0000000000000000 , 8.0000000000000000 , 5.0789612998863713 , 1 , 1 + snowTreshholdTemperature = -2.00000000000000 , 2.00000000000000 + , 1.25390364043856 , 1 , 1 + degreeDayFactor_forest = 1.000000000000000E-004 , 4.00000000000000 + , 2.95795155077323 , 1 , 1 + degreeDayFactor_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 0.483090415398036 , 1 , 1 + degreeDayFactor_pervious = 0.000000000000000E+000 , 2.00000000000000 + , 1.13271411929245 , 1 , 1 + increaseDegreeDayFactorByPrecip = 0.100000000000000 , + 0.900000000000000 , 0.660612605032073 , 1 , 1 + maxDegreeDayFactor_forest = 0.000000000000000E+000 , + 8.00000000000000 , 3.07504025961314 , 1 , 1 + maxDegreeDayFactor_impervious = 0.000000000000000E+000 , + 8.00000000000000 , 4.03154016804875 , 1 , 1 + maxDegreeDayFactor_pervious = 0.000000000000000E+000 , + 8.00000000000000 , 5.65569750791907 , 1 , 1 / ! soilmoisture &soilmoisture1 - orgMatterContent_forest = 0.0000000000000000 , 20.0000000000000000 , 3.3999999999999999 , 1 , 1 - orgMatterContent_impervious = 0.0000000000000000 , 1.0000000000000000 , 3.7827550914304356E-02 , 1 , 1 - orgMatterContent_pervious = 0.0000000000000000 , 4.0000000000000000 , 0.6000000000000000 , 1 , 1 - PTF_lower66_5_constant = 0.6462000000000000 , 0.9506000000000000 , 0.7634945783330134 , 1 , 1 - PTF_lower66_5_clay = 1.0000000000000000E-04 , 2.8999999999999998E-03 , 8.9999999999999998E-04 , 1 , 1 - PTF_lower66_5_Db = -0.3727000000000000 , -0.1871000000000000 , -0.2677319049896121 , 1 , 1 - PTF_higher66_5_constant = 0.5358000000000001 , 1.1232000000000000 , 0.8900000000000000 , 1 , 1 - PTF_higher66_5_clay = -5.4999999999999997E-03 , 4.8999999999999998E-03 , -1.0000000000000000E-03 , 1 , 1 - PTF_higher66_5_Db = -0.5513000000000000 , -9.1300000000000006E-02 , -0.4370750523458311 , 1 , 1 - PTF_Ks_constant = -1.2000000000000000 , -0.2850000000000000 , -0.8623471218124126 , 1 , 1 - PTF_Ks_sand = 6.0000000000000001E-03 , 2.5999999999999999E-02 , 1.6333366315764774E-02 , 1 , 1 - PTF_Ks_clay = 3.0000000000000001E-03 , 1.2999999999999999E-02 , 8.3482827901187016E-03 , 1 , 1 - PTF_Ks_curveSlope = 60.9600000000000009 , 60.9600000000000009 , 60.9600000000000009 , 0 , 1 - rootFractionCoefficient_forest = 0.9000000000000000 , 0.9990000000000000 , 0.9607883388584286 , 1 , 1 - rootFractionCoefficient_impervious = 0.9000000000000000 , 0.9500000000000000 , 0.9154009387534311 , 1 , 1 - rootFractionCoefficient_pervious = 1.0000000000000000E-03 , 8.9999999999999997E-02 , 2.4194024950468091E-02 , 1 , 1 - infiltrationShapeFactor = 1.0000000000000000 , 4.0000000000000000 , 2.6369283951057225 , 1 , 1 + orgMatterContent_forest = 0.000000000000000E+000 , 20.0000000000000 + , 13.9913675012930 , 1 , 1 + orgMatterContent_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 1.111632546872070E-002 , 1 , 1 + orgMatterContent_pervious = 0.000000000000000E+000 , + 4.00000000000000 , 0.896613581800218 , 1 , 1 + PTF_lower66_5_constant = 0.646200000000000 , 0.950600000000000 + , 0.707150874596424 , 1 , 1 + PTF_lower66_5_clay = 1.000000000000000E-004 , 2.900000000000000E-003 , + 1.058490426074058E-003 , 1 , 1 + PTF_lower66_5_Db = -0.372700000000000 , -0.187100000000000 , + -0.254022390988897 , 1 , 1 + PTF_higher66_5_constant = 0.535800000000000 , 1.12320000000000 + , 0.809060290214743 , 1 , 1 + PTF_higher66_5_clay = -5.500000000000000E-003 , 4.900000000000000E-003 , + -2.299235003946245E-003 , 1 , 1 + PTF_higher66_5_Db = -0.551300000000000 , -9.130000000000001E-002 , + -0.344114444880436 , 1 , 1 + PTF_Ks_constant = -1.20000000000000 , -0.285000000000000 , + -0.854234515958249 , 1 , 1 + PTF_Ks_sand = 6.000000000000000E-003 , 2.600000000000000E-002 , + 1.663437930459590E-002 , 1 , 1 + PTF_Ks_clay = 3.000000000000000E-003 , 1.300000000000000E-002 , + 7.969449304702616E-003 , 1 , 1 + PTF_Ks_curveSlope = 60.9600000000000 , 60.9600000000000 , + 60.9600000000000 , 0 , 1 + rootFractionCoefficient_forest = 0.900000000000000 , + 0.999000000000000 , 0.970835129054173 , 1 , 1 + rootFractionCoefficient_impervious = 0.900000000000000 , + 0.950000000000000 , 0.934171221935173 , 1 , 1 + rootFractionCoefficient_pervious = 1.000000000000000E-003 , + 9.000000000000000E-002 , 2.528341007287577E-002 , 1 , 1 + infiltrationShapeFactor = 1.00000000000000 , 4.00000000000000 + , 3.86248901890797 , 1 , 1 / ! directSealedAreaRunoff &directRunoff1 - imperviousStorageCapacity = 0.0000000000000000 , 5.0000000000000000 , 0.5000000000000000 , 1 , 1 + imperviousStorageCapacity = 0.000000000000000E+000 , + 5.00000000000000 , 0.215051846020602 , 1 , 1 / ! potential evapotranspiration &PET0 - minCorrectionFactorPET = 0.7000000000000000 , 1.3000000000000000 , 0.8910563772669731 , 1 , 1 - maxCorrectionFactorPET = 0.0000000000000000 , 0.2000000000000000 , 0.1577058165077994 , 1 , 1 - aspectTresholdPET = 1.6000000000000000E+02 , 2.0000000000000000E+02 , 1.7666318416383174E+02 , 1 , 1 + minCorrectionFactorPET = 0.700000000000000 , 1.30000000000000 + , 0.725233831453393 , 1 , 1 + maxCorrectionFactorPET = 0.000000000000000E+000 , 0.200000000000000 + , 0.139708932048905 , 1 , 1 + aspectTresholdPET = 160.000000000000 , 200.000000000000 , + 176.144939444976 , 1 , 1 / ! interflow &interflow1 - interflowStorageCapacityFactor = 75.0000000000000000 , 2.0000000000000000E+02 , 1.3497272229391288E+02 , 1 , 1 - interflowRecession_slope = 0.0000000000000000 , 10.0000000000000000 , 9.3568342545530570 , 1 , 1 - fastInterflowRecession_forest = 1.0000000000000000 , 3.0000000000000000 , 1.0382548190400636 , 1 , 1 - slowInterflowRecession_Ks = 1.0000000000000000 , 30.0000000000000000 , 5.3191889984863536 , 1 , 1 - exponentSlowInterflow = 5.0000000000000003E-02 , 0.3000000000000000 , 0.1645529500524848 , 1 , 1 + interflowStorageCapacityFactor = 75.0000000000000 , + 200.000000000000 , 75.1482244672275 , 1 , 1 + interflowRecession_slope = 0.000000000000000E+000 , 10.0000000000000 + , 9.18544713197807 , 1 , 1 + fastInterflowRecession_forest = 1.00000000000000 , + 3.00000000000000 , 1.00903084191760 , 1 , 1 + slowInterflowRecession_Ks = 1.00000000000000 , + 30.0000000000000 , 3.55142768924494 , 1 , 1 + exponentSlowInterflow = 5.000000000000000E-002 , 0.300000000000000 , + 0.102087257606353 , 1 , 1 / ! percolation &percolation1 - rechargeCoefficient = 0.0000000000000000 , 50.0000000000000000 , 36.5754591153711530 , 1 , 1 - rechargeFactor_karstic = -5.0000000000000000 , 5.0000000000000000 , -3.4757784762249231 , 1 , 1 - gain_loss_GWreservoir_karstic = 1.0000000000000000 , 1.0000000000000000 , 1.0000000000000000 , 0 , 1 + rechargeCoefficient = 0.000000000000000E+000 , 50.0000000000000 , + 30.2164339955834 , 1 , 1 + rechargeFactor_karstic = -5.00000000000000 , 5.00000000000000 + , -2.82982899543617 , 1 , 1 + gain_loss_GWreservoir_karstic = 1.00000000000000 , + 1.00000000000000 , 1.00000000000000 , 0 , 1 / ! routing &routing1 - muskingumTravelTime_constant = 0.3100000000000000 , 0.3500000000000000 , 0.3301070723417684 , 1 , 1 - muskingumTravelTime_riverLength = 7.0000000000000007E-02 , 8.0000000000000002E-02 , 7.0919195341039978E-02 , 1 , 1 - muskingumTravelTime_riverSlope = 1.9500000000000000 , 2.1000000000000001 , 1.9710429023235612 , 1 , 1 - muskingumTravelTime_impervious = 8.9999999999999997E-02 , 0.1100000000000000 , 9.4796071645591395E-02 , 1 , 1 - muskingumAttenuation_riverSlope = 1.0000000000000000E-02 , 0.5000000000000000 , 0.3000000000000000 , 1 , 1 + muskingumTravelTime_constant = 0.310000000000000 , + 0.350000000000000 , 0.324503659884677 , 1 , 1 + muskingumTravelTime_riverLength = 7.000000000000001E-002 , + 8.000000000000000E-002 , 7.333900603500247E-002 , 1 , 1 + muskingumTravelTime_riverSlope = 1.95000000000000 , + 2.10000000000000 , 1.97641793956466 , 1 , 1 + muskingumTravelTime_impervious = 9.000000000000000E-002 , + 0.110000000000000 , 0.101017334118738 , 1 , 1 + muskingumAttenuation_riverSlope = 1.000000000000000E-002 , + 0.500000000000000 , 0.413647503025914 , 1 , 1 / ! geology &geoparameter - GeoParam(1,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.1842628306764863E+02 , 1 , 1 - GeoParam(2,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.4920930169140473E+02 , 1 , 1 - GeoParam(3,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.5681425802068264E+02 , 1 , 1 - GeoParam(4,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.0000000000000000E+02 , 1 , 1 - GeoParam(5,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.0000000000000000E+02 , 0 , 1 - GeoParam(6,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.0000000000000000E+02 , 0 , 1 - GeoParam(7,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.0000000000000000E+02 , 1 , 1 - GeoParam(8,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.0000000000000000E+02 , 0 , 1 - GeoParam(9,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.2769743246712426E+02 , 1 , 1 - GeoParam(10,:) = 1.0000000000000000 , 1.0000000000000000E+03 , 1.8263811255411412E+02 , 1 , 1 + GeoParam(1,:) = 1.00000000000000 , 1000.00000000000 , + 162.017588391143 , 1 , 1 + GeoParam(2,:) = 1.00000000000000 , 1000.00000000000 , + 163.612545737502 , 1 , 1 + GeoParam(3,:) = 1.00000000000000 , 1000.00000000000 , + 247.286821336375 , 1 , 1 + GeoParam(4,:) = 1.00000000000000 , 1000.00000000000 , + 184.166048487840 , 1 , 1 + GeoParam(5,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(6,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(7,:) = 1.00000000000000 , 1000.00000000000 , + 97.0303313768825 , 1 , 1 + GeoParam(8,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(9,:) = 1.00000000000000 , 1000.00000000000 , + 94.6959553670044 , 1 , 1 + GeoParam(10,:) = 1.00000000000000 , 1000.00000000000 , + 324.354660816753 , 1 , 1 / ! neutrons diff --git a/check/case_06/output_save/FinalParam.out b/check/case_06/output_save/FinalParam.out index 5cfcc1b6..8df60473 100644 --- a/check/case_06/output_save/FinalParam.out +++ b/check/case_06/output_save/FinalParam.out @@ -1,2 +1,2 @@ OF canopyInterceptionFactor snowTreshholdTemperature degreeDayFactor_forest degreeDayFactor_impervious degreeDayFactor_pervious increaseDegreeDayFactorByPrecip maxDegreeDayFactor_forest maxDegreeDayFactor_impervious maxDegreeDayFactor_pervious orgMatterContent_forest orgMatterContent_impervious orgMatterContent_pervious PTF_lower66_5_constant PTF_lower66_5_clay PTF_lower66_5_Db PTF_higher66_5_constant PTF_higher66_5_clay PTF_higher66_5_Db PTF_Ks_constant PTF_Ks_sand PTF_Ks_clay PTF_Ks_curveSlope rootFractionCoefficient_forest rootFractionCoefficient_impervious rootFractionCoefficient_pervious infiltrationShapeFactor imperviousStorageCapacity minCorrectionFactorPET maxCorrectionFactorPET aspectTresholdPET interflowStorageCapacityFactor interflowRecession_slope fastInterflowRecession_forest slowInterflowRecession_Ks exponentSlowInterflow rechargeCoefficient rechargeFactor_karstic gain_loss_GWreservoir_karstic muskingumTravelTime_constant muskingumTravelTime_riverLength muskingumTravelTime_riverSlope muskingumTravelTime_impervious muskingumAttenuation_riverSlope GeoParam(1,:) GeoParam(2,:) GeoParam(3,:) GeoParam(4,:) GeoParam(5,:) GeoParam(6,:) GeoParam(7,:) GeoParam(8,:) GeoParam(9,:) GeoParam(10,:) - 3.85189061664614E-01 1.70272652859209E-01 1.13976565529653E+00 2.33454592639807E+00 6.24673751754268E-01 8.88690284812682E-01 6.52637053450513E-01 3.00000000000000E+00 4.33619377413225E+00 5.07896129988637E+00 3.40000000000000E+00 3.78275509143044E-02 6.00000000000000E-01 7.63494578333013E-01 9.00000000000000E-04 -2.67731904989612E-01 8.90000000000000E-01 -1.00000000000000E-03 -4.37075052345831E-01 -8.62347121812413E-01 1.63333663157648E-02 8.34828279011870E-03 6.09600000000000E+01 9.60788338858429E-01 9.15400938753431E-01 2.41940249504681E-02 2.63692839510572E+00 5.00000000000000E-01 8.91056377266973E-01 1.57705816507799E-01 1.76663184163832E+02 1.34972722293913E+02 9.35683425455306E+00 1.03825481904006E+00 5.31918899848635E+00 1.64552950052485E-01 3.65754591153712E+01 -3.47577847622492E+00 1.00000000000000E+00 3.30107072341768E-01 7.09191953410400E-02 1.97104290232356E+00 9.47960716455914E-02 3.00000000000000E-01 1.18426283067649E+02 1.49209301691405E+02 1.56814258020683E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.27697432467124E+02 1.82638112554114E+02 + 7.44378602157205E-01 2.34992182414766E-01 1.25390364043856E+00 2.95795155077323E+00 4.83090415398036E-01 1.13271411929245E+00 6.60612605032073E-01 3.07504025961314E+00 4.03154016804875E+00 5.65569750791907E+00 1.39913675012930E+01 1.11163254687207E-02 8.96613581800218E-01 7.07150874596424E-01 1.05849042607406E-03 -2.54022390988897E-01 8.09060290214743E-01 -2.29923500394625E-03 -3.44114444880436E-01 -8.54234515958249E-01 1.66343793045959E-02 7.96944930470262E-03 6.09600000000000E+01 9.70835129054173E-01 9.34171221935173E-01 2.52834100728758E-02 3.86248901890797E+00 2.15051846020602E-01 7.25233831453393E-01 1.39708932048905E-01 1.76144939444976E+02 7.51482244672275E+01 9.18544713197807E+00 1.00903084191760E+00 3.55142768924494E+00 1.02087257606353E-01 3.02164339955834E+01 -2.82982899543617E+00 1.00000000000000E+00 3.24503659884677E-01 7.33390060350025E-02 1.97641793956466E+00 1.01017334118738E-01 4.13647503025914E-01 1.62017588391143E+02 1.63612545737502E+02 2.47286821336375E+02 1.84166048487840E+02 1.00000000000000E+02 1.00000000000000E+02 9.70303313768825E+01 1.00000000000000E+02 9.46959553670044E+01 3.24354660816753E+02 diff --git a/check/case_06/output_save/b1_daily_discharge.out b/check/case_06/output_save/b1_daily_discharge.out index 446259bf..e0784bf2 100644 --- a/check/case_06/output_save/b1_daily_discharge.out +++ b/check/case_06/output_save/b1_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 113.1552870 - 2 2 1 1990 129.0000000 101.9135030 - 3 3 1 1990 117.0000000 92.6447889 - 4 4 1 1990 111.0000000 84.9049533 - 5 5 1 1990 112.0000000 78.3716321 - 6 6 1 1990 93.0000000 72.8820039 - 7 7 1 1990 87.0000000 68.1744038 - 8 8 1 1990 84.0000000 64.0380710 - 9 9 1 1990 80.0000000 60.5240002 - 10 10 1 1990 78.0000000 57.3436715 - 11 11 1 1990 78.0000000 54.5490766 - 12 12 1 1990 77.0000000 52.0773321 - 13 13 1 1990 76.0000000 51.7285863 - 14 14 1 1990 73.0000000 55.4049688 - 15 15 1 1990 66.0000000 69.8946125 - 16 16 1 1990 76.0000000 76.1657542 - 17 17 1 1990 73.0000000 77.6019627 - 18 18 1 1990 71.0000000 83.9391046 - 19 19 1 1990 90.0000000 77.2436206 - 20 20 1 1990 82.0000000 82.5875856 - 21 21 1 1990 80.0000000 80.6117084 - 22 22 1 1990 81.0000000 71.9722152 - 23 23 1 1990 97.0000000 221.0943683 - 24 24 1 1990 198.0000000 375.6569824 - 25 25 1 1990 392.0000000 467.0582640 - 26 26 1 1990 519.0000000 517.7426510 - 27 27 1 1990 565.0000000 372.7294192 - 28 28 1 1990 331.0000000 303.8594403 - 29 29 1 1990 293.0000000 283.3069906 - 30 30 1 1990 302.0000000 224.4647370 - 31 31 1 1990 233.0000000 185.0847835 - 32 1 2 1990 198.0000000 198.0177171 - 33 2 2 1990 183.0000000 241.3621272 - 34 3 2 1990 206.0000000 244.0754817 - 35 4 2 1990 215.0000000 197.8113764 - 36 5 2 1990 183.0000000 164.0088106 - 37 6 2 1990 159.0000000 139.9476826 - 38 7 2 1990 167.0000000 122.0031717 - 39 8 2 1990 138.0000000 112.0370490 - 40 9 2 1990 126.0000000 110.3046780 - 41 10 2 1990 131.0000000 227.9243092 - 42 11 2 1990 173.0000000 404.9455113 - 43 12 2 1990 240.0000000 438.8671357 - 44 13 2 1990 270.0000000 683.8885725 - 45 14 2 1990 458.0000000 1404.1668713 - 46 15 2 1990 996.0000000 1876.6124473 - 47 16 2 1990 1370.0000000 1257.2489581 - 48 17 2 1990 1540.0000000 821.1791152 - 49 18 2 1990 1210.0000000 582.7176013 - 50 19 2 1990 616.0000000 433.1110613 - 51 20 2 1990 465.0000000 335.5709057 - 52 21 2 1990 373.0000000 267.2121907 - 53 22 2 1990 298.0000000 218.7047232 - 54 23 2 1990 270.0000000 187.2147704 - 55 24 2 1990 234.0000000 165.2346119 - 56 25 2 1990 218.0000000 156.0211842 - 57 26 2 1990 203.0000000 319.4006968 - 58 27 2 1990 314.0000000 667.1185090 - 59 28 2 1990 520.0000000 1007.6761875 - 60 1 3 1990 689.0000000 1112.4959095 - 61 2 3 1990 777.0000000 813.8650787 - 62 3 3 1990 584.0000000 558.3182750 - 63 4 3 1990 429.0000000 408.7894773 - 64 5 3 1990 365.0000000 318.1319411 - 65 6 3 1990 281.0000000 255.8417454 - 66 7 3 1990 257.0000000 215.8242325 - 67 8 3 1990 231.0000000 187.5061793 - 68 9 3 1990 211.0000000 165.8656096 - 69 10 3 1990 191.0000000 148.8828274 - 70 11 3 1990 182.0000000 135.2729176 - 71 12 3 1990 173.0000000 124.1364772 - 72 13 3 1990 159.0000000 115.3188388 - 73 14 3 1990 153.0000000 110.0436293 - 74 15 3 1990 141.0000000 105.7624213 - 75 16 3 1990 136.0000000 99.2232719 - 76 17 3 1990 130.0000000 93.7566558 - 77 18 3 1990 123.0000000 89.0287969 - 78 19 3 1990 115.0000000 84.9088687 - 79 20 3 1990 113.0000000 81.9101900 - 80 21 3 1990 102.0000000 79.4415289 - 81 22 3 1990 105.0000000 77.3413709 - 82 23 3 1990 106.0000000 75.2643248 - 83 24 3 1990 87.0000000 72.9043443 - 84 25 3 1990 80.0000000 71.6407278 - 85 26 3 1990 84.0000000 69.5080863 - 86 27 3 1990 82.0000000 67.6626123 - 87 28 3 1990 91.0000000 77.7423220 - 88 29 3 1990 97.0000000 89.3344466 - 89 30 3 1990 110.0000000 80.9675696 - 90 31 3 1990 97.0000000 76.5320122 - 91 1 4 1990 93.0000000 73.1962157 - 92 2 4 1990 85.0000000 70.3190325 - 93 3 4 1990 84.0000000 74.9106354 - 94 4 4 1990 81.0000000 80.9006000 - 95 5 4 1990 81.0000000 73.3787694 - 96 6 4 1990 76.0000000 71.5534104 - 97 7 4 1990 72.0000000 68.7358754 - 98 8 4 1990 68.0000000 66.2162880 - 99 9 4 1990 72.0000000 64.0546494 - 100 10 4 1990 65.0000000 62.1785252 - 101 11 4 1990 62.0000000 61.2125595 - 102 12 4 1990 62.0000000 62.8745854 - 103 13 4 1990 65.0000000 68.6898660 - 104 14 4 1990 68.0000000 94.5253048 - 105 15 4 1990 75.0000000 106.5391581 - 106 16 4 1990 90.0000000 104.5692551 - 107 17 4 1990 92.0000000 100.8777196 - 108 18 4 1990 94.0000000 101.3167689 - 109 19 4 1990 110.0000000 94.5249385 - 110 20 4 1990 99.0000000 87.5656638 - 111 21 4 1990 86.0000000 82.1262812 - 112 22 4 1990 86.0000000 86.4973470 - 113 23 4 1990 86.0000000 96.3209813 - 114 24 4 1990 88.0000000 100.2776869 - 115 25 4 1990 93.0000000 91.4661463 - 116 26 4 1990 99.0000000 84.8976851 - 117 27 4 1990 86.0000000 80.0455930 - 118 28 4 1990 74.0000000 76.0568030 - 119 29 4 1990 72.0000000 72.1724008 - 120 30 4 1990 77.0000000 68.7575512 - 121 1 5 1990 56.0000000 65.7964304 - 122 2 5 1990 64.0000000 63.2071328 - 123 3 5 1990 58.0000000 60.9259456 - 124 4 5 1990 50.0000000 58.9025306 - 125 5 5 1990 50.0000000 57.0965785 - 126 6 5 1990 50.0000000 55.4754275 - 127 7 5 1990 50.0000000 54.0453688 - 128 8 5 1990 53.0000000 53.7642991 - 129 9 5 1990 62.0000000 52.7332849 - 130 10 5 1990 64.0000000 57.9012274 - 131 11 5 1990 65.0000000 59.0779682 - 132 12 5 1990 75.0000000 52.4340381 - 133 13 5 1990 71.0000000 50.8047045 - 134 14 5 1990 63.0000000 49.7110428 - 135 15 5 1990 61.0000000 48.8979573 - 136 16 5 1990 49.0000000 48.0444261 - 137 17 5 1990 46.0000000 46.9422733 - 138 18 5 1990 46.0000000 46.0620919 - 139 19 5 1990 48.0000000 45.2495886 - 140 20 5 1990 41.0000000 44.5476615 - 141 21 5 1990 45.0000000 50.4237070 - 142 22 5 1990 52.0000000 50.7074687 - 143 23 5 1990 50.0000000 50.0707613 - 144 24 5 1990 56.0000000 54.4593894 - 145 25 5 1990 41.0000000 50.5077471 - 146 26 5 1990 40.0000000 45.7427759 - 147 27 5 1990 39.0000000 44.6002254 - 148 28 5 1990 39.0000000 43.5904245 - 149 29 5 1990 33.0000000 42.6875272 - 150 30 5 1990 37.0000000 41.8721881 - 151 31 5 1990 30.0000000 41.1294172 - 152 1 6 1990 37.0000000 46.3169065 - 153 2 6 1990 36.0000000 48.0437299 - 154 3 6 1990 40.0000000 77.8488966 - 155 4 6 1990 45.0000000 60.3375885 - 156 5 6 1990 39.0000000 45.9754268 - 157 6 6 1990 48.0000000 44.4738271 - 158 7 6 1990 39.0000000 93.2910015 - 159 8 6 1990 49.0000000 112.3951408 - 160 9 6 1990 84.0000000 102.3755406 - 161 10 6 1990 91.0000000 92.8758446 - 162 11 6 1990 80.0000000 78.2310458 - 163 12 6 1990 66.0000000 70.6968026 - 164 13 6 1990 53.0000000 65.1592103 - 165 14 6 1990 64.0000000 60.6263681 - 166 15 6 1990 55.0000000 56.7132053 - 167 16 6 1990 54.0000000 53.5626964 - 168 17 6 1990 42.0000000 50.9110219 - 169 18 6 1990 48.0000000 48.9180944 - 170 19 6 1990 48.0000000 66.1861689 - 171 20 6 1990 60.0000000 88.2155297 - 172 21 6 1990 75.0000000 87.0160944 - 173 22 6 1990 78.0000000 74.3774733 - 174 23 6 1990 66.0000000 68.7403364 - 175 24 6 1990 63.0000000 63.1410750 - 176 25 6 1990 52.0000000 58.9814120 - 177 26 6 1990 49.0000000 55.6019749 - 178 27 6 1990 44.0000000 61.2553213 - 179 28 6 1990 51.0000000 60.2648110 - 180 29 6 1990 61.0000000 80.6453091 - 181 30 6 1990 81.0000000 124.9353120 - 182 1 7 1990 79.0000000 109.8863438 - 183 2 7 1990 92.0000000 89.7577423 - 184 3 7 1990 72.0000000 92.7019359 - 185 4 7 1990 58.0000000 115.6994322 - 186 5 7 1990 69.0000000 161.9471296 - 187 6 7 1990 94.0000000 163.8025569 - 188 7 7 1990 199.0000000 149.7097230 - 189 8 7 1990 133.0000000 151.3001143 - 190 9 7 1990 124.0000000 124.7419781 - 191 10 7 1990 123.0000000 108.8286742 - 192 11 7 1990 99.0000000 96.6921728 - 193 12 7 1990 88.0000000 87.1535242 - 194 13 7 1990 84.0000000 79.4775248 - 195 14 7 1990 72.0000000 73.1821813 - 196 15 7 1990 55.0000000 67.9384274 - 197 16 7 1990 65.0000000 63.5138523 - 198 17 7 1990 50.0000000 59.7395211 - 199 18 7 1990 50.0000000 56.4895778 - 200 19 7 1990 46.0000000 53.6682480 - 201 20 7 1990 44.0000000 51.2012945 - 202 21 7 1990 42.0000000 49.0302441 - 203 22 7 1990 37.0000000 47.1083899 - 204 23 7 1990 38.0000000 45.3979625 - 205 24 7 1990 44.0000000 43.8680879 - 206 25 7 1990 30.0000000 42.4932870 - 207 26 7 1990 26.0000000 41.2523556 - 208 27 7 1990 31.0000000 40.1275143 - 209 28 7 1990 33.0000000 41.8185009 - 210 29 7 1990 42.0000000 39.5571438 - 211 30 7 1990 36.0000000 37.5833236 - 212 31 7 1990 34.0000000 36.7625617 - 213 1 8 1990 25.0000000 36.0062700 - 214 2 8 1990 22.0000000 35.3067987 - 215 3 8 1990 28.0000000 34.6575471 - 216 4 8 1990 25.0000000 34.0527989 - 217 5 8 1990 19.0000000 33.4875873 - 218 6 8 1990 22.0000000 32.9575833 - 219 7 8 1990 19.0000000 32.4590037 - 220 8 8 1990 22.0000000 31.9885335 - 221 9 8 1990 19.0000000 31.5432612 - 222 10 8 1990 20.0000000 31.1206244 - 223 11 8 1990 19.0000000 30.7183631 - 224 12 8 1990 19.0000000 30.3344803 - 225 13 8 1990 22.0000000 34.3224864 - 226 14 8 1990 36.0000000 55.8293379 - 227 15 8 1990 31.0000000 46.4717050 - 228 16 8 1990 30.0000000 40.3447565 - 229 17 8 1990 28.0000000 37.0700109 - 230 18 8 1990 34.0000000 30.5403994 - 231 19 8 1990 21.0000000 30.0162587 - 232 20 8 1990 30.0000000 29.5317654 - 233 21 8 1990 22.0000000 29.0810557 - 234 22 8 1990 21.0000000 28.6595600 - 235 23 8 1990 23.0000000 28.2634678 - 236 24 8 1990 20.0000000 27.8895809 - 237 25 8 1990 29.0000000 27.5357118 - 238 26 8 1990 20.0000000 27.5934596 - 239 27 8 1990 22.0000000 28.9161275 - 240 28 8 1990 23.0000000 27.1090453 - 241 29 8 1990 35.0000000 26.3324996 - 242 30 8 1990 51.0000000 113.2904318 - 243 31 8 1990 80.0000000 112.9245041 - 244 1 9 1990 56.0000000 56.3712141 - 245 2 9 1990 33.0000000 44.8228000 - 246 3 9 1990 27.0000000 41.2496649 - 247 4 9 1990 27.0000000 42.4611706 - 248 5 9 1990 28.0000000 41.1824987 - 249 6 9 1990 26.0000000 35.7135564 - 250 7 9 1990 24.0000000 40.4379194 - 251 8 9 1990 33.0000000 37.6949100 - 252 9 9 1990 26.0000000 33.3361091 - 253 10 9 1990 27.0000000 31.9579889 - 254 11 9 1990 22.0000000 30.7724478 - 255 12 9 1990 22.0000000 29.7415847 - 256 13 9 1990 21.0000000 28.8367037 - 257 14 9 1990 22.0000000 28.0355255 - 258 15 9 1990 22.0000000 27.3205147 - 259 16 9 1990 22.0000000 26.6777033 - 260 17 9 1990 20.0000000 26.0958453 - 261 18 9 1990 22.0000000 25.5657994 - 262 19 9 1990 16.0000000 25.0800709 - 263 20 9 1990 22.0000000 24.6324675 - 264 21 9 1990 19.0000000 32.7922494 - 265 22 9 1990 32.0000000 100.9519255 - 266 23 9 1990 27.0000000 86.2421643 - 267 24 9 1990 45.0000000 65.3211487 - 268 25 9 1990 42.0000000 50.1085848 - 269 26 9 1990 39.0000000 44.1978467 - 270 27 9 1990 30.0000000 40.9098131 - 271 28 9 1990 28.0000000 38.1975029 - 272 29 9 1990 30.0000000 35.9272197 - 273 30 9 1990 30.0000000 88.9317286 - 274 1 10 1990 56.0000000 159.9062547 - 275 2 10 1990 72.0000000 151.6341544 - 276 3 10 1990 73.0000000 142.6054733 - 277 4 10 1990 68.0000000 138.5269447 - 278 5 10 1990 53.0000000 113.6264409 - 279 6 10 1990 42.0000000 96.9359982 - 280 7 10 1990 33.0000000 84.8843043 - 281 8 10 1990 42.0000000 75.5044017 - 282 9 10 1990 34.0000000 68.0028241 - 283 10 10 1990 36.0000000 61.8679664 - 284 11 10 1990 36.0000000 56.7814970 - 285 12 10 1990 28.0000000 52.5079252 - 286 13 10 1990 32.0000000 48.8773011 - 287 14 10 1990 27.0000000 45.7637403 - 288 15 10 1990 35.0000000 43.4784402 - 289 16 10 1990 42.0000000 44.0894096 - 290 17 10 1990 35.0000000 54.0013023 - 291 18 10 1990 39.0000000 56.2273986 - 292 19 10 1990 34.0000000 46.4353857 - 293 20 10 1990 32.0000000 43.4239990 - 294 21 10 1990 34.0000000 40.8623369 - 295 22 10 1990 27.0000000 38.6568701 - 296 23 10 1990 31.0000000 36.7416555 - 297 24 10 1990 28.0000000 35.0659574 - 298 25 10 1990 25.0000000 34.6713849 - 299 26 10 1990 29.0000000 53.9008044 - 300 27 10 1990 31.0000000 65.4882369 - 301 28 10 1990 65.0000000 226.3810943 - 302 29 10 1990 69.0000000 360.6105269 - 303 30 10 1990 157.0000000 333.1254883 - 304 31 10 1990 190.0000000 258.4089202 - 305 1 11 1990 115.0000000 236.1369519 - 306 2 11 1990 104.0000000 236.1995017 - 307 3 11 1990 100.0000000 238.6328176 - 308 4 11 1990 131.0000000 222.2614053 - 309 5 11 1990 130.0000000 206.8785488 - 310 6 11 1990 115.0000000 170.1924122 - 311 7 11 1990 102.0000000 143.7822669 - 312 8 11 1990 95.0000000 124.9263197 - 313 9 11 1990 81.0000000 110.4452733 - 314 10 11 1990 66.0000000 118.2177002 - 315 11 11 1990 67.0000000 171.6044049 - 316 12 11 1990 74.0000000 200.2918982 - 317 13 11 1990 109.0000000 185.3686099 - 318 14 11 1990 92.0000000 227.4514000 - 319 15 11 1990 92.0000000 259.6184922 - 320 16 11 1990 155.0000000 226.0418253 - 321 17 11 1990 159.0000000 199.6986956 - 322 18 11 1990 131.0000000 222.5103647 - 323 19 11 1990 161.0000000 247.1002248 - 324 20 11 1990 196.0000000 427.2226136 - 325 21 11 1990 336.0000000 629.1991601 - 326 22 11 1990 566.0000000 492.3596251 - 327 23 11 1990 373.0000000 457.4220293 - 328 24 11 1990 293.0000000 395.1815342 - 329 25 11 1990 264.0000000 370.4007666 - 330 26 11 1990 226.0000000 326.6861999 - 331 27 11 1990 201.0000000 255.7729457 - 332 28 11 1990 180.0000000 207.9118986 - 333 29 11 1990 161.0000000 198.0985083 - 334 30 11 1990 149.0000000 196.9981172 - 335 1 12 1990 134.0000000 166.8541509 - 336 2 12 1990 113.0000000 144.6935355 - 337 3 12 1990 99.0000000 127.7068670 - 338 4 12 1990 107.0000000 114.7524282 - 339 5 12 1990 99.0000000 104.1725507 - 340 6 12 1990 89.0000000 95.2763426 - 341 7 12 1990 77.0000000 87.9062279 - 342 8 12 1990 71.0000000 81.7170772 - 343 9 12 1990 68.0000000 76.4617070 - 344 10 12 1990 73.0000000 71.9566198 - 345 11 12 1990 84.0000000 68.0626395 - 346 12 12 1990 88.0000000 92.4680610 - 347 13 12 1990 92.0000000 125.9546845 - 348 14 12 1990 128.0000000 125.1922123 - 349 15 12 1990 136.0000000 107.2776586 - 350 16 12 1990 114.0000000 93.2763329 - 351 17 12 1990 101.0000000 83.0694146 - 352 18 12 1990 93.0000000 75.3273078 - 353 19 12 1990 85.0000000 69.2839819 - 354 20 12 1990 81.0000000 64.4563541 - 355 21 12 1990 106.0000000 125.4860479 - 356 22 12 1990 159.0000000 247.5616927 - 357 23 12 1990 250.0000000 296.0596968 - 358 24 12 1990 298.0000000 268.3129108 - 359 25 12 1990 261.0000000 302.2727087 - 360 26 12 1990 228.0000000 557.4830101 - 361 27 12 1990 409.0000000 737.7763946 - 362 28 12 1990 486.0000000 695.9843669 - 363 29 12 1990 440.0000000 786.1874182 - 364 30 12 1990 486.0000000 960.1244854 - 365 31 12 1990 774.0000000 1002.5058532 - 366 1 1 1991 889.0000000 1002.2217802 - 367 2 1 1991 863.0000000 1058.5045834 - 368 3 1 1991 875.0000000 1182.6508718 - 369 4 1 1991 932.0000000 962.5790917 - 370 5 1 1991 826.0000000 837.8967381 - 371 6 1 1991 731.0000000 764.4104304 - 372 7 1 1991 613.0000000 690.1410287 - 373 8 1 1991 610.0000000 687.6446121 - 374 9 1 1991 686.0000000 595.5643483 - 375 10 1 1991 556.0000000 693.8446598 - 376 11 1 1991 669.0000000 811.0395458 - 377 12 1 1991 828.0000000 703.9083860 - 378 13 1 1991 735.0000000 490.8212330 - 379 14 1 1991 513.0000000 363.4836496 - 380 15 1 1991 411.0000000 285.7759372 - 381 16 1 1991 345.0000000 237.1790990 - 382 17 1 1991 293.0000000 202.9516030 - 383 18 1 1991 251.0000000 177.5089023 - 384 19 1 1991 222.0000000 157.9780788 - 385 20 1 1991 215.0000000 142.6121854 - 386 21 1 1991 213.0000000 137.4997648 - 387 22 1 1991 202.0000000 148.6282700 - 388 23 1 1991 200.0000000 146.1312613 - 389 24 1 1991 192.0000000 131.9649705 - 390 25 1 1991 176.0000000 119.6525263 - 391 26 1 1991 164.0000000 109.9922306 - 392 27 1 1991 157.0000000 102.1664540 - 393 28 1 1991 134.0000000 95.7437811 - 394 29 1 1991 130.0000000 90.3886955 - 395 30 1 1991 119.0000000 85.8630631 - 396 31 1 1991 107.0000000 81.9934049 - 397 1 2 1991 112.0000000 78.6504415 - 398 2 2 1991 109.0000000 75.7359247 - 399 3 2 1991 101.0000000 73.1739020 - 400 4 2 1991 98.0000000 70.9047709 - 401 5 2 1991 84.0000000 68.8811362 - 402 6 2 1991 93.0000000 67.0648655 - 403 7 2 1991 80.0000000 65.4249576 - 404 8 2 1991 73.0000000 63.9359726 - 405 9 2 1991 89.0000000 62.5768601 - 406 10 2 1991 84.0000000 61.3300703 - 407 11 2 1991 78.0000000 60.1808735 - 408 12 2 1991 79.0000000 59.1168311 - 409 13 2 1991 77.0000000 58.1273816 - 410 14 2 1991 80.0000000 57.2035123 - 411 15 2 1991 72.0000000 56.3374973 - 412 16 2 1991 78.0000000 59.3317419 - 413 17 2 1991 74.0000000 61.3785498 - 414 18 2 1991 77.0000000 59.5541581 - 415 19 2 1991 73.0000000 84.7178689 - 416 20 2 1991 69.0000000 147.2543644 - 417 21 2 1991 74.0000000 224.4891093 - 418 22 2 1991 81.0000000 244.6249146 - 419 23 2 1991 110.0000000 197.8697095 - 420 24 2 1991 180.0000000 172.8386819 - 421 25 2 1991 213.0000000 161.6615497 - 422 26 2 1991 222.0000000 142.5913306 - 423 27 2 1991 208.0000000 132.6069351 - 424 28 2 1991 211.0000000 126.9354683 - 425 1 3 1991 214.0000000 118.7359613 - 426 2 3 1991 208.0000000 130.6498382 - 427 3 3 1991 221.0000000 135.4661901 - 428 4 3 1991 281.0000000 119.1764418 - 429 5 3 1991 219.0000000 107.5737379 - 430 6 3 1991 190.0000000 98.7264273 - 431 7 3 1991 173.0000000 91.6004469 - 432 8 3 1991 164.0000000 86.0921859 - 433 9 3 1991 142.0000000 82.9452802 - 434 10 3 1991 133.0000000 83.0984163 - 435 11 3 1991 133.0000000 80.7155968 - 436 12 3 1991 118.0000000 76.3917363 - 437 13 3 1991 127.0000000 72.5133683 - 438 14 3 1991 113.0000000 69.2188536 - 439 15 3 1991 107.0000000 66.3832694 - 440 16 3 1991 100.0000000 63.9167213 - 441 17 3 1991 100.0000000 61.7567680 - 442 18 3 1991 95.0000000 59.8957536 - 443 19 3 1991 98.0000000 126.8968330 - 444 20 3 1991 119.0000000 172.4754910 - 445 21 3 1991 159.0000000 196.5050471 - 446 22 3 1991 196.0000000 238.0707282 - 447 23 3 1991 242.0000000 200.8415512 - 448 24 3 1991 216.0000000 164.0199308 - 449 25 3 1991 180.0000000 139.1609061 - 450 26 3 1991 145.0000000 121.6916918 - 451 27 3 1991 127.0000000 110.9349247 - 452 28 3 1991 117.0000000 99.9801423 - 453 29 3 1991 109.0000000 91.4041640 - 454 30 3 1991 106.0000000 84.5173685 - 455 31 3 1991 99.0000000 78.8833565 - 456 1 4 1991 96.0000000 74.2016879 - 457 2 4 1991 88.0000000 70.2589827 - 458 3 4 1991 87.0000000 66.8997163 - 459 4 4 1991 82.0000000 64.5044700 - 460 5 4 1991 84.0000000 62.8470650 - 461 6 4 1991 67.0000000 60.5299522 - 462 7 4 1991 89.0000000 58.6188018 - 463 8 4 1991 75.0000000 57.0188849 - 464 9 4 1991 79.0000000 55.3494677 - 465 10 4 1991 70.0000000 53.7937902 - 466 11 4 1991 69.0000000 52.3959656 - 467 12 4 1991 69.0000000 51.1336980 - 468 13 4 1991 56.0000000 49.9872932 - 469 14 4 1991 63.0000000 48.9425273 - 470 15 4 1991 58.0000000 47.9875160 - 471 16 4 1991 56.0000000 47.1007750 - 472 17 4 1991 54.0000000 46.2791809 - 473 18 4 1991 57.0000000 45.5410185 - 474 19 4 1991 53.0000000 45.7248387 - 475 20 4 1991 53.0000000 45.7671412 - 476 21 4 1991 65.0000000 44.9290770 - 477 22 4 1991 69.0000000 46.7989426 - 478 23 4 1991 61.0000000 48.9368798 - 479 24 4 1991 56.0000000 45.6463277 - 480 25 4 1991 56.0000000 44.4881733 - 481 26 4 1991 53.0000000 43.6622440 - 482 27 4 1991 49.0000000 42.9152820 - 483 28 4 1991 53.0000000 42.2233199 - 484 29 4 1991 48.0000000 45.7523461 - 485 30 4 1991 57.0000000 91.2364104 - 486 1 5 1991 69.0000000 89.8205352 - 487 2 5 1991 89.0000000 67.7762338 - 488 3 5 1991 105.0000000 62.8660663 - 489 4 5 1991 79.0000000 59.3141719 - 490 5 5 1991 69.0000000 56.4418766 - 491 6 5 1991 71.0000000 54.4088098 - 492 7 5 1991 60.0000000 52.0182719 - 493 8 5 1991 64.0000000 50.0126474 - 494 9 5 1991 59.0000000 48.2590404 - 495 10 5 1991 57.0000000 48.7180459 - 496 11 5 1991 55.0000000 52.1222588 - 497 12 5 1991 53.0000000 49.2656883 - 498 13 5 1991 52.0000000 47.5504395 - 499 14 5 1991 50.0000000 46.2758918 - 500 15 5 1991 52.0000000 51.3496324 - 501 16 5 1991 54.0000000 54.3961244 - 502 17 5 1991 54.0000000 49.7920998 - 503 18 5 1991 55.0000000 48.0962562 - 504 19 5 1991 48.0000000 46.5691707 - 505 20 5 1991 48.0000000 45.1798333 - 506 21 5 1991 49.0000000 43.9122624 - 507 22 5 1991 41.0000000 42.7525985 - 508 23 5 1991 40.0000000 41.6887258 - 509 24 5 1991 40.0000000 40.7100268 - 510 25 5 1991 39.0000000 39.8071767 - 511 26 5 1991 43.0000000 38.9719703 - 512 27 5 1991 39.0000000 38.1971746 - 513 28 5 1991 36.0000000 37.4764035 - 514 29 5 1991 33.0000000 36.8040102 - 515 30 5 1991 39.0000000 36.1749952 - 516 31 5 1991 34.0000000 35.5849261 - 517 1 6 1991 37.0000000 35.0298688 - 518 2 6 1991 35.0000000 34.5063279 - 519 3 6 1991 29.0000000 34.0111944 - 520 4 6 1991 33.0000000 33.5417000 - 521 5 6 1991 34.0000000 33.1089665 - 522 6 6 1991 32.0000000 49.8914607 - 523 7 6 1991 38.0000000 52.3843636 - 524 8 6 1991 39.0000000 41.6017315 - 525 9 6 1991 41.0000000 38.4591414 - 526 10 6 1991 44.0000000 52.2834925 - 527 11 6 1991 48.0000000 37.8542005 - 528 12 6 1991 42.0000000 35.1048196 - 529 13 6 1991 37.0000000 34.3016553 - 530 14 6 1991 39.0000000 33.6401178 - 531 15 6 1991 35.0000000 33.4199160 - 532 16 6 1991 31.0000000 36.3983279 - 533 17 6 1991 33.0000000 39.9641236 - 534 18 6 1991 31.0000000 37.5760031 - 535 19 6 1991 28.0000000 34.8357966 - 536 20 6 1991 60.0000000 70.5442823 - 537 21 6 1991 48.0000000 57.8594632 - 538 22 6 1991 54.0000000 41.8301290 - 539 23 6 1991 63.0000000 49.1065668 - 540 24 6 1991 41.0000000 43.7032662 - 541 25 6 1991 42.0000000 39.4282439 - 542 26 6 1991 43.0000000 37.8051841 - 543 27 6 1991 38.0000000 46.0182222 - 544 28 6 1991 38.0000000 47.0001059 - 545 29 6 1991 35.0000000 40.3823836 - 546 30 6 1991 41.0000000 38.0889236 - 547 1 7 1991 41.0000000 36.6310760 - 548 2 7 1991 38.0000000 35.3496143 - 549 3 7 1991 34.0000000 34.2123107 - 550 4 7 1991 27.0000000 33.1961786 - 551 5 7 1991 31.0000000 32.2827599 - 552 6 7 1991 30.0000000 31.4571191 - 553 7 7 1991 26.0000000 37.4122002 - 554 8 7 1991 30.0000000 36.6130779 - 555 9 7 1991 31.0000000 30.5747122 - 556 10 7 1991 23.0000000 29.8557542 - 557 11 7 1991 35.0000000 29.2008711 - 558 12 7 1991 19.0000000 30.3021440 - 559 13 7 1991 24.0000000 57.0063859 - 560 14 7 1991 26.0000000 50.1175912 - 561 15 7 1991 27.0000000 34.5672420 - 562 16 7 1991 41.0000000 31.5021809 - 563 17 7 1991 34.0000000 30.5602052 - 564 18 7 1991 27.0000000 29.7160308 - 565 19 7 1991 25.0000000 28.9546432 - 566 20 7 1991 23.0000000 28.2640680 - 567 21 7 1991 22.0000000 27.6344242 - 568 22 7 1991 27.0000000 27.0574916 - 569 23 7 1991 23.0000000 26.5263808 - 570 24 7 1991 21.0000000 27.3558949 - 571 25 7 1991 23.0000000 52.1980271 - 572 26 7 1991 33.0000000 44.8611559 - 573 27 7 1991 23.0000000 31.5060692 - 574 28 7 1991 29.0000000 28.2703024 - 575 29 7 1991 30.0000000 27.4946766 - 576 30 7 1991 35.0000000 40.3743859 - 577 31 7 1991 27.0000000 40.0030348 - 578 1 8 1991 45.0000000 29.3495834 - 579 2 8 1991 47.0000000 28.3706015 - 580 3 8 1991 40.0000000 27.5414845 - 581 4 8 1991 35.0000000 26.7952424 - 582 5 8 1991 26.0000000 26.1197264 - 583 6 8 1991 23.0000000 25.5049963 - 584 7 8 1991 30.0000000 26.4915879 - 585 8 8 1991 33.0000000 27.1847732 - 586 9 8 1991 30.0000000 24.5775020 - 587 10 8 1991 28.0000000 23.7172263 - 588 11 8 1991 19.0000000 23.2845737 - 589 12 8 1991 20.0000000 22.8821042 - 590 13 8 1991 16.0000000 22.5062648 - 591 14 8 1991 18.0000000 22.1540015 - 592 15 8 1991 18.0000000 21.8226774 - 593 16 8 1991 20.0000000 21.5100063 - 594 17 8 1991 16.0000000 21.2139988 - 595 18 8 1991 15.0000000 20.9329183 - 596 19 8 1991 15.0000000 20.6652438 - 597 20 8 1991 14.0000000 20.4096398 - 598 21 8 1991 15.0000000 20.1649304 - 599 22 8 1991 13.0000000 19.9301226 - 600 23 8 1991 12.0000000 19.8604179 - 601 24 8 1991 11.0000000 19.7681680 - 602 25 8 1991 12.0000000 19.2822326 - 603 26 8 1991 11.0000000 19.0779470 - 604 27 8 1991 13.0000000 18.8800674 - 605 28 8 1991 11.0000000 18.6879095 - 606 29 8 1991 12.0000000 18.5010126 - 607 30 8 1991 12.0000000 18.3189641 - 608 31 8 1991 11.0000000 18.1413941 - 609 1 9 1991 11.0000000 19.8323324 - 610 2 9 1991 17.0000000 20.1813578 - 611 3 9 1991 11.0000000 17.6763674 - 612 4 9 1991 12.0000000 17.5102513 - 613 5 9 1991 11.0000000 17.3478613 - 614 6 9 1991 11.0000000 17.1886703 - 615 7 9 1991 18.0000000 17.0324701 - 616 8 9 1991 11.0000000 16.8790732 - 617 9 9 1991 13.0000000 16.7283103 - 618 10 9 1991 12.0000000 17.3077916 - 619 11 9 1991 11.0000000 46.0959783 - 620 12 9 1991 20.0000000 38.2685449 - 621 13 9 1991 21.0000000 17.3063597 - 622 14 9 1991 29.0000000 17.0626320 - 623 15 9 1991 28.0000000 16.8340140 - 624 16 9 1991 20.0000000 16.6175217 - 625 17 9 1991 20.0000000 16.4117215 - 626 18 9 1991 20.0000000 16.2153936 - 627 19 9 1991 12.0000000 16.0274943 - 628 20 9 1991 11.0000000 15.8471263 - 629 21 9 1991 11.0000000 15.6735149 - 630 22 9 1991 22.0000000 37.2600841 - 631 23 9 1991 14.0000000 36.4977454 - 632 24 9 1991 48.0000000 17.1318847 - 633 25 9 1991 45.0000000 75.7582753 - 634 26 9 1991 80.0000000 79.0915434 - 635 27 9 1991 61.0000000 60.3766481 - 636 28 9 1991 61.0000000 89.0385195 - 637 29 9 1991 65.0000000 98.0670852 - 638 30 9 1991 63.0000000 93.5043432 - 639 1 10 1991 90.0000000 70.8492880 - 640 2 10 1991 59.0000000 58.9841679 - 641 3 10 1991 45.0000000 50.7483403 - 642 4 10 1991 42.0000000 44.6513869 - 643 5 10 1991 41.0000000 92.9372736 - 644 6 10 1991 41.0000000 121.6494478 - 645 7 10 1991 73.0000000 88.9139015 - 646 8 10 1991 96.0000000 72.8831523 - 647 9 10 1991 61.0000000 62.8663617 - 648 10 10 1991 44.0000000 55.2835396 - 649 11 10 1991 42.0000000 49.6005848 - 650 12 10 1991 41.0000000 75.1578719 - 651 13 10 1991 42.0000000 85.9825399 - 652 14 10 1991 61.0000000 65.9855501 - 653 15 10 1991 55.0000000 58.7369763 - 654 16 10 1991 41.0000000 58.5852827 - 655 17 10 1991 48.0000000 75.5556179 - 656 18 10 1991 52.0000000 111.4104366 - 657 19 10 1991 66.0000000 103.7097257 - 658 20 10 1991 59.0000000 89.0250000 - 659 21 10 1991 71.0000000 80.4182257 - 660 22 10 1991 74.0000000 70.2206665 - 661 23 10 1991 70.0000000 62.5223149 - 662 24 10 1991 59.0000000 56.3171239 - 663 25 10 1991 57.0000000 51.2302480 - 664 26 10 1991 57.0000000 46.9885983 - 665 27 10 1991 51.0000000 43.4075978 - 666 28 10 1991 47.0000000 40.3528874 - 667 29 10 1991 48.0000000 37.7241596 - 668 30 10 1991 45.0000000 39.9181913 - 669 31 10 1991 43.0000000 45.1949083 - 670 1 11 1991 40.0000000 57.8930025 - 671 2 11 1991 47.0000000 64.3483123 - 672 3 11 1991 46.0000000 106.2481729 - 673 4 11 1991 76.0000000 178.9099733 - 674 5 11 1991 60.0000000 181.5889111 - 675 6 11 1991 132.0000000 164.2647307 - 676 7 11 1991 133.0000000 161.6916273 - 677 8 11 1991 113.0000000 197.2641979 - 678 9 11 1991 120.0000000 219.3789043 - 679 10 11 1991 141.0000000 185.2783637 - 680 11 11 1991 208.0000000 211.2801604 - 681 12 11 1991 166.0000000 326.5744829 - 682 13 11 1991 183.0000000 464.2325690 - 683 14 11 1991 299.0000000 681.8424776 - 684 15 11 1991 521.0000000 597.3163984 - 685 16 11 1991 443.0000000 449.8326407 - 686 17 11 1991 304.0000000 345.1447837 - 687 18 11 1991 231.0000000 323.5045847 - 688 19 11 1991 192.0000000 333.7410374 - 689 20 11 1991 199.0000000 291.0575569 - 690 21 11 1991 201.0000000 254.6863819 - 691 22 11 1991 173.0000000 204.8163661 - 692 23 11 1991 159.0000000 168.7617156 - 693 24 11 1991 160.0000000 146.1405154 - 694 25 11 1991 146.0000000 129.0358998 - 695 26 11 1991 110.0000000 115.3300774 - 696 27 11 1991 114.0000000 104.0858319 - 697 28 11 1991 97.0000000 94.7563051 - 698 29 11 1991 89.0000000 86.9144538 - 699 30 11 1991 73.0000000 80.2544773 - 700 1 12 1991 69.0000000 74.5484874 - 701 2 12 1991 67.0000000 69.6229201 - 702 3 12 1991 63.0000000 65.3430813 - 703 4 12 1991 58.0000000 61.6027297 - 704 5 12 1991 59.0000000 58.3168737 - 705 6 12 1991 53.0000000 55.4166780 - 706 7 12 1991 54.0000000 52.8457882 - 707 8 12 1991 51.0000000 50.5576294 - 708 9 12 1991 47.0000000 48.5133876 - 709 10 12 1991 42.0000000 46.6804783 - 710 11 12 1991 40.0000000 45.0313687 - 711 12 12 1991 39.0000000 43.5426602 - 712 13 12 1991 36.0000000 42.1943658 - 713 14 12 1991 37.0000000 40.9693343 - 714 15 12 1991 32.0000000 39.8527881 - 715 16 12 1991 37.0000000 52.2533394 - 716 17 12 1991 62.0000000 215.6938594 - 717 18 12 1991 118.0000000 374.1636151 - 718 19 12 1991 170.0000000 491.7442418 - 719 20 12 1991 229.0000000 661.7275934 - 720 21 12 1991 448.0000000 764.6386543 - 721 22 12 1991 464.0000000 1056.6718596 - 722 23 12 1991 675.0000000 813.5692195 - 723 24 12 1991 844.0000000 615.1155741 - 724 25 12 1991 569.0000000 452.3913480 - 725 26 12 1991 358.0000000 349.3657821 - 726 27 12 1991 279.0000000 285.7587827 - 727 28 12 1991 238.0000000 233.0598768 - 728 29 12 1991 201.0000000 191.7032200 - 729 30 12 1991 185.0000000 165.9519147 - 730 31 12 1991 165.0000000 147.1900372 - 731 1 1 1992 140.0000000 132.1545111 - 732 2 1 1992 126.0000000 120.1189283 - 733 3 1 1992 117.0000000 111.4161897 - 734 4 1 1992 114.0000000 107.9504187 - 735 5 1 1992 108.0000000 104.5781900 - 736 6 1 1992 108.0000000 96.1407841 - 737 7 1 1992 101.0000000 89.2608012 - 738 8 1 1992 97.0000000 87.9428603 - 739 9 1 1992 89.0000000 113.1347628 - 740 10 1 1992 111.0000000 185.2338146 - 741 11 1 1992 135.0000000 207.3762575 - 742 12 1 1992 171.0000000 167.9638920 - 743 13 1 1992 125.0000000 141.7455332 - 744 14 1 1992 111.0000000 123.1000386 - 745 15 1 1992 100.0000000 109.2739963 - 746 16 1 1992 87.0000000 98.7784710 - 747 17 1 1992 75.0000000 90.2609167 - 748 18 1 1992 79.0000000 83.3895853 - 749 19 1 1992 70.0000000 85.9820165 - 750 20 1 1992 72.0000000 86.6394863 - 751 21 1 1992 87.0000000 86.0395158 - 752 22 1 1992 79.0000000 78.6249920 - 753 23 1 1992 71.0000000 73.0916297 - 754 24 1 1992 66.0000000 68.5706709 - 755 25 1 1992 67.0000000 64.8126609 - 756 26 1 1992 65.0000000 61.6436131 - 757 27 1 1992 59.0000000 58.9381343 - 758 28 1 1992 57.0000000 56.6692523 - 759 29 1 1992 54.0000000 55.5721826 - 760 30 1 1992 59.0000000 61.1284239 - 761 31 1 1992 57.0000000 79.0786651 - 762 1 2 1992 56.0000000 89.8476720 - 763 2 2 1992 54.0000000 84.1771487 - 764 3 2 1992 58.0000000 76.7777378 - 765 4 2 1992 63.0000000 160.5072437 - 766 5 2 1992 76.0000000 291.9597591 - 767 6 2 1992 250.0000000 284.9524219 - 768 7 2 1992 346.0000000 221.8722441 - 769 8 2 1992 241.0000000 182.6901394 - 770 9 2 1992 180.0000000 174.8707121 - 771 10 2 1992 164.0000000 185.8596337 - 772 11 2 1992 183.0000000 220.1724711 - 773 12 2 1992 215.0000000 293.7101328 - 774 13 2 1992 265.0000000 318.2131681 - 775 14 2 1992 287.0000000 324.9421409 - 776 15 2 1992 272.0000000 316.9577853 - 777 16 2 1992 253.0000000 344.7712924 - 778 17 2 1992 301.0000000 321.9363364 - 779 18 2 1992 275.0000000 251.5664820 - 780 19 2 1992 224.0000000 205.2784666 - 781 20 2 1992 194.0000000 173.3424555 - 782 21 2 1992 173.0000000 150.7500299 - 783 22 2 1992 157.0000000 133.7086029 - 784 23 2 1992 142.0000000 122.9851039 - 785 24 2 1992 133.0000000 116.4411261 - 786 25 2 1992 128.0000000 106.8561875 - 787 26 2 1992 125.0000000 98.4382767 - 788 27 2 1992 125.0000000 91.5032252 - 789 28 2 1992 110.0000000 85.6226674 - 790 29 2 1992 107.0000000 80.5885227 - 791 1 3 1992 97.0000000 76.4752720 - 792 2 3 1992 97.0000000 74.8346714 - 793 3 3 1992 86.0000000 77.8503210 - 794 4 3 1992 93.0000000 73.0092064 - 795 5 3 1992 86.0000000 69.6817002 - 796 6 3 1992 82.0000000 66.7753177 - 797 7 3 1992 80.0000000 64.0431909 - 798 8 3 1992 77.0000000 61.6228219 - 799 9 3 1992 73.0000000 59.4717370 - 800 10 3 1992 76.0000000 57.7914784 - 801 11 3 1992 68.0000000 56.4254872 - 802 12 3 1992 70.0000000 125.0341310 - 803 13 3 1992 116.0000000 266.9182439 - 804 14 3 1992 206.0000000 380.9584762 - 805 15 3 1992 433.0000000 415.6845613 - 806 16 3 1992 495.0000000 427.5865791 - 807 17 3 1992 331.0000000 316.9483848 - 808 18 3 1992 240.0000000 247.3591984 - 809 19 3 1992 215.0000000 203.6299154 - 810 20 3 1992 185.0000000 173.3693701 - 811 21 3 1992 185.0000000 167.0383121 - 812 22 3 1992 185.0000000 255.6638027 - 813 23 3 1992 213.0000000 416.4918611 - 814 24 3 1992 466.0000000 470.6189591 - 815 25 3 1992 580.0000000 483.8331031 - 816 26 3 1992 566.0000000 409.5532861 - 817 27 3 1992 487.0000000 344.7834065 - 818 28 3 1992 387.0000000 292.9394288 - 819 29 3 1992 311.0000000 243.1941451 - 820 30 3 1992 270.0000000 204.1560267 - 821 31 3 1992 246.0000000 191.5530289 - 822 1 4 1992 229.0000000 207.8355344 - 823 2 4 1992 222.0000000 209.3609459 - 824 3 4 1992 217.0000000 244.9975512 - 825 4 4 1992 208.0000000 313.4633147 - 826 5 4 1992 220.0000000 272.6841849 - 827 6 4 1992 210.0000000 223.1953972 - 828 7 4 1992 190.0000000 186.9109476 - 829 8 4 1992 173.0000000 163.5022263 - 830 9 4 1992 166.0000000 147.2932668 - 831 10 4 1992 133.0000000 134.4290245 - 832 11 4 1992 126.0000000 123.7967117 - 833 12 4 1992 124.0000000 114.8755324 - 834 13 4 1992 116.0000000 107.3260353 - 835 14 4 1992 112.0000000 109.4953434 - 836 15 4 1992 111.0000000 155.4391840 - 837 16 4 1992 137.0000000 185.0344262 - 838 17 4 1992 206.0000000 172.1404030 - 839 18 4 1992 176.0000000 172.1550055 - 840 19 4 1992 161.0000000 148.9814931 - 841 20 4 1992 161.0000000 131.5614846 - 842 21 4 1992 139.0000000 118.4243848 - 843 22 4 1992 139.0000000 108.2162379 - 844 23 4 1992 123.0000000 100.0578601 - 845 24 4 1992 119.0000000 93.3976021 - 846 25 4 1992 111.0000000 87.8657428 - 847 26 4 1992 94.0000000 83.2888633 - 848 27 4 1992 94.0000000 84.0961023 - 849 28 4 1992 102.0000000 90.6973075 - 850 29 4 1992 120.0000000 89.8299616 - 851 30 4 1992 120.0000000 84.8087910 - 852 1 5 1992 114.0000000 114.5394461 - 853 2 5 1992 115.0000000 152.8188670 - 854 3 5 1992 206.0000000 130.6730564 - 855 4 5 1992 215.0000000 115.8614648 - 856 5 5 1992 125.0000000 105.2823366 - 857 6 5 1992 123.0000000 96.9904699 - 858 7 5 1992 113.0000000 90.3142829 - 859 8 5 1992 77.0000000 84.8234657 - 860 9 5 1992 83.0000000 80.4263102 - 861 10 5 1992 83.0000000 89.6647455 - 862 11 5 1992 96.0000000 89.0699453 - 863 12 5 1992 120.0000000 78.9116417 - 864 13 5 1992 80.0000000 73.9186748 - 865 14 5 1992 76.0000000 70.6325008 - 866 15 5 1992 69.0000000 67.8123302 - 867 16 5 1992 63.0000000 65.3640480 - 868 17 5 1992 61.0000000 63.2174959 - 869 18 5 1992 60.0000000 61.3190709 - 870 19 5 1992 59.0000000 59.6270171 - 871 20 5 1992 67.0000000 58.1082721 - 872 21 5 1992 51.0000000 56.7367539 - 873 22 5 1992 44.0000000 55.4908903 - 874 23 5 1992 42.0000000 54.3513800 - 875 24 5 1992 51.0000000 53.3909645 - 876 25 5 1992 42.0000000 52.6122763 - 877 26 5 1992 54.0000000 62.6007828 - 878 27 5 1992 53.0000000 55.3185006 - 879 28 5 1992 59.0000000 51.4300252 - 880 29 5 1992 55.0000000 59.8516545 - 881 30 5 1992 54.0000000 59.7594877 - 882 31 5 1992 48.0000000 53.8022540 - 883 1 6 1992 63.0000000 56.3563911 - 884 2 6 1992 61.0000000 55.3186480 - 885 3 6 1992 55.0000000 56.5563751 - 886 4 6 1992 75.0000000 73.5360739 - 887 5 6 1992 53.0000000 87.9772311 - 888 6 6 1992 77.0000000 87.7764272 - 889 7 6 1992 114.0000000 86.7249026 - 890 8 6 1992 167.0000000 99.1764454 - 891 9 6 1992 116.0000000 89.5180399 - 892 10 6 1992 91.0000000 78.3355128 - 893 11 6 1992 85.0000000 73.0495837 - 894 12 6 1992 68.0000000 68.7062233 - 895 13 6 1992 71.0000000 65.0700762 - 896 14 6 1992 63.0000000 61.9759470 - 897 15 6 1992 59.0000000 59.3123647 - 898 16 6 1992 46.0000000 56.9963800 - 899 17 6 1992 44.0000000 54.9648913 - 900 18 6 1992 39.0000000 53.1689811 - 901 19 6 1992 41.0000000 51.5762679 - 902 20 6 1992 44.0000000 52.4097231 - 903 21 6 1992 39.0000000 50.7504669 - 904 22 6 1992 32.0000000 48.4586143 - 905 23 6 1992 40.0000000 49.6969034 - 906 24 6 1992 41.0000000 63.4535198 - 907 25 6 1992 42.0000000 58.4795398 - 908 26 6 1992 42.0000000 50.9322853 - 909 27 6 1992 48.0000000 48.2882787 - 910 28 6 1992 37.0000000 46.7471223 - 911 29 6 1992 40.0000000 45.4336177 - 912 30 6 1992 29.0000000 44.4368894 - 913 1 7 1992 30.0000000 44.0933985 - 914 2 7 1992 36.0000000 42.5878949 - 915 3 7 1992 29.0000000 47.5848641 - 916 4 7 1992 36.0000000 58.0782298 - 917 5 7 1992 50.0000000 76.0135956 - 918 6 7 1992 78.0000000 78.3725918 - 919 7 7 1992 54.0000000 60.3339513 - 920 8 7 1992 57.0000000 51.3682438 - 921 9 7 1992 51.0000000 49.2989219 - 922 10 7 1992 47.0000000 69.1382024 - 923 11 7 1992 46.0000000 92.3181716 - 924 12 7 1992 76.0000000 89.5324468 - 925 13 7 1992 72.0000000 79.0202430 - 926 14 7 1992 67.0000000 68.6136639 - 927 15 7 1992 63.0000000 63.7214864 - 928 16 7 1992 47.0000000 59.7038226 - 929 17 7 1992 47.0000000 56.3457626 - 930 18 7 1992 42.0000000 53.4982438 - 931 19 7 1992 41.0000000 51.0542088 - 932 20 7 1992 39.0000000 48.9346373 - 933 21 7 1992 37.0000000 48.4033090 - 934 22 7 1992 33.0000000 48.2945932 - 935 23 7 1992 33.0000000 45.1349926 - 936 24 7 1992 33.0000000 43.7246688 - 937 25 7 1992 37.0000000 42.4569002 - 938 26 7 1992 26.0000000 41.3108170 - 939 27 7 1992 24.0000000 40.2713560 - 940 28 7 1992 26.0000000 39.3241526 - 941 29 7 1992 29.0000000 38.4571617 - 942 30 7 1992 19.0000000 37.6602109 - 943 31 7 1992 22.0000000 38.8472697 - 944 1 8 1992 28.0000000 38.6594468 - 945 2 8 1992 35.0000000 35.9168142 - 946 3 8 1992 29.0000000 35.2876803 - 947 4 8 1992 36.0000000 34.7023495 - 948 5 8 1992 52.0000000 34.1548769 - 949 6 8 1992 74.0000000 33.6409096 - 950 7 8 1992 54.0000000 33.1566922 - 951 8 8 1992 57.0000000 32.6989708 - 952 9 8 1992 48.0000000 34.8067522 - 953 10 8 1992 47.0000000 33.8638348 - 954 11 8 1992 46.0000000 41.0137239 - 955 12 8 1992 75.0000000 40.4059189 - 956 13 8 1992 73.0000000 45.1688369 - 957 14 8 1992 66.0000000 47.8796047 - 958 15 8 1992 60.0000000 40.5259819 - 959 16 8 1992 47.0000000 32.6013612 - 960 17 8 1992 46.0000000 31.9428166 - 961 18 8 1992 42.0000000 31.3496451 - 962 19 8 1992 41.0000000 30.8494913 - 963 20 8 1992 40.0000000 37.7794294 - 964 21 8 1992 37.0000000 34.1147144 - 965 22 8 1992 32.0000000 31.4292481 - 966 23 8 1992 32.0000000 31.5923769 - 967 24 8 1992 32.0000000 29.6209189 - 968 25 8 1992 36.0000000 29.1168079 - 969 26 8 1992 27.0000000 28.6881710 - 970 27 8 1992 25.0000000 28.2876035 - 971 28 8 1992 25.0000000 28.3961179 - 972 29 8 1992 28.0000000 35.1244831 - 973 30 8 1992 20.0000000 49.0157603 - 974 31 8 1992 22.0000000 93.0953803 - 975 1 9 1992 49.0000000 81.6047737 - 976 2 9 1992 77.0000000 68.9451923 - 977 3 9 1992 67.0000000 65.9427365 - 978 4 9 1992 45.0000000 64.7528796 - 979 5 9 1992 44.0000000 56.4904533 - 980 6 9 1992 64.0000000 48.0111622 - 981 7 9 1992 52.0000000 44.3680940 - 982 8 9 1992 40.0000000 41.4235617 - 983 9 9 1992 30.0000000 38.9999369 - 984 10 9 1992 34.0000000 36.9741122 - 985 11 9 1992 32.0000000 35.5508615 - 986 12 9 1992 36.0000000 34.4200118 - 987 13 9 1992 28.0000000 32.9102184 - 988 14 9 1992 33.0000000 32.8361093 - 989 15 9 1992 35.0000000 35.2542382 - 990 16 9 1992 30.0000000 31.2463901 - 991 17 9 1992 32.0000000 30.2667596 - 992 18 9 1992 29.0000000 29.4628363 - 993 19 9 1992 30.0000000 29.2305330 - 994 20 9 1992 28.0000000 28.1437311 - 995 21 9 1992 29.0000000 27.4836803 - 996 22 9 1992 29.0000000 26.8826037 - 997 23 9 1992 27.0000000 26.3358519 - 998 24 9 1992 27.0000000 25.8290756 - 999 25 9 1992 23.0000000 25.3586555 - 1000 26 9 1992 28.0000000 24.9216870 - 1001 27 9 1992 25.0000000 24.5145006 - 1002 28 9 1992 25.0000000 25.8939243 - 1003 29 9 1992 27.0000000 27.7794011 - 1004 30 9 1992 25.0000000 24.2160029 - 1005 1 10 1992 27.0000000 24.3353390 - 1006 2 10 1992 33.0000000 26.5815632 - 1007 3 10 1992 29.0000000 27.4816844 - 1008 4 10 1992 31.0000000 25.3573776 - 1009 5 10 1992 25.0000000 38.1528786 - 1010 6 10 1992 25.0000000 43.9459622 - 1011 7 10 1992 36.0000000 31.7374292 - 1012 8 10 1992 42.0000000 25.9096432 - 1013 9 10 1992 43.0000000 27.7418098 - 1014 10 10 1992 26.0000000 34.6626176 - 1015 11 10 1992 27.0000000 32.4021847 - 1016 12 10 1992 27.0000000 27.8980055 - 1017 13 10 1992 26.0000000 26.9872617 - 1018 14 10 1992 26.0000000 26.2608910 - 1019 15 10 1992 23.0000000 40.0666183 - 1020 16 10 1992 21.0000000 40.0487918 - 1021 17 10 1992 26.0000000 34.4855566 - 1022 18 10 1992 34.0000000 38.8671436 - 1023 19 10 1992 37.0000000 35.1728391 - 1024 20 10 1992 31.0000000 42.5454805 - 1025 21 10 1992 31.0000000 41.9264750 - 1026 22 10 1992 35.0000000 40.9293543 - 1027 23 10 1992 33.0000000 69.9943152 - 1028 24 10 1992 40.0000000 147.3867753 - 1029 25 10 1992 74.0000000 222.9063563 - 1030 26 10 1992 161.0000000 252.2243894 - 1031 27 10 1992 285.0000000 264.8778310 - 1032 28 10 1992 244.0000000 311.1590661 - 1033 29 10 1992 263.0000000 330.5909483 - 1034 30 10 1992 276.0000000 261.5116384 - 1035 31 10 1992 186.0000000 201.8700767 - 1036 1 11 1992 154.0000000 162.7427052 - 1037 2 11 1992 112.0000000 168.2455306 - 1038 3 11 1992 104.0000000 181.6846236 - 1039 4 11 1992 96.0000000 171.0530736 - 1040 5 11 1992 99.0000000 145.3466808 - 1041 6 11 1992 126.0000000 125.4048873 - 1042 7 11 1992 91.0000000 111.5489977 - 1043 8 11 1992 84.0000000 102.9987021 - 1044 9 11 1992 81.0000000 108.2758306 - 1045 10 11 1992 85.0000000 163.8675958 - 1046 11 11 1992 126.0000000 305.4873661 - 1047 12 11 1992 279.0000000 408.8047690 - 1048 13 11 1992 390.0000000 416.1794794 - 1049 14 11 1992 294.0000000 401.5307330 - 1050 15 11 1992 260.0000000 532.7423858 - 1051 16 11 1992 398.0000000 760.3341555 - 1052 17 11 1992 520.0000000 698.1788148 - 1053 18 11 1992 487.0000000 604.7836366 - 1054 19 11 1992 380.0000000 626.1198785 - 1055 20 11 1992 385.0000000 477.5204563 - 1056 21 11 1992 351.0000000 504.0524559 - 1057 22 11 1992 309.0000000 668.2052206 - 1058 23 11 1992 587.0000000 494.0368768 - 1059 24 11 1992 661.0000000 385.2313165 - 1060 25 11 1992 447.0000000 399.2025206 - 1061 26 11 1992 361.0000000 460.1294835 - 1062 27 11 1992 351.0000000 422.9190473 - 1063 28 11 1992 353.0000000 476.0991492 - 1064 29 11 1992 369.0000000 629.6204181 - 1065 30 11 1992 452.0000000 605.3690518 - 1066 1 12 1992 441.0000000 441.5038851 - 1067 2 12 1992 348.0000000 487.1542540 - 1068 3 12 1992 394.0000000 604.0152096 - 1069 4 12 1992 455.0000000 653.5748265 - 1070 5 12 1992 491.0000000 714.0671644 - 1071 6 12 1992 469.0000000 550.9805999 - 1072 7 12 1992 364.0000000 526.9000561 - 1073 8 12 1992 338.0000000 433.5295818 - 1074 9 12 1992 334.0000000 332.0084017 - 1075 10 12 1992 268.0000000 262.5427634 - 1076 11 12 1992 236.0000000 277.6204432 - 1077 12 12 1992 230.0000000 327.2540795 - 1078 13 12 1992 239.0000000 299.7198578 - 1079 14 12 1992 256.0000000 241.3765014 - 1080 15 12 1992 217.0000000 204.3560942 - 1081 16 12 1992 201.0000000 183.4421422 - 1082 17 12 1992 188.0000000 166.1651627 - 1083 18 12 1992 176.0000000 147.0444970 - 1084 19 12 1992 170.0000000 135.1244526 - 1085 20 12 1992 168.0000000 134.0104648 - 1086 21 12 1992 131.0000000 147.7022872 - 1087 22 12 1992 133.0000000 158.7704433 - 1088 23 12 1992 134.0000000 142.4021165 - 1089 24 12 1992 127.0000000 126.7614598 - 1090 25 12 1992 117.0000000 114.9348854 - 1091 26 12 1992 113.0000000 105.5616387 - 1092 27 12 1992 100.0000000 97.9632821 - 1093 28 12 1992 94.0000000 91.6908828 - 1094 29 12 1992 87.0000000 86.4348303 - 1095 30 12 1992 86.0000000 81.9743395 - 1096 31 12 1992 81.0000000 78.1475564 - 1097 1 1 1993 77.0000000 74.8330389 - 1098 2 1 1993 76.0000000 71.9378451 - 1099 3 1 1993 61.0000000 69.3896216 - 1100 4 1 1993 61.0000000 67.1312026 - 1101 5 1 1993 57.0000000 65.1168334 - 1102 6 1 1993 66.0000000 89.7350603 - 1103 7 1 1993 67.0000000 137.1070914 - 1104 8 1 1993 84.0000000 157.6514642 - 1105 9 1 1993 90.0000000 171.2303295 - 1106 10 1 1993 113.0000000 254.2404940 - 1107 11 1 1993 265.0000000 703.1464301 - 1108 12 1 1993 559.0000000 1136.8391245 - 1109 13 1 1993 832.0000000 913.9221622 - 1110 14 1 1993 601.0000000 627.9530943 - 1111 15 1 1993 436.0000000 429.0812769 - 1112 16 1 1993 339.0000000 319.0078181 - 1113 17 1 1993 292.0000000 258.4694603 - 1114 18 1 1993 247.0000000 222.4888819 - 1115 19 1 1993 218.0000000 192.0108485 - 1116 20 1 1993 205.0000000 165.9464177 - 1117 21 1 1993 190.0000000 151.9863438 - 1118 22 1 1993 176.0000000 148.2718501 - 1119 23 1 1993 173.0000000 148.8417203 - 1120 24 1 1993 173.0000000 237.9622378 - 1121 25 1 1993 199.0000000 398.1487589 - 1122 26 1 1993 361.0000000 313.6720453 - 1123 27 1 1993 295.0000000 325.3497919 - 1124 28 1 1993 238.0000000 353.3708043 - 1125 29 1 1993 263.0000000 301.1321974 - 1126 30 1 1993 245.0000000 247.7051592 - 1127 31 1 1993 222.0000000 208.2199064 - 1128 1 2 1993 199.0000000 180.0898036 - 1129 2 2 1993 186.0000000 158.9354684 - 1130 3 2 1993 171.0000000 142.5874795 - 1131 4 2 1993 157.0000000 129.5978186 - 1132 5 2 1993 159.0000000 119.0583227 - 1133 6 2 1993 129.0000000 110.3596416 - 1134 7 2 1993 119.0000000 103.4512401 - 1135 8 2 1993 119.0000000 97.2481120 - 1136 9 2 1993 105.0000000 91.9019624 - 1137 10 2 1993 106.0000000 87.2912592 - 1138 11 2 1993 105.0000000 83.2824434 - 1139 12 2 1993 95.0000000 79.7716308 - 1140 13 2 1993 91.0000000 76.6767841 - 1141 14 2 1993 88.0000000 73.9322510 - 1142 15 2 1993 84.0000000 71.4848742 - 1143 16 2 1993 83.0000000 69.7020475 - 1144 17 2 1993 79.0000000 71.7490929 - 1145 18 2 1993 78.0000000 75.8503942 - 1146 19 2 1993 84.0000000 77.2634218 - 1147 20 2 1993 91.0000000 98.3523622 - 1148 21 2 1993 91.0000000 117.3830202 - 1149 22 2 1993 90.0000000 117.5174703 - 1150 23 2 1993 103.0000000 110.3305924 - 1151 24 2 1993 94.0000000 98.7534326 - 1152 25 2 1993 81.0000000 90.1242826 - 1153 26 2 1993 78.0000000 83.5953262 - 1154 27 2 1993 75.0000000 85.6841080 - 1155 28 2 1993 76.0000000 87.8590589 - 1156 1 3 1993 80.0000000 81.8546391 - 1157 2 3 1993 75.0000000 79.4673652 - 1158 3 3 1993 76.0000000 77.5201329 - 1159 4 3 1993 72.0000000 72.8297565 - 1160 5 3 1993 65.0000000 69.2557963 - 1161 6 3 1993 64.0000000 66.2969284 - 1162 7 3 1993 64.0000000 64.6219860 - 1163 8 3 1993 68.0000000 65.6049492 - 1164 9 3 1993 68.0000000 63.3149135 - 1165 10 3 1993 67.0000000 64.9327592 - 1166 11 3 1993 61.0000000 68.5980477 - 1167 12 3 1993 57.0000000 66.4364336 - 1168 13 3 1993 58.0000000 64.0898901 - 1169 14 3 1993 54.0000000 62.0033676 - 1170 15 3 1993 66.0000000 60.1670659 - 1171 16 3 1993 54.0000000 58.5001613 - 1172 17 3 1993 57.0000000 56.9954226 - 1173 18 3 1993 57.0000000 55.6652290 - 1174 19 3 1993 52.0000000 54.4064287 - 1175 20 3 1993 57.0000000 53.2256745 - 1176 21 3 1993 58.0000000 52.9938315 - 1177 22 3 1993 57.0000000 71.2508148 - 1178 23 3 1993 56.0000000 79.8803920 - 1179 24 3 1993 63.0000000 69.5469492 - 1180 25 3 1993 76.0000000 66.2158177 - 1181 26 3 1993 56.0000000 63.3387867 - 1182 27 3 1993 59.0000000 60.8304742 - 1183 28 3 1993 59.0000000 58.6257745 - 1184 29 3 1993 54.0000000 56.6737795 - 1185 30 3 1993 48.0000000 54.9340753 - 1186 31 3 1993 55.0000000 53.3741513 - 1187 1 4 1993 48.0000000 53.8013132 - 1188 2 4 1993 53.0000000 57.8924496 - 1189 3 4 1993 47.0000000 56.6639467 - 1190 4 4 1993 59.0000000 64.3567115 - 1191 5 4 1993 53.0000000 87.6034673 - 1192 6 4 1993 64.0000000 90.3267238 - 1193 7 4 1993 63.0000000 79.7348394 - 1194 8 4 1993 75.0000000 76.1328288 - 1195 9 4 1993 64.0000000 71.1321304 - 1196 10 4 1993 59.0000000 72.4703618 - 1197 11 4 1993 60.0000000 80.8514983 - 1198 12 4 1993 63.0000000 79.9021793 - 1199 13 4 1993 69.0000000 78.3006146 - 1200 14 4 1993 79.0000000 76.3146216 - 1201 15 4 1993 82.0000000 72.1009231 - 1202 16 4 1993 68.0000000 69.1623686 - 1203 17 4 1993 56.0000000 65.6974084 - 1204 18 4 1993 59.0000000 62.6109540 - 1205 19 4 1993 61.0000000 59.8061261 - 1206 20 4 1993 62.0000000 57.3137615 - 1207 21 4 1993 57.0000000 55.1183846 - 1208 22 4 1993 53.0000000 53.1751706 - 1209 23 4 1993 47.0000000 51.4408291 - 1210 24 4 1993 46.0000000 49.8827898 - 1211 25 4 1993 47.0000000 48.4783638 - 1212 26 4 1993 45.0000000 47.2063404 - 1213 27 4 1993 43.0000000 46.0490148 - 1214 28 4 1993 41.0000000 44.9923766 - 1215 29 4 1993 38.0000000 44.0289120 - 1216 30 4 1993 39.0000000 43.5173250 - 1217 1 5 1993 40.0000000 42.8295997 - 1218 2 5 1993 41.0000000 43.8928349 - 1219 3 5 1993 45.0000000 42.6329082 - 1220 4 5 1993 49.0000000 41.2579161 - 1221 5 5 1993 40.0000000 40.5270565 - 1222 6 5 1993 43.0000000 39.9560213 - 1223 7 5 1993 38.0000000 39.6905378 - 1224 8 5 1993 38.0000000 39.8757234 - 1225 9 5 1993 43.0000000 38.9091360 - 1226 10 5 1993 44.0000000 38.6246656 - 1227 11 5 1993 41.0000000 38.6148373 - 1228 12 5 1993 51.0000000 47.3685493 - 1229 13 5 1993 63.0000000 86.5131744 - 1230 14 5 1993 68.0000000 61.3576501 - 1231 15 5 1993 77.0000000 48.4013970 - 1232 16 5 1993 77.0000000 45.5393240 - 1233 17 5 1993 59.0000000 43.3190679 - 1234 18 5 1993 49.0000000 41.5719421 - 1235 19 5 1993 43.0000000 46.6286430 - 1236 20 5 1993 44.0000000 55.7316541 - 1237 21 5 1993 48.0000000 50.4469374 - 1238 22 5 1993 44.0000000 42.7604195 - 1239 23 5 1993 46.0000000 41.1947603 - 1240 24 5 1993 40.0000000 39.8522833 - 1241 25 5 1993 43.0000000 38.6839626 - 1242 26 5 1993 30.0000000 38.2421284 - 1243 27 5 1993 45.0000000 48.7122672 - 1244 28 5 1993 43.0000000 52.6785034 - 1245 29 5 1993 44.0000000 43.1213932 - 1246 30 5 1993 54.0000000 45.2559685 - 1247 31 5 1993 56.0000000 45.2476759 - 1248 1 6 1993 44.0000000 39.3812782 - 1249 2 6 1993 43.0000000 40.2545986 - 1250 3 6 1993 33.0000000 46.0185097 - 1251 4 6 1993 45.0000000 40.2356793 - 1252 5 6 1993 46.0000000 38.0373484 - 1253 6 6 1993 42.0000000 36.8866843 - 1254 7 6 1993 40.0000000 35.8639908 - 1255 8 6 1993 30.0000000 34.9478580 - 1256 9 6 1993 31.0000000 34.2186150 - 1257 10 6 1993 32.0000000 33.7834537 - 1258 11 6 1993 25.0000000 33.9246214 - 1259 12 6 1993 33.0000000 35.4101056 - 1260 13 6 1993 29.0000000 33.4576124 - 1261 14 6 1993 40.0000000 35.3313795 - 1262 15 6 1993 42.0000000 37.2578929 - 1263 16 6 1993 37.0000000 34.7900542 - 1264 17 6 1993 46.0000000 33.5194925 - 1265 18 6 1993 47.0000000 32.1457939 - 1266 19 6 1993 50.0000000 34.3149461 - 1267 20 6 1993 43.0000000 61.3903188 - 1268 21 6 1993 69.0000000 53.2517796 - 1269 22 6 1993 61.0000000 60.9751929 - 1270 23 6 1993 67.0000000 79.6732550 - 1271 24 6 1993 77.0000000 60.6125367 - 1272 25 6 1993 87.0000000 55.8594232 - 1273 26 6 1993 55.0000000 52.0282293 - 1274 27 6 1993 43.0000000 48.8110166 - 1275 28 6 1993 40.0000000 46.0687236 - 1276 29 6 1993 30.0000000 43.7032630 - 1277 30 6 1993 40.0000000 41.6429149 - 1278 1 7 1993 40.0000000 42.1262665 - 1279 2 7 1993 27.0000000 41.4034100 - 1280 3 7 1993 34.0000000 38.1046656 - 1281 4 7 1993 30.0000000 36.6136033 - 1282 5 7 1993 31.0000000 35.3959659 - 1283 6 7 1993 27.0000000 34.1352977 - 1284 7 7 1993 31.0000000 33.0889731 - 1285 8 7 1993 26.0000000 32.1469460 - 1286 9 7 1993 23.0000000 32.0570342 - 1287 10 7 1993 24.0000000 32.7306461 - 1288 11 7 1993 25.0000000 36.8599579 - 1289 12 7 1993 34.0000000 45.9131446 - 1290 13 7 1993 40.0000000 44.5253564 - 1291 14 7 1993 41.0000000 64.5533011 - 1292 15 7 1993 46.0000000 52.3407420 - 1293 16 7 1993 39.0000000 38.8458784 - 1294 17 7 1993 43.0000000 37.5672804 - 1295 18 7 1993 35.0000000 36.7940661 - 1296 19 7 1993 49.0000000 55.5130263 - 1297 20 7 1993 38.0000000 55.4974192 - 1298 21 7 1993 41.0000000 51.4357566 - 1299 22 7 1993 45.0000000 48.0879528 - 1300 23 7 1993 41.0000000 41.0692812 - 1301 24 7 1993 42.0000000 39.0409032 - 1302 25 7 1993 40.0000000 37.2911588 - 1303 26 7 1993 35.0000000 35.7319575 - 1304 27 7 1993 40.0000000 59.8356075 - 1305 28 7 1993 40.0000000 50.3984243 - 1306 29 7 1993 36.0000000 38.0904926 - 1307 30 7 1993 40.0000000 95.5324218 - 1308 31 7 1993 61.0000000 84.6581685 - 1309 1 8 1993 36.0000000 55.7982306 - 1310 2 8 1993 46.0000000 50.5600052 - 1311 3 8 1993 32.0000000 46.3979640 - 1312 4 8 1993 38.0000000 43.0199911 - 1313 5 8 1993 32.0000000 40.2334212 - 1314 6 8 1993 25.0000000 37.9064411 - 1315 7 8 1993 26.0000000 35.9221551 - 1316 8 8 1993 29.0000000 34.2202634 - 1317 9 8 1993 29.0000000 41.2596183 - 1318 10 8 1993 28.0000000 43.8302419 - 1319 11 8 1993 37.0000000 36.5641479 - 1320 12 8 1993 40.0000000 32.7371713 - 1321 13 8 1993 49.0000000 31.4273947 - 1322 14 8 1993 32.0000000 32.0190213 - 1323 15 8 1993 37.0000000 30.6705854 - 1324 16 8 1993 37.0000000 28.9346522 - 1325 17 8 1993 27.0000000 28.0371202 - 1326 18 8 1993 24.0000000 27.2332681 - 1327 19 8 1993 24.0000000 26.5090831 - 1328 20 8 1993 22.0000000 25.8531180 - 1329 21 8 1993 21.0000000 25.2559011 - 1330 22 8 1993 16.0000000 26.3622477 - 1331 23 8 1993 21.0000000 29.2626236 - 1332 24 8 1993 27.0000000 26.2258516 - 1333 25 8 1993 26.0000000 24.0199097 - 1334 26 8 1993 23.0000000 23.5517604 - 1335 27 8 1993 21.0000000 26.4995078 - 1336 28 8 1993 28.0000000 27.9247177 - 1337 29 8 1993 17.0000000 23.3672330 - 1338 30 8 1993 24.0000000 22.9215972 - 1339 31 8 1993 25.0000000 22.5073730 - 1340 1 9 1993 25.0000000 22.1206134 - 1341 2 9 1993 19.0000000 21.7583512 - 1342 3 9 1993 17.0000000 24.6927599 - 1343 4 9 1993 16.0000000 29.2566612 - 1344 5 9 1993 19.0000000 22.5584097 - 1345 6 9 1993 23.0000000 21.7072313 - 1346 7 9 1993 25.0000000 44.3542083 - 1347 8 9 1993 34.0000000 37.0299353 - 1348 9 9 1993 31.0000000 50.7697263 - 1349 10 9 1993 35.0000000 78.8166339 - 1350 11 9 1993 53.0000000 111.7518341 - 1351 12 9 1993 71.0000000 123.6448722 - 1352 13 9 1993 74.0000000 177.2457570 - 1353 14 9 1993 87.0000000 226.8964605 - 1354 15 9 1993 173.0000000 219.1050077 - 1355 16 9 1993 117.0000000 176.8178834 - 1356 17 9 1993 93.0000000 138.2535696 - 1357 18 9 1993 77.0000000 114.6168914 - 1358 19 9 1993 62.0000000 97.5468516 - 1359 20 9 1993 54.0000000 84.7181838 - 1360 21 9 1993 48.0000000 78.1789433 - 1361 22 9 1993 46.0000000 102.7290153 - 1362 23 9 1993 55.0000000 120.1195767 - 1363 24 9 1993 66.0000000 129.5965300 - 1364 25 9 1993 64.0000000 132.6829878 - 1365 26 9 1993 52.0000000 115.3422742 - 1366 27 9 1993 68.0000000 98.2458853 - 1367 28 9 1993 69.0000000 99.4384363 - 1368 29 9 1993 62.0000000 98.2191507 - 1369 30 9 1993 76.0000000 88.4708977 - 1370 1 10 1993 72.0000000 123.5492105 - 1371 2 10 1993 68.0000000 138.6734127 - 1372 3 10 1993 72.0000000 129.1359768 - 1373 4 10 1993 78.0000000 134.1564824 - 1374 5 10 1993 116.0000000 237.4150991 - 1375 6 10 1993 131.0000000 307.7850365 - 1376 7 10 1993 180.0000000 258.2791880 - 1377 8 10 1993 203.0000000 232.8394790 - 1378 9 10 1993 164.0000000 227.4803530 - 1379 10 10 1993 178.0000000 245.4692094 - 1380 11 10 1993 161.0000000 325.6253400 - 1381 12 10 1993 287.0000000 326.4188029 - 1382 13 10 1993 360.0000000 446.5677028 - 1383 14 10 1993 374.0000000 457.5620728 - 1384 15 10 1993 297.0000000 372.6272470 - 1385 16 10 1993 247.0000000 362.5596358 - 1386 17 10 1993 273.0000000 366.8621145 - 1387 18 10 1993 261.0000000 299.4948286 - 1388 19 10 1993 265.0000000 245.2669532 - 1389 20 10 1993 230.0000000 197.3522096 - 1390 21 10 1993 199.0000000 172.2804329 - 1391 22 10 1993 173.0000000 173.8755263 - 1392 23 10 1993 182.0000000 210.3274549 - 1393 24 10 1993 203.0000000 230.4584506 - 1394 25 10 1993 213.0000000 192.4081640 - 1395 26 10 1993 180.0000000 161.3461410 - 1396 27 10 1993 154.0000000 138.7621688 - 1397 28 10 1993 118.0000000 121.7433908 - 1398 29 10 1993 112.0000000 108.4969897 - 1399 30 10 1993 98.0000000 97.9258902 - 1400 31 10 1993 97.0000000 89.3202231 - 1401 1 11 1993 91.0000000 82.2003679 - 1402 2 11 1993 85.0000000 76.2304586 - 1403 3 11 1993 75.0000000 71.1681157 - 1404 4 11 1993 76.0000000 66.8338971 - 1405 5 11 1993 78.0000000 63.0920121 - 1406 6 11 1993 72.0000000 59.9423217 - 1407 7 11 1993 76.0000000 60.7123904 - 1408 8 11 1993 69.0000000 59.1177009 - 1409 9 11 1993 66.0000000 57.1560314 - 1410 10 11 1993 71.0000000 58.1760465 - 1411 11 11 1993 64.0000000 73.4373543 - 1412 12 11 1993 67.0000000 87.3296802 - 1413 13 11 1993 80.0000000 87.9668441 - 1414 14 11 1993 78.0000000 132.4073974 - 1415 15 11 1993 80.0000000 167.9401731 - 1416 16 11 1993 86.0000000 153.3010565 - 1417 17 11 1993 125.0000000 128.5315348 - 1418 18 11 1993 96.0000000 111.6429788 - 1419 19 11 1993 82.0000000 98.8518304 - 1420 20 11 1993 77.0000000 88.8815009 - 1421 21 11 1993 67.0000000 80.9234471 - 1422 22 11 1993 71.0000000 74.4482079 - 1423 23 11 1993 61.0000000 69.0948504 - 1424 24 11 1993 42.0000000 64.6093687 - 1425 25 11 1993 63.0000000 61.6347524 - 1426 26 11 1993 57.0000000 61.2623800 - 1427 27 11 1993 58.0000000 57.5844194 - 1428 28 11 1993 49.0000000 54.8643119 - 1429 29 11 1993 50.0000000 52.4756059 - 1430 30 11 1993 55.0000000 50.3654703 - 1431 1 12 1993 54.0000000 48.4912736 - 1432 2 12 1993 54.0000000 58.4683094 - 1433 3 12 1993 50.0000000 58.7626891 - 1434 4 12 1993 51.0000000 59.2557262 - 1435 5 12 1993 62.0000000 56.3422666 - 1436 6 12 1993 62.0000000 52.9156181 - 1437 7 12 1993 71.0000000 98.6302531 - 1438 8 12 1993 79.0000000 229.7424226 - 1439 9 12 1993 153.0000000 320.3773361 - 1440 10 12 1993 291.0000000 394.1910330 - 1441 11 12 1993 332.0000000 552.3377938 - 1442 12 12 1993 465.0000000 619.1899807 - 1443 13 12 1993 518.0000000 718.3214187 - 1444 14 12 1993 539.0000000 679.0183188 - 1445 15 12 1993 559.0000000 608.8106335 - 1446 16 12 1993 500.0000000 729.3816676 - 1447 17 12 1993 526.0000000 765.8054841 - 1448 18 12 1993 583.0000000 744.4543290 - 1449 19 12 1993 677.0000000 848.1141777 - 1450 20 12 1993 781.0000000 1596.6690693 - 1451 21 12 1993 1180.0000000 1766.1774264 - 1452 22 12 1993 1460.0000000 1445.3443397 - 1453 23 12 1993 1600.0000000 1484.8801883 - 1454 24 12 1993 1410.0000000 1358.2349742 - 1455 25 12 1993 1230.0000000 971.3730037 - 1456 26 12 1993 1070.0000000 650.2612919 - 1457 27 12 1993 746.0000000 473.8267386 - 1458 28 12 1993 542.0000000 385.5761911 - 1459 29 12 1993 492.0000000 430.2407015 - 1460 30 12 1993 491.0000000 608.8544866 - 1461 31 12 1993 617.0000000 988.2393466 + 1 1 7 1990 79.0000000 89.2112765 + 2 2 7 1990 92.0000000 75.6903662 + 3 3 7 1990 72.0000000 85.0311973 + 4 4 7 1990 58.0000000 109.2811571 + 5 5 7 1990 69.0000000 150.2733320 + 6 6 7 1990 94.0000000 145.1407237 + 7 7 7 1990 199.0000000 141.5224052 + 8 8 7 1990 133.0000000 145.0798812 + 9 9 7 1990 124.0000000 119.2976526 + 10 10 7 1990 123.0000000 105.1787726 + 11 11 7 1990 99.0000000 96.6124254 + 12 12 7 1990 88.0000000 89.4956782 + 13 13 7 1990 84.0000000 83.3542252 + 14 14 7 1990 72.0000000 78.0289933 + 15 15 7 1990 55.0000000 73.3941741 + 16 16 7 1990 65.0000000 69.3457825 + 17 17 7 1990 50.0000000 65.7973663 + 18 18 7 1990 50.0000000 62.6766699 + 19 19 7 1990 46.0000000 59.9230149 + 20 20 7 1990 44.0000000 57.4852249 + 21 21 7 1990 42.0000000 55.3199689 + 22 22 7 1990 37.0000000 53.3904280 + 23 23 7 1990 38.0000000 51.6652159 + 24 24 7 1990 44.0000000 50.1174978 + 25 25 7 1990 30.0000000 48.7242687 + 26 26 7 1990 26.0000000 47.4657577 + 27 27 7 1990 31.0000000 46.3249347 + 28 28 7 1990 33.0000000 48.8924859 + 29 29 7 1990 42.0000000 45.9563774 + 30 30 7 1990 36.0000000 43.5771484 + 31 31 7 1990 34.0000000 42.7677252 + 32 1 8 1990 25.0000000 42.0209819 + 33 2 8 1990 22.0000000 41.3295114 + 34 3 8 1990 28.0000000 40.6868590 + 35 4 8 1990 25.0000000 40.0873920 + 36 5 8 1990 19.0000000 39.5261888 + 37 6 8 1990 22.0000000 38.9989442 + 38 7 8 1990 19.0000000 38.5018869 + 39 8 8 1990 22.0000000 38.0317105 + 40 9 8 1990 19.0000000 37.5855124 + 41 10 8 1990 20.0000000 37.1607421 + 42 11 8 1990 19.0000000 36.7551560 + 43 12 8 1990 19.0000000 36.3667786 + 44 13 8 1990 22.0000000 42.7225849 + 45 14 8 1990 36.0000000 66.4998450 + 46 15 8 1990 31.0000000 52.0096965 + 47 16 8 1990 30.0000000 48.3567476 + 48 17 8 1990 28.0000000 41.7881025 + 49 18 8 1990 34.0000000 35.4629270 + 50 19 8 1990 21.0000000 35.0492578 + 51 20 8 1990 30.0000000 34.6553445 + 52 21 8 1990 22.0000000 34.2791005 + 53 22 8 1990 21.0000000 33.9186939 + 54 23 8 1990 23.0000000 33.5725139 + 55 24 8 1990 20.0000000 33.2391431 + 56 25 8 1990 29.0000000 32.9173318 + 57 26 8 1990 20.0000000 33.3346681 + 58 27 8 1990 22.0000000 34.9386686 + 59 28 8 1990 23.0000000 32.8942832 + 60 29 8 1990 35.0000000 31.8401997 + 61 30 8 1990 51.0000000 126.1169769 + 62 31 8 1990 80.0000000 104.0216386 + 63 1 9 1990 56.0000000 46.2907379 + 64 2 9 1990 33.0000000 37.8990007 + 65 3 9 1990 27.0000000 36.9179777 + 66 4 9 1990 27.0000000 41.0318786 + 67 5 9 1990 28.0000000 40.4903871 + 68 6 9 1990 26.0000000 36.4117267 + 69 7 9 1990 24.0000000 43.5545420 + 70 8 9 1990 33.0000000 39.5837837 + 71 9 9 1990 26.0000000 35.1259606 + 72 10 9 1990 27.0000000 34.3102153 + 73 11 9 1990 22.0000000 33.5676554 + 74 12 9 1990 22.0000000 32.8890531 + 75 13 9 1990 21.0000000 32.2664641 + 76 14 9 1990 22.0000000 31.6930330 + 77 15 9 1990 22.0000000 31.1628300 + 78 16 9 1990 22.0000000 30.6707154 + 79 17 9 1990 20.0000000 30.2122253 + 80 18 9 1990 22.0000000 29.7834762 + 81 19 9 1990 16.0000000 29.3810828 + 82 20 9 1990 22.0000000 29.0020902 + 83 21 9 1990 19.0000000 39.0440389 + 84 22 9 1990 32.0000000 110.7720658 + 85 23 9 1990 27.0000000 83.5189436 + 86 24 9 1990 45.0000000 63.6416628 + 87 25 9 1990 42.0000000 48.1217293 + 88 26 9 1990 39.0000000 43.7779598 + 89 27 9 1990 30.0000000 41.7479504 + 90 28 9 1990 28.0000000 39.9488190 + 91 29 9 1990 30.0000000 38.3496337 + 92 30 9 1990 30.0000000 98.1252744 + 93 1 10 1990 56.0000000 152.3358121 + 94 2 10 1990 72.0000000 135.4863241 + 95 3 10 1990 73.0000000 131.0701673 + 96 4 10 1990 68.0000000 119.7859782 + 97 5 10 1990 53.0000000 103.3494363 + 98 6 10 1990 42.0000000 89.9951779 + 99 7 10 1990 33.0000000 81.8615309 + 100 8 10 1990 42.0000000 75.3307840 + 101 9 10 1990 34.0000000 69.7047062 + 102 10 10 1990 36.0000000 64.8114901 + 103 11 10 1990 36.0000000 60.5513554 + 104 12 10 1990 28.0000000 56.8304678 + 105 13 10 1990 32.0000000 53.5705227 + 106 14 10 1990 27.0000000 50.7058429 + 107 15 10 1990 35.0000000 48.8487306 + 108 16 10 1990 42.0000000 49.8933183 + 109 17 10 1990 35.0000000 62.3168718 + 110 18 10 1990 39.0000000 61.2596135 + 111 19 10 1990 34.0000000 51.9150993 + 112 20 10 1990 32.0000000 49.1625376 + 113 21 10 1990 34.0000000 46.7500375 + 114 22 10 1990 27.0000000 44.6221047 + 115 23 10 1990 31.0000000 42.7390070 + 116 24 10 1990 28.0000000 41.0671339 + 117 25 10 1990 25.0000000 41.1503791 + 118 26 10 1990 29.0000000 62.3187235 + 119 27 10 1990 31.0000000 70.7579109 + 120 28 10 1990 65.0000000 221.1234976 + 121 29 10 1990 69.0000000 276.7957012 + 122 30 10 1990 157.0000000 270.1916003 + 123 31 10 1990 190.0000000 234.3213959 + 124 1 11 1990 115.0000000 231.2091654 + 125 2 11 1990 104.0000000 241.1362172 + 126 3 11 1990 100.0000000 254.1459234 + 127 4 11 1990 131.0000000 244.4609855 + 128 5 11 1990 130.0000000 232.5680334 + 129 6 11 1990 115.0000000 194.8131215 + 130 7 11 1990 102.0000000 163.2249797 + 131 8 11 1990 95.0000000 138.0989943 + 132 9 11 1990 81.0000000 120.7745175 + 133 10 11 1990 66.0000000 129.5630317 + 134 11 11 1990 67.0000000 175.7881630 + 135 12 11 1990 74.0000000 200.6875545 + 136 13 11 1990 109.0000000 187.6952926 + 137 14 11 1990 92.0000000 224.4871144 + 138 15 11 1990 92.0000000 255.4377873 + 139 16 11 1990 155.0000000 233.6387597 + 140 17 11 1990 159.0000000 211.4120160 + 141 18 11 1990 131.0000000 231.6273619 + 142 19 11 1990 161.0000000 251.3383560 + 143 20 11 1990 196.0000000 412.7829828 + 144 21 11 1990 336.0000000 544.6786074 + 145 22 11 1990 566.0000000 472.9543257 + 146 23 11 1990 373.0000000 460.9251792 + 147 24 11 1990 293.0000000 408.1003260 + 148 25 11 1990 264.0000000 384.5469015 + 149 26 11 1990 226.0000000 342.2358042 + 150 27 11 1990 201.0000000 283.7204291 + 151 28 11 1990 180.0000000 234.4149465 + 152 29 11 1990 161.0000000 217.0681420 + 153 30 11 1990 149.0000000 201.3022737 + 154 1 12 1990 134.0000000 176.3591596 + 155 2 12 1990 113.0000000 157.8090174 + 156 3 12 1990 99.0000000 142.3400095 + 157 4 12 1990 107.0000000 129.7783605 + 158 5 12 1990 99.0000000 119.0017950 + 159 6 12 1990 89.0000000 109.7442853 + 160 7 12 1990 77.0000000 101.8800823 + 161 8 12 1990 71.0000000 95.1555650 + 162 9 12 1990 68.0000000 89.3753016 + 163 10 12 1990 73.0000000 84.3818433 + 164 11 12 1990 84.0000000 80.0474076 + 165 12 12 1990 88.0000000 101.1166195 + 166 13 12 1990 92.0000000 120.4110776 + 167 14 12 1990 128.0000000 116.1283719 + 168 15 12 1990 136.0000000 105.0823365 + 169 16 12 1990 114.0000000 96.7349375 + 170 17 12 1990 101.0000000 89.7956883 + 171 18 12 1990 93.0000000 83.9656794 + 172 19 12 1990 85.0000000 79.0297866 + 173 20 12 1990 81.0000000 74.8207106 + 174 21 12 1990 106.0000000 128.3755621 + 175 22 12 1990 159.0000000 211.8250174 + 176 23 12 1990 250.0000000 250.8733991 + 177 24 12 1990 298.0000000 241.0324865 + 178 25 12 1990 261.0000000 285.6445791 + 179 26 12 1990 228.0000000 471.7717145 + 180 27 12 1990 409.0000000 631.3806356 + 181 28 12 1990 486.0000000 641.0052936 + 182 29 12 1990 440.0000000 758.9015495 + 183 30 12 1990 486.0000000 941.4170954 + 184 31 12 1990 774.0000000 1020.3362138 + 185 1 1 1991 889.0000000 1006.3583594 + 186 2 1 1991 863.0000000 1049.1368775 + 187 3 1 1991 875.0000000 1112.3369474 + 188 4 1 1991 932.0000000 966.5038097 + 189 5 1 1991 826.0000000 881.7835946 + 190 6 1 1991 731.0000000 809.0595658 + 191 7 1 1991 613.0000000 750.7059878 + 192 8 1 1991 610.0000000 725.8461799 + 193 9 1 1991 686.0000000 640.3620478 + 194 10 1 1991 556.0000000 701.2716578 + 195 11 1 1991 669.0000000 770.2850265 + 196 12 1 1991 828.0000000 701.1458851 + 197 13 1 1991 735.0000000 537.3655429 + 198 14 1 1991 513.0000000 418.4654950 + 199 15 1 1991 411.0000000 332.6510246 + 200 16 1 1991 345.0000000 276.3354438 + 201 17 1 1991 293.0000000 239.7143871 + 202 18 1 1991 251.0000000 213.5994742 + 203 19 1 1991 222.0000000 192.4809856 + 204 20 1 1991 215.0000000 175.0421269 + 205 21 1 1991 213.0000000 167.5659893 + 206 22 1 1991 202.0000000 172.0019911 + 207 23 1 1991 200.0000000 165.1925304 + 208 24 1 1991 192.0000000 152.1130657 + 209 25 1 1991 176.0000000 140.7590477 + 210 26 1 1991 164.0000000 131.2279271 + 211 27 1 1991 157.0000000 123.1155588 + 212 28 1 1991 134.0000000 116.2047515 + 213 29 1 1991 130.0000000 110.2800234 + 214 30 1 1991 119.0000000 105.1696599 + 215 31 1 1991 107.0000000 100.7357515 + 216 1 2 1991 112.0000000 96.8667443 + 217 2 2 1991 109.0000000 93.4718105 + 218 3 2 1991 101.0000000 90.4765495 + 219 4 2 1991 98.0000000 87.8196777 + 220 5 2 1991 84.0000000 85.4504549 + 221 6 2 1991 93.0000000 83.3266706 + 222 7 2 1991 80.0000000 81.4130537 + 223 8 2 1991 73.0000000 79.6800105 + 224 9 2 1991 89.0000000 78.1026151 + 225 10 2 1991 84.0000000 76.6597981 + 226 11 2 1991 78.0000000 75.3336894 + 227 12 2 1991 79.0000000 74.1090851 + 228 13 2 1991 77.0000000 72.9730110 + 229 14 2 1991 80.0000000 71.9143649 + 230 15 2 1991 72.0000000 70.9236210 + 231 16 2 1991 78.0000000 76.4568884 + 232 17 2 1991 74.0000000 76.2998199 + 233 18 2 1991 77.0000000 74.4842400 + 234 19 2 1991 73.0000000 109.8995674 + 235 20 2 1991 69.0000000 161.1748579 + 236 21 2 1991 74.0000000 210.0366841 + 237 22 2 1991 81.0000000 211.6619054 + 238 23 2 1991 110.0000000 189.3862902 + 239 24 2 1991 180.0000000 181.8816102 + 240 25 2 1991 213.0000000 176.8795685 + 241 26 2 1991 222.0000000 156.3659527 + 242 27 2 1991 208.0000000 149.5288276 + 243 28 2 1991 211.0000000 142.5999953 + 244 1 3 1991 214.0000000 135.1793773 + 245 2 3 1991 208.0000000 147.2208797 + 246 3 3 1991 221.0000000 147.2619411 + 247 4 3 1991 281.0000000 133.3794408 + 248 5 3 1991 219.0000000 123.6806197 + 249 6 3 1991 190.0000000 115.6762917 + 250 7 3 1991 173.0000000 108.8269721 + 251 8 3 1991 164.0000000 103.3636055 + 252 9 3 1991 142.0000000 99.8908831 + 253 10 3 1991 133.0000000 100.1613730 + 254 11 3 1991 133.0000000 97.2381920 + 255 12 3 1991 118.0000000 92.5557187 + 256 13 3 1991 127.0000000 88.5600125 + 257 14 3 1991 113.0000000 85.0653724 + 258 15 3 1991 107.0000000 81.9928619 + 259 16 3 1991 100.0000000 79.2776629 + 260 17 3 1991 100.0000000 76.8673161 + 261 18 3 1991 95.0000000 74.7593759 + 262 19 3 1991 98.0000000 145.3873384 + 263 20 3 1991 119.0000000 167.5589745 + 264 21 3 1991 159.0000000 197.5179605 + 265 22 3 1991 196.0000000 227.6267084 + 266 23 3 1991 242.0000000 204.1324591 + 267 24 3 1991 216.0000000 179.1559752 + 268 25 3 1991 180.0000000 160.6823513 + 269 26 3 1991 145.0000000 146.1610946 + 270 27 3 1991 127.0000000 136.0017576 + 271 28 3 1991 117.0000000 124.8322939 + 272 29 3 1991 109.0000000 115.7485953 + 273 30 3 1991 106.0000000 108.0529743 + 274 31 3 1991 99.0000000 101.4917134 + 275 1 4 1991 96.0000000 95.8639893 + 276 2 4 1991 88.0000000 91.0094278 + 277 3 4 1991 87.0000000 86.7989188 + 278 4 4 1991 82.0000000 83.7214329 + 279 5 4 1991 84.0000000 81.4626276 + 280 6 4 1991 67.0000000 78.2607536 + 281 7 4 1991 89.0000000 75.7948235 + 282 8 4 1991 75.0000000 73.7945025 + 283 9 4 1991 79.0000000 71.5766118 + 284 10 4 1991 70.0000000 69.6365973 + 285 11 4 1991 69.0000000 67.8930448 + 286 12 4 1991 69.0000000 66.3189565 + 287 13 4 1991 56.0000000 64.8911846 + 288 14 4 1991 63.0000000 63.6080464 + 289 15 4 1991 58.0000000 62.4130122 + 290 16 4 1991 56.0000000 61.3162374 + 291 17 4 1991 54.0000000 60.3032561 + 292 18 4 1991 57.0000000 59.3940442 + 293 19 4 1991 53.0000000 60.5601232 + 294 20 4 1991 53.0000000 60.7276781 + 295 21 4 1991 65.0000000 58.9452697 + 296 22 4 1991 69.0000000 62.4664898 + 297 23 4 1991 61.0000000 64.9915629 + 298 24 4 1991 56.0000000 60.5403359 + 299 25 4 1991 56.0000000 59.2566489 + 300 26 4 1991 53.0000000 58.1499426 + 301 27 4 1991 49.0000000 57.1300905 + 302 28 4 1991 53.0000000 56.1984112 + 303 29 4 1991 48.0000000 60.9383482 + 304 30 4 1991 57.0000000 113.4965835 + 305 1 5 1991 69.0000000 104.7767527 + 306 2 5 1991 89.0000000 85.2761379 + 307 3 5 1991 105.0000000 80.3571076 + 308 4 5 1991 79.0000000 76.5775840 + 309 5 5 1991 69.0000000 73.5468972 + 310 6 5 1991 71.0000000 71.2019676 + 311 7 5 1991 60.0000000 68.3332207 + 312 8 5 1991 64.0000000 65.9065673 + 313 9 5 1991 59.0000000 63.7424804 + 314 10 5 1991 57.0000000 64.6453942 + 315 11 5 1991 55.0000000 68.3987273 + 316 12 5 1991 53.0000000 65.7510396 + 317 13 5 1991 52.0000000 63.7065394 + 318 14 5 1991 50.0000000 62.0839513 + 319 15 5 1991 52.0000000 69.3902031 + 320 16 5 1991 54.0000000 71.4562564 + 321 17 5 1991 54.0000000 66.3131165 + 322 18 5 1991 55.0000000 63.9886252 + 323 19 5 1991 48.0000000 61.9172075 + 324 20 5 1991 48.0000000 60.0518102 + 325 21 5 1991 49.0000000 58.3674006 + 326 22 5 1991 41.0000000 56.8421182 + 327 23 5 1991 40.0000000 55.4568581 + 328 24 5 1991 40.0000000 54.1949118 + 329 25 5 1991 39.0000000 53.0416568 + 330 26 5 1991 43.0000000 51.9842876 + 331 27 5 1991 39.0000000 51.0115832 + 332 28 5 1991 36.0000000 50.1137052 + 333 29 5 1991 33.0000000 49.2820219 + 334 30 5 1991 39.0000000 48.5089569 + 335 31 5 1991 34.0000000 47.7878555 + 336 1 6 1991 37.0000000 47.1128701 + 337 2 6 1991 35.0000000 46.4788593 + 338 3 6 1991 29.0000000 45.8813001 + 339 4 6 1991 33.0000000 45.3162119 + 340 5 6 1991 34.0000000 44.7993690 + 341 6 6 1991 32.0000000 64.7194432 + 342 7 6 1991 38.0000000 66.8184422 + 343 8 6 1991 39.0000000 53.7109378 + 344 9 6 1991 41.0000000 54.0885794 + 345 10 6 1991 44.0000000 66.7440160 + 346 11 6 1991 48.0000000 50.7984045 + 347 12 6 1991 42.0000000 47.6162672 + 348 13 6 1991 37.0000000 46.6557451 + 349 14 6 1991 39.0000000 46.1949255 + 350 15 6 1991 35.0000000 45.5780662 + 351 16 6 1991 31.0000000 50.1501999 + 352 17 6 1991 33.0000000 54.8096115 + 353 18 6 1991 31.0000000 52.6801573 + 354 19 6 1991 28.0000000 49.9322352 + 355 20 6 1991 60.0000000 90.0778007 + 356 21 6 1991 48.0000000 69.4612596 + 357 22 6 1991 54.0000000 54.8162538 + 358 23 6 1991 63.0000000 65.1372467 + 359 24 6 1991 41.0000000 56.3474511 + 360 25 6 1991 42.0000000 51.6163336 + 361 26 6 1991 43.0000000 49.9548106 + 362 27 6 1991 38.0000000 60.4803135 + 363 28 6 1991 38.0000000 61.3204680 + 364 29 6 1991 35.0000000 54.6507145 + 365 30 6 1991 41.0000000 51.7461322 diff --git a/check/case_06/output_save/b2_daily_discharge.out b/check/case_06/output_save/b2_daily_discharge.out deleted file mode 100644 index 4814846d..00000000 --- a/check/case_06/output_save/b2_daily_discharge.out +++ /dev/null @@ -1,1097 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1991 889.0000000 997.5835193 - 2 2 1 1991 863.0000000 1053.5607084 - 3 3 1 1991 875.0000000 1177.0281605 - 4 4 1 1991 932.0000000 958.4012896 - 5 5 1 1991 826.0000000 834.6735414 - 6 6 1 1991 731.0000000 761.6521175 - 7 7 1 1991 613.0000000 688.0548738 - 8 8 1 1991 610.0000000 685.7046499 - 9 9 1 1991 686.0000000 593.8961289 - 10 10 1 1991 556.0000000 691.6295941 - 11 11 1 1991 669.0000000 808.0833814 - 12 12 1 1991 828.0000000 701.6996815 - 13 13 1 1991 735.0000000 489.5384053 - 14 14 1 1991 513.0000000 362.6447244 - 15 15 1 1991 411.0000000 285.1696709 - 16 16 1 1991 345.0000000 236.7075931 - 17 17 1 1991 293.0000000 202.5638080 - 18 18 1 1991 251.0000000 177.1759324 - 19 19 1 1991 222.0000000 157.6825675 - 20 20 1 1991 215.0000000 142.3431775 - 21 21 1 1991 213.0000000 137.2267357 - 22 22 1 1991 202.0000000 148.2648839 - 23 23 1 1991 200.0000000 145.7362982 - 24 24 1 1991 192.0000000 131.6230861 - 25 25 1 1991 176.0000000 119.3527373 - 26 26 1 1991 164.0000000 109.7217809 - 27 27 1 1991 157.0000000 101.9172050 - 28 28 1 1991 134.0000000 95.5103141 - 29 29 1 1991 130.0000000 90.1672981 - 30 30 1 1991 119.0000000 85.6511222 - 31 31 1 1991 107.0000000 81.7890386 - 32 1 2 1991 112.0000000 78.4522674 - 33 2 2 1991 109.0000000 75.5429092 - 34 3 2 1991 101.0000000 72.9852606 - 35 4 2 1991 98.0000000 70.7198994 - 36 5 2 1991 84.0000000 68.6995635 - 37 6 2 1991 93.0000000 66.8862203 - 38 7 2 1991 80.0000000 65.2489436 - 39 8 2 1991 73.0000000 63.7623515 - 40 9 2 1991 89.0000000 62.4054378 - 41 10 2 1991 84.0000000 61.1606878 - 42 11 2 1991 78.0000000 60.0133992 - 43 12 2 1991 79.0000000 58.9511551 - 44 13 2 1991 77.0000000 57.9634116 - 45 14 2 1991 80.0000000 57.0411699 - 46 15 2 1991 72.0000000 56.1767157 - 47 16 2 1991 78.0000000 59.1633361 - 48 17 2 1991 74.0000000 61.1808683 - 49 18 2 1991 77.0000000 59.3643118 - 50 19 2 1991 73.0000000 84.4750569 - 51 20 2 1991 69.0000000 146.7554133 - 52 21 2 1991 74.0000000 223.7808095 - 53 22 2 1991 81.0000000 243.9830656 - 54 23 2 1991 110.0000000 197.4063674 - 55 24 2 1991 180.0000000 172.4773893 - 56 25 2 1991 213.0000000 161.3627993 - 57 26 2 1991 222.0000000 142.3334256 - 58 27 2 1991 208.0000000 132.3624185 - 59 28 2 1991 211.0000000 126.6895569 - 60 1 3 1991 214.0000000 118.5003417 - 61 2 3 1991 208.0000000 130.3807275 - 62 3 3 1991 221.0000000 135.1696368 - 63 4 3 1991 281.0000000 118.9174788 - 64 5 3 1991 219.0000000 107.3443461 - 65 6 3 1991 190.0000000 98.5176818 - 66 7 3 1991 173.0000000 91.4068850 - 67 8 3 1991 164.0000000 85.9100584 - 68 9 3 1991 142.0000000 82.7715324 - 69 10 3 1991 133.0000000 82.9284614 - 70 11 3 1991 133.0000000 80.5483997 - 71 12 3 1991 118.0000000 76.2309220 - 72 13 3 1991 127.0000000 72.3580805 - 73 14 3 1991 113.0000000 69.0681400 - 74 15 3 1991 107.0000000 66.2364104 - 75 16 3 1991 100.0000000 63.7731638 - 76 17 3 1991 100.0000000 61.6160775 - 77 18 3 1991 95.0000000 59.7575302 - 78 19 3 1991 98.0000000 126.6727203 - 79 20 3 1991 119.0000000 171.9973054 - 80 21 3 1991 159.0000000 196.0079246 - 81 22 3 1991 196.0000000 237.4974624 - 82 23 3 1991 242.0000000 200.3929203 - 83 24 3 1991 216.0000000 163.6739828 - 84 25 3 1991 180.0000000 138.8800205 - 85 26 3 1991 145.0000000 121.4535888 - 86 27 3 1991 127.0000000 110.7259278 - 87 28 3 1991 117.0000000 99.7920355 - 88 29 3 1991 109.0000000 91.2314005 - 89 30 3 1991 106.0000000 84.3561648 - 90 31 3 1991 99.0000000 78.7310765 - 91 1 4 1991 96.0000000 74.0564480 - 92 2 4 1991 88.0000000 70.1194086 - 93 3 4 1991 87.0000000 66.7647863 - 94 4 4 1991 82.0000000 64.3724140 - 95 5 4 1991 84.0000000 62.7172884 - 96 6 4 1991 67.0000000 60.4033075 - 97 7 4 1991 89.0000000 58.4941191 - 98 8 4 1991 75.0000000 56.8952822 - 99 9 4 1991 79.0000000 55.2279981 - 100 10 4 1991 70.0000000 53.6745658 - 101 11 4 1991 69.0000000 52.2787424 - 102 12 4 1991 69.0000000 51.0182790 - 103 13 4 1991 56.0000000 49.8735178 - 104 14 4 1991 63.0000000 48.8302631 - 105 15 4 1991 58.0000000 47.8766536 - 106 16 4 1991 56.0000000 46.9912228 - 107 17 4 1991 54.0000000 46.1708619 - 108 18 4 1991 57.0000000 45.4337735 - 109 19 4 1991 53.0000000 45.6175591 - 110 20 4 1991 53.0000000 45.6595855 - 111 21 4 1991 65.0000000 44.8227005 - 112 22 4 1991 69.0000000 46.6927204 - 113 23 4 1991 61.0000000 48.8291013 - 114 24 4 1991 56.0000000 45.5395186 - 115 25 4 1991 56.0000000 44.3830025 - 116 26 4 1991 53.0000000 43.5585722 - 117 27 4 1991 49.0000000 42.8129937 - 118 28 4 1991 53.0000000 42.1223171 - 119 29 4 1991 48.0000000 45.6505011 - 120 30 4 1991 57.0000000 91.1146685 - 121 1 5 1991 69.0000000 89.6521324 - 122 2 5 1991 89.0000000 67.6201588 - 123 3 5 1991 105.0000000 62.7233674 - 124 4 5 1991 79.0000000 59.1813437 - 125 5 5 1991 69.0000000 56.3167260 - 126 6 5 1991 71.0000000 54.2900775 - 127 7 5 1991 60.0000000 51.9047303 - 128 8 5 1991 64.0000000 49.9033760 - 129 9 5 1991 59.0000000 48.1533375 - 130 10 5 1991 57.0000000 48.6153682 - 131 11 5 1991 55.0000000 52.0221794 - 132 12 5 1991 53.0000000 49.1678713 - 133 13 5 1991 52.0000000 47.4546154 - 134 14 5 1991 50.0000000 46.1816646 - 135 15 5 1991 52.0000000 51.2563253 - 136 16 5 1991 54.0000000 54.3039077 - 137 17 5 1991 54.0000000 49.7013687 - 138 18 5 1991 55.0000000 48.0069011 - 139 19 5 1991 48.0000000 46.4810799 - 140 20 5 1991 48.0000000 45.0929135 - 141 21 5 1991 49.0000000 43.8264346 - 142 22 5 1991 41.0000000 42.6677960 - 143 23 5 1991 40.0000000 41.6048915 - 144 24 5 1991 40.0000000 40.6271117 - 145 25 5 1991 39.0000000 39.7251383 - 146 26 5 1991 43.0000000 38.8907718 - 147 27 5 1991 39.0000000 38.1167837 - 148 28 5 1991 36.0000000 37.3967918 - 149 29 5 1991 33.0000000 36.7251527 - 150 30 5 1991 39.0000000 36.0968695 - 151 31 5 1991 34.0000000 35.5075121 - 152 1 6 1991 37.0000000 34.9531487 - 153 2 6 1991 35.0000000 34.4302855 - 154 3 6 1991 29.0000000 33.9358148 - 155 4 6 1991 33.0000000 33.4669698 - 156 5 6 1991 34.0000000 33.0348732 - 157 6 6 1991 32.0000000 49.8169639 - 158 7 6 1991 38.0000000 52.3064752 - 159 8 6 1991 39.0000000 41.5225400 - 160 9 6 1991 41.0000000 38.3807137 - 161 10 6 1991 44.0000000 52.2023562 - 162 11 6 1991 48.0000000 37.7712016 - 163 12 6 1991 42.0000000 35.0238992 - 164 13 6 1991 37.0000000 34.2227275 - 165 14 6 1991 39.0000000 33.5627689 - 166 15 6 1991 35.0000000 33.3440965 - 167 16 6 1991 31.0000000 36.3239287 - 168 17 6 1991 33.0000000 39.8908457 - 169 18 6 1991 31.0000000 37.5037378 - 170 19 6 1991 28.0000000 34.7646148 - 171 20 6 1991 60.0000000 70.4667363 - 172 21 6 1991 48.0000000 57.7570305 - 173 22 6 1991 54.0000000 41.7313607 - 174 23 6 1991 63.0000000 49.0068178 - 175 24 6 1991 41.0000000 43.6036757 - 176 25 6 1991 42.0000000 39.3345839 - 177 26 6 1991 43.0000000 37.7169237 - 178 27 6 1991 38.0000000 45.9314302 - 179 28 6 1991 38.0000000 46.9106547 - 180 29 6 1991 35.0000000 40.2966214 - 181 30 6 1991 41.0000000 38.0073310 - 182 1 7 1991 41.0000000 36.5529427 - 183 2 7 1991 38.0000000 35.2743847 - 184 3 7 1991 34.0000000 34.1395499 - 185 4 7 1991 27.0000000 33.1255418 - 186 5 7 1991 31.0000000 32.2139704 - 187 6 7 1991 30.0000000 31.3899528 - 188 7 7 1991 26.0000000 37.3448485 - 189 8 7 1991 30.0000000 36.5433324 - 190 9 7 1991 31.0000000 30.5064640 - 191 10 7 1991 23.0000000 29.7892772 - 192 11 7 1991 35.0000000 29.1359551 - 193 12 7 1991 19.0000000 30.2386159 - 194 13 7 1991 24.0000000 56.9408280 - 195 14 7 1991 26.0000000 50.0427920 - 196 15 7 1991 27.0000000 34.4941281 - 197 16 7 1991 41.0000000 31.4320655 - 198 17 7 1991 34.0000000 30.4926301 - 199 18 7 1991 27.0000000 29.6506262 - 200 19 7 1991 25.0000000 28.8911135 - 201 20 7 1991 23.0000000 28.2021745 - 202 21 7 1991 22.0000000 27.5739729 - 203 22 7 1991 27.0000000 26.9983230 - 204 23 7 1991 23.0000000 26.4683630 - 205 24 7 1991 21.0000000 27.2987752 - 206 25 7 1991 23.0000000 52.1389777 - 207 26 7 1991 33.0000000 44.7949824 - 208 27 7 1991 23.0000000 31.4402523 - 209 28 7 1991 29.0000000 28.2068631 - 210 29 7 1991 30.0000000 27.4334344 - 211 30 7 1991 35.0000000 40.3132129 - 212 31 7 1991 27.0000000 39.9393572 - 213 1 8 1991 45.0000000 29.2878841 - 214 2 8 1991 47.0000000 28.3111019 - 215 3 8 1991 40.0000000 27.4838485 - 216 4 8 1991 35.0000000 26.7392065 - 217 5 8 1991 26.0000000 26.0650814 - 218 6 8 1991 23.0000000 25.4515740 - 219 7 8 1991 30.0000000 26.4391142 - 220 8 8 1991 33.0000000 27.1329838 - 221 9 8 1991 30.0000000 24.5265522 - 222 10 8 1991 28.0000000 23.6671423 - 223 11 8 1991 19.0000000 23.2352828 - 224 12 8 1991 20.0000000 22.8335436 - 225 13 8 1991 16.0000000 22.4583815 - 226 14 8 1991 18.0000000 22.1067503 - 227 15 8 1991 18.0000000 21.7760195 - 228 16 8 1991 20.0000000 21.4639084 - 229 17 8 1991 16.0000000 21.1684321 - 230 18 8 1991 15.0000000 20.8878574 - 231 19 8 1991 15.0000000 20.6206668 - 232 20 8 1991 14.0000000 20.3655272 - 233 21 8 1991 15.0000000 20.1212650 - 234 22 8 1991 13.0000000 19.8868892 - 235 23 8 1991 12.0000000 19.8176027 - 236 24 8 1991 11.0000000 19.7257588 - 237 25 8 1991 12.0000000 19.2402183 - 238 26 8 1991 11.0000000 19.0363177 - 239 27 8 1991 13.0000000 18.8388140 - 240 28 8 1991 11.0000000 18.6470237 - 241 29 8 1991 12.0000000 18.4604867 - 242 30 8 1991 12.0000000 18.2787910 - 243 31 8 1991 11.0000000 18.1015674 - 244 1 9 1991 11.0000000 19.7928329 - 245 2 9 1991 17.0000000 20.1421586 - 246 3 9 1991 11.0000000 17.6374961 - 247 4 9 1991 12.0000000 17.4717085 - 248 5 9 1991 11.0000000 17.3096420 - 249 6 9 1991 11.0000000 17.1507696 - 250 7 9 1991 18.0000000 16.9948835 - 251 8 9 1991 11.0000000 16.8417966 - 252 9 9 1991 13.0000000 16.6913395 - 253 10 9 1991 12.0000000 17.2711212 - 254 11 9 1991 11.0000000 46.0592454 - 255 12 9 1991 20.0000000 38.2304510 - 256 13 9 1991 21.0000000 17.2685457 - 257 14 9 1991 29.0000000 17.0253227 - 258 15 9 1991 28.0000000 16.7971770 - 259 16 9 1991 20.0000000 16.5811292 - 260 17 9 1991 20.0000000 16.3757497 - 261 18 9 1991 20.0000000 16.1798218 - 262 19 9 1991 12.0000000 15.9923046 - 263 20 9 1991 11.0000000 15.8123031 - 264 21 9 1991 11.0000000 15.6390444 - 265 22 9 1991 22.0000000 37.2254625 - 266 23 9 1991 14.0000000 36.4613186 - 267 24 9 1991 48.0000000 17.0958358 - 268 25 9 1991 45.0000000 75.7196313 - 269 26 9 1991 80.0000000 79.0349097 - 270 27 9 1991 61.0000000 60.3097864 - 271 28 9 1991 61.0000000 88.9638128 - 272 29 9 1991 65.0000000 97.9627886 - 273 30 9 1991 63.0000000 93.3960286 - 274 1 10 1991 90.0000000 70.7574732 - 275 2 10 1991 59.0000000 58.9068397 - 276 3 10 1991 45.0000000 50.6822734 - 277 4 10 1991 42.0000000 44.5932834 - 278 5 10 1991 41.0000000 92.8702624 - 279 6 10 1991 41.0000000 121.5408669 - 280 7 10 1991 73.0000000 88.8150558 - 281 8 10 1991 96.0000000 72.8022686 - 282 9 10 1991 61.0000000 62.7982006 - 283 10 10 1991 44.0000000 55.2242620 - 284 11 10 1991 42.0000000 49.5476906 - 285 12 10 1991 41.0000000 75.1031744 - 286 13 10 1991 42.0000000 85.9140605 - 287 14 10 1991 61.0000000 65.9245714 - 288 15 10 1991 55.0000000 58.6830885 - 289 16 10 1991 41.0000000 58.5346228 - 290 17 10 1991 48.0000000 75.4990259 - 291 18 10 1991 52.0000000 111.3318497 - 292 19 10 1991 66.0000000 103.6073965 - 293 20 10 1991 59.0000000 88.9384786 - 294 21 10 1991 71.0000000 80.3447969 - 295 22 10 1991 74.0000000 70.1579694 - 296 23 10 1991 70.0000000 62.4674562 - 297 24 10 1991 59.0000000 56.2680219 - 298 25 10 1991 57.0000000 51.1854880 - 299 26 10 1991 57.0000000 46.9471896 - 300 27 10 1991 51.0000000 43.3688290 - 301 28 10 1991 47.0000000 40.3162362 - 302 29 10 1991 48.0000000 37.6892352 - 303 30 10 1991 45.0000000 39.8834340 - 304 31 10 1991 43.0000000 45.1570385 - 305 1 11 1991 40.0000000 57.8517357 - 306 2 11 1991 47.0000000 64.2938590 - 307 3 11 1991 46.0000000 106.1798144 - 308 4 11 1991 76.0000000 178.8077588 - 309 5 11 1991 60.0000000 181.4564089 - 310 6 11 1991 132.0000000 164.1429152 - 311 7 11 1991 133.0000000 161.5812132 - 312 8 11 1991 113.0000000 197.1195826 - 313 9 11 1991 120.0000000 219.2090834 - 314 10 11 1991 141.0000000 185.1434471 - 315 11 11 1991 208.0000000 211.1414504 - 316 12 11 1991 166.0000000 326.3112960 - 317 13 11 1991 183.0000000 463.8509945 - 318 14 11 1991 299.0000000 681.4224768 - 319 15 11 1991 521.0000000 596.9628453 - 320 16 11 1991 443.0000000 449.6138005 - 321 17 11 1991 304.0000000 344.9970088 - 322 18 11 1991 231.0000000 323.3692805 - 323 19 11 1991 192.0000000 333.5901534 - 324 20 11 1991 199.0000000 290.9377734 - 325 21 11 1991 201.0000000 254.5917160 - 326 22 11 1991 173.0000000 204.7417568 - 327 23 11 1991 159.0000000 168.7005533 - 328 24 11 1991 160.0000000 146.0885333 - 329 25 11 1991 146.0000000 128.9904220 - 330 26 11 1991 110.0000000 115.2893503 - 331 27 11 1991 114.0000000 104.0486653 - 332 28 11 1991 97.0000000 94.7218673 - 333 29 11 1991 89.0000000 86.8821498 - 334 30 11 1991 73.0000000 80.2238723 - 335 1 12 1991 69.0000000 74.5192581 - 336 2 12 1991 67.0000000 69.5948220 - 337 3 12 1991 63.0000000 65.3159274 - 338 4 12 1991 58.0000000 61.5763747 - 339 5 12 1991 59.0000000 58.2912037 - 340 6 12 1991 53.0000000 55.3916027 - 341 7 12 1991 54.0000000 52.8212354 - 342 8 12 1991 51.0000000 50.5335407 - 343 9 12 1991 47.0000000 48.4897155 - 344 10 12 1991 42.0000000 46.6571838 - 345 11 12 1991 40.0000000 45.0084195 - 346 12 12 1991 39.0000000 43.5200295 - 347 13 12 1991 36.0000000 42.1720311 - 348 14 12 1991 37.0000000 40.9472767 - 349 15 12 1991 32.0000000 39.8309914 - 350 16 12 1991 37.0000000 52.2297038 - 351 17 12 1991 62.0000000 215.5922679 - 352 18 12 1991 118.0000000 373.9325120 - 353 19 12 1991 170.0000000 491.4816688 - 354 20 12 1991 229.0000000 661.4084798 - 355 21 12 1991 448.0000000 764.3215429 - 356 22 12 1991 464.0000000 1056.3279003 - 357 23 12 1991 675.0000000 813.3474504 - 358 24 12 1991 844.0000000 614.9651224 - 359 25 12 1991 569.0000000 452.2893431 - 360 26 12 1991 358.0000000 349.2892261 - 361 27 12 1991 279.0000000 285.6947638 - 362 28 12 1991 238.0000000 233.0080575 - 363 29 12 1991 201.0000000 191.6599183 - 364 30 12 1991 185.0000000 165.9144654 - 365 31 12 1991 165.0000000 147.1567556 - 366 1 1 1992 140.0000000 132.1242869 - 367 2 1 1992 126.0000000 120.0910051 - 368 3 1 1992 117.0000000 111.3900378 - 369 4 1 1992 114.0000000 107.9236530 - 370 5 1 1992 108.0000000 104.5489534 - 371 6 1 1992 108.0000000 96.1133717 - 372 7 1 1992 101.0000000 89.2351654 - 373 8 1 1992 97.0000000 87.9167975 - 374 9 1 1992 89.0000000 113.1006429 - 375 10 1 1992 111.0000000 185.1708678 - 376 11 1 1992 135.0000000 207.2874587 - 377 12 1 1992 171.0000000 167.8977755 - 378 13 1 1992 125.0000000 141.6945937 - 379 14 1 1992 111.0000000 123.0584731 - 380 15 1 1992 100.0000000 109.2385981 - 381 16 1 1992 87.0000000 98.7473320 - 382 17 1 1992 75.0000000 90.2328352 - 383 18 1 1992 79.0000000 83.3637699 - 384 19 1 1992 70.0000000 85.9557306 - 385 20 1 1992 72.0000000 86.6094963 - 386 21 1 1992 87.0000000 86.0063744 - 387 22 1 1992 79.0000000 78.5954866 - 388 23 1 1992 71.0000000 73.0648630 - 389 24 1 1992 66.0000000 68.5459611 - 390 25 1 1992 67.0000000 64.7895375 - 391 26 1 1992 65.0000000 61.6217409 - 392 27 1 1992 59.0000000 58.9172683 - 393 28 1 1992 57.0000000 56.6491049 - 394 29 1 1992 54.0000000 55.5518658 - 395 30 1 1992 59.0000000 61.1038206 - 396 31 1 1992 57.0000000 79.0453996 - 397 1 2 1992 56.0000000 89.8129020 - 398 2 2 1992 54.0000000 84.1469875 - 399 3 2 1992 58.0000000 76.7506329 - 400 4 2 1992 63.0000000 160.4591106 - 401 5 2 1992 76.0000000 291.8729518 - 402 6 2 1992 250.0000000 284.8809931 - 403 7 2 1992 346.0000000 221.8195894 - 404 8 2 1992 241.0000000 182.6489743 - 405 9 2 1992 180.0000000 174.8321235 - 406 10 2 1992 164.0000000 185.8166269 - 407 11 2 1992 183.0000000 220.1159693 - 408 12 2 1992 215.0000000 293.6209811 - 409 13 2 1992 265.0000000 318.1187469 - 410 14 2 1992 287.0000000 324.8510584 - 411 15 2 1992 272.0000000 316.8713765 - 412 16 2 1992 253.0000000 344.6850862 - 413 17 2 1992 301.0000000 321.8558072 - 414 18 2 1992 275.0000000 251.5077637 - 415 19 2 1992 224.0000000 205.2335676 - 416 20 2 1992 194.0000000 173.3061704 - 417 21 2 1992 173.0000000 150.7191415 - 418 22 2 1992 157.0000000 133.6816568 - 419 23 2 1992 142.0000000 122.9611601 - 420 24 2 1992 133.0000000 116.4193856 - 421 25 2 1992 128.0000000 106.8361059 - 422 26 2 1992 125.0000000 98.4194724 - 423 27 2 1992 125.0000000 91.4854245 - 424 28 2 1992 110.0000000 85.6056703 - 425 29 2 1992 107.0000000 80.5721803 - 426 1 3 1992 97.0000000 76.4594271 - 427 2 3 1992 97.0000000 74.8191563 - 428 3 3 1992 86.0000000 77.8350199 - 429 4 3 1992 93.0000000 72.9942747 - 430 5 3 1992 86.0000000 69.6670507 - 431 6 3 1992 82.0000000 66.7609245 - 432 7 3 1992 80.0000000 64.0290850 - 433 8 3 1992 77.0000000 61.6089724 - 434 9 3 1992 73.0000000 59.4581179 - 435 10 3 1992 76.0000000 57.7779433 - 436 11 3 1992 68.0000000 56.4120053 - 437 12 3 1992 70.0000000 125.0103819 - 438 13 3 1992 116.0000000 266.8465565 - 439 14 3 1992 206.0000000 380.8611967 - 440 15 3 1992 433.0000000 415.5975237 - 441 16 3 1992 495.0000000 427.5021232 - 442 17 3 1992 331.0000000 316.8900966 - 443 18 3 1992 240.0000000 247.3164948 - 444 19 3 1992 215.0000000 203.5964993 - 445 20 3 1992 185.0000000 173.3418938 - 446 21 3 1992 185.0000000 167.0115907 - 447 22 3 1992 185.0000000 255.6227811 - 448 23 3 1992 213.0000000 416.4248979 - 449 24 3 1992 466.0000000 470.5465665 - 450 25 3 1992 580.0000000 483.7610875 - 451 26 3 1992 566.0000000 409.4987120 - 452 27 3 1992 487.0000000 344.7376669 - 453 28 3 1992 387.0000000 292.9044838 - 454 29 3 1992 311.0000000 243.1656450 - 455 30 3 1992 270.0000000 204.1318174 - 456 31 3 1992 246.0000000 191.5313614 - 457 1 4 1992 229.0000000 207.8142313 - 458 2 4 1992 222.0000000 209.3364588 - 459 3 4 1992 217.0000000 244.9681062 - 460 4 4 1992 208.0000000 313.4380095 - 461 5 4 1992 220.0000000 272.6626640 - 462 6 4 1992 210.0000000 223.1765401 - 463 7 4 1992 190.0000000 186.8939816 - 464 8 4 1992 173.0000000 163.4866507 - 465 9 4 1992 166.0000000 147.2787430 - 466 10 4 1992 133.0000000 134.4153162 - 467 11 4 1992 126.0000000 123.7836496 - 468 12 4 1992 124.0000000 114.8629924 - 469 13 4 1992 116.0000000 107.3139196 - 470 14 4 1992 112.0000000 109.4829254 - 471 15 4 1992 111.0000000 155.4229158 - 472 16 4 1992 137.0000000 185.0117039 - 473 17 4 1992 206.0000000 172.1181689 - 474 18 4 1992 176.0000000 172.1315979 - 475 19 4 1992 161.0000000 148.9613299 - 476 20 4 1992 161.0000000 131.5439255 - 477 21 4 1992 139.0000000 118.4086602 - 478 22 4 1992 139.0000000 108.2018483 - 479 23 4 1992 123.0000000 100.0444782 - 480 24 4 1992 119.0000000 93.3849994 - 481 25 4 1992 111.0000000 87.8537555 - 482 26 4 1992 94.0000000 83.2773491 - 483 27 4 1992 94.0000000 84.0848478 - 484 28 4 1992 102.0000000 90.6859980 - 485 29 4 1992 120.0000000 89.8185619 - 486 30 4 1992 120.0000000 84.7976717 - 487 1 5 1992 114.0000000 114.5273914 - 488 2 5 1992 115.0000000 152.8030235 - 489 3 5 1992 206.0000000 130.6584794 - 490 4 5 1992 215.0000000 115.8482345 - 491 5 5 1992 125.0000000 105.2700876 - 492 6 5 1992 123.0000000 96.9789606 - 493 7 5 1992 113.0000000 90.3033473 - 494 8 5 1992 77.0000000 84.8129866 - 495 9 5 1992 83.0000000 80.4161807 - 496 10 5 1992 83.0000000 89.6543324 - 497 11 5 1992 96.0000000 89.0584201 - 498 12 5 1992 120.0000000 78.9000569 - 499 13 5 1992 80.0000000 73.9077345 - 500 14 5 1992 76.0000000 70.6220828 - 501 15 5 1992 69.0000000 67.8023330 - 502 16 5 1992 63.0000000 65.3543971 - 503 17 5 1992 61.0000000 63.2081354 - 504 18 5 1992 60.0000000 61.3099579 - 505 19 5 1992 59.0000000 59.6181184 - 506 20 5 1992 67.0000000 58.0995612 - 507 21 5 1992 51.0000000 56.7282096 - 508 22 5 1992 44.0000000 55.4824957 - 509 23 5 1992 42.0000000 54.3431211 - 510 24 5 1992 51.0000000 53.3828299 - 511 25 5 1992 42.0000000 52.6042549 - 512 26 5 1992 54.0000000 62.5926475 - 513 27 5 1992 53.0000000 55.3100587 - 514 28 5 1992 59.0000000 51.4217452 - 515 29 5 1992 55.0000000 59.8433128 - 516 30 5 1992 54.0000000 59.7507290 - 517 31 5 1992 48.0000000 53.7936790 - 518 1 6 1992 63.0000000 56.3480326 - 519 2 6 1992 61.0000000 55.3104621 - 520 3 6 1992 55.0000000 56.5482891 - 521 4 6 1992 75.0000000 73.5278488 - 522 5 6 1992 53.0000000 87.9680603 - 523 6 6 1992 77.0000000 87.7662025 - 524 7 6 1992 114.0000000 86.7143376 - 525 8 6 1992 167.0000000 99.1657739 - 526 9 6 1992 116.0000000 89.5062643 - 527 10 6 1992 91.0000000 78.3245917 - 528 11 6 1992 85.0000000 73.0394919 - 529 12 6 1992 68.0000000 68.6967894 - 530 13 6 1992 71.0000000 65.0611654 - 531 14 6 1992 63.0000000 61.9674599 - 532 15 6 1992 59.0000000 59.3042268 - 533 16 6 1992 46.0000000 56.9885342 - 534 17 6 1992 44.0000000 54.9572934 - 535 18 6 1992 39.0000000 53.1615961 - 536 19 6 1992 41.0000000 51.5690663 - 537 20 6 1992 44.0000000 52.4026484 - 538 21 6 1992 39.0000000 50.7434852 - 539 22 6 1992 32.0000000 48.4517735 - 540 23 6 1992 40.0000000 49.6901395 - 541 24 6 1992 41.0000000 63.4463650 - 542 25 6 1992 42.0000000 58.4717525 - 543 26 6 1992 42.0000000 50.9247275 - 544 27 6 1992 48.0000000 48.2810711 - 545 28 6 1992 37.0000000 46.7401884 - 546 29 6 1992 40.0000000 45.4269035 - 547 30 6 1992 29.0000000 44.4303564 - 548 1 7 1992 30.0000000 44.0870145 - 549 2 7 1992 36.0000000 42.5816384 - 550 3 7 1992 29.0000000 47.5787013 - 551 4 7 1992 36.0000000 58.0720654 - 552 5 7 1992 50.0000000 76.0069374 - 553 6 7 1992 78.0000000 78.3645421 - 554 7 7 1992 54.0000000 60.3252469 - 555 8 7 1992 57.0000000 51.3601270 - 556 9 7 1992 51.0000000 49.2913215 - 557 10 7 1992 47.0000000 69.1303205 - 558 11 7 1992 46.0000000 92.3083442 - 559 12 7 1992 76.0000000 89.5211476 - 560 13 7 1992 72.0000000 79.0096686 - 561 14 7 1992 67.0000000 68.6042477 - 562 15 7 1992 63.0000000 63.7129672 - 563 16 7 1992 47.0000000 59.6959767 - 564 17 7 1992 47.0000000 56.3384365 - 565 18 7 1992 42.0000000 53.4913285 - 566 19 7 1992 41.0000000 51.0476248 - 567 20 7 1992 39.0000000 48.9283255 - 568 21 7 1992 37.0000000 48.3972222 - 569 22 7 1992 33.0000000 48.2886958 - 570 23 7 1992 33.0000000 45.1292611 - 571 24 7 1992 33.0000000 43.7190794 - 572 25 7 1992 37.0000000 42.4514372 - 573 26 7 1992 26.0000000 41.3054674 - 574 27 7 1992 24.0000000 40.2661081 - 575 28 7 1992 26.0000000 39.3189968 - 576 29 7 1992 29.0000000 38.4520900 - 577 30 7 1992 19.0000000 37.6552165 - 578 31 7 1992 22.0000000 38.8423444 - 579 1 8 1992 28.0000000 38.6545780 - 580 2 8 1992 35.0000000 35.9120060 - 581 3 8 1992 29.0000000 35.2829333 - 582 4 8 1992 36.0000000 34.6976604 - 583 5 8 1992 52.0000000 34.1502428 - 584 6 8 1992 74.0000000 33.6363280 - 585 7 8 1992 54.0000000 33.1521608 - 586 8 8 1992 57.0000000 32.6944877 - 587 9 8 1992 48.0000000 34.8023057 - 588 10 8 1992 47.0000000 33.8594130 - 589 11 8 1992 46.0000000 41.0093076 - 590 12 8 1992 75.0000000 40.4014355 - 591 13 8 1992 73.0000000 45.1642903 - 592 14 8 1992 66.0000000 47.8748616 - 593 15 8 1992 60.0000000 40.5212187 - 594 16 8 1992 47.0000000 32.5967059 - 595 17 8 1992 46.0000000 31.9382647 - 596 18 8 1992 42.0000000 31.3451850 - 597 19 8 1992 41.0000000 30.8451070 - 598 20 8 1992 40.0000000 37.7750244 - 599 21 8 1992 37.0000000 34.1102233 - 600 22 8 1992 32.0000000 31.4247974 - 601 23 8 1992 32.0000000 31.5879492 - 602 24 8 1992 32.0000000 29.6165824 - 603 25 8 1992 36.0000000 29.1125591 - 604 26 8 1992 27.0000000 28.6840014 - 605 27 8 1992 25.0000000 28.2835060 - 606 28 8 1992 25.0000000 28.3920731 - 607 29 8 1992 28.0000000 35.1204437 - 608 30 8 1992 20.0000000 49.0115592 - 609 31 8 1992 22.0000000 93.0903768 - 610 1 9 1992 49.0000000 81.5976792 - 611 2 9 1992 77.0000000 68.9374326 - 612 3 9 1992 67.0000000 65.9342971 - 613 4 9 1992 45.0000000 64.7448364 - 614 5 9 1992 44.0000000 56.4831516 - 615 6 9 1992 64.0000000 48.0046471 - 616 7 9 1992 52.0000000 44.3621827 - 617 8 9 1992 40.0000000 41.4181153 - 618 9 9 1992 30.0000000 38.9948563 - 619 10 9 1992 34.0000000 36.9693251 - 620 11 9 1992 32.0000000 35.5462984 - 621 12 9 1992 36.0000000 34.4156297 - 622 13 9 1992 28.0000000 32.9060076 - 623 14 9 1992 33.0000000 32.8319989 - 624 15 9 1992 35.0000000 35.2501550 - 625 16 9 1992 30.0000000 31.2424300 - 626 17 9 1992 32.0000000 30.2629162 - 627 18 9 1992 29.0000000 29.4590945 - 628 19 9 1992 30.0000000 29.2268806 - 629 20 9 1992 28.0000000 28.1401581 - 630 21 9 1992 29.0000000 27.4801786 - 631 22 9 1992 29.0000000 26.8791665 - 632 23 9 1992 27.0000000 26.3324735 - 633 24 9 1992 27.0000000 25.8257511 - 634 25 9 1992 23.0000000 25.3553810 - 635 26 9 1992 28.0000000 24.9184590 - 636 27 9 1992 25.0000000 24.5113161 - 637 28 9 1992 25.0000000 25.8907805 - 638 29 9 1992 27.0000000 27.7762933 - 639 30 9 1992 25.0000000 24.2129318 - 640 1 10 1992 27.0000000 24.3323009 - 641 2 10 1992 33.0000000 26.5785563 - 642 3 10 1992 29.0000000 27.4787100 - 643 4 10 1992 31.0000000 25.3544347 - 644 5 10 1992 25.0000000 38.1499131 - 645 6 10 1992 25.0000000 43.9428156 - 646 7 10 1992 36.0000000 31.7341558 - 647 8 10 1992 42.0000000 25.9064387 - 648 9 10 1992 43.0000000 27.7386788 - 649 10 10 1992 26.0000000 34.6595430 - 650 11 10 1992 27.0000000 32.3991467 - 651 12 10 1992 27.0000000 27.8950241 - 652 13 10 1992 26.0000000 26.9843349 - 653 14 10 1992 26.0000000 26.2580123 - 654 15 10 1992 23.0000000 40.0637057 - 655 16 10 1992 21.0000000 40.0457319 - 656 17 10 1992 26.0000000 34.4825571 - 657 18 10 1992 34.0000000 38.8642136 - 658 19 10 1992 37.0000000 35.1699714 - 659 20 10 1992 31.0000000 42.5426011 - 660 21 10 1992 31.0000000 41.9234633 - 661 22 10 1992 35.0000000 40.9262993 - 662 23 10 1992 33.0000000 69.9910209 - 663 24 10 1992 40.0000000 147.3811264 - 664 25 10 1992 74.0000000 222.8928136 - 665 26 10 1992 161.0000000 252.2044388 - 666 27 10 1992 285.0000000 264.8584948 - 667 28 10 1992 244.0000000 311.1354484 - 668 29 10 1992 263.0000000 330.5691345 - 669 30 10 1992 276.0000000 261.4938980 - 670 31 10 1992 186.0000000 201.8569921 - 671 1 11 1992 154.0000000 162.7326310 - 672 2 11 1992 112.0000000 168.2355850 - 673 3 11 1992 104.0000000 181.6727783 - 674 4 11 1992 96.0000000 171.0428055 - 675 5 11 1992 99.0000000 145.3383660 - 676 6 11 1992 126.0000000 125.3980270 - 677 7 11 1992 91.0000000 111.5430319 - 678 8 11 1992 84.0000000 102.9931390 - 679 9 11 1992 81.0000000 108.2696868 - 680 10 11 1992 85.0000000 163.8575887 - 681 11 11 1992 126.0000000 305.4676558 - 682 12 11 1992 279.0000000 408.7757533 - 683 13 11 1992 390.0000000 416.1532911 - 684 14 11 1992 294.0000000 401.5101375 - 685 15 11 1992 260.0000000 532.7176430 - 686 16 11 1992 398.0000000 760.2990551 - 687 17 11 1992 520.0000000 698.1450572 - 688 18 11 1992 487.0000000 604.7570849 - 689 19 11 1992 380.0000000 626.0942004 - 690 20 11 1992 385.0000000 477.5026012 - 691 21 11 1992 351.0000000 504.0335778 - 692 22 11 1992 309.0000000 668.1785591 - 693 23 11 1992 587.0000000 494.0189344 - 694 24 11 1992 661.0000000 385.2178132 - 695 25 11 1992 447.0000000 399.1864360 - 696 26 11 1992 361.0000000 460.1103889 - 697 27 11 1992 351.0000000 422.9033181 - 698 28 11 1992 353.0000000 476.0799831 - 699 29 11 1992 369.0000000 629.5958479 - 700 30 11 1992 452.0000000 605.3465245 - 701 1 12 1992 441.0000000 441.4891998 - 702 2 12 1992 348.0000000 487.1370788 - 703 3 12 1992 394.0000000 603.9917024 - 704 4 12 1992 455.0000000 653.5516504 - 705 5 12 1992 491.0000000 714.0444928 - 706 6 12 1992 469.0000000 550.9646964 - 707 7 12 1992 364.0000000 526.8852206 - 708 8 12 1992 338.0000000 433.5179875 - 709 9 12 1992 334.0000000 332.0001586 - 710 10 12 1992 268.0000000 262.5364969 - 711 11 12 1992 236.0000000 277.6133094 - 712 12 12 1992 230.0000000 327.2440765 - 713 13 12 1992 239.0000000 299.7116241 - 714 14 12 1992 256.0000000 241.3703017 - 715 15 12 1992 217.0000000 204.3511542 - 716 16 12 1992 201.0000000 183.4379215 - 717 17 12 1992 188.0000000 166.1614083 - 718 18 12 1992 176.0000000 147.0411679 - 719 19 12 1992 170.0000000 135.1213141 - 720 20 12 1992 168.0000000 134.0070890 - 721 21 12 1992 131.0000000 147.6983519 - 722 22 12 1992 133.0000000 158.7660720 - 723 23 12 1992 134.0000000 142.3980949 - 724 24 12 1992 127.0000000 126.7579939 - 725 25 12 1992 117.0000000 114.9318012 - 726 26 12 1992 113.0000000 105.5588242 - 727 27 12 1992 100.0000000 97.9606655 - 728 28 12 1992 94.0000000 91.6884161 - 729 29 12 1992 87.0000000 86.4324803 - 730 30 12 1992 86.0000000 81.9720825 - 731 31 12 1992 81.0000000 78.1453752 - 732 1 1 1993 77.0000000 74.8309206 - 733 2 1 1993 76.0000000 71.9357800 - 734 3 1 1993 61.0000000 69.3876022 - 735 4 1 1993 61.0000000 67.1292232 - 736 5 1 1993 57.0000000 65.1148894 - 737 6 1 1993 66.0000000 89.7326202 - 738 7 1 1993 67.0000000 137.1030075 - 739 8 1 1993 84.0000000 157.6465974 - 740 9 1 1993 90.0000000 171.2255270 - 741 10 1 1993 113.0000000 254.2327692 - 742 11 1 1993 265.0000000 703.1238290 - 743 12 1 1993 559.0000000 1136.8052016 - 744 13 1 1993 832.0000000 913.8998608 - 745 14 1 1993 601.0000000 627.9399116 - 746 15 1 1993 436.0000000 429.0731398 - 747 16 1 1993 339.0000000 319.0021169 - 748 17 1 1993 292.0000000 258.4650376 - 749 18 1 1993 247.0000000 222.4851413 - 750 19 1 1993 218.0000000 192.0075450 - 751 20 1 1993 205.0000000 165.9435221 - 752 21 1 1993 190.0000000 151.9836540 - 753 22 1 1993 176.0000000 148.2691623 - 754 23 1 1993 173.0000000 148.8390165 - 755 24 1 1993 173.0000000 237.9588086 - 756 25 1 1993 199.0000000 398.1437601 - 757 26 1 1993 361.0000000 313.6680016 - 758 27 1 1993 295.0000000 325.3456575 - 759 28 1 1993 238.0000000 353.3669319 - 760 29 1 1993 263.0000000 301.1289194 - 761 30 1 1993 245.0000000 247.7023073 - 762 31 1 1993 222.0000000 208.2174304 - 763 1 2 1993 199.0000000 180.0875819 - 764 2 2 1993 186.0000000 158.9334241 - 765 3 2 1993 171.0000000 142.5855643 - 766 4 2 1993 157.0000000 129.5960003 - 767 5 2 1993 159.0000000 119.0565796 - 768 6 2 1993 129.0000000 110.3579583 - 769 7 2 1993 119.0000000 103.4495974 - 770 8 2 1993 119.0000000 97.2465111 - 771 9 2 1993 105.0000000 91.9003975 - 772 10 2 1993 106.0000000 87.2897254 - 773 11 2 1993 105.0000000 83.2809368 - 774 12 2 1993 95.0000000 79.7701484 - 775 13 2 1993 91.0000000 76.6753234 - 776 14 2 1993 88.0000000 73.9308102 - 777 15 2 1993 84.0000000 71.4834519 - 778 16 2 1993 83.0000000 69.7006346 - 779 17 2 1993 79.0000000 71.7476596 - 780 18 2 1993 78.0000000 75.8489368 - 781 19 2 1993 84.0000000 77.2619617 - 782 20 2 1993 91.0000000 98.3507214 - 783 21 2 1993 91.0000000 117.3810182 - 784 22 2 1993 90.0000000 117.5154929 - 785 23 2 1993 103.0000000 110.3286633 - 786 24 2 1993 94.0000000 98.7516652 - 787 25 2 1993 81.0000000 90.1226332 - 788 26 2 1993 78.0000000 83.5937611 - 789 27 2 1993 75.0000000 85.6825544 - 790 28 2 1993 76.0000000 87.8575006 - 791 1 3 1993 80.0000000 81.8531280 - 792 2 3 1993 75.0000000 79.4658617 - 793 3 3 1993 76.0000000 77.5186763 - 794 4 3 1993 72.0000000 72.8283593 - 795 5 3 1993 65.0000000 69.2544443 - 796 6 3 1993 64.0000000 66.2956123 - 797 7 3 1993 64.0000000 64.6207011 - 798 8 3 1993 68.0000000 65.6036910 - 799 9 3 1993 68.0000000 63.3136786 - 800 10 3 1993 67.0000000 64.9315450 - 801 11 3 1993 61.0000000 68.5968520 - 802 12 3 1993 57.0000000 66.4352547 - 803 13 3 1993 58.0000000 64.0887268 - 804 14 3 1993 54.0000000 62.0022188 - 805 15 3 1993 66.0000000 60.1659307 - 806 16 3 1993 54.0000000 58.4990389 - 807 17 3 1993 57.0000000 56.9943121 - 808 18 3 1993 57.0000000 55.6641299 - 809 19 3 1993 52.0000000 54.4053410 - 810 20 3 1993 57.0000000 53.2245977 - 811 21 3 1993 58.0000000 52.9927603 - 812 22 3 1993 57.0000000 71.2496909 - 813 23 3 1993 56.0000000 79.8791630 - 814 24 3 1993 63.0000000 69.5457513 - 815 25 3 1993 76.0000000 66.2146560 - 816 26 3 1993 56.0000000 63.3376556 - 817 27 3 1993 59.0000000 60.8293694 - 818 28 3 1993 59.0000000 58.6246926 - 819 29 3 1993 54.0000000 56.6727180 - 820 30 3 1993 48.0000000 54.9330320 - 821 31 3 1993 55.0000000 53.3731245 - 822 1 4 1993 48.0000000 53.8002992 - 823 2 4 1993 53.0000000 57.8914469 - 824 3 4 1993 47.0000000 56.6629576 - 825 4 4 1993 59.0000000 64.3557045 - 826 5 4 1993 53.0000000 87.6023295 - 827 6 4 1993 64.0000000 90.3254873 - 828 7 4 1993 63.0000000 79.7336592 - 829 8 4 1993 75.0000000 76.1317038 - 830 9 4 1993 64.0000000 71.1310504 - 831 10 4 1993 59.0000000 72.4693069 - 832 11 4 1993 60.0000000 80.8504291 - 833 12 4 1993 63.0000000 79.9011021 - 834 13 4 1993 69.0000000 78.2995611 - 835 14 4 1993 79.0000000 76.3135866 - 836 15 4 1993 82.0000000 72.0999164 - 837 16 4 1993 68.0000000 69.1613918 - 838 17 4 1993 56.0000000 65.6964577 - 839 18 4 1993 59.0000000 62.6100256 - 840 19 4 1993 61.0000000 59.8052170 - 841 20 4 1993 62.0000000 57.3128696 - 842 21 4 1993 57.0000000 55.1175080 - 843 22 4 1993 53.0000000 53.1743078 - 844 23 4 1993 47.0000000 51.4399790 - 845 24 4 1993 46.0000000 49.8819514 - 846 25 4 1993 47.0000000 48.4775363 - 847 26 4 1993 45.0000000 47.2055231 - 848 27 4 1993 43.0000000 46.0482071 - 849 28 4 1993 41.0000000 44.9915781 - 850 29 4 1993 38.0000000 44.0281222 - 851 30 4 1993 39.0000000 43.5165425 - 852 1 5 1993 40.0000000 42.8288242 - 853 2 5 1993 41.0000000 43.8920674 - 854 3 5 1993 45.0000000 42.6321485 - 855 4 5 1993 49.0000000 41.2571639 - 856 5 5 1993 40.0000000 40.5263116 - 857 6 5 1993 43.0000000 39.9552835 - 858 7 5 1993 38.0000000 39.6898062 - 859 8 5 1993 38.0000000 39.8749971 - 860 9 5 1993 43.0000000 38.9084145 - 861 10 5 1993 44.0000000 38.6239503 - 862 11 5 1993 41.0000000 38.6141272 - 863 12 5 1993 51.0000000 47.3678331 - 864 13 5 1993 63.0000000 86.5123375 - 865 14 5 1993 68.0000000 61.3566034 - 866 15 5 1993 77.0000000 48.4004411 - 867 16 5 1993 77.0000000 45.5384373 - 868 17 5 1993 59.0000000 43.3182317 - 869 18 5 1993 49.0000000 41.5711434 - 870 19 5 1993 43.0000000 46.6278492 - 871 20 5 1993 44.0000000 55.7308331 - 872 21 5 1993 48.0000000 50.4461323 - 873 22 5 1993 44.0000000 42.7596466 - 874 23 5 1993 46.0000000 41.1940146 - 875 24 5 1993 40.0000000 39.8515601 - 876 25 5 1993 43.0000000 38.6832583 - 877 26 5 1993 30.0000000 38.2414367 - 878 27 5 1993 45.0000000 48.7115702 - 879 28 5 1993 43.0000000 52.6777924 - 880 29 5 1993 44.0000000 43.1206942 - 881 30 5 1993 54.0000000 45.2552705 - 882 31 5 1993 56.0000000 45.2469552 - 883 1 6 1993 44.0000000 39.3805781 - 884 2 6 1993 43.0000000 40.2539156 - 885 3 6 1993 33.0000000 46.0178303 - 886 4 6 1993 45.0000000 40.2350117 - 887 5 6 1993 46.0000000 38.0366981 - 888 6 6 1993 42.0000000 36.8860494 - 889 7 6 1993 40.0000000 35.8633693 - 890 8 6 1993 30.0000000 34.9472484 - 891 9 6 1993 31.0000000 34.2180160 - 892 10 6 1993 32.0000000 33.7828644 - 893 11 6 1993 25.0000000 33.9240411 - 894 12 6 1993 33.0000000 35.4095334 - 895 13 6 1993 29.0000000 33.4570476 - 896 14 6 1993 40.0000000 35.3308210 - 897 15 6 1993 42.0000000 37.2573380 - 898 16 6 1993 37.0000000 34.7895055 - 899 17 6 1993 46.0000000 33.5189506 - 900 18 6 1993 47.0000000 32.1452583 - 901 19 6 1993 50.0000000 34.3144164 - 902 20 6 1993 43.0000000 61.3897819 - 903 21 6 1993 69.0000000 53.2512069 - 904 22 6 1993 61.0000000 60.9746215 - 905 23 6 1993 67.0000000 79.6726704 - 906 24 6 1993 77.0000000 60.6119672 - 907 25 6 1993 87.0000000 55.8588697 - 908 26 6 1993 55.0000000 52.0276894 - 909 27 6 1993 43.0000000 48.8104884 - 910 28 6 1993 40.0000000 46.0682057 - 911 29 6 1993 30.0000000 43.7027541 - 912 30 6 1993 40.0000000 41.6424142 - 913 1 7 1993 40.0000000 42.1257733 - 914 2 7 1993 27.0000000 41.4029236 - 915 3 7 1993 34.0000000 38.1041856 - 916 4 7 1993 30.0000000 36.6131293 - 917 5 7 1993 31.0000000 35.3954975 - 918 6 7 1993 27.0000000 34.1348346 - 919 7 7 1993 31.0000000 33.0885152 - 920 8 7 1993 26.0000000 32.1464930 - 921 9 7 1993 23.0000000 32.0565860 - 922 10 7 1993 24.0000000 32.7302024 - 923 11 7 1993 25.0000000 36.8595187 - 924 12 7 1993 34.0000000 45.9127081 - 925 13 7 1993 40.0000000 44.5249205 - 926 14 7 1993 41.0000000 64.5528591 - 927 15 7 1993 46.0000000 52.3402783 - 928 16 7 1993 39.0000000 38.8454216 - 929 17 7 1993 43.0000000 37.5668322 - 930 18 7 1993 35.0000000 36.7936257 - 931 19 7 1993 49.0000000 55.5125783 - 932 20 7 1993 38.0000000 55.4969366 - 933 21 7 1993 41.0000000 51.4352692 - 934 22 7 1993 45.0000000 48.0874697 - 935 23 7 1993 41.0000000 41.0688129 - 936 24 7 1993 42.0000000 39.0404485 - 937 25 7 1993 40.0000000 37.2907156 - 938 26 7 1993 35.0000000 35.7315247 - 939 27 7 1993 40.0000000 59.8351581 - 940 28 7 1993 40.0000000 50.3979145 - 941 29 7 1993 36.0000000 38.0899952 - 942 30 7 1993 40.0000000 95.5318350 - 943 31 7 1993 61.0000000 84.6573337 - 944 1 8 1993 36.0000000 55.7974860 - 945 2 8 1993 46.0000000 50.5593434 - 946 3 8 1993 32.0000000 46.3973638 - 947 4 8 1993 38.0000000 43.0194378 - 948 5 8 1993 32.0000000 40.2329047 - 949 6 8 1993 25.0000000 37.9059540 - 950 7 8 1993 26.0000000 35.9216919 - 951 8 8 1993 29.0000000 34.2198200 - 952 9 8 1993 29.0000000 41.2591809 - 953 10 8 1993 28.0000000 43.8297916 - 954 11 8 1993 37.0000000 36.5637138 - 955 12 8 1993 40.0000000 32.7367537 - 956 13 8 1993 49.0000000 31.4269911 - 957 14 8 1993 32.0000000 32.0186255 - 958 15 8 1993 37.0000000 30.6701933 - 959 16 8 1993 37.0000000 28.9342702 - 960 17 8 1993 27.0000000 28.0367479 - 961 18 8 1993 24.0000000 27.2329043 - 962 19 8 1993 24.0000000 26.5087269 - 963 20 8 1993 22.0000000 25.8527686 - 964 21 8 1993 21.0000000 25.2555579 - 965 22 8 1993 16.0000000 26.3619101 - 966 23 8 1993 21.0000000 29.2622906 - 967 24 8 1993 27.0000000 26.2255218 - 968 25 8 1993 26.0000000 24.0195845 - 969 26 8 1993 23.0000000 23.5514397 - 970 27 8 1993 21.0000000 26.4991913 - 971 28 8 1993 28.0000000 27.9244051 - 972 29 8 1993 17.0000000 23.3669242 - 973 30 8 1993 24.0000000 22.9212920 - 974 31 8 1993 25.0000000 22.5070712 - 975 1 9 1993 25.0000000 22.1203150 - 976 2 9 1993 19.0000000 21.7580560 - 977 3 9 1993 17.0000000 24.6924676 - 978 4 9 1993 16.0000000 29.2563712 - 979 5 9 1993 19.0000000 22.5581223 - 980 6 9 1993 23.0000000 21.7069469 - 981 7 9 1993 25.0000000 44.3539211 - 982 8 9 1993 34.0000000 37.0296327 - 983 9 9 1993 31.0000000 50.7694191 - 984 10 9 1993 35.0000000 78.8162922 - 985 11 9 1993 53.0000000 111.7513658 - 986 12 9 1993 71.0000000 123.6440558 - 987 13 9 1993 74.0000000 177.2446512 - 988 14 9 1993 87.0000000 226.8948029 - 989 15 9 1993 173.0000000 219.1032537 - 990 16 9 1993 117.0000000 176.8162859 - 991 17 9 1993 93.0000000 138.2523771 - 992 18 9 1993 77.0000000 114.6159621 - 993 19 9 1993 62.0000000 97.5460960 - 994 20 9 1993 54.0000000 84.7175485 - 995 21 9 1993 48.0000000 78.1783738 - 996 22 9 1993 46.0000000 102.7283609 - 997 23 9 1993 55.0000000 120.1187240 - 998 24 9 1993 66.0000000 129.5955623 - 999 25 9 1993 64.0000000 132.6819580 - 1000 26 9 1993 52.0000000 115.3413508 - 1001 27 9 1993 68.0000000 98.2451356 - 1002 28 9 1993 69.0000000 99.4378110 - 1003 29 9 1993 62.0000000 98.2186023 - 1004 30 9 1993 76.0000000 88.4704029 - 1005 1 10 1993 72.0000000 123.5486329 - 1006 2 10 1993 68.0000000 138.6727607 - 1007 3 10 1993 72.0000000 129.1354134 - 1008 4 10 1993 78.0000000 134.1559555 - 1009 5 10 1993 116.0000000 237.4141575 - 1010 6 10 1993 131.0000000 307.7834112 - 1011 7 10 1993 180.0000000 258.2778623 - 1012 8 10 1993 203.0000000 232.8384586 - 1013 9 10 1993 164.0000000 227.4795287 - 1014 10 10 1993 178.0000000 245.4683478 - 1015 11 10 1993 161.0000000 325.6241415 - 1016 12 10 1993 287.0000000 326.4175830 - 1017 13 10 1993 360.0000000 446.5661957 - 1018 14 10 1993 374.0000000 457.5603573 - 1019 15 10 1993 297.0000000 372.6257744 - 1020 16 10 1993 247.0000000 362.5583610 - 1021 17 10 1993 273.0000000 366.8609388 - 1022 18 10 1993 261.0000000 299.4939207 - 1023 19 10 1993 265.0000000 245.2662496 - 1024 20 10 1993 230.0000000 197.3516410 - 1025 21 10 1993 199.0000000 172.2799250 - 1026 22 10 1993 173.0000000 173.8749794 - 1027 23 10 1993 182.0000000 210.3267886 - 1028 24 10 1993 203.0000000 230.4576402 - 1029 25 10 1993 213.0000000 192.4075067 - 1030 26 10 1993 180.0000000 161.3456095 - 1031 27 10 1993 154.0000000 138.7617217 - 1032 28 10 1993 118.0000000 121.7430018 - 1033 29 10 1993 112.0000000 108.4966423 - 1034 30 10 1993 98.0000000 97.9255735 - 1035 31 10 1993 97.0000000 89.3199298 - 1036 1 11 1993 91.0000000 82.2000926 - 1037 2 11 1993 85.0000000 76.2301976 - 1038 3 11 1993 75.0000000 71.1678662 - 1039 4 11 1993 76.0000000 66.8336571 - 1040 5 11 1993 78.0000000 63.0917800 - 1041 6 11 1993 72.0000000 59.9420956 - 1042 7 11 1993 76.0000000 60.7121585 - 1043 8 11 1993 69.0000000 59.1174624 - 1044 9 11 1993 66.0000000 57.1558000 - 1045 10 11 1993 71.0000000 58.1758168 - 1046 11 11 1993 64.0000000 73.4371160 - 1047 12 11 1993 67.0000000 87.3294462 - 1048 13 11 1993 80.0000000 87.9665919 - 1049 14 11 1993 78.0000000 132.4069824 - 1050 15 11 1993 80.0000000 167.9395447 - 1051 16 11 1993 86.0000000 153.3005270 - 1052 17 11 1993 125.0000000 128.5310958 - 1053 18 11 1993 96.0000000 111.6426028 - 1054 19 11 1993 82.0000000 98.8514993 - 1055 20 11 1993 77.0000000 88.8812030 - 1056 21 11 1993 67.0000000 80.9231741 - 1057 22 11 1993 71.0000000 74.4479543 - 1058 23 11 1993 61.0000000 69.0946121 - 1059 24 11 1993 42.0000000 64.6091426 - 1060 25 11 1993 63.0000000 61.6345363 - 1061 26 11 1993 57.0000000 61.2621722 - 1062 27 11 1993 58.0000000 57.5842186 - 1063 28 11 1993 49.0000000 54.8641170 - 1064 29 11 1993 50.0000000 52.4754161 - 1065 30 11 1993 55.0000000 50.3652849 - 1066 1 12 1993 54.0000000 48.4910922 - 1067 2 12 1993 54.0000000 58.4681056 - 1068 3 12 1993 50.0000000 58.7624760 - 1069 4 12 1993 51.0000000 59.2555164 - 1070 5 12 1993 62.0000000 56.3420551 - 1071 6 12 1993 62.0000000 52.9154158 - 1072 7 12 1993 71.0000000 98.6299512 - 1073 8 12 1993 79.0000000 229.7416538 - 1074 9 12 1993 153.0000000 320.3762561 - 1075 10 12 1993 291.0000000 394.1898283 - 1076 11 12 1993 332.0000000 552.3360800 - 1077 12 12 1993 465.0000000 619.1880679 - 1078 13 12 1993 518.0000000 718.3191548 - 1079 14 12 1993 539.0000000 679.0164934 - 1080 15 12 1993 559.0000000 608.8091322 - 1081 16 12 1993 500.0000000 729.3799151 - 1082 17 12 1993 526.0000000 765.8037204 - 1083 18 12 1993 583.0000000 744.4528316 - 1084 19 12 1993 677.0000000 848.1124545 - 1085 20 12 1993 781.0000000 1596.6655834 - 1086 21 12 1993 1180.0000000 1766.1740815 - 1087 22 12 1993 1460.0000000 1445.3421920 - 1088 23 12 1993 1600.0000000 1484.8782991 - 1089 24 12 1993 1410.0000000 1358.2336086 - 1090 25 12 1993 1230.0000000 971.3721542 - 1091 26 12 1993 1070.0000000 650.2607534 - 1092 27 12 1993 746.0000000 473.8263411 - 1093 28 12 1993 542.0000000 385.5758390 - 1094 29 12 1993 492.0000000 430.2403000 - 1095 30 12 1993 491.0000000 608.8539128 - 1096 31 12 1993 617.0000000 988.2384789 diff --git a/check/case_06/output_save/dds_results.out b/check/case_06/output_save/dds_results.out new file mode 100755 index 00000000..333d3ec7 --- /dev/null +++ b/check/case_06/output_save/dds_results.out @@ -0,0 +1,13 @@ + # settings :: general + # nIterations iseed + 6 1235876 + # settings :: dds specific + # dds_r + 0.200000000000000 + # iter bestf (bestx(j),j=1,nopt) + 0 0.754935004394530 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 + 1 0.750758112091287 0.214719529555557 1.11413798514203 2.12340562437516 0.358416663643768 0.744023834479764 0.507975551581560 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 5.105612361697495E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.332214503414208 -0.576887394145837 1.280101298883113E-002 5.921166514583914E-003 60.9600000000000 0.980046790195744 0.948770283181742 1.336629017628920E-002 2.97556062380225 0.215051846020602 0.734177454186420 8.200311554110558E-002 179.481755281144 82.0668625189982 7.17138712257498 1.47077602287754 13.2322386907586 5.410719517345067E-002 28.6409748802123 -1.15430788971026 1.00000000000000 0.319396587542909 7.741981069396249E-002 1.95253915811178 0.106221262473146 0.413647503025914 143.591305323495 114.403244046098 190.472563315692 184.166048487840 100.000000000000 100.000000000000 97.0303313768825 100.000000000000 66.9985228998802 241.716548262639 + 2 0.749510537838651 0.234992182414766 0.747426782998840 2.31264421966686 0.227421394936339 1.13271411929245 0.660612605032073 3.07504025961314 3.19534639391650 5.65569750791907 13.9913675012930 1.111632546872070E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.250290485999284 0.809060290214743 -2.299235003946245E-003 -0.344114444880436 -0.854234515958249 1.663437930459590E-002 7.969449304702616E-003 60.9600000000000 0.970835129054173 0.948770283181742 3.772162350651561E-003 2.97556062380225 0.215051846020602 0.725233831453393 0.139708932048905 176.144939444976 82.0668625189982 7.17138712257498 1.00903084191760 3.55142768924494 9.829175455753478E-002 30.2164339955834 -2.82982899543617 1.00000000000000 0.319396587542909 7.482659762717976E-002 1.97641793956466 0.101017334118738 0.413647503025914 162.017588391143 163.612545737502 247.286821336375 184.166048487840 100.000000000000 100.000000000000 97.0303313768825 100.000000000000 103.132346023328 324.354660816753 + 3 0.744378602157205 0.234992182414766 1.25390364043856 2.95795155077323 0.483090415398036 1.13271411929245 0.660612605032073 3.07504025961314 4.03154016804875 5.65569750791907 13.9913675012930 1.111632546872070E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.254022390988897 0.809060290214743 -2.299235003946245E-003 -0.344114444880436 -0.854234515958249 1.663437930459590E-002 7.969449304702616E-003 60.9600000000000 0.970835129054173 0.934171221935173 2.528341007287577E-002 3.86248901890797 0.215051846020602 0.725233831453393 0.139708932048905 176.144939444976 75.1482244672275 9.18544713197807 1.00903084191760 3.55142768924494 0.102087257606353 30.2164339955834 -2.82982899543617 1.00000000000000 0.324503659884677 7.333900603500247E-002 1.97641793956466 0.101017334118738 0.413647503025914 162.017588391143 163.612545737502 247.286821336375 184.166048487840 100.000000000000 100.000000000000 97.0303313768825 100.000000000000 94.6959553670044 324.354660816753 + 4 0.744378602157205 0.234992182414766 1.25390364043856 2.95795155077323 0.483090415398036 1.13271411929245 0.660612605032073 3.07504025961314 4.03154016804875 5.65569750791907 13.9913675012930 1.111632546872070E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.254022390988897 0.809060290214743 -2.299235003946245E-003 -0.344114444880436 -0.854234515958249 1.663437930459590E-002 7.969449304702616E-003 60.9600000000000 0.970835129054173 0.934171221935173 2.528341007287577E-002 3.86248901890797 0.215051846020602 0.725233831453393 0.139708932048905 176.144939444976 75.1482244672275 9.18544713197807 1.00903084191760 3.55142768924494 0.102087257606353 30.2164339955834 -2.82982899543617 1.00000000000000 0.324503659884677 7.333900603500247E-002 1.97641793956466 0.101017334118738 0.413647503025914 162.017588391143 163.612545737502 247.286821336375 184.166048487840 100.000000000000 100.000000000000 97.0303313768825 100.000000000000 94.6959553670044 324.354660816753 + 5 0.744378602157205 0.234992182414766 1.25390364043856 2.95795155077323 0.483090415398036 1.13271411929245 0.660612605032073 3.07504025961314 4.03154016804875 5.65569750791907 13.9913675012930 1.111632546872070E-002 0.896613581800218 0.707150874596424 1.058490426074058E-003 -0.254022390988897 0.809060290214743 -2.299235003946245E-003 -0.344114444880436 -0.854234515958249 1.663437930459590E-002 7.969449304702616E-003 60.9600000000000 0.970835129054173 0.934171221935173 2.528341007287577E-002 3.86248901890797 0.215051846020602 0.725233831453393 0.139708932048905 176.144939444976 75.1482244672275 9.18544713197807 1.00903084191760 3.55142768924494 0.102087257606353 30.2164339955834 -2.82982899543617 1.00000000000000 0.324503659884677 7.333900603500247E-002 1.97641793956466 0.101017334118738 0.413647503025914 162.017588391143 163.612545737502 247.286821336375 184.166048487840 100.000000000000 100.000000000000 97.0303313768825 100.000000000000 94.6959553670044 324.354660816753 diff --git a/check/case_06/simulation_mhm_case06.ini b/check/case_06/simulation_mhm_case06.ini new file mode 100644 index 00000000..e6b39149 --- /dev/null +++ b/check/case_06/simulation_mhm_case06.ini @@ -0,0 +1,23 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_06 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig_mhm_mrm__optimize = True +nml__mainconfig_mhm_mrm__opti_method = 1 +nml__mainconfig_mhm_mrm__opti_function = 28 +nml__optimization__niterations = 6 +nml__directories_mhm__time_step_model_inputs = [0] +nml__optional_data__dir_soil_moisture = [../../test_basin/input/optional_data/] +nml__optional_data__nsoilhorizons_sm_input = 1 +nml__optional_data__timestep_sm_input = -2 diff --git a/check/case_07/mhm.nml b/check/case_07/mhm.nml index 86f96da9..b5ea7931 100644 --- a/check/case_07/mhm.nml +++ b/check/case_07/mhm.nml @@ -1,585 +1,145 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ -! -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -&directories_general -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/b1_" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_mHM -! -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "../../test_basin/input/optional_data/" -dir_soil_moisture(2) = "../../test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 -! -!> basin average total water storage (tws) \n -!> file name including path with timeseries of GRACE-based data -file_tws(1) = "../../test_basin/input/optional_data/tws_basin_1.txt" -file_tws(2) = "../../test_basin/input/optional_data/tws_basin_2.txt" +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 2 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .true. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) SO: Q: 1.0 - NSE \n -!> (2) SO: Q: 1.0 - lnNSE \n -!> (3) SO: Q: 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) SO: Q: ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SO: Q: SSE \n -!> (7) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) SO: Q: -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) SO: Q: 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (10) SO: SM: 1.0 - KGE of catchment average soilmoisture \n -!> (11) SO: SM: 1.0 - Pattern dissimilarity (PD) of spatially distributed soil moisture \n -!> (12) SO: SM: Sum of squared errors (SSE) of spatially distributed standard score (normalization) of soil moisture \n -!> (13) SO: SM: 1.0 - average temporal correlation of spatially distributed soil moisture \n -!> (14) SO: Q: sum[((1.0-KGE_i)/ nGauges)**6]**(1/6) > combination of KGE of every gauging station based on a power-6 norm \n -!> (15) SO: Q + basin_avg_TWS: [1.0-KGE(Q)]*RMSE(basin_avg_TWS) - objective function using Q and basin average (standard score) TWS\n -!> (16) (reserved) please use the next number when implementing a new one -!> further functions can be implemented in mo_objective_function -opti_function = 15 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 0 -warming_Days(2) = 0 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1989 -eval_Per(2)%yStart = 1989 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' - -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' -/ -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. +/ + +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 15 + opti_method = 1 + optimize = .true. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 +/ + +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' +/ + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. +/ + +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 6 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optional_data + file_tws(1) = '../../test_basin/input/optional_data/tws_basin_1.txt' / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 6 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 31 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 12 + eval_per(1)%mstart = 1 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 0 / diff --git a/check/case_07/output_save/ConfigFile.log b/check/case_07/output_save/ConfigFile.log index 9eb46c3f..4dd4a0aa 100644 --- a/check/case_07/output_save/ConfigFile.log +++ b/check/case_07/output_save/ConfigFile.log @@ -1,22 +1,23 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N -Number of basins 2 -Total No. of nodes 68 -Total No. of reaches 67 -No. of cells L0 46545 -No. of cells L1 68 -No. of cells L11 68 -Total No. of gauges 2 +Number of basins 1 +Total No. of gauges 1 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 1 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. -Basin 2 Hydrology Resolution [m] 24000. -Basin 2 Routing Resolution [m] 24000. Flag READ restart F Flag WRITE restart T @@ -25,42 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 1 1 1989 31 12 1988 -Evaluation Period (2) 1 1 1989 31 12 1993 -Simulation Period (1)+(2) 1 1 1989 31 12 1993 - - -------------------------------------------------------------- - Model Run Periods for Basin 2 -------------------------------------------------------------- - From To - Day Month Year Day Month Year -Warming Period (1) 1 1 1989 31 12 1988 -Evaluation Period (2) 1 1 1989 31 12 1993 -Simulation Period (1)+(2) 1 1 1989 31 12 1993 - - --------------------------------------------------- - Land Cover Observations for Basin 3 --------------------------------------------------- - Year Land cover scene Land Cover File - - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc +Warming Period (1) 1 1 1990 31 12 1989Evaluation Period (2) 1 1 1990 31 12 1991Simulation Period (1)+(2) 1 1 1990 31 12 1991 -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 2 lc_1990.asc - 1992 2 lc_1990.asc - 1993 2 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -124,8 +98,7 @@ Simulation Period (1)+(2) 1 1 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 - 2 2 1600.000 11.000 + 1 1 1540.000 11.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -194,40 +167,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -271,145 +244,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - --------------------------------------------------------------------------------- - Directory list --------------------------------------------------------------------------------- -Directory to morphological input ../../test_basin/input/morph/ -Directory to land cover input ../../test_basin/input/luse/ -Directory to gauging station input ../../test_basin/input/gauge/ -Directory to precipitation input ../../test_basin/input/meteo/pre/ -Directory to temperature input ../../test_basin/input/meteo/tavg/ -Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/b2_ -Directory to write output when restarted output_b1/b2_ - ------------------------------- -River Network (Routing level) ------------------------------- - Label 0 = intermediate draining cell - Label 1 = headwater cell - Label 2 = sink cell - ---------------------------------------------------------------------------- - Overall From To Routing Label Length Mean - Link Routing Routing Sequence Slope - Id Node Node [km] [o/oo] ---------------------------------------------------------------------------- - 35 1 5 1 1 7.536 0.100 - 40 7 3 2 1 28.349 0.100 - 43 10 9 3 1 9.243 1.190 - 44 11 8 4 1 40.042 0.999 - 48 15 14 5 1 27.728 0.938 - 53 20 19 6 1 28.435 1.653 - 54 21 16 7 1 21.728 4.786 - 58 25 24 8 1 32.127 4.171 - 63 30 26 9 1 28.642 3.840 - 66 33 29 10 1 27.142 13.116 - 67 34 32 11 1 31.763 2.613 - 36 3 4 12 0 29.642 0.100 - 41 8 4 13 0 1.414 0.100 - 47 14 13 14 0 38.213 0.576 - 49 16 17 15 0 9.985 0.100 - 52 19 18 16 0 33.799 1.036 - 59 26 22 17 0 61.734 0.794 - 62 29 28 18 0 6.243 3.204 - 65 32 31 19 0 16.399 1.342 - 37 4 5 20 0 38.420 0.833 - 46 13 12 21 0 42.127 0.166 - 51 18 17 22 0 42.542 0.282 - 61 28 24 23 0 32.835 1.980 - 64 31 27 24 0 32.728 2.781 - 57 24 23 25 0 34.420 1.133 - 60 27 23 26 0 29.799 1.141 - 56 23 22 27 0 0.707 0.100 - 55 22 17 28 0 38.456 0.364 - 50 17 12 29 0 35.885 1.728 - 45 12 9 30 0 30.263 0.100 - 42 9 5 31 0 24.399 0.100 - 38 5 6 32 0 5.036 0.100 - 39 6 2 33 2 14.692 0.100 - --------------------- - Overall Basin - Cell Routing - Id Node Id --------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 - ------------------------------- - Modeling Routing Effective - Cell Cell Id Area - Id [-] [km2] ------------------------------- - 35 1 126.750 - 36 2 229.750 - 37 3 107.750 - 38 4 312.500 - 39 5 573.750 - 40 6 314.250 - 41 7 42.500 - 42 8 524.750 - 43 9 576.000 - 44 10 146.500 - 45 11 470.000 - 46 12 576.000 - 47 13 414.500 - 48 14 340.750 - 49 15 9.000 - 50 16 230.250 - 51 17 576.000 - 52 18 576.000 - 53 19 527.250 - 54 20 48.250 - 55 21 10.500 - 56 22 545.000 - 57 23 576.000 - 58 24 576.000 - 59 25 318.500 - 60 26 456.250 - 61 27 551.250 - 62 28 576.000 - 63 29 337.000 - 64 30 3.250 - 65 31 198.000 - 66 32 555.250 - 67 33 89.000 - 68 34 121.750 ------------------------------- - Total[km2] 11636.250 - - + diff --git a/check/case_07/output_save/FinalParam.nml b/check/case_07/output_save/FinalParam.nml index c89356c1..fd441210 100644 --- a/check/case_07/output_save/FinalParam.nml +++ b/check/case_07/output_save/FinalParam.nml @@ -1,92 +1,146 @@ !global_parameters - !PARAMETER lower_bound upper_bound value FLAG SCALING + !PARAMETER lower_bound upper_bound value FLAG + SCALING ! interception &interception1 - canopyInterceptionFactor = 0.14999999999999999 , 0.40000000000000002 , 0.14999999999999999 , 1 , 1 + canopyInterceptionFactor = 0.150000000000000 , 0.400000000000000 + , 0.170272652859209 , 1 , 1 / ! snow &snow1 - snowTreshholdTemperature = -2.0000000000000000 , 2.0000000000000000 , 1.5064768574397209 , 1 , 1 - degreeDayFactor_forest = 1.0000000000000000E-004 , 4.0000000000000000 , 2.1453073311063742 , 1 , 1 - degreeDayFactor_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.75566902046169715 , 1 , 1 - degreeDayFactor_pervious = 0.0000000000000000 , 2.0000000000000000 , 0.50000000000000000 , 1 , 1 - increaseDegreeDayFactorByPrecip = 0.10000000000000001 , 0.90000000000000002 , 0.50000000000000000 , 1 , 1 - maxDegreeDayFactor_forest = 0.0000000000000000 , 8.0000000000000000 , 3.0000000000000000 , 1 , 1 - maxDegreeDayFactor_impervious = 0.0000000000000000 , 8.0000000000000000 , 4.3361937741322478 , 1 , 1 - maxDegreeDayFactor_pervious = 0.0000000000000000 , 8.0000000000000000 , 4.0000000000000000 , 1 , 1 + snowTreshholdTemperature = -2.00000000000000 , 2.00000000000000 + , 0.633288797856814 , 1 , 1 + degreeDayFactor_forest = 1.000000000000000E-004 , 4.00000000000000 + , 1.68923859529170 , 1 , 1 + degreeDayFactor_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 0.369004731292571 , 1 , 1 + degreeDayFactor_pervious = 0.000000000000000E+000 , 2.00000000000000 + , 0.888690284812682 , 1 , 1 + increaseDegreeDayFactorByPrecip = 0.100000000000000 , + 0.900000000000000 , 0.652637053450513 , 1 , 1 + maxDegreeDayFactor_forest = 0.000000000000000E+000 , + 8.00000000000000 , 3.00000000000000 , 1 , 1 + maxDegreeDayFactor_impervious = 0.000000000000000E+000 , + 8.00000000000000 , 3.50000000000000 , 1 , 1 + maxDegreeDayFactor_pervious = 0.000000000000000E+000 , + 8.00000000000000 , 5.07896129988637 , 1 , 1 / ! soilmoisture &soilmoisture1 - orgMatterContent_forest = 0.0000000000000000 , 20.000000000000000 , 3.3999999999999999 , 1 , 1 - orgMatterContent_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.10000000000000001 , 1 , 1 - orgMatterContent_pervious = 0.0000000000000000 , 4.0000000000000000 , 0.59999999999999998 , 1 , 1 - PTF_lower66_5_constant = 0.64620000000000000 , 0.95060000000000000 , 0.76000000000000001 , 1 , 1 - PTF_lower66_5_clay = 1.0000000000000000E-004 , 2.8999999999999998E-003 , 8.9999999999999998E-004 , 1 , 1 - PTF_lower66_5_Db = -0.37269999999999998 , -0.18709999999999999 , -0.26773190498961208 , 1 , 1 - PTF_higher66_5_constant = 0.53580000000000005 , 1.1232000000000000 , 0.89000000000000001 , 1 , 1 - PTF_higher66_5_clay = -5.4999999999999997E-003 , 4.8999999999999998E-003 , -1.0000000000000000E-003 , 1 , 1 - PTF_higher66_5_Db = -0.55130000000000001 , -9.1300000000000006E-002 , -0.32400000000000001 , 1 , 1 - PTF_Ks_constant = -1.2000000000000000 , -0.28499999999999998 , -0.58499999999999996 , 1 , 1 - PTF_Ks_sand = 6.0000000000000001E-003 , 2.5999999999999999E-002 , 1.2500000000000001E-002 , 1 , 1 - PTF_Ks_clay = 3.0000000000000001E-003 , 1.2999999999999999E-002 , 6.3000000000000000E-003 , 1 , 1 - PTF_Ks_curveSlope = 60.960000000000001 , 60.960000000000001 , 60.960000000000001 , 0 , 1 - rootFractionCoefficient_forest = 0.90000000000000002 , 0.99900000000000000 , 0.96999999999999997 , 1 , 1 - rootFractionCoefficient_impervious = 0.90000000000000002 , 0.94999999999999996 , 0.91540093875343109 , 1 , 1 - rootFractionCoefficient_pervious = 1.0000000000000000E-003 , 8.9999999999999997E-002 , 9.0555724235273326E-003 , 1 , 1 - infiltrationShapeFactor = 1.0000000000000000 , 4.0000000000000000 , 2.6369283951057225 , 1 , 1 + orgMatterContent_forest = 0.000000000000000E+000 , 20.0000000000000 + , 3.40000000000000 , 1 , 1 + orgMatterContent_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 3.782755091430436E-002 , 1 , 1 + orgMatterContent_pervious = 0.000000000000000E+000 , + 4.00000000000000 , 0.600000000000000 , 1 , 1 + PTF_lower66_5_constant = 0.646200000000000 , 0.950600000000000 + , 0.763494578333013 , 1 , 1 + PTF_lower66_5_clay = 1.000000000000000E-004 , 2.900000000000000E-003 , + 9.000000000000000E-004 , 1 , 1 + PTF_lower66_5_Db = -0.372700000000000 , -0.187100000000000 , + -0.264000000000000 , 1 , 1 + PTF_higher66_5_constant = 0.535800000000000 , 1.12320000000000 + , 0.890000000000000 , 1 , 1 + PTF_higher66_5_clay = -5.500000000000000E-003 , 4.900000000000000E-003 , + -1.000000000000000E-003 , 1 , 1 + PTF_higher66_5_Db = -0.551300000000000 , -9.130000000000001E-002 , + -0.437075052345831 , 1 , 1 + PTF_Ks_constant = -1.20000000000000 , -0.285000000000000 , + -0.862347121812413 , 1 , 1 + PTF_Ks_sand = 6.000000000000000E-003 , 2.600000000000000E-002 , + 1.633336631576477E-002 , 1 , 1 + PTF_Ks_clay = 3.000000000000000E-003 , 1.300000000000000E-002 , + 8.348282790118702E-003 , 1 , 1 + PTF_Ks_curveSlope = 60.9600000000000 , 60.9600000000000 , + 60.9600000000000 , 0 , 1 + rootFractionCoefficient_forest = 0.900000000000000 , + 0.999000000000000 , 0.960788338858429 , 1 , 1 + rootFractionCoefficient_impervious = 0.900000000000000 , + 0.950000000000000 , 0.930000000000000 , 1 , 1 + rootFractionCoefficient_pervious = 1.000000000000000E-003 , + 9.000000000000000E-002 , 4.861547473059242E-003 , 1 , 1 + infiltrationShapeFactor = 1.00000000000000 , 4.00000000000000 + , 1.75000000000000 , 1 , 1 / ! directSealedAreaRunoff &directRunoff1 - imperviousStorageCapacity = 0.0000000000000000 , 5.0000000000000000 , 0.50000000000000000 , 1 , 1 + imperviousStorageCapacity = 0.000000000000000E+000 , + 5.00000000000000 , 0.500000000000000 , 1 , 1 / ! potential evapotranspiration &PET0 - minCorrectionFactorPET = 0.69999999999999996 , 1.3000000000000000 , 0.90000000000000002 , 1 , 1 - maxCorrectionFactorPET = 0.0000000000000000 , 0.20000000000000001 , 0.10000000000000001 , 1 , 1 - aspectTresholdPET = 160.00000000000000 , 200.00000000000000 , 180.00000000000000 , 1 , 1 + minCorrectionFactorPET = 0.700000000000000 , 1.30000000000000 + , 0.891056377266973 , 1 , 1 + maxCorrectionFactorPET = 0.000000000000000E+000 , 0.200000000000000 + , 0.157705816507799 , 1 , 1 + aspectTresholdPET = 160.000000000000 , 200.000000000000 , + 176.663184163832 , 1 , 1 / ! interflow &interflow1 - interflowStorageCapacityFactor = 75.000000000000000 , 200.00000000000000 , 77.784913013774258 , 1 , 1 - interflowRecession_slope = 0.0000000000000000 , 10.000000000000000 , 9.3568342545530570 , 1 , 1 - fastInterflowRecession_forest = 1.0000000000000000 , 3.0000000000000000 , 1.5000000000000000 , 1 , 1 - slowInterflowRecession_Ks = 1.0000000000000000 , 30.000000000000000 , 15.000000000000000 , 1 , 1 - exponentSlowInterflow = 5.0000000000000003E-002 , 0.29999999999999999 , 0.12879550304881818 , 1 , 1 + interflowStorageCapacityFactor = 75.0000000000000 , + 200.000000000000 , 142.187809280139 , 1 , 1 + interflowRecession_slope = 0.000000000000000E+000 , 10.0000000000000 + , 7.00000000000000 , 1 , 1 + fastInterflowRecession_forest = 1.00000000000000 , + 3.00000000000000 , 1.03825481904006 , 1 , 1 + slowInterflowRecession_Ks = 1.00000000000000 , + 30.0000000000000 , 5.31918899848635 , 1 , 1 + exponentSlowInterflow = 5.000000000000000E-002 , 0.300000000000000 , + 0.160757447003667 , 1 , 1 / ! percolation &percolation1 - rechargeCoefficient = 0.0000000000000000 , 50.000000000000000 , 35.000000000000000 , 1 , 1 - rechargeFactor_karstic = -5.0000000000000000 , 5.0000000000000000 , -1.0000000000000000 , 1 , 1 - gain_loss_GWreservoir_karstic = 1.0000000000000000 , 1.0000000000000000 , 1.0000000000000000 , 0 , 1 + rechargeCoefficient = 0.000000000000000E+000 , 50.0000000000000 , + 36.5754591153712 , 1 , 1 + rechargeFactor_karstic = -5.00000000000000 , 5.00000000000000 + , -3.47577847622492 , 1 , 1 + gain_loss_GWreservoir_karstic = 1.00000000000000 , + 1.00000000000000 , 1.00000000000000 , 0 , 1 / ! routing &routing1 - muskingumTravelTime_constant = 0.31000000000000000 , 0.34999999999999998 , 0.33010707234176839 , 1 , 1 - muskingumTravelTime_riverLength = 7.0000000000000007E-002 , 8.0000000000000002E-002 , 7.3512408407822707E-002 , 1 , 1 - muskingumTravelTime_riverSlope = 1.9500000000000000 , 2.1000000000000001 , 2.0000000000000000 , 1 , 1 - muskingumTravelTime_impervious = 8.9999999999999997E-002 , 0.11000000000000000 , 0.10000000000000001 , 1 , 1 - muskingumAttenuation_riverSlope = 1.0000000000000000E-002 , 0.50000000000000000 , 0.29999999999999999 , 1 , 1 + muskingumTravelTime_constant = 0.310000000000000 , + 0.350000000000000 , 0.325000000000000 , 1 , 1 + muskingumTravelTime_riverLength = 7.000000000000001E-002 , + 8.000000000000000E-002 , 7.240678693321727E-002 , 1 , 1 + muskingumTravelTime_riverSlope = 1.95000000000000 , + 2.10000000000000 , 1.97104290232356 , 1 , 1 + muskingumTravelTime_impervious = 9.000000000000000E-002 , + 0.110000000000000 , 9.479607164559140E-002 , 1 , 1 + muskingumAttenuation_riverSlope = 1.000000000000000E-002 , + 0.500000000000000 , 0.300000000000000 , 1 , 1 / ! geology &geoparameter - GeoParam(1,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(2,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(3,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(4,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(5,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(6,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(7,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(8,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(9,:) = 1.0000000000000000 , 1000.0000000000000 , 97.828301390331916 , 1 , 1 - GeoParam(10,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 + GeoParam(1,:) = 1.00000000000000 , 1000.00000000000 , + 118.426283067649 , 1 , 1 + GeoParam(2,:) = 1.00000000000000 , 1000.00000000000 , + 149.209301691405 , 1 , 1 + GeoParam(3,:) = 1.00000000000000 , 1000.00000000000 , + 156.814258020683 , 1 , 1 + GeoParam(4,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(5,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(6,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(7,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(8,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(9,:) = 1.00000000000000 , 1000.00000000000 , + 70.1308689232077 , 1 , 1 + GeoParam(10,:) = 1.00000000000000 , 1000.00000000000 , + 182.638112554114 , 1 , 1 / ! neutrons diff --git a/check/case_07/output_save/FinalParam.out b/check/case_07/output_save/FinalParam.out index 87a3fadb..00c2aaac 100644 --- a/check/case_07/output_save/FinalParam.out +++ b/check/case_07/output_save/FinalParam.out @@ -1,2 +1,2 @@ OF canopyInterceptionFactor snowTreshholdTemperature degreeDayFactor_forest degreeDayFactor_impervious degreeDayFactor_pervious increaseDegreeDayFactorByPrecip maxDegreeDayFactor_forest maxDegreeDayFactor_impervious maxDegreeDayFactor_pervious orgMatterContent_forest orgMatterContent_impervious orgMatterContent_pervious PTF_lower66_5_constant PTF_lower66_5_clay PTF_lower66_5_Db PTF_higher66_5_constant PTF_higher66_5_clay PTF_higher66_5_Db PTF_Ks_constant PTF_Ks_sand PTF_Ks_clay PTF_Ks_curveSlope rootFractionCoefficient_forest rootFractionCoefficient_impervious rootFractionCoefficient_pervious infiltrationShapeFactor imperviousStorageCapacity minCorrectionFactorPET maxCorrectionFactorPET aspectTresholdPET interflowStorageCapacityFactor interflowRecession_slope fastInterflowRecession_forest slowInterflowRecession_Ks exponentSlowInterflow rechargeCoefficient rechargeFactor_karstic gain_loss_GWreservoir_karstic muskingumTravelTime_constant muskingumTravelTime_riverLength muskingumTravelTime_riverSlope muskingumTravelTime_impervious muskingumAttenuation_riverSlope GeoParam(1,:) GeoParam(2,:) GeoParam(3,:) GeoParam(4,:) GeoParam(5,:) GeoParam(6,:) GeoParam(7,:) GeoParam(8,:) GeoParam(9,:) GeoParam(10,:) - 2.12006475538370E-01 1.50000000000000E-01 1.50647685743972E+00 2.14530733110637E+00 7.55669020461697E-01 5.00000000000000E-01 5.00000000000000E-01 3.00000000000000E+00 4.33619377413225E+00 4.00000000000000E+00 3.40000000000000E+00 1.00000000000000E-01 6.00000000000000E-01 7.60000000000000E-01 9.00000000000000E-04 -2.67731904989612E-01 8.90000000000000E-01 -1.00000000000000E-03 -3.24000000000000E-01 -5.85000000000000E-01 1.25000000000000E-02 6.30000000000000E-03 6.09600000000000E+01 9.70000000000000E-01 9.15400938753431E-01 9.05557242352733E-03 2.63692839510572E+00 5.00000000000000E-01 9.00000000000000E-01 1.00000000000000E-01 1.80000000000000E+02 7.77849130137743E+01 9.35683425455306E+00 1.50000000000000E+00 1.50000000000000E+01 1.28795503048818E-01 3.50000000000000E+01 -1.00000000000000E+00 1.00000000000000E+00 3.30107072341768E-01 7.35124084078227E-02 2.00000000000000E+00 1.00000000000000E-01 3.00000000000000E-01 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 9.78283013903319E+01 1.00000000000000E+02 + 2.75991832840917E-01 1.70272652859209E-01 6.33288797856814E-01 1.68923859529170E+00 3.69004731292571E-01 8.88690284812682E-01 6.52637053450513E-01 3.00000000000000E+00 3.50000000000000E+00 5.07896129988637E+00 3.40000000000000E+00 3.78275509143044E-02 6.00000000000000E-01 7.63494578333013E-01 9.00000000000000E-04 -2.64000000000000E-01 8.90000000000000E-01 -1.00000000000000E-03 -4.37075052345831E-01 -8.62347121812413E-01 1.63333663157648E-02 8.34828279011870E-03 6.09600000000000E+01 9.60788338858429E-01 9.30000000000000E-01 4.86154747305924E-03 1.75000000000000E+00 5.00000000000000E-01 8.91056377266973E-01 1.57705816507799E-01 1.76663184163832E+02 1.42187809280139E+02 7.00000000000000E+00 1.03825481904006E+00 5.31918899848635E+00 1.60757447003667E-01 3.65754591153712E+01 -3.47577847622492E+00 1.00000000000000E+00 3.25000000000000E-01 7.24067869332173E-02 1.97104290232356E+00 9.47960716455914E-02 3.00000000000000E-01 1.18426283067649E+02 1.49209301691405E+02 1.56814258020683E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 7.01308689232077E+01 1.82638112554114E+02 diff --git a/check/case_07/output_save/b1_daily_discharge.out b/check/case_07/output_save/b1_daily_discharge.out index 01057d56..1f800371 100644 --- a/check/case_07/output_save/b1_daily_discharge.out +++ b/check/case_07/output_save/b1_daily_discharge.out @@ -1,1827 +1,731 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1989 -9999.0000000 117.6907048 - 2 2 1 1989 -9999.0000000 164.8478950 - 3 3 1 1989 -9999.0000000 144.6907760 - 4 4 1 1989 -9999.0000000 153.7980288 - 5 5 1 1989 -9999.0000000 183.1518739 - 6 6 1 1989 -9999.0000000 154.4881411 - 7 7 1 1989 -9999.0000000 135.3635452 - 8 8 1 1989 -9999.0000000 124.3188106 - 9 9 1 1989 -9999.0000000 121.5270491 - 10 10 1 1989 -9999.0000000 120.0172102 - 11 11 1 1989 -9999.0000000 113.9401076 - 12 12 1 1989 -9999.0000000 118.2588744 - 13 13 1 1989 -9999.0000000 113.3007477 - 14 14 1 1989 -9999.0000000 106.8326606 - 15 15 1 1989 -9999.0000000 104.0362245 - 16 16 1 1989 -9999.0000000 101.4008355 - 17 17 1 1989 -9999.0000000 99.9595747 - 18 18 1 1989 -9999.0000000 98.0716585 - 19 19 1 1989 -9999.0000000 96.0647105 - 20 20 1 1989 -9999.0000000 94.4669009 - 21 21 1 1989 -9999.0000000 109.4463614 - 22 22 1 1989 -9999.0000000 101.3821455 - 23 23 1 1989 -9999.0000000 90.7455499 - 24 24 1 1989 -9999.0000000 89.0329784 - 25 25 1 1989 -9999.0000000 87.8838767 - 26 26 1 1989 -9999.0000000 86.7146742 - 27 27 1 1989 -9999.0000000 85.3082992 - 28 28 1 1989 -9999.0000000 84.1564154 - 29 29 1 1989 -9999.0000000 83.0435976 - 30 30 1 1989 -9999.0000000 81.9667441 - 31 31 1 1989 -9999.0000000 80.9230725 - 32 1 2 1989 -9999.0000000 79.9100825 - 33 2 2 1989 -9999.0000000 78.9255245 - 34 3 2 1989 -9999.0000000 77.9673714 - 35 4 2 1989 -9999.0000000 77.0337944 - 36 5 2 1989 -9999.0000000 76.1788767 - 37 6 2 1989 -9999.0000000 75.6339328 - 38 7 2 1989 -9999.0000000 74.3812177 - 39 8 2 1989 -9999.0000000 73.5297870 - 40 9 2 1989 -9999.0000000 72.6961894 - 41 10 2 1989 -9999.0000000 71.8794017 - 42 11 2 1989 -9999.0000000 71.0784920 - 43 12 2 1989 -9999.0000000 70.4131408 - 44 13 2 1989 -9999.0000000 83.1804761 - 45 14 2 1989 -9999.0000000 75.7926130 - 46 15 2 1989 -9999.0000000 79.5101587 - 47 16 2 1989 -9999.0000000 73.9145004 - 48 17 2 1989 -9999.0000000 68.4236227 - 49 18 2 1989 -9999.0000000 81.0140530 - 50 19 2 1989 -9999.0000000 73.5818503 - 51 20 2 1989 -9999.0000000 81.6715957 - 52 21 2 1989 -9999.0000000 98.8872536 - 53 22 2 1989 -9999.0000000 81.1284591 - 54 23 2 1989 -9999.0000000 80.0081796 - 55 24 2 1989 -9999.0000000 80.0182544 - 56 25 2 1989 -9999.0000000 97.2766069 - 57 26 2 1989 -9999.0000000 89.0501080 - 58 27 2 1989 -9999.0000000 93.8543071 - 59 28 2 1989 -9999.0000000 89.2944926 - 60 1 3 1989 -9999.0000000 81.7406918 - 61 2 3 1989 -9999.0000000 106.3463214 - 62 3 3 1989 -9999.0000000 103.5407631 - 63 4 3 1989 -9999.0000000 82.5900481 - 64 5 3 1989 -9999.0000000 68.9880025 - 65 6 3 1989 -9999.0000000 67.4699633 - 66 7 3 1989 -9999.0000000 70.7348164 - 67 8 3 1989 -9999.0000000 89.2288425 - 68 9 3 1989 -9999.0000000 73.8435798 - 69 10 3 1989 -9999.0000000 66.3025045 - 70 11 3 1989 -9999.0000000 64.8730514 - 71 12 3 1989 -9999.0000000 63.6741811 - 72 13 3 1989 -9999.0000000 62.5448110 - 73 14 3 1989 -9999.0000000 63.8141720 - 74 15 3 1989 -9999.0000000 94.0637561 - 75 16 3 1989 -9999.0000000 113.3340304 - 76 17 3 1989 -9999.0000000 83.7593127 - 77 18 3 1989 -9999.0000000 69.3537920 - 78 19 3 1989 -9999.0000000 67.6177356 - 79 20 3 1989 -9999.0000000 66.0730042 - 80 21 3 1989 -9999.0000000 65.0786775 - 81 22 3 1989 -9999.0000000 74.2065553 - 82 23 3 1989 -9999.0000000 72.7680932 - 83 24 3 1989 -9999.0000000 66.1592409 - 84 25 3 1989 -9999.0000000 64.5849572 - 85 26 3 1989 -9999.0000000 62.4224717 - 86 27 3 1989 -9999.0000000 61.1570445 - 87 28 3 1989 -9999.0000000 59.9622263 - 88 29 3 1989 -9999.0000000 58.8326584 - 89 30 3 1989 -9999.0000000 57.7625206 - 90 31 3 1989 -9999.0000000 56.7492340 - 91 1 4 1989 -9999.0000000 97.1569442 - 92 2 4 1989 -9999.0000000 125.1262749 - 93 3 4 1989 -9999.0000000 89.5621420 - 94 4 4 1989 -9999.0000000 76.8059740 - 95 5 4 1989 -9999.0000000 96.5997161 - 96 6 4 1989 -9999.0000000 86.3254022 - 97 7 4 1989 -9999.0000000 91.4866643 - 98 8 4 1989 -9999.0000000 92.9513827 - 99 9 4 1989 -9999.0000000 81.4164820 - 100 10 4 1989 -9999.0000000 76.3623828 - 101 11 4 1989 -9999.0000000 92.7048079 - 102 12 4 1989 -9999.0000000 131.6677475 - 103 13 4 1989 -9999.0000000 149.0830792 - 104 14 4 1989 -9999.0000000 121.6741104 - 105 15 4 1989 -9999.0000000 109.4594138 - 106 16 4 1989 -9999.0000000 102.3262708 - 107 17 4 1989 -9999.0000000 116.4792145 - 108 18 4 1989 -9999.0000000 121.3421614 - 109 19 4 1989 -9999.0000000 106.4239427 - 110 20 4 1989 -9999.0000000 98.7291955 - 111 21 4 1989 -9999.0000000 116.2673923 - 112 22 4 1989 -9999.0000000 135.1366000 - 113 23 4 1989 -9999.0000000 116.7280766 - 114 24 4 1989 -9999.0000000 101.8297246 - 115 25 4 1989 -9999.0000000 116.7977530 - 116 26 4 1989 -9999.0000000 166.6395646 - 117 27 4 1989 -9999.0000000 150.4858227 - 118 28 4 1989 -9999.0000000 126.4423520 - 119 29 4 1989 -9999.0000000 116.1953372 - 120 30 4 1989 -9999.0000000 107.7342760 - 121 1 5 1989 -9999.0000000 101.6432776 - 122 2 5 1989 -9999.0000000 97.0899622 - 123 3 5 1989 -9999.0000000 93.0071605 - 124 4 5 1989 -9999.0000000 89.3019457 - 125 5 5 1989 -9999.0000000 85.9302584 - 126 6 5 1989 -9999.0000000 82.8538436 - 127 7 5 1989 -9999.0000000 80.0393958 - 128 8 5 1989 -9999.0000000 77.4578461 - 129 9 5 1989 -9999.0000000 85.9572087 - 130 10 5 1989 -9999.0000000 94.7334437 - 131 11 5 1989 -9999.0000000 115.1395221 - 132 12 5 1989 -9999.0000000 100.8910146 - 133 13 5 1989 -9999.0000000 89.1583551 - 134 14 5 1989 -9999.0000000 81.7521014 - 135 15 5 1989 -9999.0000000 79.0192532 - 136 16 5 1989 -9999.0000000 76.5245844 - 137 17 5 1989 -9999.0000000 74.2262691 - 138 18 5 1989 -9999.0000000 72.1035334 - 139 19 5 1989 -9999.0000000 70.1381014 - 140 20 5 1989 -9999.0000000 68.3138463 - 141 21 5 1989 -9999.0000000 66.6165106 - 142 22 5 1989 -9999.0000000 65.0334651 - 143 23 5 1989 -9999.0000000 63.5535039 - 144 24 5 1989 -9999.0000000 62.1666668 - 145 25 5 1989 -9999.0000000 60.8640867 - 146 26 5 1989 -9999.0000000 59.6378575 - 147 27 5 1989 -9999.0000000 58.5070931 - 148 28 5 1989 -9999.0000000 58.5867610 - 149 29 5 1989 -9999.0000000 56.5519617 - 150 30 5 1989 -9999.0000000 62.0789633 - 151 31 5 1989 -9999.0000000 59.5083223 - 152 1 6 1989 -9999.0000000 54.2479828 - 153 2 6 1989 -9999.0000000 54.3874964 - 154 3 6 1989 -9999.0000000 58.4884001 - 155 4 6 1989 -9999.0000000 53.3667435 - 156 5 6 1989 -9999.0000000 51.2966901 - 157 6 6 1989 -9999.0000000 50.9308459 - 158 7 6 1989 -9999.0000000 62.0451780 - 159 8 6 1989 -9999.0000000 53.7571962 - 160 9 6 1989 -9999.0000000 49.0875882 - 161 10 6 1989 -9999.0000000 53.0837438 - 162 11 6 1989 -9999.0000000 49.6931846 - 163 12 6 1989 -9999.0000000 47.2900076 - 164 13 6 1989 -9999.0000000 46.6153041 - 165 14 6 1989 -9999.0000000 45.9651103 - 166 15 6 1989 -9999.0000000 45.3375228 - 167 16 6 1989 -9999.0000000 44.7308232 - 168 17 6 1989 -9999.0000000 44.1434578 - 169 18 6 1989 -9999.0000000 43.5740203 - 170 19 6 1989 -9999.0000000 43.0212368 - 171 20 6 1989 -9999.0000000 42.4839515 - 172 21 6 1989 -9999.0000000 42.0473860 - 173 22 6 1989 -9999.0000000 65.2866285 - 174 23 6 1989 -9999.0000000 57.7955248 - 175 24 6 1989 -9999.0000000 41.5965523 - 176 25 6 1989 -9999.0000000 41.0373011 - 177 26 6 1989 -9999.0000000 40.5180240 - 178 27 6 1989 -9999.0000000 41.1984705 - 179 28 6 1989 -9999.0000000 40.0789440 - 180 29 6 1989 -9999.0000000 41.7937904 - 181 30 6 1989 -9999.0000000 42.9528023 - 182 1 7 1989 -9999.0000000 43.2153045 - 183 2 7 1989 -9999.0000000 41.1652804 - 184 3 7 1989 -9999.0000000 37.8636909 - 185 4 7 1989 -9999.0000000 47.4976914 - 186 5 7 1989 -9999.0000000 39.5385834 - 187 6 7 1989 -9999.0000000 36.7376504 - 188 7 7 1989 -9999.0000000 36.2983906 - 189 8 7 1989 -9999.0000000 77.4338347 - 190 9 7 1989 -9999.0000000 56.6817587 - 191 10 7 1989 -9999.0000000 47.9272877 - 192 11 7 1989 -9999.0000000 49.4684302 - 193 12 7 1989 -9999.0000000 37.9525650 - 194 13 7 1989 -9999.0000000 37.2046948 - 195 14 7 1989 -9999.0000000 36.6392258 - 196 15 7 1989 -9999.0000000 36.0962512 - 197 16 7 1989 -9999.0000000 35.5739472 - 198 17 7 1989 -9999.0000000 35.0707296 - 199 18 7 1989 -9999.0000000 34.5851619 - 200 19 7 1989 -9999.0000000 34.1159398 - 201 20 7 1989 -9999.0000000 33.6618784 - 202 21 7 1989 -9999.0000000 33.2220650 - 203 22 7 1989 -9999.0000000 37.0277677 - 204 23 7 1989 -9999.0000000 34.5205228 - 205 24 7 1989 -9999.0000000 34.9582845 - 206 25 7 1989 -9999.0000000 33.7915626 - 207 26 7 1989 -9999.0000000 31.4539678 - 208 27 7 1989 -9999.0000000 31.0645048 - 209 28 7 1989 -9999.0000000 30.6861273 - 210 29 7 1989 -9999.0000000 30.3171627 - 211 30 7 1989 -9999.0000000 31.5952189 - 212 31 7 1989 -9999.0000000 35.4662728 - 213 1 8 1989 -9999.0000000 32.2797243 - 214 2 8 1989 -9999.0000000 30.2111637 - 215 3 8 1989 -9999.0000000 28.9919923 - 216 4 8 1989 -9999.0000000 28.6493648 - 217 5 8 1989 -9999.0000000 28.8322460 - 218 6 8 1989 -9999.0000000 43.4838852 - 219 7 8 1989 -9999.0000000 55.2887894 - 220 8 8 1989 -9999.0000000 39.2961273 - 221 9 8 1989 -9999.0000000 29.4651839 - 222 10 8 1989 -9999.0000000 27.7555378 - 223 11 8 1989 -9999.0000000 27.4052023 - 224 12 8 1989 -9999.0000000 27.0628712 - 225 13 8 1989 -9999.0000000 26.7293810 - 226 14 8 1989 -9999.0000000 26.4044460 - 227 15 8 1989 -9999.0000000 26.0876144 - 228 16 8 1989 -9999.0000000 42.8134475 - 229 17 8 1989 -9999.0000000 33.2461575 - 230 18 8 1989 -9999.0000000 25.6544760 - 231 19 8 1989 -9999.0000000 25.3385762 - 232 20 8 1989 -9999.0000000 25.0312001 - 233 21 8 1989 -9999.0000000 24.7313490 - 234 22 8 1989 -9999.0000000 25.0316107 - 235 23 8 1989 -9999.0000000 25.4653571 - 236 24 8 1989 -9999.0000000 23.9459169 - 237 25 8 1989 -9999.0000000 28.9784379 - 238 26 8 1989 -9999.0000000 46.9049863 - 239 27 8 1989 -9999.0000000 40.5013316 - 240 28 8 1989 -9999.0000000 27.0701655 - 241 29 8 1989 -9999.0000000 23.9630592 - 242 30 8 1989 -9999.0000000 23.3539975 - 243 31 8 1989 -9999.0000000 23.0554103 - 244 1 9 1989 -9999.0000000 22.7658358 - 245 2 9 1989 -9999.0000000 22.4834214 - 246 3 9 1989 -9999.0000000 22.2082787 - 247 4 9 1989 -9999.0000000 21.9401613 - 248 5 9 1989 -9999.0000000 21.6785684 - 249 6 9 1989 -9999.0000000 21.4229106 - 250 7 9 1989 -9999.0000000 21.1729924 - 251 8 9 1989 -9999.0000000 20.9284861 - 252 9 9 1989 -9999.0000000 20.6890914 - 253 10 9 1989 -9999.0000000 20.4545325 - 254 11 9 1989 -9999.0000000 22.1731988 - 255 12 9 1989 -9999.0000000 24.4769524 - 256 13 9 1989 -9999.0000000 33.2020549 - 257 14 9 1989 -9999.0000000 35.0036167 - 258 15 9 1989 -9999.0000000 52.8504406 - 259 16 9 1989 -9999.0000000 34.9387492 - 260 17 9 1989 -9999.0000000 20.6830278 - 261 18 9 1989 -9999.0000000 20.3852412 - 262 19 9 1989 -9999.0000000 20.1149016 - 263 20 9 1989 -9999.0000000 19.8798410 - 264 21 9 1989 -9999.0000000 19.5661339 - 265 22 9 1989 -9999.0000000 44.9127952 - 266 23 9 1989 -9999.0000000 48.5754264 - 267 24 9 1989 -9999.0000000 29.1215482 - 268 25 9 1989 -9999.0000000 20.8034789 - 269 26 9 1989 -9999.0000000 20.4471605 - 270 27 9 1989 -9999.0000000 20.1075264 - 271 28 9 1989 -9999.0000000 19.7828344 - 272 29 9 1989 -9999.0000000 19.4719056 - 273 30 9 1989 -9999.0000000 19.1736694 - 274 1 10 1989 -9999.0000000 18.8871531 - 275 2 10 1989 -9999.0000000 18.6114721 - 276 3 10 1989 -9999.0000000 18.3458217 - 277 4 10 1989 -9999.0000000 18.0894686 - 278 5 10 1989 -9999.0000000 17.8417447 - 279 6 10 1989 -9999.0000000 35.3467949 - 280 7 10 1989 -9999.0000000 63.1642512 - 281 8 10 1989 -9999.0000000 40.7460373 - 282 9 10 1989 -9999.0000000 28.6925845 - 283 10 10 1989 -9999.0000000 28.2028602 - 284 11 10 1989 -9999.0000000 24.2204477 - 285 12 10 1989 -9999.0000000 24.8475036 - 286 13 10 1989 -9999.0000000 22.6441796 - 287 14 10 1989 -9999.0000000 22.2457695 - 288 15 10 1989 -9999.0000000 22.3625442 - 289 16 10 1989 -9999.0000000 21.4482500 - 290 17 10 1989 -9999.0000000 21.0037089 - 291 18 10 1989 -9999.0000000 20.5831613 - 292 19 10 1989 -9999.0000000 20.1864577 - 293 20 10 1989 -9999.0000000 21.9249766 - 294 21 10 1989 -9999.0000000 20.5699470 - 295 22 10 1989 -9999.0000000 19.2762913 - 296 23 10 1989 -9999.0000000 18.9389731 - 297 24 10 1989 -9999.0000000 18.6171381 - 298 25 10 1989 -9999.0000000 18.3095588 - 299 26 10 1989 -9999.0000000 18.0151505 - 300 27 10 1989 -9999.0000000 17.7329220 - 301 28 10 1989 -9999.0000000 71.0827482 - 302 29 10 1989 -9999.0000000 75.6782285 - 303 30 10 1989 -9999.0000000 51.8956204 - 304 31 10 1989 -9999.0000000 56.5598322 - 305 1 11 1989 -9999.0000000 87.4614745 - 306 2 11 1989 -9999.0000000 95.8542690 - 307 3 11 1989 -9999.0000000 103.7496280 - 308 4 11 1989 -9999.0000000 134.1458783 - 309 5 11 1989 -9999.0000000 126.3163519 - 310 6 11 1989 -9999.0000000 107.2347945 - 311 7 11 1989 -9999.0000000 90.6852871 - 312 8 11 1989 -9999.0000000 85.9316821 - 313 9 11 1989 -9999.0000000 78.0397898 - 314 10 11 1989 -9999.0000000 67.6122235 - 315 11 11 1989 -9999.0000000 60.8124491 - 316 12 11 1989 -9999.0000000 56.6631292 - 317 13 11 1989 -9999.0000000 53.5266093 - 318 14 11 1989 -9999.0000000 50.8931178 - 319 15 11 1989 -9999.0000000 48.5706512 - 320 16 11 1989 -9999.0000000 46.4557194 - 321 17 11 1989 -9999.0000000 44.5257077 - 322 18 11 1989 -9999.0000000 42.7607827 - 323 19 11 1989 -9999.0000000 41.1434924 - 324 20 11 1989 -9999.0000000 39.6584479 - 325 21 11 1989 -9999.0000000 38.2920514 - 326 22 11 1989 -9999.0000000 37.0322734 - 327 23 11 1989 -9999.0000000 35.8850493 - 328 24 11 1989 -9999.0000000 34.8199320 - 329 25 11 1989 -9999.0000000 33.8190916 - 330 26 11 1989 -9999.0000000 32.8888526 - 331 27 11 1989 -9999.0000000 32.0224925 - 332 28 11 1989 -9999.0000000 31.2140019 - 333 29 11 1989 -9999.0000000 30.4580018 - 334 30 11 1989 -9999.0000000 29.7496716 - 335 1 12 1989 -9999.0000000 29.0846856 - 336 2 12 1989 -9999.0000000 28.4591578 - 337 3 12 1989 -9999.0000000 27.8695930 - 338 4 12 1989 -9999.0000000 27.3128443 - 339 5 12 1989 -9999.0000000 26.7860752 - 340 6 12 1989 -9999.0000000 26.2867267 - 341 7 12 1989 -9999.0000000 25.8124877 - 342 8 12 1989 -9999.0000000 25.3612690 - 343 9 12 1989 -9999.0000000 24.9311804 - 344 10 12 1989 -9999.0000000 24.5205102 - 345 11 12 1989 -9999.0000000 24.1277071 - 346 12 12 1989 -9999.0000000 33.5034489 - 347 13 12 1989 -9999.0000000 105.2067420 - 348 14 12 1989 -9999.0000000 131.1037539 - 349 15 12 1989 -9999.0000000 191.5588156 - 350 16 12 1989 -9999.0000000 253.0030475 - 351 17 12 1989 -9999.0000000 273.9966628 - 352 18 12 1989 -9999.0000000 317.8882051 - 353 19 12 1989 -9999.0000000 408.5482570 - 354 20 12 1989 -9999.0000000 409.7599754 - 355 21 12 1989 -9999.0000000 398.3711557 - 356 22 12 1989 -9999.0000000 450.6649660 - 357 23 12 1989 -9999.0000000 485.9618393 - 358 24 12 1989 -9999.0000000 428.5769268 - 359 25 12 1989 -9999.0000000 355.9553929 - 360 26 12 1989 -9999.0000000 299.5949953 - 361 27 12 1989 -9999.0000000 253.2399756 - 362 28 12 1989 -9999.0000000 215.5764231 - 363 29 12 1989 -9999.0000000 185.8092200 - 364 30 12 1989 -9999.0000000 162.8210176 - 365 31 12 1989 -9999.0000000 145.6601811 - 366 1 1 1990 157.0000000 131.9565196 - 367 2 1 1990 129.0000000 120.7965517 - 368 3 1 1990 117.0000000 112.7654754 - 369 4 1 1990 111.0000000 106.5049699 - 370 5 1 1990 112.0000000 100.8986424 - 371 6 1 1990 93.0000000 95.9066178 - 372 7 1 1990 87.0000000 91.3736767 - 373 8 1 1990 84.0000000 87.2633890 - 374 9 1 1990 80.0000000 83.6271386 - 375 10 1 1990 78.0000000 80.2269372 - 376 11 1 1990 78.0000000 77.1478033 - 377 12 1 1990 77.0000000 74.3369973 - 378 13 1 1990 76.0000000 72.7403997 - 379 14 1 1990 73.0000000 74.5749741 - 380 15 1 1990 66.0000000 84.5814597 - 381 16 1 1990 76.0000000 82.6881787 - 382 17 1 1990 73.0000000 84.1790374 - 383 18 1 1990 71.0000000 85.1825541 - 384 19 1 1990 90.0000000 79.6561169 - 385 20 1 1990 82.0000000 83.9572421 - 386 21 1 1990 80.0000000 81.1495485 - 387 22 1 1990 81.0000000 76.6963352 - 388 23 1 1990 97.0000000 172.7337834 - 389 24 1 1990 198.0000000 206.4350549 - 390 25 1 1990 392.0000000 269.9385329 - 391 26 1 1990 519.0000000 297.8979251 - 392 27 1 1990 565.0000000 256.6493459 - 393 28 1 1990 331.0000000 238.5221003 - 394 29 1 1990 293.0000000 238.6421285 - 395 30 1 1990 302.0000000 205.1720706 - 396 31 1 1990 233.0000000 180.0116781 - 397 1 2 1990 198.0000000 188.5322491 - 398 2 2 1990 183.0000000 207.6685578 - 399 3 2 1990 206.0000000 211.2436197 - 400 4 2 1990 215.0000000 183.2058558 - 401 5 2 1990 183.0000000 161.7086342 - 402 6 2 1990 159.0000000 146.0380184 - 403 7 2 1990 167.0000000 134.1427298 - 404 8 2 1990 138.0000000 128.2182248 - 405 9 2 1990 126.0000000 126.1042784 - 406 10 2 1990 131.0000000 198.1235719 - 407 11 2 1990 173.0000000 262.8561171 - 408 12 2 1990 240.0000000 299.4527087 - 409 13 2 1990 270.0000000 439.4189826 - 410 14 2 1990 458.0000000 773.8467553 - 411 15 2 1990 996.0000000 1041.4712793 - 412 16 2 1990 1370.0000000 926.6138141 - 413 17 2 1990 1540.0000000 779.2492202 - 414 18 2 1990 1210.0000000 658.8388520 - 415 19 2 1990 616.0000000 556.1838311 - 416 20 2 1990 465.0000000 471.6743949 - 417 21 2 1990 373.0000000 401.7985228 - 418 22 2 1990 298.0000000 343.8175321 - 419 23 2 1990 270.0000000 295.7205690 - 420 24 2 1990 234.0000000 256.9970616 - 421 25 2 1990 218.0000000 232.8923805 - 422 26 2 1990 203.0000000 338.1898645 - 423 27 2 1990 314.0000000 527.6773234 - 424 28 2 1990 520.0000000 701.7497753 - 425 1 3 1990 689.0000000 766.1623474 - 426 2 3 1990 777.0000000 678.0178769 - 427 3 3 1990 584.0000000 573.4172082 - 428 4 3 1990 429.0000000 487.3278050 - 429 5 3 1990 365.0000000 418.2917682 - 430 6 3 1990 281.0000000 360.9532418 - 431 7 3 1990 257.0000000 311.5644935 - 432 8 3 1990 231.0000000 270.7152147 - 433 9 3 1990 211.0000000 238.6741757 - 434 10 3 1990 191.0000000 214.5609207 - 435 11 3 1990 182.0000000 196.0690159 - 436 12 3 1990 173.0000000 181.6378510 - 437 13 3 1990 159.0000000 171.3213890 - 438 14 3 1990 153.0000000 165.2960186 - 439 15 3 1990 141.0000000 159.4465199 - 440 16 3 1990 136.0000000 152.4408941 - 441 17 3 1990 130.0000000 146.5338019 - 442 18 3 1990 123.0000000 141.1739692 - 443 19 3 1990 115.0000000 136.2965919 - 444 20 3 1990 113.0000000 132.3404240 - 445 21 3 1990 102.0000000 128.8694014 - 446 22 3 1990 105.0000000 125.8135788 - 447 23 3 1990 106.0000000 122.7032926 - 448 24 3 1990 87.0000000 119.5754559 - 449 25 3 1990 80.0000000 117.3015449 - 450 26 3 1990 84.0000000 114.3013383 - 451 27 3 1990 82.0000000 111.6943823 - 452 28 3 1990 91.0000000 119.8479224 - 453 29 3 1990 97.0000000 124.5881143 - 454 30 3 1990 110.0000000 116.8039857 - 455 31 3 1990 97.0000000 112.7916732 - 456 1 4 1990 93.0000000 109.9894132 - 457 2 4 1990 85.0000000 107.3885435 - 458 3 4 1990 84.0000000 111.7138522 - 459 4 4 1990 81.0000000 114.3452678 - 460 5 4 1990 81.0000000 107.0403015 - 461 6 4 1990 76.0000000 105.4354510 - 462 7 4 1990 72.0000000 102.8469572 - 463 8 4 1990 68.0000000 100.5552144 - 464 9 4 1990 72.0000000 98.4796011 - 465 10 4 1990 65.0000000 96.5739986 - 466 11 4 1990 62.0000000 95.4280410 - 467 12 4 1990 62.0000000 96.2843918 - 468 13 4 1990 65.0000000 100.6602121 - 469 14 4 1990 68.0000000 122.1639336 - 470 15 4 1990 75.0000000 122.7287343 - 471 16 4 1990 90.0000000 117.7156370 - 472 17 4 1990 92.0000000 114.3745074 - 473 18 4 1990 94.0000000 114.5463743 - 474 19 4 1990 110.0000000 110.1208203 - 475 20 4 1990 99.0000000 106.7537829 - 476 21 4 1990 86.0000000 104.0187924 - 477 22 4 1990 86.0000000 109.1395168 - 478 23 4 1990 86.0000000 115.5174258 - 479 24 4 1990 88.0000000 114.8241674 - 480 25 4 1990 93.0000000 107.6504036 - 481 26 4 1990 99.0000000 104.3130775 - 482 27 4 1990 86.0000000 101.8910328 - 483 28 4 1990 74.0000000 99.4569020 - 484 29 4 1990 72.0000000 96.9617216 - 485 30 4 1990 77.0000000 94.6424060 - 486 1 5 1990 56.0000000 92.4782525 - 487 2 5 1990 64.0000000 90.4537238 - 488 3 5 1990 58.0000000 88.5550742 - 489 4 5 1990 50.0000000 86.7701051 - 490 5 5 1990 50.0000000 85.0879731 - 491 6 5 1990 50.0000000 83.4990238 - 492 7 5 1990 50.0000000 82.0392407 - 493 8 5 1990 53.0000000 81.7481459 - 494 9 5 1990 62.0000000 80.5302410 - 495 10 5 1990 64.0000000 85.6809900 - 496 11 5 1990 65.0000000 85.9238002 - 497 12 5 1990 75.0000000 78.9109900 - 498 13 5 1990 71.0000000 77.2209539 - 499 14 5 1990 63.0000000 76.0283809 - 500 15 5 1990 61.0000000 75.1891139 - 501 16 5 1990 49.0000000 74.0265160 - 502 17 5 1990 46.0000000 72.6959687 - 503 18 5 1990 46.0000000 71.5985122 - 504 19 5 1990 48.0000000 70.5453520 - 505 20 5 1990 41.0000000 69.5950282 - 506 21 5 1990 45.0000000 75.4404237 - 507 22 5 1990 52.0000000 74.9292252 - 508 23 5 1990 50.0000000 74.1978822 - 509 24 5 1990 56.0000000 77.4149253 - 510 25 5 1990 41.0000000 72.9576589 - 511 26 5 1990 40.0000000 68.2084274 - 512 27 5 1990 39.0000000 67.1258582 - 513 28 5 1990 39.0000000 66.0918463 - 514 29 5 1990 33.0000000 65.1016999 - 515 30 5 1990 37.0000000 64.1516501 - 516 31 5 1990 30.0000000 63.2383243 - 517 1 6 1990 37.0000000 68.9456383 - 518 2 6 1990 36.0000000 69.9378914 - 519 3 6 1990 40.0000000 98.9381988 - 520 4 6 1990 45.0000000 78.5801271 - 521 5 6 1990 39.0000000 64.3468854 - 522 6 6 1990 48.0000000 63.2761452 - 523 7 6 1990 39.0000000 110.1442463 - 524 8 6 1990 49.0000000 114.0828396 - 525 9 6 1990 84.0000000 98.2961820 - 526 10 6 1990 91.0000000 87.2500034 - 527 11 6 1990 80.0000000 78.4711311 - 528 12 6 1990 66.0000000 76.0785279 - 529 13 6 1990 53.0000000 74.1562918 - 530 14 6 1990 64.0000000 72.2085542 - 531 15 6 1990 55.0000000 70.2415728 - 532 16 6 1990 54.0000000 68.5276430 - 533 17 6 1990 42.0000000 66.9311767 - 534 18 6 1990 48.0000000 65.7926609 - 535 19 6 1990 48.0000000 82.8833120 - 536 20 6 1990 60.0000000 98.7895987 - 537 21 6 1990 75.0000000 90.5556691 - 538 22 6 1990 78.0000000 78.0364575 - 539 23 6 1990 66.0000000 74.9607039 - 540 24 6 1990 63.0000000 71.8029167 - 541 25 6 1990 52.0000000 69.6776670 - 542 26 6 1990 49.0000000 67.9223171 - 543 27 6 1990 44.0000000 75.0421181 - 544 28 6 1990 51.0000000 72.8748577 - 545 29 6 1990 61.0000000 92.7705677 - 546 30 6 1990 81.0000000 123.9690673 - 547 1 7 1990 79.0000000 95.1751325 - 548 2 7 1990 92.0000000 81.5277929 - 549 3 7 1990 72.0000000 88.5072892 - 550 4 7 1990 58.0000000 105.3143484 - 551 5 7 1990 69.0000000 134.7529686 - 552 6 7 1990 94.0000000 121.6417917 - 553 7 7 1990 199.0000000 117.9944306 - 554 8 7 1990 133.0000000 122.3262309 - 555 9 7 1990 124.0000000 106.4044996 - 556 10 7 1990 123.0000000 98.1352730 - 557 11 7 1990 99.0000000 92.8036305 - 558 12 7 1990 88.0000000 88.7490850 - 559 13 7 1990 84.0000000 85.3396057 - 560 14 7 1990 72.0000000 82.2669594 - 561 15 7 1990 55.0000000 79.4564103 - 562 16 7 1990 65.0000000 76.8788033 - 563 17 7 1990 50.0000000 74.5086528 - 564 18 7 1990 50.0000000 72.3236256 - 565 19 7 1990 46.0000000 70.3041068 - 566 20 7 1990 44.0000000 68.4328317 - 567 21 7 1990 42.0000000 66.6945732 - 568 22 7 1990 37.0000000 65.0758754 - 569 23 7 1990 38.0000000 63.5648251 - 570 24 7 1990 44.0000000 62.1508568 - 571 25 7 1990 30.0000000 60.8245835 - 572 26 7 1990 26.0000000 59.5776525 - 573 27 7 1990 31.0000000 58.4026196 - 574 28 7 1990 33.0000000 60.3100010 - 575 29 7 1990 42.0000000 57.5823986 - 576 30 7 1990 36.0000000 55.4237829 - 577 31 7 1990 34.0000000 54.4630962 - 578 1 8 1990 25.0000000 53.5486519 - 579 2 8 1990 22.0000000 52.6764734 - 580 3 8 1990 28.0000000 51.8429851 - 581 4 8 1990 25.0000000 51.0449689 - 582 5 8 1990 19.0000000 50.2795953 - 583 6 8 1990 22.0000000 49.5444567 - 584 7 8 1990 19.0000000 48.8365779 - 585 8 8 1990 22.0000000 48.1541198 - 586 9 8 1990 19.0000000 47.4951870 - 587 10 8 1990 20.0000000 46.8580285 - 588 11 8 1990 19.0000000 46.2410564 - 589 12 8 1990 19.0000000 45.6428295 - 590 13 8 1990 22.0000000 50.0829336 - 591 14 8 1990 36.0000000 70.8846143 - 592 15 8 1990 31.0000000 60.8294352 - 593 16 8 1990 30.0000000 54.7037318 - 594 17 8 1990 28.0000000 50.4863988 - 595 18 8 1990 34.0000000 43.7778620 - 596 19 8 1990 21.0000000 43.1909227 - 597 20 8 1990 30.0000000 42.6230802 - 598 21 8 1990 22.0000000 42.0725990 - 599 22 8 1990 21.0000000 41.5382397 - 600 23 8 1990 23.0000000 41.0188786 - 601 24 8 1990 20.0000000 40.5134962 - 602 25 8 1990 29.0000000 40.0217332 - 603 26 8 1990 20.0000000 40.0403183 - 604 27 8 1990 22.0000000 41.2031178 - 605 28 8 1990 23.0000000 39.1870499 - 606 29 8 1990 35.0000000 38.2423566 - 607 30 8 1990 51.0000000 124.4814709 - 608 31 8 1990 80.0000000 113.8489431 - 609 1 9 1990 56.0000000 52.0034469 - 610 2 9 1990 33.0000000 43.7243998 - 611 3 9 1990 27.0000000 42.8339361 - 612 4 9 1990 27.0000000 45.9880226 - 613 5 9 1990 28.0000000 45.6365347 - 614 6 9 1990 26.0000000 41.2039603 - 615 7 9 1990 24.0000000 46.7308694 - 616 8 9 1990 33.0000000 43.5320018 - 617 9 9 1990 26.0000000 39.7939740 - 618 10 9 1990 27.0000000 39.0686149 - 619 11 9 1990 22.0000000 38.3812208 - 620 12 9 1990 22.0000000 37.7279973 - 621 13 9 1990 21.0000000 37.1059019 - 622 14 9 1990 22.0000000 36.5122116 - 623 15 9 1990 22.0000000 35.9444867 - 624 16 9 1990 22.0000000 35.4005379 - 625 17 9 1990 20.0000000 34.8783982 - 626 18 9 1990 22.0000000 34.3762980 - 627 19 9 1990 16.0000000 33.8926435 - 628 20 9 1990 22.0000000 33.4259976 - 629 21 9 1990 19.0000000 42.0104160 - 630 22 9 1990 32.0000000 107.0470520 - 631 23 9 1990 27.0000000 83.0616809 - 632 24 9 1990 45.0000000 58.3216063 - 633 25 9 1990 42.0000000 44.1587222 - 634 26 9 1990 39.0000000 41.0554005 - 635 27 9 1990 30.0000000 40.0199320 - 636 28 9 1990 28.0000000 39.0541910 - 637 29 9 1990 30.0000000 38.1527336 - 638 30 9 1990 30.0000000 88.1935645 - 639 1 10 1990 56.0000000 128.1160834 - 640 2 10 1990 72.0000000 90.7301146 - 641 3 10 1990 73.0000000 88.1441162 - 642 4 10 1990 68.0000000 81.7932305 - 643 5 10 1990 53.0000000 70.4220690 - 644 6 10 1990 42.0000000 65.6062707 - 645 7 10 1990 33.0000000 62.5560260 - 646 8 10 1990 42.0000000 59.9172573 - 647 9 10 1990 34.0000000 57.5524753 - 648 10 10 1990 36.0000000 55.3816794 - 649 11 10 1990 36.0000000 53.3927725 - 650 12 10 1990 28.0000000 51.5663799 - 651 13 10 1990 32.0000000 49.8854437 - 652 14 10 1990 27.0000000 48.3349147 - 653 15 10 1990 35.0000000 47.2813299 - 654 16 10 1990 42.0000000 48.4167794 - 655 17 10 1990 35.0000000 57.7094087 - 656 18 10 1990 39.0000000 56.1072603 - 657 19 10 1990 34.0000000 47.2876109 - 658 20 10 1990 32.0000000 45.9056627 - 659 21 10 1990 34.0000000 44.6329942 - 660 22 10 1990 27.0000000 43.4503112 - 661 23 10 1990 31.0000000 42.3488037 - 662 24 10 1990 28.0000000 41.3206456 - 663 25 10 1990 25.0000000 41.4821577 - 664 26 10 1990 29.0000000 59.3469179 - 665 27 10 1990 31.0000000 66.0550069 - 666 28 10 1990 65.0000000 189.7719837 - 667 29 10 1990 69.0000000 190.1169754 - 668 30 10 1990 157.0000000 157.3733563 - 669 31 10 1990 190.0000000 138.6143367 - 670 1 11 1990 115.0000000 144.2110569 - 671 2 11 1990 104.0000000 153.9729344 - 672 3 11 1990 100.0000000 161.6940788 - 673 4 11 1990 131.0000000 159.4064808 - 674 5 11 1990 130.0000000 154.6273631 - 675 6 11 1990 115.0000000 138.2376947 - 676 7 11 1990 102.0000000 124.0452303 - 677 8 11 1990 95.0000000 111.9471952 - 678 9 11 1990 81.0000000 101.9343713 - 679 10 11 1990 66.0000000 108.3247914 - 680 11 11 1990 67.0000000 139.8328846 - 681 12 11 1990 74.0000000 151.2050666 - 682 13 11 1990 109.0000000 144.3429002 - 683 14 11 1990 92.0000000 167.8459413 - 684 15 11 1990 92.0000000 180.9386410 - 685 16 11 1990 155.0000000 169.7835849 - 686 17 11 1990 159.0000000 160.3652661 - 687 18 11 1990 131.0000000 176.8159730 - 688 19 11 1990 161.0000000 188.3971923 - 689 20 11 1990 196.0000000 291.8793255 - 690 21 11 1990 336.0000000 353.8451564 - 691 22 11 1990 566.0000000 319.9194978 - 692 23 11 1990 373.0000000 324.5544115 - 693 24 11 1990 293.0000000 298.0072117 - 694 25 11 1990 264.0000000 289.0517876 - 695 26 11 1990 226.0000000 263.8913410 - 696 27 11 1990 201.0000000 231.2517780 - 697 28 11 1990 180.0000000 206.3013178 - 698 29 11 1990 161.0000000 195.3994042 - 699 30 11 1990 149.0000000 181.0282237 - 700 1 12 1990 134.0000000 159.3089897 - 701 2 12 1990 113.0000000 143.2449863 - 702 3 12 1990 99.0000000 131.7805237 - 703 4 12 1990 107.0000000 124.1737927 - 704 5 12 1990 99.0000000 117.9021201 - 705 6 12 1990 89.0000000 112.2380956 - 706 7 12 1990 77.0000000 107.1461844 - 707 8 12 1990 71.0000000 102.5463202 - 708 9 12 1990 68.0000000 98.3792744 - 709 10 12 1990 73.0000000 94.5938476 - 710 11 12 1990 84.0000000 91.1456584 - 711 12 12 1990 88.0000000 99.8049022 - 712 13 12 1990 92.0000000 103.6882545 - 713 14 12 1990 128.0000000 96.0378197 - 714 15 12 1990 136.0000000 91.0565634 - 715 16 12 1990 114.0000000 87.7094418 - 716 17 12 1990 101.0000000 84.6733382 - 717 18 12 1990 93.0000000 81.8988655 - 718 19 12 1990 85.0000000 79.3560989 - 719 20 12 1990 81.0000000 77.0189844 - 720 21 12 1990 106.0000000 102.4384651 - 721 22 12 1990 159.0000000 128.8869578 - 722 23 12 1990 250.0000000 152.7885765 - 723 24 12 1990 298.0000000 147.7618792 - 724 25 12 1990 261.0000000 188.2554129 - 725 26 12 1990 228.0000000 298.6989181 - 726 27 12 1990 409.0000000 366.5864384 - 727 28 12 1990 486.0000000 403.6968032 - 728 29 12 1990 440.0000000 517.0110600 - 729 30 12 1990 486.0000000 647.0310074 - 730 31 12 1990 774.0000000 722.7488642 - 731 1 1 1991 889.0000000 761.2103594 - 732 2 1 1991 863.0000000 809.6699279 - 733 3 1 1991 875.0000000 885.2372508 - 734 4 1 1991 932.0000000 826.3080907 - 735 5 1 1991 826.0000000 788.5016224 - 736 6 1 1991 731.0000000 741.7106608 - 737 7 1 1991 613.0000000 706.7031914 - 738 8 1 1991 610.0000000 693.3862167 - 739 9 1 1991 686.0000000 633.9596786 - 740 10 1 1991 556.0000000 667.9505719 - 741 11 1 1991 669.0000000 698.1312501 - 742 12 1 1991 828.0000000 656.7219541 - 743 13 1 1991 735.0000000 553.5079384 - 744 14 1 1991 513.0000000 470.8709449 - 745 15 1 1991 411.0000000 402.7895245 - 746 16 1 1991 345.0000000 346.4318222 - 747 17 1 1991 293.0000000 299.5802684 - 748 18 1 1991 251.0000000 261.1739025 - 749 19 1 1991 222.0000000 231.3274142 - 750 20 1 1991 215.0000000 209.0665238 - 751 21 1 1991 213.0000000 193.2850357 - 752 22 1 1991 202.0000000 187.3187539 - 753 23 1 1991 200.0000000 180.3816214 - 754 24 1 1991 192.0000000 171.3860117 - 755 25 1 1991 176.0000000 163.5761471 - 756 26 1 1991 164.0000000 156.5770029 - 757 27 1 1991 157.0000000 150.2547831 - 758 28 1 1991 134.0000000 144.5380993 - 759 29 1 1991 130.0000000 139.3523318 - 760 30 1 1991 119.0000000 134.6332325 - 761 31 1 1991 107.0000000 130.3253306 - 762 1 2 1991 112.0000000 126.3806019 - 763 2 2 1991 109.0000000 122.7573604 - 764 3 2 1991 101.0000000 119.4193314 - 765 4 2 1991 98.0000000 116.3348746 - 766 5 2 1991 84.0000000 113.4763288 - 767 6 2 1991 93.0000000 110.8194594 - 768 7 2 1991 80.0000000 108.3429896 - 769 8 2 1991 73.0000000 106.0282026 - 770 9 2 1991 89.0000000 103.8586017 - 771 10 2 1991 84.0000000 101.8196206 - 772 11 2 1991 78.0000000 99.8983748 - 773 12 2 1991 79.0000000 98.0834481 - 774 13 2 1991 77.0000000 96.3647086 - 775 14 2 1991 80.0000000 94.7331502 - 776 15 2 1991 72.0000000 93.1807553 - 777 16 2 1991 78.0000000 92.6589457 - 778 17 2 1991 74.0000000 92.2074260 - 779 18 2 1991 77.0000000 90.6699158 - 780 19 2 1991 73.0000000 101.3562964 - 781 20 2 1991 69.0000000 116.0945264 - 782 21 2 1991 74.0000000 149.2269152 - 783 22 2 1991 81.0000000 167.7052910 - 784 23 2 1991 110.0000000 163.4868043 - 785 24 2 1991 180.0000000 156.7245129 - 786 25 2 1991 213.0000000 153.8747646 - 787 26 2 1991 222.0000000 154.8430074 - 788 27 2 1991 208.0000000 150.7557027 - 789 28 2 1991 211.0000000 143.5875309 - 790 1 3 1991 214.0000000 137.6694441 - 791 2 3 1991 208.0000000 145.1603233 - 792 3 3 1991 221.0000000 143.3283029 - 793 4 3 1991 281.0000000 134.5410608 - 794 5 3 1991 219.0000000 129.1887478 - 795 6 3 1991 190.0000000 124.4543840 - 796 7 3 1991 173.0000000 120.1442643 - 797 8 3 1991 164.0000000 116.4338552 - 798 9 3 1991 142.0000000 113.7524009 - 799 10 3 1991 133.0000000 113.4143719 - 800 11 3 1991 133.0000000 110.5083181 - 801 12 3 1991 118.0000000 107.1780677 - 802 13 3 1991 127.0000000 104.1382377 - 803 14 3 1991 113.0000000 101.3355946 - 804 15 3 1991 107.0000000 98.7416565 - 805 16 3 1991 100.0000000 96.3340559 - 806 17 3 1991 100.0000000 94.0977554 - 807 18 3 1991 95.0000000 92.0481137 - 808 19 3 1991 98.0000000 146.7122947 - 809 20 3 1991 119.0000000 149.1644154 - 810 21 3 1991 159.0000000 163.9635741 - 811 22 3 1991 196.0000000 177.3119530 - 812 23 3 1991 242.0000000 161.7090328 - 813 24 3 1991 216.0000000 149.5523369 - 814 25 3 1991 180.0000000 141.3600985 - 815 26 3 1991 145.0000000 134.5675601 - 816 27 3 1991 127.0000000 130.0173940 - 817 28 3 1991 117.0000000 124.0676763 - 818 29 3 1991 109.0000000 119.1046733 - 819 30 3 1991 106.0000000 114.6097618 - 820 31 3 1991 99.0000000 110.5259230 - 821 1 4 1991 96.0000000 106.8041153 - 822 2 4 1991 88.0000000 103.4019147 - 823 3 4 1991 87.0000000 100.2825223 - 824 4 4 1991 82.0000000 97.7954012 - 825 5 4 1991 84.0000000 95.8162777 - 826 6 4 1991 67.0000000 93.2771630 - 827 7 4 1991 89.0000000 91.0948271 - 828 8 4 1991 75.0000000 89.1414960 - 829 9 4 1991 79.0000000 87.1245445 - 830 10 4 1991 70.0000000 85.1908990 - 831 11 4 1991 69.0000000 83.3790588 - 832 12 4 1991 69.0000000 81.6792366 - 833 13 4 1991 56.0000000 80.0804419 - 834 14 4 1991 63.0000000 78.5751899 - 835 15 4 1991 58.0000000 77.1545987 - 836 16 4 1991 56.0000000 75.8036258 - 837 17 4 1991 54.0000000 74.5204406 - 838 18 4 1991 57.0000000 73.3298703 - 839 19 4 1991 53.0000000 73.2167567 - 840 20 4 1991 53.0000000 72.5766848 - 841 21 4 1991 65.0000000 71.4786355 - 842 22 4 1991 69.0000000 73.0211296 - 843 23 4 1991 61.0000000 74.3097976 - 844 24 4 1991 56.0000000 70.7313753 - 845 25 4 1991 56.0000000 69.1858688 - 846 26 4 1991 53.0000000 68.0882925 - 847 27 4 1991 49.0000000 67.0579563 - 848 28 4 1991 53.0000000 66.0748008 - 849 29 4 1991 48.0000000 69.4021926 - 850 30 4 1991 57.0000000 112.1656891 - 851 1 5 1991 69.0000000 101.5670352 - 852 2 5 1991 89.0000000 79.9218336 - 853 3 5 1991 105.0000000 77.1897682 - 854 4 5 1991 79.0000000 75.3576441 - 855 5 5 1991 69.0000000 73.7804316 - 856 6 5 1991 71.0000000 72.5366708 - 857 7 5 1991 60.0000000 70.8172383 - 858 8 5 1991 64.0000000 69.3427183 - 859 9 5 1991 59.0000000 67.9724196 - 860 10 5 1991 57.0000000 68.6901667 - 861 11 5 1991 55.0000000 71.0019356 - 862 12 5 1991 53.0000000 67.7440485 - 863 13 5 1991 52.0000000 66.0670361 - 864 14 5 1991 50.0000000 65.0473387 - 865 15 5 1991 52.0000000 69.6515704 - 866 16 5 1991 54.0000000 70.3477404 - 867 17 5 1991 54.0000000 65.6168488 - 868 18 5 1991 55.0000000 64.3831137 - 869 19 5 1991 48.0000000 63.2396723 - 870 20 5 1991 48.0000000 62.1520036 - 871 21 5 1991 49.0000000 61.1144998 - 872 22 5 1991 41.0000000 60.1231357 - 873 23 5 1991 40.0000000 59.1742568 - 874 24 5 1991 40.0000000 58.2645431 - 875 25 5 1991 39.0000000 57.3909761 - 876 26 5 1991 43.0000000 56.5508101 - 877 27 5 1991 39.0000000 55.7415453 - 878 28 5 1991 36.0000000 54.9609047 - 879 29 5 1991 33.0000000 54.2068128 - 880 30 5 1991 39.0000000 53.4773765 - 881 31 5 1991 34.0000000 52.7708684 - 882 1 6 1991 37.0000000 52.0857107 - 883 2 6 1991 35.0000000 51.4204620 - 884 3 6 1991 29.0000000 50.7738041 - 885 4 6 1991 33.0000000 50.1445314 - 886 5 6 1991 34.0000000 49.5552077 - 887 6 6 1991 32.0000000 66.8200681 - 888 7 6 1991 38.0000000 68.3190258 - 889 8 6 1991 39.0000000 57.0813074 - 890 9 6 1991 41.0000000 54.2254167 - 891 10 6 1991 44.0000000 67.0695269 - 892 11 6 1991 48.0000000 51.8898813 - 893 12 6 1991 42.0000000 49.2309424 - 894 13 6 1991 37.0000000 48.5176568 - 895 14 6 1991 39.0000000 47.9677900 - 896 15 6 1991 35.0000000 47.7230653 - 897 16 6 1991 31.0000000 50.7395317 - 898 17 6 1991 33.0000000 53.9858122 - 899 18 6 1991 31.0000000 51.0452476 - 900 19 6 1991 28.0000000 48.0782162 - 901 20 6 1991 60.0000000 83.2759009 - 902 21 6 1991 48.0000000 66.2094713 - 903 22 6 1991 54.0000000 50.7361432 - 904 23 6 1991 63.0000000 57.8906681 - 905 24 6 1991 41.0000000 52.0061730 - 906 25 6 1991 42.0000000 48.5011918 - 907 26 6 1991 43.0000000 47.6470599 - 908 27 6 1991 38.0000000 56.2940772 - 909 28 6 1991 38.0000000 55.6376355 - 910 29 6 1991 35.0000000 49.0105943 - 911 30 6 1991 41.0000000 47.3012710 - 912 1 7 1991 41.0000000 46.4340726 - 913 2 7 1991 38.0000000 45.6135923 - 914 3 7 1991 34.0000000 44.8327292 - 915 4 7 1991 27.0000000 44.0881634 - 916 5 7 1991 31.0000000 43.3768983 - 917 6 7 1991 30.0000000 42.6963668 - 918 7 7 1991 26.0000000 49.2550691 - 919 8 7 1991 30.0000000 47.6604008 - 920 9 7 1991 31.0000000 41.5230179 - 921 10 7 1991 23.0000000 40.8956806 - 922 11 7 1991 35.0000000 40.2931670 - 923 12 7 1991 19.0000000 41.5654882 - 924 13 7 1991 24.0000000 68.6462113 - 925 14 7 1991 26.0000000 59.7222065 - 926 15 7 1991 27.0000000 43.8575351 - 927 16 7 1991 41.0000000 41.0150698 - 928 17 7 1991 34.0000000 40.3311150 - 929 18 7 1991 27.0000000 39.6786829 - 930 19 7 1991 25.0000000 39.0541008 - 931 20 7 1991 23.0000000 38.4548955 - 932 21 7 1991 22.0000000 37.8795196 - 933 22 7 1991 27.0000000 37.3261403 - 934 23 7 1991 23.0000000 36.7930933 - 935 24 7 1991 21.0000000 37.8542078 - 936 25 7 1991 23.0000000 62.5619195 - 937 26 7 1991 33.0000000 53.7594384 - 938 27 7 1991 23.0000000 40.1500858 - 939 28 7 1991 29.0000000 36.9943165 - 940 29 7 1991 30.0000000 36.4065454 - 941 30 7 1991 35.0000000 49.9664456 - 942 31 7 1991 27.0000000 48.0513757 - 943 1 8 1991 45.0000000 37.2182264 - 944 2 8 1991 47.0000000 36.5291423 - 945 3 8 1991 40.0000000 35.9250754 - 946 4 8 1991 35.0000000 35.3475590 - 947 5 8 1991 26.0000000 34.7944849 - 948 6 8 1991 23.0000000 34.2639442 - 949 7 8 1991 30.0000000 35.4597367 - 950 8 8 1991 33.0000000 36.0334648 - 951 9 8 1991 30.0000000 33.3276546 - 952 10 8 1991 28.0000000 32.4480051 - 953 11 8 1991 19.0000000 31.9997968 - 954 12 8 1991 20.0000000 31.5664160 - 955 13 8 1991 16.0000000 31.1468150 - 956 14 8 1991 18.0000000 30.7400385 - 957 15 8 1991 18.0000000 30.3452143 - 958 16 8 1991 20.0000000 29.9615458 - 959 17 8 1991 16.0000000 29.5883045 - 960 18 8 1991 15.0000000 29.2248245 - 961 19 8 1991 15.0000000 28.8704959 - 962 20 8 1991 14.0000000 28.5247601 - 963 21 8 1991 15.0000000 28.1871052 - 964 22 8 1991 13.0000000 27.8572140 - 965 23 8 1991 12.0000000 27.7600228 - 966 24 8 1991 11.0000000 27.5346086 - 967 25 8 1991 12.0000000 26.9258468 - 968 26 8 1991 11.0000000 26.6212752 - 969 27 8 1991 13.0000000 26.3227226 - 970 28 8 1991 11.0000000 26.0297185 - 971 29 8 1991 12.0000000 25.7419961 - 972 30 8 1991 12.0000000 25.4593094 - 973 31 8 1991 11.0000000 25.1814308 - 974 1 9 1991 11.0000000 27.0030545 - 975 2 9 1991 17.0000000 27.1040226 - 976 3 9 1991 11.0000000 24.4174787 - 977 4 9 1991 12.0000000 24.1544285 - 978 5 9 1991 11.0000000 23.8957558 - 979 6 9 1991 11.0000000 23.6409900 - 980 7 9 1991 18.0000000 23.3899851 - 981 8 9 1991 11.0000000 23.1426054 - 982 9 9 1991 13.0000000 22.8987247 - 983 10 9 1991 12.0000000 23.5536799 - 984 11 9 1991 11.0000000 52.3699380 - 985 12 9 1991 20.0000000 43.8971193 - 986 13 9 1991 21.0000000 22.6895067 - 987 14 9 1991 29.0000000 22.4228431 - 988 15 9 1991 28.0000000 22.1633302 - 989 16 9 1991 20.0000000 21.9092752 - 990 17 9 1991 20.0000000 21.6603808 - 991 18 9 1991 20.0000000 21.4163741 - 992 19 9 1991 12.0000000 21.1770042 - 993 20 9 1991 11.0000000 20.9420407 - 994 21 9 1991 11.0000000 20.7112713 - 995 22 9 1991 22.0000000 42.5883060 - 996 23 9 1991 14.0000000 40.7490621 - 997 24 9 1991 48.0000000 21.1492875 - 998 25 9 1991 45.0000000 79.5512385 - 999 26 9 1991 80.0000000 76.4974837 - 1000 27 9 1991 61.0000000 51.4737224 - 1001 28 9 1991 61.0000000 74.9838478 - 1002 29 9 1991 65.0000000 68.7597407 - 1003 30 9 1991 63.0000000 54.2686502 - 1004 1 10 1991 90.0000000 40.4413283 - 1005 2 10 1991 59.0000000 37.0993165 - 1006 3 10 1991 45.0000000 35.4926497 - 1007 4 10 1991 42.0000000 34.1201852 - 1008 5 10 1991 41.0000000 78.7750776 - 1009 6 10 1991 41.0000000 79.3316539 - 1010 7 10 1991 73.0000000 50.4099088 - 1011 8 10 1991 96.0000000 45.0322236 - 1012 9 10 1991 61.0000000 42.9471715 - 1013 10 10 1991 44.0000000 41.0573869 - 1014 11 10 1991 42.0000000 39.4642306 - 1015 12 10 1991 41.0000000 64.1762882 - 1016 13 10 1991 42.0000000 61.5908828 - 1017 14 10 1991 61.0000000 45.3125347 - 1018 15 10 1991 55.0000000 43.3799354 - 1019 16 10 1991 41.0000000 46.9477269 - 1020 17 10 1991 48.0000000 62.1090378 - 1021 18 10 1991 52.0000000 84.0570970 - 1022 19 10 1991 66.0000000 65.3776136 - 1023 20 10 1991 59.0000000 56.4140436 - 1024 21 10 1991 71.0000000 53.6503822 - 1025 22 10 1991 74.0000000 49.8735759 - 1026 23 10 1991 70.0000000 47.5337169 - 1027 24 10 1991 59.0000000 45.5377371 - 1028 25 10 1991 57.0000000 43.7306800 - 1029 26 10 1991 57.0000000 42.0774024 - 1030 27 10 1991 51.0000000 40.5614896 - 1031 28 10 1991 47.0000000 39.1684915 - 1032 29 10 1991 48.0000000 37.8856613 - 1033 30 10 1991 45.0000000 40.8397754 - 1034 31 10 1991 43.0000000 43.3958544 - 1035 1 11 1991 40.0000000 55.1750282 - 1036 2 11 1991 47.0000000 56.3095328 - 1037 3 11 1991 46.0000000 82.1236734 - 1038 4 11 1991 76.0000000 115.1500271 - 1039 5 11 1991 60.0000000 103.7297769 - 1040 6 11 1991 132.0000000 95.0102653 - 1041 7 11 1991 133.0000000 105.0322080 - 1042 8 11 1991 113.0000000 127.1433080 - 1043 9 11 1991 120.0000000 131.5968847 - 1044 10 11 1991 141.0000000 116.1062426 - 1045 11 11 1991 208.0000000 143.5844891 - 1046 12 11 1991 166.0000000 195.7633074 - 1047 13 11 1991 183.0000000 251.5085989 - 1048 14 11 1991 299.0000000 371.3142669 - 1049 15 11 1991 521.0000000 344.1770303 - 1050 16 11 1991 443.0000000 303.0937729 - 1051 17 11 1991 304.0000000 264.9774190 - 1052 18 11 1991 231.0000000 264.9064637 - 1053 19 11 1991 192.0000000 262.1707170 - 1054 20 11 1991 199.0000000 240.3389769 - 1055 21 11 1991 201.0000000 222.8514550 - 1056 22 11 1991 173.0000000 193.9597155 - 1057 23 11 1991 159.0000000 169.6574267 - 1058 24 11 1991 160.0000000 149.7654364 - 1059 25 11 1991 146.0000000 134.5689830 - 1060 26 11 1991 110.0000000 122.6974948 - 1061 27 11 1991 114.0000000 111.6953184 - 1062 28 11 1991 97.0000000 102.1756094 - 1063 29 11 1991 89.0000000 95.3419508 - 1064 30 11 1991 73.0000000 90.7852086 - 1065 1 12 1991 69.0000000 86.8082193 - 1066 2 12 1991 67.0000000 83.1984554 - 1067 3 12 1991 63.0000000 79.9133164 - 1068 4 12 1991 58.0000000 76.9161875 - 1069 5 12 1991 59.0000000 74.1750936 - 1070 6 12 1991 53.0000000 71.6620450 - 1071 7 12 1991 54.0000000 69.3524863 - 1072 8 12 1991 51.0000000 67.2248291 - 1073 9 12 1991 47.0000000 65.2600550 - 1074 10 12 1991 42.0000000 63.4413772 - 1075 11 12 1991 40.0000000 61.7539514 - 1076 12 12 1991 39.0000000 60.1846279 - 1077 13 12 1991 36.0000000 58.7217385 - 1078 14 12 1991 37.0000000 57.3549128 - 1079 15 12 1991 32.0000000 56.0749198 - 1080 16 12 1991 37.0000000 62.6567519 - 1081 17 12 1991 62.0000000 167.4894979 - 1082 18 12 1991 118.0000000 205.7217517 - 1083 19 12 1991 170.0000000 284.9180051 - 1084 20 12 1991 229.0000000 370.9177259 - 1085 21 12 1991 448.0000000 455.7281740 - 1086 22 12 1991 464.0000000 606.3825823 - 1087 23 12 1991 675.0000000 556.0015283 - 1088 24 12 1991 844.0000000 491.2328406 - 1089 25 12 1991 569.0000000 417.6687103 - 1090 26 12 1991 358.0000000 359.0609326 - 1091 27 12 1991 279.0000000 314.0121431 - 1092 28 12 1991 238.0000000 273.8595744 - 1093 29 12 1991 201.0000000 238.8382602 - 1094 30 12 1991 185.0000000 210.2333358 - 1095 31 12 1991 165.0000000 186.2375726 - 1096 1 1 1992 140.0000000 166.9334896 - 1097 2 1 1992 126.0000000 151.5584270 - 1098 3 1 1992 117.0000000 140.2536323 - 1099 4 1 1992 114.0000000 133.5144278 - 1100 5 1 1992 108.0000000 126.7839808 - 1101 6 1 1992 108.0000000 119.7816887 - 1102 7 1 1992 101.0000000 114.4363449 - 1103 8 1 1992 97.0000000 113.1192585 - 1104 9 1 1992 89.0000000 129.4291908 - 1105 10 1 1992 111.0000000 160.5284860 - 1106 11 1 1992 135.0000000 156.8887816 - 1107 12 1 1992 171.0000000 139.7924644 - 1108 13 1 1992 125.0000000 131.9062498 - 1109 14 1 1992 111.0000000 125.4364510 - 1110 15 1 1992 100.0000000 119.6985644 - 1111 16 1 1992 87.0000000 114.5914469 - 1112 17 1 1992 75.0000000 109.9015290 - 1113 18 1 1992 79.0000000 105.6893110 - 1114 19 1 1992 70.0000000 105.8315913 - 1115 20 1 1992 72.0000000 102.9514239 - 1116 21 1 1992 87.0000000 99.5300157 - 1117 22 1 1992 79.0000000 95.8598779 - 1118 23 1 1992 71.0000000 92.7759531 - 1119 24 1 1992 66.0000000 89.9469860 - 1120 25 1 1992 67.0000000 87.3444482 - 1121 26 1 1992 65.0000000 84.9434242 - 1122 27 1 1992 59.0000000 82.7221037 - 1123 28 1 1992 57.0000000 80.6846570 - 1124 29 1 1992 54.0000000 79.7787770 - 1125 30 1 1992 59.0000000 81.5716183 - 1126 31 1 1992 57.0000000 88.1166614 - 1127 1 2 1992 56.0000000 90.2014420 - 1128 2 2 1992 54.0000000 87.9256998 - 1129 3 2 1992 58.0000000 84.4987568 - 1130 4 2 1992 63.0000000 141.5044872 - 1131 5 2 1992 76.0000000 183.6687608 - 1132 6 2 1992 250.0000000 205.2524390 - 1133 7 2 1992 346.0000000 182.2922152 - 1134 8 2 1992 241.0000000 163.4357194 - 1135 9 2 1992 180.0000000 161.3069858 - 1136 10 2 1992 164.0000000 167.4481663 - 1137 11 2 1992 183.0000000 187.4094655 - 1138 12 2 1992 215.0000000 217.4436193 - 1139 13 2 1992 265.0000000 229.7413969 - 1140 14 2 1992 287.0000000 243.1621546 - 1141 15 2 1992 272.0000000 244.8452178 - 1142 16 2 1992 253.0000000 270.6959239 - 1143 17 2 1992 301.0000000 257.9128322 - 1144 18 2 1992 275.0000000 222.8114320 - 1145 19 2 1992 224.0000000 197.0071289 - 1146 20 2 1992 194.0000000 176.2015338 - 1147 21 2 1992 173.0000000 159.9734354 - 1148 22 2 1992 157.0000000 147.8542859 - 1149 23 2 1992 142.0000000 141.4867596 - 1150 24 2 1992 133.0000000 137.1421502 - 1151 25 2 1992 128.0000000 132.2279390 - 1152 26 2 1992 125.0000000 125.4766916 - 1153 27 2 1992 125.0000000 120.0671922 - 1154 28 2 1992 110.0000000 115.3455343 - 1155 29 2 1992 107.0000000 111.0588890 - 1156 1 3 1992 97.0000000 107.2842649 - 1157 2 3 1992 97.0000000 105.4169618 - 1158 3 3 1992 86.0000000 106.0429986 - 1159 4 3 1992 93.0000000 101.2448886 - 1160 5 3 1992 86.0000000 98.2517888 - 1161 6 3 1992 82.0000000 95.5191088 - 1162 7 3 1992 80.0000000 92.8775190 - 1163 8 3 1992 77.0000000 90.4268460 - 1164 9 3 1992 73.0000000 88.1515967 - 1165 10 3 1992 76.0000000 86.2162155 - 1166 11 3 1992 68.0000000 84.5173390 - 1167 12 3 1992 70.0000000 140.0697260 - 1168 13 3 1992 116.0000000 201.2471296 - 1169 14 3 1992 206.0000000 241.9495841 - 1170 15 3 1992 433.0000000 291.2408788 - 1171 16 3 1992 495.0000000 310.6913722 - 1172 17 3 1992 331.0000000 266.5985391 - 1173 18 3 1992 240.0000000 233.7143396 - 1174 19 3 1992 215.0000000 207.2683103 - 1175 20 3 1992 185.0000000 185.5455265 - 1176 21 3 1992 185.0000000 178.3156393 - 1177 22 3 1992 185.0000000 237.3217737 - 1178 23 3 1992 213.0000000 331.4470910 - 1179 24 3 1992 466.0000000 362.0267215 - 1180 25 3 1992 580.0000000 374.4686720 - 1181 26 3 1992 566.0000000 352.9048654 - 1182 27 3 1992 487.0000000 319.9036310 - 1183 28 3 1992 387.0000000 293.1930284 - 1184 29 3 1992 311.0000000 263.5969143 - 1185 30 3 1992 270.0000000 241.7289929 - 1186 31 3 1992 246.0000000 230.2738434 - 1187 1 4 1992 229.0000000 242.2697303 - 1188 2 4 1992 222.0000000 235.8420652 - 1189 3 4 1992 217.0000000 247.1455116 - 1190 4 4 1992 208.0000000 297.0027501 - 1191 5 4 1992 220.0000000 277.8271362 - 1192 6 4 1992 210.0000000 246.8653736 - 1193 7 4 1992 190.0000000 220.5914476 - 1194 8 4 1992 173.0000000 198.8705397 - 1195 9 4 1992 166.0000000 180.5723944 - 1196 10 4 1992 133.0000000 165.2257231 - 1197 11 4 1992 126.0000000 153.2816453 - 1198 12 4 1992 124.0000000 143.0756475 - 1199 13 4 1992 116.0000000 134.4575618 - 1200 14 4 1992 112.0000000 136.2035477 - 1201 15 4 1992 111.0000000 169.7369583 - 1202 16 4 1992 137.0000000 179.0963923 - 1203 17 4 1992 206.0000000 169.4751916 - 1204 18 4 1992 176.0000000 166.8827868 - 1205 19 4 1992 161.0000000 153.5346739 - 1206 20 4 1992 161.0000000 144.5267479 - 1207 21 4 1992 139.0000000 138.3345913 - 1208 22 4 1992 139.0000000 133.0180193 - 1209 23 4 1992 123.0000000 128.1961728 - 1210 24 4 1992 119.0000000 123.8048442 - 1211 25 4 1992 111.0000000 119.7948068 - 1212 26 4 1992 94.0000000 116.1940940 - 1213 27 4 1992 94.0000000 117.0996282 - 1214 28 4 1992 102.0000000 121.0214974 - 1215 29 4 1992 120.0000000 118.2441888 - 1216 30 4 1992 120.0000000 113.3582067 - 1217 1 5 1992 114.0000000 139.8360472 - 1218 2 5 1992 115.0000000 152.2240080 - 1219 3 5 1992 206.0000000 133.6970586 - 1220 4 5 1992 215.0000000 126.7161955 - 1221 5 5 1992 125.0000000 122.2285471 - 1222 6 5 1992 123.0000000 118.2040124 - 1223 7 5 1992 113.0000000 114.5194699 - 1224 8 5 1992 77.0000000 111.1359900 - 1225 9 5 1992 83.0000000 108.2407155 - 1226 10 5 1992 83.0000000 118.0404668 - 1227 11 5 1992 96.0000000 115.9528280 - 1228 12 5 1992 120.0000000 105.7547554 - 1229 13 5 1992 80.0000000 101.7419800 - 1230 14 5 1992 76.0000000 99.2453127 - 1231 15 5 1992 69.0000000 96.9219512 - 1232 16 5 1992 63.0000000 94.7538389 - 1233 17 5 1992 61.0000000 92.7251847 - 1234 18 5 1992 60.0000000 90.8220381 - 1235 19 5 1992 59.0000000 89.0320527 - 1236 20 5 1992 67.0000000 87.3450554 - 1237 21 5 1992 51.0000000 85.7528438 - 1238 22 5 1992 44.0000000 84.2434501 - 1239 23 5 1992 42.0000000 82.8076117 - 1240 24 5 1992 51.0000000 81.5663489 - 1241 25 5 1992 42.0000000 80.4618833 - 1242 26 5 1992 54.0000000 90.2885694 - 1243 27 5 1992 53.0000000 81.8090316 - 1244 28 5 1992 59.0000000 77.6127295 - 1245 29 5 1992 55.0000000 86.1159375 - 1246 30 5 1992 54.0000000 84.7037120 - 1247 31 5 1992 48.0000000 78.6459404 - 1248 1 6 1992 63.0000000 81.1135586 - 1249 2 6 1992 61.0000000 79.7965745 - 1250 3 6 1992 55.0000000 80.6672911 - 1251 4 6 1992 75.0000000 96.7023039 - 1252 5 6 1992 53.0000000 106.9234980 - 1253 6 6 1992 77.0000000 101.9497685 - 1254 7 6 1992 114.0000000 96.7195203 - 1255 8 6 1992 167.0000000 106.9251697 - 1256 9 6 1992 116.0000000 95.0170218 - 1257 10 6 1992 91.0000000 86.8114548 - 1258 11 6 1992 85.0000000 84.5233273 - 1259 12 6 1992 68.0000000 82.4780367 - 1260 13 6 1992 71.0000000 80.5825045 - 1261 14 6 1992 63.0000000 78.8081968 - 1262 15 6 1992 59.0000000 77.1437570 - 1263 16 6 1992 46.0000000 75.5786440 - 1264 17 6 1992 44.0000000 74.1034762 - 1265 18 6 1992 39.0000000 72.7098904 - 1266 19 6 1992 41.0000000 71.3959804 - 1267 20 6 1992 44.0000000 72.5129416 - 1268 21 6 1992 39.0000000 70.4361829 - 1269 22 6 1992 32.0000000 68.2227357 - 1270 23 6 1992 40.0000000 69.6243721 - 1271 24 6 1992 41.0000000 82.4114640 - 1272 25 6 1992 42.0000000 75.6957902 - 1273 26 6 1992 42.0000000 67.9653270 - 1274 27 6 1992 48.0000000 65.9539037 - 1275 28 6 1992 37.0000000 64.8492076 - 1276 29 6 1992 40.0000000 63.7970788 - 1277 30 6 1992 29.0000000 63.0109949 - 1278 1 7 1992 30.0000000 62.7284611 - 1279 2 7 1992 36.0000000 61.1714653 - 1280 3 7 1992 29.0000000 66.5455321 - 1281 4 7 1992 36.0000000 76.5091605 - 1282 5 7 1992 50.0000000 93.1859208 - 1283 6 7 1992 78.0000000 92.1323667 - 1284 7 7 1992 54.0000000 71.9292940 - 1285 8 7 1992 57.0000000 63.9339454 - 1286 9 7 1992 51.0000000 62.9304180 - 1287 10 7 1992 47.0000000 82.7302599 - 1288 11 7 1992 46.0000000 99.6188933 - 1289 12 7 1992 76.0000000 90.3964497 - 1290 13 7 1992 72.0000000 78.0086107 - 1291 14 7 1992 67.0000000 70.6742993 - 1292 15 7 1992 63.0000000 68.8774420 - 1293 16 7 1992 47.0000000 67.2046486 - 1294 17 7 1992 47.0000000 65.6430189 - 1295 18 7 1992 42.0000000 64.1816352 - 1296 19 7 1992 41.0000000 62.8108048 - 1297 20 7 1992 39.0000000 61.5219068 - 1298 21 7 1992 37.0000000 61.8121912 - 1299 22 7 1992 33.0000000 61.8610023 - 1300 23 7 1992 33.0000000 58.9797729 - 1301 24 7 1992 33.0000000 57.9021084 - 1302 25 7 1992 37.0000000 56.8789875 - 1303 26 7 1992 26.0000000 55.9039855 - 1304 27 7 1992 24.0000000 54.9749131 - 1305 28 7 1992 26.0000000 54.0878968 - 1306 29 7 1992 29.0000000 53.2394463 - 1307 30 7 1992 19.0000000 52.4264131 - 1308 31 7 1992 22.0000000 53.7907592 - 1309 1 8 1992 28.0000000 53.3051635 - 1310 2 8 1992 35.0000000 50.3920869 - 1311 3 8 1992 29.0000000 49.6788521 - 1312 4 8 1992 36.0000000 48.9916052 - 1313 5 8 1992 52.0000000 48.3275363 - 1314 6 8 1992 74.0000000 47.6849445 - 1315 7 8 1992 54.0000000 47.0622856 - 1316 8 8 1992 57.0000000 46.4581564 - 1317 9 8 1992 48.0000000 48.7428877 - 1318 10 8 1992 47.0000000 47.3039216 - 1319 11 8 1992 46.0000000 54.7904239 - 1320 12 8 1992 75.0000000 53.3479801 - 1321 13 8 1992 73.0000000 57.6466692 - 1322 14 8 1992 66.0000000 59.6429926 - 1323 15 8 1992 60.0000000 51.7143009 - 1324 16 8 1992 47.0000000 43.7644649 - 1325 17 8 1992 46.0000000 43.1775809 - 1326 18 8 1992 42.0000000 42.6100514 - 1327 19 8 1992 41.0000000 42.1617288 - 1328 20 8 1992 40.0000000 49.2599476 - 1329 21 8 1992 37.0000000 44.9430072 - 1330 22 8 1992 32.0000000 42.5330749 - 1331 23 8 1992 32.0000000 42.2774616 - 1332 24 8 1992 32.0000000 40.0836646 - 1333 25 8 1992 36.0000000 39.5373038 - 1334 26 8 1992 27.0000000 39.0497276 - 1335 27 8 1992 25.0000000 38.5750329 - 1336 28 8 1992 25.0000000 38.6271025 - 1337 29 8 1992 28.0000000 45.6084644 - 1338 30 8 1992 20.0000000 58.6317924 - 1339 31 8 1992 22.0000000 100.1076047 - 1340 1 9 1992 49.0000000 80.7279109 - 1341 2 9 1992 77.0000000 65.6743647 - 1342 3 9 1992 67.0000000 59.8203249 - 1343 4 9 1992 45.0000000 58.2546779 - 1344 5 9 1992 44.0000000 50.6914168 - 1345 6 9 1992 64.0000000 45.0733532 - 1346 7 9 1992 52.0000000 43.9774207 - 1347 8 9 1992 40.0000000 42.9559080 - 1348 9 9 1992 30.0000000 42.0008782 - 1349 10 9 1992 34.0000000 41.1058493 - 1350 11 9 1992 32.0000000 40.5874424 - 1351 12 9 1992 36.0000000 39.9754772 - 1352 13 9 1992 28.0000000 38.9637018 - 1353 14 9 1992 33.0000000 39.5961585 - 1354 15 9 1992 35.0000000 41.5807545 - 1355 16 9 1992 30.0000000 37.6227312 - 1356 17 9 1992 32.0000000 36.9576793 - 1357 18 9 1992 29.0000000 36.4119705 - 1358 19 9 1992 30.0000000 36.3468038 - 1359 20 9 1992 28.0000000 35.2934624 - 1360 21 9 1992 29.0000000 34.7367647 - 1361 22 9 1992 29.0000000 34.2044705 - 1362 23 9 1992 27.0000000 33.6984515 - 1363 24 9 1992 27.0000000 33.2062017 - 1364 25 9 1992 23.0000000 32.7325995 - 1365 26 9 1992 28.0000000 32.2759280 - 1366 27 9 1992 25.0000000 31.8354185 - 1367 28 9 1992 25.0000000 33.3365841 - 1368 29 9 1992 27.0000000 34.8557200 - 1369 30 9 1992 25.0000000 31.1787884 - 1370 1 10 1992 27.0000000 31.2538248 - 1371 2 10 1992 33.0000000 33.4268785 - 1372 3 10 1992 29.0000000 33.8803845 - 1373 4 10 1992 31.0000000 31.6623610 - 1374 5 10 1992 25.0000000 44.2829431 - 1375 6 10 1992 25.0000000 49.2326421 - 1376 7 10 1992 36.0000000 36.3654104 - 1377 8 10 1992 42.0000000 30.6601137 - 1378 9 10 1992 43.0000000 32.7336662 - 1379 10 10 1992 26.0000000 38.7360889 - 1380 11 10 1992 27.0000000 35.4008032 - 1381 12 10 1992 27.0000000 31.0828097 - 1382 13 10 1992 26.0000000 30.5573314 - 1383 14 10 1992 26.0000000 30.1517441 - 1384 15 10 1992 23.0000000 44.1436393 - 1385 16 10 1992 21.0000000 41.6895955 - 1386 17 10 1992 26.0000000 35.0958941 - 1387 18 10 1992 34.0000000 36.8017516 - 1388 19 10 1992 37.0000000 33.3035322 - 1389 20 10 1992 31.0000000 42.3233387 - 1390 21 10 1992 31.0000000 41.6166676 - 1391 22 10 1992 35.0000000 39.3745536 - 1392 23 10 1992 33.0000000 63.8083959 - 1393 24 10 1992 40.0000000 124.2013245 - 1394 25 10 1992 74.0000000 161.3150473 - 1395 26 10 1992 161.0000000 150.3389317 - 1396 27 10 1992 285.0000000 164.8623421 - 1397 28 10 1992 244.0000000 180.2015084 - 1398 29 10 1992 263.0000000 187.8296651 - 1399 30 10 1992 276.0000000 156.4257868 - 1400 31 10 1992 186.0000000 136.6385363 - 1401 1 11 1992 154.0000000 121.8731603 - 1402 2 11 1992 112.0000000 131.1866504 - 1403 3 11 1992 104.0000000 134.0575139 - 1404 4 11 1992 96.0000000 126.0666627 - 1405 5 11 1992 99.0000000 111.2389396 - 1406 6 11 1992 126.0000000 99.8639393 - 1407 7 11 1992 91.0000000 91.2048547 - 1408 8 11 1992 84.0000000 85.5503249 - 1409 9 11 1992 81.0000000 90.6004457 - 1410 10 11 1992 85.0000000 127.2293108 - 1411 11 11 1992 126.0000000 207.4137352 - 1412 12 11 1992 279.0000000 239.6791417 - 1413 13 11 1992 390.0000000 243.2732169 - 1414 14 11 1992 294.0000000 250.5185341 - 1415 15 11 1992 260.0000000 323.1245386 - 1416 16 11 1992 398.0000000 455.8530311 - 1417 17 11 1992 520.0000000 434.1019632 - 1418 18 11 1992 487.0000000 423.1965965 - 1419 19 11 1992 380.0000000 432.9736382 - 1420 20 11 1992 385.0000000 380.1414345 - 1421 21 11 1992 351.0000000 413.5419229 - 1422 22 11 1992 309.0000000 476.4547033 - 1423 23 11 1992 587.0000000 403.3588198 - 1424 24 11 1992 661.0000000 355.9793962 - 1425 25 11 1992 447.0000000 364.2120947 - 1426 26 11 1992 361.0000000 382.1204438 - 1427 27 11 1992 351.0000000 368.5522663 - 1428 28 11 1992 353.0000000 399.2350274 - 1429 29 11 1992 369.0000000 476.1519594 - 1430 30 11 1992 452.0000000 463.8685447 - 1431 1 12 1992 441.0000000 393.2290950 - 1432 2 12 1992 348.0000000 430.3243555 - 1433 3 12 1992 394.0000000 467.7595425 - 1434 4 12 1992 455.0000000 508.6434999 - 1435 5 12 1992 491.0000000 534.2740274 - 1436 6 12 1992 469.0000000 478.6499898 - 1437 7 12 1992 364.0000000 462.7701693 - 1438 8 12 1992 338.0000000 420.7208685 - 1439 9 12 1992 334.0000000 361.6801071 - 1440 10 12 1992 268.0000000 309.9556040 - 1441 11 12 1992 236.0000000 305.0558328 - 1442 12 12 1992 230.0000000 309.0773767 - 1443 13 12 1992 239.0000000 286.6875238 - 1444 14 12 1992 256.0000000 247.0819360 - 1445 15 12 1992 217.0000000 220.5804519 - 1446 16 12 1992 201.0000000 205.9119149 - 1447 17 12 1992 188.0000000 195.2530938 - 1448 18 12 1992 176.0000000 181.8846354 - 1449 19 12 1992 170.0000000 169.4959415 - 1450 20 12 1992 168.0000000 164.4882436 - 1451 21 12 1992 131.0000000 169.2683977 - 1452 22 12 1992 133.0000000 169.7853231 - 1453 23 12 1992 134.0000000 157.7854017 - 1454 24 12 1992 127.0000000 149.7333134 - 1455 25 12 1992 117.0000000 143.0007430 - 1456 26 12 1992 113.0000000 136.9584118 - 1457 27 12 1992 100.0000000 131.4985282 - 1458 28 12 1992 94.0000000 126.5496329 - 1459 29 12 1992 87.0000000 122.0501784 - 1460 30 12 1992 86.0000000 117.9469959 - 1461 31 12 1992 81.0000000 114.1940260 - 1462 1 1 1993 77.0000000 110.7512613 - 1463 2 1 1993 76.0000000 107.5838632 - 1464 3 1 1993 61.0000000 104.6614202 - 1465 4 1 1993 61.0000000 101.9573248 - 1466 5 1 1993 57.0000000 99.4482464 - 1467 6 1 1993 66.0000000 116.8265667 - 1468 7 1 1993 67.0000000 135.8965880 - 1469 8 1 1993 84.0000000 138.6526973 - 1470 9 1 1993 90.0000000 145.0030830 - 1471 10 1 1993 113.0000000 190.5890213 - 1472 11 1 1993 265.0000000 387.0921144 - 1473 12 1 1993 559.0000000 555.4234285 - 1474 13 1 1993 832.0000000 557.9284156 - 1475 14 1 1993 601.0000000 490.3442569 - 1476 15 1 1993 436.0000000 412.8899894 - 1477 16 1 1993 339.0000000 351.1565224 - 1478 17 1 1993 292.0000000 305.6534675 - 1479 18 1 1993 247.0000000 270.4975767 - 1480 19 1 1993 218.0000000 239.8216751 - 1481 20 1 1993 205.0000000 216.1790199 - 1482 21 1 1993 190.0000000 202.5508803 - 1483 22 1 1993 176.0000000 195.4204577 - 1484 23 1 1993 173.0000000 189.5900406 - 1485 24 1 1993 173.0000000 245.4998525 - 1486 25 1 1993 199.0000000 336.2210776 - 1487 26 1 1993 361.0000000 289.8562595 - 1488 27 1 1993 295.0000000 296.6606286 - 1489 28 1 1993 238.0000000 316.5718044 - 1490 29 1 1993 263.0000000 298.2089714 - 1491 30 1 1993 245.0000000 266.1777885 - 1492 31 1 1993 222.0000000 236.1202889 - 1493 1 2 1993 199.0000000 212.6318660 - 1494 2 2 1993 186.0000000 193.1041202 - 1495 3 2 1993 171.0000000 177.7846762 - 1496 4 2 1993 157.0000000 165.7382226 - 1497 5 2 1993 159.0000000 156.1868752 - 1498 6 2 1993 129.0000000 149.2417167 - 1499 7 2 1993 119.0000000 143.4652486 - 1500 8 2 1993 119.0000000 138.1088029 - 1501 9 2 1993 105.0000000 133.2011150 - 1502 10 2 1993 106.0000000 128.7257208 - 1503 11 2 1993 105.0000000 124.6323805 - 1504 12 2 1993 95.0000000 120.8774514 - 1505 13 2 1993 91.0000000 117.4229271 - 1506 14 2 1993 88.0000000 114.2356296 - 1507 15 2 1993 84.0000000 111.2865297 - 1508 16 2 1993 83.0000000 108.7302620 - 1509 17 2 1993 79.0000000 109.2574734 - 1510 18 2 1993 78.0000000 110.2487721 - 1511 19 2 1993 84.0000000 109.2761578 - 1512 20 2 1993 91.0000000 122.6102639 - 1513 21 2 1993 91.0000000 126.3171526 - 1514 22 2 1993 90.0000000 123.7172209 - 1515 23 2 1993 103.0000000 118.2603526 - 1516 24 2 1993 94.0000000 114.0830542 - 1517 25 2 1993 81.0000000 110.6000850 - 1518 26 2 1993 78.0000000 107.4056776 - 1519 27 2 1993 75.0000000 107.8303199 - 1520 28 2 1993 76.0000000 107.5904185 - 1521 1 3 1993 80.0000000 104.1619835 - 1522 2 3 1993 75.0000000 103.4866064 - 1523 3 3 1993 76.0000000 102.6260771 - 1524 4 3 1993 72.0000000 99.5818353 - 1525 5 3 1993 65.0000000 97.1480072 - 1526 6 3 1993 64.0000000 94.9522073 - 1527 7 3 1993 64.0000000 93.1940987 - 1528 8 3 1993 68.0000000 92.8230304 - 1529 9 3 1993 68.0000000 90.3076859 - 1530 10 3 1993 67.0000000 90.1740172 - 1531 11 3 1993 61.0000000 91.5067412 - 1532 12 3 1993 57.0000000 92.4000161 - 1533 13 3 1993 58.0000000 89.6384867 - 1534 14 3 1993 54.0000000 87.6183698 - 1535 15 3 1993 66.0000000 85.9150622 - 1536 16 3 1993 54.0000000 84.3417583 - 1537 17 3 1993 57.0000000 82.8656863 - 1538 18 3 1993 57.0000000 81.5039975 - 1539 19 3 1993 52.0000000 80.1540006 - 1540 20 3 1993 57.0000000 78.8584240 - 1541 21 3 1993 58.0000000 78.5090607 - 1542 22 3 1993 57.0000000 94.6743471 - 1543 23 3 1993 56.0000000 96.6695569 - 1544 24 3 1993 63.0000000 86.7744131 - 1545 25 3 1993 76.0000000 84.8608180 - 1546 26 3 1993 56.0000000 83.0656261 - 1547 27 3 1993 59.0000000 81.3769812 - 1548 28 3 1993 59.0000000 79.7849409 - 1549 29 3 1993 54.0000000 78.2806245 - 1550 30 3 1993 48.0000000 76.8560881 - 1551 31 3 1993 55.0000000 75.5042168 - 1552 1 4 1993 48.0000000 76.0168187 - 1553 2 4 1993 53.0000000 78.8075017 - 1554 3 4 1993 47.0000000 76.6752084 - 1555 4 4 1993 59.0000000 83.1621783 - 1556 5 4 1993 53.0000000 102.2721171 - 1557 6 4 1993 64.0000000 97.1774850 - 1558 7 4 1993 63.0000000 87.8481005 - 1559 8 4 1993 75.0000000 86.1570662 - 1560 9 4 1993 64.0000000 83.5568936 - 1561 10 4 1993 59.0000000 85.8811409 - 1562 11 4 1993 60.0000000 91.5849476 - 1563 12 4 1993 63.0000000 89.2093137 - 1564 13 4 1993 69.0000000 87.8317872 - 1565 14 4 1993 79.0000000 86.1896812 - 1566 15 4 1993 82.0000000 83.8088557 - 1567 16 4 1993 68.0000000 82.3774739 - 1568 17 4 1993 56.0000000 80.3227831 - 1569 18 4 1993 59.0000000 78.5048055 - 1570 19 4 1993 61.0000000 76.7242182 - 1571 20 4 1993 62.0000000 75.0341956 - 1572 21 4 1993 57.0000000 73.4477149 - 1573 22 4 1993 53.0000000 71.9583913 - 1574 23 4 1993 47.0000000 70.5529719 - 1575 24 4 1993 46.0000000 69.2221809 - 1576 25 4 1993 47.0000000 67.9617727 - 1577 26 4 1993 45.0000000 66.7654989 - 1578 27 4 1993 43.0000000 65.6277521 - 1579 28 4 1993 41.0000000 64.5451216 - 1580 29 4 1993 38.0000000 63.5185641 - 1581 30 4 1993 39.0000000 62.9399210 - 1582 1 5 1993 40.0000000 62.1074312 - 1583 2 5 1993 41.0000000 63.0734994 - 1584 3 5 1993 45.0000000 61.5683271 - 1585 4 5 1993 49.0000000 60.0200745 - 1586 5 5 1993 40.0000000 59.1481421 - 1587 6 5 1993 43.0000000 58.4262630 - 1588 7 5 1993 38.0000000 58.0551938 - 1589 8 5 1993 38.0000000 58.0769395 - 1590 9 5 1993 43.0000000 56.9660423 - 1591 10 5 1993 44.0000000 56.3943535 - 1592 11 5 1993 41.0000000 56.3058568 - 1593 12 5 1993 51.0000000 64.9793113 - 1594 13 5 1993 63.0000000 100.7186333 - 1595 14 5 1993 68.0000000 70.0144980 - 1596 15 5 1993 77.0000000 59.3242060 - 1597 16 5 1993 77.0000000 58.1576434 - 1598 17 5 1993 59.0000000 57.0359441 - 1599 18 5 1993 49.0000000 55.9880475 - 1600 19 5 1993 43.0000000 61.3872236 - 1601 20 5 1993 44.0000000 69.2846155 - 1602 21 5 1993 48.0000000 63.8073117 - 1603 22 5 1993 44.0000000 56.4986473 - 1604 23 5 1993 46.0000000 55.4080480 - 1605 24 5 1993 40.0000000 54.3797301 - 1606 25 5 1993 43.0000000 53.4070158 - 1607 26 5 1993 30.0000000 53.1925647 - 1608 27 5 1993 45.0000000 63.5605576 - 1609 28 5 1993 43.0000000 66.5595064 - 1610 29 5 1993 44.0000000 56.5828550 - 1611 30 5 1993 54.0000000 59.1190029 - 1612 31 5 1993 56.0000000 58.0626296 - 1613 1 6 1993 44.0000000 52.3633198 - 1614 2 6 1993 43.0000000 53.8905576 - 1615 3 6 1993 33.0000000 59.0830145 - 1616 4 6 1993 45.0000000 52.9353089 - 1617 5 6 1993 46.0000000 50.9647171 - 1618 6 6 1993 42.0000000 50.0379886 - 1619 7 6 1993 40.0000000 49.1588448 - 1620 8 6 1993 30.0000000 48.3228289 - 1621 9 6 1993 31.0000000 47.7272593 - 1622 10 6 1993 32.0000000 47.2708997 - 1623 11 6 1993 25.0000000 47.4422024 - 1624 12 6 1993 33.0000000 48.8565672 - 1625 13 6 1993 29.0000000 46.7518666 - 1626 14 6 1993 40.0000000 48.6433826 - 1627 15 6 1993 42.0000000 50.2139265 - 1628 16 6 1993 37.0000000 47.3847216 - 1629 17 6 1993 46.0000000 45.8675383 - 1630 18 6 1993 47.0000000 44.4177825 - 1631 19 6 1993 50.0000000 46.7560220 - 1632 20 6 1993 43.0000000 73.1442695 - 1633 21 6 1993 69.0000000 61.5711771 - 1634 22 6 1993 61.0000000 67.9784744 - 1635 23 6 1993 67.0000000 75.4368707 - 1636 24 6 1993 77.0000000 56.7675169 - 1637 25 6 1993 87.0000000 54.9948108 - 1638 26 6 1993 55.0000000 53.5687626 - 1639 27 6 1993 43.0000000 52.2385242 - 1640 28 6 1993 40.0000000 50.9948937 - 1641 29 6 1993 30.0000000 49.8297960 - 1642 30 6 1993 40.0000000 48.7360047 - 1643 1 7 1993 40.0000000 50.0041926 - 1644 2 7 1993 27.0000000 49.3711846 - 1645 3 7 1993 34.0000000 46.6002209 - 1646 4 7 1993 30.0000000 45.6704351 - 1647 5 7 1993 31.0000000 44.9069863 - 1648 6 7 1993 27.0000000 43.9674006 - 1649 7 7 1993 31.0000000 43.1788815 - 1650 8 7 1993 26.0000000 42.4293274 - 1651 9 7 1993 23.0000000 42.6590897 - 1652 10 7 1993 24.0000000 43.3611649 - 1653 11 7 1993 25.0000000 47.5732181 - 1654 12 7 1993 34.0000000 56.3365289 - 1655 13 7 1993 40.0000000 53.5458966 - 1656 14 7 1993 41.0000000 73.3088759 - 1657 15 7 1993 46.0000000 58.4941134 - 1658 16 7 1993 39.0000000 45.2022873 - 1659 17 7 1993 43.0000000 44.6639974 - 1660 18 7 1993 35.0000000 44.2762459 - 1661 19 7 1993 49.0000000 63.6121204 - 1662 20 7 1993 38.0000000 61.2658778 - 1663 21 7 1993 41.0000000 56.4600078 - 1664 22 7 1993 45.0000000 51.5894009 - 1665 23 7 1993 41.0000000 45.2211627 - 1666 24 7 1993 42.0000000 44.2349062 - 1667 25 7 1993 40.0000000 43.3235878 - 1668 26 7 1993 35.0000000 42.4472738 - 1669 27 7 1993 40.0000000 66.8321354 - 1670 28 7 1993 40.0000000 54.8181041 - 1671 29 7 1993 36.0000000 42.8266445 - 1672 30 7 1993 40.0000000 98.0240574 - 1673 31 7 1993 61.0000000 74.8410467 - 1674 1 8 1993 36.0000000 49.0207662 - 1675 2 8 1993 46.0000000 47.6032548 - 1676 3 8 1993 32.0000000 46.2908585 - 1677 4 8 1993 38.0000000 45.0721190 - 1678 5 8 1993 32.0000000 43.9413273 - 1679 6 8 1993 25.0000000 42.8943242 - 1680 7 8 1993 26.0000000 41.9039619 - 1681 8 8 1993 29.0000000 40.9757490 - 1682 9 8 1993 29.0000000 49.0298419 - 1683 10 8 1993 28.0000000 50.4523560 - 1684 11 8 1993 37.0000000 43.2873140 - 1685 12 8 1993 40.0000000 39.9561925 - 1686 13 8 1993 49.0000000 39.1274050 - 1687 14 8 1993 32.0000000 40.3505990 - 1688 15 8 1993 37.0000000 38.8723609 - 1689 16 8 1993 37.0000000 37.2566222 - 1690 17 8 1993 27.0000000 36.5680391 - 1691 18 8 1993 24.0000000 35.9145267 - 1692 19 8 1993 24.0000000 35.2930134 - 1693 20 8 1993 22.0000000 34.7007934 - 1694 21 8 1993 21.0000000 34.1354269 - 1695 22 8 1993 16.0000000 35.3864482 - 1696 23 8 1993 21.0000000 38.5125036 - 1697 24 8 1993 27.0000000 35.1993005 - 1698 25 8 1993 26.0000000 32.9036113 - 1699 26 8 1993 23.0000000 32.3998950 - 1700 27 8 1993 21.0000000 35.4459663 - 1701 28 8 1993 28.0000000 36.6242469 - 1702 29 8 1993 17.0000000 31.9139845 - 1703 30 8 1993 24.0000000 31.4352638 - 1704 31 8 1993 25.0000000 30.9752775 - 1705 1 9 1993 25.0000000 30.5320927 - 1706 2 9 1993 19.0000000 30.1044806 - 1707 3 9 1993 17.0000000 33.2136916 - 1708 4 9 1993 16.0000000 37.5065695 - 1709 5 9 1993 19.0000000 30.5512411 - 1710 6 9 1993 23.0000000 29.6406743 - 1711 7 9 1993 25.0000000 52.6935573 - 1712 8 9 1993 34.0000000 44.3549147 - 1713 9 9 1993 31.0000000 57.2542107 - 1714 10 9 1993 35.0000000 80.5034888 - 1715 11 9 1993 53.0000000 103.9191034 - 1716 12 9 1993 71.0000000 94.2194735 - 1717 13 9 1993 74.0000000 123.6014656 - 1718 14 9 1993 87.0000000 132.4786550 - 1719 15 9 1993 173.0000000 122.1875755 - 1720 16 9 1993 117.0000000 92.8433015 - 1721 17 9 1993 93.0000000 79.2598716 - 1722 18 9 1993 77.0000000 73.5972728 - 1723 19 9 1993 62.0000000 69.3377101 - 1724 20 9 1993 54.0000000 65.5987717 - 1725 21 9 1993 48.0000000 65.2218148 - 1726 22 9 1993 46.0000000 87.6195417 - 1727 23 9 1993 55.0000000 91.7492062 - 1728 24 9 1993 66.0000000 94.5316085 - 1729 25 9 1993 64.0000000 90.1363598 - 1730 26 9 1993 52.0000000 78.9650811 - 1731 27 9 1993 68.0000000 74.2404229 - 1732 28 9 1993 69.0000000 79.7910983 - 1733 29 9 1993 62.0000000 77.9374386 - 1734 30 9 1993 76.0000000 73.6533286 - 1735 1 10 1993 72.0000000 99.5013339 - 1736 2 10 1993 68.0000000 101.0642602 - 1737 3 10 1993 72.0000000 99.3646043 - 1738 4 10 1993 78.0000000 106.3801283 - 1739 5 10 1993 116.0000000 175.9695695 - 1740 6 10 1993 131.0000000 178.3374962 - 1741 7 10 1993 180.0000000 156.5938113 - 1742 8 10 1993 203.0000000 159.8732885 - 1743 9 10 1993 164.0000000 169.7736582 - 1744 10 10 1993 178.0000000 189.2656217 - 1745 11 10 1993 161.0000000 222.6395337 - 1746 12 10 1993 287.0000000 226.9104373 - 1747 13 10 1993 360.0000000 292.8901651 - 1748 14 10 1993 374.0000000 292.7891975 - 1749 15 10 1993 297.0000000 260.0311070 - 1750 16 10 1993 247.0000000 268.5634126 - 1751 17 10 1993 273.0000000 273.6071912 - 1752 18 10 1993 261.0000000 246.5690291 - 1753 19 10 1993 265.0000000 222.0210625 - 1754 20 10 1993 230.0000000 193.4715111 - 1755 21 10 1993 199.0000000 173.8911640 - 1756 22 10 1993 173.0000000 169.1430137 - 1757 23 10 1993 182.0000000 188.6315002 - 1758 24 10 1993 203.0000000 191.6620267 - 1759 25 10 1993 213.0000000 169.9793850 - 1760 26 10 1993 180.0000000 150.2146092 - 1761 27 10 1993 154.0000000 134.8444796 - 1762 28 10 1993 118.0000000 123.4099040 - 1763 29 10 1993 112.0000000 115.1985493 - 1764 30 10 1993 98.0000000 109.3653561 - 1765 31 10 1993 97.0000000 104.1907690 - 1766 1 11 1993 91.0000000 99.5221811 - 1767 2 11 1993 85.0000000 95.2984279 - 1768 3 11 1993 75.0000000 91.4666866 - 1769 4 11 1993 76.0000000 87.9812000 - 1770 5 11 1993 78.0000000 84.8022243 - 1771 6 11 1993 72.0000000 81.9712802 - 1772 7 11 1993 76.0000000 82.1806499 - 1773 8 11 1993 69.0000000 79.7626809 - 1774 9 11 1993 66.0000000 77.4803651 - 1775 10 11 1993 71.0000000 78.0037432 - 1776 11 11 1993 64.0000000 88.0881973 - 1777 12 11 1993 67.0000000 91.1459150 - 1778 13 11 1993 80.0000000 91.1444664 - 1779 14 11 1993 78.0000000 119.9614994 - 1780 15 11 1993 80.0000000 121.3357170 - 1781 16 11 1993 86.0000000 110.7392348 - 1782 17 11 1993 125.0000000 103.0468850 - 1783 18 11 1993 96.0000000 98.4823694 - 1784 19 11 1993 82.0000000 94.3493519 - 1785 20 11 1993 77.0000000 90.5968641 - 1786 21 11 1993 67.0000000 87.1807699 - 1787 22 11 1993 71.0000000 84.0626991 - 1788 23 11 1993 61.0000000 81.2092086 - 1789 24 11 1993 42.0000000 78.5910795 - 1790 25 11 1993 63.0000000 76.5562380 - 1791 26 11 1993 57.0000000 75.7431246 - 1792 27 11 1993 58.0000000 73.0304813 - 1793 28 11 1993 49.0000000 71.0673493 - 1794 29 11 1993 50.0000000 69.2438032 - 1795 30 11 1993 55.0000000 67.5457715 - 1796 1 12 1993 54.0000000 65.9608458 - 1797 2 12 1993 54.0000000 72.5175387 - 1798 3 12 1993 50.0000000 70.2952465 - 1799 4 12 1993 51.0000000 72.6691740 - 1800 5 12 1993 62.0000000 69.3663863 - 1801 6 12 1993 62.0000000 66.8057861 - 1802 7 12 1993 71.0000000 98.3175578 - 1803 8 12 1993 79.0000000 159.7770782 - 1804 9 12 1993 153.0000000 179.6526959 - 1805 10 12 1993 291.0000000 242.3090002 - 1806 11 12 1993 332.0000000 317.3685831 - 1807 12 12 1993 465.0000000 370.6036716 - 1808 13 12 1993 518.0000000 427.2036936 - 1809 14 12 1993 539.0000000 454.7485489 - 1810 15 12 1993 559.0000000 459.4138481 - 1811 16 12 1993 500.0000000 521.8489459 - 1812 17 12 1993 526.0000000 553.7394225 - 1813 18 12 1993 583.0000000 568.0876937 - 1814 19 12 1993 677.0000000 645.4257238 - 1815 20 12 1993 781.0000000 943.8106329 - 1816 21 12 1993 1180.0000000 1057.8486602 - 1817 22 12 1993 1460.0000000 1052.5284165 - 1818 23 12 1993 1600.0000000 1086.8754165 - 1819 24 12 1993 1410.0000000 1071.6802081 - 1820 25 12 1993 1230.0000000 923.4042186 - 1821 26 12 1993 1070.0000000 769.3277403 - 1822 27 12 1993 746.0000000 648.3087417 - 1823 28 12 1993 542.0000000 559.5622235 - 1824 29 12 1993 492.0000000 557.0504284 - 1825 30 12 1993 491.0000000 627.1328575 - 1826 31 12 1993 617.0000000 803.9717919 + 1 1 1 1990 157.0000000 217.3866465 + 2 2 1 1990 129.0000000 252.6234139 + 3 3 1 1990 117.0000000 205.7266589 + 4 4 1 1990 111.0000000 176.0371333 + 5 5 1 1990 112.0000000 156.9556126 + 6 6 1 1990 93.0000000 154.1915431 + 7 7 1 1990 87.0000000 137.2824153 + 8 8 1 1990 84.0000000 132.6655431 + 9 9 1 1990 80.0000000 134.5217753 + 10 10 1 1990 78.0000000 119.3643415 + 11 11 1 1990 78.0000000 108.9793938 + 12 12 1 1990 77.0000000 104.3433920 + 13 13 1 1990 76.0000000 102.7841199 + 14 14 1 1990 73.0000000 102.6565438 + 15 15 1 1990 66.0000000 114.9583071 + 16 16 1 1990 76.0000000 107.3045993 + 17 17 1 1990 73.0000000 102.7181679 + 18 18 1 1990 71.0000000 95.7069625 + 19 19 1 1990 90.0000000 91.5996763 + 20 20 1 1990 82.0000000 92.5361958 + 21 21 1 1990 80.0000000 88.2231303 + 22 22 1 1990 81.0000000 84.7802753 + 23 23 1 1990 97.0000000 160.3425958 + 24 24 1 1990 198.0000000 132.8868762 + 25 25 1 1990 392.0000000 161.0323731 + 26 26 1 1990 519.0000000 129.2536718 + 27 27 1 1990 565.0000000 106.0912284 + 28 28 1 1990 331.0000000 108.0783728 + 29 29 1 1990 293.0000000 104.6542820 + 30 30 1 1990 302.0000000 92.5627550 + 31 31 1 1990 233.0000000 89.1178170 + 32 1 2 1990 198.0000000 105.1266125 + 33 2 2 1990 183.0000000 109.4036171 + 34 3 2 1990 206.0000000 101.6381683 + 35 4 2 1990 215.0000000 89.0596869 + 36 5 2 1990 183.0000000 85.4450898 + 37 6 2 1990 159.0000000 82.5942551 + 38 7 2 1990 167.0000000 80.1392534 + 39 8 2 1990 138.0000000 79.4072365 + 40 9 2 1990 126.0000000 79.6049295 + 41 10 2 1990 131.0000000 143.6116409 + 42 11 2 1990 173.0000000 144.8214763 + 43 12 2 1990 240.0000000 153.6337331 + 44 13 2 1990 270.0000000 228.5595184 + 45 14 2 1990 458.0000000 428.1678437 + 46 15 2 1990 996.0000000 548.4548770 + 47 16 2 1990 1370.0000000 443.3457673 + 48 17 2 1990 1540.0000000 335.6290996 + 49 18 2 1990 1210.0000000 266.6162359 + 50 19 2 1990 616.0000000 221.2722747 + 51 20 2 1990 465.0000000 191.8738663 + 52 21 2 1990 373.0000000 170.2592803 + 53 22 2 1990 298.0000000 153.5701440 + 54 23 2 1990 270.0000000 140.3185850 + 55 24 2 1990 234.0000000 129.5601974 + 56 25 2 1990 218.0000000 125.5921823 + 57 26 2 1990 203.0000000 225.4282624 + 58 27 2 1990 314.0000000 365.0899454 + 59 28 2 1990 520.0000000 533.6319974 + 60 1 3 1990 689.0000000 605.8879833 + 61 2 3 1990 777.0000000 476.7852955 + 62 3 3 1990 584.0000000 355.8204846 + 63 4 3 1990 429.0000000 279.5142774 + 64 5 3 1990 365.0000000 233.6075346 + 65 6 3 1990 281.0000000 202.7307001 + 66 7 3 1990 257.0000000 179.9027021 + 67 8 3 1990 231.0000000 162.2104237 + 68 9 3 1990 211.0000000 148.1281159 + 69 10 3 1990 191.0000000 136.6835635 + 70 11 3 1990 182.0000000 127.2279399 + 71 12 3 1990 173.0000000 119.2784207 + 72 13 3 1990 159.0000000 112.7915928 + 73 14 3 1990 153.0000000 109.1317788 + 74 15 3 1990 141.0000000 106.4931148 + 75 16 3 1990 136.0000000 101.3244508 + 76 17 3 1990 130.0000000 96.9390848 + 77 18 3 1990 123.0000000 93.0792512 + 78 19 3 1990 115.0000000 89.6587592 + 79 20 3 1990 113.0000000 86.9906044 + 80 21 3 1990 102.0000000 84.6984747 + 81 22 3 1990 105.0000000 82.7998918 + 82 23 3 1990 106.0000000 80.8712651 + 83 24 3 1990 87.0000000 78.8776009 + 84 25 3 1990 80.0000000 78.0442322 + 85 26 3 1990 84.0000000 76.1350962 + 86 27 3 1990 82.0000000 74.4250589 + 87 28 3 1990 91.0000000 84.6118188 + 88 29 3 1990 97.0000000 95.3831236 + 89 30 3 1990 110.0000000 86.4408304 + 90 31 3 1990 97.0000000 82.5750653 + 91 1 4 1990 93.0000000 79.4932563 + 92 2 4 1990 85.0000000 76.7913228 + 93 3 4 1990 84.0000000 81.2308907 + 94 4 4 1990 81.0000000 87.0431303 + 95 5 4 1990 81.0000000 79.7395744 + 96 6 4 1990 76.0000000 78.5258528 + 97 7 4 1990 72.0000000 75.4472423 + 98 8 4 1990 68.0000000 72.9859073 + 99 9 4 1990 72.0000000 70.7975518 + 100 10 4 1990 65.0000000 68.8731187 + 101 11 4 1990 62.0000000 67.8808763 + 102 12 4 1990 62.0000000 69.6215911 + 103 13 4 1990 65.0000000 75.3969952 + 104 14 4 1990 68.0000000 100.4445333 + 105 15 4 1990 75.0000000 109.3022260 + 106 16 4 1990 90.0000000 106.3788451 + 107 17 4 1990 92.0000000 102.6311868 + 108 18 4 1990 94.0000000 103.6703367 + 109 19 4 1990 110.0000000 96.3525340 + 110 20 4 1990 99.0000000 90.2272221 + 111 21 4 1990 86.0000000 85.2076317 + 112 22 4 1990 86.0000000 89.1311958 + 113 23 4 1990 86.0000000 97.2291908 + 114 24 4 1990 88.0000000 100.1869464 + 115 25 4 1990 93.0000000 92.0964922 + 116 26 4 1990 99.0000000 86.3498699 + 117 27 4 1990 86.0000000 82.0811504 + 118 28 4 1990 74.0000000 78.5489982 + 119 29 4 1990 72.0000000 74.9862253 + 120 30 4 1990 77.0000000 71.7993644 + 121 1 5 1990 56.0000000 69.0038041 + 122 2 5 1990 64.0000000 66.5322404 + 123 3 5 1990 58.0000000 64.3316030 + 124 4 5 1990 50.0000000 62.3594473 + 125 5 5 1990 50.0000000 60.5814120 + 126 6 5 1990 50.0000000 58.9693829 + 127 7 5 1990 50.0000000 57.5379258 + 128 8 5 1990 53.0000000 57.3331122 + 129 9 5 1990 62.0000000 56.4854149 + 130 10 5 1990 64.0000000 61.7945702 + 131 11 5 1990 65.0000000 63.2990364 + 132 12 5 1990 75.0000000 56.6825211 + 133 13 5 1990 71.0000000 54.9163400 + 134 14 5 1990 63.0000000 53.6799034 + 135 15 5 1990 61.0000000 52.7457583 + 136 16 5 1990 49.0000000 51.8103275 + 137 17 5 1990 46.0000000 50.5738850 + 138 18 5 1990 46.0000000 49.5541378 + 139 19 5 1990 48.0000000 48.6106444 + 140 20 5 1990 41.0000000 47.7918825 + 141 21 5 1990 45.0000000 53.8290708 + 142 22 5 1990 52.0000000 54.7071034 + 143 23 5 1990 50.0000000 54.1911282 + 144 24 5 1990 56.0000000 58.8740131 + 145 25 5 1990 41.0000000 55.5244453 + 146 26 5 1990 40.0000000 50.4651712 + 147 27 5 1990 39.0000000 48.9148897 + 148 28 5 1990 39.0000000 47.5617219 + 149 29 5 1990 33.0000000 46.3642944 + 150 30 5 1990 37.0000000 45.2922947 + 151 31 5 1990 30.0000000 44.3227855 + 152 1 6 1990 37.0000000 49.4553178 + 153 2 6 1990 36.0000000 51.5430777 + 154 3 6 1990 40.0000000 82.5136684 + 155 4 6 1990 45.0000000 66.5035882 + 156 5 6 1990 39.0000000 51.4780991 + 157 6 6 1990 48.0000000 49.3664536 + 158 7 6 1990 39.0000000 98.9373457 + 159 8 6 1990 49.0000000 119.7213403 + 160 9 6 1990 84.0000000 107.4959169 + 161 10 6 1990 91.0000000 96.2121521 + 162 11 6 1990 80.0000000 81.3732014 + 163 12 6 1990 66.0000000 73.7183730 + 164 13 6 1990 53.0000000 68.0334140 + 165 14 6 1990 64.0000000 63.3560337 + 166 15 6 1990 55.0000000 59.2783096 + 167 16 6 1990 54.0000000 55.9641638 + 168 17 6 1990 42.0000000 53.1567819 + 169 18 6 1990 48.0000000 51.0355542 + 170 19 6 1990 48.0000000 68.9031631 + 171 20 6 1990 60.0000000 92.2946910 + 172 21 6 1990 75.0000000 91.0927083 + 173 22 6 1990 78.0000000 77.9703926 + 174 23 6 1990 66.0000000 71.9653686 + 175 24 6 1990 63.0000000 65.9902503 + 176 25 6 1990 52.0000000 61.5207433 + 177 26 6 1990 49.0000000 57.8828765 + 178 27 6 1990 44.0000000 63.5172605 + 179 28 6 1990 51.0000000 62.8642603 + 180 29 6 1990 61.0000000 83.6410413 + 181 30 6 1990 81.0000000 128.0378035 + 182 1 7 1990 79.0000000 109.3074263 + 183 2 7 1990 92.0000000 88.4714006 + 184 3 7 1990 72.0000000 91.2309118 + 185 4 7 1990 58.0000000 113.4840348 + 186 5 7 1990 69.0000000 154.9486628 + 187 6 7 1990 94.0000000 150.9189110 + 188 7 7 1990 199.0000000 138.0651604 + 189 8 7 1990 133.0000000 138.2751303 + 190 9 7 1990 124.0000000 114.6867351 + 191 10 7 1990 123.0000000 101.2485792 + 192 11 7 1990 99.0000000 90.8179146 + 193 12 7 1990 88.0000000 82.4996500 + 194 13 7 1990 84.0000000 75.7229661 + 195 14 7 1990 72.0000000 70.1063094 + 196 15 7 1990 55.0000000 65.3847075 + 197 16 7 1990 65.0000000 61.3681501 + 198 17 7 1990 50.0000000 57.9166218 + 199 18 7 1990 50.0000000 54.9245190 + 200 19 7 1990 46.0000000 52.3105824 + 201 20 7 1990 44.0000000 50.0111955 + 202 21 7 1990 42.0000000 47.9758024 + 203 22 7 1990 37.0000000 46.1637007 + 204 23 7 1990 38.0000000 44.5417462 + 205 24 7 1990 44.0000000 43.0826807 + 206 25 7 1990 30.0000000 41.7638905 + 207 26 7 1990 26.0000000 40.5664708 + 208 27 7 1990 31.0000000 39.4745103 + 209 28 7 1990 33.0000000 41.2710895 + 210 29 7 1990 42.0000000 39.1548321 + 211 30 7 1990 36.0000000 37.1661664 + 212 31 7 1990 34.0000000 36.3250176 + 213 1 8 1990 25.0000000 35.5469305 + 214 2 8 1990 22.0000000 34.8242578 + 215 3 8 1990 28.0000000 34.1504439 + 216 4 8 1990 25.0000000 33.5198459 + 217 5 8 1990 19.0000000 32.9275877 + 218 6 8 1990 22.0000000 32.3694418 + 219 7 8 1990 19.0000000 31.8417313 + 220 8 8 1990 22.0000000 31.3412492 + 221 9 8 1990 19.0000000 30.8651911 + 222 10 8 1990 20.0000000 30.4110988 + 223 11 8 1990 19.0000000 29.9768123 + 224 12 8 1990 19.0000000 29.5604303 + 225 13 8 1990 22.0000000 33.6809336 + 226 14 8 1990 36.0000000 56.0757432 + 227 15 8 1990 31.0000000 47.7761723 + 228 16 8 1990 30.0000000 41.8972639 + 229 17 8 1990 28.0000000 39.1698445 + 230 18 8 1990 34.0000000 32.2116391 + 231 19 8 1990 21.0000000 31.2918497 + 232 20 8 1990 30.0000000 30.4750057 + 233 21 8 1990 22.0000000 29.7422258 + 234 22 8 1990 21.0000000 29.0790442 + 235 23 8 1990 23.0000000 28.4740271 + 236 24 8 1990 20.0000000 27.9180366 + 237 25 8 1990 29.0000000 27.4048371 + 238 26 8 1990 20.0000000 27.3363205 + 239 27 8 1990 22.0000000 28.6083909 + 240 28 8 1990 23.0000000 26.7540321 + 241 29 8 1990 35.0000000 25.8725943 + 242 30 8 1990 51.0000000 115.8937677 + 243 31 8 1990 80.0000000 126.9546295 + 244 1 9 1990 56.0000000 70.4754821 + 245 2 9 1990 33.0000000 54.9801350 + 246 3 9 1990 27.0000000 48.6330916 + 247 4 9 1990 27.0000000 48.0920987 + 248 5 9 1990 28.0000000 46.1321545 + 249 6 9 1990 26.0000000 39.6390273 + 250 7 9 1990 24.0000000 43.8564335 + 251 8 9 1990 33.0000000 40.9841846 + 252 9 9 1990 26.0000000 35.8914765 + 253 10 9 1990 27.0000000 33.8752406 + 254 11 9 1990 22.0000000 32.1768013 + 255 12 9 1990 22.0000000 30.7276402 + 256 13 9 1990 21.0000000 29.4772131 + 257 14 9 1990 22.0000000 28.3873063 + 258 15 9 1990 22.0000000 27.4285456 + 259 16 9 1990 22.0000000 26.5780220 + 260 17 9 1990 20.0000000 25.8176382 + 261 18 9 1990 22.0000000 25.1329344 + 262 19 9 1990 16.0000000 24.5122393 + 263 20 9 1990 22.0000000 23.9460453 + 264 21 9 1990 19.0000000 32.3054804 + 265 22 9 1990 32.0000000 104.7105474 + 266 23 9 1990 27.0000000 98.9292907 + 267 24 9 1990 45.0000000 78.3003514 + 268 25 9 1990 42.0000000 60.7171244 + 269 26 9 1990 39.0000000 52.1340338 + 270 27 9 1990 30.0000000 46.9029859 + 271 28 9 1990 28.0000000 42.7553763 + 272 29 9 1990 30.0000000 39.3980804 + 273 30 9 1990 30.0000000 94.6851459 + 274 1 10 1990 56.0000000 175.3385728 + 275 2 10 1990 72.0000000 166.9207582 + 276 3 10 1990 73.0000000 152.7503552 + 277 4 10 1990 68.0000000 145.6908213 + 278 5 10 1990 53.0000000 117.1277928 + 279 6 10 1990 42.0000000 98.4432649 + 280 7 10 1990 33.0000000 85.2310185 + 281 8 10 1990 42.0000000 75.1428935 + 282 9 10 1990 34.0000000 67.1983448 + 283 10 10 1990 36.0000000 60.7824482 + 284 11 10 1990 36.0000000 55.5172677 + 285 12 10 1990 28.0000000 51.1310540 + 286 13 10 1990 32.0000000 47.4311275 + 287 14 10 1990 27.0000000 44.2769439 + 288 15 10 1990 35.0000000 42.0319725 + 289 16 10 1990 42.0000000 42.8977704 + 290 17 10 1990 35.0000000 53.5317612 + 291 18 10 1990 39.0000000 57.0036240 + 292 19 10 1990 34.0000000 46.8439932 + 293 20 10 1990 32.0000000 43.4496677 + 294 21 10 1990 34.0000000 40.6057386 + 295 22 10 1990 27.0000000 38.1881060 + 296 23 10 1990 31.0000000 36.1104427 + 297 24 10 1990 28.0000000 34.3081905 + 298 25 10 1990 25.0000000 33.9117685 + 299 26 10 1990 29.0000000 54.2951728 + 300 27 10 1990 31.0000000 68.2480175 + 301 28 10 1990 65.0000000 238.6042777 + 302 29 10 1990 69.0000000 373.9582064 + 303 30 10 1990 157.0000000 330.4790153 + 304 31 10 1990 190.0000000 250.2604148 + 305 1 11 1990 115.0000000 225.0036938 + 306 2 11 1990 104.0000000 221.5878302 + 307 3 11 1990 100.0000000 220.9597723 + 308 4 11 1990 131.0000000 205.4679242 + 309 5 11 1990 130.0000000 189.0176400 + 310 6 11 1990 115.0000000 155.8710776 + 311 7 11 1990 102.0000000 133.0874823 + 312 8 11 1990 95.0000000 116.0973921 + 313 9 11 1990 81.0000000 102.8262257 + 314 10 11 1990 66.0000000 110.7181828 + 315 11 11 1990 67.0000000 160.9748497 + 316 12 11 1990 74.0000000 185.9182607 + 317 13 11 1990 109.0000000 171.8924256 + 318 14 11 1990 92.0000000 210.6787945 + 319 15 11 1990 92.0000000 237.0865027 + 320 16 11 1990 155.0000000 205.3267264 + 321 17 11 1990 159.0000000 183.7873373 + 322 18 11 1990 131.0000000 205.5766030 + 323 19 11 1990 161.0000000 226.9993782 + 324 20 11 1990 196.0000000 388.7982386 + 325 21 11 1990 336.0000000 557.7878709 + 326 22 11 1990 566.0000000 444.5535825 + 327 23 11 1990 373.0000000 427.6211630 + 328 24 11 1990 293.0000000 375.8262454 + 329 25 11 1990 264.0000000 346.2382856 + 330 26 11 1990 226.0000000 298.0780515 + 331 27 11 1990 201.0000000 231.4551537 + 332 28 11 1990 180.0000000 192.3749572 + 333 29 11 1990 161.0000000 185.7100362 + 334 30 11 1990 149.0000000 185.9744006 + 335 1 12 1990 134.0000000 157.4545760 + 336 2 12 1990 113.0000000 137.4553666 + 337 3 12 1990 99.0000000 122.1930163 + 338 4 12 1990 107.0000000 110.5258177 + 339 5 12 1990 99.0000000 100.8334117 + 340 6 12 1990 89.0000000 92.5575733 + 341 7 12 1990 77.0000000 85.6814027 + 342 8 12 1990 71.0000000 79.8854464 + 343 9 12 1990 68.0000000 82.1794177 + 344 10 12 1990 73.0000000 76.4918964 + 345 11 12 1990 84.0000000 71.9019025 + 346 12 12 1990 88.0000000 112.7481144 + 347 13 12 1990 92.0000000 161.7636483 + 348 14 12 1990 128.0000000 158.7022080 + 349 15 12 1990 136.0000000 130.5044321 + 350 16 12 1990 114.0000000 108.1716958 + 351 17 12 1990 101.0000000 93.0936855 + 352 18 12 1990 93.0000000 82.2710602 + 353 19 12 1990 85.0000000 74.1891007 + 354 20 12 1990 81.0000000 78.3403558 + 355 21 12 1990 106.0000000 158.1481481 + 356 22 12 1990 159.0000000 247.2122671 + 357 23 12 1990 250.0000000 251.7641080 + 358 24 12 1990 298.0000000 214.1122509 + 359 25 12 1990 261.0000000 257.6822589 + 360 26 12 1990 228.0000000 503.7665476 + 361 27 12 1990 409.0000000 632.7219954 + 362 28 12 1990 486.0000000 587.4961054 + 363 29 12 1990 440.0000000 660.7722405 + 364 30 12 1990 486.0000000 849.1990838 + 365 31 12 1990 774.0000000 923.9358321 + 366 1 1 1991 889.0000000 921.4785403 + 367 2 1 1991 863.0000000 973.7777834 + 368 3 1 1991 875.0000000 1083.7125022 + 369 4 1 1991 932.0000000 876.7009619 + 370 5 1 1991 826.0000000 766.7916091 + 371 6 1 1991 731.0000000 699.7789932 + 372 7 1 1991 613.0000000 637.1746644 + 373 8 1 1991 610.0000000 641.8379839 + 374 9 1 1991 686.0000000 551.0301423 + 375 10 1 1991 556.0000000 642.5268254 + 376 11 1 1991 669.0000000 749.2588590 + 377 12 1 1991 828.0000000 655.1926590 + 378 13 1 1991 735.0000000 453.1792430 + 379 14 1 1991 513.0000000 337.0440741 + 380 15 1 1991 411.0000000 270.3491798 + 381 16 1 1991 345.0000000 225.8999536 + 382 17 1 1991 293.0000000 194.2019317 + 383 18 1 1991 251.0000000 170.6128838 + 384 19 1 1991 222.0000000 152.5253479 + 385 20 1 1991 215.0000000 138.7112118 + 386 21 1 1991 213.0000000 143.0208571 + 387 22 1 1991 202.0000000 159.1125077 + 388 23 1 1991 200.0000000 150.4703822 + 389 24 1 1991 192.0000000 133.4433344 + 390 25 1 1991 176.0000000 120.2456330 + 391 26 1 1991 164.0000000 110.0249309 + 392 27 1 1991 157.0000000 101.8991603 + 393 28 1 1991 134.0000000 95.2930515 + 394 29 1 1991 130.0000000 89.8215329 + 395 30 1 1991 119.0000000 85.2176645 + 396 31 1 1991 107.0000000 81.2908480 + 397 1 2 1991 112.0000000 77.9015143 + 398 2 2 1991 109.0000000 74.9452565 + 399 3 2 1991 101.0000000 72.3440276 + 400 4 2 1991 98.0000000 70.0328406 + 401 5 2 1991 84.0000000 67.9642628 + 402 6 2 1991 93.0000000 66.0999262 + 403 7 2 1991 80.0000000 64.4085901 + 404 8 2 1991 73.0000000 62.8648105 + 405 9 2 1991 89.0000000 61.4476757 + 406 10 2 1991 84.0000000 60.1398589 + 407 11 2 1991 78.0000000 58.9268994 + 408 12 2 1991 79.0000000 57.7966485 + 409 13 2 1991 77.0000000 56.7388401 + 410 14 2 1991 80.0000000 55.7447519 + 411 15 2 1991 72.0000000 54.8069376 + 412 16 2 1991 78.0000000 59.0517503 + 413 17 2 1991 74.0000000 62.3686423 + 414 18 2 1991 77.0000000 59.9523158 + 415 19 2 1991 73.0000000 86.5653530 + 416 20 2 1991 69.0000000 155.9911655 + 417 21 2 1991 74.0000000 228.1559515 + 418 22 2 1991 81.0000000 237.1563476 + 419 23 2 1991 110.0000000 194.0657861 + 420 24 2 1991 180.0000000 168.9836985 + 421 25 2 1991 213.0000000 157.2546953 + 422 26 2 1991 222.0000000 142.5447534 + 423 27 2 1991 208.0000000 132.2120593 + 424 28 2 1991 211.0000000 126.9499421 + 425 1 3 1991 214.0000000 118.7006474 + 426 2 3 1991 208.0000000 132.1213708 + 427 3 3 1991 221.0000000 138.6214839 + 428 4 3 1991 281.0000000 120.7972715 + 429 5 3 1991 219.0000000 108.0005596 + 430 6 3 1991 190.0000000 98.4137833 + 431 7 3 1991 173.0000000 90.7758990 + 432 8 3 1991 164.0000000 84.9494407 + 433 9 3 1991 142.0000000 81.8696715 + 434 10 3 1991 133.0000000 82.4560857 + 435 11 3 1991 133.0000000 80.3854006 + 436 12 3 1991 118.0000000 75.6387313 + 437 13 3 1991 127.0000000 71.3429597 + 438 14 3 1991 113.0000000 67.7283967 + 439 15 3 1991 107.0000000 64.6392245 + 440 16 3 1991 100.0000000 61.9659213 + 441 17 3 1991 100.0000000 59.6353397 + 442 18 3 1991 95.0000000 57.6498929 + 443 19 3 1991 98.0000000 136.1186107 + 444 20 3 1991 119.0000000 209.7469015 + 445 21 3 1991 159.0000000 230.9065141 + 446 22 3 1991 196.0000000 275.8313979 + 447 23 3 1991 242.0000000 225.8316145 + 448 24 3 1991 216.0000000 178.8075655 + 449 25 3 1991 180.0000000 147.9809851 + 450 26 3 1991 145.0000000 126.9775603 + 451 27 3 1991 127.0000000 114.2298500 + 452 28 3 1991 117.0000000 101.6884771 + 453 29 3 1991 109.0000000 91.9587447 + 454 30 3 1991 106.0000000 84.2508895 + 455 31 3 1991 99.0000000 78.0142323 + 456 1 4 1991 96.0000000 72.8779804 + 457 2 4 1991 88.0000000 68.5837799 + 458 3 4 1991 87.0000000 64.9464393 + 459 4 4 1991 82.0000000 62.5184041 + 460 5 4 1991 84.0000000 60.9854168 + 461 6 4 1991 67.0000000 58.4778476 + 462 7 4 1991 89.0000000 56.4538769 + 463 8 4 1991 75.0000000 54.8152573 + 464 9 4 1991 79.0000000 52.9873457 + 465 10 4 1991 70.0000000 51.2577052 + 466 11 4 1991 69.0000000 49.7100529 + 467 12 4 1991 69.0000000 48.3173828 + 468 13 4 1991 56.0000000 47.0559431 + 469 14 4 1991 63.0000000 45.9095772 + 470 15 4 1991 58.0000000 44.8649565 + 471 16 4 1991 56.0000000 43.8930576 + 472 17 4 1991 54.0000000 42.9929877 + 473 18 4 1991 57.0000000 42.2083694 + 474 19 4 1991 53.0000000 42.6393518 + 475 20 4 1991 53.0000000 43.2297016 + 476 21 4 1991 65.0000000 42.4661335 + 477 22 4 1991 69.0000000 45.3140226 + 478 23 4 1991 61.0000000 47.9118970 + 479 24 4 1991 56.0000000 45.2221402 + 480 25 4 1991 56.0000000 43.6747009 + 481 26 4 1991 53.0000000 42.4352792 + 482 27 4 1991 49.0000000 41.3336851 + 483 28 4 1991 53.0000000 40.3385588 + 484 29 4 1991 48.0000000 44.4559365 + 485 30 4 1991 57.0000000 97.8932560 + 486 1 5 1991 69.0000000 114.5735564 + 487 2 5 1991 89.0000000 87.7990429 + 488 3 5 1991 105.0000000 77.5865793 + 489 4 5 1991 79.0000000 70.2412994 + 490 5 5 1991 69.0000000 64.5764389 + 491 6 5 1991 71.0000000 60.4511982 + 492 7 5 1991 60.0000000 56.3805003 + 493 8 5 1991 64.0000000 53.0454432 + 494 9 5 1991 59.0000000 50.2245574 + 495 10 5 1991 57.0000000 49.9300461 + 496 11 5 1991 55.0000000 53.4941752 + 497 12 5 1991 53.0000000 50.2838047 + 498 13 5 1991 52.0000000 48.0472398 + 499 14 5 1991 50.0000000 46.2911337 + 500 15 5 1991 52.0000000 51.5205515 + 501 16 5 1991 54.0000000 55.3175996 + 502 17 5 1991 54.0000000 50.2871104 + 503 18 5 1991 55.0000000 48.0724687 + 504 19 5 1991 48.0000000 46.0929128 + 505 20 5 1991 48.0000000 44.3138343 + 506 21 5 1991 49.0000000 42.7089669 + 507 22 5 1991 41.0000000 41.2560327 + 508 23 5 1991 40.0000000 39.9360210 + 509 24 5 1991 40.0000000 38.7326324 + 510 25 5 1991 39.0000000 37.6318337 + 511 26 5 1991 43.0000000 36.6214989 + 512 27 5 1991 39.0000000 35.6911154 + 513 28 5 1991 36.0000000 34.8315436 + 514 29 5 1991 33.0000000 34.0348163 + 515 30 5 1991 39.0000000 33.2939722 + 516 31 5 1991 34.0000000 32.6029159 + 517 1 6 1991 37.0000000 31.9562999 + 518 2 6 1991 35.0000000 31.3494240 + 519 3 6 1991 29.0000000 30.7781505 + 520 4 6 1991 33.0000000 30.2388310 + 521 5 6 1991 34.0000000 29.7459100 + 522 6 6 1991 32.0000000 47.1417830 + 523 7 6 1991 38.0000000 52.0698946 + 524 8 6 1991 39.0000000 42.8295041 + 525 9 6 1991 41.0000000 39.6366386 + 526 10 6 1991 44.0000000 55.5850785 + 527 11 6 1991 48.0000000 41.6892419 + 528 12 6 1991 42.0000000 37.7804525 + 529 13 6 1991 37.0000000 36.0059749 + 530 14 6 1991 39.0000000 34.6260304 + 531 15 6 1991 35.0000000 33.7866982 + 532 16 6 1991 31.0000000 36.5310627 + 533 17 6 1991 33.0000000 40.7088696 + 534 18 6 1991 31.0000000 38.7236512 + 535 19 6 1991 28.0000000 35.7369989 + 536 20 6 1991 60.0000000 73.6737699 + 537 21 6 1991 48.0000000 68.6996925 + 538 22 6 1991 54.0000000 50.9589526 + 539 23 6 1991 63.0000000 57.7828975 + 540 24 6 1991 41.0000000 51.5368887 + 541 25 6 1991 42.0000000 45.2465117 + 542 26 6 1991 43.0000000 41.9606166 + 543 27 6 1991 38.0000000 49.8359143 + 544 28 6 1991 38.0000000 51.9417156 + 545 29 6 1991 35.0000000 44.5230405 + 546 30 6 1991 41.0000000 41.0286642 + 547 1 7 1991 41.0000000 38.5590737 + 548 2 7 1991 38.0000000 36.4631436 + 549 3 7 1991 34.0000000 34.6619472 + 550 4 7 1991 27.0000000 33.0987891 + 551 5 7 1991 31.0000000 31.7303461 + 552 6 7 1991 30.0000000 30.5231114 + 553 7 7 1991 26.0000000 36.7215230 + 554 8 7 1991 30.0000000 36.9507361 + 555 9 7 1991 31.0000000 30.5664287 + 556 10 7 1991 23.0000000 29.3669293 + 557 11 7 1991 35.0000000 28.3117762 + 558 12 7 1991 19.0000000 29.1238623 + 559 13 7 1991 24.0000000 57.4450372 + 560 14 7 1991 26.0000000 55.3899969 + 561 15 7 1991 27.0000000 39.7139021 + 562 16 7 1991 41.0000000 35.4201093 + 563 17 7 1991 34.0000000 33.3911107 + 564 18 7 1991 27.0000000 31.6641821 + 565 19 7 1991 25.0000000 30.1777672 + 566 20 7 1991 23.0000000 28.8857665 + 567 21 7 1991 22.0000000 27.7528220 + 568 22 7 1991 27.0000000 26.7513872 + 569 23 7 1991 23.0000000 25.8597033 + 570 24 7 1991 21.0000000 26.4889894 + 571 25 7 1991 23.0000000 52.7788280 + 572 26 7 1991 33.0000000 49.2595074 + 573 27 7 1991 23.0000000 35.9803235 + 574 28 7 1991 29.0000000 31.6818443 + 575 29 7 1991 30.0000000 29.9231487 + 576 30 7 1991 35.0000000 42.9803528 + 577 31 7 1991 27.0000000 44.8545493 + 578 1 8 1991 45.0000000 33.4482644 + 579 2 8 1991 47.0000000 31.4095118 + 580 3 8 1991 40.0000000 29.7209357 + 581 4 8 1991 35.0000000 28.2703736 + 582 5 8 1991 26.0000000 27.0111057 + 583 6 8 1991 23.0000000 25.9078244 + 584 7 8 1991 30.0000000 26.6017469 + 585 8 8 1991 33.0000000 27.2338882 + 586 9 8 1991 30.0000000 24.4035432 + 587 10 8 1991 28.0000000 23.2128641 + 588 11 8 1991 19.0000000 22.4955282 + 589 12 8 1991 20.0000000 21.8483820 + 590 13 8 1991 16.0000000 21.2610678 + 591 14 8 1991 18.0000000 20.7250915 + 592 15 8 1991 18.0000000 20.2334244 + 593 16 8 1991 20.0000000 19.7802037 + 594 17 8 1991 16.0000000 19.3605040 + 595 18 8 1991 15.0000000 18.9701615 + 596 19 8 1991 15.0000000 18.6056359 + 597 20 8 1991 14.0000000 18.2639014 + 598 21 8 1991 15.0000000 17.9423604 + 599 22 8 1991 13.0000000 17.6390051 + 600 23 8 1991 12.0000000 17.5121447 + 601 24 8 1991 11.0000000 17.3825063 + 602 25 8 1991 12.0000000 16.8491101 + 603 26 8 1991 11.0000000 16.5974649 + 604 27 8 1991 13.0000000 16.3567257 + 605 28 8 1991 11.0000000 16.1257029 + 606 29 8 1991 12.0000000 15.9034997 + 607 30 8 1991 12.0000000 15.6893246 + 608 31 8 1991 11.0000000 15.4824769 + 609 1 9 1991 11.0000000 17.1731524 + 610 2 9 1991 17.0000000 17.6112643 + 611 3 9 1991 11.0000000 15.0920096 + 612 4 9 1991 12.0000000 14.8915350 + 613 5 9 1991 11.0000000 14.6981656 + 614 6 9 1991 11.0000000 14.5109898 + 615 7 9 1991 18.0000000 14.3294739 + 616 8 9 1991 11.0000000 14.1531483 + 617 9 9 1991 13.0000000 13.9815987 + 618 10 9 1991 12.0000000 14.5506700 + 619 11 9 1991 11.0000000 43.8393492 + 620 12 9 1991 20.0000000 38.6676831 + 621 13 9 1991 21.0000000 17.6674411 + 622 14 9 1991 29.0000000 16.9888289 + 623 15 9 1991 28.0000000 16.3995542 + 624 16 9 1991 20.0000000 15.8812652 + 625 17 9 1991 20.0000000 15.4209371 + 626 18 9 1991 20.0000000 15.0084593 + 627 19 9 1991 12.0000000 14.6358761 + 628 20 9 1991 11.0000000 14.2968509 + 629 21 9 1991 11.0000000 13.9862814 + 630 22 9 1991 22.0000000 36.1268445 + 631 23 9 1991 14.0000000 38.7188832 + 632 24 9 1991 48.0000000 19.1328814 + 633 25 9 1991 45.0000000 80.0552003 + 634 26 9 1991 80.0000000 96.9065798 + 635 27 9 1991 61.0000000 83.6306011 + 636 28 9 1991 61.0000000 113.9859044 + 637 29 9 1991 65.0000000 131.3395908 + 638 30 9 1991 63.0000000 124.1960598 + 639 1 10 1991 90.0000000 92.4501736 + 640 2 10 1991 59.0000000 74.0194649 + 641 3 10 1991 45.0000000 61.2771964 + 642 4 10 1991 42.0000000 52.1807708 + 643 5 10 1991 41.0000000 102.8822897 + 644 6 10 1991 41.0000000 142.1795864 + 645 7 10 1991 73.0000000 104.9843117 + 646 8 10 1991 96.0000000 83.6204415 + 647 9 10 1991 61.0000000 70.1265839 + 648 10 10 1991 44.0000000 60.2435534 + 649 11 10 1991 42.0000000 52.9995144 + 650 12 10 1991 41.0000000 79.3690684 + 651 13 10 1991 42.0000000 93.9608810 + 652 14 10 1991 61.0000000 71.7281300 + 653 15 10 1991 55.0000000 62.5643338 + 654 16 10 1991 41.0000000 61.6782879 + 655 17 10 1991 48.0000000 80.3115171 + 656 18 10 1991 52.0000000 121.1646892 + 657 19 10 1991 66.0000000 117.1031342 + 658 20 10 1991 59.0000000 98.4880683 + 659 21 10 1991 71.0000000 86.9174246 + 660 22 10 1991 74.0000000 74.1606580 + 661 23 10 1991 70.0000000 64.8814711 + 662 24 10 1991 59.0000000 57.6032713 + 663 25 10 1991 57.0000000 51.7649931 + 664 26 10 1991 57.0000000 46.9887198 + 665 27 10 1991 51.0000000 43.0215566 + 666 28 10 1991 47.0000000 39.6845831 + 667 29 10 1991 48.0000000 36.8475831 + 668 30 10 1991 45.0000000 39.4788168 + 669 31 10 1991 43.0000000 45.3117289 + 670 1 11 1991 40.0000000 59.3457817 + 671 2 11 1991 47.0000000 69.1770533 + 672 3 11 1991 46.0000000 114.0853455 + 673 4 11 1991 76.0000000 192.1256066 + 674 5 11 1991 60.0000000 196.4754685 + 675 6 11 1991 132.0000000 174.8094311 + 676 7 11 1991 133.0000000 169.5638651 + 677 8 11 1991 113.0000000 207.5067050 + 678 9 11 1991 120.0000000 228.8633844 + 679 10 11 1991 141.0000000 189.7223584 + 680 11 11 1991 208.0000000 215.7365443 + 681 12 11 1991 166.0000000 337.6673246 + 682 13 11 1991 183.0000000 469.8031835 + 683 14 11 1991 299.0000000 675.7681851 + 684 15 11 1991 521.0000000 585.1627045 + 685 16 11 1991 443.0000000 432.3957979 + 686 17 11 1991 304.0000000 327.1566304 + 687 18 11 1991 231.0000000 305.0386831 + 688 19 11 1991 192.0000000 316.4534874 + 689 20 11 1991 199.0000000 275.6287427 + 690 21 11 1991 201.0000000 240.7375299 + 691 22 11 1991 173.0000000 193.2780226 + 692 23 11 1991 159.0000000 164.1466235 + 693 24 11 1991 160.0000000 142.9025972 + 694 25 11 1991 146.0000000 126.2878216 + 695 26 11 1991 110.0000000 112.9676596 + 696 27 11 1991 114.0000000 102.0815180 + 697 28 11 1991 97.0000000 93.0459773 + 698 29 11 1991 89.0000000 85.4507796 + 699 30 11 1991 73.0000000 78.9984421 + 700 1 12 1991 69.0000000 73.4675761 + 701 2 12 1991 67.0000000 68.6897282 + 702 3 12 1991 63.0000000 64.5342612 + 703 4 12 1991 58.0000000 60.8981895 + 704 5 12 1991 59.0000000 57.6991677 + 705 6 12 1991 53.0000000 54.8705384 + 706 7 12 1991 54.0000000 52.3577636 + 707 8 12 1991 51.0000000 50.1158019 + 708 9 12 1991 47.0000000 48.1071507 + 709 10 12 1991 42.0000000 46.3003586 + 710 11 12 1991 40.0000000 44.6688827 + 711 12 12 1991 39.0000000 43.1901966 + 712 13 12 1991 36.0000000 41.8450882 + 713 14 12 1991 37.0000000 40.6170993 + 714 15 12 1991 32.0000000 39.4920753 + 715 16 12 1991 37.0000000 59.2406240 + 716 17 12 1991 62.0000000 224.8772446 + 717 18 12 1991 118.0000000 388.8102014 + 718 19 12 1991 170.0000000 496.9585290 + 719 20 12 1991 229.0000000 661.2208360 + 720 21 12 1991 448.0000000 748.6508297 + 721 22 12 1991 464.0000000 1042.2203730 + 722 23 12 1991 675.0000000 802.3263842 + 723 24 12 1991 844.0000000 602.4063283 + 724 25 12 1991 569.0000000 437.6653071 + 725 26 12 1991 358.0000000 334.1774031 + 726 27 12 1991 279.0000000 269.2038979 + 727 28 12 1991 238.0000000 218.7279560 + 728 29 12 1991 201.0000000 185.8888852 + 729 30 12 1991 185.0000000 162.9246666 + 730 31 12 1991 165.0000000 144.9118599 diff --git a/check/case_07/output_save/b2_daily_discharge.out b/check/case_07/output_save/b2_daily_discharge.out deleted file mode 100644 index 01057d56..00000000 --- a/check/case_07/output_save/b2_daily_discharge.out +++ /dev/null @@ -1,1827 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1989 -9999.0000000 117.6907048 - 2 2 1 1989 -9999.0000000 164.8478950 - 3 3 1 1989 -9999.0000000 144.6907760 - 4 4 1 1989 -9999.0000000 153.7980288 - 5 5 1 1989 -9999.0000000 183.1518739 - 6 6 1 1989 -9999.0000000 154.4881411 - 7 7 1 1989 -9999.0000000 135.3635452 - 8 8 1 1989 -9999.0000000 124.3188106 - 9 9 1 1989 -9999.0000000 121.5270491 - 10 10 1 1989 -9999.0000000 120.0172102 - 11 11 1 1989 -9999.0000000 113.9401076 - 12 12 1 1989 -9999.0000000 118.2588744 - 13 13 1 1989 -9999.0000000 113.3007477 - 14 14 1 1989 -9999.0000000 106.8326606 - 15 15 1 1989 -9999.0000000 104.0362245 - 16 16 1 1989 -9999.0000000 101.4008355 - 17 17 1 1989 -9999.0000000 99.9595747 - 18 18 1 1989 -9999.0000000 98.0716585 - 19 19 1 1989 -9999.0000000 96.0647105 - 20 20 1 1989 -9999.0000000 94.4669009 - 21 21 1 1989 -9999.0000000 109.4463614 - 22 22 1 1989 -9999.0000000 101.3821455 - 23 23 1 1989 -9999.0000000 90.7455499 - 24 24 1 1989 -9999.0000000 89.0329784 - 25 25 1 1989 -9999.0000000 87.8838767 - 26 26 1 1989 -9999.0000000 86.7146742 - 27 27 1 1989 -9999.0000000 85.3082992 - 28 28 1 1989 -9999.0000000 84.1564154 - 29 29 1 1989 -9999.0000000 83.0435976 - 30 30 1 1989 -9999.0000000 81.9667441 - 31 31 1 1989 -9999.0000000 80.9230725 - 32 1 2 1989 -9999.0000000 79.9100825 - 33 2 2 1989 -9999.0000000 78.9255245 - 34 3 2 1989 -9999.0000000 77.9673714 - 35 4 2 1989 -9999.0000000 77.0337944 - 36 5 2 1989 -9999.0000000 76.1788767 - 37 6 2 1989 -9999.0000000 75.6339328 - 38 7 2 1989 -9999.0000000 74.3812177 - 39 8 2 1989 -9999.0000000 73.5297870 - 40 9 2 1989 -9999.0000000 72.6961894 - 41 10 2 1989 -9999.0000000 71.8794017 - 42 11 2 1989 -9999.0000000 71.0784920 - 43 12 2 1989 -9999.0000000 70.4131408 - 44 13 2 1989 -9999.0000000 83.1804761 - 45 14 2 1989 -9999.0000000 75.7926130 - 46 15 2 1989 -9999.0000000 79.5101587 - 47 16 2 1989 -9999.0000000 73.9145004 - 48 17 2 1989 -9999.0000000 68.4236227 - 49 18 2 1989 -9999.0000000 81.0140530 - 50 19 2 1989 -9999.0000000 73.5818503 - 51 20 2 1989 -9999.0000000 81.6715957 - 52 21 2 1989 -9999.0000000 98.8872536 - 53 22 2 1989 -9999.0000000 81.1284591 - 54 23 2 1989 -9999.0000000 80.0081796 - 55 24 2 1989 -9999.0000000 80.0182544 - 56 25 2 1989 -9999.0000000 97.2766069 - 57 26 2 1989 -9999.0000000 89.0501080 - 58 27 2 1989 -9999.0000000 93.8543071 - 59 28 2 1989 -9999.0000000 89.2944926 - 60 1 3 1989 -9999.0000000 81.7406918 - 61 2 3 1989 -9999.0000000 106.3463214 - 62 3 3 1989 -9999.0000000 103.5407631 - 63 4 3 1989 -9999.0000000 82.5900481 - 64 5 3 1989 -9999.0000000 68.9880025 - 65 6 3 1989 -9999.0000000 67.4699633 - 66 7 3 1989 -9999.0000000 70.7348164 - 67 8 3 1989 -9999.0000000 89.2288425 - 68 9 3 1989 -9999.0000000 73.8435798 - 69 10 3 1989 -9999.0000000 66.3025045 - 70 11 3 1989 -9999.0000000 64.8730514 - 71 12 3 1989 -9999.0000000 63.6741811 - 72 13 3 1989 -9999.0000000 62.5448110 - 73 14 3 1989 -9999.0000000 63.8141720 - 74 15 3 1989 -9999.0000000 94.0637561 - 75 16 3 1989 -9999.0000000 113.3340304 - 76 17 3 1989 -9999.0000000 83.7593127 - 77 18 3 1989 -9999.0000000 69.3537920 - 78 19 3 1989 -9999.0000000 67.6177356 - 79 20 3 1989 -9999.0000000 66.0730042 - 80 21 3 1989 -9999.0000000 65.0786775 - 81 22 3 1989 -9999.0000000 74.2065553 - 82 23 3 1989 -9999.0000000 72.7680932 - 83 24 3 1989 -9999.0000000 66.1592409 - 84 25 3 1989 -9999.0000000 64.5849572 - 85 26 3 1989 -9999.0000000 62.4224717 - 86 27 3 1989 -9999.0000000 61.1570445 - 87 28 3 1989 -9999.0000000 59.9622263 - 88 29 3 1989 -9999.0000000 58.8326584 - 89 30 3 1989 -9999.0000000 57.7625206 - 90 31 3 1989 -9999.0000000 56.7492340 - 91 1 4 1989 -9999.0000000 97.1569442 - 92 2 4 1989 -9999.0000000 125.1262749 - 93 3 4 1989 -9999.0000000 89.5621420 - 94 4 4 1989 -9999.0000000 76.8059740 - 95 5 4 1989 -9999.0000000 96.5997161 - 96 6 4 1989 -9999.0000000 86.3254022 - 97 7 4 1989 -9999.0000000 91.4866643 - 98 8 4 1989 -9999.0000000 92.9513827 - 99 9 4 1989 -9999.0000000 81.4164820 - 100 10 4 1989 -9999.0000000 76.3623828 - 101 11 4 1989 -9999.0000000 92.7048079 - 102 12 4 1989 -9999.0000000 131.6677475 - 103 13 4 1989 -9999.0000000 149.0830792 - 104 14 4 1989 -9999.0000000 121.6741104 - 105 15 4 1989 -9999.0000000 109.4594138 - 106 16 4 1989 -9999.0000000 102.3262708 - 107 17 4 1989 -9999.0000000 116.4792145 - 108 18 4 1989 -9999.0000000 121.3421614 - 109 19 4 1989 -9999.0000000 106.4239427 - 110 20 4 1989 -9999.0000000 98.7291955 - 111 21 4 1989 -9999.0000000 116.2673923 - 112 22 4 1989 -9999.0000000 135.1366000 - 113 23 4 1989 -9999.0000000 116.7280766 - 114 24 4 1989 -9999.0000000 101.8297246 - 115 25 4 1989 -9999.0000000 116.7977530 - 116 26 4 1989 -9999.0000000 166.6395646 - 117 27 4 1989 -9999.0000000 150.4858227 - 118 28 4 1989 -9999.0000000 126.4423520 - 119 29 4 1989 -9999.0000000 116.1953372 - 120 30 4 1989 -9999.0000000 107.7342760 - 121 1 5 1989 -9999.0000000 101.6432776 - 122 2 5 1989 -9999.0000000 97.0899622 - 123 3 5 1989 -9999.0000000 93.0071605 - 124 4 5 1989 -9999.0000000 89.3019457 - 125 5 5 1989 -9999.0000000 85.9302584 - 126 6 5 1989 -9999.0000000 82.8538436 - 127 7 5 1989 -9999.0000000 80.0393958 - 128 8 5 1989 -9999.0000000 77.4578461 - 129 9 5 1989 -9999.0000000 85.9572087 - 130 10 5 1989 -9999.0000000 94.7334437 - 131 11 5 1989 -9999.0000000 115.1395221 - 132 12 5 1989 -9999.0000000 100.8910146 - 133 13 5 1989 -9999.0000000 89.1583551 - 134 14 5 1989 -9999.0000000 81.7521014 - 135 15 5 1989 -9999.0000000 79.0192532 - 136 16 5 1989 -9999.0000000 76.5245844 - 137 17 5 1989 -9999.0000000 74.2262691 - 138 18 5 1989 -9999.0000000 72.1035334 - 139 19 5 1989 -9999.0000000 70.1381014 - 140 20 5 1989 -9999.0000000 68.3138463 - 141 21 5 1989 -9999.0000000 66.6165106 - 142 22 5 1989 -9999.0000000 65.0334651 - 143 23 5 1989 -9999.0000000 63.5535039 - 144 24 5 1989 -9999.0000000 62.1666668 - 145 25 5 1989 -9999.0000000 60.8640867 - 146 26 5 1989 -9999.0000000 59.6378575 - 147 27 5 1989 -9999.0000000 58.5070931 - 148 28 5 1989 -9999.0000000 58.5867610 - 149 29 5 1989 -9999.0000000 56.5519617 - 150 30 5 1989 -9999.0000000 62.0789633 - 151 31 5 1989 -9999.0000000 59.5083223 - 152 1 6 1989 -9999.0000000 54.2479828 - 153 2 6 1989 -9999.0000000 54.3874964 - 154 3 6 1989 -9999.0000000 58.4884001 - 155 4 6 1989 -9999.0000000 53.3667435 - 156 5 6 1989 -9999.0000000 51.2966901 - 157 6 6 1989 -9999.0000000 50.9308459 - 158 7 6 1989 -9999.0000000 62.0451780 - 159 8 6 1989 -9999.0000000 53.7571962 - 160 9 6 1989 -9999.0000000 49.0875882 - 161 10 6 1989 -9999.0000000 53.0837438 - 162 11 6 1989 -9999.0000000 49.6931846 - 163 12 6 1989 -9999.0000000 47.2900076 - 164 13 6 1989 -9999.0000000 46.6153041 - 165 14 6 1989 -9999.0000000 45.9651103 - 166 15 6 1989 -9999.0000000 45.3375228 - 167 16 6 1989 -9999.0000000 44.7308232 - 168 17 6 1989 -9999.0000000 44.1434578 - 169 18 6 1989 -9999.0000000 43.5740203 - 170 19 6 1989 -9999.0000000 43.0212368 - 171 20 6 1989 -9999.0000000 42.4839515 - 172 21 6 1989 -9999.0000000 42.0473860 - 173 22 6 1989 -9999.0000000 65.2866285 - 174 23 6 1989 -9999.0000000 57.7955248 - 175 24 6 1989 -9999.0000000 41.5965523 - 176 25 6 1989 -9999.0000000 41.0373011 - 177 26 6 1989 -9999.0000000 40.5180240 - 178 27 6 1989 -9999.0000000 41.1984705 - 179 28 6 1989 -9999.0000000 40.0789440 - 180 29 6 1989 -9999.0000000 41.7937904 - 181 30 6 1989 -9999.0000000 42.9528023 - 182 1 7 1989 -9999.0000000 43.2153045 - 183 2 7 1989 -9999.0000000 41.1652804 - 184 3 7 1989 -9999.0000000 37.8636909 - 185 4 7 1989 -9999.0000000 47.4976914 - 186 5 7 1989 -9999.0000000 39.5385834 - 187 6 7 1989 -9999.0000000 36.7376504 - 188 7 7 1989 -9999.0000000 36.2983906 - 189 8 7 1989 -9999.0000000 77.4338347 - 190 9 7 1989 -9999.0000000 56.6817587 - 191 10 7 1989 -9999.0000000 47.9272877 - 192 11 7 1989 -9999.0000000 49.4684302 - 193 12 7 1989 -9999.0000000 37.9525650 - 194 13 7 1989 -9999.0000000 37.2046948 - 195 14 7 1989 -9999.0000000 36.6392258 - 196 15 7 1989 -9999.0000000 36.0962512 - 197 16 7 1989 -9999.0000000 35.5739472 - 198 17 7 1989 -9999.0000000 35.0707296 - 199 18 7 1989 -9999.0000000 34.5851619 - 200 19 7 1989 -9999.0000000 34.1159398 - 201 20 7 1989 -9999.0000000 33.6618784 - 202 21 7 1989 -9999.0000000 33.2220650 - 203 22 7 1989 -9999.0000000 37.0277677 - 204 23 7 1989 -9999.0000000 34.5205228 - 205 24 7 1989 -9999.0000000 34.9582845 - 206 25 7 1989 -9999.0000000 33.7915626 - 207 26 7 1989 -9999.0000000 31.4539678 - 208 27 7 1989 -9999.0000000 31.0645048 - 209 28 7 1989 -9999.0000000 30.6861273 - 210 29 7 1989 -9999.0000000 30.3171627 - 211 30 7 1989 -9999.0000000 31.5952189 - 212 31 7 1989 -9999.0000000 35.4662728 - 213 1 8 1989 -9999.0000000 32.2797243 - 214 2 8 1989 -9999.0000000 30.2111637 - 215 3 8 1989 -9999.0000000 28.9919923 - 216 4 8 1989 -9999.0000000 28.6493648 - 217 5 8 1989 -9999.0000000 28.8322460 - 218 6 8 1989 -9999.0000000 43.4838852 - 219 7 8 1989 -9999.0000000 55.2887894 - 220 8 8 1989 -9999.0000000 39.2961273 - 221 9 8 1989 -9999.0000000 29.4651839 - 222 10 8 1989 -9999.0000000 27.7555378 - 223 11 8 1989 -9999.0000000 27.4052023 - 224 12 8 1989 -9999.0000000 27.0628712 - 225 13 8 1989 -9999.0000000 26.7293810 - 226 14 8 1989 -9999.0000000 26.4044460 - 227 15 8 1989 -9999.0000000 26.0876144 - 228 16 8 1989 -9999.0000000 42.8134475 - 229 17 8 1989 -9999.0000000 33.2461575 - 230 18 8 1989 -9999.0000000 25.6544760 - 231 19 8 1989 -9999.0000000 25.3385762 - 232 20 8 1989 -9999.0000000 25.0312001 - 233 21 8 1989 -9999.0000000 24.7313490 - 234 22 8 1989 -9999.0000000 25.0316107 - 235 23 8 1989 -9999.0000000 25.4653571 - 236 24 8 1989 -9999.0000000 23.9459169 - 237 25 8 1989 -9999.0000000 28.9784379 - 238 26 8 1989 -9999.0000000 46.9049863 - 239 27 8 1989 -9999.0000000 40.5013316 - 240 28 8 1989 -9999.0000000 27.0701655 - 241 29 8 1989 -9999.0000000 23.9630592 - 242 30 8 1989 -9999.0000000 23.3539975 - 243 31 8 1989 -9999.0000000 23.0554103 - 244 1 9 1989 -9999.0000000 22.7658358 - 245 2 9 1989 -9999.0000000 22.4834214 - 246 3 9 1989 -9999.0000000 22.2082787 - 247 4 9 1989 -9999.0000000 21.9401613 - 248 5 9 1989 -9999.0000000 21.6785684 - 249 6 9 1989 -9999.0000000 21.4229106 - 250 7 9 1989 -9999.0000000 21.1729924 - 251 8 9 1989 -9999.0000000 20.9284861 - 252 9 9 1989 -9999.0000000 20.6890914 - 253 10 9 1989 -9999.0000000 20.4545325 - 254 11 9 1989 -9999.0000000 22.1731988 - 255 12 9 1989 -9999.0000000 24.4769524 - 256 13 9 1989 -9999.0000000 33.2020549 - 257 14 9 1989 -9999.0000000 35.0036167 - 258 15 9 1989 -9999.0000000 52.8504406 - 259 16 9 1989 -9999.0000000 34.9387492 - 260 17 9 1989 -9999.0000000 20.6830278 - 261 18 9 1989 -9999.0000000 20.3852412 - 262 19 9 1989 -9999.0000000 20.1149016 - 263 20 9 1989 -9999.0000000 19.8798410 - 264 21 9 1989 -9999.0000000 19.5661339 - 265 22 9 1989 -9999.0000000 44.9127952 - 266 23 9 1989 -9999.0000000 48.5754264 - 267 24 9 1989 -9999.0000000 29.1215482 - 268 25 9 1989 -9999.0000000 20.8034789 - 269 26 9 1989 -9999.0000000 20.4471605 - 270 27 9 1989 -9999.0000000 20.1075264 - 271 28 9 1989 -9999.0000000 19.7828344 - 272 29 9 1989 -9999.0000000 19.4719056 - 273 30 9 1989 -9999.0000000 19.1736694 - 274 1 10 1989 -9999.0000000 18.8871531 - 275 2 10 1989 -9999.0000000 18.6114721 - 276 3 10 1989 -9999.0000000 18.3458217 - 277 4 10 1989 -9999.0000000 18.0894686 - 278 5 10 1989 -9999.0000000 17.8417447 - 279 6 10 1989 -9999.0000000 35.3467949 - 280 7 10 1989 -9999.0000000 63.1642512 - 281 8 10 1989 -9999.0000000 40.7460373 - 282 9 10 1989 -9999.0000000 28.6925845 - 283 10 10 1989 -9999.0000000 28.2028602 - 284 11 10 1989 -9999.0000000 24.2204477 - 285 12 10 1989 -9999.0000000 24.8475036 - 286 13 10 1989 -9999.0000000 22.6441796 - 287 14 10 1989 -9999.0000000 22.2457695 - 288 15 10 1989 -9999.0000000 22.3625442 - 289 16 10 1989 -9999.0000000 21.4482500 - 290 17 10 1989 -9999.0000000 21.0037089 - 291 18 10 1989 -9999.0000000 20.5831613 - 292 19 10 1989 -9999.0000000 20.1864577 - 293 20 10 1989 -9999.0000000 21.9249766 - 294 21 10 1989 -9999.0000000 20.5699470 - 295 22 10 1989 -9999.0000000 19.2762913 - 296 23 10 1989 -9999.0000000 18.9389731 - 297 24 10 1989 -9999.0000000 18.6171381 - 298 25 10 1989 -9999.0000000 18.3095588 - 299 26 10 1989 -9999.0000000 18.0151505 - 300 27 10 1989 -9999.0000000 17.7329220 - 301 28 10 1989 -9999.0000000 71.0827482 - 302 29 10 1989 -9999.0000000 75.6782285 - 303 30 10 1989 -9999.0000000 51.8956204 - 304 31 10 1989 -9999.0000000 56.5598322 - 305 1 11 1989 -9999.0000000 87.4614745 - 306 2 11 1989 -9999.0000000 95.8542690 - 307 3 11 1989 -9999.0000000 103.7496280 - 308 4 11 1989 -9999.0000000 134.1458783 - 309 5 11 1989 -9999.0000000 126.3163519 - 310 6 11 1989 -9999.0000000 107.2347945 - 311 7 11 1989 -9999.0000000 90.6852871 - 312 8 11 1989 -9999.0000000 85.9316821 - 313 9 11 1989 -9999.0000000 78.0397898 - 314 10 11 1989 -9999.0000000 67.6122235 - 315 11 11 1989 -9999.0000000 60.8124491 - 316 12 11 1989 -9999.0000000 56.6631292 - 317 13 11 1989 -9999.0000000 53.5266093 - 318 14 11 1989 -9999.0000000 50.8931178 - 319 15 11 1989 -9999.0000000 48.5706512 - 320 16 11 1989 -9999.0000000 46.4557194 - 321 17 11 1989 -9999.0000000 44.5257077 - 322 18 11 1989 -9999.0000000 42.7607827 - 323 19 11 1989 -9999.0000000 41.1434924 - 324 20 11 1989 -9999.0000000 39.6584479 - 325 21 11 1989 -9999.0000000 38.2920514 - 326 22 11 1989 -9999.0000000 37.0322734 - 327 23 11 1989 -9999.0000000 35.8850493 - 328 24 11 1989 -9999.0000000 34.8199320 - 329 25 11 1989 -9999.0000000 33.8190916 - 330 26 11 1989 -9999.0000000 32.8888526 - 331 27 11 1989 -9999.0000000 32.0224925 - 332 28 11 1989 -9999.0000000 31.2140019 - 333 29 11 1989 -9999.0000000 30.4580018 - 334 30 11 1989 -9999.0000000 29.7496716 - 335 1 12 1989 -9999.0000000 29.0846856 - 336 2 12 1989 -9999.0000000 28.4591578 - 337 3 12 1989 -9999.0000000 27.8695930 - 338 4 12 1989 -9999.0000000 27.3128443 - 339 5 12 1989 -9999.0000000 26.7860752 - 340 6 12 1989 -9999.0000000 26.2867267 - 341 7 12 1989 -9999.0000000 25.8124877 - 342 8 12 1989 -9999.0000000 25.3612690 - 343 9 12 1989 -9999.0000000 24.9311804 - 344 10 12 1989 -9999.0000000 24.5205102 - 345 11 12 1989 -9999.0000000 24.1277071 - 346 12 12 1989 -9999.0000000 33.5034489 - 347 13 12 1989 -9999.0000000 105.2067420 - 348 14 12 1989 -9999.0000000 131.1037539 - 349 15 12 1989 -9999.0000000 191.5588156 - 350 16 12 1989 -9999.0000000 253.0030475 - 351 17 12 1989 -9999.0000000 273.9966628 - 352 18 12 1989 -9999.0000000 317.8882051 - 353 19 12 1989 -9999.0000000 408.5482570 - 354 20 12 1989 -9999.0000000 409.7599754 - 355 21 12 1989 -9999.0000000 398.3711557 - 356 22 12 1989 -9999.0000000 450.6649660 - 357 23 12 1989 -9999.0000000 485.9618393 - 358 24 12 1989 -9999.0000000 428.5769268 - 359 25 12 1989 -9999.0000000 355.9553929 - 360 26 12 1989 -9999.0000000 299.5949953 - 361 27 12 1989 -9999.0000000 253.2399756 - 362 28 12 1989 -9999.0000000 215.5764231 - 363 29 12 1989 -9999.0000000 185.8092200 - 364 30 12 1989 -9999.0000000 162.8210176 - 365 31 12 1989 -9999.0000000 145.6601811 - 366 1 1 1990 157.0000000 131.9565196 - 367 2 1 1990 129.0000000 120.7965517 - 368 3 1 1990 117.0000000 112.7654754 - 369 4 1 1990 111.0000000 106.5049699 - 370 5 1 1990 112.0000000 100.8986424 - 371 6 1 1990 93.0000000 95.9066178 - 372 7 1 1990 87.0000000 91.3736767 - 373 8 1 1990 84.0000000 87.2633890 - 374 9 1 1990 80.0000000 83.6271386 - 375 10 1 1990 78.0000000 80.2269372 - 376 11 1 1990 78.0000000 77.1478033 - 377 12 1 1990 77.0000000 74.3369973 - 378 13 1 1990 76.0000000 72.7403997 - 379 14 1 1990 73.0000000 74.5749741 - 380 15 1 1990 66.0000000 84.5814597 - 381 16 1 1990 76.0000000 82.6881787 - 382 17 1 1990 73.0000000 84.1790374 - 383 18 1 1990 71.0000000 85.1825541 - 384 19 1 1990 90.0000000 79.6561169 - 385 20 1 1990 82.0000000 83.9572421 - 386 21 1 1990 80.0000000 81.1495485 - 387 22 1 1990 81.0000000 76.6963352 - 388 23 1 1990 97.0000000 172.7337834 - 389 24 1 1990 198.0000000 206.4350549 - 390 25 1 1990 392.0000000 269.9385329 - 391 26 1 1990 519.0000000 297.8979251 - 392 27 1 1990 565.0000000 256.6493459 - 393 28 1 1990 331.0000000 238.5221003 - 394 29 1 1990 293.0000000 238.6421285 - 395 30 1 1990 302.0000000 205.1720706 - 396 31 1 1990 233.0000000 180.0116781 - 397 1 2 1990 198.0000000 188.5322491 - 398 2 2 1990 183.0000000 207.6685578 - 399 3 2 1990 206.0000000 211.2436197 - 400 4 2 1990 215.0000000 183.2058558 - 401 5 2 1990 183.0000000 161.7086342 - 402 6 2 1990 159.0000000 146.0380184 - 403 7 2 1990 167.0000000 134.1427298 - 404 8 2 1990 138.0000000 128.2182248 - 405 9 2 1990 126.0000000 126.1042784 - 406 10 2 1990 131.0000000 198.1235719 - 407 11 2 1990 173.0000000 262.8561171 - 408 12 2 1990 240.0000000 299.4527087 - 409 13 2 1990 270.0000000 439.4189826 - 410 14 2 1990 458.0000000 773.8467553 - 411 15 2 1990 996.0000000 1041.4712793 - 412 16 2 1990 1370.0000000 926.6138141 - 413 17 2 1990 1540.0000000 779.2492202 - 414 18 2 1990 1210.0000000 658.8388520 - 415 19 2 1990 616.0000000 556.1838311 - 416 20 2 1990 465.0000000 471.6743949 - 417 21 2 1990 373.0000000 401.7985228 - 418 22 2 1990 298.0000000 343.8175321 - 419 23 2 1990 270.0000000 295.7205690 - 420 24 2 1990 234.0000000 256.9970616 - 421 25 2 1990 218.0000000 232.8923805 - 422 26 2 1990 203.0000000 338.1898645 - 423 27 2 1990 314.0000000 527.6773234 - 424 28 2 1990 520.0000000 701.7497753 - 425 1 3 1990 689.0000000 766.1623474 - 426 2 3 1990 777.0000000 678.0178769 - 427 3 3 1990 584.0000000 573.4172082 - 428 4 3 1990 429.0000000 487.3278050 - 429 5 3 1990 365.0000000 418.2917682 - 430 6 3 1990 281.0000000 360.9532418 - 431 7 3 1990 257.0000000 311.5644935 - 432 8 3 1990 231.0000000 270.7152147 - 433 9 3 1990 211.0000000 238.6741757 - 434 10 3 1990 191.0000000 214.5609207 - 435 11 3 1990 182.0000000 196.0690159 - 436 12 3 1990 173.0000000 181.6378510 - 437 13 3 1990 159.0000000 171.3213890 - 438 14 3 1990 153.0000000 165.2960186 - 439 15 3 1990 141.0000000 159.4465199 - 440 16 3 1990 136.0000000 152.4408941 - 441 17 3 1990 130.0000000 146.5338019 - 442 18 3 1990 123.0000000 141.1739692 - 443 19 3 1990 115.0000000 136.2965919 - 444 20 3 1990 113.0000000 132.3404240 - 445 21 3 1990 102.0000000 128.8694014 - 446 22 3 1990 105.0000000 125.8135788 - 447 23 3 1990 106.0000000 122.7032926 - 448 24 3 1990 87.0000000 119.5754559 - 449 25 3 1990 80.0000000 117.3015449 - 450 26 3 1990 84.0000000 114.3013383 - 451 27 3 1990 82.0000000 111.6943823 - 452 28 3 1990 91.0000000 119.8479224 - 453 29 3 1990 97.0000000 124.5881143 - 454 30 3 1990 110.0000000 116.8039857 - 455 31 3 1990 97.0000000 112.7916732 - 456 1 4 1990 93.0000000 109.9894132 - 457 2 4 1990 85.0000000 107.3885435 - 458 3 4 1990 84.0000000 111.7138522 - 459 4 4 1990 81.0000000 114.3452678 - 460 5 4 1990 81.0000000 107.0403015 - 461 6 4 1990 76.0000000 105.4354510 - 462 7 4 1990 72.0000000 102.8469572 - 463 8 4 1990 68.0000000 100.5552144 - 464 9 4 1990 72.0000000 98.4796011 - 465 10 4 1990 65.0000000 96.5739986 - 466 11 4 1990 62.0000000 95.4280410 - 467 12 4 1990 62.0000000 96.2843918 - 468 13 4 1990 65.0000000 100.6602121 - 469 14 4 1990 68.0000000 122.1639336 - 470 15 4 1990 75.0000000 122.7287343 - 471 16 4 1990 90.0000000 117.7156370 - 472 17 4 1990 92.0000000 114.3745074 - 473 18 4 1990 94.0000000 114.5463743 - 474 19 4 1990 110.0000000 110.1208203 - 475 20 4 1990 99.0000000 106.7537829 - 476 21 4 1990 86.0000000 104.0187924 - 477 22 4 1990 86.0000000 109.1395168 - 478 23 4 1990 86.0000000 115.5174258 - 479 24 4 1990 88.0000000 114.8241674 - 480 25 4 1990 93.0000000 107.6504036 - 481 26 4 1990 99.0000000 104.3130775 - 482 27 4 1990 86.0000000 101.8910328 - 483 28 4 1990 74.0000000 99.4569020 - 484 29 4 1990 72.0000000 96.9617216 - 485 30 4 1990 77.0000000 94.6424060 - 486 1 5 1990 56.0000000 92.4782525 - 487 2 5 1990 64.0000000 90.4537238 - 488 3 5 1990 58.0000000 88.5550742 - 489 4 5 1990 50.0000000 86.7701051 - 490 5 5 1990 50.0000000 85.0879731 - 491 6 5 1990 50.0000000 83.4990238 - 492 7 5 1990 50.0000000 82.0392407 - 493 8 5 1990 53.0000000 81.7481459 - 494 9 5 1990 62.0000000 80.5302410 - 495 10 5 1990 64.0000000 85.6809900 - 496 11 5 1990 65.0000000 85.9238002 - 497 12 5 1990 75.0000000 78.9109900 - 498 13 5 1990 71.0000000 77.2209539 - 499 14 5 1990 63.0000000 76.0283809 - 500 15 5 1990 61.0000000 75.1891139 - 501 16 5 1990 49.0000000 74.0265160 - 502 17 5 1990 46.0000000 72.6959687 - 503 18 5 1990 46.0000000 71.5985122 - 504 19 5 1990 48.0000000 70.5453520 - 505 20 5 1990 41.0000000 69.5950282 - 506 21 5 1990 45.0000000 75.4404237 - 507 22 5 1990 52.0000000 74.9292252 - 508 23 5 1990 50.0000000 74.1978822 - 509 24 5 1990 56.0000000 77.4149253 - 510 25 5 1990 41.0000000 72.9576589 - 511 26 5 1990 40.0000000 68.2084274 - 512 27 5 1990 39.0000000 67.1258582 - 513 28 5 1990 39.0000000 66.0918463 - 514 29 5 1990 33.0000000 65.1016999 - 515 30 5 1990 37.0000000 64.1516501 - 516 31 5 1990 30.0000000 63.2383243 - 517 1 6 1990 37.0000000 68.9456383 - 518 2 6 1990 36.0000000 69.9378914 - 519 3 6 1990 40.0000000 98.9381988 - 520 4 6 1990 45.0000000 78.5801271 - 521 5 6 1990 39.0000000 64.3468854 - 522 6 6 1990 48.0000000 63.2761452 - 523 7 6 1990 39.0000000 110.1442463 - 524 8 6 1990 49.0000000 114.0828396 - 525 9 6 1990 84.0000000 98.2961820 - 526 10 6 1990 91.0000000 87.2500034 - 527 11 6 1990 80.0000000 78.4711311 - 528 12 6 1990 66.0000000 76.0785279 - 529 13 6 1990 53.0000000 74.1562918 - 530 14 6 1990 64.0000000 72.2085542 - 531 15 6 1990 55.0000000 70.2415728 - 532 16 6 1990 54.0000000 68.5276430 - 533 17 6 1990 42.0000000 66.9311767 - 534 18 6 1990 48.0000000 65.7926609 - 535 19 6 1990 48.0000000 82.8833120 - 536 20 6 1990 60.0000000 98.7895987 - 537 21 6 1990 75.0000000 90.5556691 - 538 22 6 1990 78.0000000 78.0364575 - 539 23 6 1990 66.0000000 74.9607039 - 540 24 6 1990 63.0000000 71.8029167 - 541 25 6 1990 52.0000000 69.6776670 - 542 26 6 1990 49.0000000 67.9223171 - 543 27 6 1990 44.0000000 75.0421181 - 544 28 6 1990 51.0000000 72.8748577 - 545 29 6 1990 61.0000000 92.7705677 - 546 30 6 1990 81.0000000 123.9690673 - 547 1 7 1990 79.0000000 95.1751325 - 548 2 7 1990 92.0000000 81.5277929 - 549 3 7 1990 72.0000000 88.5072892 - 550 4 7 1990 58.0000000 105.3143484 - 551 5 7 1990 69.0000000 134.7529686 - 552 6 7 1990 94.0000000 121.6417917 - 553 7 7 1990 199.0000000 117.9944306 - 554 8 7 1990 133.0000000 122.3262309 - 555 9 7 1990 124.0000000 106.4044996 - 556 10 7 1990 123.0000000 98.1352730 - 557 11 7 1990 99.0000000 92.8036305 - 558 12 7 1990 88.0000000 88.7490850 - 559 13 7 1990 84.0000000 85.3396057 - 560 14 7 1990 72.0000000 82.2669594 - 561 15 7 1990 55.0000000 79.4564103 - 562 16 7 1990 65.0000000 76.8788033 - 563 17 7 1990 50.0000000 74.5086528 - 564 18 7 1990 50.0000000 72.3236256 - 565 19 7 1990 46.0000000 70.3041068 - 566 20 7 1990 44.0000000 68.4328317 - 567 21 7 1990 42.0000000 66.6945732 - 568 22 7 1990 37.0000000 65.0758754 - 569 23 7 1990 38.0000000 63.5648251 - 570 24 7 1990 44.0000000 62.1508568 - 571 25 7 1990 30.0000000 60.8245835 - 572 26 7 1990 26.0000000 59.5776525 - 573 27 7 1990 31.0000000 58.4026196 - 574 28 7 1990 33.0000000 60.3100010 - 575 29 7 1990 42.0000000 57.5823986 - 576 30 7 1990 36.0000000 55.4237829 - 577 31 7 1990 34.0000000 54.4630962 - 578 1 8 1990 25.0000000 53.5486519 - 579 2 8 1990 22.0000000 52.6764734 - 580 3 8 1990 28.0000000 51.8429851 - 581 4 8 1990 25.0000000 51.0449689 - 582 5 8 1990 19.0000000 50.2795953 - 583 6 8 1990 22.0000000 49.5444567 - 584 7 8 1990 19.0000000 48.8365779 - 585 8 8 1990 22.0000000 48.1541198 - 586 9 8 1990 19.0000000 47.4951870 - 587 10 8 1990 20.0000000 46.8580285 - 588 11 8 1990 19.0000000 46.2410564 - 589 12 8 1990 19.0000000 45.6428295 - 590 13 8 1990 22.0000000 50.0829336 - 591 14 8 1990 36.0000000 70.8846143 - 592 15 8 1990 31.0000000 60.8294352 - 593 16 8 1990 30.0000000 54.7037318 - 594 17 8 1990 28.0000000 50.4863988 - 595 18 8 1990 34.0000000 43.7778620 - 596 19 8 1990 21.0000000 43.1909227 - 597 20 8 1990 30.0000000 42.6230802 - 598 21 8 1990 22.0000000 42.0725990 - 599 22 8 1990 21.0000000 41.5382397 - 600 23 8 1990 23.0000000 41.0188786 - 601 24 8 1990 20.0000000 40.5134962 - 602 25 8 1990 29.0000000 40.0217332 - 603 26 8 1990 20.0000000 40.0403183 - 604 27 8 1990 22.0000000 41.2031178 - 605 28 8 1990 23.0000000 39.1870499 - 606 29 8 1990 35.0000000 38.2423566 - 607 30 8 1990 51.0000000 124.4814709 - 608 31 8 1990 80.0000000 113.8489431 - 609 1 9 1990 56.0000000 52.0034469 - 610 2 9 1990 33.0000000 43.7243998 - 611 3 9 1990 27.0000000 42.8339361 - 612 4 9 1990 27.0000000 45.9880226 - 613 5 9 1990 28.0000000 45.6365347 - 614 6 9 1990 26.0000000 41.2039603 - 615 7 9 1990 24.0000000 46.7308694 - 616 8 9 1990 33.0000000 43.5320018 - 617 9 9 1990 26.0000000 39.7939740 - 618 10 9 1990 27.0000000 39.0686149 - 619 11 9 1990 22.0000000 38.3812208 - 620 12 9 1990 22.0000000 37.7279973 - 621 13 9 1990 21.0000000 37.1059019 - 622 14 9 1990 22.0000000 36.5122116 - 623 15 9 1990 22.0000000 35.9444867 - 624 16 9 1990 22.0000000 35.4005379 - 625 17 9 1990 20.0000000 34.8783982 - 626 18 9 1990 22.0000000 34.3762980 - 627 19 9 1990 16.0000000 33.8926435 - 628 20 9 1990 22.0000000 33.4259976 - 629 21 9 1990 19.0000000 42.0104160 - 630 22 9 1990 32.0000000 107.0470520 - 631 23 9 1990 27.0000000 83.0616809 - 632 24 9 1990 45.0000000 58.3216063 - 633 25 9 1990 42.0000000 44.1587222 - 634 26 9 1990 39.0000000 41.0554005 - 635 27 9 1990 30.0000000 40.0199320 - 636 28 9 1990 28.0000000 39.0541910 - 637 29 9 1990 30.0000000 38.1527336 - 638 30 9 1990 30.0000000 88.1935645 - 639 1 10 1990 56.0000000 128.1160834 - 640 2 10 1990 72.0000000 90.7301146 - 641 3 10 1990 73.0000000 88.1441162 - 642 4 10 1990 68.0000000 81.7932305 - 643 5 10 1990 53.0000000 70.4220690 - 644 6 10 1990 42.0000000 65.6062707 - 645 7 10 1990 33.0000000 62.5560260 - 646 8 10 1990 42.0000000 59.9172573 - 647 9 10 1990 34.0000000 57.5524753 - 648 10 10 1990 36.0000000 55.3816794 - 649 11 10 1990 36.0000000 53.3927725 - 650 12 10 1990 28.0000000 51.5663799 - 651 13 10 1990 32.0000000 49.8854437 - 652 14 10 1990 27.0000000 48.3349147 - 653 15 10 1990 35.0000000 47.2813299 - 654 16 10 1990 42.0000000 48.4167794 - 655 17 10 1990 35.0000000 57.7094087 - 656 18 10 1990 39.0000000 56.1072603 - 657 19 10 1990 34.0000000 47.2876109 - 658 20 10 1990 32.0000000 45.9056627 - 659 21 10 1990 34.0000000 44.6329942 - 660 22 10 1990 27.0000000 43.4503112 - 661 23 10 1990 31.0000000 42.3488037 - 662 24 10 1990 28.0000000 41.3206456 - 663 25 10 1990 25.0000000 41.4821577 - 664 26 10 1990 29.0000000 59.3469179 - 665 27 10 1990 31.0000000 66.0550069 - 666 28 10 1990 65.0000000 189.7719837 - 667 29 10 1990 69.0000000 190.1169754 - 668 30 10 1990 157.0000000 157.3733563 - 669 31 10 1990 190.0000000 138.6143367 - 670 1 11 1990 115.0000000 144.2110569 - 671 2 11 1990 104.0000000 153.9729344 - 672 3 11 1990 100.0000000 161.6940788 - 673 4 11 1990 131.0000000 159.4064808 - 674 5 11 1990 130.0000000 154.6273631 - 675 6 11 1990 115.0000000 138.2376947 - 676 7 11 1990 102.0000000 124.0452303 - 677 8 11 1990 95.0000000 111.9471952 - 678 9 11 1990 81.0000000 101.9343713 - 679 10 11 1990 66.0000000 108.3247914 - 680 11 11 1990 67.0000000 139.8328846 - 681 12 11 1990 74.0000000 151.2050666 - 682 13 11 1990 109.0000000 144.3429002 - 683 14 11 1990 92.0000000 167.8459413 - 684 15 11 1990 92.0000000 180.9386410 - 685 16 11 1990 155.0000000 169.7835849 - 686 17 11 1990 159.0000000 160.3652661 - 687 18 11 1990 131.0000000 176.8159730 - 688 19 11 1990 161.0000000 188.3971923 - 689 20 11 1990 196.0000000 291.8793255 - 690 21 11 1990 336.0000000 353.8451564 - 691 22 11 1990 566.0000000 319.9194978 - 692 23 11 1990 373.0000000 324.5544115 - 693 24 11 1990 293.0000000 298.0072117 - 694 25 11 1990 264.0000000 289.0517876 - 695 26 11 1990 226.0000000 263.8913410 - 696 27 11 1990 201.0000000 231.2517780 - 697 28 11 1990 180.0000000 206.3013178 - 698 29 11 1990 161.0000000 195.3994042 - 699 30 11 1990 149.0000000 181.0282237 - 700 1 12 1990 134.0000000 159.3089897 - 701 2 12 1990 113.0000000 143.2449863 - 702 3 12 1990 99.0000000 131.7805237 - 703 4 12 1990 107.0000000 124.1737927 - 704 5 12 1990 99.0000000 117.9021201 - 705 6 12 1990 89.0000000 112.2380956 - 706 7 12 1990 77.0000000 107.1461844 - 707 8 12 1990 71.0000000 102.5463202 - 708 9 12 1990 68.0000000 98.3792744 - 709 10 12 1990 73.0000000 94.5938476 - 710 11 12 1990 84.0000000 91.1456584 - 711 12 12 1990 88.0000000 99.8049022 - 712 13 12 1990 92.0000000 103.6882545 - 713 14 12 1990 128.0000000 96.0378197 - 714 15 12 1990 136.0000000 91.0565634 - 715 16 12 1990 114.0000000 87.7094418 - 716 17 12 1990 101.0000000 84.6733382 - 717 18 12 1990 93.0000000 81.8988655 - 718 19 12 1990 85.0000000 79.3560989 - 719 20 12 1990 81.0000000 77.0189844 - 720 21 12 1990 106.0000000 102.4384651 - 721 22 12 1990 159.0000000 128.8869578 - 722 23 12 1990 250.0000000 152.7885765 - 723 24 12 1990 298.0000000 147.7618792 - 724 25 12 1990 261.0000000 188.2554129 - 725 26 12 1990 228.0000000 298.6989181 - 726 27 12 1990 409.0000000 366.5864384 - 727 28 12 1990 486.0000000 403.6968032 - 728 29 12 1990 440.0000000 517.0110600 - 729 30 12 1990 486.0000000 647.0310074 - 730 31 12 1990 774.0000000 722.7488642 - 731 1 1 1991 889.0000000 761.2103594 - 732 2 1 1991 863.0000000 809.6699279 - 733 3 1 1991 875.0000000 885.2372508 - 734 4 1 1991 932.0000000 826.3080907 - 735 5 1 1991 826.0000000 788.5016224 - 736 6 1 1991 731.0000000 741.7106608 - 737 7 1 1991 613.0000000 706.7031914 - 738 8 1 1991 610.0000000 693.3862167 - 739 9 1 1991 686.0000000 633.9596786 - 740 10 1 1991 556.0000000 667.9505719 - 741 11 1 1991 669.0000000 698.1312501 - 742 12 1 1991 828.0000000 656.7219541 - 743 13 1 1991 735.0000000 553.5079384 - 744 14 1 1991 513.0000000 470.8709449 - 745 15 1 1991 411.0000000 402.7895245 - 746 16 1 1991 345.0000000 346.4318222 - 747 17 1 1991 293.0000000 299.5802684 - 748 18 1 1991 251.0000000 261.1739025 - 749 19 1 1991 222.0000000 231.3274142 - 750 20 1 1991 215.0000000 209.0665238 - 751 21 1 1991 213.0000000 193.2850357 - 752 22 1 1991 202.0000000 187.3187539 - 753 23 1 1991 200.0000000 180.3816214 - 754 24 1 1991 192.0000000 171.3860117 - 755 25 1 1991 176.0000000 163.5761471 - 756 26 1 1991 164.0000000 156.5770029 - 757 27 1 1991 157.0000000 150.2547831 - 758 28 1 1991 134.0000000 144.5380993 - 759 29 1 1991 130.0000000 139.3523318 - 760 30 1 1991 119.0000000 134.6332325 - 761 31 1 1991 107.0000000 130.3253306 - 762 1 2 1991 112.0000000 126.3806019 - 763 2 2 1991 109.0000000 122.7573604 - 764 3 2 1991 101.0000000 119.4193314 - 765 4 2 1991 98.0000000 116.3348746 - 766 5 2 1991 84.0000000 113.4763288 - 767 6 2 1991 93.0000000 110.8194594 - 768 7 2 1991 80.0000000 108.3429896 - 769 8 2 1991 73.0000000 106.0282026 - 770 9 2 1991 89.0000000 103.8586017 - 771 10 2 1991 84.0000000 101.8196206 - 772 11 2 1991 78.0000000 99.8983748 - 773 12 2 1991 79.0000000 98.0834481 - 774 13 2 1991 77.0000000 96.3647086 - 775 14 2 1991 80.0000000 94.7331502 - 776 15 2 1991 72.0000000 93.1807553 - 777 16 2 1991 78.0000000 92.6589457 - 778 17 2 1991 74.0000000 92.2074260 - 779 18 2 1991 77.0000000 90.6699158 - 780 19 2 1991 73.0000000 101.3562964 - 781 20 2 1991 69.0000000 116.0945264 - 782 21 2 1991 74.0000000 149.2269152 - 783 22 2 1991 81.0000000 167.7052910 - 784 23 2 1991 110.0000000 163.4868043 - 785 24 2 1991 180.0000000 156.7245129 - 786 25 2 1991 213.0000000 153.8747646 - 787 26 2 1991 222.0000000 154.8430074 - 788 27 2 1991 208.0000000 150.7557027 - 789 28 2 1991 211.0000000 143.5875309 - 790 1 3 1991 214.0000000 137.6694441 - 791 2 3 1991 208.0000000 145.1603233 - 792 3 3 1991 221.0000000 143.3283029 - 793 4 3 1991 281.0000000 134.5410608 - 794 5 3 1991 219.0000000 129.1887478 - 795 6 3 1991 190.0000000 124.4543840 - 796 7 3 1991 173.0000000 120.1442643 - 797 8 3 1991 164.0000000 116.4338552 - 798 9 3 1991 142.0000000 113.7524009 - 799 10 3 1991 133.0000000 113.4143719 - 800 11 3 1991 133.0000000 110.5083181 - 801 12 3 1991 118.0000000 107.1780677 - 802 13 3 1991 127.0000000 104.1382377 - 803 14 3 1991 113.0000000 101.3355946 - 804 15 3 1991 107.0000000 98.7416565 - 805 16 3 1991 100.0000000 96.3340559 - 806 17 3 1991 100.0000000 94.0977554 - 807 18 3 1991 95.0000000 92.0481137 - 808 19 3 1991 98.0000000 146.7122947 - 809 20 3 1991 119.0000000 149.1644154 - 810 21 3 1991 159.0000000 163.9635741 - 811 22 3 1991 196.0000000 177.3119530 - 812 23 3 1991 242.0000000 161.7090328 - 813 24 3 1991 216.0000000 149.5523369 - 814 25 3 1991 180.0000000 141.3600985 - 815 26 3 1991 145.0000000 134.5675601 - 816 27 3 1991 127.0000000 130.0173940 - 817 28 3 1991 117.0000000 124.0676763 - 818 29 3 1991 109.0000000 119.1046733 - 819 30 3 1991 106.0000000 114.6097618 - 820 31 3 1991 99.0000000 110.5259230 - 821 1 4 1991 96.0000000 106.8041153 - 822 2 4 1991 88.0000000 103.4019147 - 823 3 4 1991 87.0000000 100.2825223 - 824 4 4 1991 82.0000000 97.7954012 - 825 5 4 1991 84.0000000 95.8162777 - 826 6 4 1991 67.0000000 93.2771630 - 827 7 4 1991 89.0000000 91.0948271 - 828 8 4 1991 75.0000000 89.1414960 - 829 9 4 1991 79.0000000 87.1245445 - 830 10 4 1991 70.0000000 85.1908990 - 831 11 4 1991 69.0000000 83.3790588 - 832 12 4 1991 69.0000000 81.6792366 - 833 13 4 1991 56.0000000 80.0804419 - 834 14 4 1991 63.0000000 78.5751899 - 835 15 4 1991 58.0000000 77.1545987 - 836 16 4 1991 56.0000000 75.8036258 - 837 17 4 1991 54.0000000 74.5204406 - 838 18 4 1991 57.0000000 73.3298703 - 839 19 4 1991 53.0000000 73.2167567 - 840 20 4 1991 53.0000000 72.5766848 - 841 21 4 1991 65.0000000 71.4786355 - 842 22 4 1991 69.0000000 73.0211296 - 843 23 4 1991 61.0000000 74.3097976 - 844 24 4 1991 56.0000000 70.7313753 - 845 25 4 1991 56.0000000 69.1858688 - 846 26 4 1991 53.0000000 68.0882925 - 847 27 4 1991 49.0000000 67.0579563 - 848 28 4 1991 53.0000000 66.0748008 - 849 29 4 1991 48.0000000 69.4021926 - 850 30 4 1991 57.0000000 112.1656891 - 851 1 5 1991 69.0000000 101.5670352 - 852 2 5 1991 89.0000000 79.9218336 - 853 3 5 1991 105.0000000 77.1897682 - 854 4 5 1991 79.0000000 75.3576441 - 855 5 5 1991 69.0000000 73.7804316 - 856 6 5 1991 71.0000000 72.5366708 - 857 7 5 1991 60.0000000 70.8172383 - 858 8 5 1991 64.0000000 69.3427183 - 859 9 5 1991 59.0000000 67.9724196 - 860 10 5 1991 57.0000000 68.6901667 - 861 11 5 1991 55.0000000 71.0019356 - 862 12 5 1991 53.0000000 67.7440485 - 863 13 5 1991 52.0000000 66.0670361 - 864 14 5 1991 50.0000000 65.0473387 - 865 15 5 1991 52.0000000 69.6515704 - 866 16 5 1991 54.0000000 70.3477404 - 867 17 5 1991 54.0000000 65.6168488 - 868 18 5 1991 55.0000000 64.3831137 - 869 19 5 1991 48.0000000 63.2396723 - 870 20 5 1991 48.0000000 62.1520036 - 871 21 5 1991 49.0000000 61.1144998 - 872 22 5 1991 41.0000000 60.1231357 - 873 23 5 1991 40.0000000 59.1742568 - 874 24 5 1991 40.0000000 58.2645431 - 875 25 5 1991 39.0000000 57.3909761 - 876 26 5 1991 43.0000000 56.5508101 - 877 27 5 1991 39.0000000 55.7415453 - 878 28 5 1991 36.0000000 54.9609047 - 879 29 5 1991 33.0000000 54.2068128 - 880 30 5 1991 39.0000000 53.4773765 - 881 31 5 1991 34.0000000 52.7708684 - 882 1 6 1991 37.0000000 52.0857107 - 883 2 6 1991 35.0000000 51.4204620 - 884 3 6 1991 29.0000000 50.7738041 - 885 4 6 1991 33.0000000 50.1445314 - 886 5 6 1991 34.0000000 49.5552077 - 887 6 6 1991 32.0000000 66.8200681 - 888 7 6 1991 38.0000000 68.3190258 - 889 8 6 1991 39.0000000 57.0813074 - 890 9 6 1991 41.0000000 54.2254167 - 891 10 6 1991 44.0000000 67.0695269 - 892 11 6 1991 48.0000000 51.8898813 - 893 12 6 1991 42.0000000 49.2309424 - 894 13 6 1991 37.0000000 48.5176568 - 895 14 6 1991 39.0000000 47.9677900 - 896 15 6 1991 35.0000000 47.7230653 - 897 16 6 1991 31.0000000 50.7395317 - 898 17 6 1991 33.0000000 53.9858122 - 899 18 6 1991 31.0000000 51.0452476 - 900 19 6 1991 28.0000000 48.0782162 - 901 20 6 1991 60.0000000 83.2759009 - 902 21 6 1991 48.0000000 66.2094713 - 903 22 6 1991 54.0000000 50.7361432 - 904 23 6 1991 63.0000000 57.8906681 - 905 24 6 1991 41.0000000 52.0061730 - 906 25 6 1991 42.0000000 48.5011918 - 907 26 6 1991 43.0000000 47.6470599 - 908 27 6 1991 38.0000000 56.2940772 - 909 28 6 1991 38.0000000 55.6376355 - 910 29 6 1991 35.0000000 49.0105943 - 911 30 6 1991 41.0000000 47.3012710 - 912 1 7 1991 41.0000000 46.4340726 - 913 2 7 1991 38.0000000 45.6135923 - 914 3 7 1991 34.0000000 44.8327292 - 915 4 7 1991 27.0000000 44.0881634 - 916 5 7 1991 31.0000000 43.3768983 - 917 6 7 1991 30.0000000 42.6963668 - 918 7 7 1991 26.0000000 49.2550691 - 919 8 7 1991 30.0000000 47.6604008 - 920 9 7 1991 31.0000000 41.5230179 - 921 10 7 1991 23.0000000 40.8956806 - 922 11 7 1991 35.0000000 40.2931670 - 923 12 7 1991 19.0000000 41.5654882 - 924 13 7 1991 24.0000000 68.6462113 - 925 14 7 1991 26.0000000 59.7222065 - 926 15 7 1991 27.0000000 43.8575351 - 927 16 7 1991 41.0000000 41.0150698 - 928 17 7 1991 34.0000000 40.3311150 - 929 18 7 1991 27.0000000 39.6786829 - 930 19 7 1991 25.0000000 39.0541008 - 931 20 7 1991 23.0000000 38.4548955 - 932 21 7 1991 22.0000000 37.8795196 - 933 22 7 1991 27.0000000 37.3261403 - 934 23 7 1991 23.0000000 36.7930933 - 935 24 7 1991 21.0000000 37.8542078 - 936 25 7 1991 23.0000000 62.5619195 - 937 26 7 1991 33.0000000 53.7594384 - 938 27 7 1991 23.0000000 40.1500858 - 939 28 7 1991 29.0000000 36.9943165 - 940 29 7 1991 30.0000000 36.4065454 - 941 30 7 1991 35.0000000 49.9664456 - 942 31 7 1991 27.0000000 48.0513757 - 943 1 8 1991 45.0000000 37.2182264 - 944 2 8 1991 47.0000000 36.5291423 - 945 3 8 1991 40.0000000 35.9250754 - 946 4 8 1991 35.0000000 35.3475590 - 947 5 8 1991 26.0000000 34.7944849 - 948 6 8 1991 23.0000000 34.2639442 - 949 7 8 1991 30.0000000 35.4597367 - 950 8 8 1991 33.0000000 36.0334648 - 951 9 8 1991 30.0000000 33.3276546 - 952 10 8 1991 28.0000000 32.4480051 - 953 11 8 1991 19.0000000 31.9997968 - 954 12 8 1991 20.0000000 31.5664160 - 955 13 8 1991 16.0000000 31.1468150 - 956 14 8 1991 18.0000000 30.7400385 - 957 15 8 1991 18.0000000 30.3452143 - 958 16 8 1991 20.0000000 29.9615458 - 959 17 8 1991 16.0000000 29.5883045 - 960 18 8 1991 15.0000000 29.2248245 - 961 19 8 1991 15.0000000 28.8704959 - 962 20 8 1991 14.0000000 28.5247601 - 963 21 8 1991 15.0000000 28.1871052 - 964 22 8 1991 13.0000000 27.8572140 - 965 23 8 1991 12.0000000 27.7600228 - 966 24 8 1991 11.0000000 27.5346086 - 967 25 8 1991 12.0000000 26.9258468 - 968 26 8 1991 11.0000000 26.6212752 - 969 27 8 1991 13.0000000 26.3227226 - 970 28 8 1991 11.0000000 26.0297185 - 971 29 8 1991 12.0000000 25.7419961 - 972 30 8 1991 12.0000000 25.4593094 - 973 31 8 1991 11.0000000 25.1814308 - 974 1 9 1991 11.0000000 27.0030545 - 975 2 9 1991 17.0000000 27.1040226 - 976 3 9 1991 11.0000000 24.4174787 - 977 4 9 1991 12.0000000 24.1544285 - 978 5 9 1991 11.0000000 23.8957558 - 979 6 9 1991 11.0000000 23.6409900 - 980 7 9 1991 18.0000000 23.3899851 - 981 8 9 1991 11.0000000 23.1426054 - 982 9 9 1991 13.0000000 22.8987247 - 983 10 9 1991 12.0000000 23.5536799 - 984 11 9 1991 11.0000000 52.3699380 - 985 12 9 1991 20.0000000 43.8971193 - 986 13 9 1991 21.0000000 22.6895067 - 987 14 9 1991 29.0000000 22.4228431 - 988 15 9 1991 28.0000000 22.1633302 - 989 16 9 1991 20.0000000 21.9092752 - 990 17 9 1991 20.0000000 21.6603808 - 991 18 9 1991 20.0000000 21.4163741 - 992 19 9 1991 12.0000000 21.1770042 - 993 20 9 1991 11.0000000 20.9420407 - 994 21 9 1991 11.0000000 20.7112713 - 995 22 9 1991 22.0000000 42.5883060 - 996 23 9 1991 14.0000000 40.7490621 - 997 24 9 1991 48.0000000 21.1492875 - 998 25 9 1991 45.0000000 79.5512385 - 999 26 9 1991 80.0000000 76.4974837 - 1000 27 9 1991 61.0000000 51.4737224 - 1001 28 9 1991 61.0000000 74.9838478 - 1002 29 9 1991 65.0000000 68.7597407 - 1003 30 9 1991 63.0000000 54.2686502 - 1004 1 10 1991 90.0000000 40.4413283 - 1005 2 10 1991 59.0000000 37.0993165 - 1006 3 10 1991 45.0000000 35.4926497 - 1007 4 10 1991 42.0000000 34.1201852 - 1008 5 10 1991 41.0000000 78.7750776 - 1009 6 10 1991 41.0000000 79.3316539 - 1010 7 10 1991 73.0000000 50.4099088 - 1011 8 10 1991 96.0000000 45.0322236 - 1012 9 10 1991 61.0000000 42.9471715 - 1013 10 10 1991 44.0000000 41.0573869 - 1014 11 10 1991 42.0000000 39.4642306 - 1015 12 10 1991 41.0000000 64.1762882 - 1016 13 10 1991 42.0000000 61.5908828 - 1017 14 10 1991 61.0000000 45.3125347 - 1018 15 10 1991 55.0000000 43.3799354 - 1019 16 10 1991 41.0000000 46.9477269 - 1020 17 10 1991 48.0000000 62.1090378 - 1021 18 10 1991 52.0000000 84.0570970 - 1022 19 10 1991 66.0000000 65.3776136 - 1023 20 10 1991 59.0000000 56.4140436 - 1024 21 10 1991 71.0000000 53.6503822 - 1025 22 10 1991 74.0000000 49.8735759 - 1026 23 10 1991 70.0000000 47.5337169 - 1027 24 10 1991 59.0000000 45.5377371 - 1028 25 10 1991 57.0000000 43.7306800 - 1029 26 10 1991 57.0000000 42.0774024 - 1030 27 10 1991 51.0000000 40.5614896 - 1031 28 10 1991 47.0000000 39.1684915 - 1032 29 10 1991 48.0000000 37.8856613 - 1033 30 10 1991 45.0000000 40.8397754 - 1034 31 10 1991 43.0000000 43.3958544 - 1035 1 11 1991 40.0000000 55.1750282 - 1036 2 11 1991 47.0000000 56.3095328 - 1037 3 11 1991 46.0000000 82.1236734 - 1038 4 11 1991 76.0000000 115.1500271 - 1039 5 11 1991 60.0000000 103.7297769 - 1040 6 11 1991 132.0000000 95.0102653 - 1041 7 11 1991 133.0000000 105.0322080 - 1042 8 11 1991 113.0000000 127.1433080 - 1043 9 11 1991 120.0000000 131.5968847 - 1044 10 11 1991 141.0000000 116.1062426 - 1045 11 11 1991 208.0000000 143.5844891 - 1046 12 11 1991 166.0000000 195.7633074 - 1047 13 11 1991 183.0000000 251.5085989 - 1048 14 11 1991 299.0000000 371.3142669 - 1049 15 11 1991 521.0000000 344.1770303 - 1050 16 11 1991 443.0000000 303.0937729 - 1051 17 11 1991 304.0000000 264.9774190 - 1052 18 11 1991 231.0000000 264.9064637 - 1053 19 11 1991 192.0000000 262.1707170 - 1054 20 11 1991 199.0000000 240.3389769 - 1055 21 11 1991 201.0000000 222.8514550 - 1056 22 11 1991 173.0000000 193.9597155 - 1057 23 11 1991 159.0000000 169.6574267 - 1058 24 11 1991 160.0000000 149.7654364 - 1059 25 11 1991 146.0000000 134.5689830 - 1060 26 11 1991 110.0000000 122.6974948 - 1061 27 11 1991 114.0000000 111.6953184 - 1062 28 11 1991 97.0000000 102.1756094 - 1063 29 11 1991 89.0000000 95.3419508 - 1064 30 11 1991 73.0000000 90.7852086 - 1065 1 12 1991 69.0000000 86.8082193 - 1066 2 12 1991 67.0000000 83.1984554 - 1067 3 12 1991 63.0000000 79.9133164 - 1068 4 12 1991 58.0000000 76.9161875 - 1069 5 12 1991 59.0000000 74.1750936 - 1070 6 12 1991 53.0000000 71.6620450 - 1071 7 12 1991 54.0000000 69.3524863 - 1072 8 12 1991 51.0000000 67.2248291 - 1073 9 12 1991 47.0000000 65.2600550 - 1074 10 12 1991 42.0000000 63.4413772 - 1075 11 12 1991 40.0000000 61.7539514 - 1076 12 12 1991 39.0000000 60.1846279 - 1077 13 12 1991 36.0000000 58.7217385 - 1078 14 12 1991 37.0000000 57.3549128 - 1079 15 12 1991 32.0000000 56.0749198 - 1080 16 12 1991 37.0000000 62.6567519 - 1081 17 12 1991 62.0000000 167.4894979 - 1082 18 12 1991 118.0000000 205.7217517 - 1083 19 12 1991 170.0000000 284.9180051 - 1084 20 12 1991 229.0000000 370.9177259 - 1085 21 12 1991 448.0000000 455.7281740 - 1086 22 12 1991 464.0000000 606.3825823 - 1087 23 12 1991 675.0000000 556.0015283 - 1088 24 12 1991 844.0000000 491.2328406 - 1089 25 12 1991 569.0000000 417.6687103 - 1090 26 12 1991 358.0000000 359.0609326 - 1091 27 12 1991 279.0000000 314.0121431 - 1092 28 12 1991 238.0000000 273.8595744 - 1093 29 12 1991 201.0000000 238.8382602 - 1094 30 12 1991 185.0000000 210.2333358 - 1095 31 12 1991 165.0000000 186.2375726 - 1096 1 1 1992 140.0000000 166.9334896 - 1097 2 1 1992 126.0000000 151.5584270 - 1098 3 1 1992 117.0000000 140.2536323 - 1099 4 1 1992 114.0000000 133.5144278 - 1100 5 1 1992 108.0000000 126.7839808 - 1101 6 1 1992 108.0000000 119.7816887 - 1102 7 1 1992 101.0000000 114.4363449 - 1103 8 1 1992 97.0000000 113.1192585 - 1104 9 1 1992 89.0000000 129.4291908 - 1105 10 1 1992 111.0000000 160.5284860 - 1106 11 1 1992 135.0000000 156.8887816 - 1107 12 1 1992 171.0000000 139.7924644 - 1108 13 1 1992 125.0000000 131.9062498 - 1109 14 1 1992 111.0000000 125.4364510 - 1110 15 1 1992 100.0000000 119.6985644 - 1111 16 1 1992 87.0000000 114.5914469 - 1112 17 1 1992 75.0000000 109.9015290 - 1113 18 1 1992 79.0000000 105.6893110 - 1114 19 1 1992 70.0000000 105.8315913 - 1115 20 1 1992 72.0000000 102.9514239 - 1116 21 1 1992 87.0000000 99.5300157 - 1117 22 1 1992 79.0000000 95.8598779 - 1118 23 1 1992 71.0000000 92.7759531 - 1119 24 1 1992 66.0000000 89.9469860 - 1120 25 1 1992 67.0000000 87.3444482 - 1121 26 1 1992 65.0000000 84.9434242 - 1122 27 1 1992 59.0000000 82.7221037 - 1123 28 1 1992 57.0000000 80.6846570 - 1124 29 1 1992 54.0000000 79.7787770 - 1125 30 1 1992 59.0000000 81.5716183 - 1126 31 1 1992 57.0000000 88.1166614 - 1127 1 2 1992 56.0000000 90.2014420 - 1128 2 2 1992 54.0000000 87.9256998 - 1129 3 2 1992 58.0000000 84.4987568 - 1130 4 2 1992 63.0000000 141.5044872 - 1131 5 2 1992 76.0000000 183.6687608 - 1132 6 2 1992 250.0000000 205.2524390 - 1133 7 2 1992 346.0000000 182.2922152 - 1134 8 2 1992 241.0000000 163.4357194 - 1135 9 2 1992 180.0000000 161.3069858 - 1136 10 2 1992 164.0000000 167.4481663 - 1137 11 2 1992 183.0000000 187.4094655 - 1138 12 2 1992 215.0000000 217.4436193 - 1139 13 2 1992 265.0000000 229.7413969 - 1140 14 2 1992 287.0000000 243.1621546 - 1141 15 2 1992 272.0000000 244.8452178 - 1142 16 2 1992 253.0000000 270.6959239 - 1143 17 2 1992 301.0000000 257.9128322 - 1144 18 2 1992 275.0000000 222.8114320 - 1145 19 2 1992 224.0000000 197.0071289 - 1146 20 2 1992 194.0000000 176.2015338 - 1147 21 2 1992 173.0000000 159.9734354 - 1148 22 2 1992 157.0000000 147.8542859 - 1149 23 2 1992 142.0000000 141.4867596 - 1150 24 2 1992 133.0000000 137.1421502 - 1151 25 2 1992 128.0000000 132.2279390 - 1152 26 2 1992 125.0000000 125.4766916 - 1153 27 2 1992 125.0000000 120.0671922 - 1154 28 2 1992 110.0000000 115.3455343 - 1155 29 2 1992 107.0000000 111.0588890 - 1156 1 3 1992 97.0000000 107.2842649 - 1157 2 3 1992 97.0000000 105.4169618 - 1158 3 3 1992 86.0000000 106.0429986 - 1159 4 3 1992 93.0000000 101.2448886 - 1160 5 3 1992 86.0000000 98.2517888 - 1161 6 3 1992 82.0000000 95.5191088 - 1162 7 3 1992 80.0000000 92.8775190 - 1163 8 3 1992 77.0000000 90.4268460 - 1164 9 3 1992 73.0000000 88.1515967 - 1165 10 3 1992 76.0000000 86.2162155 - 1166 11 3 1992 68.0000000 84.5173390 - 1167 12 3 1992 70.0000000 140.0697260 - 1168 13 3 1992 116.0000000 201.2471296 - 1169 14 3 1992 206.0000000 241.9495841 - 1170 15 3 1992 433.0000000 291.2408788 - 1171 16 3 1992 495.0000000 310.6913722 - 1172 17 3 1992 331.0000000 266.5985391 - 1173 18 3 1992 240.0000000 233.7143396 - 1174 19 3 1992 215.0000000 207.2683103 - 1175 20 3 1992 185.0000000 185.5455265 - 1176 21 3 1992 185.0000000 178.3156393 - 1177 22 3 1992 185.0000000 237.3217737 - 1178 23 3 1992 213.0000000 331.4470910 - 1179 24 3 1992 466.0000000 362.0267215 - 1180 25 3 1992 580.0000000 374.4686720 - 1181 26 3 1992 566.0000000 352.9048654 - 1182 27 3 1992 487.0000000 319.9036310 - 1183 28 3 1992 387.0000000 293.1930284 - 1184 29 3 1992 311.0000000 263.5969143 - 1185 30 3 1992 270.0000000 241.7289929 - 1186 31 3 1992 246.0000000 230.2738434 - 1187 1 4 1992 229.0000000 242.2697303 - 1188 2 4 1992 222.0000000 235.8420652 - 1189 3 4 1992 217.0000000 247.1455116 - 1190 4 4 1992 208.0000000 297.0027501 - 1191 5 4 1992 220.0000000 277.8271362 - 1192 6 4 1992 210.0000000 246.8653736 - 1193 7 4 1992 190.0000000 220.5914476 - 1194 8 4 1992 173.0000000 198.8705397 - 1195 9 4 1992 166.0000000 180.5723944 - 1196 10 4 1992 133.0000000 165.2257231 - 1197 11 4 1992 126.0000000 153.2816453 - 1198 12 4 1992 124.0000000 143.0756475 - 1199 13 4 1992 116.0000000 134.4575618 - 1200 14 4 1992 112.0000000 136.2035477 - 1201 15 4 1992 111.0000000 169.7369583 - 1202 16 4 1992 137.0000000 179.0963923 - 1203 17 4 1992 206.0000000 169.4751916 - 1204 18 4 1992 176.0000000 166.8827868 - 1205 19 4 1992 161.0000000 153.5346739 - 1206 20 4 1992 161.0000000 144.5267479 - 1207 21 4 1992 139.0000000 138.3345913 - 1208 22 4 1992 139.0000000 133.0180193 - 1209 23 4 1992 123.0000000 128.1961728 - 1210 24 4 1992 119.0000000 123.8048442 - 1211 25 4 1992 111.0000000 119.7948068 - 1212 26 4 1992 94.0000000 116.1940940 - 1213 27 4 1992 94.0000000 117.0996282 - 1214 28 4 1992 102.0000000 121.0214974 - 1215 29 4 1992 120.0000000 118.2441888 - 1216 30 4 1992 120.0000000 113.3582067 - 1217 1 5 1992 114.0000000 139.8360472 - 1218 2 5 1992 115.0000000 152.2240080 - 1219 3 5 1992 206.0000000 133.6970586 - 1220 4 5 1992 215.0000000 126.7161955 - 1221 5 5 1992 125.0000000 122.2285471 - 1222 6 5 1992 123.0000000 118.2040124 - 1223 7 5 1992 113.0000000 114.5194699 - 1224 8 5 1992 77.0000000 111.1359900 - 1225 9 5 1992 83.0000000 108.2407155 - 1226 10 5 1992 83.0000000 118.0404668 - 1227 11 5 1992 96.0000000 115.9528280 - 1228 12 5 1992 120.0000000 105.7547554 - 1229 13 5 1992 80.0000000 101.7419800 - 1230 14 5 1992 76.0000000 99.2453127 - 1231 15 5 1992 69.0000000 96.9219512 - 1232 16 5 1992 63.0000000 94.7538389 - 1233 17 5 1992 61.0000000 92.7251847 - 1234 18 5 1992 60.0000000 90.8220381 - 1235 19 5 1992 59.0000000 89.0320527 - 1236 20 5 1992 67.0000000 87.3450554 - 1237 21 5 1992 51.0000000 85.7528438 - 1238 22 5 1992 44.0000000 84.2434501 - 1239 23 5 1992 42.0000000 82.8076117 - 1240 24 5 1992 51.0000000 81.5663489 - 1241 25 5 1992 42.0000000 80.4618833 - 1242 26 5 1992 54.0000000 90.2885694 - 1243 27 5 1992 53.0000000 81.8090316 - 1244 28 5 1992 59.0000000 77.6127295 - 1245 29 5 1992 55.0000000 86.1159375 - 1246 30 5 1992 54.0000000 84.7037120 - 1247 31 5 1992 48.0000000 78.6459404 - 1248 1 6 1992 63.0000000 81.1135586 - 1249 2 6 1992 61.0000000 79.7965745 - 1250 3 6 1992 55.0000000 80.6672911 - 1251 4 6 1992 75.0000000 96.7023039 - 1252 5 6 1992 53.0000000 106.9234980 - 1253 6 6 1992 77.0000000 101.9497685 - 1254 7 6 1992 114.0000000 96.7195203 - 1255 8 6 1992 167.0000000 106.9251697 - 1256 9 6 1992 116.0000000 95.0170218 - 1257 10 6 1992 91.0000000 86.8114548 - 1258 11 6 1992 85.0000000 84.5233273 - 1259 12 6 1992 68.0000000 82.4780367 - 1260 13 6 1992 71.0000000 80.5825045 - 1261 14 6 1992 63.0000000 78.8081968 - 1262 15 6 1992 59.0000000 77.1437570 - 1263 16 6 1992 46.0000000 75.5786440 - 1264 17 6 1992 44.0000000 74.1034762 - 1265 18 6 1992 39.0000000 72.7098904 - 1266 19 6 1992 41.0000000 71.3959804 - 1267 20 6 1992 44.0000000 72.5129416 - 1268 21 6 1992 39.0000000 70.4361829 - 1269 22 6 1992 32.0000000 68.2227357 - 1270 23 6 1992 40.0000000 69.6243721 - 1271 24 6 1992 41.0000000 82.4114640 - 1272 25 6 1992 42.0000000 75.6957902 - 1273 26 6 1992 42.0000000 67.9653270 - 1274 27 6 1992 48.0000000 65.9539037 - 1275 28 6 1992 37.0000000 64.8492076 - 1276 29 6 1992 40.0000000 63.7970788 - 1277 30 6 1992 29.0000000 63.0109949 - 1278 1 7 1992 30.0000000 62.7284611 - 1279 2 7 1992 36.0000000 61.1714653 - 1280 3 7 1992 29.0000000 66.5455321 - 1281 4 7 1992 36.0000000 76.5091605 - 1282 5 7 1992 50.0000000 93.1859208 - 1283 6 7 1992 78.0000000 92.1323667 - 1284 7 7 1992 54.0000000 71.9292940 - 1285 8 7 1992 57.0000000 63.9339454 - 1286 9 7 1992 51.0000000 62.9304180 - 1287 10 7 1992 47.0000000 82.7302599 - 1288 11 7 1992 46.0000000 99.6188933 - 1289 12 7 1992 76.0000000 90.3964497 - 1290 13 7 1992 72.0000000 78.0086107 - 1291 14 7 1992 67.0000000 70.6742993 - 1292 15 7 1992 63.0000000 68.8774420 - 1293 16 7 1992 47.0000000 67.2046486 - 1294 17 7 1992 47.0000000 65.6430189 - 1295 18 7 1992 42.0000000 64.1816352 - 1296 19 7 1992 41.0000000 62.8108048 - 1297 20 7 1992 39.0000000 61.5219068 - 1298 21 7 1992 37.0000000 61.8121912 - 1299 22 7 1992 33.0000000 61.8610023 - 1300 23 7 1992 33.0000000 58.9797729 - 1301 24 7 1992 33.0000000 57.9021084 - 1302 25 7 1992 37.0000000 56.8789875 - 1303 26 7 1992 26.0000000 55.9039855 - 1304 27 7 1992 24.0000000 54.9749131 - 1305 28 7 1992 26.0000000 54.0878968 - 1306 29 7 1992 29.0000000 53.2394463 - 1307 30 7 1992 19.0000000 52.4264131 - 1308 31 7 1992 22.0000000 53.7907592 - 1309 1 8 1992 28.0000000 53.3051635 - 1310 2 8 1992 35.0000000 50.3920869 - 1311 3 8 1992 29.0000000 49.6788521 - 1312 4 8 1992 36.0000000 48.9916052 - 1313 5 8 1992 52.0000000 48.3275363 - 1314 6 8 1992 74.0000000 47.6849445 - 1315 7 8 1992 54.0000000 47.0622856 - 1316 8 8 1992 57.0000000 46.4581564 - 1317 9 8 1992 48.0000000 48.7428877 - 1318 10 8 1992 47.0000000 47.3039216 - 1319 11 8 1992 46.0000000 54.7904239 - 1320 12 8 1992 75.0000000 53.3479801 - 1321 13 8 1992 73.0000000 57.6466692 - 1322 14 8 1992 66.0000000 59.6429926 - 1323 15 8 1992 60.0000000 51.7143009 - 1324 16 8 1992 47.0000000 43.7644649 - 1325 17 8 1992 46.0000000 43.1775809 - 1326 18 8 1992 42.0000000 42.6100514 - 1327 19 8 1992 41.0000000 42.1617288 - 1328 20 8 1992 40.0000000 49.2599476 - 1329 21 8 1992 37.0000000 44.9430072 - 1330 22 8 1992 32.0000000 42.5330749 - 1331 23 8 1992 32.0000000 42.2774616 - 1332 24 8 1992 32.0000000 40.0836646 - 1333 25 8 1992 36.0000000 39.5373038 - 1334 26 8 1992 27.0000000 39.0497276 - 1335 27 8 1992 25.0000000 38.5750329 - 1336 28 8 1992 25.0000000 38.6271025 - 1337 29 8 1992 28.0000000 45.6084644 - 1338 30 8 1992 20.0000000 58.6317924 - 1339 31 8 1992 22.0000000 100.1076047 - 1340 1 9 1992 49.0000000 80.7279109 - 1341 2 9 1992 77.0000000 65.6743647 - 1342 3 9 1992 67.0000000 59.8203249 - 1343 4 9 1992 45.0000000 58.2546779 - 1344 5 9 1992 44.0000000 50.6914168 - 1345 6 9 1992 64.0000000 45.0733532 - 1346 7 9 1992 52.0000000 43.9774207 - 1347 8 9 1992 40.0000000 42.9559080 - 1348 9 9 1992 30.0000000 42.0008782 - 1349 10 9 1992 34.0000000 41.1058493 - 1350 11 9 1992 32.0000000 40.5874424 - 1351 12 9 1992 36.0000000 39.9754772 - 1352 13 9 1992 28.0000000 38.9637018 - 1353 14 9 1992 33.0000000 39.5961585 - 1354 15 9 1992 35.0000000 41.5807545 - 1355 16 9 1992 30.0000000 37.6227312 - 1356 17 9 1992 32.0000000 36.9576793 - 1357 18 9 1992 29.0000000 36.4119705 - 1358 19 9 1992 30.0000000 36.3468038 - 1359 20 9 1992 28.0000000 35.2934624 - 1360 21 9 1992 29.0000000 34.7367647 - 1361 22 9 1992 29.0000000 34.2044705 - 1362 23 9 1992 27.0000000 33.6984515 - 1363 24 9 1992 27.0000000 33.2062017 - 1364 25 9 1992 23.0000000 32.7325995 - 1365 26 9 1992 28.0000000 32.2759280 - 1366 27 9 1992 25.0000000 31.8354185 - 1367 28 9 1992 25.0000000 33.3365841 - 1368 29 9 1992 27.0000000 34.8557200 - 1369 30 9 1992 25.0000000 31.1787884 - 1370 1 10 1992 27.0000000 31.2538248 - 1371 2 10 1992 33.0000000 33.4268785 - 1372 3 10 1992 29.0000000 33.8803845 - 1373 4 10 1992 31.0000000 31.6623610 - 1374 5 10 1992 25.0000000 44.2829431 - 1375 6 10 1992 25.0000000 49.2326421 - 1376 7 10 1992 36.0000000 36.3654104 - 1377 8 10 1992 42.0000000 30.6601137 - 1378 9 10 1992 43.0000000 32.7336662 - 1379 10 10 1992 26.0000000 38.7360889 - 1380 11 10 1992 27.0000000 35.4008032 - 1381 12 10 1992 27.0000000 31.0828097 - 1382 13 10 1992 26.0000000 30.5573314 - 1383 14 10 1992 26.0000000 30.1517441 - 1384 15 10 1992 23.0000000 44.1436393 - 1385 16 10 1992 21.0000000 41.6895955 - 1386 17 10 1992 26.0000000 35.0958941 - 1387 18 10 1992 34.0000000 36.8017516 - 1388 19 10 1992 37.0000000 33.3035322 - 1389 20 10 1992 31.0000000 42.3233387 - 1390 21 10 1992 31.0000000 41.6166676 - 1391 22 10 1992 35.0000000 39.3745536 - 1392 23 10 1992 33.0000000 63.8083959 - 1393 24 10 1992 40.0000000 124.2013245 - 1394 25 10 1992 74.0000000 161.3150473 - 1395 26 10 1992 161.0000000 150.3389317 - 1396 27 10 1992 285.0000000 164.8623421 - 1397 28 10 1992 244.0000000 180.2015084 - 1398 29 10 1992 263.0000000 187.8296651 - 1399 30 10 1992 276.0000000 156.4257868 - 1400 31 10 1992 186.0000000 136.6385363 - 1401 1 11 1992 154.0000000 121.8731603 - 1402 2 11 1992 112.0000000 131.1866504 - 1403 3 11 1992 104.0000000 134.0575139 - 1404 4 11 1992 96.0000000 126.0666627 - 1405 5 11 1992 99.0000000 111.2389396 - 1406 6 11 1992 126.0000000 99.8639393 - 1407 7 11 1992 91.0000000 91.2048547 - 1408 8 11 1992 84.0000000 85.5503249 - 1409 9 11 1992 81.0000000 90.6004457 - 1410 10 11 1992 85.0000000 127.2293108 - 1411 11 11 1992 126.0000000 207.4137352 - 1412 12 11 1992 279.0000000 239.6791417 - 1413 13 11 1992 390.0000000 243.2732169 - 1414 14 11 1992 294.0000000 250.5185341 - 1415 15 11 1992 260.0000000 323.1245386 - 1416 16 11 1992 398.0000000 455.8530311 - 1417 17 11 1992 520.0000000 434.1019632 - 1418 18 11 1992 487.0000000 423.1965965 - 1419 19 11 1992 380.0000000 432.9736382 - 1420 20 11 1992 385.0000000 380.1414345 - 1421 21 11 1992 351.0000000 413.5419229 - 1422 22 11 1992 309.0000000 476.4547033 - 1423 23 11 1992 587.0000000 403.3588198 - 1424 24 11 1992 661.0000000 355.9793962 - 1425 25 11 1992 447.0000000 364.2120947 - 1426 26 11 1992 361.0000000 382.1204438 - 1427 27 11 1992 351.0000000 368.5522663 - 1428 28 11 1992 353.0000000 399.2350274 - 1429 29 11 1992 369.0000000 476.1519594 - 1430 30 11 1992 452.0000000 463.8685447 - 1431 1 12 1992 441.0000000 393.2290950 - 1432 2 12 1992 348.0000000 430.3243555 - 1433 3 12 1992 394.0000000 467.7595425 - 1434 4 12 1992 455.0000000 508.6434999 - 1435 5 12 1992 491.0000000 534.2740274 - 1436 6 12 1992 469.0000000 478.6499898 - 1437 7 12 1992 364.0000000 462.7701693 - 1438 8 12 1992 338.0000000 420.7208685 - 1439 9 12 1992 334.0000000 361.6801071 - 1440 10 12 1992 268.0000000 309.9556040 - 1441 11 12 1992 236.0000000 305.0558328 - 1442 12 12 1992 230.0000000 309.0773767 - 1443 13 12 1992 239.0000000 286.6875238 - 1444 14 12 1992 256.0000000 247.0819360 - 1445 15 12 1992 217.0000000 220.5804519 - 1446 16 12 1992 201.0000000 205.9119149 - 1447 17 12 1992 188.0000000 195.2530938 - 1448 18 12 1992 176.0000000 181.8846354 - 1449 19 12 1992 170.0000000 169.4959415 - 1450 20 12 1992 168.0000000 164.4882436 - 1451 21 12 1992 131.0000000 169.2683977 - 1452 22 12 1992 133.0000000 169.7853231 - 1453 23 12 1992 134.0000000 157.7854017 - 1454 24 12 1992 127.0000000 149.7333134 - 1455 25 12 1992 117.0000000 143.0007430 - 1456 26 12 1992 113.0000000 136.9584118 - 1457 27 12 1992 100.0000000 131.4985282 - 1458 28 12 1992 94.0000000 126.5496329 - 1459 29 12 1992 87.0000000 122.0501784 - 1460 30 12 1992 86.0000000 117.9469959 - 1461 31 12 1992 81.0000000 114.1940260 - 1462 1 1 1993 77.0000000 110.7512613 - 1463 2 1 1993 76.0000000 107.5838632 - 1464 3 1 1993 61.0000000 104.6614202 - 1465 4 1 1993 61.0000000 101.9573248 - 1466 5 1 1993 57.0000000 99.4482464 - 1467 6 1 1993 66.0000000 116.8265667 - 1468 7 1 1993 67.0000000 135.8965880 - 1469 8 1 1993 84.0000000 138.6526973 - 1470 9 1 1993 90.0000000 145.0030830 - 1471 10 1 1993 113.0000000 190.5890213 - 1472 11 1 1993 265.0000000 387.0921144 - 1473 12 1 1993 559.0000000 555.4234285 - 1474 13 1 1993 832.0000000 557.9284156 - 1475 14 1 1993 601.0000000 490.3442569 - 1476 15 1 1993 436.0000000 412.8899894 - 1477 16 1 1993 339.0000000 351.1565224 - 1478 17 1 1993 292.0000000 305.6534675 - 1479 18 1 1993 247.0000000 270.4975767 - 1480 19 1 1993 218.0000000 239.8216751 - 1481 20 1 1993 205.0000000 216.1790199 - 1482 21 1 1993 190.0000000 202.5508803 - 1483 22 1 1993 176.0000000 195.4204577 - 1484 23 1 1993 173.0000000 189.5900406 - 1485 24 1 1993 173.0000000 245.4998525 - 1486 25 1 1993 199.0000000 336.2210776 - 1487 26 1 1993 361.0000000 289.8562595 - 1488 27 1 1993 295.0000000 296.6606286 - 1489 28 1 1993 238.0000000 316.5718044 - 1490 29 1 1993 263.0000000 298.2089714 - 1491 30 1 1993 245.0000000 266.1777885 - 1492 31 1 1993 222.0000000 236.1202889 - 1493 1 2 1993 199.0000000 212.6318660 - 1494 2 2 1993 186.0000000 193.1041202 - 1495 3 2 1993 171.0000000 177.7846762 - 1496 4 2 1993 157.0000000 165.7382226 - 1497 5 2 1993 159.0000000 156.1868752 - 1498 6 2 1993 129.0000000 149.2417167 - 1499 7 2 1993 119.0000000 143.4652486 - 1500 8 2 1993 119.0000000 138.1088029 - 1501 9 2 1993 105.0000000 133.2011150 - 1502 10 2 1993 106.0000000 128.7257208 - 1503 11 2 1993 105.0000000 124.6323805 - 1504 12 2 1993 95.0000000 120.8774514 - 1505 13 2 1993 91.0000000 117.4229271 - 1506 14 2 1993 88.0000000 114.2356296 - 1507 15 2 1993 84.0000000 111.2865297 - 1508 16 2 1993 83.0000000 108.7302620 - 1509 17 2 1993 79.0000000 109.2574734 - 1510 18 2 1993 78.0000000 110.2487721 - 1511 19 2 1993 84.0000000 109.2761578 - 1512 20 2 1993 91.0000000 122.6102639 - 1513 21 2 1993 91.0000000 126.3171526 - 1514 22 2 1993 90.0000000 123.7172209 - 1515 23 2 1993 103.0000000 118.2603526 - 1516 24 2 1993 94.0000000 114.0830542 - 1517 25 2 1993 81.0000000 110.6000850 - 1518 26 2 1993 78.0000000 107.4056776 - 1519 27 2 1993 75.0000000 107.8303199 - 1520 28 2 1993 76.0000000 107.5904185 - 1521 1 3 1993 80.0000000 104.1619835 - 1522 2 3 1993 75.0000000 103.4866064 - 1523 3 3 1993 76.0000000 102.6260771 - 1524 4 3 1993 72.0000000 99.5818353 - 1525 5 3 1993 65.0000000 97.1480072 - 1526 6 3 1993 64.0000000 94.9522073 - 1527 7 3 1993 64.0000000 93.1940987 - 1528 8 3 1993 68.0000000 92.8230304 - 1529 9 3 1993 68.0000000 90.3076859 - 1530 10 3 1993 67.0000000 90.1740172 - 1531 11 3 1993 61.0000000 91.5067412 - 1532 12 3 1993 57.0000000 92.4000161 - 1533 13 3 1993 58.0000000 89.6384867 - 1534 14 3 1993 54.0000000 87.6183698 - 1535 15 3 1993 66.0000000 85.9150622 - 1536 16 3 1993 54.0000000 84.3417583 - 1537 17 3 1993 57.0000000 82.8656863 - 1538 18 3 1993 57.0000000 81.5039975 - 1539 19 3 1993 52.0000000 80.1540006 - 1540 20 3 1993 57.0000000 78.8584240 - 1541 21 3 1993 58.0000000 78.5090607 - 1542 22 3 1993 57.0000000 94.6743471 - 1543 23 3 1993 56.0000000 96.6695569 - 1544 24 3 1993 63.0000000 86.7744131 - 1545 25 3 1993 76.0000000 84.8608180 - 1546 26 3 1993 56.0000000 83.0656261 - 1547 27 3 1993 59.0000000 81.3769812 - 1548 28 3 1993 59.0000000 79.7849409 - 1549 29 3 1993 54.0000000 78.2806245 - 1550 30 3 1993 48.0000000 76.8560881 - 1551 31 3 1993 55.0000000 75.5042168 - 1552 1 4 1993 48.0000000 76.0168187 - 1553 2 4 1993 53.0000000 78.8075017 - 1554 3 4 1993 47.0000000 76.6752084 - 1555 4 4 1993 59.0000000 83.1621783 - 1556 5 4 1993 53.0000000 102.2721171 - 1557 6 4 1993 64.0000000 97.1774850 - 1558 7 4 1993 63.0000000 87.8481005 - 1559 8 4 1993 75.0000000 86.1570662 - 1560 9 4 1993 64.0000000 83.5568936 - 1561 10 4 1993 59.0000000 85.8811409 - 1562 11 4 1993 60.0000000 91.5849476 - 1563 12 4 1993 63.0000000 89.2093137 - 1564 13 4 1993 69.0000000 87.8317872 - 1565 14 4 1993 79.0000000 86.1896812 - 1566 15 4 1993 82.0000000 83.8088557 - 1567 16 4 1993 68.0000000 82.3774739 - 1568 17 4 1993 56.0000000 80.3227831 - 1569 18 4 1993 59.0000000 78.5048055 - 1570 19 4 1993 61.0000000 76.7242182 - 1571 20 4 1993 62.0000000 75.0341956 - 1572 21 4 1993 57.0000000 73.4477149 - 1573 22 4 1993 53.0000000 71.9583913 - 1574 23 4 1993 47.0000000 70.5529719 - 1575 24 4 1993 46.0000000 69.2221809 - 1576 25 4 1993 47.0000000 67.9617727 - 1577 26 4 1993 45.0000000 66.7654989 - 1578 27 4 1993 43.0000000 65.6277521 - 1579 28 4 1993 41.0000000 64.5451216 - 1580 29 4 1993 38.0000000 63.5185641 - 1581 30 4 1993 39.0000000 62.9399210 - 1582 1 5 1993 40.0000000 62.1074312 - 1583 2 5 1993 41.0000000 63.0734994 - 1584 3 5 1993 45.0000000 61.5683271 - 1585 4 5 1993 49.0000000 60.0200745 - 1586 5 5 1993 40.0000000 59.1481421 - 1587 6 5 1993 43.0000000 58.4262630 - 1588 7 5 1993 38.0000000 58.0551938 - 1589 8 5 1993 38.0000000 58.0769395 - 1590 9 5 1993 43.0000000 56.9660423 - 1591 10 5 1993 44.0000000 56.3943535 - 1592 11 5 1993 41.0000000 56.3058568 - 1593 12 5 1993 51.0000000 64.9793113 - 1594 13 5 1993 63.0000000 100.7186333 - 1595 14 5 1993 68.0000000 70.0144980 - 1596 15 5 1993 77.0000000 59.3242060 - 1597 16 5 1993 77.0000000 58.1576434 - 1598 17 5 1993 59.0000000 57.0359441 - 1599 18 5 1993 49.0000000 55.9880475 - 1600 19 5 1993 43.0000000 61.3872236 - 1601 20 5 1993 44.0000000 69.2846155 - 1602 21 5 1993 48.0000000 63.8073117 - 1603 22 5 1993 44.0000000 56.4986473 - 1604 23 5 1993 46.0000000 55.4080480 - 1605 24 5 1993 40.0000000 54.3797301 - 1606 25 5 1993 43.0000000 53.4070158 - 1607 26 5 1993 30.0000000 53.1925647 - 1608 27 5 1993 45.0000000 63.5605576 - 1609 28 5 1993 43.0000000 66.5595064 - 1610 29 5 1993 44.0000000 56.5828550 - 1611 30 5 1993 54.0000000 59.1190029 - 1612 31 5 1993 56.0000000 58.0626296 - 1613 1 6 1993 44.0000000 52.3633198 - 1614 2 6 1993 43.0000000 53.8905576 - 1615 3 6 1993 33.0000000 59.0830145 - 1616 4 6 1993 45.0000000 52.9353089 - 1617 5 6 1993 46.0000000 50.9647171 - 1618 6 6 1993 42.0000000 50.0379886 - 1619 7 6 1993 40.0000000 49.1588448 - 1620 8 6 1993 30.0000000 48.3228289 - 1621 9 6 1993 31.0000000 47.7272593 - 1622 10 6 1993 32.0000000 47.2708997 - 1623 11 6 1993 25.0000000 47.4422024 - 1624 12 6 1993 33.0000000 48.8565672 - 1625 13 6 1993 29.0000000 46.7518666 - 1626 14 6 1993 40.0000000 48.6433826 - 1627 15 6 1993 42.0000000 50.2139265 - 1628 16 6 1993 37.0000000 47.3847216 - 1629 17 6 1993 46.0000000 45.8675383 - 1630 18 6 1993 47.0000000 44.4177825 - 1631 19 6 1993 50.0000000 46.7560220 - 1632 20 6 1993 43.0000000 73.1442695 - 1633 21 6 1993 69.0000000 61.5711771 - 1634 22 6 1993 61.0000000 67.9784744 - 1635 23 6 1993 67.0000000 75.4368707 - 1636 24 6 1993 77.0000000 56.7675169 - 1637 25 6 1993 87.0000000 54.9948108 - 1638 26 6 1993 55.0000000 53.5687626 - 1639 27 6 1993 43.0000000 52.2385242 - 1640 28 6 1993 40.0000000 50.9948937 - 1641 29 6 1993 30.0000000 49.8297960 - 1642 30 6 1993 40.0000000 48.7360047 - 1643 1 7 1993 40.0000000 50.0041926 - 1644 2 7 1993 27.0000000 49.3711846 - 1645 3 7 1993 34.0000000 46.6002209 - 1646 4 7 1993 30.0000000 45.6704351 - 1647 5 7 1993 31.0000000 44.9069863 - 1648 6 7 1993 27.0000000 43.9674006 - 1649 7 7 1993 31.0000000 43.1788815 - 1650 8 7 1993 26.0000000 42.4293274 - 1651 9 7 1993 23.0000000 42.6590897 - 1652 10 7 1993 24.0000000 43.3611649 - 1653 11 7 1993 25.0000000 47.5732181 - 1654 12 7 1993 34.0000000 56.3365289 - 1655 13 7 1993 40.0000000 53.5458966 - 1656 14 7 1993 41.0000000 73.3088759 - 1657 15 7 1993 46.0000000 58.4941134 - 1658 16 7 1993 39.0000000 45.2022873 - 1659 17 7 1993 43.0000000 44.6639974 - 1660 18 7 1993 35.0000000 44.2762459 - 1661 19 7 1993 49.0000000 63.6121204 - 1662 20 7 1993 38.0000000 61.2658778 - 1663 21 7 1993 41.0000000 56.4600078 - 1664 22 7 1993 45.0000000 51.5894009 - 1665 23 7 1993 41.0000000 45.2211627 - 1666 24 7 1993 42.0000000 44.2349062 - 1667 25 7 1993 40.0000000 43.3235878 - 1668 26 7 1993 35.0000000 42.4472738 - 1669 27 7 1993 40.0000000 66.8321354 - 1670 28 7 1993 40.0000000 54.8181041 - 1671 29 7 1993 36.0000000 42.8266445 - 1672 30 7 1993 40.0000000 98.0240574 - 1673 31 7 1993 61.0000000 74.8410467 - 1674 1 8 1993 36.0000000 49.0207662 - 1675 2 8 1993 46.0000000 47.6032548 - 1676 3 8 1993 32.0000000 46.2908585 - 1677 4 8 1993 38.0000000 45.0721190 - 1678 5 8 1993 32.0000000 43.9413273 - 1679 6 8 1993 25.0000000 42.8943242 - 1680 7 8 1993 26.0000000 41.9039619 - 1681 8 8 1993 29.0000000 40.9757490 - 1682 9 8 1993 29.0000000 49.0298419 - 1683 10 8 1993 28.0000000 50.4523560 - 1684 11 8 1993 37.0000000 43.2873140 - 1685 12 8 1993 40.0000000 39.9561925 - 1686 13 8 1993 49.0000000 39.1274050 - 1687 14 8 1993 32.0000000 40.3505990 - 1688 15 8 1993 37.0000000 38.8723609 - 1689 16 8 1993 37.0000000 37.2566222 - 1690 17 8 1993 27.0000000 36.5680391 - 1691 18 8 1993 24.0000000 35.9145267 - 1692 19 8 1993 24.0000000 35.2930134 - 1693 20 8 1993 22.0000000 34.7007934 - 1694 21 8 1993 21.0000000 34.1354269 - 1695 22 8 1993 16.0000000 35.3864482 - 1696 23 8 1993 21.0000000 38.5125036 - 1697 24 8 1993 27.0000000 35.1993005 - 1698 25 8 1993 26.0000000 32.9036113 - 1699 26 8 1993 23.0000000 32.3998950 - 1700 27 8 1993 21.0000000 35.4459663 - 1701 28 8 1993 28.0000000 36.6242469 - 1702 29 8 1993 17.0000000 31.9139845 - 1703 30 8 1993 24.0000000 31.4352638 - 1704 31 8 1993 25.0000000 30.9752775 - 1705 1 9 1993 25.0000000 30.5320927 - 1706 2 9 1993 19.0000000 30.1044806 - 1707 3 9 1993 17.0000000 33.2136916 - 1708 4 9 1993 16.0000000 37.5065695 - 1709 5 9 1993 19.0000000 30.5512411 - 1710 6 9 1993 23.0000000 29.6406743 - 1711 7 9 1993 25.0000000 52.6935573 - 1712 8 9 1993 34.0000000 44.3549147 - 1713 9 9 1993 31.0000000 57.2542107 - 1714 10 9 1993 35.0000000 80.5034888 - 1715 11 9 1993 53.0000000 103.9191034 - 1716 12 9 1993 71.0000000 94.2194735 - 1717 13 9 1993 74.0000000 123.6014656 - 1718 14 9 1993 87.0000000 132.4786550 - 1719 15 9 1993 173.0000000 122.1875755 - 1720 16 9 1993 117.0000000 92.8433015 - 1721 17 9 1993 93.0000000 79.2598716 - 1722 18 9 1993 77.0000000 73.5972728 - 1723 19 9 1993 62.0000000 69.3377101 - 1724 20 9 1993 54.0000000 65.5987717 - 1725 21 9 1993 48.0000000 65.2218148 - 1726 22 9 1993 46.0000000 87.6195417 - 1727 23 9 1993 55.0000000 91.7492062 - 1728 24 9 1993 66.0000000 94.5316085 - 1729 25 9 1993 64.0000000 90.1363598 - 1730 26 9 1993 52.0000000 78.9650811 - 1731 27 9 1993 68.0000000 74.2404229 - 1732 28 9 1993 69.0000000 79.7910983 - 1733 29 9 1993 62.0000000 77.9374386 - 1734 30 9 1993 76.0000000 73.6533286 - 1735 1 10 1993 72.0000000 99.5013339 - 1736 2 10 1993 68.0000000 101.0642602 - 1737 3 10 1993 72.0000000 99.3646043 - 1738 4 10 1993 78.0000000 106.3801283 - 1739 5 10 1993 116.0000000 175.9695695 - 1740 6 10 1993 131.0000000 178.3374962 - 1741 7 10 1993 180.0000000 156.5938113 - 1742 8 10 1993 203.0000000 159.8732885 - 1743 9 10 1993 164.0000000 169.7736582 - 1744 10 10 1993 178.0000000 189.2656217 - 1745 11 10 1993 161.0000000 222.6395337 - 1746 12 10 1993 287.0000000 226.9104373 - 1747 13 10 1993 360.0000000 292.8901651 - 1748 14 10 1993 374.0000000 292.7891975 - 1749 15 10 1993 297.0000000 260.0311070 - 1750 16 10 1993 247.0000000 268.5634126 - 1751 17 10 1993 273.0000000 273.6071912 - 1752 18 10 1993 261.0000000 246.5690291 - 1753 19 10 1993 265.0000000 222.0210625 - 1754 20 10 1993 230.0000000 193.4715111 - 1755 21 10 1993 199.0000000 173.8911640 - 1756 22 10 1993 173.0000000 169.1430137 - 1757 23 10 1993 182.0000000 188.6315002 - 1758 24 10 1993 203.0000000 191.6620267 - 1759 25 10 1993 213.0000000 169.9793850 - 1760 26 10 1993 180.0000000 150.2146092 - 1761 27 10 1993 154.0000000 134.8444796 - 1762 28 10 1993 118.0000000 123.4099040 - 1763 29 10 1993 112.0000000 115.1985493 - 1764 30 10 1993 98.0000000 109.3653561 - 1765 31 10 1993 97.0000000 104.1907690 - 1766 1 11 1993 91.0000000 99.5221811 - 1767 2 11 1993 85.0000000 95.2984279 - 1768 3 11 1993 75.0000000 91.4666866 - 1769 4 11 1993 76.0000000 87.9812000 - 1770 5 11 1993 78.0000000 84.8022243 - 1771 6 11 1993 72.0000000 81.9712802 - 1772 7 11 1993 76.0000000 82.1806499 - 1773 8 11 1993 69.0000000 79.7626809 - 1774 9 11 1993 66.0000000 77.4803651 - 1775 10 11 1993 71.0000000 78.0037432 - 1776 11 11 1993 64.0000000 88.0881973 - 1777 12 11 1993 67.0000000 91.1459150 - 1778 13 11 1993 80.0000000 91.1444664 - 1779 14 11 1993 78.0000000 119.9614994 - 1780 15 11 1993 80.0000000 121.3357170 - 1781 16 11 1993 86.0000000 110.7392348 - 1782 17 11 1993 125.0000000 103.0468850 - 1783 18 11 1993 96.0000000 98.4823694 - 1784 19 11 1993 82.0000000 94.3493519 - 1785 20 11 1993 77.0000000 90.5968641 - 1786 21 11 1993 67.0000000 87.1807699 - 1787 22 11 1993 71.0000000 84.0626991 - 1788 23 11 1993 61.0000000 81.2092086 - 1789 24 11 1993 42.0000000 78.5910795 - 1790 25 11 1993 63.0000000 76.5562380 - 1791 26 11 1993 57.0000000 75.7431246 - 1792 27 11 1993 58.0000000 73.0304813 - 1793 28 11 1993 49.0000000 71.0673493 - 1794 29 11 1993 50.0000000 69.2438032 - 1795 30 11 1993 55.0000000 67.5457715 - 1796 1 12 1993 54.0000000 65.9608458 - 1797 2 12 1993 54.0000000 72.5175387 - 1798 3 12 1993 50.0000000 70.2952465 - 1799 4 12 1993 51.0000000 72.6691740 - 1800 5 12 1993 62.0000000 69.3663863 - 1801 6 12 1993 62.0000000 66.8057861 - 1802 7 12 1993 71.0000000 98.3175578 - 1803 8 12 1993 79.0000000 159.7770782 - 1804 9 12 1993 153.0000000 179.6526959 - 1805 10 12 1993 291.0000000 242.3090002 - 1806 11 12 1993 332.0000000 317.3685831 - 1807 12 12 1993 465.0000000 370.6036716 - 1808 13 12 1993 518.0000000 427.2036936 - 1809 14 12 1993 539.0000000 454.7485489 - 1810 15 12 1993 559.0000000 459.4138481 - 1811 16 12 1993 500.0000000 521.8489459 - 1812 17 12 1993 526.0000000 553.7394225 - 1813 18 12 1993 583.0000000 568.0876937 - 1814 19 12 1993 677.0000000 645.4257238 - 1815 20 12 1993 781.0000000 943.8106329 - 1816 21 12 1993 1180.0000000 1057.8486602 - 1817 22 12 1993 1460.0000000 1052.5284165 - 1818 23 12 1993 1600.0000000 1086.8754165 - 1819 24 12 1993 1410.0000000 1071.6802081 - 1820 25 12 1993 1230.0000000 923.4042186 - 1821 26 12 1993 1070.0000000 769.3277403 - 1822 27 12 1993 746.0000000 648.3087417 - 1823 28 12 1993 542.0000000 559.5622235 - 1824 29 12 1993 492.0000000 557.0504284 - 1825 30 12 1993 491.0000000 627.1328575 - 1826 31 12 1993 617.0000000 803.9717919 diff --git a/check/case_07/output_save/dds_results.out b/check/case_07/output_save/dds_results.out index 46eb99f9..dd91ffdb 100644 --- a/check/case_07/output_save/dds_results.out +++ b/check/case_07/output_save/dds_results.out @@ -1,13 +1,13 @@ # settings :: general # nIterations iseed - 6 1235876 + 6 1235876 # settings :: dds specific # dds_r - 0.20000000000000001 + 0.200000000000000 # iter bestf (bestx(j),j=1,nopt) - 0 0.23004516975063258 0.14999999999999999 1.0000000000000000 1.5000000000000000 0.50000000000000000 0.50000000000000000 0.50000000000000000 3.0000000000000000 3.5000000000000000 4.0000000000000000 3.3999999999999999 0.10000000000000001 0.59999999999999998 0.76000000000000001 8.9999999999999998E-004 -0.26400000000000001 0.89000000000000001 -1.0000000000000000E-003 -0.32400000000000001 -0.58499999999999996 1.2500000000000001E-002 6.3000000000000000E-003 60.960000000000001 0.96999999999999997 0.93000000000000005 2.0000000000000000E-002 1.7500000000000000 0.50000000000000000 0.90000000000000002 0.10000000000000001 180.00000000000000 85.000000000000000 7.0000000000000000 1.5000000000000000 15.000000000000000 0.12500000000000000 35.000000000000000 -1.0000000000000000 1.0000000000000000 0.32500000000000001 7.4999999999999997E-002 2.0000000000000000 0.10000000000000001 0.29999999999999999 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 - 1 0.23004516975063258 0.14999999999999999 1.0000000000000000 1.5000000000000000 0.50000000000000000 0.50000000000000000 0.50000000000000000 3.0000000000000000 3.5000000000000000 4.0000000000000000 3.3999999999999999 0.10000000000000001 0.59999999999999998 0.76000000000000001 8.9999999999999998E-004 -0.26400000000000001 0.89000000000000001 -1.0000000000000000E-003 -0.32400000000000001 -0.58499999999999996 1.2500000000000001E-002 6.3000000000000000E-003 60.960000000000001 0.96999999999999997 0.93000000000000005 2.0000000000000000E-002 1.7500000000000000 0.50000000000000000 0.90000000000000002 0.10000000000000001 180.00000000000000 85.000000000000000 7.0000000000000000 1.5000000000000000 15.000000000000000 0.12500000000000000 35.000000000000000 -1.0000000000000000 1.0000000000000000 0.32500000000000001 7.4999999999999997E-002 2.0000000000000000 0.10000000000000001 0.29999999999999999 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 - 2 0.23004516975063258 0.14999999999999999 1.0000000000000000 1.5000000000000000 0.50000000000000000 0.50000000000000000 0.50000000000000000 3.0000000000000000 3.5000000000000000 4.0000000000000000 3.3999999999999999 0.10000000000000001 0.59999999999999998 0.76000000000000001 8.9999999999999998E-004 -0.26400000000000001 0.89000000000000001 -1.0000000000000000E-003 -0.32400000000000001 -0.58499999999999996 1.2500000000000001E-002 6.3000000000000000E-003 60.960000000000001 0.96999999999999997 0.93000000000000005 2.0000000000000000E-002 1.7500000000000000 0.50000000000000000 0.90000000000000002 0.10000000000000001 180.00000000000000 85.000000000000000 7.0000000000000000 1.5000000000000000 15.000000000000000 0.12500000000000000 35.000000000000000 -1.0000000000000000 1.0000000000000000 0.32500000000000001 7.4999999999999997E-002 2.0000000000000000 0.10000000000000001 0.29999999999999999 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 - 3 0.21200647553837013 0.14999999999999999 1.5064768574397209 2.1453073311063742 0.75566902046169715 0.50000000000000000 0.50000000000000000 3.0000000000000000 4.3361937741322478 4.0000000000000000 3.3999999999999999 0.10000000000000001 0.59999999999999998 0.76000000000000001 8.9999999999999998E-004 -0.26773190498961208 0.89000000000000001 -1.0000000000000000E-003 -0.32400000000000001 -0.58499999999999996 1.2500000000000001E-002 6.3000000000000000E-003 60.960000000000001 0.96999999999999997 0.91540093875343109 9.0555724235273326E-003 2.6369283951057225 0.50000000000000000 0.90000000000000002 0.10000000000000001 180.00000000000000 77.784913013774258 9.3568342545530570 1.5000000000000000 15.000000000000000 0.12879550304881818 35.000000000000000 -1.0000000000000000 1.0000000000000000 0.33010707234176839 7.3512408407822707E-002 2.0000000000000000 0.10000000000000001 0.29999999999999999 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 97.828301390331916 100.00000000000000 - 4 0.21200647553837013 0.14999999999999999 1.5064768574397209 2.1453073311063742 0.75566902046169715 0.50000000000000000 0.50000000000000000 3.0000000000000000 4.3361937741322478 4.0000000000000000 3.3999999999999999 0.10000000000000001 0.59999999999999998 0.76000000000000001 8.9999999999999998E-004 -0.26773190498961208 0.89000000000000001 -1.0000000000000000E-003 -0.32400000000000001 -0.58499999999999996 1.2500000000000001E-002 6.3000000000000000E-003 60.960000000000001 0.96999999999999997 0.91540093875343109 9.0555724235273326E-003 2.6369283951057225 0.50000000000000000 0.90000000000000002 0.10000000000000001 180.00000000000000 77.784913013774258 9.3568342545530570 1.5000000000000000 15.000000000000000 0.12879550304881818 35.000000000000000 -1.0000000000000000 1.0000000000000000 0.33010707234176839 7.3512408407822707E-002 2.0000000000000000 0.10000000000000001 0.29999999999999999 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 97.828301390331916 100.00000000000000 - 5 0.21200647553837013 0.14999999999999999 1.5064768574397209 2.1453073311063742 0.75566902046169715 0.50000000000000000 0.50000000000000000 3.0000000000000000 4.3361937741322478 4.0000000000000000 3.3999999999999999 0.10000000000000001 0.59999999999999998 0.76000000000000001 8.9999999999999998E-004 -0.26773190498961208 0.89000000000000001 -1.0000000000000000E-003 -0.32400000000000001 -0.58499999999999996 1.2500000000000001E-002 6.3000000000000000E-003 60.960000000000001 0.96999999999999997 0.91540093875343109 9.0555724235273326E-003 2.6369283951057225 0.50000000000000000 0.90000000000000002 0.10000000000000001 180.00000000000000 77.784913013774258 9.3568342545530570 1.5000000000000000 15.000000000000000 0.12879550304881818 35.000000000000000 -1.0000000000000000 1.0000000000000000 0.33010707234176839 7.3512408407822707E-002 2.0000000000000000 0.10000000000000001 0.29999999999999999 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 100.00000000000000 97.828301390331916 100.00000000000000 + 0 0.438747726272727 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 + 1 0.438747726272727 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 + 2 0.300617517804139 0.170272652859209 0.633288797856814 1.68923859529170 0.369004731292571 0.888690284812682 0.652637053450513 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 3.782755091430436E-002 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.335899941466228 -0.862347121812413 1.633336631576477E-002 8.348282790118702E-003 60.9600000000000 0.960788338858429 0.930000000000000 4.861547473059242E-003 1.75000000000000 0.500000000000000 0.891056377266973 0.157705816507799 176.663184163832 85.0000000000000 7.00000000000000 1.03825481904006 5.31918899848635 0.169184559384084 36.5754591153712 -2.67552110572591 1.00000000000000 0.325000000000000 7.240678693321727E-002 1.97104290232356 9.479607164559140E-002 0.300000000000000 118.426283067649 149.209301691405 156.814258020683 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 70.1308689232077 182.638112554114 + 3 0.300617517804139 0.170272652859209 0.633288797856814 1.68923859529170 0.369004731292571 0.888690284812682 0.652637053450513 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 3.782755091430436E-002 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.335899941466228 -0.862347121812413 1.633336631576477E-002 8.348282790118702E-003 60.9600000000000 0.960788338858429 0.930000000000000 4.861547473059242E-003 1.75000000000000 0.500000000000000 0.891056377266973 0.157705816507799 176.663184163832 85.0000000000000 7.00000000000000 1.03825481904006 5.31918899848635 0.169184559384084 36.5754591153712 -2.67552110572591 1.00000000000000 0.325000000000000 7.240678693321727E-002 1.97104290232356 9.479607164559140E-002 0.300000000000000 118.426283067649 149.209301691405 156.814258020683 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 70.1308689232077 182.638112554114 + 4 0.275991832840917 0.170272652859209 0.633288797856814 1.68923859529170 0.369004731292571 0.888690284812682 0.652637053450513 3.00000000000000 3.50000000000000 5.07896129988637 3.40000000000000 3.782755091430436E-002 0.600000000000000 0.763494578333013 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.437075052345831 -0.862347121812413 1.633336631576477E-002 8.348282790118702E-003 60.9600000000000 0.960788338858429 0.930000000000000 4.861547473059242E-003 1.75000000000000 0.500000000000000 0.891056377266973 0.157705816507799 176.663184163832 142.187809280139 7.00000000000000 1.03825481904006 5.31918899848635 0.160757447003667 36.5754591153712 -3.47577847622492 1.00000000000000 0.325000000000000 7.240678693321727E-002 1.97104290232356 9.479607164559140E-002 0.300000000000000 118.426283067649 149.209301691405 156.814258020683 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 70.1308689232077 182.638112554114 + 5 0.275991832840917 0.170272652859209 0.633288797856814 1.68923859529170 0.369004731292571 0.888690284812682 0.652637053450513 3.00000000000000 3.50000000000000 5.07896129988637 3.40000000000000 3.782755091430436E-002 0.600000000000000 0.763494578333013 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.437075052345831 -0.862347121812413 1.633336631576477E-002 8.348282790118702E-003 60.9600000000000 0.960788338858429 0.930000000000000 4.861547473059242E-003 1.75000000000000 0.500000000000000 0.891056377266973 0.157705816507799 176.663184163832 142.187809280139 7.00000000000000 1.03825481904006 5.31918899848635 0.160757447003667 36.5754591153712 -3.47577847622492 1.00000000000000 0.325000000000000 7.240678693321727E-002 1.97104290232356 9.479607164559140E-002 0.300000000000000 118.426283067649 149.209301691405 156.814258020683 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 70.1308689232077 182.638112554114 diff --git a/check/case_07/simulation_mhm_case07.ini b/check/case_07/simulation_mhm_case07.ini new file mode 100644 index 00000000..89165e58 --- /dev/null +++ b/check/case_07/simulation_mhm_case07.ini @@ -0,0 +1,24 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_07 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig__nbasins = 1 +nml__mainconfig_mhm_mrm__optimize = True +nml__mainconfig_mhm_mrm__opti_method = 1 +nml__mainconfig_mhm_mrm__opti_function = 15 +nml__optimization__niterations = 6 +nml__directories_mhm__time_step_model_inputs = [0] +nml__optional_data__file_tws = [../../test_basin/input/optional_data/tws_basin_1.txt] +nml__time_periods__warming_days = [0] +nml__time_periods__eval_per(1) = {ystart: 1989, mstart: 1, dstart: 1, yend: 1993, mend: 12, dend: 31} diff --git a/check/case_08/mhm.nml b/check/case_08/mhm.nml index 1072cd8b..367f54b6 100644 --- a/check/case_08/mhm.nml +++ b/check/case_08/mhm.nml @@ -1,549 +1,145 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells -! Matthias Zink, Mar 2015 - added optional soil mositure read in for calibration -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ - -!****************************************************************************************** -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 1 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 12000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 12000 -!---------------------------------------------------------------------------- -!> specify same index for basins to share L0_data to save memory \n -!> the index must MONOTONICALLY increase. Index can be repeated. e.g., 1,1,2,2,3 \n -!> but not 1,2,1. The correct way should be: 1,1,2.\n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .TRUE. -!> Optimization shall be restarted from ./mo_.restart file, which -!> should be located next to the mhm executable (mhm) -optimize_restart = .FALSE. -!> (0) MCMC (requires single-objective (SO) function) \n -!> (1) DDS (requires single-objective (SO) function) \n -!> (2) Simulated Annealing (requires single-objective (SO) function) \n -!> (3) SCE (requires single-objective (SO) function) \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) SO: Q: 1.0 - NSE \n -!> (2) SO: Q: 1.0 - lnNSE \n -!> (3) SO: Q: 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) SO: Q: ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SO: Q: SSE \n -!> (7) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) SO: Q: -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) SO: Q: 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (10) SO: SM: 1.0 - KGE of catchment average soilmoisture \n -!> (11) SO: SM: 1.0 - Pattern dissimilarity (PD) of spatially distributed soil moisture \n -!> (12) SO: SM: Sum of squared errors (SSE) of spatially distributed standard score (normalization) of soil moisture \n -!> (13) SO: SM: 1.0 - average temporal correlation of spatially distributed soil moisture \n -!> (14) SO: Q: sum[((1.0-KGE_i)/ nGauges)**6]**(1/6) > combination of KGE of every gauging station based on a power-6 norm \n -!> (15) SO: Q + basin_avg_TWS: [1.0-KGE(Q)]*RMSE(basin_avg_TWS) - objective function using Q and basin average (standard score) TWS\n -!> (16) (reserved) please use the next number when implementing a new one -!> (17) SO: N: SSE for spatio-temporal neutron data, catchment-average -!> further functions can be implemented in mo_objective_function -opti_function = 17 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. -/ - -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model (general coupling)\n -!> 2 = coupling to mHM\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_2.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in "evaluation_gauges" namelist.\n - -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -!> directory where simulated runoff can be found (only required if coupling mode equals 1) -dir_Total_Runoff(1) = '../../test_basin/output_b1/' +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = 0 / -! general directories used by mRM and mHM -&directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "../../test_basin/restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_2.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -! directories used only by mhm -&directories_mHM -! -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "../../test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 -! -!> basin average total water storage (tws) \n -!> file name including path with timeseries of GRACE-based data -file_tws(1) = "../../test_basin/input/optional_data/tws_basin_1.txt" -! -!> directory to neutron data -! expected file name: neutrons.nc, expected variable name: neutrons -dir_neutrons(1) = "../../test_basin/input/optional_data/" +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 0 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1989 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' - -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1990 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 12000 + write_restart = .true. +/ + +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 17 + opti_method = 1 + optimize = .true. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 12000 + timestep = 1 +/ + +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' +/ + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. +/ + +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 6 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed above the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soil moisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> baseflow -!> 1 - recession parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 1 +&optional_data + dir_neutrons(1) = '../../test_basin/input/optional_data/' / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 1 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = -9 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "" -!> consider flows from upstream/headwater cells of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_Headwater(1,1) = .FALSE. +&processselection + processcase(1:10) = 1, 1, 1, 1, 0, 1, 1, 1, 1, 1 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 6 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 -! ------------------------------------- -!> MCMC specific: \n -! ------------------------------------- -!> .true.: use MCMC for optimisation and estimation of parameter uncertainty -!> .false.: use MCMC for estimation of parameter uncertainty -mcmc_opti = .false. -!> Parameters of error model if mcmc_opti=.false. -!> e.g. for opti_function=8: two parameters a and b: err = a + b*Q -mcmc_error_params = 0.01, 0.6 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_08/output_save/ConfigFile.log b/check/case_08/output_save/ConfigFile.log index 2e3a006d..ca4c9b8f 100644 --- a/check/case_08/output_save/ConfigFile.log +++ b/check/case_08/output_save/ConfigFile.log @@ -1,18 +1,21 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.5 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N Number of basins 1 -Total No. of nodes 109 -Total No. of reaches 108 +Total No. of gauges 1 +Time Step [h] 1 + Basin 1 No. of cells L0 46545 + Basin 1 No. of cells L1 109 +Total No. of nodes 109 +Total No. of reaches 108 No. of cells L11 109 Total No. of gauges 1 -Time Step [h] 1 Basin 1 Hydrology Resolution [m] 12000. Basin 1 Routing Resolution [m] 12000. Flag READ restart F @@ -23,20 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 1 1 1990 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 1 1 1990 31 12 1993 - +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1990 1 lc_1990.asc - 1991 1 lc_1990.asc - 1992 1 lc_1990.asc - 1993 1 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -108,7 +106,7 @@ Simulation Period (1)+(2) 1 1 1990 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 + 1 1 932.000 16.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -124,7 +122,7 @@ Directory to precipitation input ../../test_basin/input/meteo/pre/ Directory to temperature input ../../test_basin/input/meteo/tavg/ Directory to reference ET input ../../test_basin/input/meteo/pet/ Directory to write output by default output_b1/b1_ -Directory to write output when restarted output_b1/ +Directory to write output when restarted output_b1/b1_ ------------------------------ River Network (Routing level) @@ -252,115 +250,115 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 - 35 35 - 36 36 - 37 37 - 38 38 - 39 39 - 40 40 - 41 41 - 42 42 - 43 43 - 44 44 - 45 45 - 46 46 - 47 47 - 48 48 - 49 49 - 50 50 - 51 51 - 52 52 - 53 53 - 54 54 - 55 55 - 56 56 - 57 57 - 58 58 - 59 59 - 60 60 - 61 61 - 62 62 - 63 63 - 64 64 - 65 65 - 66 66 - 67 67 - 68 68 - 69 69 - 70 70 - 71 71 - 72 72 - 73 73 - 74 74 - 75 75 - 76 76 - 77 77 - 78 78 - 79 79 - 80 80 - 81 81 - 82 82 - 83 83 - 84 84 - 85 85 - 86 86 - 87 87 - 88 88 - 89 89 - 90 90 - 91 91 - 92 92 - 93 93 - 94 94 - 95 95 - 96 96 - 97 97 - 98 98 - 99 99 - 100 100 - 101 101 - 102 102 - 103 103 - 104 104 - 105 105 - 106 106 - 107 107 - 108 108 - 109 109 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 ------------------------------ Modeling Routing Effective @@ -479,4 +477,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - + diff --git a/check/case_08/output_save/FinalParam.nml b/check/case_08/output_save/FinalParam.nml index 4893d2b2..6c2ede2a 100644 --- a/check/case_08/output_save/FinalParam.nml +++ b/check/case_08/output_save/FinalParam.nml @@ -1,103 +1,165 @@ !global_parameters - !PARAMETER lower_bound upper_bound value FLAG SCALING + !PARAMETER lower_bound upper_bound value FLAG + SCALING ! interception &interception1 - canopyInterceptionFactor = 0.14999999999999999 , 0.40000000000000002 , 0.14999999999999999 , 1 , 1 + canopyInterceptionFactor = 0.150000000000000 , 0.400000000000000 + , 0.150000000000000 , 1 , 1 / ! snow &snow1 - snowTreshholdTemperature = -2.0000000000000000 , 2.0000000000000000 , 1.0000000000000000 , 1 , 1 - degreeDayFactor_forest = 1.0000000000000000E-004 , 4.0000000000000000 , 1.5000000000000000 , 1 , 1 - degreeDayFactor_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.50000000000000000 , 1 , 1 - degreeDayFactor_pervious = 0.0000000000000000 , 2.0000000000000000 , 0.50000000000000000 , 1 , 1 - increaseDegreeDayFactorByPrecip = 0.10000000000000001 , 0.90000000000000002 , 0.50000000000000000 , 1 , 1 - maxDegreeDayFactor_forest = 0.0000000000000000 , 8.0000000000000000 , 3.0000000000000000 , 1 , 1 - maxDegreeDayFactor_impervious = 0.0000000000000000 , 8.0000000000000000 , 3.5000000000000000 , 1 , 1 - maxDegreeDayFactor_pervious = 0.0000000000000000 , 8.0000000000000000 , 4.0000000000000000 , 1 , 1 + snowTreshholdTemperature = -2.00000000000000 , 2.00000000000000 + , 1.00000000000000 , 1 , 1 + degreeDayFactor_forest = 1.000000000000000E-004 , 4.00000000000000 + , 1.50000000000000 , 1 , 1 + degreeDayFactor_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 0.500000000000000 , 1 , 1 + degreeDayFactor_pervious = 0.000000000000000E+000 , 2.00000000000000 + , 0.500000000000000 , 1 , 1 + increaseDegreeDayFactorByPrecip = 0.100000000000000 , + 0.900000000000000 , 0.500000000000000 , 1 , 1 + maxDegreeDayFactor_forest = 0.000000000000000E+000 , + 8.00000000000000 , 3.00000000000000 , 1 , 1 + maxDegreeDayFactor_impervious = 0.000000000000000E+000 , + 8.00000000000000 , 3.50000000000000 , 1 , 1 + maxDegreeDayFactor_pervious = 0.000000000000000E+000 , + 8.00000000000000 , 4.00000000000000 , 1 , 1 / ! soilmoisture &soilmoisture1 - orgMatterContent_forest = 0.0000000000000000 , 20.000000000000000 , 3.3999999999999999 , 1 , 1 - orgMatterContent_impervious = 0.0000000000000000 , 1.0000000000000000 , 0.10000000000000001 , 1 , 1 - orgMatterContent_pervious = 0.0000000000000000 , 4.0000000000000000 , 0.59999999999999998 , 1 , 1 - PTF_lower66_5_constant = 0.64620000000000000 , 0.95060000000000000 , 0.76000000000000001 , 1 , 1 - PTF_lower66_5_clay = 1.0000000000000000E-004 , 2.8999999999999998E-003 , 8.9999999999999998E-004 , 1 , 1 - PTF_lower66_5_Db = -0.37269999999999998 , -0.18709999999999999 , -0.26400000000000001 , 1 , 1 - PTF_higher66_5_constant = 0.53580000000000005 , 1.1232000000000000 , 0.89000000000000001 , 1 , 1 - PTF_higher66_5_clay = -5.4999999999999997E-003 , 4.8999999999999998E-003 , -1.0000000000000000E-003 , 1 , 1 - PTF_higher66_5_Db = -0.55130000000000001 , -9.1300000000000006E-002 , -0.32400000000000001 , 1 , 1 - PTF_Ks_constant = -1.2000000000000000 , -0.28499999999999998 , -0.58499999999999996 , 1 , 1 - PTF_Ks_sand = 6.0000000000000001E-003 , 2.5999999999999999E-002 , 1.2500000000000001E-002 , 1 , 1 - PTF_Ks_clay = 3.0000000000000001E-003 , 1.2999999999999999E-002 , 6.3000000000000000E-003 , 1 , 1 - PTF_Ks_curveSlope = 60.960000000000001 , 60.960000000000001 , 60.960000000000001 , 0 , 1 - rootFractionCoefficient_forest = 0.90000000000000002 , 0.99900000000000000 , 0.96999999999999997 , 1 , 1 - rootFractionCoefficient_impervious = 0.90000000000000002 , 0.94999999999999996 , 0.93000000000000005 , 1 , 1 - rootFractionCoefficient_pervious = 1.0000000000000000E-003 , 8.9999999999999997E-002 , 2.0000000000000000E-002 , 1 , 1 - infiltrationShapeFactor = 1.0000000000000000 , 4.0000000000000000 , 1.7500000000000000 , 1 , 1 + orgMatterContent_forest = 0.000000000000000E+000 , 20.0000000000000 + , 3.40000000000000 , 1 , 1 + orgMatterContent_impervious = 0.000000000000000E+000 , + 1.00000000000000 , 0.100000000000000 , 1 , 1 + orgMatterContent_pervious = 0.000000000000000E+000 , + 4.00000000000000 , 0.600000000000000 , 1 , 1 + PTF_lower66_5_constant = 0.646200000000000 , 0.950600000000000 + , 0.760000000000000 , 1 , 1 + PTF_lower66_5_clay = 1.000000000000000E-004 , 2.900000000000000E-003 , + 9.000000000000000E-004 , 1 , 1 + PTF_lower66_5_Db = -0.372700000000000 , -0.187100000000000 , + -0.264000000000000 , 1 , 1 + PTF_higher66_5_constant = 0.535800000000000 , 1.12320000000000 + , 0.890000000000000 , 1 , 1 + PTF_higher66_5_clay = -5.500000000000000E-003 , 4.900000000000000E-003 , + -1.000000000000000E-003 , 1 , 1 + PTF_higher66_5_Db = -0.551300000000000 , -9.130000000000001E-002 , + -0.324000000000000 , 1 , 1 + PTF_Ks_constant = -1.20000000000000 , -0.285000000000000 , + -0.585000000000000 , 1 , 1 + PTF_Ks_sand = 6.000000000000000E-003 , 2.600000000000000E-002 , + 1.250000000000000E-002 , 1 , 1 + PTF_Ks_clay = 3.000000000000000E-003 , 1.300000000000000E-002 , + 6.300000000000000E-003 , 1 , 1 + PTF_Ks_curveSlope = 60.9600000000000 , 60.9600000000000 , + 60.9600000000000 , 0 , 1 + rootFractionCoefficient_forest = 0.900000000000000 , + 0.999000000000000 , 0.970000000000000 , 1 , 1 + rootFractionCoefficient_impervious = 0.900000000000000 , + 0.950000000000000 , 0.930000000000000 , 1 , 1 + rootFractionCoefficient_pervious = 1.000000000000000E-003 , + 9.000000000000000E-002 , 2.000000000000000E-002 , 1 , 1 + infiltrationShapeFactor = 1.00000000000000 , 4.00000000000000 + , 1.75000000000000 , 1 , 1 / ! directSealedAreaRunoff &directRunoff1 - imperviousStorageCapacity = 0.0000000000000000 , 5.0000000000000000 , 0.50000000000000000 , 1 , 1 + imperviousStorageCapacity = 0.000000000000000E+000 , + 5.00000000000000 , 0.500000000000000 , 1 , 1 / ! potential evapotranspiration &PET0 - minCorrectionFactorPET = 0.69999999999999996 , 1.3000000000000000 , 0.90000000000000002 , 1 , 1 - maxCorrectionFactorPET = 0.0000000000000000 , 0.20000000000000001 , 0.10000000000000001 , 1 , 1 - aspectTresholdPET = 160.00000000000000 , 200.00000000000000 , 180.00000000000000 , 1 , 1 + minCorrectionFactorPET = 0.700000000000000 , 1.30000000000000 + , 0.900000000000000 , 1 , 1 + maxCorrectionFactorPET = 0.000000000000000E+000 , 0.200000000000000 + , 0.100000000000000 , 1 , 1 + aspectTresholdPET = 160.000000000000 , 200.000000000000 , + 180.000000000000 , 1 , 1 / ! interflow &interflow1 - interflowStorageCapacityFactor = 75.000000000000000 , 200.00000000000000 , 85.000000000000000 , 1 , 1 - interflowRecession_slope = 0.0000000000000000 , 10.000000000000000 , 7.0000000000000000 , 1 , 1 - fastInterflowRecession_forest = 1.0000000000000000 , 3.0000000000000000 , 1.5000000000000000 , 1 , 1 - slowInterflowRecession_Ks = 1.0000000000000000 , 30.000000000000000 , 15.000000000000000 , 1 , 1 - exponentSlowInterflow = 5.0000000000000003E-002 , 0.29999999999999999 , 0.12500000000000000 , 1 , 1 + interflowStorageCapacityFactor = 75.0000000000000 , + 200.000000000000 , 85.0000000000000 , 1 , 1 + interflowRecession_slope = 0.000000000000000E+000 , 10.0000000000000 + , 7.00000000000000 , 1 , 1 + fastInterflowRecession_forest = 1.00000000000000 , + 3.00000000000000 , 1.50000000000000 , 1 , 1 + slowInterflowRecession_Ks = 1.00000000000000 , + 30.0000000000000 , 15.0000000000000 , 1 , 1 + exponentSlowInterflow = 5.000000000000000E-002 , 0.300000000000000 , + 0.125000000000000 , 1 , 1 / ! percolation &percolation1 - rechargeCoefficient = 0.0000000000000000 , 50.000000000000000 , 35.000000000000000 , 1 , 1 - rechargeFactor_karstic = -5.0000000000000000 , 5.0000000000000000 , -1.0000000000000000 , 1 , 1 - gain_loss_GWreservoir_karstic = 1.0000000000000000 , 1.0000000000000000 , 1.0000000000000000 , 0 , 1 + rechargeCoefficient = 0.000000000000000E+000 , 50.0000000000000 , + 35.0000000000000 , 1 , 1 + rechargeFactor_karstic = -5.00000000000000 , 5.00000000000000 + , -1.00000000000000 , 1 , 1 + gain_loss_GWreservoir_karstic = 1.00000000000000 , + 1.00000000000000 , 1.00000000000000 , 0 , 1 / ! routing &routing1 - muskingumTravelTime_constant = 0.31000000000000000 , 0.34999999999999998 , 0.32500000000000001 , 1 , 1 - muskingumTravelTime_riverLength = 7.0000000000000007E-002 , 8.0000000000000002E-002 , 7.4999999999999997E-002 , 1 , 1 - muskingumTravelTime_riverSlope = 1.9500000000000000 , 2.1000000000000001 , 2.0000000000000000 , 1 , 1 - muskingumTravelTime_impervious = 8.9999999999999997E-002 , 0.11000000000000000 , 0.10000000000000001 , 1 , 1 - muskingumAttenuation_riverSlope = 1.0000000000000000E-002 , 0.50000000000000000 , 0.29999999999999999 , 1 , 1 + muskingumTravelTime_constant = 0.310000000000000 , + 0.350000000000000 , 0.325000000000000 , 1 , 1 + muskingumTravelTime_riverLength = 7.000000000000001E-002 , + 8.000000000000000E-002 , 7.500000000000000E-002 , 1 , 1 + muskingumTravelTime_riverSlope = 1.95000000000000 , + 2.10000000000000 , 2.00000000000000 , 1 , 1 + muskingumTravelTime_impervious = 9.000000000000000E-002 , + 0.110000000000000 , 0.100000000000000 , 1 , 1 + muskingumAttenuation_riverSlope = 1.000000000000000E-002 , + 0.500000000000000 , 0.300000000000000 , 1 , 1 / ! geology &geoparameter - GeoParam(1,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(2,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(3,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(4,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(5,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(6,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(7,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(8,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 0 , 1 - GeoParam(9,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 - GeoParam(10,:) = 1.0000000000000000 , 1000.0000000000000 , 100.00000000000000 , 1 , 1 + GeoParam(1,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(2,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(3,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(4,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(5,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(6,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(7,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(8,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 0 , 1 + GeoParam(9,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 + GeoParam(10,:) = 1.00000000000000 , 1000.00000000000 , + 100.000000000000 , 1 , 1 / ! neutrons &neutrons1 - Desilets_N0 = 300.00000000000000 , 2000.0000000000000 , 1500.0000000000000 , 0 , 1 - COSMIC_N0 = 300.00000000000000 , 2000.0000000000000 , 1500.0000000000000 , 0 , 1 - COSMIC_N1 = 1.0000000000000000E-002 , 10.000000000000000 , 1.0000000000000000 , 0 , 1 - COSMIC_N2 = 1.0000000000000000E-002 , 10.000000000000000 , 1.0000000000000000 , 0 , 1 - COSMIC_alpha0 = 1.0000000000000000E-002 , 10.000000000000000 , 1.0000000000000000 , 0 , 1 - COSMIC_alpha1 = 1.0000000000000000E-002 , 10.000000000000000 , 1.0000000000000000 , 0 , 1 - COSMIC_L30 = 1.0000000000000000E-002 , 10.000000000000000 , 1.0000000000000000 , 0 , 1 - COSMIC_L31 = 1.0000000000000000E-002 , 10.000000000000000 , 1.0000000000000000 , 0 , 1 + Desilets_N0 = 300.000000000000 , 2000.00000000000 , + 1500.00000000000 , 0 , 1 + COSMIC_N0 = 300.000000000000 , 2000.00000000000 , + 1500.00000000000 , 0 , 1 + COSMIC_N1 = 1.000000000000000E-002 , 10.0000000000000 , + 1.00000000000000 , 0 , 1 + COSMIC_N2 = 1.000000000000000E-002 , 10.0000000000000 , + 1.00000000000000 , 0 , 1 + COSMIC_alpha0 = 1.000000000000000E-002 , 10.0000000000000 , + 1.00000000000000 , 0 , 1 + COSMIC_alpha1 = 1.000000000000000E-002 , 10.0000000000000 , + 1.00000000000000 , 0 , 1 + COSMIC_L30 = 1.000000000000000E-002 , 10.0000000000000 , + 1.00000000000000 , 0 , 1 + COSMIC_L31 = 1.000000000000000E-002 , 10.0000000000000 , + 1.00000000000000 , 0 , 1 / diff --git a/check/case_08/output_save/FinalParam.out b/check/case_08/output_save/FinalParam.out index a77031d4..a56963bc 100644 --- a/check/case_08/output_save/FinalParam.out +++ b/check/case_08/output_save/FinalParam.out @@ -1,2 +1,2 @@ OF canopyInterceptionFactor snowTreshholdTemperature degreeDayFactor_forest degreeDayFactor_impervious degreeDayFactor_pervious increaseDegreeDayFactorByPrecip maxDegreeDayFactor_forest maxDegreeDayFactor_impervious maxDegreeDayFactor_pervious orgMatterContent_forest orgMatterContent_impervious orgMatterContent_pervious PTF_lower66_5_constant PTF_lower66_5_clay PTF_lower66_5_Db PTF_higher66_5_constant PTF_higher66_5_clay PTF_higher66_5_Db PTF_Ks_constant PTF_Ks_sand PTF_Ks_clay PTF_Ks_curveSlope rootFractionCoefficient_forest rootFractionCoefficient_impervious rootFractionCoefficient_pervious infiltrationShapeFactor imperviousStorageCapacity minCorrectionFactorPET maxCorrectionFactorPET aspectTresholdPET interflowStorageCapacityFactor interflowRecession_slope fastInterflowRecession_forest slowInterflowRecession_Ks exponentSlowInterflow rechargeCoefficient rechargeFactor_karstic gain_loss_GWreservoir_karstic muskingumTravelTime_constant muskingumTravelTime_riverLength muskingumTravelTime_riverSlope muskingumTravelTime_impervious muskingumAttenuation_riverSlope GeoParam(1,:) GeoParam(2,:) GeoParam(3,:) GeoParam(4,:) GeoParam(5,:) GeoParam(6,:) GeoParam(7,:) GeoParam(8,:) GeoParam(9,:) GeoParam(10,:) Desilets_N0 COSMIC_N0 COSMIC_N1 COSMIC_N2 COSMIC_alpha0 COSMIC_alpha1 COSMIC_L30 COSMIC_L31 - 1.07753380215105E-01 1.50000000000000E-01 1.00000000000000E+00 1.50000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 5.00000000000000E-01 3.00000000000000E+00 3.50000000000000E+00 4.00000000000000E+00 3.40000000000000E+00 1.00000000000000E-01 6.00000000000000E-01 7.60000000000000E-01 9.00000000000000E-04 -2.64000000000000E-01 8.90000000000000E-01 -1.00000000000000E-03 -3.24000000000000E-01 -5.85000000000000E-01 1.25000000000000E-02 6.30000000000000E-03 6.09600000000000E+01 9.70000000000000E-01 9.30000000000000E-01 2.00000000000000E-02 1.75000000000000E+00 5.00000000000000E-01 9.00000000000000E-01 1.00000000000000E-01 1.80000000000000E+02 8.50000000000000E+01 7.00000000000000E+00 1.50000000000000E+00 1.50000000000000E+01 1.25000000000000E-01 3.50000000000000E+01 -1.00000000000000E+00 1.00000000000000E+00 3.25000000000000E-01 7.50000000000000E-02 2.00000000000000E+00 1.00000000000000E-01 3.00000000000000E-01 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.50000000000000E+03 1.50000000000000E+03 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 + 1.07966144825066E-01 1.50000000000000E-01 1.00000000000000E+00 1.50000000000000E+00 5.00000000000000E-01 5.00000000000000E-01 5.00000000000000E-01 3.00000000000000E+00 3.50000000000000E+00 4.00000000000000E+00 3.40000000000000E+00 1.00000000000000E-01 6.00000000000000E-01 7.60000000000000E-01 9.00000000000000E-04 -2.64000000000000E-01 8.90000000000000E-01 -1.00000000000000E-03 -3.24000000000000E-01 -5.85000000000000E-01 1.25000000000000E-02 6.30000000000000E-03 6.09600000000000E+01 9.70000000000000E-01 9.30000000000000E-01 2.00000000000000E-02 1.75000000000000E+00 5.00000000000000E-01 9.00000000000000E-01 1.00000000000000E-01 1.80000000000000E+02 8.50000000000000E+01 7.00000000000000E+00 1.50000000000000E+00 1.50000000000000E+01 1.25000000000000E-01 3.50000000000000E+01 -1.00000000000000E+00 1.00000000000000E+00 3.25000000000000E-01 7.50000000000000E-02 2.00000000000000E+00 1.00000000000000E-01 3.00000000000000E-01 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.00000000000000E+02 1.50000000000000E+03 1.50000000000000E+03 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 1.00000000000000E+00 diff --git a/check/case_08/output_save/b1_daily_discharge.out b/check/case_08/output_save/b1_daily_discharge.out index bba04079..e021cd22 100644 --- a/check/case_08/output_save/b1_daily_discharge.out +++ b/check/case_08/output_save/b1_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 66.8918184 - 2 2 1 1990 129.0000000 153.3901816 - 3 3 1 1990 117.0000000 147.8508721 - 4 4 1 1990 111.0000000 141.8302373 - 5 5 1 1990 112.0000000 136.4780821 - 6 6 1 1990 93.0000000 136.5961136 - 7 7 1 1990 87.0000000 131.6314129 - 8 8 1 1990 84.0000000 127.0845232 - 9 9 1 1990 80.0000000 129.9860310 - 10 10 1 1990 78.0000000 126.2674601 - 11 11 1 1990 78.0000000 115.8788486 - 12 12 1 1990 77.0000000 111.2910556 - 13 13 1 1990 76.0000000 111.3012209 - 14 14 1 1990 73.0000000 113.3547002 - 15 15 1 1990 66.0000000 118.9319844 - 16 16 1 1990 76.0000000 122.6858865 - 17 17 1 1990 73.0000000 114.8730771 - 18 18 1 1990 71.0000000 111.6943893 - 19 19 1 1990 90.0000000 100.1066945 - 20 20 1 1990 82.0000000 100.5932903 - 21 21 1 1990 80.0000000 97.1892036 - 22 22 1 1990 81.0000000 93.4309406 - 23 23 1 1990 97.0000000 149.5937610 - 24 24 1 1990 198.0000000 146.4074778 - 25 25 1 1990 392.0000000 148.4924891 - 26 26 1 1990 519.0000000 136.1648087 - 27 27 1 1990 565.0000000 103.3181672 - 28 28 1 1990 331.0000000 100.8215799 - 29 29 1 1990 293.0000000 108.5405951 - 30 30 1 1990 302.0000000 93.7691279 - 31 31 1 1990 233.0000000 91.2315080 - 32 1 2 1990 198.0000000 101.9869459 - 33 2 2 1990 183.0000000 108.1008810 - 34 3 2 1990 206.0000000 105.0761368 - 35 4 2 1990 215.0000000 89.3929521 - 36 5 2 1990 183.0000000 86.7424356 - 37 6 2 1990 159.0000000 85.0111261 - 38 7 2 1990 167.0000000 83.3887657 - 39 8 2 1990 138.0000000 82.4339191 - 40 9 2 1990 126.0000000 83.8990717 - 41 10 2 1990 131.0000000 124.0892296 - 42 11 2 1990 173.0000000 139.9645992 - 43 12 2 1990 240.0000000 122.3361213 - 44 13 2 1990 270.0000000 164.7834204 - 45 14 2 1990 458.0000000 260.3024929 - 46 15 2 1990 996.0000000 293.4625716 - 47 16 2 1990 1370.0000000 229.0448237 - 48 17 2 1990 1540.0000000 196.1825983 - 49 18 2 1990 1210.0000000 175.6962198 - 50 19 2 1990 616.0000000 158.8622004 - 51 20 2 1990 465.0000000 147.0109440 - 52 21 2 1990 373.0000000 137.8118772 - 53 22 2 1990 298.0000000 130.1595519 - 54 23 2 1990 270.0000000 123.8268233 - 55 24 2 1990 234.0000000 118.2082352 - 56 25 2 1990 218.0000000 116.8194287 - 57 26 2 1990 203.0000000 169.1232160 - 58 27 2 1990 314.0000000 231.9577131 - 59 28 2 1990 520.0000000 294.2170521 - 60 1 3 1990 689.0000000 340.9817488 - 61 2 3 1990 777.0000000 302.5816057 - 62 3 3 1990 584.0000000 256.4450673 - 63 4 3 1990 429.0000000 222.8416520 - 64 5 3 1990 365.0000000 197.2992453 - 65 6 3 1990 281.0000000 178.6508262 - 66 7 3 1990 257.0000000 162.7296862 - 67 8 3 1990 231.0000000 150.2317092 - 68 9 3 1990 211.0000000 141.2251812 - 69 10 3 1990 191.0000000 133.9263875 - 70 11 3 1990 182.0000000 127.7154056 - 71 12 3 1990 173.0000000 122.1758955 - 72 13 3 1990 159.0000000 117.2303575 - 73 14 3 1990 153.0000000 113.4048388 - 74 15 3 1990 141.0000000 111.3704840 - 75 16 3 1990 136.0000000 106.7845489 - 76 17 3 1990 130.0000000 103.1732038 - 77 18 3 1990 123.0000000 99.9533947 - 78 19 3 1990 115.0000000 97.0032021 - 79 20 3 1990 113.0000000 94.4799609 - 80 21 3 1990 102.0000000 92.3689635 - 81 22 3 1990 105.0000000 90.5048331 - 82 23 3 1990 106.0000000 88.5615615 - 83 24 3 1990 87.0000000 86.5783996 - 84 25 3 1990 80.0000000 85.3094746 - 85 26 3 1990 84.0000000 83.5784988 - 86 27 3 1990 82.0000000 81.7804645 - 87 28 3 1990 91.0000000 84.3483202 - 88 29 3 1990 97.0000000 96.4323353 - 89 30 3 1990 110.0000000 86.4808630 - 90 31 3 1990 97.0000000 82.9811012 - 91 1 4 1990 93.0000000 81.0407264 - 92 2 4 1990 85.0000000 79.2889944 - 93 3 4 1990 84.0000000 80.9628393 - 94 4 4 1990 81.0000000 87.3973001 - 95 5 4 1990 81.0000000 79.3873627 - 96 6 4 1990 76.0000000 78.2674759 - 97 7 4 1990 72.0000000 76.8625037 - 98 8 4 1990 68.0000000 74.9833211 - 99 9 4 1990 72.0000000 73.5203041 - 100 10 4 1990 65.0000000 72.1661782 - 101 11 4 1990 62.0000000 71.0290354 - 102 12 4 1990 62.0000000 71.6999864 - 103 13 4 1990 65.0000000 76.1609283 - 104 14 4 1990 68.0000000 91.1555336 - 105 15 4 1990 75.0000000 97.9825557 - 106 16 4 1990 90.0000000 89.7482575 - 107 17 4 1990 92.0000000 84.6368399 - 108 18 4 1990 94.0000000 86.9014306 - 109 19 4 1990 110.0000000 82.9226456 - 110 20 4 1990 99.0000000 79.8831307 - 111 21 4 1990 86.0000000 77.8333314 - 112 22 4 1990 86.0000000 81.9706515 - 113 23 4 1990 86.0000000 85.6469939 - 114 24 4 1990 88.0000000 87.3368951 - 115 25 4 1990 93.0000000 81.1474778 - 116 26 4 1990 99.0000000 77.9758672 - 117 27 4 1990 86.0000000 75.9449270 - 118 28 4 1990 74.0000000 74.4283939 - 119 29 4 1990 72.0000000 72.5421569 - 120 30 4 1990 77.0000000 70.8256335 - 121 1 5 1990 56.0000000 69.2328802 - 122 2 5 1990 64.0000000 67.7431698 - 123 3 5 1990 58.0000000 66.3461679 - 124 4 5 1990 50.0000000 65.0327388 - 125 5 5 1990 50.0000000 63.7947903 - 126 6 5 1990 50.0000000 62.6251406 - 127 7 5 1990 50.0000000 61.5206600 - 128 8 5 1990 53.0000000 60.8262649 - 129 9 5 1990 62.0000000 61.2963554 - 130 10 5 1990 64.0000000 65.0476180 - 131 11 5 1990 65.0000000 66.9745778 - 132 12 5 1990 75.0000000 60.8907500 - 133 13 5 1990 71.0000000 58.7542674 - 134 14 5 1990 63.0000000 57.7956609 - 135 15 5 1990 61.0000000 57.0770712 - 136 16 5 1990 49.0000000 56.5364390 - 137 17 5 1990 46.0000000 55.3098462 - 138 18 5 1990 46.0000000 54.4304335 - 139 19 5 1990 48.0000000 53.6063905 - 140 20 5 1990 41.0000000 52.8322209 - 141 21 5 1990 45.0000000 55.6409418 - 142 22 5 1990 52.0000000 61.3567739 - 143 23 5 1990 50.0000000 57.1171680 - 144 24 5 1990 56.0000000 60.2538503 - 145 25 5 1990 41.0000000 60.5723681 - 146 26 5 1990 40.0000000 53.8231345 - 147 27 5 1990 39.0000000 52.5528544 - 148 28 5 1990 39.0000000 51.6159355 - 149 29 5 1990 33.0000000 50.7303515 - 150 30 5 1990 37.0000000 49.8908755 - 151 31 5 1990 30.0000000 49.0929258 - 152 1 6 1990 37.0000000 53.6790805 - 153 2 6 1990 36.0000000 55.6632698 - 154 3 6 1990 40.0000000 78.9653483 - 155 4 6 1990 45.0000000 73.9717764 - 156 5 6 1990 39.0000000 52.6721305 - 157 6 6 1990 48.0000000 51.2450642 - 158 7 6 1990 39.0000000 80.2234231 - 159 8 6 1990 49.0000000 113.3072930 - 160 9 6 1990 84.0000000 86.4050835 - 161 10 6 1990 91.0000000 78.8167162 - 162 11 6 1990 80.0000000 67.9445894 - 163 12 6 1990 66.0000000 64.7641551 - 164 13 6 1990 53.0000000 62.6226095 - 165 14 6 1990 64.0000000 60.7002668 - 166 15 6 1990 55.0000000 58.5958986 - 167 16 6 1990 54.0000000 56.8330217 - 168 17 6 1990 42.0000000 55.2191511 - 169 18 6 1990 48.0000000 53.7539747 - 170 19 6 1990 48.0000000 64.5162208 - 171 20 6 1990 60.0000000 85.3901064 - 172 21 6 1990 75.0000000 82.3362072 - 173 22 6 1990 78.0000000 68.6153717 - 174 23 6 1990 66.0000000 64.5998145 - 175 24 6 1990 63.0000000 60.8779146 - 176 25 6 1990 52.0000000 58.6789190 - 177 26 6 1990 49.0000000 56.8758218 - 178 27 6 1990 44.0000000 61.7512574 - 179 28 6 1990 51.0000000 63.8607420 - 180 29 6 1990 61.0000000 75.5584280 - 181 30 6 1990 81.0000000 110.5757334 - 182 1 7 1990 79.0000000 92.9872582 - 183 2 7 1990 92.0000000 72.5105291 - 184 3 7 1990 72.0000000 73.0156799 - 185 4 7 1990 58.0000000 92.6078763 - 186 5 7 1990 69.0000000 115.5525081 - 187 6 7 1990 94.0000000 113.9717288 - 188 7 7 1990 199.0000000 99.1173753 - 189 8 7 1990 133.0000000 106.1962163 - 190 9 7 1990 124.0000000 90.7687388 - 191 10 7 1990 123.0000000 84.6742017 - 192 11 7 1990 99.0000000 80.0308092 - 193 12 7 1990 88.0000000 76.3182541 - 194 13 7 1990 84.0000000 72.9873881 - 195 14 7 1990 72.0000000 69.9763907 - 196 15 7 1990 55.0000000 67.2463751 - 197 16 7 1990 65.0000000 64.7638383 - 198 17 7 1990 50.0000000 62.4998231 - 199 18 7 1990 50.0000000 60.4292256 - 200 19 7 1990 46.0000000 58.5302201 - 201 20 7 1990 44.0000000 56.7837794 - 202 21 7 1990 42.0000000 55.1732736 - 203 22 7 1990 37.0000000 53.6841320 - 204 23 7 1990 38.0000000 52.3035593 - 205 24 7 1990 44.0000000 51.0202940 - 206 25 7 1990 30.0000000 49.8244039 - 207 26 7 1990 26.0000000 48.7071117 - 208 27 7 1990 31.0000000 47.6606464 - 209 28 7 1990 33.0000000 49.6659308 - 210 29 7 1990 42.0000000 47.5606974 - 211 30 7 1990 36.0000000 45.2439464 - 212 31 7 1990 34.0000000 44.3898712 - 213 1 8 1990 25.0000000 43.5818867 - 214 2 8 1990 22.0000000 42.8157869 - 215 3 8 1990 28.0000000 42.0878138 - 216 4 8 1990 25.0000000 41.3946029 - 217 5 8 1990 19.0000000 40.7331397 - 218 6 8 1990 22.0000000 40.1013652 - 219 7 8 1990 19.0000000 39.4957766 - 220 8 8 1990 22.0000000 38.9143336 - 221 9 8 1990 19.0000000 38.3553370 - 222 10 8 1990 20.0000000 37.8170089 - 223 11 8 1990 19.0000000 37.2977429 - 224 12 8 1990 19.0000000 36.7960868 - 225 13 8 1990 22.0000000 39.6765984 - 226 14 8 1990 36.0000000 57.5722584 - 227 15 8 1990 31.0000000 60.0786505 - 228 16 8 1990 30.0000000 46.3881449 - 229 17 8 1990 28.0000000 47.0434961 - 230 18 8 1990 34.0000000 38.1258239 - 231 19 8 1990 21.0000000 37.2294379 - 232 20 8 1990 30.0000000 36.5781837 - 233 21 8 1990 22.0000000 35.9600962 - 234 22 8 1990 21.0000000 35.3721045 - 235 23 8 1990 23.0000000 34.8114754 - 236 24 8 1990 20.0000000 34.2757718 - 237 25 8 1990 29.0000000 33.7639852 - 238 26 8 1990 20.0000000 33.3289666 - 239 27 8 1990 22.0000000 34.3430864 - 240 28 8 1990 23.0000000 34.0709992 - 241 29 8 1990 35.0000000 32.2503491 - 242 30 8 1990 51.0000000 93.0149503 - 243 31 8 1990 80.0000000 134.7571271 - 244 1 9 1990 56.0000000 61.5769121 - 245 2 9 1990 33.0000000 47.3553486 - 246 3 9 1990 27.0000000 45.3809424 - 247 4 9 1990 27.0000000 44.9725214 - 248 5 9 1990 28.0000000 49.3204550 - 249 6 9 1990 26.0000000 42.4434340 - 250 7 9 1990 24.0000000 46.0886157 - 251 8 9 1990 33.0000000 45.3043285 - 252 9 9 1990 26.0000000 40.1029125 - 253 10 9 1990 27.0000000 38.7910065 - 254 11 9 1990 22.0000000 37.6811972 - 255 12 9 1990 22.0000000 36.6574899 - 256 13 9 1990 21.0000000 35.7104607 - 257 14 9 1990 22.0000000 34.8318633 - 258 15 9 1990 22.0000000 34.0144649 - 259 16 9 1990 22.0000000 33.2519075 - 260 17 9 1990 20.0000000 32.5385905 - 261 18 9 1990 22.0000000 31.8695705 - 262 19 9 1990 16.0000000 31.2404758 - 263 20 9 1990 22.0000000 30.6474332 - 264 21 9 1990 19.0000000 36.0192607 - 265 22 9 1990 32.0000000 87.2958025 - 266 23 9 1990 27.0000000 100.5596521 - 267 24 9 1990 45.0000000 68.5483435 - 268 25 9 1990 42.0000000 51.4523306 - 269 26 9 1990 39.0000000 46.3016115 - 270 27 9 1990 30.0000000 44.3673801 - 271 28 9 1990 28.0000000 42.6150475 - 272 29 9 1990 30.0000000 41.0248012 - 273 30 9 1990 30.0000000 69.0412445 - 274 1 10 1990 56.0000000 135.4054571 - 275 2 10 1990 72.0000000 118.0621478 - 276 3 10 1990 73.0000000 98.4243649 - 277 4 10 1990 68.0000000 99.5180952 - 278 5 10 1990 53.0000000 85.0516596 - 279 6 10 1990 42.0000000 77.4763655 - 280 7 10 1990 33.0000000 72.3493109 - 281 8 10 1990 42.0000000 68.1664001 - 282 9 10 1990 34.0000000 64.4512705 - 283 10 10 1990 36.0000000 61.1116587 - 284 11 10 1990 36.0000000 58.1136837 - 285 12 10 1990 28.0000000 55.4146453 - 286 13 10 1990 32.0000000 52.9776911 - 287 14 10 1990 27.0000000 50.7711281 - 288 15 10 1990 35.0000000 49.0874428 - 289 16 10 1990 42.0000000 49.8099207 - 290 17 10 1990 35.0000000 54.0273132 - 291 18 10 1990 39.0000000 62.1255970 - 292 19 10 1990 34.0000000 50.1847687 - 293 20 10 1990 32.0000000 47.8080842 - 294 21 10 1990 34.0000000 46.0430059 - 295 22 10 1990 27.0000000 44.4360194 - 296 23 10 1990 31.0000000 42.9656327 - 297 24 10 1990 28.0000000 41.6164884 - 298 25 10 1990 25.0000000 41.1002429 - 299 26 10 1990 29.0000000 54.7240398 - 300 27 10 1990 31.0000000 69.7240387 - 301 28 10 1990 65.0000000 160.2794316 - 302 29 10 1990 69.0000000 213.9156686 - 303 30 10 1990 157.0000000 182.8242162 - 304 31 10 1990 190.0000000 156.2969658 - 305 1 11 1990 115.0000000 154.9030811 - 306 2 11 1990 104.0000000 158.3191303 - 307 3 11 1990 100.0000000 171.8516187 - 308 4 11 1990 131.0000000 171.1724341 - 309 5 11 1990 130.0000000 168.3578212 - 310 6 11 1990 115.0000000 149.3826842 - 311 7 11 1990 102.0000000 130.6157493 - 312 8 11 1990 95.0000000 114.8839979 - 313 9 11 1990 81.0000000 102.3522231 - 314 10 11 1990 66.0000000 103.6670421 - 315 11 11 1990 67.0000000 126.1851372 - 316 12 11 1990 74.0000000 151.0554227 - 317 13 11 1990 109.0000000 143.6332400 - 318 14 11 1990 92.0000000 155.9195258 - 319 15 11 1990 92.0000000 178.9710626 - 320 16 11 1990 155.0000000 175.1410457 - 321 17 11 1990 159.0000000 160.7844916 - 322 18 11 1990 131.0000000 170.5916173 - 323 19 11 1990 161.0000000 182.2175364 - 324 20 11 1990 196.0000000 248.3591268 - 325 21 11 1990 336.0000000 347.7069114 - 326 22 11 1990 566.0000000 317.7220496 - 327 23 11 1990 373.0000000 327.8722278 - 328 24 11 1990 293.0000000 310.6479270 - 329 25 11 1990 264.0000000 293.5100744 - 330 26 11 1990 226.0000000 270.0045789 - 331 27 11 1990 201.0000000 232.9777920 - 332 28 11 1990 180.0000000 202.3957239 - 333 29 11 1990 161.0000000 185.0796599 - 334 30 11 1990 149.0000000 177.0911414 - 335 1 12 1990 134.0000000 155.4232084 - 336 2 12 1990 113.0000000 139.3306481 - 337 3 12 1990 99.0000000 128.4147348 - 338 4 12 1990 107.0000000 120.7622694 - 339 5 12 1990 99.0000000 114.1695870 - 340 6 12 1990 89.0000000 108.2444572 - 341 7 12 1990 77.0000000 102.9782764 - 342 8 12 1990 71.0000000 98.2552401 - 343 9 12 1990 68.0000000 94.0049117 - 344 10 12 1990 73.0000000 90.1677176 - 345 11 12 1990 84.0000000 86.6926304 - 346 12 12 1990 88.0000000 98.7969416 - 347 13 12 1990 92.0000000 110.5933529 - 348 14 12 1990 128.0000000 103.1194562 - 349 15 12 1990 136.0000000 95.6886096 - 350 16 12 1990 114.0000000 91.1576267 - 351 17 12 1990 101.0000000 87.2701406 - 352 18 12 1990 93.0000000 83.7695692 - 353 19 12 1990 85.0000000 80.6065774 - 354 20 12 1990 81.0000000 77.7389758 - 355 21 12 1990 106.0000000 104.6302506 - 356 22 12 1990 159.0000000 137.5889666 - 357 23 12 1990 250.0000000 151.1799337 - 358 24 12 1990 298.0000000 147.2698728 - 359 25 12 1990 261.0000000 167.8228281 - 360 26 12 1990 228.0000000 276.8344379 - 361 27 12 1990 409.0000000 353.3482305 - 362 28 12 1990 486.0000000 392.6206245 - 363 29 12 1990 440.0000000 452.3500692 - 364 30 12 1990 486.0000000 593.6745089 - 365 31 12 1990 774.0000000 684.3191972 - 366 1 1 1991 889.0000000 759.2388712 - 367 2 1 1991 863.0000000 792.8593188 - 368 3 1 1991 875.0000000 873.1189881 - 369 4 1 1991 932.0000000 807.7698067 - 370 5 1 1991 826.0000000 747.2765479 - 371 6 1 1991 731.0000000 702.1332949 - 372 7 1 1991 613.0000000 649.6483382 - 373 8 1 1991 610.0000000 650.8357263 - 374 9 1 1991 686.0000000 594.5432457 - 375 10 1 1991 556.0000000 603.5124257 - 376 11 1 1991 669.0000000 644.3579572 - 377 12 1 1991 828.0000000 626.0798826 - 378 13 1 1991 735.0000000 528.1700139 - 379 14 1 1991 513.0000000 434.9411260 - 380 15 1 1991 411.0000000 360.4278697 - 381 16 1 1991 345.0000000 301.2894206 - 382 17 1 1991 293.0000000 255.8924255 - 383 18 1 1991 251.0000000 224.1151086 - 384 19 1 1991 222.0000000 201.8323769 - 385 20 1 1991 215.0000000 186.4079783 - 386 21 1 1991 213.0000000 177.9367237 - 387 22 1 1991 202.0000000 179.7249604 - 388 23 1 1991 200.0000000 172.6889074 - 389 24 1 1991 192.0000000 163.8951440 - 390 25 1 1991 176.0000000 155.7732005 - 391 26 1 1991 164.0000000 148.7322556 - 392 27 1 1991 157.0000000 142.2209865 - 393 28 1 1991 134.0000000 136.3737844 - 394 29 1 1991 130.0000000 131.1061070 - 395 30 1 1991 119.0000000 126.3436612 - 396 31 1 1991 107.0000000 122.0229811 - 397 1 2 1991 112.0000000 118.0896626 - 398 2 2 1991 109.0000000 114.4969181 - 399 3 2 1991 101.0000000 111.2043865 - 400 4 2 1991 98.0000000 108.1771486 - 401 5 2 1991 84.0000000 105.3849103 - 402 6 2 1991 93.0000000 102.8013205 - 403 7 2 1991 80.0000000 100.4034012 - 404 8 2 1991 73.0000000 98.1710679 - 405 9 2 1991 89.0000000 96.0867252 - 406 10 2 1991 84.0000000 94.1349255 - 407 11 2 1991 78.0000000 92.3020781 - 408 12 2 1991 79.0000000 90.5762030 - 409 13 2 1991 77.0000000 88.9467197 - 410 14 2 1991 80.0000000 87.4042664 - 411 15 2 1991 72.0000000 85.9405458 - 412 16 2 1991 78.0000000 85.6474884 - 413 17 2 1991 74.0000000 86.1441998 - 414 18 2 1991 77.0000000 84.5295641 - 415 19 2 1991 73.0000000 89.0198957 - 416 20 2 1991 69.0000000 107.0941343 - 417 21 2 1991 74.0000000 130.5166291 - 418 22 2 1991 81.0000000 153.9492978 - 419 23 2 1991 110.0000000 152.9879737 - 420 24 2 1991 180.0000000 151.8242267 - 421 25 2 1991 213.0000000 146.6325689 - 422 26 2 1991 222.0000000 141.8829967 - 423 27 2 1991 208.0000000 142.3345519 - 424 28 2 1991 211.0000000 139.5979518 - 425 1 3 1991 214.0000000 132.5042972 - 426 2 3 1991 208.0000000 136.4207290 - 427 3 3 1991 221.0000000 138.9122351 - 428 4 3 1991 281.0000000 130.0403817 - 429 5 3 1991 219.0000000 124.1658831 - 430 6 3 1991 190.0000000 119.1638450 - 431 7 3 1991 173.0000000 114.6678610 - 432 8 3 1991 164.0000000 110.6082790 - 433 9 3 1991 142.0000000 107.7429786 - 434 10 3 1991 133.0000000 106.5703757 - 435 11 3 1991 133.0000000 105.5142015 - 436 12 3 1991 118.0000000 102.0644064 - 437 13 3 1991 127.0000000 98.8143233 - 438 14 3 1991 113.0000000 95.9360010 - 439 15 3 1991 107.0000000 93.2908589 - 440 16 3 1991 100.0000000 90.8520090 - 441 17 3 1991 100.0000000 88.6001612 - 442 18 3 1991 95.0000000 86.5467711 - 443 19 3 1991 98.0000000 125.1836933 - 444 20 3 1991 119.0000000 156.8374601 - 445 21 3 1991 159.0000000 154.4608129 - 446 22 3 1991 196.0000000 181.1299306 - 447 23 3 1991 242.0000000 168.8926944 - 448 24 3 1991 216.0000000 154.3865911 - 449 25 3 1991 180.0000000 143.8189301 - 450 26 3 1991 145.0000000 135.8586918 - 451 27 3 1991 127.0000000 130.3136806 - 452 28 3 1991 117.0000000 124.0767080 - 453 29 3 1991 109.0000000 118.3332437 - 454 30 3 1991 106.0000000 113.2628585 - 455 31 3 1991 99.0000000 108.7042247 - 456 1 4 1991 96.0000000 104.5906311 - 457 2 4 1991 88.0000000 100.8653402 - 458 3 4 1991 87.0000000 97.4799048 - 459 4 4 1991 82.0000000 94.6970095 - 460 5 4 1991 84.0000000 92.6484756 - 461 6 4 1991 67.0000000 90.2070735 - 462 7 4 1991 89.0000000 87.8268901 - 463 8 4 1991 75.0000000 85.8482315 - 464 9 4 1991 79.0000000 83.8005179 - 465 10 4 1991 70.0000000 81.7788911 - 466 11 4 1991 69.0000000 79.8941934 - 467 12 4 1991 69.0000000 78.1373016 - 468 13 4 1991 56.0000000 76.4948619 - 469 14 4 1991 63.0000000 74.9557253 - 470 15 4 1991 58.0000000 73.5152833 - 471 16 4 1991 56.0000000 72.1518885 - 472 17 4 1991 54.0000000 70.8619418 - 473 18 4 1991 57.0000000 69.6792682 - 474 19 4 1991 53.0000000 69.3076782 - 475 20 4 1991 53.0000000 69.0174066 - 476 21 4 1991 65.0000000 68.9020983 - 477 22 4 1991 69.0000000 69.4771584 - 478 23 4 1991 61.0000000 71.2592805 - 479 24 4 1991 56.0000000 69.6057831 - 480 25 4 1991 56.0000000 67.3150962 - 481 26 4 1991 53.0000000 66.0342347 - 482 27 4 1991 49.0000000 64.9133149 - 483 28 4 1991 53.0000000 63.8487876 - 484 29 4 1991 48.0000000 66.9013733 - 485 30 4 1991 57.0000000 96.0416715 - 486 1 5 1991 69.0000000 117.0276778 - 487 2 5 1991 89.0000000 88.0527262 - 488 3 5 1991 105.0000000 83.2746980 - 489 4 5 1991 79.0000000 80.4457626 - 490 5 5 1991 69.0000000 78.0142283 - 491 6 5 1991 71.0000000 76.1072277 - 492 7 5 1991 60.0000000 74.0647061 - 493 8 5 1991 64.0000000 71.9281445 - 494 9 5 1991 59.0000000 70.0899113 - 495 10 5 1991 57.0000000 68.5637059 - 496 11 5 1991 55.0000000 72.6644191 - 497 12 5 1991 53.0000000 69.4240968 - 498 13 5 1991 52.0000000 67.6199327 - 499 14 5 1991 50.0000000 65.8007757 - 500 15 5 1991 52.0000000 67.1139908 - 501 16 5 1991 54.0000000 73.1200192 - 502 17 5 1991 54.0000000 67.3541898 - 503 18 5 1991 55.0000000 65.3813356 - 504 19 5 1991 48.0000000 63.9874951 - 505 20 5 1991 48.0000000 62.6831773 - 506 21 5 1991 49.0000000 61.4532589 - 507 22 5 1991 41.0000000 60.2910006 - 508 23 5 1991 40.0000000 59.1903617 - 509 24 5 1991 40.0000000 58.1459204 - 510 25 5 1991 39.0000000 57.1528042 - 511 26 5 1991 43.0000000 56.2066285 - 512 27 5 1991 39.0000000 55.3034439 - 513 28 5 1991 36.0000000 54.4396884 - 514 29 5 1991 33.0000000 53.6121462 - 515 30 5 1991 39.0000000 52.8179111 - 516 31 5 1991 34.0000000 52.0543544 - 517 1 6 1991 37.0000000 51.3190955 - 518 2 6 1991 35.0000000 50.6099771 - 519 3 6 1991 29.0000000 49.9250421 - 520 4 6 1991 33.0000000 49.2625137 - 521 5 6 1991 34.0000000 48.6216707 - 522 6 6 1991 32.0000000 62.9060953 - 523 7 6 1991 38.0000000 68.0935576 - 524 8 6 1991 39.0000000 62.6870795 - 525 9 6 1991 41.0000000 53.6775472 - 526 10 6 1991 44.0000000 71.7427184 - 527 11 6 1991 48.0000000 57.3489600 - 528 12 6 1991 42.0000000 52.8846136 - 529 13 6 1991 37.0000000 51.7875541 - 530 14 6 1991 39.0000000 50.9824097 - 531 15 6 1991 35.0000000 49.8987505 - 532 16 6 1991 31.0000000 50.8375931 - 533 17 6 1991 33.0000000 56.4638483 - 534 18 6 1991 31.0000000 55.1376008 - 535 19 6 1991 28.0000000 51.6408216 - 536 20 6 1991 60.0000000 76.5330725 - 537 21 6 1991 48.0000000 83.1073086 - 538 22 6 1991 54.0000000 58.8925111 - 539 23 6 1991 63.0000000 65.3066476 - 540 24 6 1991 41.0000000 60.9303316 - 541 25 6 1991 42.0000000 55.9643375 - 542 26 6 1991 43.0000000 54.3637078 - 543 27 6 1991 38.0000000 60.1578406 - 544 28 6 1991 38.0000000 63.2698159 - 545 29 6 1991 35.0000000 57.0236786 - 546 30 6 1991 41.0000000 53.8675026 - 547 1 7 1991 41.0000000 52.2501986 - 548 2 7 1991 38.0000000 50.9160373 - 549 3 7 1991 34.0000000 49.6768307 - 550 4 7 1991 27.0000000 48.5226607 - 551 5 7 1991 31.0000000 47.4448020 - 552 6 7 1991 30.0000000 46.4357939 - 553 7 7 1991 26.0000000 51.2553212 - 554 8 7 1991 30.0000000 53.5973782 - 555 9 7 1991 31.0000000 45.9534803 - 556 10 7 1991 23.0000000 44.8292442 - 557 11 7 1991 35.0000000 43.9256123 - 558 12 7 1991 19.0000000 43.3155605 - 559 13 7 1991 24.0000000 64.9331437 - 560 14 7 1991 26.0000000 72.0920615 - 561 15 7 1991 27.0000000 53.0114446 - 562 16 7 1991 41.0000000 47.9314146 - 563 17 7 1991 34.0000000 46.5033042 - 564 18 7 1991 27.0000000 45.3771846 - 565 19 7 1991 25.0000000 44.3282940 - 566 20 7 1991 23.0000000 43.3458696 - 567 21 7 1991 22.0000000 42.4256693 - 568 22 7 1991 27.0000000 41.5615809 - 569 23 7 1991 23.0000000 40.7481709 - 570 24 7 1991 21.0000000 40.4102571 - 571 25 7 1991 23.0000000 60.5626062 - 572 26 7 1991 33.0000000 64.8902639 - 573 27 7 1991 23.0000000 48.8877268 - 574 28 7 1991 29.0000000 43.7994924 - 575 29 7 1991 30.0000000 42.5466145 - 576 30 7 1991 35.0000000 50.0021265 - 577 31 7 1991 27.0000000 59.7935614 - 578 1 8 1991 45.0000000 45.3092952 - 579 2 8 1991 47.0000000 43.2958888 - 580 3 8 1991 40.0000000 42.2075643 - 581 4 8 1991 35.0000000 41.1986381 - 582 5 8 1991 26.0000000 40.2574531 - 583 6 8 1991 23.0000000 39.3771933 - 584 7 8 1991 30.0000000 40.2738125 - 585 8 8 1991 33.0000000 40.8105416 - 586 9 8 1991 30.0000000 38.1046741 - 587 10 8 1991 28.0000000 36.8012588 - 588 11 8 1991 19.0000000 36.1121931 - 589 12 8 1991 20.0000000 35.4601491 - 590 13 8 1991 16.0000000 34.8417314 - 591 14 8 1991 18.0000000 34.2539091 - 592 15 8 1991 18.0000000 33.6939719 - 593 16 8 1991 20.0000000 33.1594925 - 594 17 8 1991 16.0000000 32.6482944 - 595 18 8 1991 15.0000000 32.1584234 - 596 19 8 1991 15.0000000 31.6881220 - 597 20 8 1991 14.0000000 31.2358083 - 598 21 8 1991 15.0000000 30.8000567 - 599 22 8 1991 13.0000000 30.3796791 - 600 23 8 1991 12.0000000 29.9895598 - 601 24 8 1991 11.0000000 30.0709496 - 602 25 8 1991 12.0000000 29.3326734 - 603 26 8 1991 11.0000000 28.8809735 - 604 27 8 1991 13.0000000 28.5185522 - 605 28 8 1991 11.0000000 28.1661287 - 606 29 8 1991 12.0000000 27.8230340 - 607 30 8 1991 12.0000000 27.4886595 - 608 31 8 1991 11.0000000 27.1624507 - 609 1 9 1991 11.0000000 27.6019974 - 610 2 9 1991 17.0000000 30.4375351 - 611 3 9 1991 11.0000000 26.7129036 - 612 4 9 1991 12.0000000 26.2090885 - 613 5 9 1991 11.0000000 25.8981153 - 614 6 9 1991 11.0000000 25.5945617 - 615 7 9 1991 18.0000000 25.2979605 - 616 8 9 1991 11.0000000 25.0078875 - 617 9 9 1991 13.0000000 24.7239567 - 618 10 9 1991 12.0000000 24.5658381 - 619 11 9 1991 11.0000000 40.8073573 - 620 12 9 1991 20.0000000 61.2549930 - 621 13 9 1991 21.0000000 28.0724485 - 622 14 9 1991 29.0000000 26.7471088 - 623 15 9 1991 28.0000000 26.2591117 - 624 16 9 1991 20.0000000 25.7976733 - 625 17 9 1991 20.0000000 25.3603957 - 626 18 9 1991 20.0000000 24.9445928 - 627 19 9 1991 12.0000000 24.5484526 - 628 20 9 1991 11.0000000 24.1701906 - 629 21 9 1991 11.0000000 23.8082105 - 630 22 9 1991 22.0000000 32.9481074 - 631 23 9 1991 14.0000000 57.7679866 - 632 24 9 1991 48.0000000 28.0366836 - 633 25 9 1991 45.0000000 69.3060734 - 634 26 9 1991 80.0000000 92.6177697 - 635 27 9 1991 61.0000000 76.7727146 - 636 28 9 1991 61.0000000 87.5663137 - 637 29 9 1991 65.0000000 95.7195224 - 638 30 9 1991 63.0000000 95.2131877 - 639 1 10 1991 90.0000000 73.5745285 - 640 2 10 1991 59.0000000 66.2066269 - 641 3 10 1991 45.0000000 60.4169409 - 642 4 10 1991 42.0000000 56.2916431 - 643 5 10 1991 41.0000000 81.3813617 - 644 6 10 1991 41.0000000 119.9186725 - 645 7 10 1991 73.0000000 85.0511691 - 646 8 10 1991 96.0000000 73.4529277 - 647 9 10 1991 61.0000000 67.7716994 - 648 10 10 1991 44.0000000 63.3823473 - 649 11 10 1991 42.0000000 59.5654293 - 650 12 10 1991 41.0000000 71.8761717 - 651 13 10 1991 42.0000000 90.8067649 - 652 14 10 1991 61.0000000 67.6899621 - 653 15 10 1991 55.0000000 63.0703869 - 654 16 10 1991 41.0000000 64.2071404 - 655 17 10 1991 48.0000000 73.5870435 - 656 18 10 1991 52.0000000 101.6643347 - 657 19 10 1991 66.0000000 94.1941635 - 658 20 10 1991 59.0000000 79.8707213 - 659 21 10 1991 71.0000000 76.4999788 - 660 22 10 1991 74.0000000 70.2328680 - 661 23 10 1991 70.0000000 66.0343304 - 662 24 10 1991 59.0000000 62.3668886 - 663 25 10 1991 57.0000000 59.1496003 - 664 26 10 1991 57.0000000 56.2627297 - 665 27 10 1991 51.0000000 53.6644212 - 666 28 10 1991 47.0000000 51.3191177 - 667 29 10 1991 48.0000000 49.1956069 - 668 30 10 1991 45.0000000 49.3731844 - 669 31 10 1991 43.0000000 55.7632833 - 670 1 11 1991 40.0000000 63.3030463 - 671 2 11 1991 47.0000000 66.9009289 - 672 3 11 1991 46.0000000 83.6426577 - 673 4 11 1991 76.0000000 133.0120980 - 674 5 11 1991 60.0000000 129.6360205 - 675 6 11 1991 132.0000000 124.4260110 - 676 7 11 1991 133.0000000 124.4553381 - 677 8 11 1991 113.0000000 140.9730287 - 678 9 11 1991 120.0000000 161.6557538 - 679 10 11 1991 141.0000000 149.5848648 - 680 11 11 1991 208.0000000 160.5000712 - 681 12 11 1991 166.0000000 218.3119630 - 682 13 11 1991 183.0000000 260.5135961 - 683 14 11 1991 299.0000000 414.9240501 - 684 15 11 1991 521.0000000 428.7940222 - 685 16 11 1991 443.0000000 373.3121539 - 686 17 11 1991 304.0000000 318.8024498 - 687 18 11 1991 231.0000000 292.5493514 - 688 19 11 1991 192.0000000 293.3945433 - 689 20 11 1991 199.0000000 268.4462997 - 690 21 11 1991 201.0000000 248.7131631 - 691 22 11 1991 173.0000000 216.4014932 - 692 23 11 1991 159.0000000 186.9883655 - 693 24 11 1991 160.0000000 163.8708014 - 694 25 11 1991 146.0000000 144.8714436 - 695 26 11 1991 110.0000000 129.6184223 - 696 27 11 1991 114.0000000 117.8420969 - 697 28 11 1991 97.0000000 110.0478845 - 698 29 11 1991 89.0000000 103.9831277 - 699 30 11 1991 73.0000000 98.7865356 - 700 1 12 1991 69.0000000 94.1347565 - 701 2 12 1991 67.0000000 89.9460713 - 702 3 12 1991 63.0000000 86.1629296 - 703 4 12 1991 58.0000000 82.7359148 - 704 5 12 1991 59.0000000 79.6224517 - 705 6 12 1991 53.0000000 76.7857434 - 706 7 12 1991 54.0000000 74.1938913 - 707 8 12 1991 51.0000000 71.8191656 - 708 9 12 1991 47.0000000 69.6373951 - 709 10 12 1991 42.0000000 67.6274576 - 710 11 12 1991 40.0000000 65.7708507 - 711 12 12 1991 39.0000000 64.0513300 - 712 13 12 1991 36.0000000 62.4546023 - 713 14 12 1991 37.0000000 60.9680656 - 714 15 12 1991 32.0000000 59.5805872 - 715 16 12 1991 37.0000000 62.4331781 - 716 17 12 1991 62.0000000 147.2726017 - 717 18 12 1991 118.0000000 209.2283637 - 718 19 12 1991 170.0000000 269.8693389 - 719 20 12 1991 229.0000000 393.7060994 - 720 21 12 1991 448.0000000 445.7067514 - 721 22 12 1991 464.0000000 642.2849243 - 722 23 12 1991 675.0000000 635.6096124 - 723 24 12 1991 844.0000000 557.4636805 - 724 25 12 1991 569.0000000 464.4086968 - 725 26 12 1991 358.0000000 386.2783110 - 726 27 12 1991 279.0000000 327.6847145 - 727 28 12 1991 238.0000000 281.9772326 - 728 29 12 1991 201.0000000 241.2156957 - 729 30 12 1991 185.0000000 208.9881335 - 730 31 12 1991 165.0000000 184.1229914 - 731 1 1 1992 140.0000000 164.2031553 - 732 2 1 1992 126.0000000 148.3191142 - 733 3 1 1992 117.0000000 137.5038386 - 734 4 1 1992 114.0000000 132.5688812 - 735 5 1 1992 108.0000000 128.2498079 - 736 6 1 1992 108.0000000 121.5488657 - 737 7 1 1992 101.0000000 115.9340916 - 738 8 1 1992 97.0000000 113.8533226 - 739 9 1 1992 89.0000000 121.0029494 - 740 10 1 1992 111.0000000 156.4096038 - 741 11 1 1992 135.0000000 161.8897828 - 742 12 1 1992 171.0000000 145.3659943 - 743 13 1 1992 125.0000000 136.4139381 - 744 14 1 1992 111.0000000 129.1487703 - 745 15 1 1992 100.0000000 122.7714929 - 746 16 1 1992 87.0000000 117.2280653 - 747 17 1 1992 75.0000000 112.1611936 - 748 18 1 1992 79.0000000 107.5504285 - 749 19 1 1992 70.0000000 109.4369644 - 750 20 1 1992 72.0000000 105.8675892 - 751 21 1 1992 87.0000000 104.2591756 - 752 22 1 1992 79.0000000 99.4815442 - 753 23 1 1992 71.0000000 95.9690570 - 754 24 1 1992 66.0000000 92.7745961 - 755 25 1 1992 67.0000000 89.8592965 - 756 26 1 1992 65.0000000 87.1900635 - 757 27 1 1992 59.0000000 84.7382754 - 758 28 1 1992 57.0000000 82.4937402 - 759 29 1 1992 54.0000000 80.7240360 - 760 30 1 1992 59.0000000 81.1288038 - 761 31 1 1992 57.0000000 86.9512569 - 762 1 2 1992 56.0000000 91.7305877 - 763 2 2 1992 54.0000000 90.4927223 - 764 3 2 1992 58.0000000 87.4563239 - 765 4 2 1992 63.0000000 121.1800770 - 766 5 2 1992 76.0000000 180.0536208 - 767 6 2 1992 250.0000000 204.9437013 - 768 7 2 1992 346.0000000 195.3534076 - 769 8 2 1992 241.0000000 171.8901430 - 770 9 2 1992 180.0000000 160.8472815 - 771 10 2 1992 164.0000000 169.3737812 - 772 11 2 1992 183.0000000 180.7264580 - 773 12 2 1992 215.0000000 210.9514736 - 774 13 2 1992 265.0000000 226.0653329 - 775 14 2 1992 287.0000000 243.3470141 - 776 15 2 1992 272.0000000 240.6465527 - 777 16 2 1992 253.0000000 265.7349925 - 778 17 2 1992 301.0000000 269.3637327 - 779 18 2 1992 275.0000000 234.9607103 - 780 19 2 1992 224.0000000 204.0061273 - 781 20 2 1992 194.0000000 180.1635271 - 782 21 2 1992 173.0000000 162.8815933 - 783 22 2 1992 157.0000000 150.8629335 - 784 23 2 1992 142.0000000 142.6634975 - 785 24 2 1992 133.0000000 137.2837610 - 786 25 2 1992 128.0000000 132.4680825 - 787 26 2 1992 125.0000000 125.6426998 - 788 27 2 1992 125.0000000 120.1051910 - 789 28 2 1992 110.0000000 115.1832955 - 790 29 2 1992 107.0000000 110.7334309 - 791 1 3 1992 97.0000000 106.8105876 - 792 2 3 1992 97.0000000 103.5735503 - 793 3 3 1992 86.0000000 105.4842673 - 794 4 3 1992 93.0000000 101.3933652 - 795 5 3 1992 86.0000000 98.0517796 - 796 6 3 1992 82.0000000 95.2583993 - 797 7 3 1992 80.0000000 92.5457098 - 798 8 3 1992 77.0000000 90.0297116 - 799 9 3 1992 73.0000000 87.7032650 - 800 10 3 1992 76.0000000 85.7105267 - 801 11 3 1992 68.0000000 84.0805958 - 802 12 3 1992 70.0000000 123.4482461 - 803 13 3 1992 116.0000000 188.6877299 - 804 14 3 1992 206.0000000 240.7005079 - 805 15 3 1992 433.0000000 286.2416190 - 806 16 3 1992 495.0000000 332.2303072 - 807 17 3 1992 331.0000000 294.6399120 - 808 18 3 1992 240.0000000 251.6771014 - 809 19 3 1992 215.0000000 218.6528600 - 810 20 3 1992 185.0000000 192.3724985 - 811 21 3 1992 185.0000000 179.5257694 - 812 22 3 1992 185.0000000 206.3941705 - 813 23 3 1992 213.0000000 315.1030427 - 814 24 3 1992 466.0000000 367.8944213 - 815 25 3 1992 580.0000000 402.5182171 - 816 26 3 1992 566.0000000 379.5837115 - 817 27 3 1992 487.0000000 340.8560790 - 818 28 3 1992 387.0000000 304.9858023 - 819 29 3 1992 311.0000000 272.2171071 - 820 30 3 1992 270.0000000 240.6454511 - 821 31 3 1992 246.0000000 217.0034431 - 822 1 4 1992 229.0000000 233.1610706 - 823 2 4 1992 222.0000000 231.2670364 - 824 3 4 1992 217.0000000 227.8477941 - 825 4 4 1992 208.0000000 286.5193399 - 826 5 4 1992 220.0000000 288.8888064 - 827 6 4 1992 210.0000000 255.6369828 - 828 7 4 1992 190.0000000 224.3476150 - 829 8 4 1992 173.0000000 198.8099625 - 830 9 4 1992 166.0000000 178.2302571 - 831 10 4 1992 133.0000000 161.5475730 - 832 11 4 1992 126.0000000 148.4844964 - 833 12 4 1992 124.0000000 138.7928612 - 834 13 4 1992 116.0000000 132.3965671 - 835 14 4 1992 112.0000000 131.6861057 - 836 15 4 1992 111.0000000 156.2151021 - 837 16 4 1992 137.0000000 180.6185484 - 838 17 4 1992 206.0000000 170.4300623 - 839 18 4 1992 176.0000000 170.1058897 - 840 19 4 1992 161.0000000 158.1575219 - 841 20 4 1992 161.0000000 148.5360387 - 842 21 4 1992 139.0000000 141.2443071 - 843 22 4 1992 139.0000000 135.2324359 - 844 23 4 1992 123.0000000 129.8493504 - 845 24 4 1992 119.0000000 124.9920657 - 846 25 4 1992 111.0000000 120.5975509 - 847 26 4 1992 94.0000000 116.6701654 - 848 27 4 1992 94.0000000 114.7110795 - 849 28 4 1992 102.0000000 120.9790391 - 850 29 4 1992 120.0000000 120.0652873 - 851 30 4 1992 120.0000000 116.0665809 - 852 1 5 1992 114.0000000 126.8549283 - 853 2 5 1992 115.0000000 163.0277925 - 854 3 5 1992 206.0000000 143.2088022 - 855 4 5 1992 215.0000000 133.9164607 - 856 5 5 1992 125.0000000 127.7185854 - 857 6 5 1992 123.0000000 122.7489024 - 858 7 5 1992 113.0000000 118.3428001 - 859 8 5 1992 77.0000000 114.3500280 - 860 9 5 1992 83.0000000 110.9554150 - 861 10 5 1992 83.0000000 119.5965708 - 862 11 5 1992 96.0000000 119.9184904 - 863 12 5 1992 120.0000000 110.0608362 - 864 13 5 1992 80.0000000 105.2811772 - 865 14 5 1992 76.0000000 102.2452473 - 866 15 5 1992 69.0000000 99.5160882 - 867 16 5 1992 63.0000000 96.9966481 - 868 17 5 1992 61.0000000 94.6632711 - 869 18 5 1992 60.0000000 92.4953869 - 870 19 5 1992 59.0000000 90.4750581 - 871 20 5 1992 67.0000000 88.5866713 - 872 21 5 1992 51.0000000 86.8211566 - 873 22 5 1992 44.0000000 85.1636197 - 874 23 5 1992 42.0000000 83.5941338 - 875 24 5 1992 51.0000000 82.1192075 - 876 25 5 1992 42.0000000 81.1397215 - 877 26 5 1992 54.0000000 90.1141819 - 878 27 5 1992 53.0000000 84.7337383 - 879 28 5 1992 59.0000000 79.2719125 - 880 29 5 1992 55.0000000 86.0093483 - 881 30 5 1992 54.0000000 88.4356118 - 882 31 5 1992 48.0000000 80.7233612 - 883 1 6 1992 63.0000000 83.5747484 - 884 2 6 1992 61.0000000 84.8178783 - 885 3 6 1992 55.0000000 82.7755502 - 886 4 6 1992 75.0000000 96.3441604 - 887 5 6 1992 53.0000000 116.2822615 - 888 6 6 1992 77.0000000 112.4042653 - 889 7 6 1992 114.0000000 109.2885642 - 890 8 6 1992 167.0000000 119.4952859 - 891 9 6 1992 116.0000000 112.0553339 - 892 10 6 1992 91.0000000 100.3675770 - 893 11 6 1992 85.0000000 96.6824386 - 894 12 6 1992 68.0000000 93.3691468 - 895 13 6 1992 71.0000000 90.3927389 - 896 14 6 1992 63.0000000 87.6722104 - 897 15 6 1992 59.0000000 85.1782801 - 898 16 6 1992 46.0000000 82.8842119 - 899 17 6 1992 44.0000000 80.7669236 - 900 18 6 1992 39.0000000 78.8064307 - 901 19 6 1992 41.0000000 76.9976167 - 902 20 6 1992 44.0000000 77.4455786 - 903 21 6 1992 39.0000000 76.1268493 - 904 22 6 1992 32.0000000 73.1028700 - 905 23 6 1992 40.0000000 74.0308531 - 906 24 6 1992 41.0000000 85.1529527 - 907 25 6 1992 42.0000000 83.0696747 - 908 26 6 1992 42.0000000 74.8915575 - 909 27 6 1992 48.0000000 71.6657156 - 910 28 6 1992 37.0000000 70.0763023 - 911 29 6 1992 40.0000000 68.6390326 - 912 30 6 1992 29.0000000 67.2993937 - 913 1 7 1992 30.0000000 66.7238425 - 914 2 7 1992 36.0000000 65.6341337 - 915 3 7 1992 29.0000000 66.5071800 - 916 4 7 1992 36.0000000 80.8750216 - 917 5 7 1992 50.0000000 97.2026453 - 918 6 7 1992 78.0000000 102.1296670 - 919 7 7 1992 54.0000000 87.9990054 - 920 8 7 1992 57.0000000 75.3624280 - 921 9 7 1992 51.0000000 73.0123540 - 922 10 7 1992 47.0000000 86.9115739 - 923 11 7 1992 46.0000000 110.3748818 - 924 12 7 1992 76.0000000 106.1868583 - 925 13 7 1992 72.0000000 97.3679871 - 926 14 7 1992 67.0000000 86.4484732 - 927 15 7 1992 63.0000000 82.8697575 - 928 16 7 1992 47.0000000 79.9188307 - 929 17 7 1992 47.0000000 77.2360105 - 930 18 7 1992 42.0000000 74.7885751 - 931 19 7 1992 41.0000000 72.5483969 - 932 20 7 1992 39.0000000 70.4912144 - 933 21 7 1992 37.0000000 68.8279115 - 934 22 7 1992 33.0000000 70.5840958 - 935 23 7 1992 33.0000000 66.8169259 - 936 24 7 1992 33.0000000 64.9961113 - 937 25 7 1992 37.0000000 63.5102870 - 938 26 7 1992 26.0000000 62.1180471 - 939 27 7 1992 24.0000000 60.8149307 - 940 28 7 1992 26.0000000 59.5919395 - 941 29 7 1992 29.0000000 58.4411214 - 942 30 7 1992 19.0000000 57.3554419 - 943 31 7 1992 22.0000000 57.2306164 - 944 1 8 1992 28.0000000 59.3751999 - 945 2 8 1992 35.0000000 55.3366459 - 946 3 8 1992 29.0000000 54.2544031 - 947 4 8 1992 36.0000000 53.3534328 - 948 5 8 1992 52.0000000 52.4956102 - 949 6 8 1992 74.0000000 51.6770160 - 950 7 8 1992 54.0000000 50.8941589 - 951 8 8 1992 57.0000000 50.1439239 - 952 9 8 1992 48.0000000 51.8918656 - 953 10 8 1992 47.0000000 51.7925258 - 954 11 8 1992 46.0000000 56.6279908 - 955 12 8 1992 75.0000000 60.3036199 - 956 13 8 1992 73.0000000 61.6661412 - 957 14 8 1992 66.0000000 62.6773806 - 958 15 8 1992 60.0000000 62.5763489 - 959 16 8 1992 47.0000000 50.8345536 - 960 17 8 1992 46.0000000 49.5459003 - 961 18 8 1992 42.0000000 48.6158349 - 962 19 8 1992 41.0000000 47.9216068 - 963 20 8 1992 40.0000000 54.0060259 - 964 21 8 1992 37.0000000 52.0758597 - 965 22 8 1992 32.0000000 48.3754305 - 966 23 8 1992 32.0000000 48.3521773 - 967 24 8 1992 32.0000000 46.0223355 - 968 25 8 1992 36.0000000 44.9970862 - 969 26 8 1992 27.0000000 44.2377323 - 970 27 8 1992 25.0000000 43.5207687 - 971 28 8 1992 25.0000000 43.3785924 - 972 29 8 1992 28.0000000 47.3327182 - 973 30 8 1992 20.0000000 64.7024670 - 974 31 8 1992 22.0000000 88.9309723 - 975 1 9 1992 49.0000000 114.1121807 - 976 2 9 1992 77.0000000 82.2096937 - 977 3 9 1992 67.0000000 78.0223534 - 978 4 9 1992 45.0000000 77.8098092 - 979 5 9 1992 44.0000000 73.3474587 - 980 6 9 1992 64.0000000 63.9948904 - 981 7 9 1992 52.0000000 61.0040722 - 982 8 9 1992 40.0000000 58.5703729 - 983 9 9 1992 30.0000000 56.3706170 - 984 10 9 1992 34.0000000 54.3755064 - 985 11 9 1992 32.0000000 52.6764095 - 986 12 9 1992 36.0000000 51.7219074 - 987 13 9 1992 28.0000000 49.9110871 - 988 14 9 1992 33.0000000 49.2192933 - 989 15 9 1992 35.0000000 52.2023852 - 990 16 9 1992 30.0000000 47.5773974 - 991 17 9 1992 32.0000000 46.1630237 - 992 18 9 1992 29.0000000 45.0033719 - 993 19 9 1992 30.0000000 44.5141004 - 994 20 9 1992 28.0000000 43.2086093 - 995 21 9 1992 29.0000000 42.1734803 - 996 22 9 1992 29.0000000 41.2861513 - 997 23 9 1992 27.0000000 40.4665551 - 998 24 9 1992 27.0000000 39.6900220 - 999 25 9 1992 23.0000000 38.9485051 - 1000 26 9 1992 28.0000000 38.2475240 - 1001 27 9 1992 25.0000000 37.5832402 - 1002 28 9 1992 25.0000000 37.1660911 - 1003 29 9 1992 27.0000000 41.8205595 - 1004 30 9 1992 25.0000000 37.0952660 - 1005 1 10 1992 27.0000000 36.5991594 - 1006 2 10 1992 33.0000000 36.7902942 - 1007 3 10 1992 29.0000000 41.1844067 - 1008 4 10 1992 31.0000000 36.5297375 - 1009 5 10 1992 25.0000000 47.8887646 - 1010 6 10 1992 25.0000000 55.9885293 - 1011 7 10 1992 36.0000000 47.7498463 - 1012 8 10 1992 42.0000000 38.8538374 - 1013 9 10 1992 43.0000000 38.2354847 - 1014 10 10 1992 26.0000000 45.2012940 - 1015 11 10 1992 27.0000000 46.2067774 - 1016 12 10 1992 27.0000000 39.5324145 - 1017 13 10 1992 26.0000000 38.3649229 - 1018 14 10 1992 26.0000000 37.5567946 - 1019 15 10 1992 23.0000000 45.9836449 - 1020 16 10 1992 21.0000000 53.8827706 - 1021 17 10 1992 26.0000000 42.5272291 - 1022 18 10 1992 34.0000000 47.8944121 - 1023 19 10 1992 37.0000000 42.3215089 - 1024 20 10 1992 31.0000000 48.9715955 - 1025 21 10 1992 31.0000000 50.1385856 - 1026 22 10 1992 35.0000000 48.9805043 - 1027 23 10 1992 33.0000000 64.0695031 - 1028 24 10 1992 40.0000000 130.3739813 - 1029 25 10 1992 74.0000000 169.9273664 - 1030 26 10 1992 161.0000000 196.4201739 - 1031 27 10 1992 285.0000000 201.3068019 - 1032 28 10 1992 244.0000000 222.4290729 - 1033 29 10 1992 263.0000000 247.9936020 - 1034 30 10 1992 276.0000000 218.4213484 - 1035 31 10 1992 186.0000000 183.5043672 - 1036 1 11 1992 154.0000000 158.5705808 - 1037 2 11 1992 112.0000000 154.5776051 - 1038 3 11 1992 104.0000000 158.8114524 - 1039 4 11 1992 96.0000000 155.1597193 - 1040 5 11 1992 99.0000000 138.5030467 - 1041 6 11 1992 126.0000000 122.0115456 - 1042 7 11 1992 91.0000000 110.0835371 - 1043 8 11 1992 84.0000000 103.9805061 - 1044 9 11 1992 81.0000000 106.5558128 - 1045 10 11 1992 85.0000000 128.9413703 - 1046 11 11 1992 126.0000000 209.3952912 - 1047 12 11 1992 279.0000000 269.3677510 - 1048 13 11 1992 390.0000000 290.3607081 - 1049 14 11 1992 294.0000000 293.3034931 - 1050 15 11 1992 260.0000000 344.5648143 - 1051 16 11 1992 398.0000000 498.4103300 - 1052 17 11 1992 520.0000000 519.9228788 - 1053 18 11 1992 487.0000000 476.0735682 - 1054 19 11 1992 380.0000000 491.4899379 - 1055 20 11 1992 385.0000000 437.8924105 - 1056 21 11 1992 351.0000000 413.2013700 - 1057 22 11 1992 309.0000000 515.3710178 - 1058 23 11 1992 587.0000000 457.0148543 - 1059 24 11 1992 661.0000000 388.4555735 - 1060 25 11 1992 447.0000000 364.2502840 - 1061 26 11 1992 361.0000000 392.8820701 - 1062 27 11 1992 351.0000000 383.6431520 - 1063 28 11 1992 353.0000000 391.1684416 - 1064 29 11 1992 369.0000000 474.9751081 - 1065 30 11 1992 452.0000000 499.4632171 - 1066 1 12 1992 441.0000000 424.4100156 - 1067 2 12 1992 348.0000000 419.0317590 - 1068 3 12 1992 394.0000000 478.0323628 - 1069 4 12 1992 455.0000000 497.7126563 - 1070 5 12 1992 491.0000000 558.9333886 - 1071 6 12 1992 469.0000000 499.3228455 - 1072 7 12 1992 364.0000000 478.4505142 - 1073 8 12 1992 338.0000000 432.0353493 - 1074 9 12 1992 334.0000000 366.0423781 - 1075 10 12 1992 268.0000000 306.6325871 - 1076 11 12 1992 236.0000000 288.0755952 - 1077 12 12 1992 230.0000000 299.2694153 - 1078 13 12 1992 239.0000000 281.2483333 - 1079 14 12 1992 256.0000000 240.4513724 - 1080 15 12 1992 217.0000000 213.0081753 - 1081 16 12 1992 201.0000000 197.9148936 - 1082 17 12 1992 188.0000000 187.8001237 - 1083 18 12 1992 176.0000000 180.3735791 - 1084 19 12 1992 170.0000000 168.9453622 - 1085 20 12 1992 168.0000000 164.2471857 - 1086 21 12 1992 131.0000000 166.2677789 - 1087 22 12 1992 133.0000000 171.2504689 - 1088 23 12 1992 134.0000000 159.8345247 - 1089 24 12 1992 127.0000000 151.1369253 - 1090 25 12 1992 117.0000000 144.0694905 - 1091 26 12 1992 113.0000000 137.7426760 - 1092 27 12 1992 100.0000000 132.0571997 - 1093 28 12 1992 94.0000000 126.9300061 - 1094 29 12 1992 87.0000000 122.2902973 - 1095 30 12 1992 86.0000000 118.0775026 - 1096 31 12 1992 81.0000000 114.2396214 - 1097 1 1 1993 77.0000000 110.7318653 - 1098 2 1 1993 76.0000000 107.5155385 - 1099 3 1 1993 61.0000000 104.5571117 - 1100 4 1 1993 61.0000000 101.8274519 - 1101 5 1 1993 57.0000000 99.3011795 - 1102 6 1 1993 66.0000000 110.8006868 - 1103 7 1 1993 67.0000000 133.2747934 - 1104 8 1 1993 84.0000000 137.5439888 - 1105 9 1 1993 90.0000000 148.0193662 - 1106 10 1 1993 113.0000000 181.9482893 - 1107 11 1 1993 265.0000000 338.2103983 - 1108 12 1 1993 559.0000000 549.7854422 - 1109 13 1 1993 832.0000000 576.4762066 - 1110 14 1 1993 601.0000000 515.6491628 - 1111 15 1 1993 436.0000000 425.8615586 - 1112 16 1 1993 339.0000000 351.9030079 - 1113 17 1 1993 292.0000000 298.4964009 - 1114 18 1 1993 247.0000000 261.4502467 - 1115 19 1 1993 218.0000000 232.9356570 - 1116 20 1 1993 205.0000000 210.9733587 - 1117 21 1 1993 190.0000000 197.3696818 - 1118 22 1 1993 176.0000000 189.2101411 - 1119 23 1 1993 173.0000000 183.8250727 - 1120 24 1 1993 173.0000000 205.6648429 - 1121 25 1 1993 199.0000000 317.3349128 - 1122 26 1 1993 361.0000000 303.9813786 - 1123 27 1 1993 295.0000000 285.9208370 - 1124 28 1 1993 238.0000000 312.0869879 - 1125 29 1 1993 263.0000000 301.2140343 - 1126 30 1 1993 245.0000000 271.9299093 - 1127 31 1 1993 222.0000000 238.1280239 - 1128 1 2 1993 199.0000000 212.2528824 - 1129 2 2 1993 186.0000000 191.9643203 - 1130 3 2 1993 171.0000000 176.0002525 - 1131 4 2 1993 157.0000000 164.2488631 - 1132 5 2 1993 159.0000000 155.5148686 - 1133 6 2 1993 129.0000000 148.3686701 - 1134 7 2 1993 119.0000000 142.4078509 - 1135 8 2 1993 119.0000000 136.8907492 - 1136 9 2 1993 105.0000000 131.8546849 - 1137 10 2 1993 106.0000000 127.2850924 - 1138 11 2 1993 105.0000000 123.1246698 - 1139 12 2 1993 95.0000000 119.3241568 - 1140 13 2 1993 91.0000000 115.8410720 - 1141 14 2 1993 88.0000000 112.6386656 - 1142 15 2 1993 84.0000000 109.6850527 - 1143 16 2 1993 83.0000000 107.1866993 - 1144 17 2 1993 79.0000000 106.3222911 - 1145 18 2 1993 78.0000000 108.9476850 - 1146 19 2 1993 84.0000000 107.3583459 - 1147 20 2 1993 91.0000000 118.0864951 - 1148 21 2 1993 91.0000000 127.2539636 - 1149 22 2 1993 90.0000000 125.6084922 - 1150 23 2 1993 103.0000000 121.5362186 - 1151 24 2 1993 94.0000000 116.3722707 - 1152 25 2 1993 81.0000000 112.4126613 - 1153 26 2 1993 78.0000000 108.9429850 - 1154 27 2 1993 75.0000000 108.4325731 - 1155 28 2 1993 76.0000000 109.3109640 - 1156 1 3 1993 80.0000000 105.2813775 - 1157 2 3 1993 75.0000000 103.3222482 - 1158 3 3 1993 76.0000000 102.2954099 - 1159 4 3 1993 72.0000000 99.4292293 - 1160 5 3 1993 65.0000000 96.8402823 - 1161 6 3 1993 64.0000000 94.5065867 - 1162 7 3 1993 64.0000000 92.3637465 - 1163 8 3 1993 68.0000000 91.9257556 - 1164 9 3 1993 68.0000000 89.7072064 - 1165 10 3 1993 67.0000000 88.5952807 - 1166 11 3 1993 61.0000000 89.3853961 - 1167 12 3 1993 57.0000000 90.2707094 - 1168 13 3 1993 58.0000000 89.4669281 - 1169 14 3 1993 54.0000000 87.1951395 - 1170 15 3 1993 66.0000000 85.3953853 - 1171 16 3 1993 54.0000000 83.7729996 - 1172 17 3 1993 57.0000000 82.2629848 - 1173 18 3 1993 57.0000000 80.8799288 - 1174 19 3 1993 52.0000000 79.5388094 - 1175 20 3 1993 57.0000000 78.2223742 - 1176 21 3 1993 58.0000000 77.2367356 - 1177 22 3 1993 57.0000000 87.5974240 - 1178 23 3 1993 56.0000000 102.0636318 - 1179 24 3 1993 63.0000000 90.1140251 - 1180 25 3 1993 76.0000000 87.4257626 - 1181 26 3 1993 56.0000000 85.2997183 - 1182 27 3 1993 59.0000000 83.3212994 - 1183 28 3 1993 59.0000000 81.4751016 - 1184 29 3 1993 54.0000000 79.7475784 - 1185 30 3 1993 48.0000000 78.1267893 - 1186 31 3 1993 55.0000000 76.6021858 - 1187 1 4 1993 48.0000000 75.5318738 - 1188 2 4 1993 53.0000000 79.2147527 - 1189 3 4 1993 47.0000000 78.6944429 - 1190 4 4 1993 59.0000000 83.4399739 - 1191 5 4 1993 53.0000000 100.5525206 - 1192 6 4 1993 64.0000000 105.9318217 - 1193 7 4 1993 63.0000000 94.6165325 - 1194 8 4 1993 75.0000000 92.8771631 - 1195 9 4 1993 64.0000000 89.4291428 - 1196 10 4 1993 59.0000000 88.7595301 - 1197 11 4 1993 60.0000000 96.4641434 - 1198 12 4 1993 63.0000000 95.2367447 - 1199 13 4 1993 69.0000000 93.1953754 - 1200 14 4 1993 79.0000000 92.6616942 - 1201 15 4 1993 82.0000000 89.3862183 - 1202 16 4 1993 68.0000000 87.1778193 - 1203 17 4 1993 56.0000000 85.0075150 - 1204 18 4 1993 59.0000000 82.6029180 - 1205 19 4 1993 61.0000000 80.4154961 - 1206 20 4 1993 62.0000000 78.3340624 - 1207 21 4 1993 57.0000000 76.4031047 - 1208 22 4 1993 53.0000000 74.6115652 - 1209 23 4 1993 47.0000000 72.9431216 - 1210 24 4 1993 46.0000000 71.3776408 - 1211 25 4 1993 47.0000000 69.9100625 - 1212 26 4 1993 45.0000000 68.5306777 - 1213 27 4 1993 43.0000000 67.2308500 - 1214 28 4 1993 41.0000000 66.0031058 - 1215 29 4 1993 38.0000000 64.8571385 - 1216 30 4 1993 39.0000000 64.2406735 - 1217 1 5 1993 40.0000000 63.2217881 - 1218 2 5 1993 41.0000000 63.4495793 - 1219 3 5 1993 45.0000000 63.7038282 - 1220 4 5 1993 49.0000000 61.6135945 - 1221 5 5 1993 40.0000000 60.4969110 - 1222 6 5 1993 43.0000000 59.6766511 - 1223 7 5 1993 38.0000000 59.3243136 - 1224 8 5 1993 38.0000000 59.3877994 - 1225 9 5 1993 43.0000000 57.6431492 - 1226 10 5 1993 44.0000000 58.1690971 - 1227 11 5 1993 41.0000000 57.8927175 - 1228 12 5 1993 51.0000000 64.6596744 - 1229 13 5 1993 63.0000000 100.0538903 - 1230 14 5 1993 68.0000000 83.3519255 - 1231 15 5 1993 77.0000000 67.0313513 - 1232 16 5 1993 77.0000000 64.9568700 - 1233 17 5 1993 59.0000000 63.2015368 - 1234 18 5 1993 49.0000000 61.5993788 - 1235 19 5 1993 43.0000000 66.0151138 - 1236 20 5 1993 44.0000000 71.0035858 - 1237 21 5 1993 48.0000000 74.7235399 - 1238 22 5 1993 44.0000000 64.0839975 - 1239 23 5 1993 46.0000000 61.9814306 - 1240 24 5 1993 40.0000000 60.4068802 - 1241 25 5 1993 43.0000000 58.9492410 - 1242 26 5 1993 30.0000000 58.3818031 - 1243 27 5 1993 45.0000000 64.8167858 - 1244 28 5 1993 43.0000000 74.1643707 - 1245 29 5 1993 44.0000000 66.3433452 - 1246 30 5 1993 54.0000000 65.0048104 - 1247 31 5 1993 56.0000000 67.8556872 - 1248 1 6 1993 44.0000000 60.3658366 - 1249 2 6 1993 43.0000000 59.9271905 - 1250 3 6 1993 33.0000000 65.9342362 - 1251 4 6 1993 45.0000000 61.9964212 - 1252 5 6 1993 46.0000000 58.3623463 - 1253 6 6 1993 42.0000000 56.7439336 - 1254 7 6 1993 40.0000000 55.3670042 - 1255 8 6 1993 30.0000000 54.0870484 - 1256 9 6 1993 31.0000000 52.9231439 - 1257 10 6 1993 32.0000000 52.2397200 - 1258 11 6 1993 25.0000000 51.4799046 - 1259 12 6 1993 33.0000000 53.6539610 - 1260 13 6 1993 29.0000000 51.6826319 - 1261 14 6 1993 40.0000000 52.4976080 - 1262 15 6 1993 42.0000000 55.4499071 - 1263 16 6 1993 37.0000000 52.5224343 - 1264 17 6 1993 46.0000000 51.7419480 - 1265 18 6 1993 47.0000000 49.5513815 - 1266 19 6 1993 50.0000000 48.9041676 - 1267 20 6 1993 43.0000000 70.9222543 - 1268 21 6 1993 69.0000000 77.9465101 - 1269 22 6 1993 61.0000000 63.7511196 - 1270 23 6 1993 67.0000000 95.5244440 - 1271 24 6 1993 77.0000000 71.1584355 - 1272 25 6 1993 87.0000000 66.9237221 - 1273 26 6 1993 55.0000000 64.3441048 - 1274 27 6 1993 43.0000000 62.0631204 - 1275 28 6 1993 40.0000000 59.9864584 - 1276 29 6 1993 30.0000000 58.0893300 - 1277 30 6 1993 40.0000000 56.3504594 - 1278 1 7 1993 40.0000000 55.4614032 - 1279 2 7 1993 27.0000000 57.7481349 - 1280 3 7 1993 34.0000000 53.7077513 - 1281 4 7 1993 30.0000000 52.1316024 - 1282 5 7 1993 31.0000000 50.9086865 - 1283 6 7 1993 27.0000000 49.6102469 - 1284 7 7 1993 31.0000000 48.4463705 - 1285 8 7 1993 26.0000000 47.3783469 - 1286 9 7 1993 23.0000000 46.5118157 - 1287 10 7 1993 24.0000000 47.8330506 - 1288 11 7 1993 25.0000000 47.9587143 - 1289 12 7 1993 34.0000000 61.6109835 - 1290 13 7 1993 40.0000000 62.5268956 - 1291 14 7 1993 41.0000000 73.7499717 - 1292 15 7 1993 46.0000000 73.7864143 - 1293 16 7 1993 39.0000000 54.5333058 - 1294 17 7 1993 43.0000000 52.8011872 - 1295 18 7 1993 35.0000000 52.1018328 - 1296 19 7 1993 49.0000000 67.1399534 - 1297 20 7 1993 38.0000000 73.0696340 - 1298 21 7 1993 41.0000000 64.0678322 - 1299 22 7 1993 45.0000000 65.3603401 - 1300 23 7 1993 41.0000000 56.0073485 - 1301 24 7 1993 42.0000000 53.9904352 - 1302 25 7 1993 40.0000000 52.4179455 - 1303 26 7 1993 35.0000000 50.9301428 - 1304 27 7 1993 40.0000000 71.8897184 - 1305 28 7 1993 40.0000000 68.7118169 - 1306 29 7 1993 36.0000000 54.0023068 - 1307 30 7 1993 40.0000000 92.4246466 - 1308 31 7 1993 61.0000000 107.8899273 - 1309 1 8 1993 36.0000000 68.8269258 - 1310 2 8 1993 46.0000000 65.0529521 - 1311 3 8 1993 32.0000000 62.1738316 - 1312 4 8 1993 38.0000000 59.5810757 - 1313 5 8 1993 32.0000000 57.2388323 - 1314 6 8 1993 25.0000000 55.1296774 - 1315 7 8 1993 26.0000000 53.2008446 - 1316 8 8 1993 29.0000000 51.4383316 - 1317 9 8 1993 29.0000000 55.9715456 - 1318 10 8 1993 28.0000000 61.7723211 - 1319 11 8 1993 37.0000000 55.7461421 - 1320 12 8 1993 40.0000000 50.3498328 - 1321 13 8 1993 49.0000000 48.5965251 - 1322 14 8 1993 32.0000000 49.2835629 - 1323 15 8 1993 37.0000000 47.8374188 - 1324 16 8 1993 37.0000000 45.6925139 - 1325 17 8 1993 27.0000000 44.4836390 - 1326 18 8 1993 24.0000000 43.3781449 - 1327 19 8 1993 24.0000000 42.3499189 - 1328 20 8 1993 22.0000000 41.3909659 - 1329 21 8 1993 21.0000000 40.4942371 - 1330 22 8 1993 16.0000000 39.8021852 - 1331 23 8 1993 21.0000000 44.6116200 - 1332 24 8 1993 27.0000000 42.5422334 - 1333 25 8 1993 26.0000000 38.9884308 - 1334 26 8 1993 23.0000000 38.1135415 - 1335 27 8 1993 21.0000000 37.9218076 - 1336 28 8 1993 28.0000000 44.6158075 - 1337 29 8 1993 17.0000000 37.9442387 - 1338 30 8 1993 24.0000000 36.9114883 - 1339 31 8 1993 25.0000000 36.2386141 - 1340 1 9 1993 25.0000000 35.6005616 - 1341 2 9 1993 19.0000000 34.9942170 - 1342 3 9 1993 17.0000000 35.0227888 - 1343 4 9 1993 16.0000000 43.9825654 - 1344 5 9 1993 19.0000000 36.8379706 - 1345 6 9 1993 23.0000000 34.8247747 - 1346 7 9 1993 25.0000000 53.8637721 - 1347 8 9 1993 34.0000000 52.5450051 - 1348 9 9 1993 31.0000000 56.0041216 - 1349 10 9 1993 35.0000000 92.3455504 - 1350 11 9 1993 53.0000000 110.3792127 - 1351 12 9 1993 71.0000000 124.4966679 - 1352 13 9 1993 74.0000000 140.0343416 - 1353 14 9 1993 87.0000000 180.7495027 - 1354 15 9 1993 173.0000000 169.9497023 - 1355 16 9 1993 117.0000000 142.4752935 - 1356 17 9 1993 93.0000000 120.9644946 - 1357 18 9 1993 77.0000000 109.8179967 - 1358 19 9 1993 62.0000000 101.0932789 - 1359 20 9 1993 54.0000000 93.9176151 - 1360 21 9 1993 48.0000000 90.4630550 - 1361 22 9 1993 46.0000000 105.3753792 - 1362 23 9 1993 55.0000000 121.0563163 - 1363 24 9 1993 66.0000000 120.4017543 - 1364 25 9 1993 64.0000000 120.9590925 - 1365 26 9 1993 52.0000000 110.2834766 - 1366 27 9 1993 68.0000000 98.9301520 - 1367 28 9 1993 69.0000000 100.7679368 - 1368 29 9 1993 62.0000000 103.4982079 - 1369 30 9 1993 76.0000000 93.0854164 - 1370 1 10 1993 72.0000000 112.5677592 - 1371 2 10 1993 68.0000000 122.6886563 - 1372 3 10 1993 72.0000000 116.0529805 - 1373 4 10 1993 78.0000000 123.4738254 - 1374 5 10 1993 116.0000000 176.2802808 - 1375 6 10 1993 131.0000000 214.2806744 - 1376 7 10 1993 180.0000000 192.1880323 - 1377 8 10 1993 203.0000000 182.3532920 - 1378 9 10 1993 164.0000000 199.5918167 - 1379 10 10 1993 178.0000000 201.1084720 - 1380 11 10 1993 161.0000000 253.1923782 - 1381 12 10 1993 287.0000000 245.9441341 - 1382 13 10 1993 360.0000000 313.2897696 - 1383 14 10 1993 374.0000000 341.1629725 - 1384 15 10 1993 297.0000000 301.5765881 - 1385 16 10 1993 247.0000000 289.1064375 - 1386 17 10 1993 273.0000000 303.4688615 - 1387 18 10 1993 261.0000000 275.9941341 - 1388 19 10 1993 265.0000000 246.6976161 - 1389 20 10 1993 230.0000000 212.6098697 - 1390 21 10 1993 199.0000000 185.9977916 - 1391 22 10 1993 173.0000000 173.0272637 - 1392 23 10 1993 182.0000000 186.9118864 - 1393 24 10 1993 203.0000000 203.5463160 - 1394 25 10 1993 213.0000000 182.0709744 - 1395 26 10 1993 180.0000000 159.7345294 - 1396 27 10 1993 154.0000000 143.2403037 - 1397 28 10 1993 118.0000000 132.2719892 - 1398 29 10 1993 112.0000000 124.3087127 - 1399 30 10 1993 98.0000000 117.5432115 - 1400 31 10 1993 97.0000000 111.5644695 - 1401 1 11 1993 91.0000000 106.2188351 - 1402 2 11 1993 85.0000000 101.4228990 - 1403 3 11 1993 75.0000000 97.1057927 - 1404 4 11 1993 76.0000000 93.2070648 - 1405 5 11 1993 78.0000000 89.6749584 - 1406 6 11 1993 72.0000000 86.5154446 - 1407 7 11 1993 76.0000000 86.2422490 - 1408 8 11 1993 69.0000000 84.1689832 - 1409 9 11 1993 66.0000000 81.8321300 - 1410 10 11 1993 71.0000000 80.7396737 - 1411 11 11 1993 64.0000000 86.6375025 - 1412 12 11 1993 67.0000000 98.2901563 - 1413 13 11 1993 80.0000000 95.6668812 - 1414 14 11 1993 78.0000000 116.7744963 - 1415 15 11 1993 80.0000000 132.1724265 - 1416 16 11 1993 86.0000000 124.5071238 - 1417 17 11 1993 125.0000000 114.1212294 - 1418 18 11 1993 96.0000000 108.1120011 - 1419 19 11 1993 82.0000000 103.0052439 - 1420 20 11 1993 77.0000000 98.4508482 - 1421 21 11 1993 67.0000000 94.3488962 - 1422 22 11 1993 71.0000000 90.6420346 - 1423 23 11 1993 61.0000000 87.2812540 - 1424 24 11 1993 42.0000000 84.2245071 - 1425 25 11 1993 63.0000000 81.4461592 - 1426 26 11 1993 57.0000000 80.4309557 - 1427 27 11 1993 58.0000000 77.7404576 - 1428 28 11 1993 49.0000000 75.4712326 - 1429 29 11 1993 50.0000000 73.4188739 - 1430 30 11 1993 55.0000000 71.5188921 - 1431 1 12 1993 54.0000000 69.7551425 - 1432 2 12 1993 54.0000000 74.3883387 - 1433 3 12 1993 50.0000000 74.9622725 - 1434 4 12 1993 51.0000000 75.1991789 - 1435 5 12 1993 62.0000000 72.7337373 - 1436 6 12 1993 62.0000000 70.0383411 - 1437 7 12 1993 71.0000000 95.1247126 - 1438 8 12 1993 79.0000000 147.6462459 - 1439 9 12 1993 153.0000000 188.6431499 - 1440 10 12 1993 291.0000000 221.5364489 - 1441 11 12 1993 332.0000000 321.3910245 - 1442 12 12 1993 465.0000000 379.3053930 - 1443 13 12 1993 518.0000000 436.9575403 - 1444 14 12 1993 539.0000000 482.1820749 - 1445 15 12 1993 559.0000000 470.0614410 - 1446 16 12 1993 500.0000000 536.3632220 - 1447 17 12 1993 526.0000000 566.1139579 - 1448 18 12 1993 583.0000000 597.1709088 - 1449 19 12 1993 677.0000000 620.9782451 - 1450 20 12 1993 781.0000000 904.7887172 - 1451 21 12 1993 1180.0000000 1104.2188310 - 1452 22 12 1993 1460.0000000 1088.1680553 - 1453 23 12 1993 1600.0000000 1130.1261026 - 1454 24 12 1993 1410.0000000 1159.9224374 - 1455 25 12 1993 1230.0000000 1033.9727591 - 1456 26 12 1993 1070.0000000 844.7309479 - 1457 27 12 1993 746.0000000 692.7168472 - 1458 28 12 1993 542.0000000 583.8175534 - 1459 29 12 1993 492.0000000 539.8529768 - 1460 30 12 1993 491.0000000 588.8801349 - 1461 31 12 1993 617.0000000 720.0815080 + 1 1 7 1990 79.0000000 93.3555000 + 2 2 7 1990 92.0000000 72.4852733 + 3 3 7 1990 72.0000000 73.0743504 + 4 4 7 1990 58.0000000 92.8094089 + 5 5 7 1990 69.0000000 115.8205545 + 6 6 7 1990 94.0000000 114.1220299 + 7 7 7 1990 199.0000000 99.1646539 + 8 8 7 1990 133.0000000 106.2818075 + 9 9 7 1990 124.0000000 90.7333306 + 10 10 7 1990 123.0000000 84.6414875 + 11 11 7 1990 99.0000000 80.0005237 + 12 12 7 1990 88.0000000 76.2900896 + 13 13 7 1990 84.0000000 72.9610826 + 14 14 7 1990 72.0000000 69.9517203 + 15 15 7 1990 55.0000000 67.2231478 + 16 16 7 1990 65.0000000 64.7418891 + 17 17 7 1990 50.0000000 62.4790096 + 18 18 7 1990 50.0000000 60.4094248 + 19 19 7 1990 46.0000000 58.5113251 + 20 20 7 1990 44.0000000 56.7656974 + 21 21 7 1990 42.0000000 55.1559235 + 22 22 7 1990 37.0000000 53.6674432 + 23 23 7 1990 38.0000000 52.2874697 + 24 24 7 1990 44.0000000 51.0047491 + 25 25 7 1990 30.0000000 49.8093557 + 26 26 7 1990 26.0000000 48.6925181 + 27 27 7 1990 31.0000000 47.6464699 + 28 28 7 1990 33.0000000 49.6521383 + 29 29 7 1990 42.0000000 47.5472594 + 30 30 7 1990 36.0000000 45.2308368 + 31 31 7 1990 34.0000000 44.3770667 + 32 1 8 1990 25.0000000 43.5693664 + 33 2 8 1990 22.0000000 42.8035322 + 34 3 8 1990 28.0000000 42.0758080 + 35 4 8 1990 25.0000000 41.3828309 + 36 5 8 1990 19.0000000 40.7215880 + 37 6 8 1990 22.0000000 40.0900216 + 38 7 8 1990 19.0000000 39.4846301 + 39 8 8 1990 22.0000000 38.9033742 + 40 9 8 1990 19.0000000 38.3445555 + 41 10 8 1990 20.0000000 37.8063971 + 42 11 8 1990 19.0000000 37.2872934 + 43 12 8 1990 19.0000000 36.7857928 + 44 13 8 1990 22.0000000 39.7432414 + 45 14 8 1990 36.0000000 57.8953379 + 46 15 8 1990 31.0000000 60.2760780 + 47 16 8 1990 30.0000000 46.4267226 + 48 17 8 1990 28.0000000 47.1302028 + 49 18 8 1990 34.0000000 38.1137673 + 50 19 8 1990 21.0000000 37.2177098 + 51 20 8 1990 30.0000000 36.5667632 + 52 21 8 1990 22.0000000 35.9489606 + 53 22 8 1990 21.0000000 35.3612336 + 54 23 8 1990 23.0000000 34.8008510 + 55 24 8 1990 20.0000000 34.2653778 + 56 25 8 1990 29.0000000 33.7538070 + 57 26 8 1990 20.0000000 33.3189889 + 58 27 8 1990 22.0000000 34.3332897 + 59 28 8 1990 23.0000000 34.0613835 + 60 29 8 1990 35.0000000 32.2409048 + 61 30 8 1990 51.0000000 93.5449749 + 62 31 8 1990 80.0000000 135.5520192 + 63 1 9 1990 56.0000000 61.6799054 + 64 2 9 1990 33.0000000 47.3390158 + 65 3 9 1990 27.0000000 45.3654550 + 66 4 9 1990 27.0000000 44.9577766 + 67 5 9 1990 28.0000000 49.3063020 + 68 6 9 1990 26.0000000 42.4298919 + 69 7 9 1990 24.0000000 46.1007774 + 70 8 9 1990 33.0000000 45.3260023 + 71 9 9 1990 26.0000000 40.0905166 + 72 10 9 1990 27.0000000 38.7788685 + 73 11 9 1990 22.0000000 37.6695016 + 74 12 9 1990 22.0000000 36.6461974 + 75 13 9 1990 21.0000000 35.6995367 + 76 14 9 1990 22.0000000 34.8212770 + 77 15 9 1990 22.0000000 34.0041891 + 78 16 9 1990 22.0000000 33.2419178 + 79 17 9 1990 20.0000000 32.5288653 + 80 18 9 1990 22.0000000 31.8600904 + 81 19 9 1990 16.0000000 31.2312236 + 82 20 9 1990 22.0000000 30.6383932 + 83 21 9 1990 19.0000000 36.0500402 + 84 22 9 1990 32.0000000 87.8004646 + 85 23 9 1990 27.0000000 101.1433239 + 86 24 9 1990 45.0000000 68.7131532 + 87 25 9 1990 42.0000000 51.4635644 + 88 26 9 1990 39.0000000 46.2854737 + 89 27 9 1990 30.0000000 44.3521681 + 90 28 9 1990 28.0000000 42.6006627 + 91 29 9 1990 30.0000000 41.0111560 + 92 30 9 1990 30.0000000 69.3667089 + 93 1 10 1990 56.0000000 136.2773800 + 94 2 10 1990 72.0000000 118.5158236 + 95 3 10 1990 73.0000000 98.5648947 + 96 4 10 1990 68.0000000 99.6847195 + 97 5 10 1990 53.0000000 85.0182150 + 98 6 10 1990 42.0000000 77.4459596 + 99 7 10 1990 33.0000000 72.3215447 + 100 8 10 1990 42.0000000 68.1409288 + 101 9 10 1990 34.0000000 64.4278011 + 102 10 10 1990 36.0000000 61.0899415 + 103 11 10 1990 36.0000000 58.0935049 + 104 12 10 1990 28.0000000 55.3958216 + 105 13 10 1990 32.0000000 52.9600647 + 106 14 10 1990 27.0000000 50.7545627 + 107 15 10 1990 35.0000000 49.0717480 + 108 16 10 1990 42.0000000 49.8177395 + 109 17 10 1990 35.0000000 54.1296441 + 110 18 10 1990 39.0000000 62.2126623 + 111 19 10 1990 34.0000000 50.1686548 + 112 20 10 1990 32.0000000 47.7928683 + 113 21 10 1990 34.0000000 46.0285953 + 114 22 10 1990 27.0000000 44.4223296 + 115 23 10 1990 31.0000000 42.9525898 + 116 24 10 1990 28.0000000 41.6040278 + 117 25 10 1990 25.0000000 41.0882761 + 118 26 10 1990 29.0000000 54.8254134 + 119 27 10 1990 31.0000000 69.8387657 + 120 28 10 1990 65.0000000 160.9955109 + 121 29 10 1990 69.0000000 214.9966015 + 122 30 10 1990 157.0000000 183.1389988 + 123 31 10 1990 190.0000000 156.3068134 + 124 1 11 1990 115.0000000 154.9519135 + 125 2 11 1990 104.0000000 158.3918250 + 126 3 11 1990 100.0000000 171.9104774 + 127 4 11 1990 131.0000000 171.1890897 + 128 5 11 1990 130.0000000 168.3501491 + 129 6 11 1990 115.0000000 149.3454061 + 130 7 11 1990 102.0000000 130.5819461 + 131 8 11 1990 95.0000000 114.8531967 + 132 9 11 1990 81.0000000 102.3240241 + 133 10 11 1990 66.0000000 103.7047654 + 134 11 11 1990 67.0000000 126.4275846 + 135 12 11 1990 74.0000000 151.2145806 + 136 13 11 1990 109.0000000 143.6378864 + 137 14 11 1990 92.0000000 156.1068342 + 138 15 11 1990 92.0000000 179.1298391 + 139 16 11 1990 155.0000000 175.1221505 + 140 17 11 1990 159.0000000 160.7726826 + 141 18 11 1990 131.0000000 170.7126514 + 142 19 11 1990 161.0000000 182.3743056 + 143 20 11 1990 196.0000000 248.9681808 + 144 21 11 1990 336.0000000 348.2735564 + 145 22 11 1990 566.0000000 317.6877903 + 146 23 11 1990 373.0000000 327.8925225 + 147 24 11 1990 293.0000000 310.6662236 + 148 25 11 1990 264.0000000 293.5678217 + 149 26 11 1990 226.0000000 270.0163226 + 150 27 11 1990 201.0000000 232.9190520 + 151 28 11 1990 180.0000000 202.3432718 + 152 29 11 1990 161.0000000 185.0904010 + 153 30 11 1990 149.0000000 177.1465178 + 154 1 12 1990 134.0000000 155.3773948 + 155 2 12 1990 113.0000000 139.2892055 + 156 3 12 1990 99.0000000 128.3770510 + 157 4 12 1990 107.0000000 120.7278288 + 158 5 12 1990 99.0000000 114.1379553 + 159 6 12 1990 89.0000000 108.2152673 + 160 7 12 1990 77.0000000 102.9512170 + 161 8 12 1990 71.0000000 98.2300461 + 162 9 12 1990 68.0000000 93.9813566 + 163 10 12 1990 73.0000000 90.1456075 + 164 11 12 1990 84.0000000 86.6717983 + 165 12 12 1990 88.0000000 98.8387542 + 166 13 12 1990 92.0000000 110.7817014 + 167 14 12 1990 128.0000000 103.1689685 + 168 15 12 1990 136.0000000 95.6688625 + 169 16 12 1990 114.0000000 91.1320344 + 170 17 12 1990 101.0000000 87.2462505 + 171 18 12 1990 93.0000000 83.7471782 + 172 19 12 1990 85.0000000 80.5855112 + 173 20 12 1990 81.0000000 77.7190841 + 174 21 12 1990 106.0000000 104.7051854 + 175 22 12 1990 159.0000000 137.8774232 + 176 23 12 1990 250.0000000 151.4034768 + 177 24 12 1990 298.0000000 147.3995819 + 178 25 12 1990 261.0000000 168.1709339 + 179 26 12 1990 228.0000000 277.4949788 + 180 27 12 1990 409.0000000 353.5140559 + 181 28 12 1990 486.0000000 392.6714629 + 182 29 12 1990 440.0000000 452.6395331 + 183 30 12 1990 486.0000000 594.0895313 + 184 31 12 1990 774.0000000 684.5204689 + 185 1 1 1991 889.0000000 759.3606239 + 186 2 1 1991 863.0000000 792.8668479 + 187 3 1 1991 875.0000000 873.1214897 + 188 4 1 1991 932.0000000 807.7703586 + 189 5 1 1991 826.0000000 747.2761023 + 190 6 1 1991 731.0000000 702.1321449 + 191 7 1 1991 613.0000000 649.6470375 + 192 8 1 1991 610.0000000 650.8341351 + 193 9 1 1991 686.0000000 594.5418584 + 194 10 1 1991 556.0000000 603.5110397 + 195 11 1 1991 669.0000000 644.3563338 + 196 12 1 1991 828.0000000 626.0784864 + 197 13 1 1991 735.0000000 528.1690489 + 198 14 1 1991 513.0000000 434.9405054 + 199 15 1 1991 411.0000000 360.4275044 + 200 16 1 1991 345.0000000 301.2892573 + 201 17 1 1991 293.0000000 255.8926241 + 202 18 1 1991 251.0000000 224.1153603 + 203 19 1 1991 222.0000000 201.8326622 + 204 20 1 1991 215.0000000 186.4082908 + 205 21 1 1991 213.0000000 177.9370567 + 206 22 1 1991 202.0000000 179.7252899 + 207 23 1 1991 200.0000000 172.6892419 + 208 24 1 1991 192.0000000 163.8954922 + 209 25 1 1991 176.0000000 155.7735619 + 210 26 1 1991 164.0000000 148.7326277 + 211 27 1 1991 157.0000000 142.2213668 + 212 28 1 1991 134.0000000 136.3741710 + 213 29 1 1991 130.0000000 131.1064982 + 214 30 1 1991 119.0000000 126.3440558 + 215 31 1 1991 107.0000000 122.0233780 + 216 1 2 1991 112.0000000 118.0900608 + 217 2 2 1991 109.0000000 114.4973170 + 218 3 2 1991 101.0000000 111.2047853 + 219 4 2 1991 98.0000000 108.1775468 + 220 5 2 1991 84.0000000 105.3853074 + 221 6 2 1991 93.0000000 102.8017162 + 222 7 2 1991 80.0000000 100.4037953 + 223 8 2 1991 73.0000000 98.1714599 + 224 9 2 1991 89.0000000 96.0871151 + 225 10 2 1991 84.0000000 94.1353129 + 226 11 2 1991 78.0000000 92.3024630 + 227 12 2 1991 79.0000000 90.5765852 + 228 13 2 1991 77.0000000 88.9470990 + 229 14 2 1991 80.0000000 87.4046429 + 230 15 2 1991 72.0000000 85.9409193 + 231 16 2 1991 78.0000000 85.6478586 + 232 17 2 1991 74.0000000 86.1445625 + 233 18 2 1991 77.0000000 84.5299237 + 234 19 2 1991 73.0000000 89.0202512 + 235 20 2 1991 69.0000000 107.0944727 + 236 21 2 1991 74.0000000 130.5169630 + 237 22 2 1991 81.0000000 153.9496537 + 238 23 2 1991 110.0000000 152.9883295 + 239 24 2 1991 180.0000000 151.8245785 + 240 25 2 1991 213.0000000 146.6329168 + 241 26 2 1991 222.0000000 141.8833408 + 242 27 2 1991 208.0000000 142.3348929 + 243 28 2 1991 211.0000000 139.5982919 + 244 1 3 1991 214.0000000 132.5046344 + 245 2 3 1991 208.0000000 136.4210654 + 246 3 3 1991 221.0000000 138.9125761 + 247 4 3 1991 281.0000000 130.0407195 + 248 5 3 1991 219.0000000 124.1662157 + 249 6 3 1991 190.0000000 119.1641728 + 250 7 3 1991 173.0000000 114.6681842 + 251 8 3 1991 164.0000000 110.6085979 + 252 9 3 1991 142.0000000 107.7432933 + 253 10 3 1991 133.0000000 106.5706868 + 254 11 3 1991 133.0000000 105.5145094 + 255 12 3 1991 118.0000000 102.0647106 + 256 13 3 1991 127.0000000 98.8146238 + 257 14 3 1991 113.0000000 95.9362980 + 258 15 3 1991 107.0000000 93.2911524 + 259 16 3 1991 100.0000000 90.8522992 + 260 17 3 1991 100.0000000 88.6004482 + 261 18 3 1991 95.0000000 86.5470548 + 262 19 3 1991 98.0000000 125.1839887 + 263 20 3 1991 119.0000000 156.8378766 + 264 21 3 1991 159.0000000 154.4612620 + 265 22 3 1991 196.0000000 181.1304581 + 266 23 3 1991 242.0000000 168.8932328 + 267 24 3 1991 216.0000000 154.3870963 + 268 25 3 1991 180.0000000 143.8194010 + 269 26 3 1991 145.0000000 135.8591335 + 270 27 3 1991 127.0000000 130.3140971 + 271 28 3 1991 117.0000000 124.0771027 + 272 29 3 1991 109.0000000 118.3336193 + 273 30 3 1991 106.0000000 113.2632175 + 274 31 3 1991 99.0000000 108.7045691 + 275 1 4 1991 96.0000000 104.5909625 + 276 2 4 1991 88.0000000 100.8656601 + 277 3 4 1991 87.0000000 97.4802145 + 278 4 4 1991 82.0000000 94.6973102 + 279 5 4 1991 84.0000000 92.6487687 + 280 6 4 1991 67.0000000 90.2073590 + 281 7 4 1991 89.0000000 87.8271691 + 282 8 4 1991 75.0000000 85.8485063 + 283 9 4 1991 79.0000000 83.8007872 + 284 10 4 1991 70.0000000 81.7791546 + 285 11 4 1991 69.0000000 79.8944516 + 286 12 4 1991 69.0000000 78.1375548 + 287 13 4 1991 56.0000000 76.4951104 + 288 14 4 1991 63.0000000 74.9559696 + 289 15 4 1991 58.0000000 73.5155235 + 290 16 4 1991 56.0000000 72.1521248 + 291 17 4 1991 54.0000000 70.8621745 + 292 18 4 1991 57.0000000 69.6794975 + 293 19 4 1991 53.0000000 69.3079073 + 294 20 4 1991 53.0000000 69.0176398 + 295 21 4 1991 65.0000000 68.9023290 + 296 22 4 1991 69.0000000 69.4773861 + 297 23 4 1991 61.0000000 71.2595100 + 298 24 4 1991 56.0000000 69.6060115 + 299 25 4 1991 56.0000000 67.3153204 + 300 26 4 1991 53.0000000 66.0344550 + 301 27 4 1991 49.0000000 64.9135315 + 302 28 4 1991 53.0000000 63.8490007 + 303 29 4 1991 48.0000000 66.9015862 + 304 30 4 1991 57.0000000 96.0419176 + 305 1 5 1991 69.0000000 117.0280820 + 306 2 5 1991 89.0000000 88.0531422 + 307 3 5 1991 105.0000000 83.2750871 + 308 4 5 1991 79.0000000 80.4461289 + 309 5 5 1991 69.0000000 78.0145761 + 310 6 5 1991 71.0000000 76.1075568 + 311 7 5 1991 60.0000000 74.0650186 + 312 8 5 1991 64.0000000 71.9284422 + 313 9 5 1991 59.0000000 70.0901959 + 314 10 5 1991 57.0000000 68.5639786 + 315 11 5 1991 55.0000000 72.6646813 + 316 12 5 1991 53.0000000 69.4243494 + 317 13 5 1991 52.0000000 67.6201767 + 318 14 5 1991 50.0000000 65.8010125 + 319 15 5 1991 52.0000000 67.1142255 + 320 16 5 1991 54.0000000 73.1202519 + 321 17 5 1991 54.0000000 67.3544155 + 322 18 5 1991 55.0000000 65.3815548 + 323 19 5 1991 48.0000000 63.9877084 + 324 20 5 1991 48.0000000 62.6833852 + 325 21 5 1991 49.0000000 61.4534618 + 326 22 5 1991 41.0000000 60.2911988 + 327 23 5 1991 40.0000000 59.1905556 + 328 24 5 1991 40.0000000 58.1461103 + 329 25 5 1991 39.0000000 57.1529902 + 330 26 5 1991 43.0000000 56.2068111 + 331 27 5 1991 39.0000000 55.3036231 + 332 28 5 1991 36.0000000 54.4398644 + 333 29 5 1991 33.0000000 53.6123192 + 334 30 5 1991 39.0000000 52.8180814 + 335 31 5 1991 34.0000000 52.0545220 + 336 1 6 1991 37.0000000 51.3192605 + 337 2 6 1991 35.0000000 50.6101396 + 338 3 6 1991 29.0000000 49.9252023 + 339 4 6 1991 33.0000000 49.2626716 + 340 5 6 1991 34.0000000 48.6218264 + 341 6 6 1991 32.0000000 62.9062508 + 342 7 6 1991 38.0000000 68.0937224 + 343 8 6 1991 39.0000000 62.6872551 + 344 9 6 1991 41.0000000 53.6777224 + 345 10 6 1991 44.0000000 71.7429001 + 346 11 6 1991 48.0000000 57.3491481 + 347 12 6 1991 42.0000000 52.8847971 + 348 13 6 1991 37.0000000 51.7877323 + 349 14 6 1991 39.0000000 50.9825831 + 350 15 6 1991 35.0000000 49.8989195 + 351 16 6 1991 31.0000000 50.8377580 + 352 17 6 1991 33.0000000 56.4640102 + 353 18 6 1991 31.0000000 55.1377615 + 354 19 6 1991 28.0000000 51.6409787 + 355 20 6 1991 60.0000000 76.5332372 + 356 21 6 1991 48.0000000 83.1075553 + 357 22 6 1991 54.0000000 58.8927676 + 358 23 6 1991 63.0000000 65.3069031 + 359 24 6 1991 41.0000000 60.9305823 + 360 25 6 1991 42.0000000 55.9645745 + 361 26 6 1991 43.0000000 54.3639325 + 362 27 6 1991 38.0000000 60.1580561 + 363 28 6 1991 38.0000000 63.2700309 + 364 29 6 1991 35.0000000 57.0238897 + 365 30 6 1991 41.0000000 53.8677042 diff --git a/check/case_08/output_save/dds_results.out b/check/case_08/output_save/dds_results.out new file mode 100755 index 00000000..677e5469 --- /dev/null +++ b/check/case_08/output_save/dds_results.out @@ -0,0 +1,13 @@ + # settings :: general + # nIterations iseed + 6 1235876 + # settings :: dds specific + # dds_r + 0.200000000000000 + # iter bestf (bestx(j),j=1,nopt) + 0 0.107966144825066 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 1500.00000000000 1500.00000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 + 1 0.107966144825066 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 1500.00000000000 1500.00000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 + 2 0.107966144825066 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 1500.00000000000 1500.00000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 + 3 0.107966144825066 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 1500.00000000000 1500.00000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 + 4 0.107966144825066 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 1500.00000000000 1500.00000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 + 5 0.107966144825066 0.150000000000000 1.00000000000000 1.50000000000000 0.500000000000000 0.500000000000000 0.500000000000000 3.00000000000000 3.50000000000000 4.00000000000000 3.40000000000000 0.100000000000000 0.600000000000000 0.760000000000000 9.000000000000000E-004 -0.264000000000000 0.890000000000000 -1.000000000000000E-003 -0.324000000000000 -0.585000000000000 1.250000000000000E-002 6.300000000000000E-003 60.9600000000000 0.970000000000000 0.930000000000000 2.000000000000000E-002 1.75000000000000 0.500000000000000 0.900000000000000 0.100000000000000 180.000000000000 85.0000000000000 7.00000000000000 1.50000000000000 15.0000000000000 0.125000000000000 35.0000000000000 -1.00000000000000 1.00000000000000 0.325000000000000 7.500000000000000E-002 2.00000000000000 0.100000000000000 0.300000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 100.000000000000 1500.00000000000 1500.00000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 diff --git a/check/case_08/simulation_mhm_case08.ini b/check/case_08/simulation_mhm_case08.ini new file mode 100644 index 00000000..51bc251b --- /dev/null +++ b/check/case_08/simulation_mhm_case08.ini @@ -0,0 +1,26 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_08 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig__resolution_hydrology = 12000 +nml__mainconfig_mhm_mrm__optimize = True +nml__mainconfig_mhm_mrm__opti_method = 1 +nml__mainconfig_mhm_mrm__opti_function = 17 +nml__mainconfig_mhm_mrm__resolution_Routing = 12000 +nml__optimization__niterations = 6 +nml__directories_mhm__time_step_model_inputs = 0 +nml__optional_data__dir_neutrons = ../../test_basin/input/optional_data/ +nml__processselection__processcase(10) = 1 +nml__directories_general__file_latlon(1) = ../../test_basin/input/latlon/latlon_2.nc + diff --git a/check/case_09/mhm.nml b/check/case_09/mhm.nml index 3ffb3791..724aae00 100644 --- a/check/case_09/mhm.nml +++ b/check/case_09/mhm.nml @@ -1,583 +1,141 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 + +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = 0 / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' +/ -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -! general directories used by mRM and mHM -&directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/b1_" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/b1_" -!> directory where output should be written -dir_Out(1) = "output_b1/b1_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" -! -!**** for Basin 2 -!> directory where morphological files are located -dir_Morpho(2) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(2) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "restart/b2_" -!> directory where restart output should be written -dir_RestartOut(2) = "output_b1/b2_" -!> directory where output should be written -dir_Out(2) = "output_b1/b2_" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(2) = "../../test_basin/input/latlon/latlon_1.nc" +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 +/ -&directories_mHM -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" -! -!**** for Basin 2 -!> directory where meteorological input is located -dir_Precipitation(2) = "../../test_basin/input/meteo/pre/" -dir_Temperature(2) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(2) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(2) = "../../test_basin/input/meteo/" -dir_MaxTemperature(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(2) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(2) = "../../test_basin/input/meteo/" -dir_windspeed(2) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "../../test_basin/input/lai/" +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&lcover_mpr + fracsealed_cityarea = 0.6 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. &mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 2 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -resolution_Hydrology(2) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -resolution_Routing(2) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .False. -write_restart = .True. -perform_mpr = .True. + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -warming_Days(2) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1993 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1994 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1995 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1996 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' -/ -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soilmoisture -!> 1 - multi-layer infiltration capacity approach, Brooks-Corey like -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = 1 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -!> 2 - Muskingum approach, adaptive timestep -processCase(8) = 2 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 2 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" -! -!> basin 2 -!> number of gauges for subbasin (2) -NoGauges_basin(2) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(2,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(2,1) = "00398.txt" -! -!> basin 3 -!> number of gauges for subbasin (2) -NoGauges_basin(3) = 1 -!> id of gauge(1) for subbasin(2) --> (2,1) -Gauge_id(3,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(2) --> (2,1) -Gauge_filename(3,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" +&processselection + processcase(1:10) = 1, 1, 1, 1, 1, 1, 1, 2, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_09/output_save/ConfigFile.log b/check/case_09/output_save/ConfigFile.log index 1ba422a1..474c9d90 100644 --- a/check/case_09/output_save/ConfigFile.log +++ b/check/case_09/output_save/ConfigFile.log @@ -1,22 +1,23 @@ -------------------------------------------------------------------------------- - mHM-UFZ v-5.6 + mHM-UFZ v-5.8 L. Samaniego & R. Kumar, UFZ -------------------------------------------------------------------------------- M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N -Number of basins 2 -Total No. of nodes 68 -Total No. of reaches 67 -No. of cells L0 46545 -No. of cells L1 68 -No. of cells L11 68 -Total No. of gauges 2 +Number of basins 1 +Total No. of gauges 1 Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 1 Basin 1 Hydrology Resolution [m] 24000. Basin 1 Routing Resolution [m] 24000. -Basin 2 Hydrology Resolution [m] 24000. -Basin 2 Routing Resolution [m] 24000. Flag READ restart F Flag WRITE restart T @@ -25,42 +26,15 @@ Flag WRITE restart T ------------------------------------------------------------- From To Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - -------------------------------------------------------------- - Model Run Periods for Basin 2 -------------------------------------------------------------- - From To - Day Month Year Day Month Year -Warming Period (1) 6 1 1989 31 12 1989 -Evaluation Period (2) 1 1 1990 31 12 1993 -Simulation Period (1)+(2) 6 1 1989 31 12 1993 - - --------------------------------------------------- - Land Cover Observations for Basin 3 --------------------------------------------------- - Year Land cover scene Land Cover File - - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 1 lc_1990.asc - 1992 1 lc_1990.asc - 1993 1 lc_1990.asc +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 -------------------------------------------------- - Land Cover Observations for Basin 6 + Land Cover Observations for Basin 2 -------------------------------------------------- - Year Land cover scene Land Cover File + Start Yea End Year Land cover scene Land Cover File - 1989 1 lc_1990.asc - 1990 1 lc_1990.asc - 1991 1 lc_1990.asc - 1992 1 lc_1990.asc - 1993 1 lc_1990.asc + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc ------------------------------------------------------- Initial Transfer Function Parameter Ranges (gammas) @@ -121,8 +95,7 @@ Simulation Period (1)+(2) 6 1 1989 31 12 1993 Basin Runoff Data -------------------------------------------------- Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] - 1 1 1600.000 11.000 - 2 2 1600.000 11.000 + 1 1 932.000 16.000 -------------------------------------------------------------------------------- Basin-wise Configuration @@ -191,40 +164,40 @@ River Network (Routing level) Cell Routing Id Node Id -------------------- - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - 16 16 - 17 17 - 18 18 - 19 19 - 20 20 - 21 21 - 22 22 - 23 23 - 24 24 - 25 25 - 26 26 - 27 27 - 28 28 - 29 29 - 30 30 - 31 31 - 32 32 - 33 33 - 34 34 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 ------------------------------ Modeling Routing Effective @@ -268,145 +241,4 @@ River Network (Routing level) ------------------------------ Total[km2] 11636.250 - --------------------------------------------------------------------------------- - Directory list --------------------------------------------------------------------------------- -Directory to morphological input ../../test_basin/input/morph/ -Directory to land cover input ../../test_basin/input/luse/ -Directory to gauging station input ../../test_basin/input/gauge/ -Directory to precipitation input ../../test_basin/input/meteo/pre/ -Directory to temperature input ../../test_basin/input/meteo/tavg/ -Directory to reference ET input ../../test_basin/input/meteo/pet/ -Directory to write output by default output_b1/b2_ -Directory to write output when restarted output_b1/b2_ - ------------------------------- -River Network (Routing level) ------------------------------- - Label 0 = intermediate draining cell - Label 1 = headwater cell - Label 2 = sink cell - --------------------------------------------------- - Overall From To Routing Label - Link Routing Routing Sequence - Id Node Node --------------------------------------------------- - 35 1 5 1 1 - 40 7 3 2 1 - 43 10 9 3 1 - 44 11 8 4 1 - 48 15 14 5 1 - 53 20 19 6 1 - 54 21 16 7 1 - 58 25 24 8 1 - 63 30 26 9 1 - 66 33 29 10 1 - 67 34 32 11 1 - 36 3 4 12 0 - 41 8 4 13 0 - 47 14 13 14 0 - 49 16 17 15 0 - 52 19 18 16 0 - 59 26 22 17 0 - 62 29 28 18 0 - 65 32 31 19 0 - 37 4 5 20 0 - 46 13 12 21 0 - 51 18 17 22 0 - 61 28 24 23 0 - 64 31 27 24 0 - 57 24 23 25 0 - 60 27 23 26 0 - 56 23 22 27 0 - 55 22 17 28 0 - 50 17 12 29 0 - 45 12 9 30 0 - 42 9 5 31 0 - 38 5 6 32 0 - 39 6 2 33 2 - --------------------- - Overall Basin - Cell Routing - Id Node Id --------------------- - 35 1 - 36 2 - 37 3 - 38 4 - 39 5 - 40 6 - 41 7 - 42 8 - 43 9 - 44 10 - 45 11 - 46 12 - 47 13 - 48 14 - 49 15 - 50 16 - 51 17 - 52 18 - 53 19 - 54 20 - 55 21 - 56 22 - 57 23 - 58 24 - 59 25 - 60 26 - 61 27 - 62 28 - 63 29 - 64 30 - 65 31 - 66 32 - 67 33 - 68 34 - ------------------------------- - Modeling Routing Effective - Cell Cell Id Area - Id [-] [km2] ------------------------------- - 35 1 126.750 - 36 2 229.750 - 37 3 107.750 - 38 4 312.500 - 39 5 573.750 - 40 6 314.250 - 41 7 42.500 - 42 8 524.750 - 43 9 576.000 - 44 10 146.500 - 45 11 470.000 - 46 12 576.000 - 47 13 414.500 - 48 14 340.750 - 49 15 9.000 - 50 16 230.250 - 51 17 576.000 - 52 18 576.000 - 53 19 527.250 - 54 20 48.250 - 55 21 10.500 - 56 22 545.000 - 57 23 576.000 - 58 24 576.000 - 59 25 318.500 - 60 26 456.250 - 61 27 551.250 - 62 28 576.000 - 63 29 337.000 - 64 30 3.250 - 65 31 198.000 - 66 32 555.250 - 67 33 89.000 - 68 34 121.750 ------------------------------- - Total[km2] 11636.250 - - + diff --git a/check/case_09/output_save/b1_daily_discharge.out b/check/case_09/output_save/b1_daily_discharge.out index a74d7144..23c0a466 100644 --- a/check/case_09/output_save/b1_daily_discharge.out +++ b/check/case_09/output_save/b1_daily_discharge.out @@ -1,1462 +1,366 @@ No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 136.0144094 - 2 2 1 1990 129.0000000 125.3951075 - 3 3 1 1990 117.0000000 117.0044147 - 4 4 1 1990 111.0000000 109.6889657 - 5 5 1 1990 112.0000000 103.1919915 - 6 6 1 1990 93.0000000 97.4073814 - 7 7 1 1990 87.0000000 92.2859581 - 8 8 1 1990 84.0000000 87.6942785 - 9 9 1 1990 80.0000000 83.5222318 - 10 10 1 1990 78.0000000 79.7497446 - 11 11 1 1990 78.0000000 76.3356889 - 12 12 1 1990 77.0000000 73.2411694 - 13 13 1 1990 76.0000000 71.3933349 - 14 14 1 1990 73.0000000 72.0944151 - 15 15 1 1990 66.0000000 75.7822899 - 16 16 1 1990 76.0000000 79.0498860 - 17 17 1 1990 73.0000000 76.9433291 - 18 18 1 1990 71.0000000 78.0803124 - 19 19 1 1990 90.0000000 79.1191596 - 20 20 1 1990 82.0000000 79.1718542 - 21 21 1 1990 80.0000000 78.3223779 - 22 22 1 1990 81.0000000 74.8637164 - 23 23 1 1990 97.0000000 116.6877589 - 24 24 1 1990 198.0000000 181.2524600 - 25 25 1 1990 392.0000000 220.1118284 - 26 26 1 1990 519.0000000 266.5670801 - 27 27 1 1990 565.0000000 257.6709821 - 28 28 1 1990 331.0000000 229.6466057 - 29 29 1 1990 293.0000000 212.4752120 - 30 30 1 1990 302.0000000 203.2978974 - 31 31 1 1990 233.0000000 181.4961643 - 32 1 2 1990 198.0000000 168.9303682 - 33 2 2 1990 183.0000000 173.4183109 - 34 3 2 1990 206.0000000 180.5645762 - 35 4 2 1990 215.0000000 180.0493102 - 36 5 2 1990 183.0000000 163.4587660 - 37 6 2 1990 159.0000000 146.8741156 - 38 7 2 1990 167.0000000 134.2611475 - 39 8 2 1990 138.0000000 125.5879618 - 40 9 2 1990 126.0000000 122.9409927 - 41 10 2 1990 131.0000000 151.6981970 - 42 11 2 1990 173.0000000 219.5736298 - 43 12 2 1990 240.0000000 254.0941886 - 44 13 2 1990 270.0000000 320.7419492 - 45 14 2 1990 458.0000000 531.6067624 - 46 15 2 1990 996.0000000 859.3431665 - 47 16 2 1990 1370.0000000 1000.9095769 - 48 17 2 1990 1540.0000000 916.3369078 - 49 18 2 1990 1210.0000000 768.6516674 - 50 19 2 1990 616.0000000 633.2533826 - 51 20 2 1990 465.0000000 520.8552814 - 52 21 2 1990 373.0000000 429.4956422 - 53 22 2 1990 298.0000000 356.5167251 - 54 23 2 1990 270.0000000 299.9020167 - 55 24 2 1990 234.0000000 256.5345669 - 56 25 2 1990 218.0000000 227.2900686 - 57 26 2 1990 203.0000000 254.1536177 - 58 27 2 1990 314.0000000 373.4415736 - 59 28 2 1990 520.0000000 556.6362804 - 60 1 3 1990 689.0000000 736.9099132 - 61 2 3 1990 777.0000000 775.8742956 - 62 3 3 1990 584.0000000 683.2249674 - 63 4 3 1990 429.0000000 567.3394043 - 64 5 3 1990 365.0000000 469.0439364 - 65 6 3 1990 281.0000000 390.8799929 - 66 7 3 1990 257.0000000 327.9877167 - 67 8 3 1990 231.0000000 278.9790596 - 68 9 3 1990 211.0000000 242.7938131 - 69 10 3 1990 191.0000000 215.8381999 - 70 11 3 1990 182.0000000 195.2024017 - 71 12 3 1990 173.0000000 180.0276231 - 72 13 3 1990 159.0000000 169.2274303 - 73 14 3 1990 153.0000000 161.0600076 - 74 15 3 1990 141.0000000 154.8194491 - 75 16 3 1990 136.0000000 148.7549550 - 76 17 3 1990 130.0000000 142.4568576 - 77 18 3 1990 123.0000000 136.6711172 - 78 19 3 1990 115.0000000 131.4714723 - 79 20 3 1990 113.0000000 126.9672581 - 80 21 3 1990 102.0000000 123.3058715 - 81 22 3 1990 105.0000000 120.1390997 - 82 23 3 1990 106.0000000 117.1151445 - 83 24 3 1990 87.0000000 114.1029129 - 84 25 3 1990 80.0000000 111.3039010 - 85 26 3 1990 84.0000000 109.0886638 - 86 27 3 1990 82.0000000 106.5320646 - 87 28 3 1990 91.0000000 105.3997249 - 88 29 3 1990 97.0000000 112.9243716 - 89 30 3 1990 110.0000000 115.1077960 - 90 31 3 1990 97.0000000 110.7706783 - 91 1 4 1990 93.0000000 106.9504191 - 92 2 4 1990 85.0000000 103.9435753 - 93 3 4 1990 84.0000000 103.2243641 - 94 4 4 1990 81.0000000 107.2409696 - 95 5 4 1990 81.0000000 106.9400603 - 96 6 4 1990 76.0000000 103.0731871 - 97 7 4 1990 72.0000000 100.6666710 - 98 8 4 1990 68.0000000 98.3359962 - 99 9 4 1990 72.0000000 95.8851554 - 100 10 4 1990 65.0000000 93.7012467 - 101 11 4 1990 62.0000000 91.7886746 - 102 12 4 1990 62.0000000 90.7942820 - 103 13 4 1990 65.0000000 92.1827551 - 104 14 4 1990 68.0000000 103.4407981 - 105 15 4 1990 75.0000000 118.5302741 - 106 16 4 1990 90.0000000 117.5218478 - 107 17 4 1990 92.0000000 116.2639769 - 108 18 4 1990 94.0000000 114.5440902 - 109 19 4 1990 110.0000000 113.4695190 - 110 20 4 1990 99.0000000 109.3122629 - 111 21 4 1990 86.0000000 105.3444225 - 112 22 4 1990 86.0000000 105.8399025 - 113 23 4 1990 86.0000000 107.6784625 - 114 24 4 1990 88.0000000 108.1671325 - 115 25 4 1990 93.0000000 107.1837027 - 116 26 4 1990 99.0000000 103.2047273 - 117 27 4 1990 86.0000000 99.5835863 - 118 28 4 1990 74.0000000 96.9751541 - 119 29 4 1990 72.0000000 94.5370108 - 120 30 4 1990 77.0000000 91.9976800 - 121 1 5 1990 56.0000000 89.6123682 - 122 2 5 1990 64.0000000 87.4078955 - 123 3 5 1990 58.0000000 85.3581769 - 124 4 5 1990 50.0000000 83.4461149 - 125 5 5 1990 50.0000000 81.6576663 - 126 6 5 1990 50.0000000 79.9804679 - 127 7 5 1990 50.0000000 78.4052640 - 128 8 5 1990 53.0000000 77.0173127 - 129 9 5 1990 62.0000000 76.4448131 - 130 10 5 1990 64.0000000 78.4607241 - 131 11 5 1990 65.0000000 79.4192939 - 132 12 5 1990 75.0000000 77.3993821 - 133 13 5 1990 71.0000000 74.6348477 - 134 14 5 1990 63.0000000 72.9099013 - 135 15 5 1990 61.0000000 71.7142243 - 136 16 5 1990 49.0000000 70.8556044 - 137 17 5 1990 46.0000000 69.6978634 - 138 18 5 1990 46.0000000 68.4822661 - 139 19 5 1990 48.0000000 67.3676946 - 140 20 5 1990 41.0000000 66.3220799 - 141 21 5 1990 45.0000000 66.4630756 - 142 22 5 1990 52.0000000 70.7533988 - 143 23 5 1990 50.0000000 70.2919776 - 144 24 5 1990 56.0000000 72.4550469 - 145 25 5 1990 41.0000000 71.9245609 - 146 26 5 1990 40.0000000 69.6520521 - 147 27 5 1990 39.0000000 66.2428477 - 148 28 5 1990 39.0000000 64.5374943 - 149 29 5 1990 33.0000000 63.3518563 - 150 30 5 1990 37.0000000 62.2614449 - 151 31 5 1990 30.0000000 61.2282467 - 152 1 6 1990 37.0000000 66.8813735 - 153 2 6 1990 36.0000000 71.0226926 - 154 3 6 1990 40.0000000 80.0214259 - 155 4 6 1990 45.0000000 85.2955081 - 156 5 6 1990 39.0000000 72.2061811 - 157 6 6 1990 48.0000000 66.0954061 - 158 7 6 1990 39.0000000 77.2628924 - 159 8 6 1990 49.0000000 103.5556734 - 160 9 6 1990 84.0000000 103.3592074 - 161 10 6 1990 91.0000000 90.4214100 - 162 11 6 1990 80.0000000 83.9208672 - 163 12 6 1990 66.0000000 79.3224422 - 164 13 6 1990 53.0000000 76.0230686 - 165 14 6 1990 64.0000000 73.4751801 - 166 15 6 1990 55.0000000 71.1435084 - 167 16 6 1990 54.0000000 68.9891788 - 168 17 6 1990 42.0000000 67.0197524 - 169 18 6 1990 48.0000000 65.2114333 - 170 19 6 1990 48.0000000 68.8400535 - 171 20 6 1990 60.0000000 84.0581038 - 172 21 6 1990 75.0000000 88.4991629 - 173 22 6 1990 78.0000000 82.2946952 - 174 23 6 1990 66.0000000 76.1378128 - 175 24 6 1990 63.0000000 71.2803847 - 176 25 6 1990 52.0000000 68.5182768 - 177 26 6 1990 49.0000000 66.4517236 - 178 27 6 1990 44.0000000 67.8510209 - 179 28 6 1990 51.0000000 68.7975762 - 180 29 6 1990 61.0000000 77.0187192 - 181 30 6 1990 81.0000000 104.3313563 - 182 1 7 1990 79.0000000 108.5468902 - 183 2 7 1990 92.0000000 88.5792307 - 184 3 7 1990 72.0000000 80.7983723 - 185 4 7 1990 58.0000000 85.2392148 - 186 5 7 1990 69.0000000 106.1923670 - 187 6 7 1990 94.0000000 111.1422555 - 188 7 7 1990 199.0000000 104.3009250 - 189 8 7 1990 133.0000000 103.7555315 - 190 9 7 1990 124.0000000 97.8639425 - 191 10 7 1990 123.0000000 90.4968194 - 192 11 7 1990 99.0000000 85.6469653 - 193 12 7 1990 88.0000000 81.8800207 - 194 13 7 1990 84.0000000 78.5231169 - 195 14 7 1990 72.0000000 75.4823953 - 196 15 7 1990 55.0000000 72.7184442 - 197 16 7 1990 65.0000000 70.1986989 - 198 17 7 1990 50.0000000 67.8949616 - 199 18 7 1990 50.0000000 65.7827220 - 200 19 7 1990 46.0000000 63.8406190 - 201 20 7 1990 44.0000000 62.0499907 - 202 21 7 1990 42.0000000 60.3944950 - 203 22 7 1990 37.0000000 58.8597889 - 204 23 7 1990 38.0000000 57.4332580 - 205 24 7 1990 44.0000000 56.1037846 - 206 25 7 1990 30.0000000 54.8615520 - 207 26 7 1990 26.0000000 53.6978753 - 208 27 7 1990 31.0000000 52.6050581 - 209 28 7 1990 33.0000000 54.4511076 - 210 29 7 1990 42.0000000 53.6686176 - 211 30 7 1990 36.0000000 50.3116811 - 212 31 7 1990 34.0000000 49.2754760 - 213 1 8 1990 25.0000000 48.4103285 - 214 2 8 1990 22.0000000 47.5901609 - 215 3 8 1990 28.0000000 46.8092669 - 216 4 8 1990 25.0000000 46.0641918 - 217 5 8 1990 19.0000000 45.3518549 - 218 6 8 1990 22.0000000 44.6695945 - 219 7 8 1990 19.0000000 44.0151662 - 220 8 8 1990 22.0000000 43.3858215 - 221 9 8 1990 19.0000000 42.7794307 - 222 10 8 1990 20.0000000 42.1944056 - 223 11 8 1990 19.0000000 41.6291528 - 224 12 8 1990 19.0000000 41.0821909 - 225 13 8 1990 22.0000000 42.3021320 - 226 14 8 1990 36.0000000 54.2618839 - 227 15 8 1990 31.0000000 63.9541498 - 228 16 8 1990 30.0000000 55.9714852 - 229 17 8 1990 28.0000000 48.6113516 - 230 18 8 1990 34.0000000 44.7930100 - 231 19 8 1990 21.0000000 41.8954994 - 232 20 8 1990 30.0000000 40.7483819 - 233 21 8 1990 22.0000000 40.0421389 - 234 22 8 1990 21.0000000 39.3972825 - 235 23 8 1990 23.0000000 38.7828495 - 236 24 8 1990 20.0000000 38.1952438 - 237 25 8 1990 29.0000000 37.6329576 - 238 26 8 1990 20.0000000 37.1215998 - 239 27 8 1990 22.0000000 36.9886622 - 240 28 8 1990 23.0000000 37.4390158 - 241 29 8 1990 35.0000000 36.8077400 - 242 30 8 1990 51.0000000 68.6168863 - 243 31 8 1990 80.0000000 122.4655355 - 244 1 9 1990 56.0000000 87.6819160 - 245 2 9 1990 33.0000000 56.5194389 - 246 3 9 1990 27.0000000 50.3820597 - 247 4 9 1990 27.0000000 48.4741006 - 248 5 9 1990 28.0000000 49.8195634 - 249 6 9 1990 26.0000000 49.8843522 - 250 7 9 1990 24.0000000 47.5393707 - 251 8 9 1990 33.0000000 46.8486741 - 252 9 9 1990 26.0000000 43.9843675 - 253 10 9 1990 27.0000000 42.2941225 - 254 11 9 1990 22.0000000 41.0803819 - 255 12 9 1990 22.0000000 39.9994074 - 256 13 9 1990 21.0000000 38.9997145 - 257 14 9 1990 22.0000000 38.0706135 - 258 15 9 1990 22.0000000 37.2046850 - 259 16 9 1990 22.0000000 36.3954523 - 260 17 9 1990 20.0000000 35.6371983 - 261 18 9 1990 22.0000000 34.9248660 - 262 19 9 1990 16.0000000 34.2539748 - 263 20 9 1990 22.0000000 33.6205483 - 264 21 9 1990 19.0000000 35.0314976 - 265 22 9 1990 32.0000000 63.4775559 - 266 23 9 1990 27.0000000 89.5197881 - 267 24 9 1990 45.0000000 78.5166869 - 268 25 9 1990 42.0000000 59.7995176 - 269 26 9 1990 39.0000000 48.6236176 - 270 27 9 1990 30.0000000 45.7059913 - 271 28 9 1990 28.0000000 43.9870384 - 272 29 9 1990 30.0000000 42.4708053 - 273 30 9 1990 30.0000000 55.4791653 - 274 1 10 1990 56.0000000 101.4770743 - 275 2 10 1990 72.0000000 121.4542268 - 276 3 10 1990 73.0000000 108.8091758 - 277 4 10 1990 68.0000000 105.3749960 - 278 5 10 1990 53.0000000 92.4780639 - 279 6 10 1990 42.0000000 84.4559737 - 280 7 10 1990 33.0000000 78.1273789 - 281 8 10 1990 42.0000000 73.2712461 - 282 9 10 1990 34.0000000 69.2050893 - 283 10 10 1990 36.0000000 65.5875191 - 284 11 10 1990 36.0000000 62.3358753 - 285 12 10 1990 28.0000000 59.4060422 - 286 13 10 1990 32.0000000 56.7597398 - 287 14 10 1990 27.0000000 54.3631423 - 288 15 10 1990 35.0000000 52.2990290 - 289 16 10 1990 42.0000000 51.9180471 - 290 17 10 1990 35.0000000 52.7703280 - 291 18 10 1990 39.0000000 58.0477404 - 292 19 10 1990 34.0000000 56.6095499 - 293 20 10 1990 32.0000000 51.2564977 - 294 21 10 1990 34.0000000 48.6373962 - 295 22 10 1990 27.0000000 46.8960955 - 296 23 10 1990 31.0000000 45.3500292 - 297 24 10 1990 28.0000000 43.9311949 - 298 25 10 1990 25.0000000 42.8769814 - 299 26 10 1990 29.0000000 48.8756649 - 300 27 10 1990 31.0000000 63.6414311 - 301 28 10 1990 65.0000000 124.9670753 - 302 29 10 1990 69.0000000 191.1031806 - 303 30 10 1990 157.0000000 186.9910169 - 304 31 10 1990 190.0000000 164.8771132 - 305 1 11 1990 115.0000000 151.5199262 - 306 2 11 1990 104.0000000 150.2302981 - 307 3 11 1990 100.0000000 153.5154254 - 308 4 11 1990 131.0000000 159.3067584 - 309 5 11 1990 130.0000000 160.4103280 - 310 6 11 1990 115.0000000 153.2758323 - 311 7 11 1990 102.0000000 138.7292216 - 312 8 11 1990 95.0000000 123.2685115 - 313 9 11 1990 81.0000000 109.6739066 - 314 10 11 1990 66.0000000 105.1825232 - 315 11 11 1990 67.0000000 118.1348563 - 316 12 11 1990 74.0000000 131.7686073 - 317 13 11 1990 109.0000000 142.3746187 - 318 14 11 1990 92.0000000 150.2080649 - 319 15 11 1990 92.0000000 162.0178879 - 320 16 11 1990 155.0000000 168.3282227 - 321 17 11 1990 159.0000000 165.8024054 - 322 18 11 1990 131.0000000 164.5945741 - 323 19 11 1990 161.0000000 172.3158470 - 324 20 11 1990 196.0000000 211.2916319 - 325 21 11 1990 336.0000000 292.6206718 - 326 22 11 1990 566.0000000 321.4917741 - 327 23 11 1990 373.0000000 318.6560986 - 328 24 11 1990 293.0000000 322.1840490 - 329 25 11 1990 264.0000000 311.3484968 - 330 26 11 1990 226.0000000 289.3419240 - 331 27 11 1990 201.0000000 257.1606811 - 332 28 11 1990 180.0000000 223.6869898 - 333 29 11 1990 161.0000000 199.4424867 - 334 30 11 1990 149.0000000 185.3184655 - 335 1 12 1990 134.0000000 167.9741794 - 336 2 12 1990 113.0000000 150.8435173 - 337 3 12 1990 99.0000000 137.0577776 - 338 4 12 1990 107.0000000 127.6384989 - 339 5 12 1990 99.0000000 120.3973574 - 340 6 12 1990 89.0000000 114.0355492 - 341 7 12 1990 77.0000000 108.3401434 - 342 8 12 1990 71.0000000 103.2161078 - 343 9 12 1990 68.0000000 98.6022979 - 344 10 12 1990 73.0000000 94.4367545 - 345 11 12 1990 84.0000000 90.6650105 - 346 12 12 1990 88.0000000 96.5638127 - 347 13 12 1990 92.0000000 110.3594426 - 348 14 12 1990 128.0000000 107.5229768 - 349 15 12 1990 136.0000000 100.4886298 - 350 16 12 1990 114.0000000 95.2570578 - 351 17 12 1990 101.0000000 91.0374423 - 352 18 12 1990 93.0000000 87.2604340 - 353 19 12 1990 85.0000000 83.8512853 - 354 20 12 1990 81.0000000 80.7638048 - 355 21 12 1990 106.0000000 96.0144120 - 356 22 12 1990 159.0000000 130.4529203 - 357 23 12 1990 250.0000000 145.9238022 - 358 24 12 1990 298.0000000 146.5806456 - 359 25 12 1990 261.0000000 156.3742597 - 360 26 12 1990 228.0000000 225.9094782 - 361 27 12 1990 409.0000000 312.6200006 - 362 28 12 1990 486.0000000 367.6407630 - 363 29 12 1990 440.0000000 425.3214210 - 364 30 12 1990 486.0000000 521.3148574 - 365 31 12 1990 774.0000000 603.1279749 - 366 1 1 1991 889.0000000 699.9256509 - 367 2 1 1991 863.0000000 776.7635460 - 368 3 1 1991 875.0000000 846.2140297 - 369 4 1 1991 932.0000000 849.5953464 - 370 5 1 1991 826.0000000 788.5431666 - 371 6 1 1991 731.0000000 739.4964315 - 372 7 1 1991 613.0000000 680.9482615 - 373 8 1 1991 610.0000000 655.3473776 - 374 9 1 1991 686.0000000 633.5310657 - 375 10 1 1991 556.0000000 619.1021749 - 376 11 1 1991 669.0000000 647.7847310 - 377 12 1 1991 828.0000000 636.0621380 - 378 13 1 1991 735.0000000 577.6957795 - 379 14 1 1991 513.0000000 488.4005615 - 380 15 1 1991 411.0000000 405.4134907 - 381 16 1 1991 345.0000000 337.6312257 - 382 17 1 1991 293.0000000 284.2492322 - 383 18 1 1991 251.0000000 245.2438997 - 384 19 1 1991 222.0000000 217.3527033 - 385 20 1 1991 215.0000000 197.4380296 - 386 21 1 1991 213.0000000 184.3628842 - 387 22 1 1991 202.0000000 181.9734620 - 388 23 1 1991 200.0000000 177.7620319 - 389 24 1 1991 192.0000000 169.5053062 - 390 25 1 1991 176.0000000 161.0934122 - 391 26 1 1991 164.0000000 153.4720134 - 392 27 1 1991 157.0000000 146.5195704 - 393 28 1 1991 134.0000000 140.2299767 - 394 29 1 1991 130.0000000 134.5707184 - 395 30 1 1991 119.0000000 129.4627560 - 396 31 1 1991 107.0000000 124.8368142 - 397 1 2 1991 112.0000000 120.6334336 - 398 2 2 1991 109.0000000 116.8014418 - 399 3 2 1991 101.0000000 113.2966717 - 400 4 2 1991 98.0000000 110.0808979 - 401 5 2 1991 84.0000000 107.1209505 - 402 6 2 1991 93.0000000 104.3879755 - 403 7 2 1991 80.0000000 101.8568126 - 404 8 2 1991 73.0000000 99.5054731 - 405 9 2 1991 89.0000000 97.3146981 - 406 10 2 1991 84.0000000 95.2675842 - 407 11 2 1991 78.0000000 93.3492663 - 408 12 2 1991 79.0000000 91.5466460 - 409 13 2 1991 77.0000000 89.8481610 - 410 14 2 1991 80.0000000 88.2435863 - 411 15 2 1991 72.0000000 86.7238646 - 412 16 2 1991 78.0000000 85.6518752 - 413 17 2 1991 74.0000000 86.0677565 - 414 18 2 1991 77.0000000 85.1897080 - 415 19 2 1991 73.0000000 86.5531682 - 416 20 2 1991 69.0000000 98.9122627 - 417 21 2 1991 74.0000000 118.2106299 - 418 22 2 1991 81.0000000 140.9585127 - 419 23 2 1991 110.0000000 147.6475516 - 420 24 2 1991 180.0000000 146.2200222 - 421 25 2 1991 213.0000000 142.5479163 - 422 26 2 1991 222.0000000 139.7941183 - 423 27 2 1991 208.0000000 139.0201215 - 424 28 2 1991 211.0000000 140.2406340 - 425 1 3 1991 214.0000000 135.7946271 - 426 2 3 1991 208.0000000 136.1741964 - 427 3 3 1991 221.0000000 137.8550923 - 428 4 3 1991 281.0000000 134.1754063 - 429 5 3 1991 219.0000000 127.7774893 - 430 6 3 1991 190.0000000 122.2741206 - 431 7 3 1991 173.0000000 117.4911791 - 432 8 3 1991 164.0000000 113.1387346 - 433 9 3 1991 142.0000000 109.4705345 - 434 10 3 1991 133.0000000 106.6443039 - 435 11 3 1991 133.0000000 105.1648787 - 436 12 3 1991 118.0000000 102.9791558 - 437 13 3 1991 127.0000000 99.8567504 - 438 14 3 1991 113.0000000 96.8622331 - 439 15 3 1991 107.0000000 94.1335001 - 440 16 3 1991 100.0000000 91.6205027 - 441 17 3 1991 100.0000000 89.2978355 - 442 18 3 1991 95.0000000 87.1634731 - 443 19 3 1991 98.0000000 108.8190233 - 444 20 3 1991 119.0000000 141.7336670 - 445 21 3 1991 159.0000000 148.9549421 - 446 22 3 1991 196.0000000 162.8695165 - 447 23 3 1991 242.0000000 165.2218242 - 448 24 3 1991 216.0000000 156.0705466 - 449 25 3 1991 180.0000000 145.0335975 - 450 26 3 1991 145.0000000 136.6577002 - 451 27 3 1991 127.0000000 129.7664974 - 452 28 3 1991 117.0000000 123.7838067 - 453 29 3 1991 109.0000000 118.2659205 - 454 30 3 1991 106.0000000 113.1977157 - 455 31 3 1991 99.0000000 108.6234736 - 456 1 4 1991 96.0000000 104.4888292 - 457 2 4 1991 88.0000000 100.7389459 - 458 3 4 1991 87.0000000 97.3270931 - 459 4 4 1991 82.0000000 94.3879984 - 460 5 4 1991 84.0000000 92.0345477 - 461 6 4 1991 67.0000000 89.7135406 - 462 7 4 1991 89.0000000 87.3729958 - 463 8 4 1991 75.0000000 85.2337239 - 464 9 4 1991 79.0000000 83.1492119 - 465 10 4 1991 70.0000000 81.1458869 - 466 11 4 1991 69.0000000 79.2697095 - 467 12 4 1991 69.0000000 77.5192629 - 468 13 4 1991 56.0000000 75.8823731 - 469 14 4 1991 63.0000000 74.3475676 - 470 15 4 1991 58.0000000 72.9054138 - 471 16 4 1991 56.0000000 71.5475179 - 472 17 4 1991 54.0000000 70.2630163 - 473 18 4 1991 57.0000000 69.0630730 - 474 19 4 1991 53.0000000 68.0965496 - 475 20 4 1991 53.0000000 67.4529465 - 476 21 4 1991 65.0000000 66.5851150 - 477 22 4 1991 69.0000000 66.8166336 - 478 23 4 1991 61.0000000 66.2623882 - 479 24 4 1991 56.0000000 65.7997750 - 480 25 4 1991 56.0000000 64.8624702 - 481 26 4 1991 53.0000000 63.5011959 - 482 27 4 1991 49.0000000 62.4546110 - 483 28 4 1991 53.0000000 61.5120202 - 484 29 4 1991 48.0000000 63.1606212 - 485 30 4 1991 57.0000000 77.6419751 - 486 1 5 1991 69.0000000 93.1722464 - 487 2 5 1991 89.0000000 86.5903865 - 488 3 5 1991 105.0000000 75.7625000 - 489 4 5 1991 79.0000000 71.6225321 - 490 5 5 1991 69.0000000 69.5661686 - 491 6 5 1991 71.0000000 67.8781572 - 492 7 5 1991 60.0000000 66.3990009 - 493 8 5 1991 64.0000000 64.9300602 - 494 9 5 1991 59.0000000 63.5044062 - 495 10 5 1991 57.0000000 62.2313823 - 496 11 5 1991 55.0000000 62.5089582 - 497 12 5 1991 53.0000000 63.6239404 - 498 13 5 1991 52.0000000 61.5771098 - 499 14 5 1991 50.0000000 59.8299998 - 500 15 5 1991 52.0000000 59.0111671 - 501 16 5 1991 54.0000000 61.7180214 - 502 17 5 1991 54.0000000 62.8548604 - 503 18 5 1991 55.0000000 59.6414605 - 504 19 5 1991 48.0000000 57.8149545 - 505 20 5 1991 48.0000000 56.7283508 - 506 21 5 1991 49.0000000 55.7539972 - 507 22 5 1991 41.0000000 54.8278508 - 508 23 5 1991 40.0000000 53.9437085 - 509 24 5 1991 40.0000000 53.0980787 - 510 25 5 1991 39.0000000 52.2878542 - 511 26 5 1991 43.0000000 51.5102226 - 512 27 5 1991 39.0000000 50.7626359 - 513 28 5 1991 36.0000000 50.0427836 - 514 29 5 1991 33.0000000 49.3485686 - 515 30 5 1991 39.0000000 48.6780860 - 516 31 5 1991 34.0000000 48.0296042 - 517 1 6 1991 37.0000000 47.4015479 - 518 2 6 1991 35.0000000 46.7924828 - 519 3 6 1991 29.0000000 46.2011020 - 520 4 6 1991 33.0000000 45.6262141 - 521 5 6 1991 34.0000000 45.0673575 - 522 6 6 1991 32.0000000 52.6868769 - 523 7 6 1991 38.0000000 58.0606411 - 524 8 6 1991 39.0000000 51.5779958 - 525 9 6 1991 41.0000000 48.7774550 - 526 10 6 1991 44.0000000 52.2410579 - 527 11 6 1991 48.0000000 51.7182553 - 528 12 6 1991 42.0000000 46.4890368 - 529 13 6 1991 37.0000000 44.9387419 - 530 14 6 1991 39.0000000 44.1898183 - 531 15 6 1991 35.0000000 43.5279178 - 532 16 6 1991 31.0000000 43.4128193 - 533 17 6 1991 33.0000000 45.7620620 - 534 18 6 1991 31.0000000 47.6329227 - 535 19 6 1991 28.0000000 45.5246324 - 536 20 6 1991 60.0000000 55.6771342 - 537 21 6 1991 48.0000000 69.2325179 - 538 22 6 1991 54.0000000 54.7604236 - 539 23 6 1991 63.0000000 54.1331276 - 540 24 6 1991 41.0000000 53.9892721 - 541 25 6 1991 42.0000000 47.4020410 - 542 26 6 1991 43.0000000 45.6419334 - 543 27 6 1991 38.0000000 48.1099553 - 544 28 6 1991 38.0000000 50.5198591 - 545 29 6 1991 35.0000000 48.9995657 - 546 30 6 1991 41.0000000 46.0470121 - 547 1 7 1991 41.0000000 43.9970551 - 548 2 7 1991 38.0000000 42.8460233 - 549 3 7 1991 34.0000000 41.9576924 - 550 4 7 1991 27.0000000 41.1375121 - 551 5 7 1991 31.0000000 40.3639244 - 552 6 7 1991 30.0000000 39.6320596 - 553 7 7 1991 26.0000000 41.4185259 - 554 8 7 1991 30.0000000 46.2018821 - 555 9 7 1991 31.0000000 41.8604380 - 556 10 7 1991 23.0000000 38.8613434 - 557 11 7 1991 35.0000000 37.8837873 - 558 12 7 1991 19.0000000 37.2610357 - 559 13 7 1991 24.0000000 47.4695679 - 560 14 7 1991 26.0000000 61.3131854 - 561 15 7 1991 27.0000000 51.1678505 - 562 16 7 1991 41.0000000 42.6800657 - 563 17 7 1991 34.0000000 39.7538837 - 564 18 7 1991 27.0000000 38.5838100 - 565 19 7 1991 25.0000000 37.7610527 - 566 20 7 1991 23.0000000 37.0072781 - 567 21 7 1991 22.0000000 36.2972461 - 568 22 7 1991 27.0000000 35.6262332 - 569 23 7 1991 23.0000000 34.9906345 - 570 24 7 1991 21.0000000 34.4893501 - 571 25 7 1991 23.0000000 42.7959275 - 572 26 7 1991 33.0000000 50.1964887 - 573 27 7 1991 23.0000000 43.9684747 - 574 28 7 1991 29.0000000 37.5267105 - 575 29 7 1991 30.0000000 35.2752550 - 576 30 7 1991 35.0000000 39.6966385 - 577 31 7 1991 27.0000000 45.7447587 - 578 1 8 1991 45.0000000 43.6701892 - 579 2 8 1991 47.0000000 37.2528994 - 580 3 8 1991 40.0000000 35.0508695 - 581 4 8 1991 35.0000000 34.2104481 - 582 5 8 1991 26.0000000 33.5169215 - 583 6 8 1991 23.0000000 32.8667823 - 584 7 8 1991 30.0000000 35.4676000 - 585 8 8 1991 33.0000000 36.6782819 - 586 9 8 1991 30.0000000 33.1001148 - 587 10 8 1991 28.0000000 31.2630572 - 588 11 8 1991 19.0000000 30.6621334 - 589 12 8 1991 20.0000000 30.1411964 - 590 13 8 1991 16.0000000 29.6459033 - 591 14 8 1991 18.0000000 29.1732092 - 592 15 8 1991 18.0000000 28.7211788 - 593 16 8 1991 20.0000000 28.2880821 - 594 17 8 1991 16.0000000 27.8723631 - 595 18 8 1991 15.0000000 27.4726201 - 596 19 8 1991 15.0000000 27.0875893 - 597 20 8 1991 14.0000000 26.7161298 - 598 21 8 1991 15.0000000 26.3572101 - 599 22 8 1991 13.0000000 26.0100082 - 600 23 8 1991 12.0000000 25.6919933 - 601 24 8 1991 11.0000000 25.6031526 - 602 25 8 1991 12.0000000 25.2647223 - 603 26 8 1991 11.0000000 24.7978738 - 604 27 8 1991 13.0000000 24.4573647 - 605 28 8 1991 11.0000000 24.1592344 - 606 29 8 1991 12.0000000 23.8716469 - 607 30 8 1991 12.0000000 23.5909909 - 608 31 8 1991 11.0000000 23.3167151 - 609 1 9 1991 11.0000000 23.2730730 - 610 2 9 1991 17.0000000 25.2879062 - 611 3 9 1991 11.0000000 24.9214298 - 612 4 9 1991 12.0000000 22.8743332 - 613 5 9 1991 11.0000000 22.2549679 - 614 6 9 1991 11.0000000 21.9763848 - 615 7 9 1991 18.0000000 21.7259043 - 616 8 9 1991 11.0000000 21.4812597 - 617 9 9 1991 13.0000000 21.2414210 - 618 10 9 1991 12.0000000 21.0480514 - 619 11 9 1991 11.0000000 26.8240071 - 620 12 9 1991 20.0000000 49.4995229 - 621 13 9 1991 21.0000000 39.7327227 - 622 14 9 1991 29.0000000 25.6218118 - 623 15 9 1991 28.0000000 22.7209618 - 624 16 9 1991 20.0000000 22.1755684 - 625 17 9 1991 20.0000000 21.8032502 - 626 18 9 1991 20.0000000 21.4532059 - 627 19 9 1991 12.0000000 21.1189499 - 628 20 9 1991 11.0000000 20.7990242 - 629 21 9 1991 11.0000000 20.4922142 - 630 22 9 1991 22.0000000 22.9057136 - 631 23 9 1991 14.0000000 39.8809656 - 632 24 9 1991 48.0000000 36.7292457 - 633 25 9 1991 45.0000000 48.0448883 - 634 26 9 1991 80.0000000 76.4957278 - 635 27 9 1991 61.0000000 67.2930139 - 636 28 9 1991 61.0000000 75.0493709 - 637 29 9 1991 65.0000000 83.5729735 - 638 30 9 1991 63.0000000 77.8287751 - 639 1 10 1991 90.0000000 68.5348684 - 640 2 10 1991 59.0000000 57.2965990 - 641 3 10 1991 45.0000000 52.2027609 - 642 4 10 1991 42.0000000 48.8614124 - 643 5 10 1991 41.0000000 60.0177255 - 644 6 10 1991 41.0000000 90.2681193 - 645 7 10 1991 73.0000000 83.5320820 - 646 8 10 1991 96.0000000 67.0342306 - 647 9 10 1991 61.0000000 59.9526104 - 648 10 10 1991 44.0000000 55.8929058 - 649 11 10 1991 42.0000000 52.5332021 - 650 12 10 1991 41.0000000 56.2852833 - 651 13 10 1991 42.0000000 67.5067355 - 652 14 10 1991 61.0000000 65.2506417 - 653 15 10 1991 55.0000000 55.9361109 - 654 16 10 1991 41.0000000 53.8913430 - 655 17 10 1991 48.0000000 58.6148960 - 656 18 10 1991 52.0000000 74.0076869 - 657 19 10 1991 66.0000000 82.3442286 - 658 20 10 1991 59.0000000 69.5240174 - 659 21 10 1991 71.0000000 63.3972589 - 660 22 10 1991 74.0000000 59.4817709 - 661 23 10 1991 70.0000000 55.6849602 - 662 24 10 1991 59.0000000 52.5750599 - 663 25 10 1991 57.0000000 49.9170307 - 664 26 10 1991 57.0000000 47.5570128 - 665 27 10 1991 51.0000000 45.4272194 - 666 28 10 1991 47.0000000 43.4955359 - 667 29 10 1991 48.0000000 41.7390187 - 668 30 10 1991 45.0000000 40.7361179 - 669 31 10 1991 43.0000000 44.4967674 - 670 1 11 1991 40.0000000 51.7441420 - 671 2 11 1991 47.0000000 56.7048959 - 672 3 11 1991 46.0000000 61.7016082 - 673 4 11 1991 76.0000000 93.6009986 - 674 5 11 1991 60.0000000 111.8725454 - 675 6 11 1991 132.0000000 102.1874999 - 676 7 11 1991 133.0000000 101.6458996 - 677 8 11 1991 113.0000000 112.3633427 - 678 9 11 1991 120.0000000 123.9360637 - 679 10 11 1991 141.0000000 125.1092483 - 680 11 11 1991 208.0000000 133.6407784 - 681 12 11 1991 166.0000000 172.9359460 - 682 13 11 1991 183.0000000 207.4405242 - 683 14 11 1991 299.0000000 281.7741127 - 684 15 11 1991 521.0000000 369.8508794 - 685 16 11 1991 443.0000000 361.5792952 - 686 17 11 1991 304.0000000 318.9690325 - 687 18 11 1991 231.0000000 287.7908161 - 688 19 11 1991 192.0000000 272.9661743 - 689 20 11 1991 199.0000000 258.3612659 - 690 21 11 1991 201.0000000 240.3900811 - 691 22 11 1991 173.0000000 219.1502007 - 692 23 11 1991 159.0000000 191.3677807 - 693 24 11 1991 160.0000000 166.7901062 - 694 25 11 1991 146.0000000 147.3533350 - 695 26 11 1991 110.0000000 131.0969587 - 696 27 11 1991 114.0000000 117.5446289 - 697 28 11 1991 97.0000000 107.7929507 - 698 29 11 1991 89.0000000 101.1327938 - 699 30 11 1991 73.0000000 95.7291516 - 700 1 12 1991 69.0000000 90.9446247 - 701 2 12 1991 67.0000000 86.6408198 - 702 3 12 1991 63.0000000 82.7553442 - 703 4 12 1991 58.0000000 79.2379892 - 704 5 12 1991 59.0000000 76.0454413 - 705 6 12 1991 53.0000000 73.1401245 - 706 7 12 1991 54.0000000 70.4893522 - 707 8 12 1991 51.0000000 68.0646190 - 708 9 12 1991 47.0000000 65.8410065 - 709 10 12 1991 42.0000000 63.7966826 - 710 11 12 1991 40.0000000 61.9124773 - 711 12 12 1991 39.0000000 60.1715237 - 712 13 12 1991 36.0000000 58.5589522 - 713 14 12 1991 37.0000000 57.0616290 - 714 15 12 1991 32.0000000 55.6679326 - 715 16 12 1991 37.0000000 55.6255963 - 716 17 12 1991 62.0000000 106.9159081 - 717 18 12 1991 118.0000000 161.7178525 - 718 19 12 1991 170.0000000 213.6047946 - 719 20 12 1991 229.0000000 300.9904331 - 720 21 12 1991 448.0000000 390.8642304 - 721 22 12 1991 464.0000000 501.1678558 - 722 23 12 1991 675.0000000 592.3323265 - 723 24 12 1991 844.0000000 570.9726928 - 724 25 12 1991 569.0000000 498.7958720 - 725 26 12 1991 358.0000000 419.9330043 - 726 27 12 1991 279.0000000 354.3428320 - 727 28 12 1991 238.0000000 302.6663053 - 728 29 12 1991 201.0000000 260.0284467 - 729 30 12 1991 185.0000000 223.4791390 - 730 31 12 1991 165.0000000 194.2811547 - 731 1 1 1992 140.0000000 171.5009344 - 732 2 1 1992 126.0000000 153.5695712 - 733 3 1 1992 117.0000000 139.3276451 - 734 4 1 1992 114.0000000 131.2259897 - 735 5 1 1992 108.0000000 126.2436137 - 736 6 1 1992 108.0000000 119.7224607 - 737 7 1 1992 101.0000000 114.1623397 - 738 8 1 1992 97.0000000 110.8658115 - 739 9 1 1992 89.0000000 112.8620463 - 740 10 1 1992 111.0000000 131.9404149 - 741 11 1 1992 135.0000000 150.4490887 - 742 12 1 1992 171.0000000 143.8970255 - 743 13 1 1992 125.0000000 133.7835893 - 744 14 1 1992 111.0000000 126.1657770 - 745 15 1 1992 100.0000000 119.7335318 - 746 16 1 1992 87.0000000 114.0501244 - 747 17 1 1992 75.0000000 109.0185588 - 748 18 1 1992 79.0000000 104.4316880 - 749 19 1 1992 70.0000000 104.0986250 - 750 20 1 1992 72.0000000 103.2828731 - 751 21 1 1992 87.0000000 99.7618388 - 752 22 1 1992 79.0000000 96.2553195 - 753 23 1 1992 71.0000000 92.6401365 - 754 24 1 1992 66.0000000 89.4322752 - 755 25 1 1992 67.0000000 86.5124994 - 756 26 1 1992 65.0000000 83.8405509 - 757 27 1 1992 59.0000000 81.3877968 - 758 28 1 1992 57.0000000 79.1344553 - 759 29 1 1992 54.0000000 77.1977948 - 760 30 1 1992 59.0000000 76.5054345 - 761 31 1 1992 57.0000000 79.9066658 - 762 1 2 1992 56.0000000 85.1596070 - 763 2 2 1992 54.0000000 85.9102045 - 764 3 2 1992 58.0000000 84.3027203 - 765 4 2 1992 63.0000000 99.6300144 - 766 5 2 1992 76.0000000 138.1605202 - 767 6 2 1992 250.0000000 163.6836835 - 768 7 2 1992 346.0000000 179.3783653 - 769 8 2 1992 241.0000000 170.4403518 - 770 9 2 1992 180.0000000 157.9369322 - 771 10 2 1992 164.0000000 155.1281625 - 772 11 2 1992 183.0000000 165.0750228 - 773 12 2 1992 215.0000000 180.9139574 - 774 13 2 1992 265.0000000 194.4283775 - 775 14 2 1992 287.0000000 207.2249823 - 776 15 2 1992 272.0000000 214.8112278 - 777 16 2 1992 253.0000000 223.5626279 - 778 17 2 1992 301.0000000 237.5015634 - 779 18 2 1992 275.0000000 226.9636434 - 780 19 2 1992 224.0000000 201.3823681 - 781 20 2 1992 194.0000000 177.4603512 - 782 21 2 1992 173.0000000 159.4820153 - 783 22 2 1992 157.0000000 146.2100390 - 784 23 2 1992 142.0000000 137.0266897 - 785 24 2 1992 133.0000000 130.4754838 - 786 25 2 1992 128.0000000 125.7640365 - 787 26 2 1992 125.0000000 120.8185578 - 788 27 2 1992 125.0000000 115.4131020 - 789 28 2 1992 110.0000000 110.5517554 - 790 29 2 1992 107.0000000 106.2104923 - 791 1 3 1992 97.0000000 102.3484425 - 792 2 3 1992 97.0000000 99.0719144 - 793 3 3 1992 86.0000000 97.8734371 - 794 4 3 1992 93.0000000 97.6451192 - 795 5 3 1992 86.0000000 94.4039087 - 796 6 3 1992 82.0000000 91.4035644 - 797 7 3 1992 80.0000000 88.7347040 - 798 8 3 1992 77.0000000 86.2548072 - 799 9 3 1992 73.0000000 83.9606211 - 800 10 3 1992 76.0000000 81.9390677 - 801 11 3 1992 68.0000000 80.3144686 - 802 12 3 1992 70.0000000 101.8486233 - 803 13 3 1992 116.0000000 150.4751897 - 804 14 3 1992 206.0000000 193.0117420 - 805 15 3 1992 433.0000000 232.7962138 - 806 16 3 1992 495.0000000 277.5064505 - 807 17 3 1992 331.0000000 288.3620129 - 808 18 3 1992 240.0000000 259.5888028 - 809 19 3 1992 215.0000000 225.4624033 - 810 20 3 1992 185.0000000 197.1724386 - 811 21 3 1992 185.0000000 179.5402282 - 812 22 3 1992 185.0000000 187.3551559 - 813 23 3 1992 213.0000000 244.6043137 - 814 24 3 1992 466.0000000 317.1441514 - 815 25 3 1992 580.0000000 365.1966717 - 816 26 3 1992 566.0000000 374.1764651 - 817 27 3 1992 487.0000000 349.4480787 - 818 28 3 1992 387.0000000 311.9201482 - 819 29 3 1992 311.0000000 280.5921439 - 820 30 3 1992 270.0000000 250.1616900 - 821 31 3 1992 246.0000000 222.8333345 - 822 1 4 1992 229.0000000 211.5427940 - 823 2 4 1992 222.0000000 222.3962484 - 824 3 4 1992 217.0000000 221.5543241 - 825 4 4 1992 208.0000000 233.9114488 - 826 5 4 1992 220.0000000 268.6901673 - 827 6 4 1992 210.0000000 263.1462558 - 828 7 4 1992 190.0000000 235.7334939 - 829 8 4 1992 173.0000000 207.8396436 - 830 9 4 1992 166.0000000 184.4869520 - 831 10 4 1992 133.0000000 166.0756078 - 832 11 4 1992 126.0000000 151.3842957 - 833 12 4 1992 124.0000000 139.5051265 - 834 13 4 1992 116.0000000 131.2422666 - 835 14 4 1992 112.0000000 127.9857438 - 836 15 4 1992 111.0000000 141.8154326 - 837 16 4 1992 137.0000000 163.8630885 - 838 17 4 1992 206.0000000 168.3504805 - 839 18 4 1992 176.0000000 165.2596845 - 840 19 4 1992 161.0000000 157.2742208 - 841 20 4 1992 161.0000000 148.1700571 - 842 21 4 1992 139.0000000 140.6710805 - 843 22 4 1992 139.0000000 134.3611987 - 844 23 4 1992 123.0000000 128.7614887 - 845 24 4 1992 119.0000000 123.7088089 - 846 25 4 1992 111.0000000 119.1340848 - 847 26 4 1992 94.0000000 115.0073296 - 848 27 4 1992 94.0000000 111.6087515 - 849 28 4 1992 102.0000000 111.6846262 - 850 29 4 1992 120.0000000 113.2070509 - 851 30 4 1992 120.0000000 111.4392992 - 852 1 5 1992 114.0000000 113.9252771 - 853 2 5 1992 115.0000000 136.8965425 - 854 3 5 1992 206.0000000 139.4561428 - 855 4 5 1992 215.0000000 129.2111573 - 856 5 5 1992 125.0000000 122.3300798 - 857 6 5 1992 123.0000000 117.4432389 - 858 7 5 1992 113.0000000 113.2504166 - 859 8 5 1992 77.0000000 109.4510587 - 860 9 5 1992 83.0000000 106.0441185 - 861 10 5 1992 83.0000000 108.8902758 - 862 11 5 1992 96.0000000 110.2631522 - 863 12 5 1992 120.0000000 102.6049184 - 864 13 5 1992 80.0000000 98.2820735 - 865 14 5 1992 76.0000000 95.6425699 - 866 15 5 1992 69.0000000 93.2101428 - 867 16 5 1992 63.0000000 90.9502876 - 868 17 5 1992 61.0000000 88.8480464 - 869 18 5 1992 60.0000000 86.8871229 - 870 19 5 1992 59.0000000 85.0529540 - 871 20 5 1992 67.0000000 83.3327658 - 872 21 5 1992 51.0000000 81.7172239 - 873 22 5 1992 44.0000000 80.1979515 - 874 23 5 1992 42.0000000 78.7594027 - 875 24 5 1992 51.0000000 77.3957865 - 876 25 5 1992 42.0000000 76.2055022 - 877 26 5 1992 54.0000000 82.8565626 - 878 27 5 1992 53.0000000 83.4218191 - 879 28 5 1992 59.0000000 75.6591958 - 880 29 5 1992 55.0000000 76.4540193 - 881 30 5 1992 54.0000000 77.8730235 - 882 31 5 1992 48.0000000 75.1370612 - 883 1 6 1992 63.0000000 74.4272032 - 884 2 6 1992 61.0000000 75.6850714 - 885 3 6 1992 55.0000000 75.8109837 - 886 4 6 1992 75.0000000 78.1484055 - 887 5 6 1992 53.0000000 93.8222735 - 888 6 6 1992 77.0000000 98.8666474 - 889 7 6 1992 114.0000000 92.2160486 - 890 8 6 1992 167.0000000 97.5359599 - 891 9 6 1992 116.0000000 99.5714854 - 892 10 6 1992 91.0000000 87.7541051 - 893 11 6 1992 85.0000000 83.2599693 - 894 12 6 1992 68.0000000 80.7556312 - 895 13 6 1992 71.0000000 78.5923282 - 896 14 6 1992 63.0000000 76.5945959 - 897 15 6 1992 59.0000000 74.7397593 - 898 16 6 1992 46.0000000 73.0127474 - 899 17 6 1992 44.0000000 71.4003791 - 900 18 6 1992 39.0000000 69.8910305 - 901 19 6 1992 41.0000000 68.4810543 - 902 20 6 1992 44.0000000 67.9236495 - 903 21 6 1992 39.0000000 67.1983322 - 904 22 6 1992 32.0000000 65.3491118 - 905 23 6 1992 40.0000000 66.0978251 - 906 24 6 1992 41.0000000 72.4223561 - 907 25 6 1992 42.0000000 70.6579542 - 908 26 6 1992 42.0000000 65.9740124 - 909 27 6 1992 48.0000000 63.2684683 - 910 28 6 1992 37.0000000 61.6117847 - 911 29 6 1992 40.0000000 60.4842656 - 912 30 6 1992 29.0000000 59.4614946 - 913 1 7 1992 30.0000000 58.6248297 - 914 2 7 1992 36.0000000 58.0675847 - 915 3 7 1992 29.0000000 57.7720523 - 916 4 7 1992 36.0000000 64.7445587 - 917 5 7 1992 50.0000000 78.6396667 - 918 6 7 1992 78.0000000 80.1226362 - 919 7 7 1992 54.0000000 72.6800961 - 920 8 7 1992 57.0000000 63.8887863 - 921 9 7 1992 51.0000000 59.9241573 - 922 10 7 1992 47.0000000 66.2919429 - 923 11 7 1992 46.0000000 80.2797811 - 924 12 7 1992 76.0000000 85.3075464 - 925 13 7 1992 72.0000000 78.3791229 - 926 14 7 1992 67.0000000 71.7968633 - 927 15 7 1992 63.0000000 65.9999745 - 928 16 7 1992 47.0000000 63.4098937 - 929 17 7 1992 47.0000000 61.6820555 - 930 18 7 1992 42.0000000 60.1300000 - 931 19 7 1992 41.0000000 58.6904947 - 932 20 7 1992 39.0000000 57.3500713 - 933 21 7 1992 37.0000000 56.1638972 - 934 22 7 1992 33.0000000 56.2598147 - 935 23 7 1992 33.0000000 56.3123893 - 936 24 7 1992 33.0000000 54.0844399 - 937 25 7 1992 37.0000000 52.6328204 - 938 26 7 1992 26.0000000 51.6262542 - 939 27 7 1992 24.0000000 50.7053241 - 940 28 7 1992 26.0000000 49.8328029 - 941 29 7 1992 29.0000000 49.0031753 - 942 30 7 1992 19.0000000 48.2125886 - 943 31 7 1992 22.0000000 47.6508051 - 944 1 8 1992 28.0000000 48.5555182 - 945 2 8 1992 35.0000000 47.7451276 - 946 3 8 1992 29.0000000 45.9534989 - 947 4 8 1992 36.0000000 45.0839480 - 948 5 8 1992 52.0000000 44.4311034 - 949 6 8 1992 74.0000000 43.8119713 - 950 7 8 1992 54.0000000 43.2150196 - 951 8 8 1992 57.0000000 42.6382946 - 952 9 8 1992 48.0000000 43.2138154 - 953 10 8 1992 47.0000000 45.4608065 - 954 11 8 1992 46.0000000 47.6644110 - 955 12 8 1992 75.0000000 53.3284735 - 956 13 8 1992 73.0000000 53.5927953 - 957 14 8 1992 66.0000000 52.5504523 - 958 15 8 1992 60.0000000 49.2587691 - 959 16 8 1992 47.0000000 46.4325793 - 960 17 8 1992 46.0000000 42.5849108 - 961 18 8 1992 42.0000000 41.1954180 - 962 19 8 1992 41.0000000 40.6506365 - 963 20 8 1992 40.0000000 45.3145816 - 964 21 8 1992 37.0000000 48.2240286 - 965 22 8 1992 32.0000000 42.5942004 - 966 23 8 1992 32.0000000 41.2462405 - 967 24 8 1992 32.0000000 40.0596302 - 968 25 8 1992 36.0000000 38.8209120 - 969 26 8 1992 27.0000000 38.0064851 - 970 27 8 1992 25.0000000 37.3895928 - 971 28 8 1992 25.0000000 37.3819069 - 972 29 8 1992 28.0000000 39.1319032 - 973 30 8 1992 20.0000000 46.8468295 - 974 31 8 1992 22.0000000 63.6097316 - 975 1 9 1992 49.0000000 86.0228887 - 976 2 9 1992 77.0000000 80.9662175 - 977 3 9 1992 67.0000000 66.3591611 - 978 4 9 1992 45.0000000 59.6370631 - 979 5 9 1992 44.0000000 58.7813023 - 980 6 9 1992 64.0000000 54.2469042 - 981 7 9 1992 52.0000000 49.1579859 - 982 8 9 1992 40.0000000 46.7547729 - 983 9 9 1992 30.0000000 45.1677326 - 984 10 9 1992 34.0000000 43.7594205 - 985 11 9 1992 32.0000000 42.5029955 - 986 12 9 1992 36.0000000 41.5538008 - 987 13 9 1992 28.0000000 40.6425311 - 988 14 9 1992 33.0000000 39.7443757 - 989 15 9 1992 35.0000000 39.3127041 - 990 16 9 1992 30.0000000 39.0698780 - 991 17 9 1992 32.0000000 37.7317127 - 992 18 9 1992 29.0000000 36.6863127 - 993 19 9 1992 30.0000000 35.9446819 - 994 20 9 1992 28.0000000 35.3967128 - 995 21 9 1992 29.0000000 34.6073344 - 996 22 9 1992 29.0000000 33.8808159 - 997 23 9 1992 27.0000000 33.2525227 - 998 24 9 1992 27.0000000 32.6652584 - 999 25 9 1992 23.0000000 32.1049152 - 1000 26 9 1992 28.0000000 31.5707033 - 1001 27 9 1992 25.0000000 31.0615103 - 1002 28 9 1992 25.0000000 30.6250723 - 1003 29 9 1992 27.0000000 31.3171883 - 1004 30 9 1992 25.0000000 31.9546458 - 1005 1 10 1992 27.0000000 30.2163686 - 1006 2 10 1992 33.0000000 29.7234476 - 1007 3 10 1992 29.0000000 31.5226861 - 1008 4 10 1992 31.0000000 31.9842938 - 1009 5 10 1992 25.0000000 34.1684618 - 1010 6 10 1992 25.0000000 43.5626844 - 1011 7 10 1992 36.0000000 41.2677150 - 1012 8 10 1992 42.0000000 33.4775125 - 1013 9 10 1992 43.0000000 30.6201936 - 1014 10 10 1992 26.0000000 32.5891545 - 1015 11 10 1992 27.0000000 36.6806818 - 1016 12 10 1992 27.0000000 34.2069537 - 1017 13 10 1992 26.0000000 30.9183744 - 1018 14 10 1992 26.0000000 29.8970250 - 1019 15 10 1992 23.0000000 34.9758444 - 1020 16 10 1992 21.0000000 40.8428225 - 1021 17 10 1992 26.0000000 37.5220993 - 1022 18 10 1992 34.0000000 35.4684663 - 1023 19 10 1992 37.0000000 35.7451987 - 1024 20 10 1992 31.0000000 37.9517768 - 1025 21 10 1992 31.0000000 39.6801397 - 1026 22 10 1992 35.0000000 36.9573979 - 1027 23 10 1992 33.0000000 45.5329475 - 1028 24 10 1992 40.0000000 87.1798944 - 1029 25 10 1992 74.0000000 130.0124504 - 1030 26 10 1992 161.0000000 141.4784909 - 1031 27 10 1992 285.0000000 145.2097836 - 1032 28 10 1992 244.0000000 160.8634707 - 1033 29 10 1992 263.0000000 171.7798312 - 1034 30 10 1992 276.0000000 176.1049088 - 1035 31 10 1992 186.0000000 156.1533474 - 1036 1 11 1992 154.0000000 136.0022973 - 1037 2 11 1992 112.0000000 129.0068677 - 1038 3 11 1992 104.0000000 128.5530068 - 1039 4 11 1992 96.0000000 124.3721965 - 1040 5 11 1992 99.0000000 118.5312734 - 1041 6 11 1992 126.0000000 106.6844022 - 1042 7 11 1992 91.0000000 95.9047139 - 1043 8 11 1992 84.0000000 90.4785256 - 1044 9 11 1992 81.0000000 90.3398536 - 1045 10 11 1992 85.0000000 103.5643899 - 1046 11 11 1992 126.0000000 147.2747746 - 1047 12 11 1992 279.0000000 198.7028931 - 1048 13 11 1992 390.0000000 227.3871079 - 1049 14 11 1992 294.0000000 241.4010812 - 1050 15 11 1992 260.0000000 272.6294990 - 1051 16 11 1992 398.0000000 358.5229581 - 1052 17 11 1992 520.0000000 443.6870381 - 1053 18 11 1992 487.0000000 442.6781097 - 1054 19 11 1992 380.0000000 439.4908724 - 1055 20 11 1992 385.0000000 418.7588833 - 1056 21 11 1992 351.0000000 390.4824032 - 1057 22 11 1992 309.0000000 429.7476354 - 1058 23 11 1992 587.0000000 444.9835472 - 1059 24 11 1992 661.0000000 399.0574355 - 1060 25 11 1992 447.0000000 360.8035437 - 1061 26 11 1992 361.0000000 356.2816798 - 1062 27 11 1992 351.0000000 359.5397820 - 1063 28 11 1992 353.0000000 369.6570119 - 1064 29 11 1992 369.0000000 407.7508858 - 1065 30 11 1992 452.0000000 454.7340084 - 1066 1 12 1992 441.0000000 434.0069129 - 1067 2 12 1992 348.0000000 409.0182029 - 1068 3 12 1992 394.0000000 436.5262668 - 1069 4 12 1992 455.0000000 464.5763389 - 1070 5 12 1992 491.0000000 502.9617026 - 1071 6 12 1992 469.0000000 499.7040295 - 1072 7 12 1992 364.0000000 474.2767010 - 1073 8 12 1992 338.0000000 437.7243441 - 1074 9 12 1992 334.0000000 382.8059904 - 1075 10 12 1992 268.0000000 325.1266980 - 1076 11 12 1992 236.0000000 291.0090656 - 1077 12 12 1992 230.0000000 289.3010225 - 1078 13 12 1992 239.0000000 277.3446336 - 1079 14 12 1992 256.0000000 249.6868443 - 1080 15 12 1992 217.0000000 217.3113297 - 1081 16 12 1992 201.0000000 195.9384063 - 1082 17 12 1992 188.0000000 183.7897827 - 1083 18 12 1992 176.0000000 175.3474748 - 1084 19 12 1992 170.0000000 167.8446721 - 1085 20 12 1992 168.0000000 160.8839898 - 1086 21 12 1992 131.0000000 157.2042498 - 1087 22 12 1992 133.0000000 160.2792181 - 1088 23 12 1992 134.0000000 156.2383297 - 1089 24 12 1992 127.0000000 146.9034717 - 1090 25 12 1992 117.0000000 139.3621161 - 1091 26 12 1992 113.0000000 132.8688063 - 1092 27 12 1992 100.0000000 127.0591358 - 1093 28 12 1992 94.0000000 121.8258638 - 1094 29 12 1992 87.0000000 117.0958165 - 1095 30 12 1992 86.0000000 112.8070175 - 1096 31 12 1992 81.0000000 108.9061441 - 1097 1 1 1993 77.0000000 105.3471635 - 1098 2 1 1993 76.0000000 102.0902220 - 1099 3 1 1993 61.0000000 99.1007229 - 1100 4 1 1993 61.0000000 96.3485558 - 1101 5 1 1993 57.0000000 93.8074506 - 1102 6 1 1993 66.0000000 100.2644167 - 1103 7 1 1993 67.0000000 116.4730535 - 1104 8 1 1993 84.0000000 124.8887066 - 1105 9 1 1993 90.0000000 132.3823551 - 1106 10 1 1993 113.0000000 160.3507005 - 1107 11 1 1993 265.0000000 264.9382994 - 1108 12 1 1993 559.0000000 436.8211965 - 1109 13 1 1993 832.0000000 512.4026582 - 1110 14 1 1993 601.0000000 498.4882495 - 1111 15 1 1993 436.0000000 433.0773604 - 1112 16 1 1993 339.0000000 360.5234159 - 1113 17 1 1993 292.0000000 302.2616259 - 1114 18 1 1993 247.0000000 261.8988837 - 1115 19 1 1993 218.0000000 231.5791264 - 1116 20 1 1993 205.0000000 208.7870933 - 1117 21 1 1993 190.0000000 192.8818841 - 1118 22 1 1993 176.0000000 182.5170638 - 1119 23 1 1993 173.0000000 173.6550981 - 1120 24 1 1993 173.0000000 180.1492734 - 1121 25 1 1993 199.0000000 231.6183382 - 1122 26 1 1993 361.0000000 279.8595268 - 1123 27 1 1993 295.0000000 277.4142605 - 1124 28 1 1993 238.0000000 279.6977505 - 1125 29 1 1993 263.0000000 285.3925757 - 1126 30 1 1993 245.0000000 271.9183283 - 1127 31 1 1993 222.0000000 244.4683839 - 1128 1 2 1993 199.0000000 216.2809181 - 1129 2 2 1993 186.0000000 194.2399286 - 1130 3 2 1993 171.0000000 176.9315547 - 1131 4 2 1993 157.0000000 162.9973384 - 1132 5 2 1993 159.0000000 152.7039053 - 1133 6 2 1993 129.0000000 144.9999374 - 1134 7 2 1993 119.0000000 138.6654186 - 1135 8 2 1993 119.0000000 133.0024566 - 1136 9 2 1993 105.0000000 127.8592312 - 1137 10 2 1993 106.0000000 123.1932757 - 1138 11 2 1993 105.0000000 118.9478525 - 1139 12 2 1993 95.0000000 115.0732292 - 1140 13 2 1993 91.0000000 111.5263216 - 1141 14 2 1993 88.0000000 108.2697106 - 1142 15 2 1993 84.0000000 105.2708140 - 1143 16 2 1993 83.0000000 102.6736187 - 1144 17 2 1993 79.0000000 101.1991952 - 1145 18 2 1993 78.0000000 100.9506582 - 1146 19 2 1993 84.0000000 100.8030684 - 1147 20 2 1993 91.0000000 104.2216088 - 1148 21 2 1993 91.0000000 114.3527757 - 1149 22 2 1993 90.0000000 115.6802274 - 1150 23 2 1993 103.0000000 114.0511137 - 1151 24 2 1993 94.0000000 109.4187863 - 1152 25 2 1993 81.0000000 105.5418631 - 1153 26 2 1993 78.0000000 102.3171315 - 1154 27 2 1993 75.0000000 100.8250075 - 1155 28 2 1993 76.0000000 101.1383116 - 1156 1 3 1993 80.0000000 99.3581658 - 1157 2 3 1993 75.0000000 97.0467031 - 1158 3 3 1993 76.0000000 95.2378449 - 1159 4 3 1993 72.0000000 93.5767648 - 1160 5 3 1993 65.0000000 91.2505797 - 1161 6 3 1993 64.0000000 89.0213297 - 1162 7 3 1993 64.0000000 86.9686715 - 1163 8 3 1993 68.0000000 85.4519167 - 1164 9 3 1993 68.0000000 84.5259254 - 1165 10 3 1993 67.0000000 83.1035467 - 1166 11 3 1993 61.0000000 82.7251321 - 1167 12 3 1993 57.0000000 83.5041864 - 1168 13 3 1993 58.0000000 83.8409141 - 1169 14 3 1993 54.0000000 82.4983704 - 1170 15 3 1993 66.0000000 80.6904598 - 1171 16 3 1993 54.0000000 79.0495674 - 1172 17 3 1993 57.0000000 77.5686127 - 1173 18 3 1993 57.0000000 76.1928033 - 1174 19 3 1993 52.0000000 74.8872547 - 1175 20 3 1993 57.0000000 73.6367647 - 1176 21 3 1993 58.0000000 72.5363985 - 1177 22 3 1993 57.0000000 75.8321427 - 1178 23 3 1993 56.0000000 84.7570515 - 1179 24 3 1993 63.0000000 86.2565075 - 1180 25 3 1993 76.0000000 81.8589241 - 1181 26 3 1993 56.0000000 79.2346686 - 1182 27 3 1993 59.0000000 77.4045900 - 1183 28 3 1993 59.0000000 75.7400674 - 1184 29 3 1993 54.0000000 74.1788482 - 1185 30 3 1993 48.0000000 72.7094062 - 1186 31 3 1993 55.0000000 71.3230960 - 1187 1 4 1993 48.0000000 70.1438445 - 1188 2 4 1993 53.0000000 70.5159369 - 1189 3 4 1993 47.0000000 72.1467417 - 1190 4 4 1993 59.0000000 74.3443710 - 1191 5 4 1993 53.0000000 83.2058823 - 1192 6 4 1993 64.0000000 91.1737892 - 1193 7 4 1993 63.0000000 89.0938118 - 1194 8 4 1993 75.0000000 84.3286612 - 1195 9 4 1993 64.0000000 81.3052058 - 1196 10 4 1993 59.0000000 79.4901119 - 1197 11 4 1993 60.0000000 82.0119546 - 1198 12 4 1993 63.0000000 83.6543165 - 1199 13 4 1993 69.0000000 81.8901717 - 1200 14 4 1993 79.0000000 80.9511501 - 1201 15 4 1993 82.0000000 79.2627827 - 1202 16 4 1993 68.0000000 77.1794984 - 1203 17 4 1993 56.0000000 75.3588337 - 1204 18 4 1993 59.0000000 73.6046073 - 1205 19 4 1993 61.0000000 71.9290588 - 1206 20 4 1993 62.0000000 70.2938975 - 1207 21 4 1993 57.0000000 68.6946419 - 1208 22 4 1993 53.0000000 67.1924893 - 1209 23 4 1993 47.0000000 65.7871963 - 1210 24 4 1993 46.0000000 64.4618036 - 1211 25 4 1993 47.0000000 63.2124479 - 1212 26 4 1993 45.0000000 62.0325572 - 1213 27 4 1993 43.0000000 60.9157278 - 1214 28 4 1993 41.0000000 59.8564029 - 1215 29 4 1993 38.0000000 58.8556365 - 1216 30 4 1993 39.0000000 58.2586098 - 1217 1 5 1993 40.0000000 57.5384906 - 1218 2 5 1993 41.0000000 56.6755021 - 1219 3 5 1993 45.0000000 56.5113326 - 1220 4 5 1993 49.0000000 55.7939851 - 1221 5 5 1993 40.0000000 54.6963793 - 1222 6 5 1993 43.0000000 53.8368905 - 1223 7 5 1993 38.0000000 53.4883203 - 1224 8 5 1993 38.0000000 53.3061967 - 1225 9 5 1993 43.0000000 52.0782141 - 1226 10 5 1993 44.0000000 51.6903641 - 1227 11 5 1993 41.0000000 52.2935054 - 1228 12 5 1993 51.0000000 58.1259112 - 1229 13 5 1993 63.0000000 81.6698588 - 1230 14 5 1993 68.0000000 79.8892142 - 1231 15 5 1993 77.0000000 62.4834381 - 1232 16 5 1993 77.0000000 57.9343539 - 1233 17 5 1993 59.0000000 56.1370008 - 1234 18 5 1993 49.0000000 54.7846213 - 1235 19 5 1993 43.0000000 56.3454341 - 1236 20 5 1993 44.0000000 58.0612669 - 1237 21 5 1993 48.0000000 59.2490842 - 1238 22 5 1993 44.0000000 58.5555709 - 1239 23 5 1993 46.0000000 54.3249597 - 1240 24 5 1993 40.0000000 52.3076472 - 1241 25 5 1993 43.0000000 51.1376069 - 1242 26 5 1993 30.0000000 50.6316292 - 1243 27 5 1993 45.0000000 53.4966296 - 1244 28 5 1993 43.0000000 60.0505144 - 1245 29 5 1993 44.0000000 59.3846039 - 1246 30 5 1993 54.0000000 56.1313879 - 1247 31 5 1993 56.0000000 54.7699515 - 1248 1 6 1993 44.0000000 51.9772721 - 1249 2 6 1993 43.0000000 50.4498445 - 1250 3 6 1993 33.0000000 50.5133474 - 1251 4 6 1993 45.0000000 51.4377075 - 1252 5 6 1993 46.0000000 49.6153723 - 1253 6 6 1993 42.0000000 47.7061868 - 1254 7 6 1993 40.0000000 46.5445007 - 1255 8 6 1993 30.0000000 45.6241068 - 1256 9 6 1993 31.0000000 44.7839661 - 1257 10 6 1993 32.0000000 44.1729618 - 1258 11 6 1993 25.0000000 43.7477658 - 1259 12 6 1993 33.0000000 43.6868781 - 1260 13 6 1993 29.0000000 44.1161466 - 1261 14 6 1993 40.0000000 42.8444605 - 1262 15 6 1993 42.0000000 42.2626368 - 1263 16 6 1993 37.0000000 42.2249387 - 1264 17 6 1993 46.0000000 42.3546232 - 1265 18 6 1993 47.0000000 41.4489794 - 1266 19 6 1993 50.0000000 40.3248019 - 1267 20 6 1993 43.0000000 49.9710377 - 1268 21 6 1993 69.0000000 65.7428043 - 1269 22 6 1993 61.0000000 55.1449543 - 1270 23 6 1993 67.0000000 64.4635714 - 1271 24 6 1993 77.0000000 66.1082668 - 1272 25 6 1993 87.0000000 55.1139031 - 1273 26 6 1993 55.0000000 51.0649443 - 1274 27 6 1993 43.0000000 49.3456207 - 1275 28 6 1993 40.0000000 47.9333958 - 1276 29 6 1993 30.0000000 46.6350375 - 1277 30 6 1993 40.0000000 45.4314438 - 1278 1 7 1993 40.0000000 44.4911540 - 1279 2 7 1993 27.0000000 45.2700866 - 1280 3 7 1993 34.0000000 44.4535821 - 1281 4 7 1993 30.0000000 42.4546587 - 1282 5 7 1993 31.0000000 41.4606943 - 1283 6 7 1993 27.0000000 40.4704917 - 1284 7 7 1993 31.0000000 39.6458474 - 1285 8 7 1993 26.0000000 38.8698025 - 1286 9 7 1993 23.0000000 38.1895765 - 1287 10 7 1993 24.0000000 38.6597640 - 1288 11 7 1993 25.0000000 39.6369732 - 1289 12 7 1993 34.0000000 43.4514454 - 1290 13 7 1993 40.0000000 49.6333772 - 1291 14 7 1993 41.0000000 58.0255029 - 1292 15 7 1993 46.0000000 59.9936401 - 1293 16 7 1993 39.0000000 48.3050741 - 1294 17 7 1993 43.0000000 42.6482290 - 1295 18 7 1993 35.0000000 41.0216850 - 1296 19 7 1993 49.0000000 49.4525106 - 1297 20 7 1993 38.0000000 57.0360635 - 1298 21 7 1993 41.0000000 51.2400972 - 1299 22 7 1993 45.0000000 47.7355346 - 1300 23 7 1993 41.0000000 45.1520539 - 1301 24 7 1993 42.0000000 42.0521491 - 1302 25 7 1993 40.0000000 40.5856972 - 1303 26 7 1993 35.0000000 39.5854445 - 1304 27 7 1993 40.0000000 50.1524516 - 1305 28 7 1993 40.0000000 54.0116415 - 1306 29 7 1993 36.0000000 42.1617770 - 1307 30 7 1993 40.0000000 61.7530756 - 1308 31 7 1993 61.0000000 88.1645387 - 1309 1 8 1993 36.0000000 65.7673849 - 1310 2 8 1993 46.0000000 51.8078537 - 1311 3 8 1993 32.0000000 48.1041184 - 1312 4 8 1993 38.0000000 46.1966537 - 1313 5 8 1993 32.0000000 44.5467506 - 1314 6 8 1993 25.0000000 43.0424952 - 1315 7 8 1993 26.0000000 41.6654166 - 1316 8 8 1993 29.0000000 40.3994235 - 1317 9 8 1993 29.0000000 41.6408235 - 1318 10 8 1993 28.0000000 47.2828350 - 1319 11 8 1993 37.0000000 44.3307833 - 1320 12 8 1993 40.0000000 41.1780048 - 1321 13 8 1993 49.0000000 38.4186289 - 1322 14 8 1993 32.0000000 38.0880446 - 1323 15 8 1993 37.0000000 38.8405557 - 1324 16 8 1993 37.0000000 36.7314540 - 1325 17 8 1993 27.0000000 35.1866581 - 1326 18 8 1993 24.0000000 34.3116512 - 1327 19 8 1993 24.0000000 33.5378852 - 1328 20 8 1993 22.0000000 32.8158555 - 1329 21 8 1993 21.0000000 32.1382213 - 1330 22 8 1993 16.0000000 31.5346987 - 1331 23 8 1993 21.0000000 32.4041950 - 1332 24 8 1993 27.0000000 34.0781773 - 1333 25 8 1993 26.0000000 31.4939696 - 1334 26 8 1993 23.0000000 30.0162837 - 1335 27 8 1993 21.0000000 29.5168303 - 1336 28 8 1993 28.0000000 31.3409913 - 1337 29 8 1993 17.0000000 31.9692118 - 1338 30 8 1993 24.0000000 29.2996970 - 1339 31 8 1993 25.0000000 28.1894092 - 1340 1 9 1993 25.0000000 27.6896053 - 1341 2 9 1993 19.0000000 27.2570562 - 1342 3 9 1993 17.0000000 26.9859012 - 1343 4 9 1993 16.0000000 30.2065192 - 1344 5 9 1993 19.0000000 32.2851563 - 1345 6 9 1993 23.0000000 28.1500017 - 1346 7 9 1993 25.0000000 37.2881370 - 1347 8 9 1993 34.0000000 44.5044359 - 1348 9 9 1993 31.0000000 37.5846823 - 1349 10 9 1993 35.0000000 61.1050444 - 1350 11 9 1993 53.0000000 81.4460306 - 1351 12 9 1993 71.0000000 99.8433653 - 1352 13 9 1993 74.0000000 103.6685736 - 1353 14 9 1993 87.0000000 127.1294879 - 1354 15 9 1993 173.0000000 134.1593453 - 1355 16 9 1993 117.0000000 111.5436297 - 1356 17 9 1993 93.0000000 91.7233174 - 1357 18 9 1993 77.0000000 83.5363146 - 1358 19 9 1993 62.0000000 77.5160879 - 1359 20 9 1993 54.0000000 72.3899551 - 1360 21 9 1993 48.0000000 68.9051343 - 1361 22 9 1993 46.0000000 75.4736134 - 1362 23 9 1993 55.0000000 87.3643485 - 1363 24 9 1993 66.0000000 89.9877730 - 1364 25 9 1993 64.0000000 86.4682331 - 1365 26 9 1993 52.0000000 79.1612384 - 1366 27 9 1993 68.0000000 72.5783795 - 1367 28 9 1993 69.0000000 68.9889817 - 1368 29 9 1993 62.0000000 71.2897274 - 1369 30 9 1993 76.0000000 69.2958605 - 1370 1 10 1993 72.0000000 74.8636201 - 1371 2 10 1993 68.0000000 85.4901291 - 1372 3 10 1993 72.0000000 83.2232162 - 1373 4 10 1993 78.0000000 83.1930882 - 1374 5 10 1993 116.0000000 116.3339660 - 1375 6 10 1993 131.0000000 143.5833189 - 1376 7 10 1993 180.0000000 134.8706291 - 1377 8 10 1993 203.0000000 124.7472392 - 1378 9 10 1993 164.0000000 127.9520642 - 1379 10 10 1993 178.0000000 142.1440172 - 1380 11 10 1993 161.0000000 171.3535057 - 1381 12 10 1993 287.0000000 189.2261129 - 1382 13 10 1993 360.0000000 219.3010126 - 1383 14 10 1993 374.0000000 260.6630107 - 1384 15 10 1993 297.0000000 254.7163306 - 1385 16 10 1993 247.0000000 233.6862785 - 1386 17 10 1993 273.0000000 236.6445722 - 1387 18 10 1993 261.0000000 233.1760174 - 1388 19 10 1993 265.0000000 213.2695333 - 1389 20 10 1993 230.0000000 189.0780273 - 1390 21 10 1993 199.0000000 165.6026392 - 1391 22 10 1993 173.0000000 148.3183568 - 1392 23 10 1993 182.0000000 144.2727428 - 1393 24 10 1993 203.0000000 155.0448283 - 1394 25 10 1993 213.0000000 150.5467022 - 1395 26 10 1993 180.0000000 136.1133306 - 1396 27 10 1993 154.0000000 122.7097567 - 1397 28 10 1993 118.0000000 113.3387804 - 1398 29 10 1993 112.0000000 106.4742130 - 1399 30 10 1993 98.0000000 100.5958612 - 1400 31 10 1993 97.0000000 95.3552736 - 1401 1 11 1993 91.0000000 90.6547755 - 1402 2 11 1993 85.0000000 86.4258323 - 1403 3 11 1993 75.0000000 82.6102412 - 1404 4 11 1993 76.0000000 79.1579216 - 1405 5 11 1993 78.0000000 76.0256380 - 1406 6 11 1993 72.0000000 73.1900256 - 1407 7 11 1993 76.0000000 71.7494940 - 1408 8 11 1993 69.0000000 70.1050855 - 1409 9 11 1993 66.0000000 67.3845414 - 1410 10 11 1993 71.0000000 66.4738283 - 1411 11 11 1993 64.0000000 69.1986000 - 1412 12 11 1993 67.0000000 74.7275880 - 1413 13 11 1993 80.0000000 81.9040193 - 1414 14 11 1993 78.0000000 92.6439978 - 1415 15 11 1993 80.0000000 105.4062838 - 1416 16 11 1993 86.0000000 103.1052148 - 1417 17 11 1993 125.0000000 98.5603881 - 1418 18 11 1993 96.0000000 91.9641121 - 1419 19 11 1993 82.0000000 87.2461363 - 1420 20 11 1993 77.0000000 83.3712992 - 1421 21 11 1993 67.0000000 79.8880545 - 1422 22 11 1993 71.0000000 76.7263315 - 1423 23 11 1993 61.0000000 73.8480311 - 1424 24 11 1993 42.0000000 71.2208002 - 1425 25 11 1993 63.0000000 68.8218531 - 1426 26 11 1993 57.0000000 66.9975292 - 1427 27 11 1993 58.0000000 65.8194101 - 1428 28 11 1993 49.0000000 63.8686223 - 1429 29 11 1993 50.0000000 61.9946359 - 1430 30 11 1993 55.0000000 60.3274527 - 1431 1 12 1993 54.0000000 58.7861529 - 1432 2 12 1993 54.0000000 61.3631032 - 1433 3 12 1993 50.0000000 62.9412019 - 1434 4 12 1993 51.0000000 62.4508449 - 1435 5 12 1993 62.0000000 62.0525859 - 1436 6 12 1993 62.0000000 59.5302987 - 1437 7 12 1993 71.0000000 73.3274859 - 1438 8 12 1993 79.0000000 109.7994595 - 1439 9 12 1993 153.0000000 140.5066070 - 1440 10 12 1993 291.0000000 171.1498758 - 1441 11 12 1993 332.0000000 223.1699928 - 1442 12 12 1993 465.0000000 293.2882071 - 1443 13 12 1993 518.0000000 354.8948186 - 1444 14 12 1993 539.0000000 383.6377740 - 1445 15 12 1993 559.0000000 408.8923667 - 1446 16 12 1993 500.0000000 447.6636607 - 1447 17 12 1993 526.0000000 493.9395867 - 1448 18 12 1993 583.0000000 520.7371192 - 1449 19 12 1993 677.0000000 558.7402608 - 1450 20 12 1993 781.0000000 728.2889190 - 1451 21 12 1993 1180.0000000 934.5516083 - 1452 22 12 1993 1460.0000000 1001.5365953 - 1453 23 12 1993 1600.0000000 1036.9444060 - 1454 24 12 1993 1410.0000000 1057.0500094 - 1455 25 12 1993 1230.0000000 1022.2317612 - 1456 26 12 1993 1070.0000000 885.9355035 - 1457 27 12 1993 746.0000000 730.2816484 - 1458 28 12 1993 542.0000000 608.9724649 - 1459 29 12 1993 492.0000000 538.3971751 - 1460 30 12 1993 491.0000000 542.3591832 - 1461 31 12 1993 617.0000000 612.0139952 + 1 1 7 1990 79.0000000 88.5475405 + 2 2 7 1990 92.0000000 66.6816868 + 3 3 7 1990 72.0000000 59.3215707 + 4 4 7 1990 58.0000000 64.2702783 + 5 5 7 1990 69.0000000 84.3363385 + 6 6 7 1990 94.0000000 87.1382863 + 7 7 7 1990 199.0000000 79.3098221 + 8 8 7 1990 133.0000000 78.6121223 + 9 9 7 1990 124.0000000 72.9014459 + 10 10 7 1990 123.0000000 66.7151368 + 11 11 7 1990 99.0000000 63.2728645 + 12 12 7 1990 88.0000000 60.7888059 + 13 13 7 1990 84.0000000 58.5733646 + 14 14 7 1990 72.0000000 56.5501095 + 15 15 7 1990 55.0000000 54.6959516 + 16 16 7 1990 65.0000000 52.9922801 + 17 17 7 1990 50.0000000 51.4228276 + 18 18 7 1990 50.0000000 49.9733144 + 19 19 7 1990 46.0000000 48.6311776 + 20 20 7 1990 44.0000000 47.3853421 + 21 21 7 1990 42.0000000 46.2260255 + 22 22 7 1990 37.0000000 45.1445707 + 23 23 7 1990 38.0000000 44.1333027 + 24 24 7 1990 44.0000000 43.1854062 + 25 25 7 1990 30.0000000 42.2948186 + 26 26 7 1990 26.0000000 41.4561390 + 27 27 7 1990 31.0000000 40.6645485 + 28 28 7 1990 33.0000000 42.7587026 + 29 29 7 1990 42.0000000 42.1343072 + 30 30 7 1990 36.0000000 38.9924218 + 31 31 7 1990 34.0000000 38.1966991 + 32 1 8 1990 25.0000000 37.5594743 + 33 2 8 1990 22.0000000 36.9534554 + 34 3 8 1990 28.0000000 36.3742381 + 35 4 8 1990 25.0000000 35.8195748 + 36 5 8 1990 19.0000000 35.2874579 + 37 6 8 1990 22.0000000 34.7761509 + 38 7 8 1990 19.0000000 34.2841859 + 39 8 8 1990 22.0000000 33.8097198 + 40 9 8 1990 19.0000000 33.3513437 + 41 10 8 1990 20.0000000 32.9080039 + 42 11 8 1990 19.0000000 32.4786349 + 43 12 8 1990 19.0000000 32.0622415 + 44 13 8 1990 22.0000000 33.4146368 + 45 14 8 1990 36.0000000 45.5413303 + 46 15 8 1990 31.0000000 55.1021456 + 47 16 8 1990 30.0000000 46.6426131 + 48 17 8 1990 28.0000000 39.1960535 + 49 18 8 1990 34.0000000 35.3939976 + 50 19 8 1990 21.0000000 32.6298301 + 51 20 8 1990 30.0000000 31.6631655 + 52 21 8 1990 22.0000000 31.1306054 + 53 22 8 1990 21.0000000 30.6494936 + 54 23 8 1990 23.0000000 30.1897259 + 55 24 8 1990 20.0000000 29.7485942 + 56 25 8 1990 29.0000000 29.3251714 + 57 26 8 1990 20.0000000 28.9442523 + 58 27 8 1990 22.0000000 28.9267996 + 59 28 8 1990 23.0000000 29.4821825 + 60 29 8 1990 35.0000000 28.9541851 + 61 30 8 1990 51.0000000 60.8141831 + 62 31 8 1990 80.0000000 113.5901796 + 63 1 9 1990 56.0000000 76.0911258 + 64 2 9 1990 33.0000000 44.4445524 + 65 3 9 1990 27.0000000 38.7630715 + 66 4 9 1990 27.0000000 37.3579888 + 67 5 9 1990 28.0000000 39.0902933 + 68 6 9 1990 26.0000000 39.4174108 + 69 7 9 1990 24.0000000 37.3483204 + 70 8 9 1990 33.0000000 36.8612014 + 71 9 9 1990 26.0000000 34.2289815 + 72 10 9 1990 27.0000000 32.8446574 + 73 11 9 1990 22.0000000 31.9276037 + 74 12 9 1990 22.0000000 31.1192249 + 75 13 9 1990 21.0000000 30.3697613 + 76 14 9 1990 22.0000000 29.6710417 + 77 15 9 1990 22.0000000 29.0178787 + 78 16 9 1990 22.0000000 28.4057449 + 79 17 9 1990 20.0000000 27.8306284 + 80 18 9 1990 22.0000000 27.2889666 + 81 19 9 1990 16.0000000 26.7775915 + 82 20 9 1990 22.0000000 26.2936812 + 83 21 9 1990 19.0000000 27.8280766 + 84 22 9 1990 32.0000000 56.2316357 + 85 23 9 1990 27.0000000 81.4889086 + 86 24 9 1990 45.0000000 68.8157375 + 87 25 9 1990 42.0000000 49.3109645 + 88 26 9 1990 39.0000000 38.2854405 + 89 27 9 1990 30.0000000 35.7813764 + 90 28 9 1990 28.0000000 34.4602837 + 91 29 9 1990 30.0000000 33.3043907 + 92 30 9 1990 30.0000000 46.5391768 + 93 1 10 1990 56.0000000 91.5442471 + 94 2 10 1990 72.0000000 108.1079764 + 95 3 10 1990 73.0000000 92.5925192 + 96 4 10 1990 68.0000000 88.1861700 + 97 5 10 1990 53.0000000 74.9900841 + 98 6 10 1990 42.0000000 67.7317825 + 99 7 10 1990 33.0000000 62.4374952 + 100 8 10 1990 42.0000000 58.5652111 + 101 9 10 1990 34.0000000 55.3763815 + 102 10 10 1990 36.0000000 52.5365808 + 103 11 10 1990 36.0000000 49.9768672 + 104 12 10 1990 28.0000000 47.6644517 + 105 13 10 1990 32.0000000 45.5707891 + 106 14 10 1990 27.0000000 43.6704270 + 107 15 10 1990 35.0000000 42.0455613 + 108 16 10 1990 42.0000000 41.9902195 + 109 17 10 1990 35.0000000 43.0658267 + 110 18 10 1990 39.0000000 48.3558980 + 111 19 10 1990 34.0000000 46.7142143 + 112 20 10 1990 32.0000000 41.5527788 + 113 21 10 1990 34.0000000 39.2807351 + 114 22 10 1990 27.0000000 37.8713385 + 115 23 10 1990 31.0000000 36.6282080 + 116 24 10 1990 28.0000000 35.4860600 + 117 25 10 1990 25.0000000 34.6739406 + 118 26 10 1990 29.0000000 40.7928604 + 119 27 10 1990 31.0000000 55.3069116 + 120 28 10 1990 65.0000000 115.0858095 + 121 29 10 1990 69.0000000 175.0674054 + 122 30 10 1990 157.0000000 163.1353091 + 123 31 10 1990 190.0000000 138.0083367 + 124 1 11 1990 115.0000000 125.7718173 + 125 2 11 1990 104.0000000 125.7213740 + 126 3 11 1990 100.0000000 128.7254935 + 127 4 11 1990 131.0000000 133.9990423 + 128 5 11 1990 130.0000000 135.5784646 + 129 6 11 1990 115.0000000 129.6826763 + 130 7 11 1990 102.0000000 117.0988987 + 131 8 11 1990 95.0000000 103.5702716 + 132 9 11 1990 81.0000000 92.2338391 + 133 10 11 1990 66.0000000 89.8970258 + 134 11 11 1990 67.0000000 103.2450768 + 135 12 11 1990 74.0000000 115.5270627 + 136 13 11 1990 109.0000000 123.7475325 + 137 14 11 1990 92.0000000 130.8122560 + 138 15 11 1990 92.0000000 141.8059593 + 139 16 11 1990 155.0000000 146.8150867 + 140 17 11 1990 159.0000000 145.0941375 + 141 18 11 1990 131.0000000 145.0214050 + 142 19 11 1990 161.0000000 152.7658927 + 143 20 11 1990 196.0000000 189.5559282 + 144 21 11 1990 336.0000000 260.3344698 + 145 22 11 1990 566.0000000 280.3695110 + 146 23 11 1990 373.0000000 279.6941558 + 147 24 11 1990 293.0000000 285.1670892 + 148 25 11 1990 264.0000000 276.9896959 + 149 26 11 1990 226.0000000 257.8784467 + 150 27 11 1990 201.0000000 229.3770031 + 151 28 11 1990 180.0000000 199.6587604 + 152 29 11 1990 161.0000000 179.1029856 + 153 30 11 1990 149.0000000 167.5047744 + 154 1 12 1990 134.0000000 151.5304509 + 155 2 12 1990 113.0000000 135.9172345 + 156 3 12 1990 99.0000000 123.4212270 + 157 4 12 1990 107.0000000 115.0087631 + 158 5 12 1990 99.0000000 108.4596570 + 159 6 12 1990 89.0000000 102.6790717 + 160 7 12 1990 77.0000000 97.4977593 + 161 8 12 1990 71.0000000 92.8322435 + 162 9 12 1990 68.0000000 88.6287235 + 163 10 12 1990 73.0000000 84.8317184 + 164 11 12 1990 84.0000000 81.3923002 + 165 12 12 1990 88.0000000 87.4376994 + 166 13 12 1990 92.0000000 100.7090150 + 167 14 12 1990 128.0000000 97.2246925 + 168 15 12 1990 136.0000000 90.1813538 + 169 16 12 1990 114.0000000 85.3173630 + 170 17 12 1990 101.0000000 81.5095322 + 171 18 12 1990 93.0000000 78.1057510 + 172 19 12 1990 85.0000000 75.0310287 + 173 20 12 1990 81.0000000 72.2443381 + 174 21 12 1990 106.0000000 87.4381457 + 175 22 12 1990 159.0000000 120.1440042 + 176 23 12 1990 250.0000000 132.7074400 + 177 24 12 1990 298.0000000 131.9397305 + 178 25 12 1990 261.0000000 141.3381021 + 179 26 12 1990 228.0000000 206.9158586 + 180 27 12 1990 409.0000000 284.3987439 + 181 28 12 1990 486.0000000 333.8400493 + 182 29 12 1990 440.0000000 388.9775564 + 183 30 12 1990 486.0000000 480.4064308 + 184 31 12 1990 774.0000000 559.9798021 + 185 1 1 1991 889.0000000 656.9455620 + 186 2 1 1991 863.0000000 734.3191457 + 187 3 1 1991 875.0000000 803.0738503 + 188 4 1 1991 932.0000000 807.3141963 + 189 5 1 1991 826.0000000 750.1224534 + 190 6 1 1991 731.0000000 704.1484442 + 191 7 1 1991 613.0000000 648.9884277 + 192 8 1 1991 610.0000000 625.9578343 + 193 9 1 1991 686.0000000 606.1435853 + 194 10 1 1991 556.0000000 593.2924613 + 195 11 1 1991 669.0000000 621.4511045 + 196 12 1 1991 828.0000000 610.1794756 + 197 13 1 1991 735.0000000 554.2499531 + 198 14 1 1991 513.0000000 468.1627337 + 199 15 1 1991 411.0000000 387.9507231 + 200 16 1 1991 345.0000000 322.5660759 + 201 17 1 1991 293.0000000 271.7042575 + 202 18 1 1991 251.0000000 234.8296680 + 203 19 1 1991 222.0000000 208.3777782 + 204 20 1 1991 215.0000000 189.2440852 + 205 21 1 1991 213.0000000 176.5601531 + 206 22 1 1991 202.0000000 174.2886018 + 207 23 1 1991 200.0000000 170.0902244 + 208 24 1 1991 192.0000000 161.9759373 + 209 25 1 1991 176.0000000 153.7926307 + 210 26 1 1991 164.0000000 146.3938909 + 211 27 1 1991 157.0000000 139.6452351 + 212 28 1 1991 134.0000000 133.5407989 + 213 29 1 1991 130.0000000 128.0494410 + 214 30 1 1991 119.0000000 123.0945146 + 215 31 1 1991 107.0000000 118.6087948 + 216 1 2 1991 112.0000000 114.5345498 + 217 2 2 1991 109.0000000 110.8220676 + 218 3 2 1991 101.0000000 107.4284196 + 219 4 2 1991 98.0000000 104.3164342 + 220 5 2 1991 84.0000000 101.4538411 + 221 6 2 1991 93.0000000 98.8125561 + 222 7 2 1991 80.0000000 96.3680802 + 223 8 2 1991 73.0000000 94.0989939 + 224 9 2 1991 89.0000000 91.9865295 + 225 10 2 1991 84.0000000 90.0142087 + 226 11 2 1991 78.0000000 88.1675351 + 227 12 2 1991 79.0000000 86.4337312 + 228 13 2 1991 77.0000000 84.8015141 + 229 14 2 1991 80.0000000 83.2609032 + 230 15 2 1991 72.0000000 81.8030547 + 231 16 2 1991 78.0000000 80.7827974 + 232 17 2 1991 74.0000000 81.1967277 + 233 18 2 1991 77.0000000 80.3459983 + 234 19 2 1991 73.0000000 81.7460755 + 235 20 2 1991 69.0000000 93.9165863 + 236 21 2 1991 74.0000000 112.8213612 + 237 22 2 1991 81.0000000 134.9511571 + 238 23 2 1991 110.0000000 141.2593893 + 239 24 2 1991 180.0000000 139.8683347 + 240 25 2 1991 213.0000000 136.4041237 + 241 26 2 1991 222.0000000 133.8616588 + 242 27 2 1991 208.0000000 133.2660146 + 243 28 2 1991 211.0000000 134.5502247 + 244 1 3 1991 214.0000000 130.2066948 + 245 2 3 1991 208.0000000 130.6541314 + 246 3 3 1991 221.0000000 132.2907351 + 247 4 3 1991 281.0000000 128.6579274 + 248 5 3 1991 219.0000000 122.4228168 + 249 6 3 1991 190.0000000 117.0878848 + 250 7 3 1991 173.0000000 112.4573743 + 251 8 3 1991 164.0000000 108.2436986 + 252 9 3 1991 142.0000000 104.6968258 + 253 10 3 1991 133.0000000 101.9697562 + 254 11 3 1991 133.0000000 100.5638744 + 255 12 3 1991 118.0000000 98.4615134 + 256 13 3 1991 127.0000000 95.4356590 + 257 14 3 1991 113.0000000 92.5342414 + 258 15 3 1991 107.0000000 89.8921247 + 259 16 3 1991 100.0000000 87.4597991 + 260 17 3 1991 100.0000000 85.2125285 + 261 18 3 1991 95.0000000 83.1485002 + 262 19 3 1991 98.0000000 104.7499269 + 263 20 3 1991 119.0000000 137.0676138 + 264 21 3 1991 159.0000000 143.7912494 + 265 22 3 1991 196.0000000 157.2875630 + 266 23 3 1991 242.0000000 159.4359540 + 267 24 3 1991 216.0000000 150.4832021 + 268 25 3 1991 180.0000000 139.7852906 + 269 26 3 1991 145.0000000 131.6588630 + 270 27 3 1991 127.0000000 124.9740489 + 271 28 3 1991 117.0000000 119.1724090 + 272 29 3 1991 109.0000000 113.8182405 + 273 30 3 1991 106.0000000 108.8974885 + 274 31 3 1991 99.0000000 104.4558609 + 275 1 4 1991 96.0000000 100.4409926 + 276 2 4 1991 88.0000000 96.7998092 + 277 3 4 1991 87.0000000 93.4870707 + 278 4 4 1991 82.0000000 90.6350217 + 279 5 4 1991 84.0000000 88.3519537 + 280 6 4 1991 67.0000000 86.1028770 + 281 7 4 1991 89.0000000 83.8335626 + 282 8 4 1991 75.0000000 81.7571310 + 283 9 4 1991 79.0000000 79.7346620 + 284 10 4 1991 70.0000000 77.7922636 + 285 11 4 1991 69.0000000 75.9738570 + 286 12 4 1991 69.0000000 74.2779192 + 287 13 4 1991 56.0000000 72.6926043 + 288 14 4 1991 63.0000000 71.2067557 + 289 15 4 1991 58.0000000 69.8112168 + 290 16 4 1991 56.0000000 68.4978342 + 291 17 4 1991 54.0000000 67.2559557 + 292 18 4 1991 57.0000000 66.0963571 + 293 19 4 1991 53.0000000 65.1656110 + 294 20 4 1991 53.0000000 64.5491036 + 295 21 4 1991 65.0000000 63.7123419 + 296 22 4 1991 69.0000000 63.9759691 + 297 23 4 1991 61.0000000 63.4424244 + 298 24 4 1991 56.0000000 63.0037571 + 299 25 4 1991 56.0000000 62.0995167 + 300 26 4 1991 53.0000000 60.7734619 + 301 27 4 1991 49.0000000 59.7614108 + 302 28 4 1991 53.0000000 58.8523004 + 303 29 4 1991 48.0000000 60.5267947 + 304 30 4 1991 57.0000000 74.9840514 + 305 1 5 1991 69.0000000 90.3717502 + 306 2 5 1991 89.0000000 83.7001402 + 307 3 5 1991 105.0000000 72.9074248 + 308 4 5 1991 79.0000000 68.8273723 + 309 5 5 1991 69.0000000 66.8284385 + 310 6 5 1991 71.0000000 65.1940001 + 311 7 5 1991 60.0000000 63.7649353 + 312 8 5 1991 64.0000000 62.3429821 + 313 9 5 1991 59.0000000 60.9615811 + 314 10 5 1991 57.0000000 59.7303347 + 315 11 5 1991 55.0000000 60.0462662 + 316 12 5 1991 53.0000000 61.1947399 + 317 13 5 1991 52.0000000 59.1813240 + 318 14 5 1991 50.0000000 57.4677919 + 319 15 5 1991 52.0000000 56.6790685 + 320 16 5 1991 54.0000000 59.4094037 + 321 17 5 1991 54.0000000 60.5687228 + 322 18 5 1991 55.0000000 57.3835870 + 323 19 5 1991 48.0000000 55.5871237 + 324 20 5 1991 48.0000000 54.5298124 + 325 21 5 1991 49.0000000 53.5837733 + 326 22 5 1991 41.0000000 52.6850320 + 327 23 5 1991 40.0000000 51.8274603 + 328 24 5 1991 40.0000000 51.0076332 + 329 25 5 1991 39.0000000 50.2225029 + 330 26 5 1991 43.0000000 49.4693103 + 331 27 5 1991 39.0000000 48.7455549 + 332 28 5 1991 36.0000000 48.0489688 + 333 29 5 1991 33.0000000 47.3774932 + 334 30 5 1991 39.0000000 46.7292575 + 335 31 5 1991 34.0000000 46.1025611 + 336 1 6 1991 37.0000000 45.4958567 + 337 2 6 1991 35.0000000 44.9077351 + 338 3 6 1991 29.0000000 44.3369123 + 339 4 6 1991 33.0000000 43.7822174 + 340 5 6 1991 34.0000000 43.2432037 + 341 6 6 1991 32.0000000 50.8767457 + 342 7 6 1991 38.0000000 56.2423506 + 343 8 6 1991 39.0000000 49.7575512 + 344 9 6 1991 41.0000000 46.9714958 + 345 10 6 1991 44.0000000 50.4454970 + 346 11 6 1991 48.0000000 49.9246252 + 347 12 6 1991 42.0000000 44.7123797 + 348 13 6 1991 37.0000000 43.1855462 + 349 14 6 1991 39.0000000 42.4596959 + 350 15 6 1991 35.0000000 41.8201950 + 351 16 6 1991 31.0000000 41.7267638 + 352 17 6 1991 33.0000000 44.0955861 + 353 18 6 1991 31.0000000 45.9824929 + 354 19 6 1991 28.0000000 43.8909280 + 355 20 6 1991 60.0000000 54.0517131 + 356 21 6 1991 48.0000000 67.5555214 + 357 22 6 1991 54.0000000 53.0485479 + 358 23 6 1991 63.0000000 52.4258911 + 359 24 6 1991 41.0000000 52.2755408 + 360 25 6 1991 42.0000000 45.7061582 + 361 26 6 1991 43.0000000 43.9777853 + 362 27 6 1991 38.0000000 46.4719101 + 363 28 6 1991 38.0000000 48.8890030 + 364 29 6 1991 35.0000000 47.3811496 + 365 30 6 1991 41.0000000 44.4531293 diff --git a/check/case_09/output_save/b2_daily_discharge.out b/check/case_09/output_save/b2_daily_discharge.out deleted file mode 100644 index a74d7144..00000000 --- a/check/case_09/output_save/b2_daily_discharge.out +++ /dev/null @@ -1,1462 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 136.0144094 - 2 2 1 1990 129.0000000 125.3951075 - 3 3 1 1990 117.0000000 117.0044147 - 4 4 1 1990 111.0000000 109.6889657 - 5 5 1 1990 112.0000000 103.1919915 - 6 6 1 1990 93.0000000 97.4073814 - 7 7 1 1990 87.0000000 92.2859581 - 8 8 1 1990 84.0000000 87.6942785 - 9 9 1 1990 80.0000000 83.5222318 - 10 10 1 1990 78.0000000 79.7497446 - 11 11 1 1990 78.0000000 76.3356889 - 12 12 1 1990 77.0000000 73.2411694 - 13 13 1 1990 76.0000000 71.3933349 - 14 14 1 1990 73.0000000 72.0944151 - 15 15 1 1990 66.0000000 75.7822899 - 16 16 1 1990 76.0000000 79.0498860 - 17 17 1 1990 73.0000000 76.9433291 - 18 18 1 1990 71.0000000 78.0803124 - 19 19 1 1990 90.0000000 79.1191596 - 20 20 1 1990 82.0000000 79.1718542 - 21 21 1 1990 80.0000000 78.3223779 - 22 22 1 1990 81.0000000 74.8637164 - 23 23 1 1990 97.0000000 116.6877589 - 24 24 1 1990 198.0000000 181.2524600 - 25 25 1 1990 392.0000000 220.1118284 - 26 26 1 1990 519.0000000 266.5670801 - 27 27 1 1990 565.0000000 257.6709821 - 28 28 1 1990 331.0000000 229.6466057 - 29 29 1 1990 293.0000000 212.4752120 - 30 30 1 1990 302.0000000 203.2978974 - 31 31 1 1990 233.0000000 181.4961643 - 32 1 2 1990 198.0000000 168.9303682 - 33 2 2 1990 183.0000000 173.4183109 - 34 3 2 1990 206.0000000 180.5645762 - 35 4 2 1990 215.0000000 180.0493102 - 36 5 2 1990 183.0000000 163.4587660 - 37 6 2 1990 159.0000000 146.8741156 - 38 7 2 1990 167.0000000 134.2611475 - 39 8 2 1990 138.0000000 125.5879618 - 40 9 2 1990 126.0000000 122.9409927 - 41 10 2 1990 131.0000000 151.6981970 - 42 11 2 1990 173.0000000 219.5736298 - 43 12 2 1990 240.0000000 254.0941886 - 44 13 2 1990 270.0000000 320.7419492 - 45 14 2 1990 458.0000000 531.6067624 - 46 15 2 1990 996.0000000 859.3431665 - 47 16 2 1990 1370.0000000 1000.9095769 - 48 17 2 1990 1540.0000000 916.3369078 - 49 18 2 1990 1210.0000000 768.6516674 - 50 19 2 1990 616.0000000 633.2533826 - 51 20 2 1990 465.0000000 520.8552814 - 52 21 2 1990 373.0000000 429.4956422 - 53 22 2 1990 298.0000000 356.5167251 - 54 23 2 1990 270.0000000 299.9020167 - 55 24 2 1990 234.0000000 256.5345669 - 56 25 2 1990 218.0000000 227.2900686 - 57 26 2 1990 203.0000000 254.1536177 - 58 27 2 1990 314.0000000 373.4415736 - 59 28 2 1990 520.0000000 556.6362804 - 60 1 3 1990 689.0000000 736.9099132 - 61 2 3 1990 777.0000000 775.8742956 - 62 3 3 1990 584.0000000 683.2249674 - 63 4 3 1990 429.0000000 567.3394043 - 64 5 3 1990 365.0000000 469.0439364 - 65 6 3 1990 281.0000000 390.8799929 - 66 7 3 1990 257.0000000 327.9877167 - 67 8 3 1990 231.0000000 278.9790596 - 68 9 3 1990 211.0000000 242.7938131 - 69 10 3 1990 191.0000000 215.8381999 - 70 11 3 1990 182.0000000 195.2024017 - 71 12 3 1990 173.0000000 180.0276231 - 72 13 3 1990 159.0000000 169.2274303 - 73 14 3 1990 153.0000000 161.0600076 - 74 15 3 1990 141.0000000 154.8194491 - 75 16 3 1990 136.0000000 148.7549550 - 76 17 3 1990 130.0000000 142.4568576 - 77 18 3 1990 123.0000000 136.6711172 - 78 19 3 1990 115.0000000 131.4714723 - 79 20 3 1990 113.0000000 126.9672581 - 80 21 3 1990 102.0000000 123.3058715 - 81 22 3 1990 105.0000000 120.1390997 - 82 23 3 1990 106.0000000 117.1151445 - 83 24 3 1990 87.0000000 114.1029129 - 84 25 3 1990 80.0000000 111.3039010 - 85 26 3 1990 84.0000000 109.0886638 - 86 27 3 1990 82.0000000 106.5320646 - 87 28 3 1990 91.0000000 105.3997249 - 88 29 3 1990 97.0000000 112.9243716 - 89 30 3 1990 110.0000000 115.1077960 - 90 31 3 1990 97.0000000 110.7706783 - 91 1 4 1990 93.0000000 106.9504191 - 92 2 4 1990 85.0000000 103.9435753 - 93 3 4 1990 84.0000000 103.2243641 - 94 4 4 1990 81.0000000 107.2409696 - 95 5 4 1990 81.0000000 106.9400603 - 96 6 4 1990 76.0000000 103.0731871 - 97 7 4 1990 72.0000000 100.6666710 - 98 8 4 1990 68.0000000 98.3359962 - 99 9 4 1990 72.0000000 95.8851554 - 100 10 4 1990 65.0000000 93.7012467 - 101 11 4 1990 62.0000000 91.7886746 - 102 12 4 1990 62.0000000 90.7942820 - 103 13 4 1990 65.0000000 92.1827551 - 104 14 4 1990 68.0000000 103.4407981 - 105 15 4 1990 75.0000000 118.5302741 - 106 16 4 1990 90.0000000 117.5218478 - 107 17 4 1990 92.0000000 116.2639769 - 108 18 4 1990 94.0000000 114.5440902 - 109 19 4 1990 110.0000000 113.4695190 - 110 20 4 1990 99.0000000 109.3122629 - 111 21 4 1990 86.0000000 105.3444225 - 112 22 4 1990 86.0000000 105.8399025 - 113 23 4 1990 86.0000000 107.6784625 - 114 24 4 1990 88.0000000 108.1671325 - 115 25 4 1990 93.0000000 107.1837027 - 116 26 4 1990 99.0000000 103.2047273 - 117 27 4 1990 86.0000000 99.5835863 - 118 28 4 1990 74.0000000 96.9751541 - 119 29 4 1990 72.0000000 94.5370108 - 120 30 4 1990 77.0000000 91.9976800 - 121 1 5 1990 56.0000000 89.6123682 - 122 2 5 1990 64.0000000 87.4078955 - 123 3 5 1990 58.0000000 85.3581769 - 124 4 5 1990 50.0000000 83.4461149 - 125 5 5 1990 50.0000000 81.6576663 - 126 6 5 1990 50.0000000 79.9804679 - 127 7 5 1990 50.0000000 78.4052640 - 128 8 5 1990 53.0000000 77.0173127 - 129 9 5 1990 62.0000000 76.4448131 - 130 10 5 1990 64.0000000 78.4607241 - 131 11 5 1990 65.0000000 79.4192939 - 132 12 5 1990 75.0000000 77.3993821 - 133 13 5 1990 71.0000000 74.6348477 - 134 14 5 1990 63.0000000 72.9099013 - 135 15 5 1990 61.0000000 71.7142243 - 136 16 5 1990 49.0000000 70.8556044 - 137 17 5 1990 46.0000000 69.6978634 - 138 18 5 1990 46.0000000 68.4822661 - 139 19 5 1990 48.0000000 67.3676946 - 140 20 5 1990 41.0000000 66.3220799 - 141 21 5 1990 45.0000000 66.4630756 - 142 22 5 1990 52.0000000 70.7533988 - 143 23 5 1990 50.0000000 70.2919776 - 144 24 5 1990 56.0000000 72.4550469 - 145 25 5 1990 41.0000000 71.9245609 - 146 26 5 1990 40.0000000 69.6520521 - 147 27 5 1990 39.0000000 66.2428477 - 148 28 5 1990 39.0000000 64.5374943 - 149 29 5 1990 33.0000000 63.3518563 - 150 30 5 1990 37.0000000 62.2614449 - 151 31 5 1990 30.0000000 61.2282467 - 152 1 6 1990 37.0000000 66.8813735 - 153 2 6 1990 36.0000000 71.0226926 - 154 3 6 1990 40.0000000 80.0214259 - 155 4 6 1990 45.0000000 85.2955081 - 156 5 6 1990 39.0000000 72.2061811 - 157 6 6 1990 48.0000000 66.0954061 - 158 7 6 1990 39.0000000 77.2628924 - 159 8 6 1990 49.0000000 103.5556734 - 160 9 6 1990 84.0000000 103.3592074 - 161 10 6 1990 91.0000000 90.4214100 - 162 11 6 1990 80.0000000 83.9208672 - 163 12 6 1990 66.0000000 79.3224422 - 164 13 6 1990 53.0000000 76.0230686 - 165 14 6 1990 64.0000000 73.4751801 - 166 15 6 1990 55.0000000 71.1435084 - 167 16 6 1990 54.0000000 68.9891788 - 168 17 6 1990 42.0000000 67.0197524 - 169 18 6 1990 48.0000000 65.2114333 - 170 19 6 1990 48.0000000 68.8400535 - 171 20 6 1990 60.0000000 84.0581038 - 172 21 6 1990 75.0000000 88.4991629 - 173 22 6 1990 78.0000000 82.2946952 - 174 23 6 1990 66.0000000 76.1378128 - 175 24 6 1990 63.0000000 71.2803847 - 176 25 6 1990 52.0000000 68.5182768 - 177 26 6 1990 49.0000000 66.4517236 - 178 27 6 1990 44.0000000 67.8510209 - 179 28 6 1990 51.0000000 68.7975762 - 180 29 6 1990 61.0000000 77.0187192 - 181 30 6 1990 81.0000000 104.3313563 - 182 1 7 1990 79.0000000 108.5468902 - 183 2 7 1990 92.0000000 88.5792307 - 184 3 7 1990 72.0000000 80.7983723 - 185 4 7 1990 58.0000000 85.2392148 - 186 5 7 1990 69.0000000 106.1923670 - 187 6 7 1990 94.0000000 111.1422555 - 188 7 7 1990 199.0000000 104.3009250 - 189 8 7 1990 133.0000000 103.7555315 - 190 9 7 1990 124.0000000 97.8639425 - 191 10 7 1990 123.0000000 90.4968194 - 192 11 7 1990 99.0000000 85.6469653 - 193 12 7 1990 88.0000000 81.8800207 - 194 13 7 1990 84.0000000 78.5231169 - 195 14 7 1990 72.0000000 75.4823953 - 196 15 7 1990 55.0000000 72.7184442 - 197 16 7 1990 65.0000000 70.1986989 - 198 17 7 1990 50.0000000 67.8949616 - 199 18 7 1990 50.0000000 65.7827220 - 200 19 7 1990 46.0000000 63.8406190 - 201 20 7 1990 44.0000000 62.0499907 - 202 21 7 1990 42.0000000 60.3944950 - 203 22 7 1990 37.0000000 58.8597889 - 204 23 7 1990 38.0000000 57.4332580 - 205 24 7 1990 44.0000000 56.1037846 - 206 25 7 1990 30.0000000 54.8615520 - 207 26 7 1990 26.0000000 53.6978753 - 208 27 7 1990 31.0000000 52.6050581 - 209 28 7 1990 33.0000000 54.4511076 - 210 29 7 1990 42.0000000 53.6686176 - 211 30 7 1990 36.0000000 50.3116811 - 212 31 7 1990 34.0000000 49.2754760 - 213 1 8 1990 25.0000000 48.4103285 - 214 2 8 1990 22.0000000 47.5901609 - 215 3 8 1990 28.0000000 46.8092669 - 216 4 8 1990 25.0000000 46.0641918 - 217 5 8 1990 19.0000000 45.3518549 - 218 6 8 1990 22.0000000 44.6695945 - 219 7 8 1990 19.0000000 44.0151662 - 220 8 8 1990 22.0000000 43.3858215 - 221 9 8 1990 19.0000000 42.7794307 - 222 10 8 1990 20.0000000 42.1944056 - 223 11 8 1990 19.0000000 41.6291528 - 224 12 8 1990 19.0000000 41.0821909 - 225 13 8 1990 22.0000000 42.3021320 - 226 14 8 1990 36.0000000 54.2618839 - 227 15 8 1990 31.0000000 63.9541498 - 228 16 8 1990 30.0000000 55.9714852 - 229 17 8 1990 28.0000000 48.6113516 - 230 18 8 1990 34.0000000 44.7930100 - 231 19 8 1990 21.0000000 41.8954994 - 232 20 8 1990 30.0000000 40.7483819 - 233 21 8 1990 22.0000000 40.0421389 - 234 22 8 1990 21.0000000 39.3972825 - 235 23 8 1990 23.0000000 38.7828495 - 236 24 8 1990 20.0000000 38.1952438 - 237 25 8 1990 29.0000000 37.6329576 - 238 26 8 1990 20.0000000 37.1215998 - 239 27 8 1990 22.0000000 36.9886622 - 240 28 8 1990 23.0000000 37.4390158 - 241 29 8 1990 35.0000000 36.8077400 - 242 30 8 1990 51.0000000 68.6168863 - 243 31 8 1990 80.0000000 122.4655355 - 244 1 9 1990 56.0000000 87.6819160 - 245 2 9 1990 33.0000000 56.5194389 - 246 3 9 1990 27.0000000 50.3820597 - 247 4 9 1990 27.0000000 48.4741006 - 248 5 9 1990 28.0000000 49.8195634 - 249 6 9 1990 26.0000000 49.8843522 - 250 7 9 1990 24.0000000 47.5393707 - 251 8 9 1990 33.0000000 46.8486741 - 252 9 9 1990 26.0000000 43.9843675 - 253 10 9 1990 27.0000000 42.2941225 - 254 11 9 1990 22.0000000 41.0803819 - 255 12 9 1990 22.0000000 39.9994074 - 256 13 9 1990 21.0000000 38.9997145 - 257 14 9 1990 22.0000000 38.0706135 - 258 15 9 1990 22.0000000 37.2046850 - 259 16 9 1990 22.0000000 36.3954523 - 260 17 9 1990 20.0000000 35.6371983 - 261 18 9 1990 22.0000000 34.9248660 - 262 19 9 1990 16.0000000 34.2539748 - 263 20 9 1990 22.0000000 33.6205483 - 264 21 9 1990 19.0000000 35.0314976 - 265 22 9 1990 32.0000000 63.4775559 - 266 23 9 1990 27.0000000 89.5197881 - 267 24 9 1990 45.0000000 78.5166869 - 268 25 9 1990 42.0000000 59.7995176 - 269 26 9 1990 39.0000000 48.6236176 - 270 27 9 1990 30.0000000 45.7059913 - 271 28 9 1990 28.0000000 43.9870384 - 272 29 9 1990 30.0000000 42.4708053 - 273 30 9 1990 30.0000000 55.4791653 - 274 1 10 1990 56.0000000 101.4770743 - 275 2 10 1990 72.0000000 121.4542268 - 276 3 10 1990 73.0000000 108.8091758 - 277 4 10 1990 68.0000000 105.3749960 - 278 5 10 1990 53.0000000 92.4780639 - 279 6 10 1990 42.0000000 84.4559737 - 280 7 10 1990 33.0000000 78.1273789 - 281 8 10 1990 42.0000000 73.2712461 - 282 9 10 1990 34.0000000 69.2050893 - 283 10 10 1990 36.0000000 65.5875191 - 284 11 10 1990 36.0000000 62.3358753 - 285 12 10 1990 28.0000000 59.4060422 - 286 13 10 1990 32.0000000 56.7597398 - 287 14 10 1990 27.0000000 54.3631423 - 288 15 10 1990 35.0000000 52.2990290 - 289 16 10 1990 42.0000000 51.9180471 - 290 17 10 1990 35.0000000 52.7703280 - 291 18 10 1990 39.0000000 58.0477404 - 292 19 10 1990 34.0000000 56.6095499 - 293 20 10 1990 32.0000000 51.2564977 - 294 21 10 1990 34.0000000 48.6373962 - 295 22 10 1990 27.0000000 46.8960955 - 296 23 10 1990 31.0000000 45.3500292 - 297 24 10 1990 28.0000000 43.9311949 - 298 25 10 1990 25.0000000 42.8769814 - 299 26 10 1990 29.0000000 48.8756649 - 300 27 10 1990 31.0000000 63.6414311 - 301 28 10 1990 65.0000000 124.9670753 - 302 29 10 1990 69.0000000 191.1031806 - 303 30 10 1990 157.0000000 186.9910169 - 304 31 10 1990 190.0000000 164.8771132 - 305 1 11 1990 115.0000000 151.5199262 - 306 2 11 1990 104.0000000 150.2302981 - 307 3 11 1990 100.0000000 153.5154254 - 308 4 11 1990 131.0000000 159.3067584 - 309 5 11 1990 130.0000000 160.4103280 - 310 6 11 1990 115.0000000 153.2758323 - 311 7 11 1990 102.0000000 138.7292216 - 312 8 11 1990 95.0000000 123.2685115 - 313 9 11 1990 81.0000000 109.6739066 - 314 10 11 1990 66.0000000 105.1825232 - 315 11 11 1990 67.0000000 118.1348563 - 316 12 11 1990 74.0000000 131.7686073 - 317 13 11 1990 109.0000000 142.3746187 - 318 14 11 1990 92.0000000 150.2080649 - 319 15 11 1990 92.0000000 162.0178879 - 320 16 11 1990 155.0000000 168.3282227 - 321 17 11 1990 159.0000000 165.8024054 - 322 18 11 1990 131.0000000 164.5945741 - 323 19 11 1990 161.0000000 172.3158470 - 324 20 11 1990 196.0000000 211.2916319 - 325 21 11 1990 336.0000000 292.6206718 - 326 22 11 1990 566.0000000 321.4917741 - 327 23 11 1990 373.0000000 318.6560986 - 328 24 11 1990 293.0000000 322.1840490 - 329 25 11 1990 264.0000000 311.3484968 - 330 26 11 1990 226.0000000 289.3419240 - 331 27 11 1990 201.0000000 257.1606811 - 332 28 11 1990 180.0000000 223.6869898 - 333 29 11 1990 161.0000000 199.4424867 - 334 30 11 1990 149.0000000 185.3184655 - 335 1 12 1990 134.0000000 167.9741794 - 336 2 12 1990 113.0000000 150.8435173 - 337 3 12 1990 99.0000000 137.0577776 - 338 4 12 1990 107.0000000 127.6384989 - 339 5 12 1990 99.0000000 120.3973574 - 340 6 12 1990 89.0000000 114.0355492 - 341 7 12 1990 77.0000000 108.3401434 - 342 8 12 1990 71.0000000 103.2161078 - 343 9 12 1990 68.0000000 98.6022979 - 344 10 12 1990 73.0000000 94.4367545 - 345 11 12 1990 84.0000000 90.6650105 - 346 12 12 1990 88.0000000 96.5638127 - 347 13 12 1990 92.0000000 110.3594426 - 348 14 12 1990 128.0000000 107.5229768 - 349 15 12 1990 136.0000000 100.4886298 - 350 16 12 1990 114.0000000 95.2570578 - 351 17 12 1990 101.0000000 91.0374423 - 352 18 12 1990 93.0000000 87.2604340 - 353 19 12 1990 85.0000000 83.8512853 - 354 20 12 1990 81.0000000 80.7638048 - 355 21 12 1990 106.0000000 96.0144120 - 356 22 12 1990 159.0000000 130.4529203 - 357 23 12 1990 250.0000000 145.9238022 - 358 24 12 1990 298.0000000 146.5806456 - 359 25 12 1990 261.0000000 156.3742597 - 360 26 12 1990 228.0000000 225.9094782 - 361 27 12 1990 409.0000000 312.6200006 - 362 28 12 1990 486.0000000 367.6407630 - 363 29 12 1990 440.0000000 425.3214210 - 364 30 12 1990 486.0000000 521.3148574 - 365 31 12 1990 774.0000000 603.1279749 - 366 1 1 1991 889.0000000 699.9256509 - 367 2 1 1991 863.0000000 776.7635460 - 368 3 1 1991 875.0000000 846.2140297 - 369 4 1 1991 932.0000000 849.5953464 - 370 5 1 1991 826.0000000 788.5431666 - 371 6 1 1991 731.0000000 739.4964315 - 372 7 1 1991 613.0000000 680.9482615 - 373 8 1 1991 610.0000000 655.3473776 - 374 9 1 1991 686.0000000 633.5310657 - 375 10 1 1991 556.0000000 619.1021749 - 376 11 1 1991 669.0000000 647.7847310 - 377 12 1 1991 828.0000000 636.0621380 - 378 13 1 1991 735.0000000 577.6957795 - 379 14 1 1991 513.0000000 488.4005615 - 380 15 1 1991 411.0000000 405.4134907 - 381 16 1 1991 345.0000000 337.6312257 - 382 17 1 1991 293.0000000 284.2492322 - 383 18 1 1991 251.0000000 245.2438997 - 384 19 1 1991 222.0000000 217.3527033 - 385 20 1 1991 215.0000000 197.4380296 - 386 21 1 1991 213.0000000 184.3628842 - 387 22 1 1991 202.0000000 181.9734620 - 388 23 1 1991 200.0000000 177.7620319 - 389 24 1 1991 192.0000000 169.5053062 - 390 25 1 1991 176.0000000 161.0934122 - 391 26 1 1991 164.0000000 153.4720134 - 392 27 1 1991 157.0000000 146.5195704 - 393 28 1 1991 134.0000000 140.2299767 - 394 29 1 1991 130.0000000 134.5707184 - 395 30 1 1991 119.0000000 129.4627560 - 396 31 1 1991 107.0000000 124.8368142 - 397 1 2 1991 112.0000000 120.6334336 - 398 2 2 1991 109.0000000 116.8014418 - 399 3 2 1991 101.0000000 113.2966717 - 400 4 2 1991 98.0000000 110.0808979 - 401 5 2 1991 84.0000000 107.1209505 - 402 6 2 1991 93.0000000 104.3879755 - 403 7 2 1991 80.0000000 101.8568126 - 404 8 2 1991 73.0000000 99.5054731 - 405 9 2 1991 89.0000000 97.3146981 - 406 10 2 1991 84.0000000 95.2675842 - 407 11 2 1991 78.0000000 93.3492663 - 408 12 2 1991 79.0000000 91.5466460 - 409 13 2 1991 77.0000000 89.8481610 - 410 14 2 1991 80.0000000 88.2435863 - 411 15 2 1991 72.0000000 86.7238646 - 412 16 2 1991 78.0000000 85.6518752 - 413 17 2 1991 74.0000000 86.0677565 - 414 18 2 1991 77.0000000 85.1897080 - 415 19 2 1991 73.0000000 86.5531682 - 416 20 2 1991 69.0000000 98.9122627 - 417 21 2 1991 74.0000000 118.2106299 - 418 22 2 1991 81.0000000 140.9585127 - 419 23 2 1991 110.0000000 147.6475516 - 420 24 2 1991 180.0000000 146.2200222 - 421 25 2 1991 213.0000000 142.5479163 - 422 26 2 1991 222.0000000 139.7941183 - 423 27 2 1991 208.0000000 139.0201215 - 424 28 2 1991 211.0000000 140.2406340 - 425 1 3 1991 214.0000000 135.7946271 - 426 2 3 1991 208.0000000 136.1741964 - 427 3 3 1991 221.0000000 137.8550923 - 428 4 3 1991 281.0000000 134.1754063 - 429 5 3 1991 219.0000000 127.7774893 - 430 6 3 1991 190.0000000 122.2741206 - 431 7 3 1991 173.0000000 117.4911791 - 432 8 3 1991 164.0000000 113.1387346 - 433 9 3 1991 142.0000000 109.4705345 - 434 10 3 1991 133.0000000 106.6443039 - 435 11 3 1991 133.0000000 105.1648787 - 436 12 3 1991 118.0000000 102.9791558 - 437 13 3 1991 127.0000000 99.8567504 - 438 14 3 1991 113.0000000 96.8622331 - 439 15 3 1991 107.0000000 94.1335001 - 440 16 3 1991 100.0000000 91.6205027 - 441 17 3 1991 100.0000000 89.2978355 - 442 18 3 1991 95.0000000 87.1634731 - 443 19 3 1991 98.0000000 108.8190233 - 444 20 3 1991 119.0000000 141.7336670 - 445 21 3 1991 159.0000000 148.9549421 - 446 22 3 1991 196.0000000 162.8695165 - 447 23 3 1991 242.0000000 165.2218242 - 448 24 3 1991 216.0000000 156.0705466 - 449 25 3 1991 180.0000000 145.0335975 - 450 26 3 1991 145.0000000 136.6577002 - 451 27 3 1991 127.0000000 129.7664974 - 452 28 3 1991 117.0000000 123.7838067 - 453 29 3 1991 109.0000000 118.2659205 - 454 30 3 1991 106.0000000 113.1977157 - 455 31 3 1991 99.0000000 108.6234736 - 456 1 4 1991 96.0000000 104.4888292 - 457 2 4 1991 88.0000000 100.7389459 - 458 3 4 1991 87.0000000 97.3270931 - 459 4 4 1991 82.0000000 94.3879984 - 460 5 4 1991 84.0000000 92.0345477 - 461 6 4 1991 67.0000000 89.7135406 - 462 7 4 1991 89.0000000 87.3729958 - 463 8 4 1991 75.0000000 85.2337239 - 464 9 4 1991 79.0000000 83.1492119 - 465 10 4 1991 70.0000000 81.1458869 - 466 11 4 1991 69.0000000 79.2697095 - 467 12 4 1991 69.0000000 77.5192629 - 468 13 4 1991 56.0000000 75.8823731 - 469 14 4 1991 63.0000000 74.3475676 - 470 15 4 1991 58.0000000 72.9054138 - 471 16 4 1991 56.0000000 71.5475179 - 472 17 4 1991 54.0000000 70.2630163 - 473 18 4 1991 57.0000000 69.0630730 - 474 19 4 1991 53.0000000 68.0965496 - 475 20 4 1991 53.0000000 67.4529465 - 476 21 4 1991 65.0000000 66.5851150 - 477 22 4 1991 69.0000000 66.8166336 - 478 23 4 1991 61.0000000 66.2623882 - 479 24 4 1991 56.0000000 65.7997750 - 480 25 4 1991 56.0000000 64.8624702 - 481 26 4 1991 53.0000000 63.5011959 - 482 27 4 1991 49.0000000 62.4546110 - 483 28 4 1991 53.0000000 61.5120202 - 484 29 4 1991 48.0000000 63.1606212 - 485 30 4 1991 57.0000000 77.6419751 - 486 1 5 1991 69.0000000 93.1722464 - 487 2 5 1991 89.0000000 86.5903865 - 488 3 5 1991 105.0000000 75.7625000 - 489 4 5 1991 79.0000000 71.6225321 - 490 5 5 1991 69.0000000 69.5661686 - 491 6 5 1991 71.0000000 67.8781572 - 492 7 5 1991 60.0000000 66.3990009 - 493 8 5 1991 64.0000000 64.9300602 - 494 9 5 1991 59.0000000 63.5044062 - 495 10 5 1991 57.0000000 62.2313823 - 496 11 5 1991 55.0000000 62.5089582 - 497 12 5 1991 53.0000000 63.6239404 - 498 13 5 1991 52.0000000 61.5771098 - 499 14 5 1991 50.0000000 59.8299998 - 500 15 5 1991 52.0000000 59.0111671 - 501 16 5 1991 54.0000000 61.7180214 - 502 17 5 1991 54.0000000 62.8548604 - 503 18 5 1991 55.0000000 59.6414605 - 504 19 5 1991 48.0000000 57.8149545 - 505 20 5 1991 48.0000000 56.7283508 - 506 21 5 1991 49.0000000 55.7539972 - 507 22 5 1991 41.0000000 54.8278508 - 508 23 5 1991 40.0000000 53.9437085 - 509 24 5 1991 40.0000000 53.0980787 - 510 25 5 1991 39.0000000 52.2878542 - 511 26 5 1991 43.0000000 51.5102226 - 512 27 5 1991 39.0000000 50.7626359 - 513 28 5 1991 36.0000000 50.0427836 - 514 29 5 1991 33.0000000 49.3485686 - 515 30 5 1991 39.0000000 48.6780860 - 516 31 5 1991 34.0000000 48.0296042 - 517 1 6 1991 37.0000000 47.4015479 - 518 2 6 1991 35.0000000 46.7924828 - 519 3 6 1991 29.0000000 46.2011020 - 520 4 6 1991 33.0000000 45.6262141 - 521 5 6 1991 34.0000000 45.0673575 - 522 6 6 1991 32.0000000 52.6868769 - 523 7 6 1991 38.0000000 58.0606411 - 524 8 6 1991 39.0000000 51.5779958 - 525 9 6 1991 41.0000000 48.7774550 - 526 10 6 1991 44.0000000 52.2410579 - 527 11 6 1991 48.0000000 51.7182553 - 528 12 6 1991 42.0000000 46.4890368 - 529 13 6 1991 37.0000000 44.9387419 - 530 14 6 1991 39.0000000 44.1898183 - 531 15 6 1991 35.0000000 43.5279178 - 532 16 6 1991 31.0000000 43.4128193 - 533 17 6 1991 33.0000000 45.7620620 - 534 18 6 1991 31.0000000 47.6329227 - 535 19 6 1991 28.0000000 45.5246324 - 536 20 6 1991 60.0000000 55.6771342 - 537 21 6 1991 48.0000000 69.2325179 - 538 22 6 1991 54.0000000 54.7604236 - 539 23 6 1991 63.0000000 54.1331276 - 540 24 6 1991 41.0000000 53.9892721 - 541 25 6 1991 42.0000000 47.4020410 - 542 26 6 1991 43.0000000 45.6419334 - 543 27 6 1991 38.0000000 48.1099553 - 544 28 6 1991 38.0000000 50.5198591 - 545 29 6 1991 35.0000000 48.9995657 - 546 30 6 1991 41.0000000 46.0470121 - 547 1 7 1991 41.0000000 43.9970551 - 548 2 7 1991 38.0000000 42.8460233 - 549 3 7 1991 34.0000000 41.9576924 - 550 4 7 1991 27.0000000 41.1375121 - 551 5 7 1991 31.0000000 40.3639244 - 552 6 7 1991 30.0000000 39.6320596 - 553 7 7 1991 26.0000000 41.4185259 - 554 8 7 1991 30.0000000 46.2018821 - 555 9 7 1991 31.0000000 41.8604380 - 556 10 7 1991 23.0000000 38.8613434 - 557 11 7 1991 35.0000000 37.8837873 - 558 12 7 1991 19.0000000 37.2610357 - 559 13 7 1991 24.0000000 47.4695679 - 560 14 7 1991 26.0000000 61.3131854 - 561 15 7 1991 27.0000000 51.1678505 - 562 16 7 1991 41.0000000 42.6800657 - 563 17 7 1991 34.0000000 39.7538837 - 564 18 7 1991 27.0000000 38.5838100 - 565 19 7 1991 25.0000000 37.7610527 - 566 20 7 1991 23.0000000 37.0072781 - 567 21 7 1991 22.0000000 36.2972461 - 568 22 7 1991 27.0000000 35.6262332 - 569 23 7 1991 23.0000000 34.9906345 - 570 24 7 1991 21.0000000 34.4893501 - 571 25 7 1991 23.0000000 42.7959275 - 572 26 7 1991 33.0000000 50.1964887 - 573 27 7 1991 23.0000000 43.9684747 - 574 28 7 1991 29.0000000 37.5267105 - 575 29 7 1991 30.0000000 35.2752550 - 576 30 7 1991 35.0000000 39.6966385 - 577 31 7 1991 27.0000000 45.7447587 - 578 1 8 1991 45.0000000 43.6701892 - 579 2 8 1991 47.0000000 37.2528994 - 580 3 8 1991 40.0000000 35.0508695 - 581 4 8 1991 35.0000000 34.2104481 - 582 5 8 1991 26.0000000 33.5169215 - 583 6 8 1991 23.0000000 32.8667823 - 584 7 8 1991 30.0000000 35.4676000 - 585 8 8 1991 33.0000000 36.6782819 - 586 9 8 1991 30.0000000 33.1001148 - 587 10 8 1991 28.0000000 31.2630572 - 588 11 8 1991 19.0000000 30.6621334 - 589 12 8 1991 20.0000000 30.1411964 - 590 13 8 1991 16.0000000 29.6459033 - 591 14 8 1991 18.0000000 29.1732092 - 592 15 8 1991 18.0000000 28.7211788 - 593 16 8 1991 20.0000000 28.2880821 - 594 17 8 1991 16.0000000 27.8723631 - 595 18 8 1991 15.0000000 27.4726201 - 596 19 8 1991 15.0000000 27.0875893 - 597 20 8 1991 14.0000000 26.7161298 - 598 21 8 1991 15.0000000 26.3572101 - 599 22 8 1991 13.0000000 26.0100082 - 600 23 8 1991 12.0000000 25.6919933 - 601 24 8 1991 11.0000000 25.6031526 - 602 25 8 1991 12.0000000 25.2647223 - 603 26 8 1991 11.0000000 24.7978738 - 604 27 8 1991 13.0000000 24.4573647 - 605 28 8 1991 11.0000000 24.1592344 - 606 29 8 1991 12.0000000 23.8716469 - 607 30 8 1991 12.0000000 23.5909909 - 608 31 8 1991 11.0000000 23.3167151 - 609 1 9 1991 11.0000000 23.2730730 - 610 2 9 1991 17.0000000 25.2879062 - 611 3 9 1991 11.0000000 24.9214298 - 612 4 9 1991 12.0000000 22.8743332 - 613 5 9 1991 11.0000000 22.2549679 - 614 6 9 1991 11.0000000 21.9763848 - 615 7 9 1991 18.0000000 21.7259043 - 616 8 9 1991 11.0000000 21.4812597 - 617 9 9 1991 13.0000000 21.2414210 - 618 10 9 1991 12.0000000 21.0480514 - 619 11 9 1991 11.0000000 26.8240071 - 620 12 9 1991 20.0000000 49.4995229 - 621 13 9 1991 21.0000000 39.7327227 - 622 14 9 1991 29.0000000 25.6218118 - 623 15 9 1991 28.0000000 22.7209618 - 624 16 9 1991 20.0000000 22.1755684 - 625 17 9 1991 20.0000000 21.8032502 - 626 18 9 1991 20.0000000 21.4532059 - 627 19 9 1991 12.0000000 21.1189499 - 628 20 9 1991 11.0000000 20.7990242 - 629 21 9 1991 11.0000000 20.4922142 - 630 22 9 1991 22.0000000 22.9057136 - 631 23 9 1991 14.0000000 39.8809656 - 632 24 9 1991 48.0000000 36.7292457 - 633 25 9 1991 45.0000000 48.0448883 - 634 26 9 1991 80.0000000 76.4957278 - 635 27 9 1991 61.0000000 67.2930139 - 636 28 9 1991 61.0000000 75.0493709 - 637 29 9 1991 65.0000000 83.5729735 - 638 30 9 1991 63.0000000 77.8287751 - 639 1 10 1991 90.0000000 68.5348684 - 640 2 10 1991 59.0000000 57.2965990 - 641 3 10 1991 45.0000000 52.2027609 - 642 4 10 1991 42.0000000 48.8614124 - 643 5 10 1991 41.0000000 60.0177255 - 644 6 10 1991 41.0000000 90.2681193 - 645 7 10 1991 73.0000000 83.5320820 - 646 8 10 1991 96.0000000 67.0342306 - 647 9 10 1991 61.0000000 59.9526104 - 648 10 10 1991 44.0000000 55.8929058 - 649 11 10 1991 42.0000000 52.5332021 - 650 12 10 1991 41.0000000 56.2852833 - 651 13 10 1991 42.0000000 67.5067355 - 652 14 10 1991 61.0000000 65.2506417 - 653 15 10 1991 55.0000000 55.9361109 - 654 16 10 1991 41.0000000 53.8913430 - 655 17 10 1991 48.0000000 58.6148960 - 656 18 10 1991 52.0000000 74.0076869 - 657 19 10 1991 66.0000000 82.3442286 - 658 20 10 1991 59.0000000 69.5240174 - 659 21 10 1991 71.0000000 63.3972589 - 660 22 10 1991 74.0000000 59.4817709 - 661 23 10 1991 70.0000000 55.6849602 - 662 24 10 1991 59.0000000 52.5750599 - 663 25 10 1991 57.0000000 49.9170307 - 664 26 10 1991 57.0000000 47.5570128 - 665 27 10 1991 51.0000000 45.4272194 - 666 28 10 1991 47.0000000 43.4955359 - 667 29 10 1991 48.0000000 41.7390187 - 668 30 10 1991 45.0000000 40.7361179 - 669 31 10 1991 43.0000000 44.4967674 - 670 1 11 1991 40.0000000 51.7441420 - 671 2 11 1991 47.0000000 56.7048959 - 672 3 11 1991 46.0000000 61.7016082 - 673 4 11 1991 76.0000000 93.6009986 - 674 5 11 1991 60.0000000 111.8725454 - 675 6 11 1991 132.0000000 102.1874999 - 676 7 11 1991 133.0000000 101.6458996 - 677 8 11 1991 113.0000000 112.3633427 - 678 9 11 1991 120.0000000 123.9360637 - 679 10 11 1991 141.0000000 125.1092483 - 680 11 11 1991 208.0000000 133.6407784 - 681 12 11 1991 166.0000000 172.9359460 - 682 13 11 1991 183.0000000 207.4405242 - 683 14 11 1991 299.0000000 281.7741127 - 684 15 11 1991 521.0000000 369.8508794 - 685 16 11 1991 443.0000000 361.5792952 - 686 17 11 1991 304.0000000 318.9690325 - 687 18 11 1991 231.0000000 287.7908161 - 688 19 11 1991 192.0000000 272.9661743 - 689 20 11 1991 199.0000000 258.3612659 - 690 21 11 1991 201.0000000 240.3900811 - 691 22 11 1991 173.0000000 219.1502007 - 692 23 11 1991 159.0000000 191.3677807 - 693 24 11 1991 160.0000000 166.7901062 - 694 25 11 1991 146.0000000 147.3533350 - 695 26 11 1991 110.0000000 131.0969587 - 696 27 11 1991 114.0000000 117.5446289 - 697 28 11 1991 97.0000000 107.7929507 - 698 29 11 1991 89.0000000 101.1327938 - 699 30 11 1991 73.0000000 95.7291516 - 700 1 12 1991 69.0000000 90.9446247 - 701 2 12 1991 67.0000000 86.6408198 - 702 3 12 1991 63.0000000 82.7553442 - 703 4 12 1991 58.0000000 79.2379892 - 704 5 12 1991 59.0000000 76.0454413 - 705 6 12 1991 53.0000000 73.1401245 - 706 7 12 1991 54.0000000 70.4893522 - 707 8 12 1991 51.0000000 68.0646190 - 708 9 12 1991 47.0000000 65.8410065 - 709 10 12 1991 42.0000000 63.7966826 - 710 11 12 1991 40.0000000 61.9124773 - 711 12 12 1991 39.0000000 60.1715237 - 712 13 12 1991 36.0000000 58.5589522 - 713 14 12 1991 37.0000000 57.0616290 - 714 15 12 1991 32.0000000 55.6679326 - 715 16 12 1991 37.0000000 55.6255963 - 716 17 12 1991 62.0000000 106.9159081 - 717 18 12 1991 118.0000000 161.7178525 - 718 19 12 1991 170.0000000 213.6047946 - 719 20 12 1991 229.0000000 300.9904331 - 720 21 12 1991 448.0000000 390.8642304 - 721 22 12 1991 464.0000000 501.1678558 - 722 23 12 1991 675.0000000 592.3323265 - 723 24 12 1991 844.0000000 570.9726928 - 724 25 12 1991 569.0000000 498.7958720 - 725 26 12 1991 358.0000000 419.9330043 - 726 27 12 1991 279.0000000 354.3428320 - 727 28 12 1991 238.0000000 302.6663053 - 728 29 12 1991 201.0000000 260.0284467 - 729 30 12 1991 185.0000000 223.4791390 - 730 31 12 1991 165.0000000 194.2811547 - 731 1 1 1992 140.0000000 171.5009344 - 732 2 1 1992 126.0000000 153.5695712 - 733 3 1 1992 117.0000000 139.3276451 - 734 4 1 1992 114.0000000 131.2259897 - 735 5 1 1992 108.0000000 126.2436137 - 736 6 1 1992 108.0000000 119.7224607 - 737 7 1 1992 101.0000000 114.1623397 - 738 8 1 1992 97.0000000 110.8658115 - 739 9 1 1992 89.0000000 112.8620463 - 740 10 1 1992 111.0000000 131.9404149 - 741 11 1 1992 135.0000000 150.4490887 - 742 12 1 1992 171.0000000 143.8970255 - 743 13 1 1992 125.0000000 133.7835893 - 744 14 1 1992 111.0000000 126.1657770 - 745 15 1 1992 100.0000000 119.7335318 - 746 16 1 1992 87.0000000 114.0501244 - 747 17 1 1992 75.0000000 109.0185588 - 748 18 1 1992 79.0000000 104.4316880 - 749 19 1 1992 70.0000000 104.0986250 - 750 20 1 1992 72.0000000 103.2828731 - 751 21 1 1992 87.0000000 99.7618388 - 752 22 1 1992 79.0000000 96.2553195 - 753 23 1 1992 71.0000000 92.6401365 - 754 24 1 1992 66.0000000 89.4322752 - 755 25 1 1992 67.0000000 86.5124994 - 756 26 1 1992 65.0000000 83.8405509 - 757 27 1 1992 59.0000000 81.3877968 - 758 28 1 1992 57.0000000 79.1344553 - 759 29 1 1992 54.0000000 77.1977948 - 760 30 1 1992 59.0000000 76.5054345 - 761 31 1 1992 57.0000000 79.9066658 - 762 1 2 1992 56.0000000 85.1596070 - 763 2 2 1992 54.0000000 85.9102045 - 764 3 2 1992 58.0000000 84.3027203 - 765 4 2 1992 63.0000000 99.6300144 - 766 5 2 1992 76.0000000 138.1605202 - 767 6 2 1992 250.0000000 163.6836835 - 768 7 2 1992 346.0000000 179.3783653 - 769 8 2 1992 241.0000000 170.4403518 - 770 9 2 1992 180.0000000 157.9369322 - 771 10 2 1992 164.0000000 155.1281625 - 772 11 2 1992 183.0000000 165.0750228 - 773 12 2 1992 215.0000000 180.9139574 - 774 13 2 1992 265.0000000 194.4283775 - 775 14 2 1992 287.0000000 207.2249823 - 776 15 2 1992 272.0000000 214.8112278 - 777 16 2 1992 253.0000000 223.5626279 - 778 17 2 1992 301.0000000 237.5015634 - 779 18 2 1992 275.0000000 226.9636434 - 780 19 2 1992 224.0000000 201.3823681 - 781 20 2 1992 194.0000000 177.4603512 - 782 21 2 1992 173.0000000 159.4820153 - 783 22 2 1992 157.0000000 146.2100390 - 784 23 2 1992 142.0000000 137.0266897 - 785 24 2 1992 133.0000000 130.4754838 - 786 25 2 1992 128.0000000 125.7640365 - 787 26 2 1992 125.0000000 120.8185578 - 788 27 2 1992 125.0000000 115.4131020 - 789 28 2 1992 110.0000000 110.5517554 - 790 29 2 1992 107.0000000 106.2104923 - 791 1 3 1992 97.0000000 102.3484425 - 792 2 3 1992 97.0000000 99.0719144 - 793 3 3 1992 86.0000000 97.8734371 - 794 4 3 1992 93.0000000 97.6451192 - 795 5 3 1992 86.0000000 94.4039087 - 796 6 3 1992 82.0000000 91.4035644 - 797 7 3 1992 80.0000000 88.7347040 - 798 8 3 1992 77.0000000 86.2548072 - 799 9 3 1992 73.0000000 83.9606211 - 800 10 3 1992 76.0000000 81.9390677 - 801 11 3 1992 68.0000000 80.3144686 - 802 12 3 1992 70.0000000 101.8486233 - 803 13 3 1992 116.0000000 150.4751897 - 804 14 3 1992 206.0000000 193.0117420 - 805 15 3 1992 433.0000000 232.7962138 - 806 16 3 1992 495.0000000 277.5064505 - 807 17 3 1992 331.0000000 288.3620129 - 808 18 3 1992 240.0000000 259.5888028 - 809 19 3 1992 215.0000000 225.4624033 - 810 20 3 1992 185.0000000 197.1724386 - 811 21 3 1992 185.0000000 179.5402282 - 812 22 3 1992 185.0000000 187.3551559 - 813 23 3 1992 213.0000000 244.6043137 - 814 24 3 1992 466.0000000 317.1441514 - 815 25 3 1992 580.0000000 365.1966717 - 816 26 3 1992 566.0000000 374.1764651 - 817 27 3 1992 487.0000000 349.4480787 - 818 28 3 1992 387.0000000 311.9201482 - 819 29 3 1992 311.0000000 280.5921439 - 820 30 3 1992 270.0000000 250.1616900 - 821 31 3 1992 246.0000000 222.8333345 - 822 1 4 1992 229.0000000 211.5427940 - 823 2 4 1992 222.0000000 222.3962484 - 824 3 4 1992 217.0000000 221.5543241 - 825 4 4 1992 208.0000000 233.9114488 - 826 5 4 1992 220.0000000 268.6901673 - 827 6 4 1992 210.0000000 263.1462558 - 828 7 4 1992 190.0000000 235.7334939 - 829 8 4 1992 173.0000000 207.8396436 - 830 9 4 1992 166.0000000 184.4869520 - 831 10 4 1992 133.0000000 166.0756078 - 832 11 4 1992 126.0000000 151.3842957 - 833 12 4 1992 124.0000000 139.5051265 - 834 13 4 1992 116.0000000 131.2422666 - 835 14 4 1992 112.0000000 127.9857438 - 836 15 4 1992 111.0000000 141.8154326 - 837 16 4 1992 137.0000000 163.8630885 - 838 17 4 1992 206.0000000 168.3504805 - 839 18 4 1992 176.0000000 165.2596845 - 840 19 4 1992 161.0000000 157.2742208 - 841 20 4 1992 161.0000000 148.1700571 - 842 21 4 1992 139.0000000 140.6710805 - 843 22 4 1992 139.0000000 134.3611987 - 844 23 4 1992 123.0000000 128.7614887 - 845 24 4 1992 119.0000000 123.7088089 - 846 25 4 1992 111.0000000 119.1340848 - 847 26 4 1992 94.0000000 115.0073296 - 848 27 4 1992 94.0000000 111.6087515 - 849 28 4 1992 102.0000000 111.6846262 - 850 29 4 1992 120.0000000 113.2070509 - 851 30 4 1992 120.0000000 111.4392992 - 852 1 5 1992 114.0000000 113.9252771 - 853 2 5 1992 115.0000000 136.8965425 - 854 3 5 1992 206.0000000 139.4561428 - 855 4 5 1992 215.0000000 129.2111573 - 856 5 5 1992 125.0000000 122.3300798 - 857 6 5 1992 123.0000000 117.4432389 - 858 7 5 1992 113.0000000 113.2504166 - 859 8 5 1992 77.0000000 109.4510587 - 860 9 5 1992 83.0000000 106.0441185 - 861 10 5 1992 83.0000000 108.8902758 - 862 11 5 1992 96.0000000 110.2631522 - 863 12 5 1992 120.0000000 102.6049184 - 864 13 5 1992 80.0000000 98.2820735 - 865 14 5 1992 76.0000000 95.6425699 - 866 15 5 1992 69.0000000 93.2101428 - 867 16 5 1992 63.0000000 90.9502876 - 868 17 5 1992 61.0000000 88.8480464 - 869 18 5 1992 60.0000000 86.8871229 - 870 19 5 1992 59.0000000 85.0529540 - 871 20 5 1992 67.0000000 83.3327658 - 872 21 5 1992 51.0000000 81.7172239 - 873 22 5 1992 44.0000000 80.1979515 - 874 23 5 1992 42.0000000 78.7594027 - 875 24 5 1992 51.0000000 77.3957865 - 876 25 5 1992 42.0000000 76.2055022 - 877 26 5 1992 54.0000000 82.8565626 - 878 27 5 1992 53.0000000 83.4218191 - 879 28 5 1992 59.0000000 75.6591958 - 880 29 5 1992 55.0000000 76.4540193 - 881 30 5 1992 54.0000000 77.8730235 - 882 31 5 1992 48.0000000 75.1370612 - 883 1 6 1992 63.0000000 74.4272032 - 884 2 6 1992 61.0000000 75.6850714 - 885 3 6 1992 55.0000000 75.8109837 - 886 4 6 1992 75.0000000 78.1484055 - 887 5 6 1992 53.0000000 93.8222735 - 888 6 6 1992 77.0000000 98.8666474 - 889 7 6 1992 114.0000000 92.2160486 - 890 8 6 1992 167.0000000 97.5359599 - 891 9 6 1992 116.0000000 99.5714854 - 892 10 6 1992 91.0000000 87.7541051 - 893 11 6 1992 85.0000000 83.2599693 - 894 12 6 1992 68.0000000 80.7556312 - 895 13 6 1992 71.0000000 78.5923282 - 896 14 6 1992 63.0000000 76.5945959 - 897 15 6 1992 59.0000000 74.7397593 - 898 16 6 1992 46.0000000 73.0127474 - 899 17 6 1992 44.0000000 71.4003791 - 900 18 6 1992 39.0000000 69.8910305 - 901 19 6 1992 41.0000000 68.4810543 - 902 20 6 1992 44.0000000 67.9236495 - 903 21 6 1992 39.0000000 67.1983322 - 904 22 6 1992 32.0000000 65.3491118 - 905 23 6 1992 40.0000000 66.0978251 - 906 24 6 1992 41.0000000 72.4223561 - 907 25 6 1992 42.0000000 70.6579542 - 908 26 6 1992 42.0000000 65.9740124 - 909 27 6 1992 48.0000000 63.2684683 - 910 28 6 1992 37.0000000 61.6117847 - 911 29 6 1992 40.0000000 60.4842656 - 912 30 6 1992 29.0000000 59.4614946 - 913 1 7 1992 30.0000000 58.6248297 - 914 2 7 1992 36.0000000 58.0675847 - 915 3 7 1992 29.0000000 57.7720523 - 916 4 7 1992 36.0000000 64.7445587 - 917 5 7 1992 50.0000000 78.6396667 - 918 6 7 1992 78.0000000 80.1226362 - 919 7 7 1992 54.0000000 72.6800961 - 920 8 7 1992 57.0000000 63.8887863 - 921 9 7 1992 51.0000000 59.9241573 - 922 10 7 1992 47.0000000 66.2919429 - 923 11 7 1992 46.0000000 80.2797811 - 924 12 7 1992 76.0000000 85.3075464 - 925 13 7 1992 72.0000000 78.3791229 - 926 14 7 1992 67.0000000 71.7968633 - 927 15 7 1992 63.0000000 65.9999745 - 928 16 7 1992 47.0000000 63.4098937 - 929 17 7 1992 47.0000000 61.6820555 - 930 18 7 1992 42.0000000 60.1300000 - 931 19 7 1992 41.0000000 58.6904947 - 932 20 7 1992 39.0000000 57.3500713 - 933 21 7 1992 37.0000000 56.1638972 - 934 22 7 1992 33.0000000 56.2598147 - 935 23 7 1992 33.0000000 56.3123893 - 936 24 7 1992 33.0000000 54.0844399 - 937 25 7 1992 37.0000000 52.6328204 - 938 26 7 1992 26.0000000 51.6262542 - 939 27 7 1992 24.0000000 50.7053241 - 940 28 7 1992 26.0000000 49.8328029 - 941 29 7 1992 29.0000000 49.0031753 - 942 30 7 1992 19.0000000 48.2125886 - 943 31 7 1992 22.0000000 47.6508051 - 944 1 8 1992 28.0000000 48.5555182 - 945 2 8 1992 35.0000000 47.7451276 - 946 3 8 1992 29.0000000 45.9534989 - 947 4 8 1992 36.0000000 45.0839480 - 948 5 8 1992 52.0000000 44.4311034 - 949 6 8 1992 74.0000000 43.8119713 - 950 7 8 1992 54.0000000 43.2150196 - 951 8 8 1992 57.0000000 42.6382946 - 952 9 8 1992 48.0000000 43.2138154 - 953 10 8 1992 47.0000000 45.4608065 - 954 11 8 1992 46.0000000 47.6644110 - 955 12 8 1992 75.0000000 53.3284735 - 956 13 8 1992 73.0000000 53.5927953 - 957 14 8 1992 66.0000000 52.5504523 - 958 15 8 1992 60.0000000 49.2587691 - 959 16 8 1992 47.0000000 46.4325793 - 960 17 8 1992 46.0000000 42.5849108 - 961 18 8 1992 42.0000000 41.1954180 - 962 19 8 1992 41.0000000 40.6506365 - 963 20 8 1992 40.0000000 45.3145816 - 964 21 8 1992 37.0000000 48.2240286 - 965 22 8 1992 32.0000000 42.5942004 - 966 23 8 1992 32.0000000 41.2462405 - 967 24 8 1992 32.0000000 40.0596302 - 968 25 8 1992 36.0000000 38.8209120 - 969 26 8 1992 27.0000000 38.0064851 - 970 27 8 1992 25.0000000 37.3895928 - 971 28 8 1992 25.0000000 37.3819069 - 972 29 8 1992 28.0000000 39.1319032 - 973 30 8 1992 20.0000000 46.8468295 - 974 31 8 1992 22.0000000 63.6097316 - 975 1 9 1992 49.0000000 86.0228887 - 976 2 9 1992 77.0000000 80.9662175 - 977 3 9 1992 67.0000000 66.3591611 - 978 4 9 1992 45.0000000 59.6370631 - 979 5 9 1992 44.0000000 58.7813023 - 980 6 9 1992 64.0000000 54.2469042 - 981 7 9 1992 52.0000000 49.1579859 - 982 8 9 1992 40.0000000 46.7547729 - 983 9 9 1992 30.0000000 45.1677326 - 984 10 9 1992 34.0000000 43.7594205 - 985 11 9 1992 32.0000000 42.5029955 - 986 12 9 1992 36.0000000 41.5538008 - 987 13 9 1992 28.0000000 40.6425311 - 988 14 9 1992 33.0000000 39.7443757 - 989 15 9 1992 35.0000000 39.3127041 - 990 16 9 1992 30.0000000 39.0698780 - 991 17 9 1992 32.0000000 37.7317127 - 992 18 9 1992 29.0000000 36.6863127 - 993 19 9 1992 30.0000000 35.9446819 - 994 20 9 1992 28.0000000 35.3967128 - 995 21 9 1992 29.0000000 34.6073344 - 996 22 9 1992 29.0000000 33.8808159 - 997 23 9 1992 27.0000000 33.2525227 - 998 24 9 1992 27.0000000 32.6652584 - 999 25 9 1992 23.0000000 32.1049152 - 1000 26 9 1992 28.0000000 31.5707033 - 1001 27 9 1992 25.0000000 31.0615103 - 1002 28 9 1992 25.0000000 30.6250723 - 1003 29 9 1992 27.0000000 31.3171883 - 1004 30 9 1992 25.0000000 31.9546458 - 1005 1 10 1992 27.0000000 30.2163686 - 1006 2 10 1992 33.0000000 29.7234476 - 1007 3 10 1992 29.0000000 31.5226861 - 1008 4 10 1992 31.0000000 31.9842938 - 1009 5 10 1992 25.0000000 34.1684618 - 1010 6 10 1992 25.0000000 43.5626844 - 1011 7 10 1992 36.0000000 41.2677150 - 1012 8 10 1992 42.0000000 33.4775125 - 1013 9 10 1992 43.0000000 30.6201936 - 1014 10 10 1992 26.0000000 32.5891545 - 1015 11 10 1992 27.0000000 36.6806818 - 1016 12 10 1992 27.0000000 34.2069537 - 1017 13 10 1992 26.0000000 30.9183744 - 1018 14 10 1992 26.0000000 29.8970250 - 1019 15 10 1992 23.0000000 34.9758444 - 1020 16 10 1992 21.0000000 40.8428225 - 1021 17 10 1992 26.0000000 37.5220993 - 1022 18 10 1992 34.0000000 35.4684663 - 1023 19 10 1992 37.0000000 35.7451987 - 1024 20 10 1992 31.0000000 37.9517768 - 1025 21 10 1992 31.0000000 39.6801397 - 1026 22 10 1992 35.0000000 36.9573979 - 1027 23 10 1992 33.0000000 45.5329475 - 1028 24 10 1992 40.0000000 87.1798944 - 1029 25 10 1992 74.0000000 130.0124504 - 1030 26 10 1992 161.0000000 141.4784909 - 1031 27 10 1992 285.0000000 145.2097836 - 1032 28 10 1992 244.0000000 160.8634707 - 1033 29 10 1992 263.0000000 171.7798312 - 1034 30 10 1992 276.0000000 176.1049088 - 1035 31 10 1992 186.0000000 156.1533474 - 1036 1 11 1992 154.0000000 136.0022973 - 1037 2 11 1992 112.0000000 129.0068677 - 1038 3 11 1992 104.0000000 128.5530068 - 1039 4 11 1992 96.0000000 124.3721965 - 1040 5 11 1992 99.0000000 118.5312734 - 1041 6 11 1992 126.0000000 106.6844022 - 1042 7 11 1992 91.0000000 95.9047139 - 1043 8 11 1992 84.0000000 90.4785256 - 1044 9 11 1992 81.0000000 90.3398536 - 1045 10 11 1992 85.0000000 103.5643899 - 1046 11 11 1992 126.0000000 147.2747746 - 1047 12 11 1992 279.0000000 198.7028931 - 1048 13 11 1992 390.0000000 227.3871079 - 1049 14 11 1992 294.0000000 241.4010812 - 1050 15 11 1992 260.0000000 272.6294990 - 1051 16 11 1992 398.0000000 358.5229581 - 1052 17 11 1992 520.0000000 443.6870381 - 1053 18 11 1992 487.0000000 442.6781097 - 1054 19 11 1992 380.0000000 439.4908724 - 1055 20 11 1992 385.0000000 418.7588833 - 1056 21 11 1992 351.0000000 390.4824032 - 1057 22 11 1992 309.0000000 429.7476354 - 1058 23 11 1992 587.0000000 444.9835472 - 1059 24 11 1992 661.0000000 399.0574355 - 1060 25 11 1992 447.0000000 360.8035437 - 1061 26 11 1992 361.0000000 356.2816798 - 1062 27 11 1992 351.0000000 359.5397820 - 1063 28 11 1992 353.0000000 369.6570119 - 1064 29 11 1992 369.0000000 407.7508858 - 1065 30 11 1992 452.0000000 454.7340084 - 1066 1 12 1992 441.0000000 434.0069129 - 1067 2 12 1992 348.0000000 409.0182029 - 1068 3 12 1992 394.0000000 436.5262668 - 1069 4 12 1992 455.0000000 464.5763389 - 1070 5 12 1992 491.0000000 502.9617026 - 1071 6 12 1992 469.0000000 499.7040295 - 1072 7 12 1992 364.0000000 474.2767010 - 1073 8 12 1992 338.0000000 437.7243441 - 1074 9 12 1992 334.0000000 382.8059904 - 1075 10 12 1992 268.0000000 325.1266980 - 1076 11 12 1992 236.0000000 291.0090656 - 1077 12 12 1992 230.0000000 289.3010225 - 1078 13 12 1992 239.0000000 277.3446336 - 1079 14 12 1992 256.0000000 249.6868443 - 1080 15 12 1992 217.0000000 217.3113297 - 1081 16 12 1992 201.0000000 195.9384063 - 1082 17 12 1992 188.0000000 183.7897827 - 1083 18 12 1992 176.0000000 175.3474748 - 1084 19 12 1992 170.0000000 167.8446721 - 1085 20 12 1992 168.0000000 160.8839898 - 1086 21 12 1992 131.0000000 157.2042498 - 1087 22 12 1992 133.0000000 160.2792181 - 1088 23 12 1992 134.0000000 156.2383297 - 1089 24 12 1992 127.0000000 146.9034717 - 1090 25 12 1992 117.0000000 139.3621161 - 1091 26 12 1992 113.0000000 132.8688063 - 1092 27 12 1992 100.0000000 127.0591358 - 1093 28 12 1992 94.0000000 121.8258638 - 1094 29 12 1992 87.0000000 117.0958165 - 1095 30 12 1992 86.0000000 112.8070175 - 1096 31 12 1992 81.0000000 108.9061441 - 1097 1 1 1993 77.0000000 105.3471635 - 1098 2 1 1993 76.0000000 102.0902220 - 1099 3 1 1993 61.0000000 99.1007229 - 1100 4 1 1993 61.0000000 96.3485558 - 1101 5 1 1993 57.0000000 93.8074506 - 1102 6 1 1993 66.0000000 100.2644167 - 1103 7 1 1993 67.0000000 116.4730535 - 1104 8 1 1993 84.0000000 124.8887066 - 1105 9 1 1993 90.0000000 132.3823551 - 1106 10 1 1993 113.0000000 160.3507005 - 1107 11 1 1993 265.0000000 264.9382994 - 1108 12 1 1993 559.0000000 436.8211965 - 1109 13 1 1993 832.0000000 512.4026582 - 1110 14 1 1993 601.0000000 498.4882495 - 1111 15 1 1993 436.0000000 433.0773604 - 1112 16 1 1993 339.0000000 360.5234159 - 1113 17 1 1993 292.0000000 302.2616259 - 1114 18 1 1993 247.0000000 261.8988837 - 1115 19 1 1993 218.0000000 231.5791264 - 1116 20 1 1993 205.0000000 208.7870933 - 1117 21 1 1993 190.0000000 192.8818841 - 1118 22 1 1993 176.0000000 182.5170638 - 1119 23 1 1993 173.0000000 173.6550981 - 1120 24 1 1993 173.0000000 180.1492734 - 1121 25 1 1993 199.0000000 231.6183382 - 1122 26 1 1993 361.0000000 279.8595268 - 1123 27 1 1993 295.0000000 277.4142605 - 1124 28 1 1993 238.0000000 279.6977505 - 1125 29 1 1993 263.0000000 285.3925757 - 1126 30 1 1993 245.0000000 271.9183283 - 1127 31 1 1993 222.0000000 244.4683839 - 1128 1 2 1993 199.0000000 216.2809181 - 1129 2 2 1993 186.0000000 194.2399286 - 1130 3 2 1993 171.0000000 176.9315547 - 1131 4 2 1993 157.0000000 162.9973384 - 1132 5 2 1993 159.0000000 152.7039053 - 1133 6 2 1993 129.0000000 144.9999374 - 1134 7 2 1993 119.0000000 138.6654186 - 1135 8 2 1993 119.0000000 133.0024566 - 1136 9 2 1993 105.0000000 127.8592312 - 1137 10 2 1993 106.0000000 123.1932757 - 1138 11 2 1993 105.0000000 118.9478525 - 1139 12 2 1993 95.0000000 115.0732292 - 1140 13 2 1993 91.0000000 111.5263216 - 1141 14 2 1993 88.0000000 108.2697106 - 1142 15 2 1993 84.0000000 105.2708140 - 1143 16 2 1993 83.0000000 102.6736187 - 1144 17 2 1993 79.0000000 101.1991952 - 1145 18 2 1993 78.0000000 100.9506582 - 1146 19 2 1993 84.0000000 100.8030684 - 1147 20 2 1993 91.0000000 104.2216088 - 1148 21 2 1993 91.0000000 114.3527757 - 1149 22 2 1993 90.0000000 115.6802274 - 1150 23 2 1993 103.0000000 114.0511137 - 1151 24 2 1993 94.0000000 109.4187863 - 1152 25 2 1993 81.0000000 105.5418631 - 1153 26 2 1993 78.0000000 102.3171315 - 1154 27 2 1993 75.0000000 100.8250075 - 1155 28 2 1993 76.0000000 101.1383116 - 1156 1 3 1993 80.0000000 99.3581658 - 1157 2 3 1993 75.0000000 97.0467031 - 1158 3 3 1993 76.0000000 95.2378449 - 1159 4 3 1993 72.0000000 93.5767648 - 1160 5 3 1993 65.0000000 91.2505797 - 1161 6 3 1993 64.0000000 89.0213297 - 1162 7 3 1993 64.0000000 86.9686715 - 1163 8 3 1993 68.0000000 85.4519167 - 1164 9 3 1993 68.0000000 84.5259254 - 1165 10 3 1993 67.0000000 83.1035467 - 1166 11 3 1993 61.0000000 82.7251321 - 1167 12 3 1993 57.0000000 83.5041864 - 1168 13 3 1993 58.0000000 83.8409141 - 1169 14 3 1993 54.0000000 82.4983704 - 1170 15 3 1993 66.0000000 80.6904598 - 1171 16 3 1993 54.0000000 79.0495674 - 1172 17 3 1993 57.0000000 77.5686127 - 1173 18 3 1993 57.0000000 76.1928033 - 1174 19 3 1993 52.0000000 74.8872547 - 1175 20 3 1993 57.0000000 73.6367647 - 1176 21 3 1993 58.0000000 72.5363985 - 1177 22 3 1993 57.0000000 75.8321427 - 1178 23 3 1993 56.0000000 84.7570515 - 1179 24 3 1993 63.0000000 86.2565075 - 1180 25 3 1993 76.0000000 81.8589241 - 1181 26 3 1993 56.0000000 79.2346686 - 1182 27 3 1993 59.0000000 77.4045900 - 1183 28 3 1993 59.0000000 75.7400674 - 1184 29 3 1993 54.0000000 74.1788482 - 1185 30 3 1993 48.0000000 72.7094062 - 1186 31 3 1993 55.0000000 71.3230960 - 1187 1 4 1993 48.0000000 70.1438445 - 1188 2 4 1993 53.0000000 70.5159369 - 1189 3 4 1993 47.0000000 72.1467417 - 1190 4 4 1993 59.0000000 74.3443710 - 1191 5 4 1993 53.0000000 83.2058823 - 1192 6 4 1993 64.0000000 91.1737892 - 1193 7 4 1993 63.0000000 89.0938118 - 1194 8 4 1993 75.0000000 84.3286612 - 1195 9 4 1993 64.0000000 81.3052058 - 1196 10 4 1993 59.0000000 79.4901119 - 1197 11 4 1993 60.0000000 82.0119546 - 1198 12 4 1993 63.0000000 83.6543165 - 1199 13 4 1993 69.0000000 81.8901717 - 1200 14 4 1993 79.0000000 80.9511501 - 1201 15 4 1993 82.0000000 79.2627827 - 1202 16 4 1993 68.0000000 77.1794984 - 1203 17 4 1993 56.0000000 75.3588337 - 1204 18 4 1993 59.0000000 73.6046073 - 1205 19 4 1993 61.0000000 71.9290588 - 1206 20 4 1993 62.0000000 70.2938975 - 1207 21 4 1993 57.0000000 68.6946419 - 1208 22 4 1993 53.0000000 67.1924893 - 1209 23 4 1993 47.0000000 65.7871963 - 1210 24 4 1993 46.0000000 64.4618036 - 1211 25 4 1993 47.0000000 63.2124479 - 1212 26 4 1993 45.0000000 62.0325572 - 1213 27 4 1993 43.0000000 60.9157278 - 1214 28 4 1993 41.0000000 59.8564029 - 1215 29 4 1993 38.0000000 58.8556365 - 1216 30 4 1993 39.0000000 58.2586098 - 1217 1 5 1993 40.0000000 57.5384906 - 1218 2 5 1993 41.0000000 56.6755021 - 1219 3 5 1993 45.0000000 56.5113326 - 1220 4 5 1993 49.0000000 55.7939851 - 1221 5 5 1993 40.0000000 54.6963793 - 1222 6 5 1993 43.0000000 53.8368905 - 1223 7 5 1993 38.0000000 53.4883203 - 1224 8 5 1993 38.0000000 53.3061967 - 1225 9 5 1993 43.0000000 52.0782141 - 1226 10 5 1993 44.0000000 51.6903641 - 1227 11 5 1993 41.0000000 52.2935054 - 1228 12 5 1993 51.0000000 58.1259112 - 1229 13 5 1993 63.0000000 81.6698588 - 1230 14 5 1993 68.0000000 79.8892142 - 1231 15 5 1993 77.0000000 62.4834381 - 1232 16 5 1993 77.0000000 57.9343539 - 1233 17 5 1993 59.0000000 56.1370008 - 1234 18 5 1993 49.0000000 54.7846213 - 1235 19 5 1993 43.0000000 56.3454341 - 1236 20 5 1993 44.0000000 58.0612669 - 1237 21 5 1993 48.0000000 59.2490842 - 1238 22 5 1993 44.0000000 58.5555709 - 1239 23 5 1993 46.0000000 54.3249597 - 1240 24 5 1993 40.0000000 52.3076472 - 1241 25 5 1993 43.0000000 51.1376069 - 1242 26 5 1993 30.0000000 50.6316292 - 1243 27 5 1993 45.0000000 53.4966296 - 1244 28 5 1993 43.0000000 60.0505144 - 1245 29 5 1993 44.0000000 59.3846039 - 1246 30 5 1993 54.0000000 56.1313879 - 1247 31 5 1993 56.0000000 54.7699515 - 1248 1 6 1993 44.0000000 51.9772721 - 1249 2 6 1993 43.0000000 50.4498445 - 1250 3 6 1993 33.0000000 50.5133474 - 1251 4 6 1993 45.0000000 51.4377075 - 1252 5 6 1993 46.0000000 49.6153723 - 1253 6 6 1993 42.0000000 47.7061868 - 1254 7 6 1993 40.0000000 46.5445007 - 1255 8 6 1993 30.0000000 45.6241068 - 1256 9 6 1993 31.0000000 44.7839661 - 1257 10 6 1993 32.0000000 44.1729618 - 1258 11 6 1993 25.0000000 43.7477658 - 1259 12 6 1993 33.0000000 43.6868781 - 1260 13 6 1993 29.0000000 44.1161466 - 1261 14 6 1993 40.0000000 42.8444605 - 1262 15 6 1993 42.0000000 42.2626368 - 1263 16 6 1993 37.0000000 42.2249387 - 1264 17 6 1993 46.0000000 42.3546232 - 1265 18 6 1993 47.0000000 41.4489794 - 1266 19 6 1993 50.0000000 40.3248019 - 1267 20 6 1993 43.0000000 49.9710377 - 1268 21 6 1993 69.0000000 65.7428043 - 1269 22 6 1993 61.0000000 55.1449543 - 1270 23 6 1993 67.0000000 64.4635714 - 1271 24 6 1993 77.0000000 66.1082668 - 1272 25 6 1993 87.0000000 55.1139031 - 1273 26 6 1993 55.0000000 51.0649443 - 1274 27 6 1993 43.0000000 49.3456207 - 1275 28 6 1993 40.0000000 47.9333958 - 1276 29 6 1993 30.0000000 46.6350375 - 1277 30 6 1993 40.0000000 45.4314438 - 1278 1 7 1993 40.0000000 44.4911540 - 1279 2 7 1993 27.0000000 45.2700866 - 1280 3 7 1993 34.0000000 44.4535821 - 1281 4 7 1993 30.0000000 42.4546587 - 1282 5 7 1993 31.0000000 41.4606943 - 1283 6 7 1993 27.0000000 40.4704917 - 1284 7 7 1993 31.0000000 39.6458474 - 1285 8 7 1993 26.0000000 38.8698025 - 1286 9 7 1993 23.0000000 38.1895765 - 1287 10 7 1993 24.0000000 38.6597640 - 1288 11 7 1993 25.0000000 39.6369732 - 1289 12 7 1993 34.0000000 43.4514454 - 1290 13 7 1993 40.0000000 49.6333772 - 1291 14 7 1993 41.0000000 58.0255029 - 1292 15 7 1993 46.0000000 59.9936401 - 1293 16 7 1993 39.0000000 48.3050741 - 1294 17 7 1993 43.0000000 42.6482290 - 1295 18 7 1993 35.0000000 41.0216850 - 1296 19 7 1993 49.0000000 49.4525106 - 1297 20 7 1993 38.0000000 57.0360635 - 1298 21 7 1993 41.0000000 51.2400972 - 1299 22 7 1993 45.0000000 47.7355346 - 1300 23 7 1993 41.0000000 45.1520539 - 1301 24 7 1993 42.0000000 42.0521491 - 1302 25 7 1993 40.0000000 40.5856972 - 1303 26 7 1993 35.0000000 39.5854445 - 1304 27 7 1993 40.0000000 50.1524516 - 1305 28 7 1993 40.0000000 54.0116415 - 1306 29 7 1993 36.0000000 42.1617770 - 1307 30 7 1993 40.0000000 61.7530756 - 1308 31 7 1993 61.0000000 88.1645387 - 1309 1 8 1993 36.0000000 65.7673849 - 1310 2 8 1993 46.0000000 51.8078537 - 1311 3 8 1993 32.0000000 48.1041184 - 1312 4 8 1993 38.0000000 46.1966537 - 1313 5 8 1993 32.0000000 44.5467506 - 1314 6 8 1993 25.0000000 43.0424952 - 1315 7 8 1993 26.0000000 41.6654166 - 1316 8 8 1993 29.0000000 40.3994235 - 1317 9 8 1993 29.0000000 41.6408235 - 1318 10 8 1993 28.0000000 47.2828350 - 1319 11 8 1993 37.0000000 44.3307833 - 1320 12 8 1993 40.0000000 41.1780048 - 1321 13 8 1993 49.0000000 38.4186289 - 1322 14 8 1993 32.0000000 38.0880446 - 1323 15 8 1993 37.0000000 38.8405557 - 1324 16 8 1993 37.0000000 36.7314540 - 1325 17 8 1993 27.0000000 35.1866581 - 1326 18 8 1993 24.0000000 34.3116512 - 1327 19 8 1993 24.0000000 33.5378852 - 1328 20 8 1993 22.0000000 32.8158555 - 1329 21 8 1993 21.0000000 32.1382213 - 1330 22 8 1993 16.0000000 31.5346987 - 1331 23 8 1993 21.0000000 32.4041950 - 1332 24 8 1993 27.0000000 34.0781773 - 1333 25 8 1993 26.0000000 31.4939696 - 1334 26 8 1993 23.0000000 30.0162837 - 1335 27 8 1993 21.0000000 29.5168303 - 1336 28 8 1993 28.0000000 31.3409913 - 1337 29 8 1993 17.0000000 31.9692118 - 1338 30 8 1993 24.0000000 29.2996970 - 1339 31 8 1993 25.0000000 28.1894092 - 1340 1 9 1993 25.0000000 27.6896053 - 1341 2 9 1993 19.0000000 27.2570562 - 1342 3 9 1993 17.0000000 26.9859012 - 1343 4 9 1993 16.0000000 30.2065192 - 1344 5 9 1993 19.0000000 32.2851563 - 1345 6 9 1993 23.0000000 28.1500017 - 1346 7 9 1993 25.0000000 37.2881370 - 1347 8 9 1993 34.0000000 44.5044359 - 1348 9 9 1993 31.0000000 37.5846823 - 1349 10 9 1993 35.0000000 61.1050444 - 1350 11 9 1993 53.0000000 81.4460306 - 1351 12 9 1993 71.0000000 99.8433653 - 1352 13 9 1993 74.0000000 103.6685736 - 1353 14 9 1993 87.0000000 127.1294879 - 1354 15 9 1993 173.0000000 134.1593453 - 1355 16 9 1993 117.0000000 111.5436297 - 1356 17 9 1993 93.0000000 91.7233174 - 1357 18 9 1993 77.0000000 83.5363146 - 1358 19 9 1993 62.0000000 77.5160879 - 1359 20 9 1993 54.0000000 72.3899551 - 1360 21 9 1993 48.0000000 68.9051343 - 1361 22 9 1993 46.0000000 75.4736134 - 1362 23 9 1993 55.0000000 87.3643485 - 1363 24 9 1993 66.0000000 89.9877730 - 1364 25 9 1993 64.0000000 86.4682331 - 1365 26 9 1993 52.0000000 79.1612384 - 1366 27 9 1993 68.0000000 72.5783795 - 1367 28 9 1993 69.0000000 68.9889817 - 1368 29 9 1993 62.0000000 71.2897274 - 1369 30 9 1993 76.0000000 69.2958605 - 1370 1 10 1993 72.0000000 74.8636201 - 1371 2 10 1993 68.0000000 85.4901291 - 1372 3 10 1993 72.0000000 83.2232162 - 1373 4 10 1993 78.0000000 83.1930882 - 1374 5 10 1993 116.0000000 116.3339660 - 1375 6 10 1993 131.0000000 143.5833189 - 1376 7 10 1993 180.0000000 134.8706291 - 1377 8 10 1993 203.0000000 124.7472392 - 1378 9 10 1993 164.0000000 127.9520642 - 1379 10 10 1993 178.0000000 142.1440172 - 1380 11 10 1993 161.0000000 171.3535057 - 1381 12 10 1993 287.0000000 189.2261129 - 1382 13 10 1993 360.0000000 219.3010126 - 1383 14 10 1993 374.0000000 260.6630107 - 1384 15 10 1993 297.0000000 254.7163306 - 1385 16 10 1993 247.0000000 233.6862785 - 1386 17 10 1993 273.0000000 236.6445722 - 1387 18 10 1993 261.0000000 233.1760174 - 1388 19 10 1993 265.0000000 213.2695333 - 1389 20 10 1993 230.0000000 189.0780273 - 1390 21 10 1993 199.0000000 165.6026392 - 1391 22 10 1993 173.0000000 148.3183568 - 1392 23 10 1993 182.0000000 144.2727428 - 1393 24 10 1993 203.0000000 155.0448283 - 1394 25 10 1993 213.0000000 150.5467022 - 1395 26 10 1993 180.0000000 136.1133306 - 1396 27 10 1993 154.0000000 122.7097567 - 1397 28 10 1993 118.0000000 113.3387804 - 1398 29 10 1993 112.0000000 106.4742130 - 1399 30 10 1993 98.0000000 100.5958612 - 1400 31 10 1993 97.0000000 95.3552736 - 1401 1 11 1993 91.0000000 90.6547755 - 1402 2 11 1993 85.0000000 86.4258323 - 1403 3 11 1993 75.0000000 82.6102412 - 1404 4 11 1993 76.0000000 79.1579216 - 1405 5 11 1993 78.0000000 76.0256380 - 1406 6 11 1993 72.0000000 73.1900256 - 1407 7 11 1993 76.0000000 71.7494940 - 1408 8 11 1993 69.0000000 70.1050855 - 1409 9 11 1993 66.0000000 67.3845414 - 1410 10 11 1993 71.0000000 66.4738283 - 1411 11 11 1993 64.0000000 69.1986000 - 1412 12 11 1993 67.0000000 74.7275880 - 1413 13 11 1993 80.0000000 81.9040193 - 1414 14 11 1993 78.0000000 92.6439978 - 1415 15 11 1993 80.0000000 105.4062838 - 1416 16 11 1993 86.0000000 103.1052148 - 1417 17 11 1993 125.0000000 98.5603881 - 1418 18 11 1993 96.0000000 91.9641121 - 1419 19 11 1993 82.0000000 87.2461363 - 1420 20 11 1993 77.0000000 83.3712992 - 1421 21 11 1993 67.0000000 79.8880545 - 1422 22 11 1993 71.0000000 76.7263315 - 1423 23 11 1993 61.0000000 73.8480311 - 1424 24 11 1993 42.0000000 71.2208002 - 1425 25 11 1993 63.0000000 68.8218531 - 1426 26 11 1993 57.0000000 66.9975292 - 1427 27 11 1993 58.0000000 65.8194101 - 1428 28 11 1993 49.0000000 63.8686223 - 1429 29 11 1993 50.0000000 61.9946359 - 1430 30 11 1993 55.0000000 60.3274527 - 1431 1 12 1993 54.0000000 58.7861529 - 1432 2 12 1993 54.0000000 61.3631032 - 1433 3 12 1993 50.0000000 62.9412019 - 1434 4 12 1993 51.0000000 62.4508449 - 1435 5 12 1993 62.0000000 62.0525859 - 1436 6 12 1993 62.0000000 59.5302987 - 1437 7 12 1993 71.0000000 73.3274859 - 1438 8 12 1993 79.0000000 109.7994595 - 1439 9 12 1993 153.0000000 140.5066070 - 1440 10 12 1993 291.0000000 171.1498758 - 1441 11 12 1993 332.0000000 223.1699928 - 1442 12 12 1993 465.0000000 293.2882071 - 1443 13 12 1993 518.0000000 354.8948186 - 1444 14 12 1993 539.0000000 383.6377740 - 1445 15 12 1993 559.0000000 408.8923667 - 1446 16 12 1993 500.0000000 447.6636607 - 1447 17 12 1993 526.0000000 493.9395867 - 1448 18 12 1993 583.0000000 520.7371192 - 1449 19 12 1993 677.0000000 558.7402608 - 1450 20 12 1993 781.0000000 728.2889190 - 1451 21 12 1993 1180.0000000 934.5516083 - 1452 22 12 1993 1460.0000000 1001.5365953 - 1453 23 12 1993 1600.0000000 1036.9444060 - 1454 24 12 1993 1410.0000000 1057.0500094 - 1455 25 12 1993 1230.0000000 1022.2317612 - 1456 26 12 1993 1070.0000000 885.9355035 - 1457 27 12 1993 746.0000000 730.2816484 - 1458 28 12 1993 542.0000000 608.9724649 - 1459 29 12 1993 492.0000000 538.3971751 - 1460 30 12 1993 491.0000000 542.3591832 - 1461 31 12 1993 617.0000000 612.0139952 diff --git a/check/case_09/simulation_mhm_case09.ini b/check/case_09/simulation_mhm_case09.ini new file mode 100644 index 00000000..1f2234f5 --- /dev/null +++ b/check/case_09/simulation_mhm_case09.ini @@ -0,0 +1,18 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_09 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__directories_mhm__time_step_model_inputs = [0] +nml__processselection__processcase(5) = 1 +nml__processselection__processcase(8) = 2 diff --git a/check/case_10/mhm.nml b/check/case_10/mhm.nml index 96aeb7c7..b98dd2a5 100644 --- a/check/case_10/mhm.nml +++ b/check/case_10/mhm.nml @@ -1,523 +1,141 @@ -! Emacs: -*- mode: f90 -*- -!> \file mhm.nml -! -!> \brief Namelists of mHM -! -!> \details This files provides all namelists for mHM. -! -!> \authors Matthias Zink, Matthias Cuntz -!> \date Jan 2013 -! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n -! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n -! Luis Samaniego, Nov 2013 - process description -! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n -! Stephan Thober, May 2014 - added switch for chunk read in -! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr -! Rohini Kumar and -! Olda Rakovec , Sep 2014 - added KGE estimator (OF number 9) -! Matthias Zink, Nov 2014 - added multiple options for process 5 - PET -! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells -!****************************************************************************************** -! -!****************************************************************************************** -! PROJECT DESCRIPTION -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> Provide details on the model simulations, to appear in the netcdf output attributes -!----------------------------------------------------------------------------- -&project_description -!> project name -project_details="mHM test basin project" -!> any specific description of simulation -setup_description="model run for the Mosel basin, forced with the E-OBS meteorologic data" -!> e.g. hindcast simulation, seasonal forecast, climate projection -simulation_type="historical simulation" -!> convention used for dataset -Conventions="XXX" -!> contact details, incl. PI name, modellers -contact="mHM developers (email:mhm-developers@ufz.de)" -!> developing institution, specific mHM revision, latest release version (automatically included) -mHM_details="Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group" -!> some details on data/model run version (creation date is included automatically) -history="model run version 1" -/ -!****************************************************************************************** -! MRM COUPLING MODE -!****************************************************************************************** -!----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone (NOT IMPLEMENTED YET)\n -!> 1 = coupling to a hydrologic model\n -!----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +&directories_general + dir_lcover(1) = '../../test_basin/input/luse/' + dir_morpho(1) = '../../test_basin/input/morph/' + dir_out(1) = 'output_b1/b1_' + dir_restartout(1) = 'output_b1/b1_' + dircommonfiles = '../../test_basin/input/morph/' + dirconfigout = 'output_b1/' + file_latlon(1) = '../../test_basin/input/latlon/latlon_1.nc' / -!****************************************************************************************** -! DIRECTORIES -!****************************************************************************************** -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "../../test_basin/input/gauge/" -dir_Gauges(2) = "../../test_basin/input/gauge/" +&directories_mhm + dir_absvappressure(1) = '../../test_basin/input/meteo/' + dir_maxtemperature(1) = '../../test_basin/input/meteo/' + dir_mintemperature(1) = '../../test_basin/input/meteo/' + dir_netradiation(1) = '../../test_basin/input/meteo/' + dir_precipitation(1) = '../../test_basin/input/meteo/pre/' + dir_referenceet(1) = '../../test_basin/input/meteo/pet/' + dir_temperature(1) = '../../test_basin/input/meteo/tavg/' + dir_windspeed(1) = '../../test_basin/input/meteo/' + inputformat_meteo_forcings = 'nc' + time_step_model_inputs(1) = -2 / -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in the "gaugeinfo.txt" file.\n -! -&directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> config run out file common to all modeled basins should be written to directory -dirConfigOut = "output_b1/" -! -!> directory where common input files should be located for all modeled basins -!> (only for *_classdefinition files) -dirCommonFiles = "../../test_basin/input/morph/" -! -!**** for Basin 1 -!> directory where morphological files are located -dir_Morpho(1) = "../../test_basin/input/morph/" -!> directory where land cover files are located -dir_LCover(1) = "../../test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "restart/" -!> directory where restart output should be written -dir_RestartOut(1) = "output_b1/" -!> directory where output should be written -dir_Out(1) = "output_b1/" -!> file containing latitude and longitude on the resolution_Hydrology -file_LatLon(1) = "../../test_basin/input/latlon/latlon_1.nc" +&directories_mrm + dir_gauges(1) = '../../test_basin/input/gauge/' + dir_total_runoff(1) = 'output_b1/' / -&directories_mHM -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- -!> input format specification for the meteorological forcings: 'nc' or 'bin'. -!> this format is common to all basins to be modeled -inputFormat_meteo_forcings = "nc" -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!**** for Basin 1 -!> directory where meteorological input is located -dir_Precipitation(1) = "../../test_basin/input/meteo/pre/" -dir_Temperature(1) = "../../test_basin/input/meteo/tavg/" -!> paths depending on PET process (processCase(5)) -!> 0 - PET is input -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -!> if processCase(5) == 0 input directory of pet has to be specified -dir_ReferenceET(1) = "../../test_basin/input/meteo/pet/" -!> if processCase(5) == 1 input directory of minimum and maximum temperature has to be specified -dir_MinTemperature(1) = "../../test_basin/input/meteo/" -dir_MaxTemperature(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 2 input directory of minimum and maximum temperature has to be specified -dir_NetRadiation(1) = "../../test_basin/input/meteo/" -!> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified -dir_absVapPressure(1) = "../../test_basin/input/meteo/" -dir_windspeed(1) = "../../test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "../../test_basin/input/lai/" +&evaluation_gauges + gauge_filename(1,1) = '00398.txt' + gauge_id(1,1) = 398 + ngaugestotal = 1 + nogauges_basin(1) = 1 / -!> data which are optionally needed for optimization -&optional_data -!> soil moisture data -!> currently mhm can be calibrated against the fraction of moisture -!> down to a specific mhm soil layer (integral over the layers) -!> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n -! -!> directory to soil moisture data -dir_soil_moisture(1) = "test_basin/input/optional_data/" -!> number of mHM soil layers (nSoilHorizons_mHM) which the soil moisture -!> input is representative for (counted top to down) -nSoilHorizons_sm_input = 1 -!> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n -!----------------------------- -timeStep_sm_input = -2 +&inflow_gauges + inflowgauge_filename(1,1) = '00398.txt' + inflowgauge_headwater(1,1) = .false. + inflowgauge_id(1,1) = 398 + ninflowgaugestotal = 0 + noinflowgauges_basin(1) = 0 / -! -!****************************************************************************************** -! MAIN -!****************************************************************************************** -!> Main namelist -!> Most of the variables (if not all) given in this namelist are common -!> to all basins to be modeled. -&mainconfig -!----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- -!> input data & model run cordinate system -!> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) -!> 1 -> regular lat & lon coordinate system -!----------------------------------------------------------------------------- -iFlag_cordinate_sys = 0 -!----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n -!> IF routing process is ON then give nBasins = 1, for this case, mHM will internally -!> discard gauging station information. -!----------------------------------------------------------------------------- -nBasins = 1 -!----------------------------------------------------------------------------- -!> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Hydrology(1) = 24000 -!----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n -!> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n -!----------------------------------------------------------------------------- -resolution_Routing(1) = 24000 -!---------------------------------------------------------------------------- -!> specify same integer for basins to share L0_data to save memory \n -!> same integer HAVE TO FOLLOW EACH OTHER DIRECTLY and are not allowed to be \n -!> intersected by other integers \n -!----------------------------------------------------------------------------- -L0Basin(1) = 1 -!----------------------------------------------------------------------------- -!> flag for optimization: .TRUE.: optimization -!> or .FALSE.: no optimazition -!----------------------------------------------------------------------------- -optimize = .false. -!> Optimization shall be restarted from mo_.restart file -optimize_restart = .FALSE. -!> (0) MCMC \n -!> (1) DDS \n -!> (2) Simulated Annealing \n -!> (3) SCE \n -!> additional settings for the different methods can be provided below in namelist Optimization -opti_method = 1 -!> (1) 1.0 - NSE \n -!> (2) 1.0 - lnNSE \n -!> (3) 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SSE \n -!> (7) -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (13) 1.0 - average temporal correlation of soil moisture \n -!> further functions can be implemented in mo_objective_function -opti_function = 3 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. +&lai_data_information + inputformat_gridded_lai = 'nc' + timestep_lai_input = 0 / -&time_periods -!----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n -!> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n -! -!> 1---------2-------------------3 -!> -!> 1-> Starting of the effective modeling period (including the warming days) -!> 2-> Starting of the given simulation period -!> 3-> Ending of the given simulation period (= end of the effective modeling period) -! -!> IF you want to run the model from 2002/01/01 (Starting of the given simulation -!> period=2) to 2003/12/31 (End of the given simulation period=3) with 365 warming -!> day, which is 2001/01/01 = 1), THEN all dynamic datasets should be given for -!> the effective modeling period of 2001/01/01 to 2003/12/31. -!----------------------------------------------------------------------------- -warming_Days(1) = 360 -!> first year of wanted simulation period -eval_Per(1)%yStart = 1990 -!> first month of wanted simulation period -eval_Per(1)%mStart = 01 -!> first day of wanted simulation period -eval_Per(1)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -!> last day of wanted simulation period -eval_Per(1)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = -2 +&lcover + lcoverfname(1:2) = 'lc_1981.asc', 'lc_1991.asc' + lcoveryearend(1:2) = 1990, 2000 + lcoveryearstart(1:2) = 1981, 1991 + nlcoverscene = 2 / -!****************************************************************************************** -! mHM SOIL LAYERING -!****************************************************************************************** -!> Namelist controlling the layering of the soil -!> Variables given in this namelist are common to all basins to be modeled. -&soilLayer -!> iFlag_soilDB -iFlag_soilDB = 0 -!> [mm] soil depth down to which organic matter is possible -tillageDepth = 200 -!> No. of soil horizons to be modeled -nSoilHorizons_mHM = 2 -!> Soil_Horizon Depth[mm] ! depth of soil horizons w.r.t surface -!> [mm] from 1,..,n-1. Depth of layer n is determined from soil LUT (positive downwards) -soil_Depth(1) = 200 +&lcover_mpr + fracsealed_cityarea = 0.6 / -!****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1990 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' +&mainconfig + iflag_cordinate_sys = 0 + l0basin(1) = 1 + nbasins = 1 + resolution_hydrology(1) = 24000 + write_restart = .true. +/ -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1991 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' +&mainconfig_mhm_mrm + dir_restartin(1) = 'restart/b1_' + opti_function = 3 + opti_method = 1 + optimize = .false. + optimize_restart = .false. + read_restart = .false. + resolution_routing(1) = 24000 + timestep = 1 +/ -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' +&mainconfig_mrm + alma_convention = .true. + filenametotalrunoff = 'total_runoff' + varnametotalrunoff = 'total_runoff' / -! -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA -!****************************************************************************************** -&LAI_data_information -! -!----------------------------------------------------------------------------------- -!> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n -! -!> timeStep_LAI_input -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). -!> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 -!> Information regarding long-term monthly mean LAI for land cover classes -!> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n -!> The respective plant functional type is in LAI_class.asc, which must be -!> located in each basin's morph directory. -!> <0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n -!----------------------------------------------------------------------------------- -timeStep_LAI_input = 0 -!> input file format of gridded file (if timeStep_LAI_input < 0) -!> bin - assume yearly files with name YYYY.bin -!> nc - assume one file with name lai.nc -inputFormat_gridded_LAI = "nc" + +&nightdayratio + fnight_pet(1:12) = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1 + fnight_prec(1:12) = 0.46, 0.5, 0.52, 0.51, 0.48, 0.5, 0.49, 0.48, 0.52, + 0.56, 0.5, 0.47 + fnight_temp(1:12) = -0.76, -1.3, -1.88, -2.38, -2.72, -2.75, -2.74, + -3.04, -2.44, -1.6, -0.94, -0.53 + read_meteo_weights = .false. / -! -!****************************************************************************************** -! PROCESSES -!****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed undeneath the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soil moisture -!> 1 - Feddes equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like -!> 2 - Jarvis equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like -!> 3 - Jarvis equation for ET reduction and FC dependency on root fraction coefficient -processCase(3) = 3 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> -1 - PET is input, LAI driven correction -!> 0 - read in PET (aspect correction) -!> 1 - Hargreaves-Samani -!> 2 - Priestley-Taylor -!> 3 - Penman-Monteith -processCase(5) = -1 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -processCase(8) = 1 -!> geoparameter -!> 1 - geological parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttlworth et al. 2013 -processCase(10) = 0 +&optimization + dds_r = 0.2 + mcmc_error_params(1:2) = 0.01, 0.6 + mcmc_opti = .false. + niterations = 400 + sa_temp = -9.0 + sce_ngs = 2 + sce_npg = -9 + sce_nps = -9 + seed = 1235876 / -!****************************************************************************************** -! Specifcation of evaluation and inflow gauges -!****************************************************************************************** -!> namelist controlling the gauging station information -!> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and -!> to the filename containing the time series -&evaluation_gauges -!> Gauges for model evaluation -! -!> Total number of gauges (sum of all gauges in all subbains) -nGaugesTotal = 1 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoGauges_basin(1) = 1 -!> id of gauge(1) for subbasin(1) --> (1,1) -Gauge_id(1,1) = 398 -!> name of file with timeseries of gauge(1) for subbasin(1) --> (1,1) -gauge_filename(1,1) = "00398.txt" +&panevapo + evap_coeff(1:12) = 1.3, 1.2, 0.72, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.5 / -&inflow_gauges -!> Gauges / gridpoints used for inflow to the model domain -!> e.g. in the case of upstream/headwater areas which are -!> not included in the model domain -! -!> Total number of inflow gauges (sum of all gauges in all subbains) -nInflowGaugesTotal = 0 -!> structure of gauge_id(i,j) & gauge_filename(i,j): -!> 1st dimension is the number of the subbasin i -!> 2nd dimension is the number of the gauge j within the subbasin i -!> numbering has to be consecutive -! -!> basin 1 -!> number of gauges for subbasin (1) -NoInflowGauges_basin(1) = 0 -!> id of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_id(1,1) = 398 -!> name of file with timeseries of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_filename(1,1) = "00398.txt" -!> consider flows from upstream/headwater cells of inflow gauge(1) for subbasin(1) --> (1,1) -InflowGauge_Headwater(1,1) = .FALSE. +&processselection + processcase(1:10) = 1, 1, 3, 1, -1, 1, 1, 1, 1, 0 / -!****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION -!****************************************************************************************** -&panEvapo -! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec -!> monthly free pan evaporation -evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.50 +&project_description + contact = 'mHM developers (email:mhm-developers@ufz.de)' + conventions = 'XXX' + history = 'model run version 1' + mhm_details = 'Helmholtz Center for Environmental Research - UFZ, Department Computational Hydrosystems, Stochastic Hydrology Group' + project_details = 'mHM test basin project' + setup_description = 'model run for the Mosel basin, forced with the E-OBS meteorologic data' + simulation_type = 'historical simulation' / -!****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS -!****************************************************************************************** -&nightDayRatio -!> night ratio for precipitation -!> only night values required because day values are the opposite -fnight_prec = 0.46, 0.50, 0.52, 0.51, 0.48, 0.50, 0.49, 0.48, 0.52, 0.56, 0.50, 0.47 -!> night ratio for PET -fnight_pet = 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10 -!> night correction factor for temperature -fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, -1.60, -0.94, -0.53 +&soildata + iflag_soildb = 0 + nsoilhorizons_mhm = 2 + soil_depth(1) = 200 + tillagedepth = 200 / -!****************************************************************************************** -! SETTINGS FOR OPTIMIZATION -!****************************************************************************************** -&Optimization -! ------------------------------------- -!> General: \n -! ------------------------------------- -!> number of iteration steps by parameterset -nIterations = 400 -!> seed of random number gemerator (default: -9) -!> if default: seed is obtained from system clock -seed = 1235876 -! ------------------------------------- -!> DDS specific: \n -! ------------------------------------- -!> perturbation rate r (default: 0.2) -dds_r = 0.2 -! ------------------------------------- -!> SA specific: \n -! ------------------------------------- -!> Initial Temperature (default: -9.0) -!> if default: temperature is determined by algorithm of Ben-Ameur (2004) -sa_temp = -9.0 -! ------------------------------------- -!> SCE specific: \n -! ------------------------------------- -!> Number of Complexes (default: -9) -!> if default: ngs = 2 -sce_ngs = 2 -!> Points per Complex (default: -9) -!> if default: npg = 2n+1 -sce_npg = -9 -!> Points per Sub-Complex (default: -9) -!> if default: nps = n+1 -sce_nps = -9 +&time_periods + eval_per(1)%dend = 30 + eval_per(1)%dstart = 1 + eval_per(1)%mend = 6 + eval_per(1)%mstart = 7 + eval_per(1)%yend = 1991 + eval_per(1)%ystart = 1990 + warming_days(1) = 181 / diff --git a/check/case_10/mhm_outputs.nml b/check/case_10/mhm_outputs.nml index 060a3373..47bf26d9 100644 --- a/check/case_10/mhm_outputs.nml +++ b/check/case_10/mhm_outputs.nml @@ -14,7 +14,7 @@ ! -1: daily ! -2: monthly ! -3: yearly -timeStep_model_outputs = -2 +timeStep_model_outputs = 0 ! !---------------- ! 1. states diff --git a/check/case_10/mrm_outputs.nml b/check/case_10/mrm_outputs.nml index 63f5a4c2..79fc9cee 100644 --- a/check/case_10/mrm_outputs.nml +++ b/check/case_10/mrm_outputs.nml @@ -15,7 +15,7 @@ ! -1: daily ! -2: monthly ! -3: yearly -timeStep_model_outputs_mrm = -1 +timeStep_model_outputs_mrm = 0 ! !---------------- ! 1. Fluxes diff --git a/check/case_10/output_save/ConfigFile.log b/check/case_10/output_save/ConfigFile.log new file mode 100755 index 00000000..3d5811b0 --- /dev/null +++ b/check/case_10/output_save/ConfigFile.log @@ -0,0 +1,252 @@ +-------------------------------------------------------------------------------- + mHM-UFZ v-5.8 + L. Samaniego & R. Kumar, UFZ +-------------------------------------------------------------------------------- + + M A I N mHM C O N F I G U R A T I O N I N F O R M A T I O N + +Number of basins 1 +Total No. of gauges 1 +Time Step [h] 1 + Basin 1 +No. of cells L0 46545 + Basin 1 +No. of cells L1 34 +Total No. of nodes 34 +Total No. of reaches 33 +No. of cells L11 34 +Total No. of gauges 1 +Basin 1 Hydrology Resolution [m] 24000. +Basin 1 Routing Resolution [m] 24000. +Flag READ restart F +Flag WRITE restart T + +------------------------------------------------------------- + Model Run Periods for Basin 1 +------------------------------------------------------------- + From To + Day Month Year Day Month Year +Warming Period (1) 1 1 1990 30 6 1990Evaluation Period (2) 1 7 1990 30 6 1991Simulation Period (1)+(2) 1 1 1990 30 6 1991 + +-------------------------------------------------- + Land Cover Observations for Basin 2 +-------------------------------------------------- + Start Yea End Year Land cover scene Land Cover File + + 1981 1990 1 lc_1981.asc + 1991 2000 2 lc_1991.asc + +------------------------------------------------------- + Initial Transfer Function Parameter Ranges (gammas) +------------------------------------------------------- + i min max current name + 1 0.150 0.400 0.150 canopyInterceptionFactor + 2 -2.000 2.000 1.000 snowTreshholdTemperature + 3 0.000 4.000 1.500 degreeDayFactor_forest + 4 0.000 1.000 0.500 degreeDayFactor_impervious + 5 0.000 2.000 0.500 degreeDayFactor_pervious + 6 0.100 0.900 0.500 increaseDegreeDayFactorByPrecip + 7 0.000 8.000 3.000 maxDegreeDayFactor_forest + 8 0.000 8.000 3.500 maxDegreeDayFactor_impervious + 9 0.000 8.000 4.000 maxDegreeDayFactor_pervious + 10 0.000 20.000 3.400 orgMatterContent_forest + 11 0.000 1.000 0.100 orgMatterContent_impervious + 12 0.000 4.000 0.600 orgMatterContent_pervious + 13 0.646 0.951 0.760 PTF_lower66_5_constant + 14 0.000 0.003 0.001 PTF_lower66_5_clay + 15 -0.373 -0.187 -0.264 PTF_lower66_5_Db + 16 0.536 1.123 0.890 PTF_higher66_5_constant + 17 -0.005 0.005 -0.001 PTF_higher66_5_clay + 18 -0.551 -0.091 -0.324 PTF_higher66_5_Db + 19 -1.200 -0.285 -0.585 PTF_Ks_constant + 20 0.006 0.026 0.013 PTF_Ks_sand + 21 0.003 0.013 0.006 PTF_Ks_clay + 22 60.960 60.960 60.960 PTF_Ks_curveSlope + 23 0.900 0.999 0.970 rootFractionCoefficient_forest + 24 0.900 0.950 0.930 rootFractionCoefficient_impervious + 25 0.001 0.090 0.020 rootFractionCoefficient_pervious + 26 1.000 4.000 1.750 infiltrationShapeFactor + 27 0.001 0.090 0.090 rootFractionCoefficient_sand + 28 0.900 0.999 0.980 rootFractionCoefficient_clay + 29 0.000 1.000 0.500 jarvis_sm_threshold_c1 + 30 0.000 5.000 0.500 imperviousStorageCapacity + 31 0.300 1.300 0.300 PET_a_forest + 32 0.300 1.300 0.800 PET_a_impervious + 33 0.300 1.300 1.300 PET_a_pervious + 34 0.000 1.500 1.500 PET_b + 35 -2.000 0.000 -0.700 PET_c + 36 75.000 200.000 85.000 interflowStorageCapacityFactor + 37 0.000 10.000 7.000 interflowRecession_slope + 38 1.000 3.000 1.500 fastInterflowRecession_forest + 39 1.000 30.000 15.000 slowInterflowRecession_Ks + 40 0.050 0.300 0.125 exponentSlowInterflow + 41 0.000 50.000 35.000 rechargeCoefficient + 42 -5.000 5.000 -1.000 rechargeFactor_karstic + 43 1.000 1.000 1.000 gain_loss_GWreservoir_karstic + 44 0.310 0.350 0.325 muskingumTravelTime_constant + 45 0.070 0.080 0.075 muskingumTravelTime_riverLength + 46 1.950 2.100 2.000 muskingumTravelTime_riverSlope + 47 0.090 0.110 0.100 muskingumTravelTime_impervious + 48 0.010 0.500 0.300 muskingumAttenuation_riverSlope + 49 1.000 1000.000 100.000 GeoParam(1,:) + 50 1.000 1000.000 100.000 GeoParam(2,:) + 51 1.000 1000.000 100.000 GeoParam(3,:) + 52 1.000 1000.000 100.000 GeoParam(4,:) + 53 1.000 1000.000 100.000 GeoParam(5,:) + 54 1.000 1000.000 100.000 GeoParam(6,:) + 55 1.000 1000.000 100.000 GeoParam(7,:) + 56 1.000 1000.000 100.000 GeoParam(8,:) + 57 1.000 1000.000 100.000 GeoParam(9,:) + 58 1.000 1000.000 100.000 GeoParam(10,:) + +-------------------------------------------------- + Basin Runoff Data +-------------------------------------------------- + Gauge No. Basin Id Qmax[m3/s] Qmin[m3/s] + 1 1 932.000 16.000 + +-------------------------------------------------------------------------------- + Basin-wise Configuration +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- + Directory list +-------------------------------------------------------------------------------- +Directory to morphological input ../../test_basin/input/morph/ +Directory to land cover input ../../test_basin/input/luse/ +Directory to gauging station input ../../test_basin/input/gauge/ +Directory to precipitation input ../../test_basin/input/meteo/pre/ +Directory to temperature input ../../test_basin/input/meteo/tavg/ +Directory to reference ET input ../../test_basin/input/meteo/pet/ +Directory to write output by default output_b1/b1_ +Directory to write output when restarted output_b1/b1_ + +------------------------------ +River Network (Routing level) +------------------------------ + Label 0 = intermediate draining cell + Label 1 = headwater cell + Label 2 = sink cell + +--------------------------------------------------------------------------- + Overall From To Routing Label Length Mean + Link Routing Routing Sequence Slope + Id Node Node [km] [o/oo] +--------------------------------------------------------------------------- + 1 1 5 1 1 7.536 0.100 + 6 7 3 2 1 28.349 0.100 + 9 10 9 3 1 9.243 1.190 + 10 11 8 4 1 40.042 0.999 + 14 15 14 5 1 27.728 0.938 + 19 20 19 6 1 28.435 1.653 + 20 21 16 7 1 21.728 4.786 + 24 25 24 8 1 32.127 4.171 + 29 30 26 9 1 28.642 3.840 + 32 33 29 10 1 27.142 13.116 + 33 34 32 11 1 31.763 2.613 + 2 3 4 12 0 29.642 0.100 + 7 8 4 13 0 1.414 0.100 + 13 14 13 14 0 38.213 0.576 + 15 16 17 15 0 9.985 0.100 + 18 19 18 16 0 33.799 1.036 + 25 26 22 17 0 61.734 0.794 + 28 29 28 18 0 6.243 3.204 + 31 32 31 19 0 16.399 1.342 + 3 4 5 20 0 38.420 0.833 + 12 13 12 21 0 42.127 0.166 + 17 18 17 22 0 42.542 0.282 + 27 28 24 23 0 32.835 1.980 + 30 31 27 24 0 32.728 2.781 + 23 24 23 25 0 34.420 1.133 + 26 27 23 26 0 29.799 1.141 + 22 23 22 27 0 0.707 0.100 + 21 22 17 28 0 38.456 0.364 + 16 17 12 29 0 35.885 1.728 + 11 12 9 30 0 30.263 0.100 + 8 9 5 31 0 24.399 0.100 + 4 5 6 32 0 5.036 0.100 + 5 6 2 33 2 14.692 0.100 + +-------------------- + Overall Basin + Cell Routing + Id Node Id +-------------------- + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + +------------------------------ + Modeling Routing Effective + Cell Cell Id Area + Id [-] [km2] +------------------------------ + 1 1 126.750 + 2 2 229.750 + 3 3 107.750 + 4 4 312.500 + 5 5 573.750 + 6 6 314.250 + 7 7 42.500 + 8 8 524.750 + 9 9 576.000 + 10 10 146.500 + 11 11 470.000 + 12 12 576.000 + 13 13 414.500 + 14 14 340.750 + 15 15 9.000 + 16 16 230.250 + 17 17 576.000 + 18 18 576.000 + 19 19 527.250 + 20 20 48.250 + 21 21 10.500 + 22 22 545.000 + 23 23 576.000 + 24 24 576.000 + 25 25 318.500 + 26 26 456.250 + 27 27 551.250 + 28 28 576.000 + 29 29 337.000 + 30 30 3.250 + 31 31 198.000 + 32 32 555.250 + 33 33 89.000 + 34 34 121.750 +------------------------------ + Total[km2] 11636.250 + + diff --git a/check/case_10/output_save/b1_daily_discharge.out b/check/case_10/output_save/b1_daily_discharge.out new file mode 100755 index 00000000..60aa50d4 --- /dev/null +++ b/check/case_10/output_save/b1_daily_discharge.out @@ -0,0 +1,366 @@ + No Day Mon Year Qobs_0000000398 Qsim_0000000398 + 1 1 7 1990 79.0000000 41.4712820 + 2 2 7 1990 92.0000000 32.8425242 + 3 3 7 1990 72.0000000 37.0345534 + 4 4 7 1990 58.0000000 46.1671592 + 5 5 7 1990 69.0000000 57.5133619 + 6 6 7 1990 94.0000000 43.0039507 + 7 7 7 1990 199.0000000 38.0254971 + 8 8 7 1990 133.0000000 35.6837821 + 9 9 7 1990 124.0000000 31.6382325 + 10 10 7 1990 123.0000000 31.0598059 + 11 11 7 1990 99.0000000 30.5120629 + 12 12 7 1990 88.0000000 29.9917344 + 13 13 7 1990 84.0000000 29.4963865 + 14 14 7 1990 72.0000000 29.0238389 + 15 15 7 1990 55.0000000 28.5721365 + 16 16 7 1990 65.0000000 28.1395232 + 17 17 7 1990 50.0000000 27.7244203 + 18 18 7 1990 50.0000000 27.3254065 + 19 19 7 1990 46.0000000 26.9412008 + 20 20 7 1990 44.0000000 26.5706474 + 21 21 7 1990 42.0000000 26.2127022 + 22 22 7 1990 37.0000000 25.8664209 + 23 23 7 1990 38.0000000 25.5309489 + 24 24 7 1990 44.0000000 25.2055115 + 25 25 7 1990 30.0000000 24.8894060 + 26 26 7 1990 26.0000000 24.5819942 + 27 27 7 1990 31.0000000 24.2826960 + 28 28 7 1990 33.0000000 25.8791806 + 29 29 7 1990 42.0000000 24.0100408 + 30 30 7 1990 36.0000000 23.4794114 + 31 31 7 1990 34.0000000 23.2046302 + 32 1 8 1990 25.0000000 22.9360035 + 33 2 8 1990 22.0000000 22.6731742 + 34 3 8 1990 28.0000000 22.4158157 + 35 4 8 1990 25.0000000 22.1636290 + 36 5 8 1990 19.0000000 21.9163401 + 37 6 8 1990 22.0000000 21.6736975 + 38 7 8 1990 19.0000000 21.4354704 + 39 8 8 1990 22.0000000 21.2014463 + 40 9 8 1990 19.0000000 20.9714301 + 41 10 8 1990 20.0000000 20.7452416 + 42 11 8 1990 19.0000000 20.5227148 + 43 12 8 1990 19.0000000 20.3036966 + 44 13 8 1990 22.0000000 22.5877988 + 45 14 8 1990 36.0000000 33.2444221 + 46 15 8 1990 31.0000000 27.9003768 + 47 16 8 1990 30.0000000 24.3810950 + 48 17 8 1990 28.0000000 20.6773636 + 49 18 8 1990 34.0000000 19.5545361 + 50 19 8 1990 21.0000000 19.3274995 + 51 20 8 1990 30.0000000 19.1057117 + 52 21 8 1990 22.0000000 18.8885873 + 53 22 8 1990 21.0000000 18.6758655 + 54 23 8 1990 23.0000000 18.4673077 + 55 24 8 1990 20.0000000 18.2626957 + 56 25 8 1990 29.0000000 18.0618522 + 57 26 8 1990 20.0000000 17.9217916 + 58 27 8 1990 22.0000000 18.3133568 + 59 28 8 1990 23.0000000 17.5134014 + 60 29 8 1990 35.0000000 17.2966445 + 61 30 8 1990 51.0000000 95.6408821 + 62 31 8 1990 80.0000000 83.2292254 + 63 1 9 1990 56.0000000 26.7501085 + 64 2 9 1990 33.0000000 20.8876973 + 65 3 9 1990 27.0000000 20.3930278 + 66 4 9 1990 27.0000000 22.6831145 + 67 5 9 1990 28.0000000 21.8718173 + 68 6 9 1990 26.0000000 19.1556364 + 69 7 9 1990 24.0000000 21.2712945 + 70 8 9 1990 33.0000000 19.2378135 + 71 9 9 1990 26.0000000 18.2602380 + 72 10 9 1990 27.0000000 17.9212374 + 73 11 9 1990 22.0000000 17.6002614 + 74 12 9 1990 22.0000000 17.2956601 + 75 13 9 1990 21.0000000 17.0059605 + 76 14 9 1990 22.0000000 16.7298448 + 77 15 9 1990 22.0000000 16.4661334 + 78 16 9 1990 22.0000000 16.2137684 + 79 17 9 1990 20.0000000 15.9718000 + 80 18 9 1990 22.0000000 15.7393746 + 81 19 9 1990 16.0000000 15.5157238 + 82 20 9 1990 22.0000000 15.3001554 + 83 21 9 1990 19.0000000 19.4356689 + 84 22 9 1990 32.0000000 78.1756100 + 85 23 9 1990 27.0000000 54.8089222 + 86 24 9 1990 45.0000000 27.1759264 + 87 25 9 1990 42.0000000 18.2423950 + 88 26 9 1990 39.0000000 17.0226857 + 89 27 9 1990 30.0000000 16.6448998 + 90 28 9 1990 28.0000000 16.2906810 + 91 29 9 1990 30.0000000 15.9577594 + 92 30 9 1990 30.0000000 57.4911047 + 93 1 10 1990 56.0000000 89.8960488 + 94 2 10 1990 72.0000000 46.3662220 + 95 3 10 1990 73.0000000 38.8311009 + 96 4 10 1990 68.0000000 32.9815321 + 97 5 10 1990 53.0000000 24.1348822 + 98 6 10 1990 42.0000000 22.3019883 + 99 7 10 1990 33.0000000 21.4421653 + 100 8 10 1990 42.0000000 20.6576405 + 101 9 10 1990 34.0000000 19.9397714 + 102 10 10 1990 36.0000000 19.2812595 + 103 11 10 1990 36.0000000 18.6757007 + 104 12 10 1990 28.0000000 18.1174648 + 105 13 10 1990 32.0000000 17.6015926 + 106 14 10 1990 27.0000000 17.1237081 + 107 15 10 1990 35.0000000 16.8783957 + 108 16 10 1990 42.0000000 17.1599533 + 109 17 10 1990 35.0000000 24.0699591 + 110 18 10 1990 39.0000000 22.3712769 + 111 19 10 1990 34.0000000 16.1490820 + 112 20 10 1990 32.0000000 15.7552172 + 113 21 10 1990 34.0000000 15.3911251 + 114 22 10 1990 27.0000000 15.0501509 + 115 23 10 1990 31.0000000 14.7300901 + 116 24 10 1990 28.0000000 14.4289773 + 117 25 10 1990 25.0000000 14.4736869 + 118 26 10 1990 29.0000000 28.6051038 + 119 27 10 1990 31.0000000 34.8020028 + 120 28 10 1990 65.0000000 151.1267740 + 121 29 10 1990 69.0000000 121.8124546 + 122 30 10 1990 157.0000000 64.4562934 + 123 31 10 1990 190.0000000 45.5019959 + 124 1 11 1990 115.0000000 52.3892602 + 125 2 11 1990 104.0000000 59.2518494 + 126 3 11 1990 100.0000000 55.8312047 + 127 4 11 1990 131.0000000 51.0038580 + 128 5 11 1990 130.0000000 45.9326240 + 129 6 11 1990 115.0000000 38.9020866 + 130 7 11 1990 102.0000000 36.1465507 + 131 8 11 1990 95.0000000 34.1044567 + 132 9 11 1990 81.0000000 32.2923174 + 133 10 11 1990 66.0000000 42.0830019 + 134 11 11 1990 67.0000000 67.1515779 + 135 12 11 1990 74.0000000 55.3886810 + 136 13 11 1990 109.0000000 50.9224174 + 137 14 11 1990 92.0000000 71.5895131 + 138 15 11 1990 92.0000000 66.2139061 + 139 16 11 1990 155.0000000 52.8829301 + 140 17 11 1990 159.0000000 52.9585590 + 141 18 11 1990 131.0000000 67.9122913 + 142 19 11 1990 161.0000000 72.2892768 + 143 20 11 1990 196.0000000 148.0773068 + 144 21 11 1990 336.0000000 134.9771472 + 145 22 11 1990 566.0000000 113.4938784 + 146 23 11 1990 373.0000000 125.7958036 + 147 24 11 1990 293.0000000 118.1824868 + 148 25 11 1990 264.0000000 119.0798747 + 149 26 11 1990 226.0000000 105.9304724 + 150 27 11 1990 201.0000000 91.1190163 + 151 28 11 1990 180.0000000 82.0813305 + 152 29 11 1990 161.0000000 86.3959666 + 153 30 11 1990 149.0000000 81.5151904 + 154 1 12 1990 134.0000000 72.4820249 + 155 2 12 1990 113.0000000 67.7796526 + 156 3 12 1990 99.0000000 63.6554567 + 157 4 12 1990 107.0000000 60.1059295 + 158 5 12 1990 99.0000000 56.8110498 + 159 6 12 1990 89.0000000 53.8195442 + 160 7 12 1990 77.0000000 51.1295590 + 161 8 12 1990 71.0000000 48.7003357 + 162 9 12 1990 68.0000000 46.5011875 + 163 10 12 1990 73.0000000 44.5054821 + 164 11 12 1990 84.0000000 42.6900459 + 165 12 12 1990 88.0000000 60.1645639 + 166 13 12 1990 92.0000000 61.5816705 + 167 14 12 1990 128.0000000 52.7011577 + 168 15 12 1990 136.0000000 47.8150791 + 169 16 12 1990 114.0000000 45.5197030 + 170 17 12 1990 101.0000000 43.4953264 + 171 18 12 1990 93.0000000 41.6628524 + 172 19 12 1990 85.0000000 39.9996294 + 173 20 12 1990 81.0000000 38.4860092 + 174 21 12 1990 106.0000000 72.0550335 + 175 22 12 1990 159.0000000 87.9864112 + 176 23 12 1990 250.0000000 90.7660567 + 177 24 12 1990 298.0000000 78.1575555 + 178 25 12 1990 261.0000000 119.1972260 + 179 26 12 1990 228.0000000 187.8133563 + 180 27 12 1990 409.0000000 207.1438894 + 181 28 12 1990 486.0000000 216.6498730 + 182 29 12 1990 440.0000000 305.0685898 + 183 30 12 1990 486.0000000 377.3078868 + 184 31 12 1990 774.0000000 461.6344317 + 185 1 1 1991 889.0000000 510.5410421 + 186 2 1 1991 863.0000000 562.7371815 + 187 3 1 1991 875.0000000 616.8839487 + 188 4 1 1991 932.0000000 551.1329547 + 189 5 1 1991 826.0000000 529.7979676 + 190 6 1 1991 731.0000000 496.3329943 + 191 7 1 1991 613.0000000 476.1540755 + 192 8 1 1991 610.0000000 474.2450774 + 193 9 1 1991 686.0000000 426.8587723 + 194 10 1 1991 556.0000000 465.7845102 + 195 11 1 1991 669.0000000 495.9997165 + 196 12 1 1991 828.0000000 465.9469669 + 197 13 1 1991 735.0000000 377.8785653 + 198 14 1 1991 513.0000000 309.2952389 + 199 15 1 1991 411.0000000 255.6856047 + 200 16 1 1991 345.0000000 215.8972321 + 201 17 1 1991 293.0000000 187.5696141 + 202 18 1 1991 251.0000000 167.3201545 + 203 19 1 1991 222.0000000 152.6139649 + 204 20 1 1991 215.0000000 142.4653975 + 205 21 1 1991 213.0000000 138.0857358 + 206 22 1 1991 202.0000000 138.4259908 + 207 23 1 1991 200.0000000 130.5268641 + 208 24 1 1991 192.0000000 123.2551518 + 209 25 1 1991 176.0000000 116.5965120 + 210 26 1 1991 164.0000000 110.7242371 + 211 27 1 1991 157.0000000 105.3443027 + 212 28 1 1991 134.0000000 100.5162784 + 213 29 1 1991 130.0000000 96.1702970 + 214 30 1 1991 119.0000000 92.2463172 + 215 31 1 1991 107.0000000 88.6927065 + 216 1 2 1991 112.0000000 85.4649341 + 217 2 2 1991 109.0000000 82.5244885 + 218 3 2 1991 101.0000000 79.8379760 + 219 4 2 1991 98.0000000 77.3763680 + 220 5 2 1991 84.0000000 75.1143703 + 221 6 2 1991 93.0000000 73.0298922 + 222 7 2 1991 80.0000000 71.1035987 + 223 8 2 1991 73.0000000 69.3185315 + 224 9 2 1991 89.0000000 67.6597867 + 225 10 2 1991 84.0000000 66.1142416 + 226 11 2 1991 78.0000000 64.6703196 + 227 12 2 1991 79.0000000 63.3177909 + 228 13 2 1991 77.0000000 62.0475997 + 229 14 2 1991 80.0000000 60.8517167 + 230 15 2 1991 72.0000000 59.7230117 + 231 16 2 1991 78.0000000 59.9084682 + 232 17 2 1991 74.0000000 59.8872131 + 233 18 2 1991 77.0000000 58.6936781 + 234 19 2 1991 73.0000000 67.6900029 + 235 20 2 1991 69.0000000 79.5393217 + 236 21 2 1991 74.0000000 104.9494860 + 237 22 2 1991 81.0000000 111.5542413 + 238 23 2 1991 110.0000000 106.7528851 + 239 24 2 1991 180.0000000 103.3002226 + 240 25 2 1991 213.0000000 102.1915624 + 241 26 2 1991 222.0000000 100.5089304 + 242 27 2 1991 208.0000000 98.3963396 + 243 28 2 1991 211.0000000 95.1386883 + 244 1 3 1991 214.0000000 91.6122261 + 245 2 3 1991 208.0000000 96.1713542 + 246 3 3 1991 221.0000000 93.3522212 + 247 4 3 1991 281.0000000 88.1392887 + 248 5 3 1991 219.0000000 84.5762747 + 249 6 3 1991 190.0000000 81.4040594 + 250 7 3 1991 173.0000000 78.5104264 + 251 8 3 1991 164.0000000 76.0076792 + 252 9 3 1991 142.0000000 73.9892188 + 253 10 3 1991 133.0000000 73.4953438 + 254 11 3 1991 133.0000000 71.2959689 + 255 12 3 1991 118.0000000 69.2362694 + 256 13 3 1991 127.0000000 67.2563705 + 257 14 3 1991 113.0000000 65.4273950 + 258 15 3 1991 107.0000000 63.7330506 + 259 16 3 1991 100.0000000 62.1592913 + 260 17 3 1991 100.0000000 60.6951627 + 261 18 3 1991 95.0000000 59.3451663 + 262 19 3 1991 98.0000000 106.6353550 + 263 20 3 1991 119.0000000 99.6205800 + 264 21 3 1991 159.0000000 106.9702252 + 265 22 3 1991 196.0000000 110.6201865 + 266 23 3 1991 242.0000000 97.4286822 + 267 24 3 1991 216.0000000 91.2265850 + 268 25 3 1991 180.0000000 86.9354079 + 269 26 3 1991 145.0000000 83.1673232 + 270 27 3 1991 127.0000000 80.1442778 + 271 28 3 1991 117.0000000 76.8720338 + 272 29 3 1991 109.0000000 73.9651546 + 273 30 3 1991 106.0000000 71.3202475 + 274 31 3 1991 99.0000000 68.9066462 + 275 1 4 1991 96.0000000 66.6978283 + 276 2 4 1991 88.0000000 64.6707019 + 277 3 4 1991 87.0000000 62.8051131 + 278 4 4 1991 82.0000000 61.2366109 + 279 5 4 1991 84.0000000 59.7876968 + 280 6 4 1991 67.0000000 58.2809167 + 281 7 4 1991 89.0000000 56.9358054 + 282 8 4 1991 75.0000000 55.6854770 + 283 9 4 1991 79.0000000 54.4640554 + 284 10 4 1991 70.0000000 53.3127002 + 285 11 4 1991 69.0000000 52.2316151 + 286 12 4 1991 69.0000000 51.2139847 + 287 13 4 1991 56.0000000 50.2537516 + 288 14 4 1991 63.0000000 49.3455474 + 289 15 4 1991 58.0000000 48.4847031 + 290 16 4 1991 56.0000000 47.6665827 + 291 17 4 1991 54.0000000 46.8875379 + 292 18 4 1991 57.0000000 46.1540489 + 293 19 4 1991 53.0000000 45.7059222 + 294 20 4 1991 53.0000000 45.0965958 + 295 21 4 1991 65.0000000 44.4905122 + 296 22 4 1991 69.0000000 45.4144027 + 297 23 4 1991 61.0000000 44.6757791 + 298 24 4 1991 56.0000000 43.3126326 + 299 25 4 1991 56.0000000 42.4611175 + 300 26 4 1991 53.0000000 41.8662243 + 301 27 4 1991 49.0000000 41.2924682 + 302 28 4 1991 53.0000000 40.7386722 + 303 29 4 1991 48.0000000 43.1689532 + 304 30 4 1991 57.0000000 75.1339023 + 305 1 5 1991 69.0000000 63.7663306 + 306 2 5 1991 89.0000000 44.6863154 + 307 3 5 1991 105.0000000 43.4677029 + 308 4 5 1991 79.0000000 42.6476813 + 309 5 5 1991 69.0000000 41.8796107 + 310 6 5 1991 71.0000000 41.1551920 + 311 7 5 1991 60.0000000 40.4568857 + 312 8 5 1991 64.0000000 39.7910099 + 313 9 5 1991 59.0000000 39.1557070 + 314 10 5 1991 57.0000000 39.9357997 + 315 11 5 1991 55.0000000 40.6003803 + 316 12 5 1991 53.0000000 38.1242156 + 317 13 5 1991 52.0000000 37.3417873 + 318 14 5 1991 50.0000000 36.8400689 + 319 15 5 1991 52.0000000 39.2429235 + 320 16 5 1991 54.0000000 38.6972469 + 321 17 5 1991 54.0000000 36.0184225 + 322 18 5 1991 55.0000000 35.4946640 + 323 19 5 1991 48.0000000 35.0066889 + 324 20 5 1991 48.0000000 34.5350559 + 325 21 5 1991 49.0000000 34.0785855 + 326 22 5 1991 41.0000000 33.6362044 + 327 23 5 1991 40.0000000 33.2069351 + 328 24 5 1991 40.0000000 32.7898867 + 329 25 5 1991 39.0000000 32.3842462 + 330 26 5 1991 43.0000000 31.9892717 + 331 27 5 1991 39.0000000 31.6042853 + 332 28 5 1991 36.0000000 31.2286673 + 333 29 5 1991 33.0000000 30.8618503 + 334 30 5 1991 39.0000000 30.5033152 + 335 31 5 1991 34.0000000 30.1525859 + 336 1 6 1991 37.0000000 29.8092258 + 337 2 6 1991 35.0000000 29.4728344 + 338 3 6 1991 29.0000000 29.1430434 + 339 4 6 1991 33.0000000 28.8195144 + 340 5 6 1991 34.0000000 28.5123072 + 341 6 6 1991 32.0000000 37.3469507 + 342 7 6 1991 38.0000000 38.6155783 + 343 8 6 1991 39.0000000 30.9621381 + 344 9 6 1991 41.0000000 29.7559131 + 345 10 6 1991 44.0000000 34.7631485 + 346 11 6 1991 48.0000000 28.0554710 + 347 12 6 1991 42.0000000 27.1811819 + 348 13 6 1991 37.0000000 26.8609846 + 349 14 6 1991 39.0000000 26.5481078 + 350 15 6 1991 35.0000000 26.5465541 + 351 16 6 1991 31.0000000 28.2538434 + 352 17 6 1991 33.0000000 29.4473612 + 353 18 6 1991 31.0000000 26.8271132 + 354 19 6 1991 28.0000000 25.4201180 + 355 20 6 1991 60.0000000 50.3826514 + 356 21 6 1991 48.0000000 37.7903157 + 357 22 6 1991 54.0000000 25.8266451 + 358 23 6 1991 63.0000000 28.7700461 + 359 24 6 1991 41.0000000 25.7307734 + 360 25 6 1991 42.0000000 24.7991214 + 361 26 6 1991 43.0000000 24.4731828 + 362 27 6 1991 38.0000000 27.9743741 + 363 28 6 1991 38.0000000 26.7337974 + 364 29 6 1991 35.0000000 23.9042805 + 365 30 6 1991 41.0000000 23.5157455 diff --git a/check/case_10/output_save/daily_discharge.out b/check/case_10/output_save/daily_discharge.out deleted file mode 100644 index fee7534a..00000000 --- a/check/case_10/output_save/daily_discharge.out +++ /dev/null @@ -1,1462 +0,0 @@ - No Day Mon Year Qobs_0000000398 Qsim_0000000398 - 1 1 1 1990 157.0000000 87.0826296 - 2 2 1 1990 129.0000000 80.9202884 - 3 3 1 1990 117.0000000 75.4611605 - 4 4 1 1990 111.0000000 70.6112661 - 5 5 1 1990 112.0000000 66.2907540 - 6 6 1 1990 93.0000000 62.4587302 - 7 7 1 1990 87.0000000 59.0309614 - 8 8 1 1990 84.0000000 55.9209482 - 9 9 1 1990 80.0000000 53.1287850 - 10 10 1 1990 78.0000000 50.6052526 - 11 11 1 1990 78.0000000 48.3221949 - 12 12 1 1990 77.0000000 46.2517445 - 13 13 1 1990 76.0000000 45.9263983 - 14 14 1 1990 73.0000000 48.0165718 - 15 15 1 1990 66.0000000 55.6670425 - 16 16 1 1990 76.0000000 53.2255203 - 17 17 1 1990 73.0000000 53.6687278 - 18 18 1 1990 71.0000000 54.1187608 - 19 19 1 1990 90.0000000 50.4499895 - 20 20 1 1990 82.0000000 53.1148864 - 21 21 1 1990 80.0000000 50.2668076 - 22 22 1 1990 81.0000000 46.8767675 - 23 23 1 1990 97.0000000 134.8576660 - 24 24 1 1990 198.0000000 146.3203893 - 25 25 1 1990 392.0000000 197.9126037 - 26 26 1 1990 519.0000000 195.5958259 - 27 27 1 1990 565.0000000 161.3697570 - 28 28 1 1990 331.0000000 152.8213043 - 29 29 1 1990 293.0000000 145.9007611 - 30 30 1 1990 302.0000000 125.2253562 - 31 31 1 1990 233.0000000 113.8233740 - 32 1 2 1990 198.0000000 126.8478200 - 33 2 2 1990 183.0000000 136.7978943 - 34 3 2 1990 206.0000000 131.6773248 - 35 4 2 1990 215.0000000 114.9465289 - 36 5 2 1990 183.0000000 105.9970817 - 37 6 2 1990 159.0000000 98.6450511 - 38 7 2 1990 167.0000000 92.2053970 - 39 8 2 1990 138.0000000 88.0386561 - 40 9 2 1990 126.0000000 85.9380373 - 41 10 2 1990 131.0000000 154.7003671 - 42 11 2 1990 173.0000000 180.8708741 - 43 12 2 1990 240.0000000 199.3069807 - 44 13 2 1990 270.0000000 317.7447226 - 45 14 2 1990 458.0000000 637.7156224 - 46 15 2 1990 996.0000000 852.7657792 - 47 16 2 1990 1370.0000000 741.8663270 - 48 17 2 1990 1540.0000000 605.5442681 - 49 18 2 1990 1210.0000000 494.7484201 - 50 19 2 1990 616.0000000 403.4436660 - 51 20 2 1990 465.0000000 330.8789276 - 52 21 2 1990 373.0000000 274.4178320 - 53 22 2 1990 298.0000000 231.5096731 - 54 23 2 1990 270.0000000 199.3859770 - 55 24 2 1990 234.0000000 175.0489001 - 56 25 2 1990 218.0000000 161.3850904 - 57 26 2 1990 203.0000000 254.9866899 - 58 27 2 1990 314.0000000 413.8601916 - 59 28 2 1990 520.0000000 579.7726249 - 60 1 3 1990 689.0000000 637.8521481 - 61 2 3 1990 777.0000000 545.6312707 - 62 3 3 1990 584.0000000 446.5463629 - 63 4 3 1990 429.0000000 366.9217483 - 64 5 3 1990 365.0000000 305.6527847 - 65 6 3 1990 281.0000000 256.8523974 - 66 7 3 1990 257.0000000 220.4591419 - 67 8 3 1990 231.0000000 193.7956460 - 68 9 3 1990 211.0000000 173.9312669 - 69 10 3 1990 191.0000000 159.1046657 - 70 11 3 1990 182.0000000 148.9199848 - 71 12 3 1990 173.0000000 140.4945167 - 72 13 3 1990 159.0000000 133.1556392 - 73 14 3 1990 153.0000000 127.3760996 - 74 15 3 1990 141.0000000 121.9444624 - 75 16 3 1990 136.0000000 116.2846306 - 76 17 3 1990 130.0000000 111.3198007 - 77 18 3 1990 123.0000000 106.8333470 - 78 19 3 1990 115.0000000 102.7669292 - 79 20 3 1990 113.0000000 99.3784414 - 80 21 3 1990 102.0000000 96.3629582 - 81 22 3 1990 105.0000000 93.6877993 - 82 23 3 1990 106.0000000 90.9827056 - 83 24 3 1990 87.0000000 88.3651646 - 84 25 3 1990 80.0000000 86.0605635 - 85 26 3 1990 84.0000000 83.8217738 - 86 27 3 1990 82.0000000 81.7192673 - 87 28 3 1990 91.0000000 88.0449788 - 88 29 3 1990 97.0000000 90.7219622 - 89 30 3 1990 110.0000000 82.7561473 - 90 31 3 1990 97.0000000 80.3172698 - 91 1 4 1990 93.0000000 78.3294790 - 92 2 4 1990 85.0000000 76.4807690 - 93 3 4 1990 84.0000000 78.7095347 - 94 4 4 1990 81.0000000 77.5090406 - 95 5 4 1990 81.0000000 74.0845165 - 96 6 4 1990 76.0000000 72.6370146 - 97 7 4 1990 72.0000000 71.1252794 - 98 8 4 1990 68.0000000 69.6715638 - 99 9 4 1990 72.0000000 68.3306785 - 100 10 4 1990 65.0000000 67.0706453 - 101 11 4 1990 62.0000000 65.9612173 - 102 12 4 1990 62.0000000 65.9635707 - 103 13 4 1990 65.0000000 67.2968834 - 104 14 4 1990 68.0000000 81.5684955 - 105 15 4 1990 75.0000000 80.8096541 - 106 16 4 1990 90.0000000 73.3995488 - 107 17 4 1990 92.0000000 70.8540304 - 108 18 4 1990 94.0000000 70.3945326 - 109 19 4 1990 110.0000000 67.7810055 - 110 20 4 1990 99.0000000 66.1880082 - 111 21 4 1990 86.0000000 64.8507791 - 112 22 4 1990 86.0000000 68.1996911 - 113 23 4 1990 86.0000000 71.2189246 - 114 24 4 1990 88.0000000 67.9300925 - 115 25 4 1990 93.0000000 63.9849754 - 116 26 4 1990 99.0000000 62.6510295 - 117 27 4 1990 86.0000000 61.4867348 - 118 28 4 1990 74.0000000 60.3122659 - 119 29 4 1990 72.0000000 59.1964460 - 120 30 4 1990 77.0000000 58.1415195 - 121 1 5 1990 56.0000000 57.1402469 - 122 2 5 1990 64.0000000 56.1878309 - 123 3 5 1990 58.0000000 55.2799758 - 124 4 5 1990 50.0000000 54.4128299 - 125 5 5 1990 50.0000000 53.5829354 - 126 6 5 1990 50.0000000 52.7871842 - 127 7 5 1990 50.0000000 52.0357294 - 128 8 5 1990 53.0000000 51.6559479 - 129 9 5 1990 62.0000000 50.7349898 - 130 10 5 1990 64.0000000 53.3274636 - 131 11 5 1990 65.0000000 51.2989929 - 132 12 5 1990 75.0000000 49.1392081 - 133 13 5 1990 71.0000000 48.4798633 - 134 14 5 1990 63.0000000 47.8347542 - 135 15 5 1990 61.0000000 47.3491339 - 136 16 5 1990 49.0000000 46.6596701 - 137 17 5 1990 46.0000000 46.0744664 - 138 18 5 1990 46.0000000 45.5053357 - 139 19 5 1990 48.0000000 44.9513666 - 140 20 5 1990 41.0000000 44.4256716 - 141 21 5 1990 45.0000000 47.2115818 - 142 22 5 1990 52.0000000 45.3840853 - 143 23 5 1990 50.0000000 46.2477737 - 144 24 5 1990 56.0000000 46.9126095 - 145 25 5 1990 41.0000000 44.4564478 - 146 26 5 1990 40.0000000 42.0267610 - 147 27 5 1990 39.0000000 41.5253388 - 148 28 5 1990 39.0000000 41.0364628 - 149 29 5 1990 33.0000000 40.5589325 - 150 30 5 1990 37.0000000 40.0920522 - 151 31 5 1990 30.0000000 39.6351888 - 152 1 6 1990 37.0000000 42.9115579 - 153 2 6 1990 36.0000000 42.2154483 - 154 3 6 1990 40.0000000 61.5881418 - 155 4 6 1990 45.0000000 47.3756427 - 156 5 6 1990 39.0000000 38.5830290 - 157 6 6 1990 48.0000000 38.1045944 - 158 7 6 1990 39.0000000 73.4521428 - 159 8 6 1990 49.0000000 71.2319994 - 160 9 6 1990 84.0000000 50.4794925 - 161 10 6 1990 91.0000000 42.8132541 - 162 11 6 1990 80.0000000 39.6262002 - 163 12 6 1990 66.0000000 38.9822140 - 164 13 6 1990 53.0000000 38.3708017 - 165 14 6 1990 64.0000000 37.7760990 - 166 15 6 1990 55.0000000 37.1673105 - 167 16 6 1990 54.0000000 36.6160456 - 168 17 6 1990 42.0000000 36.0866837 - 169 18 6 1990 48.0000000 35.6944263 - 170 19 6 1990 48.0000000 45.7470431 - 171 20 6 1990 60.0000000 51.2685052 - 172 21 6 1990 75.0000000 44.5654484 - 173 22 6 1990 78.0000000 36.1472933 - 174 23 6 1990 66.0000000 35.2639736 - 175 24 6 1990 63.0000000 34.5045645 - 176 25 6 1990 52.0000000 33.9982179 - 177 26 6 1990 49.0000000 33.5110573 - 178 27 6 1990 44.0000000 37.6224460 - 179 28 6 1990 51.0000000 33.6886700 - 180 29 6 1990 61.0000000 45.9229385 - 181 30 6 1990 81.0000000 63.6118920 - 182 1 7 1990 79.0000000 43.0107114 - 183 2 7 1990 92.0000000 34.4850722 - 184 3 7 1990 72.0000000 38.6037810 - 185 4 7 1990 58.0000000 47.7698571 - 186 5 7 1990 69.0000000 59.2411667 - 187 6 7 1990 94.0000000 45.1297738 - 188 7 7 1990 199.0000000 40.1652404 - 189 8 7 1990 133.0000000 37.9826134 - 190 9 7 1990 124.0000000 33.8924599 - 191 10 7 1990 123.0000000 33.2237281 - 192 11 7 1990 99.0000000 32.5928478 - 193 12 7 1990 88.0000000 31.9958655 - 194 13 7 1990 84.0000000 31.4297328 - 195 14 7 1990 72.0000000 30.8917186 - 196 15 7 1990 55.0000000 30.3793731 - 197 16 7 1990 65.0000000 29.8904958 - 198 17 7 1990 50.0000000 29.4231080 - 199 18 7 1990 50.0000000 28.9754283 - 200 19 7 1990 46.0000000 28.5458510 - 201 20 7 1990 44.0000000 28.1329274 - 202 21 7 1990 42.0000000 27.7353487 - 203 22 7 1990 37.0000000 27.3519317 - 204 23 7 1990 38.0000000 26.9816054 - 205 24 7 1990 44.0000000 26.6233992 - 206 25 7 1990 30.0000000 26.2764331 - 207 26 7 1990 26.0000000 25.9399081 - 208 27 7 1990 31.0000000 25.6130982 - 209 28 7 1990 33.0000000 27.1857369 - 210 29 7 1990 42.0000000 25.2940262 - 211 30 7 1990 36.0000000 24.7396852 - 212 31 7 1990 34.0000000 24.4422825 - 213 1 8 1990 25.0000000 24.1521115 - 214 2 8 1990 22.0000000 23.8687299 - 215 3 8 1990 28.0000000 23.5917338 - 216 4 8 1990 25.0000000 23.3207535 - 217 5 8 1990 19.0000000 23.0554504 - 218 6 8 1990 22.0000000 22.7955144 - 219 7 8 1990 19.0000000 22.5406610 - 220 8 8 1990 22.0000000 22.2906290 - 221 9 8 1990 19.0000000 22.0451782 - 222 10 8 1990 20.0000000 21.8040879 - 223 11 8 1990 19.0000000 21.5671545 - 224 12 8 1990 19.0000000 21.3341907 - 225 13 8 1990 22.0000000 23.5506727 - 226 14 8 1990 36.0000000 34.0725991 - 227 15 8 1990 31.0000000 28.8535465 - 228 16 8 1990 30.0000000 25.3475916 - 229 17 8 1990 28.0000000 21.6638406 - 230 18 8 1990 34.0000000 20.5294692 - 231 19 8 1990 21.0000000 20.2896526 - 232 20 8 1990 30.0000000 20.0554706 - 233 21 8 1990 22.0000000 19.8263118 - 234 22 8 1990 21.0000000 19.6018909 - 235 23 8 1990 23.0000000 19.3819475 - 236 24 8 1990 20.0000000 19.1662433 - 237 25 8 1990 29.0000000 18.9545828 - 238 26 8 1990 20.0000000 18.8040091 - 239 27 8 1990 22.0000000 19.1855916 - 240 28 8 1990 23.0000000 18.3759229 - 241 29 8 1990 35.0000000 18.1492614 - 242 30 8 1990 51.0000000 95.8205978 - 243 31 8 1990 80.0000000 83.6490636 - 244 1 9 1990 56.0000000 27.6238722 - 245 2 9 1990 33.0000000 21.7958666 - 246 3 9 1990 27.0000000 21.2852955 - 247 4 9 1990 27.0000000 23.5625815 - 248 5 9 1990 28.0000000 22.7469598 - 249 6 9 1990 26.0000000 20.0191086 - 250 7 9 1990 24.0000000 22.1097220 - 251 8 9 1990 33.0000000 20.0806099 - 252 9 9 1990 26.0000000 19.0902290 - 253 10 9 1990 27.0000000 18.7387878 - 254 11 9 1990 22.0000000 18.4058785 - 255 12 9 1990 22.0000000 18.0898089 - 256 13 9 1990 21.0000000 17.7890677 - 257 14 9 1990 22.0000000 17.5023029 - 258 15 9 1990 22.0000000 17.2283039 - 259 16 9 1990 22.0000000 16.9659852 - 260 17 9 1990 20.0000000 16.7143719 - 261 18 9 1990 22.0000000 16.4725877 - 262 19 9 1990 16.0000000 16.2398437 - 263 20 9 1990 22.0000000 16.0154291 - 264 21 9 1990 19.0000000 20.1163922 - 265 22 9 1990 32.0000000 78.3956311 - 266 23 9 1990 27.0000000 55.1976975 - 267 24 9 1990 45.0000000 27.8713894 - 268 25 9 1990 42.0000000 19.0265536 - 269 26 9 1990 39.0000000 17.7930012 - 270 27 9 1990 30.0000000 17.4019729 - 271 28 9 1990 28.0000000 17.0351403 - 272 29 9 1990 30.0000000 16.6901804 - 273 30 9 1990 30.0000000 57.8446087 - 274 1 10 1990 56.0000000 89.9515226 - 275 2 10 1990 72.0000000 47.1035130 - 276 3 10 1990 73.0000000 39.7399143 - 277 4 10 1990 68.0000000 33.9399904 - 278 5 10 1990 53.0000000 25.2129749 - 279 6 10 1990 42.0000000 23.3544055 - 280 7 10 1990 33.0000000 22.4647686 - 281 8 10 1990 42.0000000 21.6524603 - 282 9 10 1990 34.0000000 20.9086550 - 283 10 10 1990 36.0000000 20.2258888 - 284 11 10 1990 36.0000000 19.5976087 - 285 12 10 1990 28.0000000 19.0180501 - 286 13 10 1990 32.0000000 18.4821322 - 287 14 10 1990 27.0000000 17.9853694 - 288 15 10 1990 35.0000000 17.7225780 - 289 16 10 1990 42.0000000 17.9849207 - 290 17 10 1990 35.0000000 24.8076553 - 291 18 10 1990 39.0000000 23.1472148 - 292 19 10 1990 34.0000000 16.9741291 - 293 20 10 1990 32.0000000 16.5641305 - 294 21 10 1990 34.0000000 16.1847459 - 295 22 10 1990 27.0000000 15.8292532 - 296 23 10 1990 31.0000000 15.4953854 - 297 24 10 1990 28.0000000 15.1811199 - 298 25 10 1990 25.0000000 15.2138522 - 299 26 10 1990 29.0000000 29.2458521 - 300 27 10 1990 31.0000000 35.4726362 - 301 28 10 1990 65.0000000 151.0079984 - 302 29 10 1990 69.0000000 121.9910932 - 303 30 10 1990 157.0000000 65.5439118 - 304 31 10 1990 190.0000000 46.8309154 - 305 1 11 1990 115.0000000 53.6897421 - 306 2 11 1990 104.0000000 60.5640137 - 307 3 11 1990 100.0000000 57.3357357 - 308 4 11 1990 131.0000000 52.6167442 - 309 5 11 1990 130.0000000 47.6413832 - 310 6 11 1990 115.0000000 40.5944070 - 311 7 11 1990 102.0000000 37.7724550 - 312 8 11 1990 95.0000000 35.6672305 - 313 9 11 1990 81.0000000 33.7976186 - 314 10 11 1990 66.0000000 43.4655125 - 315 11 11 1990 67.0000000 68.3820216 - 316 12 11 1990 74.0000000 57.0531998 - 317 13 11 1990 109.0000000 52.6686190 - 318 14 11 1990 92.0000000 73.1717801 - 319 15 11 1990 92.0000000 68.1009412 - 320 16 11 1990 155.0000000 54.9803355 - 321 17 11 1990 159.0000000 54.9903493 - 322 18 11 1990 131.0000000 69.8537580 - 323 19 11 1990 161.0000000 74.4412638 - 324 20 11 1990 196.0000000 149.8215508 - 325 21 11 1990 336.0000000 138.5547737 - 326 22 11 1990 566.0000000 118.7895234 - 327 23 11 1990 373.0000000 133.1259490 - 328 24 11 1990 293.0000000 124.9014449 - 329 25 11 1990 264.0000000 124.7570465 - 330 26 11 1990 226.0000000 110.6906347 - 331 27 11 1990 201.0000000 95.3157629 - 332 28 11 1990 180.0000000 85.2073972 - 333 29 11 1990 161.0000000 88.7659223 - 334 30 11 1990 149.0000000 83.7879889 - 335 1 12 1990 134.0000000 74.7342926 - 336 2 12 1990 113.0000000 69.9463808 - 337 3 12 1990 99.0000000 65.7436596 - 338 4 12 1990 107.0000000 62.1229313 - 339 5 12 1990 99.0000000 58.7629362 - 340 6 12 1990 89.0000000 55.7100806 - 341 7 12 1990 77.0000000 52.9632292 - 342 8 12 1990 71.0000000 50.4813281 - 343 9 12 1990 68.0000000 48.2332817 - 344 10 12 1990 73.0000000 46.1920938 - 345 11 12 1990 84.0000000 44.3342654 - 346 12 12 1990 88.0000000 61.6342336 - 347 13 12 1990 92.0000000 63.0417267 - 348 14 12 1990 128.0000000 54.2481632 - 349 15 12 1990 136.0000000 49.3709758 - 350 16 12 1990 114.0000000 47.0409527 - 351 17 12 1990 101.0000000 44.9824982 - 352 18 12 1990 93.0000000 43.1181199 - 353 19 12 1990 85.0000000 41.4249538 - 354 20 12 1990 81.0000000 39.8831631 - 355 21 12 1990 106.0000000 73.2477968 - 356 22 12 1990 159.0000000 89.1837169 - 357 23 12 1990 250.0000000 92.0277220 - 358 24 12 1990 298.0000000 79.5800981 - 359 25 12 1990 261.0000000 120.2246325 - 360 26 12 1990 228.0000000 189.1867257 - 361 27 12 1990 409.0000000 209.4525329 - 362 28 12 1990 486.0000000 219.5405389 - 363 29 12 1990 440.0000000 307.9651702 - 364 30 12 1990 486.0000000 383.3210773 - 365 31 12 1990 774.0000000 470.5824565 - 366 1 1 1991 889.0000000 520.0307237 - 367 2 1 1991 863.0000000 571.8206916 - 368 3 1 1991 875.0000000 625.7031607 - 369 4 1 1991 932.0000000 559.0163283 - 370 5 1 1991 826.0000000 536.8915504 - 371 6 1 1991 731.0000000 502.8396394 - 372 7 1 1991 613.0000000 482.1799799 - 373 8 1 1991 610.0000000 480.0947555 - 374 9 1 1991 686.0000000 432.1208663 - 375 10 1 1991 556.0000000 470.6291522 - 376 11 1 1991 669.0000000 500.6302808 - 377 12 1 1991 828.0000000 470.4218000 - 378 13 1 1991 735.0000000 381.8713150 - 379 14 1 1991 513.0000000 312.4927857 - 380 15 1 1991 411.0000000 258.4278014 - 381 16 1 1991 345.0000000 218.2385453 - 382 17 1 1991 293.0000000 189.6987990 - 383 18 1 1991 251.0000000 169.1802172 - 384 19 1 1991 222.0000000 154.2747997 - 385 20 1 1991 215.0000000 144.0364950 - 386 21 1 1991 213.0000000 139.6248449 - 387 22 1 1991 202.0000000 139.9411567 - 388 23 1 1991 200.0000000 132.0183359 - 389 24 1 1991 192.0000000 124.7174206 - 390 25 1 1991 176.0000000 118.0309049 - 391 26 1 1991 164.0000000 112.1324860 - 392 27 1 1991 157.0000000 106.7278754 - 393 28 1 1991 134.0000000 101.8765388 - 394 29 1 1991 130.0000000 97.5084675 - 395 30 1 1991 119.0000000 93.5634965 - 396 31 1 1991 107.0000000 89.9898844 - 397 1 2 1991 112.0000000 86.7430048 - 398 2 2 1991 109.0000000 83.7842617 - 399 3 2 1991 101.0000000 81.0801867 - 400 4 2 1991 98.0000000 78.6016852 - 401 5 2 1991 84.0000000 76.3234043 - 402 6 2 1991 93.0000000 74.2232012 - 403 7 2 1991 80.0000000 72.2816944 - 404 8 2 1991 73.0000000 70.4818841 - 405 9 2 1991 89.0000000 68.8088297 - 406 10 2 1991 84.0000000 67.2493750 - 407 11 2 1991 78.0000000 65.7919139 - 408 12 2 1991 79.0000000 64.4261899 - 409 13 2 1991 77.0000000 63.1431233 - 410 14 2 1991 80.0000000 61.9346632 - 411 15 2 1991 72.0000000 60.7936598 - 412 16 2 1991 78.0000000 60.9682127 - 413 17 2 1991 74.0000000 60.9374387 - 414 18 2 1991 77.0000000 59.7320805 - 415 19 2 1991 73.0000000 68.7235837 - 416 20 2 1991 69.0000000 80.5976251 - 417 21 2 1991 74.0000000 106.0438820 - 418 22 2 1991 81.0000000 112.7053098 - 419 23 2 1991 110.0000000 107.9256303 - 420 24 2 1991 180.0000000 104.4878418 - 421 25 2 1991 213.0000000 103.3810311 - 422 26 2 1991 222.0000000 101.6856348 - 423 27 2 1991 208.0000000 99.5660582 - 424 28 2 1991 211.0000000 96.2845989 - 425 1 3 1991 214.0000000 92.7325262 - 426 2 3 1991 208.0000000 97.2781481 - 427 3 3 1991 221.0000000 94.4520046 - 428 4 3 1991 281.0000000 89.2197011 - 429 5 3 1991 219.0000000 85.6362257 - 430 6 3 1991 190.0000000 82.4448346 - 431 7 3 1991 173.0000000 79.5330067 - 432 8 3 1991 164.0000000 77.0131055 - 433 9 3 1991 142.0000000 74.9789100 - 434 10 3 1991 133.0000000 74.4727962 - 435 11 3 1991 133.0000000 72.2615227 - 436 12 3 1991 118.0000000 70.1872584 - 437 13 3 1991 127.0000000 68.1931654 - 438 14 3 1991 113.0000000 66.3505906 - 439 15 3 1991 107.0000000 64.6431901 - 440 16 3 1991 100.0000000 63.0568709 - 441 17 3 1991 100.0000000 61.5806375 - 442 18 3 1991 95.0000000 60.2189823 - 443 19 3 1991 98.0000000 107.5131374 - 444 20 3 1991 119.0000000 100.5332583 - 445 21 3 1991 159.0000000 107.8879535 - 446 22 3 1991 196.0000000 111.5642876 - 447 23 3 1991 242.0000000 98.3714614 - 448 24 3 1991 216.0000000 92.1520710 - 449 25 3 1991 180.0000000 87.8424759 - 450 26 3 1991 145.0000000 84.0572838 - 451 27 3 1991 127.0000000 81.0189445 - 452 28 3 1991 117.0000000 77.7316411 - 453 29 3 1991 109.0000000 74.8102020 - 454 30 3 1991 106.0000000 72.1514955 - 455 31 3 1991 99.0000000 69.7247792 - 456 1 4 1991 96.0000000 67.5034641 - 457 2 4 1991 88.0000000 65.4643993 - 458 3 4 1991 87.0000000 63.5873787 - 459 4 4 1991 82.0000000 62.0082002 - 460 5 4 1991 84.0000000 60.5490509 - 461 6 4 1991 67.0000000 59.0320580 - 462 7 4 1991 89.0000000 57.6771739 - 463 8 4 1991 75.0000000 56.4173786 - 464 9 4 1991 79.0000000 55.1867134 - 465 10 4 1991 70.0000000 54.0263771 - 466 11 4 1991 69.0000000 52.9365683 - 467 12 4 1991 69.0000000 51.9104524 - 468 13 4 1991 56.0000000 50.9419548 - 469 14 4 1991 63.0000000 50.0256913 - 470 15 4 1991 58.0000000 49.1569793 - 471 16 4 1991 56.0000000 48.3311697 - 472 17 4 1991 54.0000000 47.5446030 - 473 18 4 1991 57.0000000 46.8037693 - 474 19 4 1991 53.0000000 46.3486180 - 475 20 4 1991 53.0000000 45.7325231 - 476 21 4 1991 65.0000000 45.1196487 - 477 22 4 1991 69.0000000 46.0370065 - 478 23 4 1991 61.0000000 45.2924871 - 479 24 4 1991 56.0000000 43.9232858 - 480 25 4 1991 56.0000000 43.0651660 - 481 26 4 1991 53.0000000 42.4637572 - 482 27 4 1991 49.0000000 41.8835946 - 483 28 4 1991 53.0000000 41.3235013 - 484 29 4 1991 48.0000000 43.7480026 - 485 30 4 1991 57.0000000 75.7104594 - 486 1 5 1991 69.0000000 64.3493523 - 487 2 5 1991 89.0000000 45.2652234 - 488 3 5 1991 105.0000000 44.0396919 - 489 4 5 1991 79.0000000 43.2128442 - 490 5 5 1991 69.0000000 42.4381257 - 491 6 5 1991 71.0000000 41.7072523 - 492 7 5 1991 60.0000000 41.0026066 - 493 8 5 1991 64.0000000 40.3305215 - 494 9 5 1991 59.0000000 39.6891405 - 495 10 5 1991 57.0000000 40.4635722 - 496 11 5 1991 55.0000000 41.1242154 - 497 12 5 1991 53.0000000 38.6431849 - 498 13 5 1991 52.0000000 37.8552866 - 499 14 5 1991 50.0000000 37.3479498 - 500 15 5 1991 52.0000000 39.7461067 - 501 16 5 1991 54.0000000 39.1971404 - 502 17 5 1991 54.0000000 36.5133350 - 503 18 5 1991 55.0000000 35.9841084 - 504 19 5 1991 48.0000000 35.4907654 - 505 20 5 1991 48.0000000 35.0138604 - 506 21 5 1991 49.0000000 34.5522091 - 507 22 5 1991 41.0000000 34.1047341 - 508 23 5 1991 40.0000000 33.6704538 - 509 24 5 1991 40.0000000 33.2484736 - 510 25 5 1991 39.0000000 32.8379775 - 511 26 5 1991 43.0000000 32.4382202 - 512 27 5 1991 39.0000000 32.0485211 - 513 28 5 1991 36.0000000 31.6682577 - 514 29 5 1991 33.0000000 31.2968605 - 515 30 5 1991 39.0000000 30.9338079 - 516 31 5 1991 34.0000000 30.5786217 - 517 1 6 1991 37.0000000 30.2308636 - 518 2 6 1991 35.0000000 29.8901309 - 519 3 6 1991 29.0000000 29.5560540 - 520 4 6 1991 33.0000000 29.2282928 - 521 5 6 1991 34.0000000 28.9169068 - 522 6 6 1991 32.0000000 37.7476067 - 523 7 6 1991 38.0000000 39.0125950 - 524 8 6 1991 39.0000000 31.3554603 - 525 9 6 1991 41.0000000 30.1453578 - 526 10 6 1991 44.0000000 35.1491250 - 527 11 6 1991 48.0000000 28.4377091 - 528 12 6 1991 42.0000000 27.5594769 - 529 13 6 1991 37.0000000 27.2353873 - 530 14 6 1991 39.0000000 26.9186682 - 531 15 6 1991 35.0000000 26.9133298 - 532 16 6 1991 31.0000000 28.6169944 - 533 17 6 1991 33.0000000 29.8071979 - 534 18 6 1991 31.0000000 27.1836155 - 535 19 6 1991 28.0000000 25.7731474 - 536 20 6 1991 60.0000000 50.7324808 - 537 21 6 1991 48.0000000 38.1376742 - 538 22 6 1991 54.0000000 26.1705914 - 539 23 6 1991 63.0000000 29.1105746 - 540 24 6 1991 41.0000000 26.0678614 - 541 25 6 1991 42.0000000 25.1327080 - 542 26 6 1991 43.0000000 24.8033106 - 543 27 6 1991 38.0000000 28.3012623 - 544 28 6 1991 38.0000000 27.0577445 - 545 29 6 1991 35.0000000 24.2251200 - 546 30 6 1991 41.0000000 23.8332907 - 547 1 7 1991 41.0000000 23.5322136 - 548 2 7 1991 38.0000000 23.2399615 - 549 3 7 1991 34.0000000 22.9555323 - 550 4 7 1991 27.0000000 22.6784122 - 551 5 7 1991 31.0000000 22.4081336 - 552 6 7 1991 30.0000000 22.1442799 - 553 7 7 1991 26.0000000 26.4770993 - 554 8 7 1991 30.0000000 22.9159109 - 555 9 7 1991 31.0000000 21.5762827 - 556 10 7 1991 23.0000000 21.3228131 - 557 11 7 1991 35.0000000 21.0750957 - 558 12 7 1991 19.0000000 22.0383163 - 559 13 7 1991 24.0000000 35.9461451 - 560 14 7 1991 26.0000000 30.3169510 - 561 15 7 1991 27.0000000 21.2332536 - 562 16 7 1991 41.0000000 20.4291881 - 563 17 7 1991 34.0000000 20.1786954 - 564 18 7 1991 27.0000000 19.9349691 - 565 19 7 1991 25.0000000 19.6972772 - 566 20 7 1991 23.0000000 19.4652416 - 567 21 7 1991 22.0000000 19.2385178 - 568 22 7 1991 27.0000000 19.0167912 - 569 23 7 1991 23.0000000 18.7997747 - 570 24 7 1991 21.0000000 19.3181465 - 571 25 7 1991 23.0000000 31.7959847 - 572 26 7 1991 33.0000000 29.2575105 - 573 27 7 1991 23.0000000 18.7698213 - 574 28 7 1991 29.0000000 18.2371423 - 575 29 7 1991 30.0000000 18.0157187 - 576 30 7 1991 35.0000000 26.3404782 - 577 31 7 1991 27.0000000 22.5696160 - 578 1 8 1991 45.0000000 17.6794889 - 579 2 8 1991 47.0000000 17.4510878 - 580 3 8 1991 40.0000000 17.2385247 - 581 4 8 1991 35.0000000 17.0313749 - 582 5 8 1991 26.0000000 16.8292906 - 583 6 8 1991 23.0000000 16.6319554 - 584 7 8 1991 30.0000000 17.5237003 - 585 8 8 1991 33.0000000 17.8035683 - 586 9 8 1991 30.0000000 16.1152923 - 587 10 8 1991 28.0000000 15.9309003 - 588 11 8 1991 19.0000000 15.7507989 - 589 12 8 1991 20.0000000 15.5742625 - 590 13 8 1991 16.0000000 15.4011042 - 591 14 8 1991 18.0000000 15.2311524 - 592 15 8 1991 18.0000000 15.0642498 - 593 16 8 1991 20.0000000 14.9002517 - 594 17 8 1991 16.0000000 14.7390250 - 595 18 8 1991 15.0000000 14.5804470 - 596 19 8 1991 15.0000000 14.4244047 - 597 20 8 1991 14.0000000 14.2707937 - 598 21 8 1991 15.0000000 14.1195175 - 599 22 8 1991 13.0000000 13.9704866 - 600 23 8 1991 12.0000000 13.8503694 - 601 24 8 1991 11.0000000 13.6852643 - 602 25 8 1991 12.0000000 13.5364625 - 603 26 8 1991 11.0000000 13.3956258 - 604 27 8 1991 13.0000000 13.2566765 - 605 28 8 1991 11.0000000 13.1195567 - 606 29 8 1991 12.0000000 12.9842126 - 607 30 8 1991 12.0000000 12.8505936 - 608 31 8 1991 11.0000000 12.7186525 - 609 1 9 1991 11.0000000 13.8725598 - 610 2 9 1991 17.0000000 13.0696339 - 611 3 9 1991 11.0000000 12.3602096 - 612 4 9 1991 12.0000000 12.2330356 - 613 5 9 1991 11.0000000 12.1076240 - 614 6 9 1991 11.0000000 11.9837518 - 615 7 9 1991 18.0000000 11.8613805 - 616 8 9 1991 11.0000000 11.7404740 - 617 9 9 1991 13.0000000 11.6209982 - 618 10 9 1991 12.0000000 12.0740584 - 619 11 9 1991 11.0000000 34.1815498 - 620 12 9 1991 20.0000000 28.7011493 - 621 13 9 1991 21.0000000 11.6978225 - 622 14 9 1991 29.0000000 11.5520918 - 623 15 9 1991 28.0000000 11.4115806 - 624 16 9 1991 20.0000000 11.2746595 - 625 17 9 1991 20.0000000 11.1410946 - 626 18 9 1991 20.0000000 11.0106734 - 627 19 9 1991 12.0000000 10.8832028 - 628 20 9 1991 11.0000000 10.7585068 - 629 21 9 1991 11.0000000 10.6364251 - 630 22 9 1991 22.0000000 28.1937975 - 631 23 9 1991 14.0000000 26.4075535 - 632 24 9 1991 48.0000000 10.8624234 - 633 25 9 1991 45.0000000 61.5022775 - 634 26 9 1991 80.0000000 58.6940989 - 635 27 9 1991 61.0000000 35.9576356 - 636 28 9 1991 61.0000000 52.8574429 - 637 29 9 1991 65.0000000 48.2220406 - 638 30 9 1991 63.0000000 33.1519413 - 639 1 10 1991 90.0000000 19.4664401 - 640 2 10 1991 59.0000000 18.6146541 - 641 3 10 1991 45.0000000 17.7788262 - 642 4 10 1991 42.0000000 17.0224474 - 643 5 10 1991 41.0000000 56.7876350 - 644 6 10 1991 41.0000000 51.3732687 - 645 7 10 1991 73.0000000 24.2316350 - 646 8 10 1991 96.0000000 20.8259816 - 647 9 10 1991 61.0000000 19.7977245 - 648 10 10 1991 44.0000000 18.8702163 - 649 11 10 1991 42.0000000 18.0901076 - 650 12 10 1991 41.0000000 40.1365319 - 651 13 10 1991 42.0000000 34.6279247 - 652 14 10 1991 61.0000000 19.3450585 - 653 15 10 1991 55.0000000 18.4891981 - 654 16 10 1991 41.0000000 20.8542121 - 655 17 10 1991 48.0000000 33.7588370 - 656 18 10 1991 52.0000000 53.3836621 - 657 19 10 1991 66.0000000 33.6456156 - 658 20 10 1991 59.0000000 23.9751490 - 659 21 10 1991 71.0000000 22.0855389 - 660 22 10 1991 74.0000000 20.1252456 - 661 23 10 1991 70.0000000 19.1821889 - 662 24 10 1991 59.0000000 18.3692818 - 663 25 10 1991 57.0000000 17.6288955 - 664 26 10 1991 57.0000000 16.9530007 - 665 27 10 1991 51.0000000 16.3345573 - 666 28 10 1991 47.0000000 15.7673823 - 667 29 10 1991 48.0000000 15.2460349 - 668 30 10 1991 45.0000000 17.4692912 - 669 31 10 1991 43.0000000 19.2842492 - 670 1 11 1991 40.0000000 29.8189665 - 671 2 11 1991 47.0000000 30.0947845 - 672 3 11 1991 46.0000000 51.5882519 - 673 4 11 1991 76.0000000 69.2246241 - 674 5 11 1991 60.0000000 48.1606834 - 675 6 11 1991 132.0000000 36.4603623 - 676 7 11 1991 133.0000000 47.6879744 - 677 8 11 1991 113.0000000 66.3770000 - 678 9 11 1991 120.0000000 56.6072894 - 679 10 11 1991 141.0000000 41.3149023 - 680 11 11 1991 208.0000000 73.4112293 - 681 12 11 1991 166.0000000 114.3129555 - 682 13 11 1991 183.0000000 136.8989585 - 683 14 11 1991 299.0000000 167.8087622 - 684 15 11 1991 521.0000000 132.0758294 - 685 16 11 1991 443.0000000 112.6196180 - 686 17 11 1991 304.0000000 99.2770996 - 687 18 11 1991 231.0000000 115.6797412 - 688 19 11 1991 192.0000000 112.7539099 - 689 20 11 1991 199.0000000 102.0920865 - 690 21 11 1991 201.0000000 95.7046976 - 691 22 11 1991 173.0000000 83.2678013 - 692 23 11 1991 159.0000000 75.4396335 - 693 24 11 1991 160.0000000 69.8006436 - 694 25 11 1991 146.0000000 65.1808950 - 695 26 11 1991 110.0000000 61.1074963 - 696 27 11 1991 114.0000000 57.4474703 - 697 28 11 1991 97.0000000 54.1692497 - 698 29 11 1991 89.0000000 51.2227705 - 699 30 11 1991 73.0000000 48.5680460 - 700 1 12 1991 69.0000000 46.1705075 - 701 2 12 1991 67.0000000 44.0001854 - 702 3 12 1991 63.0000000 42.0310272 - 703 4 12 1991 58.0000000 40.2403275 - 704 5 12 1991 59.0000000 38.6082497 - 705 6 12 1991 53.0000000 37.1174238 - 706 7 12 1991 54.0000000 35.7526055 - 707 8 12 1991 51.0000000 34.5003882 - 708 9 12 1991 47.0000000 33.3489579 - 709 10 12 1991 42.0000000 32.2878841 - 710 11 12 1991 40.0000000 31.3079408 - 711 12 12 1991 39.0000000 30.4009533 - 712 13 12 1991 36.0000000 29.5596663 - 713 14 12 1991 37.0000000 28.7776304 - 714 15 12 1991 32.0000000 28.0491035 - 715 16 12 1991 37.0000000 39.2144490 - 716 17 12 1991 62.0000000 127.7768510 - 717 18 12 1991 118.0000000 128.9194128 - 718 19 12 1991 170.0000000 172.9921745 - 719 20 12 1991 229.0000000 222.3248120 - 720 21 12 1991 448.0000000 290.5623422 - 721 22 12 1991 464.0000000 414.2735780 - 722 23 12 1991 675.0000000 375.2894879 - 723 24 12 1991 844.0000000 326.4659349 - 724 25 12 1991 569.0000000 270.7457406 - 725 26 12 1991 358.0000000 228.3638734 - 726 27 12 1991 279.0000000 196.6631562 - 727 28 12 1991 238.0000000 169.4946522 - 728 29 12 1991 201.0000000 147.5073627 - 729 30 12 1991 185.0000000 129.9747065 - 730 31 12 1991 165.0000000 115.0322170 - 731 1 1 1992 140.0000000 102.7387807 - 732 2 1 1992 126.0000000 94.9738604 - 733 3 1 1992 117.0000000 89.9294897 - 734 4 1 1992 114.0000000 88.2744115 - 735 5 1 1992 108.0000000 84.0861611 - 736 6 1 1992 108.0000000 79.0746798 - 737 7 1 1992 101.0000000 75.2246622 - 738 8 1 1992 97.0000000 74.3078923 - 739 9 1 1992 89.0000000 88.7238419 - 740 10 1 1992 111.0000000 114.1051129 - 741 11 1 1992 135.0000000 104.6137796 - 742 12 1 1992 171.0000000 92.7285570 - 743 13 1 1992 125.0000000 87.5442963 - 744 14 1 1992 111.0000000 82.9443494 - 745 15 1 1992 100.0000000 78.8391548 - 746 16 1 1992 87.0000000 75.2529961 - 747 17 1 1992 75.0000000 71.9045400 - 748 18 1 1992 79.0000000 68.8586633 - 749 19 1 1992 70.0000000 72.1015870 - 750 20 1 1992 72.0000000 69.0552284 - 751 21 1 1992 87.0000000 66.2399613 - 752 22 1 1992 79.0000000 63.1841137 - 753 23 1 1992 71.0000000 60.8832620 - 754 24 1 1992 66.0000000 58.7824601 - 755 25 1 1992 67.0000000 56.8590758 - 756 26 1 1992 65.0000000 55.0933658 - 757 27 1 1992 59.0000000 53.4680654 - 758 28 1 1992 57.0000000 51.9909457 - 759 29 1 1992 54.0000000 50.9202510 - 760 30 1 1992 59.0000000 52.6450103 - 761 31 1 1992 57.0000000 58.5111885 - 762 1 2 1992 56.0000000 59.3061468 - 763 2 2 1992 54.0000000 57.4198236 - 764 3 2 1992 58.0000000 55.8823728 - 765 4 2 1992 63.0000000 106.6139193 - 766 5 2 1992 76.0000000 129.1445001 - 767 6 2 1992 250.0000000 134.5794666 - 768 7 2 1992 346.0000000 117.3285673 - 769 8 2 1992 241.0000000 104.7959316 - 770 9 2 1992 180.0000000 104.8900633 - 771 10 2 1992 164.0000000 109.6737734 - 772 11 2 1992 183.0000000 129.3585277 - 773 12 2 1992 215.0000000 147.2185382 - 774 13 2 1992 265.0000000 151.4868489 - 775 14 2 1992 287.0000000 160.1444536 - 776 15 2 1992 272.0000000 160.4899883 - 777 16 2 1992 253.0000000 183.6211715 - 778 17 2 1992 301.0000000 174.5605142 - 779 18 2 1992 275.0000000 149.4135120 - 780 19 2 1992 224.0000000 132.9902826 - 781 20 2 1992 194.0000000 120.1983549 - 782 21 2 1992 173.0000000 111.9989454 - 783 22 2 1992 157.0000000 105.6922488 - 784 23 2 1992 142.0000000 100.7367358 - 785 24 2 1992 133.0000000 97.7684582 - 786 25 2 1992 128.0000000 93.3897100 - 787 26 2 1992 125.0000000 88.7959046 - 788 27 2 1992 125.0000000 84.8988767 - 789 28 2 1992 110.0000000 81.3790645 - 790 29 2 1992 107.0000000 78.1809219 - 791 1 3 1992 97.0000000 75.3486397 - 792 2 3 1992 97.0000000 73.8212274 - 793 3 3 1992 86.0000000 73.6250677 - 794 4 3 1992 93.0000000 70.3271243 - 795 5 3 1992 86.0000000 68.1501314 - 796 6 3 1992 82.0000000 66.1456691 - 797 7 3 1992 80.0000000 64.2330296 - 798 8 3 1992 77.0000000 62.4618339 - 799 9 3 1992 73.0000000 60.8194396 - 800 10 3 1992 76.0000000 59.3889906 - 801 11 3 1992 68.0000000 58.1001034 - 802 12 3 1992 70.0000000 108.2217001 - 803 13 3 1992 116.0000000 151.7410540 - 804 14 3 1992 206.0000000 157.6408051 - 805 15 3 1992 433.0000000 185.9478013 - 806 16 3 1992 495.0000000 198.5419712 - 807 17 3 1992 331.0000000 168.6982303 - 808 18 3 1992 240.0000000 148.3114687 - 809 19 3 1992 215.0000000 132.1544622 - 810 20 3 1992 185.0000000 119.0360551 - 811 21 3 1992 185.0000000 115.2772433 - 812 22 3 1992 185.0000000 158.2669639 - 813 23 3 1992 213.0000000 221.0031181 - 814 24 3 1992 466.0000000 243.2741698 - 815 25 3 1992 580.0000000 254.3617389 - 816 26 3 1992 566.0000000 236.6469376 - 817 27 3 1992 487.0000000 210.3319015 - 818 28 3 1992 387.0000000 193.7794611 - 819 29 3 1992 311.0000000 173.0908872 - 820 30 3 1992 270.0000000 155.0686497 - 821 31 3 1992 246.0000000 148.6040498 - 822 1 4 1992 229.0000000 158.6902292 - 823 2 4 1992 222.0000000 151.2163590 - 824 3 4 1992 217.0000000 159.6699989 - 825 4 4 1992 208.0000000 205.9286568 - 826 5 4 1992 220.0000000 189.6860434 - 827 6 4 1992 210.0000000 166.6805603 - 828 7 4 1992 190.0000000 147.7478520 - 829 8 4 1992 173.0000000 132.6045685 - 830 9 4 1992 166.0000000 119.8745777 - 831 10 4 1992 133.0000000 109.2348573 - 832 11 4 1992 126.0000000 102.5446951 - 833 12 4 1992 124.0000000 98.2687630 - 834 13 4 1992 116.0000000 94.7453195 - 835 14 4 1992 112.0000000 96.1299198 - 836 15 4 1992 111.0000000 114.0992922 - 837 16 4 1992 137.0000000 111.2110600 - 838 17 4 1992 206.0000000 103.0909764 - 839 18 4 1992 176.0000000 99.0909477 - 840 19 4 1992 161.0000000 94.4554520 - 841 20 4 1992 161.0000000 91.1651488 - 842 21 4 1992 139.0000000 88.1615534 - 843 22 4 1992 139.0000000 85.4049019 - 844 23 4 1992 123.0000000 82.8677220 - 845 24 4 1992 119.0000000 80.5264766 - 846 25 4 1992 111.0000000 78.3605171 - 847 26 4 1992 94.0000000 76.3596391 - 848 27 4 1992 94.0000000 76.9051170 - 849 28 4 1992 102.0000000 77.5913961 - 850 29 4 1992 120.0000000 74.5513829 - 851 30 4 1992 120.0000000 72.2068768 - 852 1 5 1992 114.0000000 89.4611567 - 853 2 5 1992 115.0000000 91.3155891 - 854 3 5 1992 206.0000000 76.4613356 - 855 4 5 1992 215.0000000 73.7626987 - 856 5 5 1992 125.0000000 71.9591286 - 857 6 5 1992 123.0000000 70.2778444 - 858 7 5 1992 113.0000000 68.7064510 - 859 8 5 1992 77.0000000 67.2341812 - 860 9 5 1992 83.0000000 65.8782584 - 861 10 5 1992 83.0000000 70.6137536 - 862 11 5 1992 96.0000000 69.8932628 - 863 12 5 1992 120.0000000 63.4829763 - 864 13 5 1992 80.0000000 61.7408831 - 865 14 5 1992 76.0000000 60.6438889 - 866 15 5 1992 69.0000000 59.6021432 - 867 16 5 1992 63.0000000 58.6107733 - 868 17 5 1992 61.0000000 57.6654075 - 869 18 5 1992 60.0000000 56.7621188 - 870 19 5 1992 59.0000000 55.8973752 - 871 20 5 1992 67.0000000 55.0679967 - 872 21 5 1992 51.0000000 54.2711168 - 873 22 5 1992 44.0000000 53.5041490 - 874 23 5 1992 42.0000000 52.7647568 - 875 24 5 1992 51.0000000 52.1035439 - 876 25 5 1992 42.0000000 51.3819931 - 877 26 5 1992 54.0000000 56.4016897 - 878 27 5 1992 53.0000000 52.1122221 - 879 28 5 1992 59.0000000 49.7256181 - 880 29 5 1992 55.0000000 52.9574658 - 881 30 5 1992 54.0000000 51.4457186 - 882 31 5 1992 48.0000000 49.5473985 - 883 1 6 1992 63.0000000 50.5960861 - 884 2 6 1992 61.0000000 48.9074554 - 885 3 6 1992 55.0000000 49.7371850 - 886 4 6 1992 75.0000000 59.1593500 - 887 5 6 1992 53.0000000 62.2176481 - 888 6 6 1992 77.0000000 57.4713052 - 889 7 6 1992 114.0000000 53.0701862 - 890 8 6 1992 167.0000000 56.7777588 - 891 9 6 1992 116.0000000 49.4624426 - 892 10 6 1992 91.0000000 46.1142616 - 893 11 6 1992 85.0000000 45.4177045 - 894 12 6 1992 68.0000000 44.7757321 - 895 13 6 1992 71.0000000 44.1567237 - 896 14 6 1992 63.0000000 43.5589380 - 897 15 6 1992 59.0000000 42.9807950 - 898 16 6 1992 46.0000000 42.4208617 - 899 17 6 1992 44.0000000 41.8778376 - 900 18 6 1992 39.0000000 41.3505410 - 901 19 6 1992 41.0000000 40.8388414 - 902 20 6 1992 44.0000000 40.9360411 - 903 21 6 1992 39.0000000 40.0782826 - 904 22 6 1992 32.0000000 39.4373469 - 905 23 6 1992 40.0000000 40.2015797 - 906 24 6 1992 41.0000000 48.1672909 - 907 25 6 1992 42.0000000 42.7119062 - 908 26 6 1992 42.0000000 38.0346053 - 909 27 6 1992 48.0000000 37.5287851 - 910 28 6 1992 37.0000000 37.0900814 - 911 29 6 1992 40.0000000 36.6612620 - 912 30 6 1992 29.0000000 36.3520920 - 913 1 7 1992 30.0000000 35.9424208 - 914 2 7 1992 36.0000000 35.4471807 - 915 3 7 1992 29.0000000 39.0874443 - 916 4 7 1992 36.0000000 42.8083580 - 917 5 7 1992 50.0000000 51.3957534 - 918 6 7 1992 78.0000000 50.6971897 - 919 7 7 1992 54.0000000 37.9528650 - 920 8 7 1992 57.0000000 34.3063634 - 921 9 7 1992 51.0000000 33.9893329 - 922 10 7 1992 47.0000000 44.7593224 - 923 11 7 1992 46.0000000 52.2468533 - 924 12 7 1992 76.0000000 45.6398324 - 925 13 7 1992 72.0000000 35.7376551 - 926 14 7 1992 67.0000000 33.4413174 - 927 15 7 1992 63.0000000 32.9785179 - 928 16 7 1992 47.0000000 32.5323596 - 929 17 7 1992 47.0000000 32.1010592 - 930 18 7 1992 42.0000000 31.6834942 - 931 19 7 1992 41.0000000 31.2786508 - 932 20 7 1992 39.0000000 30.8856126 - 933 21 7 1992 37.0000000 31.3424754 - 934 22 7 1992 33.0000000 30.5028315 - 935 23 7 1992 33.0000000 29.8045144 - 936 24 7 1992 33.0000000 29.4492689 - 937 25 7 1992 37.0000000 29.1026454 - 938 26 7 1992 26.0000000 28.7639319 - 939 27 7 1992 24.0000000 28.4327161 - 940 28 7 1992 26.0000000 28.1085616 - 941 29 7 1992 29.0000000 27.7910694 - 942 30 7 1992 19.0000000 27.4798752 - 943 31 7 1992 22.0000000 28.3891071 - 944 1 8 1992 28.0000000 27.3863320 - 945 2 8 1992 35.0000000 26.6274833 - 946 3 8 1992 29.0000000 26.3351640 - 947 4 8 1992 36.0000000 26.0483107 - 948 5 8 1992 52.0000000 25.7663450 - 949 6 8 1992 74.0000000 25.4890456 - 950 7 8 1992 54.0000000 25.2162088 - 951 8 8 1992 57.0000000 24.9476471 - 952 9 8 1992 48.0000000 26.2954624 - 953 10 8 1992 47.0000000 24.7839812 - 954 11 8 1992 46.0000000 28.6222524 - 955 12 8 1992 75.0000000 27.2241251 - 956 13 8 1992 73.0000000 31.6575259 - 957 14 8 1992 66.0000000 32.9845236 - 958 15 8 1992 60.0000000 26.7442633 - 959 16 8 1992 47.0000000 23.4910612 - 960 17 8 1992 46.0000000 23.2215231 - 961 18 8 1992 42.0000000 22.9581308 - 962 19 8 1992 41.0000000 22.7039587 - 963 20 8 1992 40.0000000 26.6344998 - 964 21 8 1992 37.0000000 22.8530952 - 965 22 8 1992 32.0000000 22.6439311 - 966 23 8 1992 32.0000000 21.9517611 - 967 24 8 1992 32.0000000 21.6706355 - 968 25 8 1992 36.0000000 21.4270715 - 969 26 8 1992 27.0000000 21.1890941 - 970 27 8 1992 25.0000000 20.9555334 - 971 28 8 1992 25.0000000 20.9189087 - 972 29 8 1992 28.0000000 23.9019271 - 973 30 8 1992 20.0000000 30.5846341 - 974 31 8 1992 22.0000000 72.6694291 - 975 1 9 1992 49.0000000 56.5425910 - 976 2 9 1992 77.0000000 36.7758395 - 977 3 9 1992 67.0000000 31.9875701 - 978 4 9 1992 45.0000000 30.1428164 - 979 5 9 1992 44.0000000 25.1613706 - 980 6 9 1992 64.0000000 22.1233708 - 981 7 9 1992 52.0000000 21.7038642 - 982 8 9 1992 40.0000000 21.3078946 - 983 9 9 1992 30.0000000 20.9327944 - 984 10 9 1992 34.0000000 20.5766392 - 985 11 9 1992 32.0000000 20.2855103 - 986 12 9 1992 36.0000000 19.9374422 - 987 13 9 1992 28.0000000 19.6245546 - 988 14 9 1992 33.0000000 19.5611309 - 989 15 9 1992 35.0000000 19.6733587 - 990 16 9 1992 30.0000000 18.8499346 - 991 17 9 1992 32.0000000 18.5804272 - 992 18 9 1992 29.0000000 18.3503400 - 993 19 9 1992 30.0000000 18.1282248 - 994 20 9 1992 28.0000000 17.8314140 - 995 21 9 1992 29.0000000 17.5972885 - 996 22 9 1992 29.0000000 17.3705292 - 997 23 9 1992 27.0000000 17.1506085 - 998 24 9 1992 27.0000000 16.9366578 - 999 25 9 1992 23.0000000 16.7285173 - 1000 26 9 1992 28.0000000 16.5257995 - 1001 27 9 1992 25.0000000 16.3282007 - 1002 28 9 1992 25.0000000 17.3226282 - 1003 29 9 1992 27.0000000 18.1565879 - 1004 30 9 1992 25.0000000 15.7921929 - 1005 1 10 1992 27.0000000 15.6129787 - 1006 2 10 1992 33.0000000 17.2243997 - 1007 3 10 1992 29.0000000 17.5692023 - 1008 4 10 1992 31.0000000 15.7626027 - 1009 5 10 1992 25.0000000 25.4870159 - 1010 6 10 1992 25.0000000 31.0206002 - 1011 7 10 1992 36.0000000 19.8873669 - 1012 8 10 1992 42.0000000 15.1370769 - 1013 9 10 1992 43.0000000 16.7540597 - 1014 10 10 1992 26.0000000 20.8715441 - 1015 11 10 1992 27.0000000 17.8180182 - 1016 12 10 1992 27.0000000 14.5742905 - 1017 13 10 1992 26.0000000 14.3850763 - 1018 14 10 1992 26.0000000 14.2359517 - 1019 15 10 1992 23.0000000 25.8439023 - 1020 16 10 1992 21.0000000 23.7151559 - 1021 17 10 1992 26.0000000 17.2573571 - 1022 18 10 1992 34.0000000 18.4709168 - 1023 19 10 1992 37.0000000 14.5882980 - 1024 20 10 1992 31.0000000 21.0774510 - 1025 21 10 1992 31.0000000 20.1693959 - 1026 22 10 1992 35.0000000 18.7122192 - 1027 23 10 1992 33.0000000 42.8747172 - 1028 24 10 1992 40.0000000 96.3046334 - 1029 25 10 1992 74.0000000 112.8001294 - 1030 26 10 1992 161.0000000 65.5304652 - 1031 27 10 1992 285.0000000 72.6462055 - 1032 28 10 1992 244.0000000 77.4249304 - 1033 29 10 1992 263.0000000 65.1079865 - 1034 30 10 1992 276.0000000 44.7203396 - 1035 31 10 1992 186.0000000 40.1410611 - 1036 1 11 1992 154.0000000 37.7440917 - 1037 2 11 1992 112.0000000 53.9676590 - 1038 3 11 1992 104.0000000 54.0050581 - 1039 4 11 1992 96.0000000 45.3767045 - 1040 5 11 1992 99.0000000 37.6907203 - 1041 6 11 1992 126.0000000 35.5203872 - 1042 7 11 1992 91.0000000 34.1601587 - 1043 8 11 1992 84.0000000 34.5006335 - 1044 9 11 1992 81.0000000 42.2888275 - 1045 10 11 1992 85.0000000 74.0225731 - 1046 11 11 1992 126.0000000 116.5385455 - 1047 12 11 1992 279.0000000 109.3438251 - 1048 13 11 1992 390.0000000 93.0802365 - 1049 14 11 1992 294.0000000 99.8056537 - 1050 15 11 1992 260.0000000 156.0724237 - 1051 16 11 1992 398.0000000 219.1690337 - 1052 17 11 1992 520.0000000 190.9608760 - 1053 18 11 1992 487.0000000 195.8616686 - 1054 19 11 1992 380.0000000 203.8709308 - 1055 20 11 1992 385.0000000 172.6674412 - 1056 21 11 1992 351.0000000 214.3528663 - 1057 22 11 1992 309.0000000 248.9894200 - 1058 23 11 1992 587.0000000 200.3820816 - 1059 24 11 1992 661.0000000 178.9159249 - 1060 25 11 1992 447.0000000 194.7214576 - 1061 26 11 1992 361.0000000 203.6189053 - 1062 27 11 1992 351.0000000 200.3430034 - 1063 28 11 1992 353.0000000 227.7711569 - 1064 29 11 1992 369.0000000 282.4126828 - 1065 30 11 1992 452.0000000 268.1510929 - 1066 1 12 1992 441.0000000 220.4863748 - 1067 2 12 1992 348.0000000 261.3095350 - 1068 3 12 1992 394.0000000 284.0873666 - 1069 4 12 1992 455.0000000 324.8658456 - 1070 5 12 1992 491.0000000 346.2507361 - 1071 6 12 1992 469.0000000 305.6929769 - 1072 7 12 1992 364.0000000 300.9770084 - 1073 8 12 1992 338.0000000 263.5114493 - 1074 9 12 1992 334.0000000 223.3527360 - 1075 10 12 1992 268.0000000 190.8062278 - 1076 11 12 1992 236.0000000 197.0434859 - 1077 12 12 1992 230.0000000 196.0315214 - 1078 13 12 1992 239.0000000 176.1693025 - 1079 14 12 1992 256.0000000 154.9435333 - 1080 15 12 1992 217.0000000 144.0618360 - 1081 16 12 1992 201.0000000 137.2340550 - 1082 17 12 1992 188.0000000 130.5222139 - 1083 18 12 1992 176.0000000 122.0582724 - 1084 19 12 1992 170.0000000 115.2930201 - 1085 20 12 1992 168.0000000 113.7808378 - 1086 21 12 1992 131.0000000 118.2643379 - 1087 22 12 1992 133.0000000 117.4493788 - 1088 23 12 1992 134.0000000 107.2484872 - 1089 24 12 1992 127.0000000 101.1425970 - 1090 25 12 1992 117.0000000 96.0461757 - 1091 26 12 1992 113.0000000 91.4702484 - 1092 27 12 1992 100.0000000 87.3495815 - 1093 28 12 1992 94.0000000 83.6281618 - 1094 29 12 1992 87.0000000 80.2577430 - 1095 30 12 1992 86.0000000 77.1966461 - 1096 31 12 1992 81.0000000 74.4087639 - 1097 1 1 1993 77.0000000 71.8627332 - 1098 2 1 1993 76.0000000 69.5312425 - 1099 3 1 1993 61.0000000 67.3904511 - 1100 4 1 1993 61.0000000 65.4195005 - 1101 5 1 1993 57.0000000 63.6001010 - 1102 6 1 1993 66.0000000 79.5209566 - 1103 7 1 1993 67.0000000 94.3894344 - 1104 8 1 1993 84.0000000 94.5250154 - 1105 9 1 1993 90.0000000 99.1591445 - 1106 10 1 1993 113.0000000 136.2104316 - 1107 11 1 1993 265.0000000 297.5126531 - 1108 12 1 1993 559.0000000 407.0331458 - 1109 13 1 1993 832.0000000 399.6102263 - 1110 14 1 1993 601.0000000 339.9921414 - 1111 15 1 1993 436.0000000 277.6591180 - 1112 16 1 1993 339.0000000 231.2506311 - 1113 17 1 1993 292.0000000 202.1236184 - 1114 18 1 1993 247.0000000 184.2259289 - 1115 19 1 1993 218.0000000 167.5373056 - 1116 20 1 1993 205.0000000 152.5622512 - 1117 21 1 1993 190.0000000 144.0499117 - 1118 22 1 1993 176.0000000 139.1863848 - 1119 23 1 1993 173.0000000 135.1214423 - 1120 24 1 1993 173.0000000 183.6281449 - 1121 25 1 1993 199.0000000 244.1087687 - 1122 26 1 1993 361.0000000 210.0535656 - 1123 27 1 1993 295.0000000 214.9906367 - 1124 28 1 1993 238.0000000 230.9272225 - 1125 29 1 1993 263.0000000 218.0598822 - 1126 30 1 1993 245.0000000 191.6900021 - 1127 31 1 1993 222.0000000 170.3673489 - 1128 1 2 1993 199.0000000 154.0355759 - 1129 2 2 1993 186.0000000 140.1727550 - 1130 3 2 1993 171.0000000 129.4852336 - 1131 4 2 1993 157.0000000 122.1658200 - 1132 5 2 1993 159.0000000 115.9726029 - 1133 6 2 1993 129.0000000 110.5754516 - 1134 7 2 1993 119.0000000 105.8307386 - 1135 8 2 1993 119.0000000 101.4395835 - 1136 9 2 1993 105.0000000 97.4460641 - 1137 10 2 1993 106.0000000 93.8174060 - 1138 11 2 1993 105.0000000 90.5109301 - 1139 12 2 1993 95.0000000 87.4895821 - 1140 13 2 1993 91.0000000 84.7211090 - 1141 14 2 1993 88.0000000 82.1773687 - 1142 15 2 1993 84.0000000 79.8337487 - 1143 16 2 1993 83.0000000 77.8415018 - 1144 17 2 1993 79.0000000 78.1928203 - 1145 18 2 1993 78.0000000 78.6461274 - 1146 19 2 1993 84.0000000 77.4868147 - 1147 20 2 1993 91.0000000 90.1845640 - 1148 21 2 1993 91.0000000 92.0515281 - 1149 22 2 1993 90.0000000 89.0059493 - 1150 23 2 1993 103.0000000 84.5938847 - 1151 24 2 1993 94.0000000 81.4271466 - 1152 25 2 1993 81.0000000 78.7940089 - 1153 26 2 1993 78.0000000 76.4336549 - 1154 27 2 1993 75.0000000 77.6530881 - 1155 28 2 1993 76.0000000 76.3801015 - 1156 1 3 1993 80.0000000 73.7747856 - 1157 2 3 1993 75.0000000 72.4334731 - 1158 3 3 1993 76.0000000 71.4128780 - 1159 4 3 1993 72.0000000 69.5660259 - 1160 5 3 1993 65.0000000 67.8274778 - 1161 6 3 1993 64.0000000 66.2215151 - 1162 7 3 1993 64.0000000 64.9652574 - 1163 8 3 1993 68.0000000 64.5247127 - 1164 9 3 1993 68.0000000 63.0237400 - 1165 10 3 1993 67.0000000 62.6266695 - 1166 11 3 1993 61.0000000 63.3398873 - 1167 12 3 1993 57.0000000 63.7084453 - 1168 13 3 1993 58.0000000 62.1604067 - 1169 14 3 1993 54.0000000 60.9188511 - 1170 15 3 1993 66.0000000 59.7127567 - 1171 16 3 1993 54.0000000 58.6073085 - 1172 17 3 1993 57.0000000 57.5636048 - 1173 18 3 1993 57.0000000 56.5712562 - 1174 19 3 1993 52.0000000 55.6220576 - 1175 20 3 1993 57.0000000 54.7164988 - 1176 21 3 1993 58.0000000 54.3612305 - 1177 22 3 1993 57.0000000 65.7887312 - 1178 23 3 1993 56.0000000 65.8313257 - 1179 24 3 1993 63.0000000 58.2164399 - 1180 25 3 1993 76.0000000 57.0274097 - 1181 26 3 1993 56.0000000 55.9069905 - 1182 27 3 1993 59.0000000 54.8483096 - 1183 28 3 1993 59.0000000 53.8458478 - 1184 29 3 1993 54.0000000 52.8946507 - 1185 30 3 1993 48.0000000 51.9902656 - 1186 31 3 1993 55.0000000 51.1286861 - 1187 1 4 1993 48.0000000 51.4398029 - 1188 2 4 1993 53.0000000 52.2636308 - 1189 3 4 1993 47.0000000 50.8486802 - 1190 4 4 1993 59.0000000 54.8551972 - 1191 5 4 1993 53.0000000 66.0706268 - 1192 6 4 1993 64.0000000 59.6115361 - 1193 7 4 1993 63.0000000 53.9794055 - 1194 8 4 1993 75.0000000 52.6375036 - 1195 9 4 1993 64.0000000 51.5860894 - 1196 10 4 1993 59.0000000 53.0117202 - 1197 11 4 1993 60.0000000 55.5673927 - 1198 12 4 1993 63.0000000 52.5688091 - 1199 13 4 1993 69.0000000 52.0120120 - 1200 14 4 1993 79.0000000 50.6268282 - 1201 15 4 1993 82.0000000 49.6718853 - 1202 16 4 1993 68.0000000 48.8088520 - 1203 17 4 1993 56.0000000 47.9059087 - 1204 18 4 1993 59.0000000 47.0387008 - 1205 19 4 1993 61.0000000 46.2124261 - 1206 20 4 1993 62.0000000 45.4265385 - 1207 21 4 1993 57.0000000 44.6776264 - 1208 22 4 1993 53.0000000 43.9625737 - 1209 23 4 1993 47.0000000 43.2785714 - 1210 24 4 1993 46.0000000 42.6230844 - 1211 25 4 1993 47.0000000 41.9938229 - 1212 26 4 1993 45.0000000 41.3887164 - 1213 27 4 1993 43.0000000 40.8058910 - 1214 28 4 1993 41.0000000 40.2437834 - 1215 29 4 1993 38.0000000 39.7014809 - 1216 30 4 1993 39.0000000 39.3747959 - 1217 1 5 1993 40.0000000 38.8601472 - 1218 2 5 1993 41.0000000 38.8459756 - 1219 3 5 1993 45.0000000 37.8755705 - 1220 4 5 1993 49.0000000 37.3777043 - 1221 5 5 1993 40.0000000 36.9144779 - 1222 6 5 1993 43.0000000 36.4658655 - 1223 7 5 1993 38.0000000 36.0839206 - 1224 8 5 1993 38.0000000 36.1019185 - 1225 9 5 1993 43.0000000 35.4510832 - 1226 10 5 1993 44.0000000 34.8748337 - 1227 11 5 1993 41.0000000 35.1405097 - 1228 12 5 1993 51.0000000 38.9105626 - 1229 13 5 1993 63.0000000 68.4684679 - 1230 14 5 1993 68.0000000 41.3861246 - 1231 15 5 1993 77.0000000 35.0705840 - 1232 16 5 1993 77.0000000 34.5438005 - 1233 17 5 1993 59.0000000 34.0381148 - 1234 18 5 1993 49.0000000 33.5531941 - 1235 19 5 1993 43.0000000 35.9274661 - 1236 20 5 1993 44.0000000 40.9008225 - 1237 21 5 1993 48.0000000 36.1712549 - 1238 22 5 1993 44.0000000 32.4659524 - 1239 23 5 1993 46.0000000 32.0147501 - 1240 24 5 1993 40.0000000 31.5804456 - 1241 25 5 1993 43.0000000 31.1610289 - 1242 26 5 1993 30.0000000 30.9280212 - 1243 27 5 1993 45.0000000 37.8257446 - 1244 28 5 1993 43.0000000 36.2239143 - 1245 29 5 1993 44.0000000 31.2260547 - 1246 30 5 1993 54.0000000 32.8453183 - 1247 31 5 1993 56.0000000 30.0484634 - 1248 1 6 1993 44.0000000 29.2686685 - 1249 2 6 1993 43.0000000 29.8920069 - 1250 3 6 1993 33.0000000 30.7897478 - 1251 4 6 1993 45.0000000 28.5924241 - 1252 5 6 1993 46.0000000 28.0190936 - 1253 6 6 1993 42.0000000 27.6695875 - 1254 7 6 1993 40.0000000 27.3298358 - 1255 8 6 1993 30.0000000 26.9990077 - 1256 9 6 1993 31.0000000 26.7166857 - 1257 10 6 1993 32.0000000 26.3974993 - 1258 11 6 1993 25.0000000 26.6196452 - 1259 12 6 1993 33.0000000 26.6457180 - 1260 13 6 1993 29.0000000 25.6824803 - 1261 14 6 1993 40.0000000 26.1406775 - 1262 15 6 1993 42.0000000 26.1960961 - 1263 16 6 1993 37.0000000 25.5928691 - 1264 17 6 1993 46.0000000 24.5546358 - 1265 18 6 1993 47.0000000 24.2256934 - 1266 19 6 1993 50.0000000 25.9660114 - 1267 20 6 1993 43.0000000 39.8368740 - 1268 21 6 1993 69.0000000 30.8619103 - 1269 22 6 1993 61.0000000 38.8990380 - 1270 23 6 1993 67.0000000 39.6101013 - 1271 24 6 1993 77.0000000 24.6214246 - 1272 25 6 1993 87.0000000 24.2453333 - 1273 26 6 1993 55.0000000 23.9066491 - 1274 27 6 1993 43.0000000 23.5797261 - 1275 28 6 1993 40.0000000 23.2636925 - 1276 29 6 1993 30.0000000 22.9577567 - 1277 30 6 1993 40.0000000 22.6611997 - 1278 1 7 1993 40.0000000 23.6711472 - 1279 2 7 1993 27.0000000 22.5666304 - 1280 3 7 1993 34.0000000 21.8681454 - 1281 4 7 1993 30.0000000 21.6000269 - 1282 5 7 1993 31.0000000 21.3781192 - 1283 6 7 1993 27.0000000 21.0856529 - 1284 7 7 1993 31.0000000 20.8369407 - 1285 8 7 1993 26.0000000 20.5939409 - 1286 9 7 1993 23.0000000 20.9032670 - 1287 10 7 1993 24.0000000 20.6964516 - 1288 11 7 1993 25.0000000 23.9594546 - 1289 12 7 1993 34.0000000 28.3704334 - 1290 13 7 1993 40.0000000 22.6527962 - 1291 14 7 1993 41.0000000 37.9887793 - 1292 15 7 1993 46.0000000 27.6114592 - 1293 16 7 1993 39.0000000 19.6975448 - 1294 17 7 1993 43.0000000 19.5730726 - 1295 18 7 1993 35.0000000 19.2073021 - 1296 19 7 1993 49.0000000 30.0155566 - 1297 20 7 1993 38.0000000 28.2494615 - 1298 21 7 1993 41.0000000 24.6056088 - 1299 22 7 1993 45.0000000 20.2037568 - 1300 23 7 1993 41.0000000 18.7301490 - 1301 24 7 1993 42.0000000 18.4799438 - 1302 25 7 1993 40.0000000 18.2388640 - 1303 26 7 1993 35.0000000 18.0046446 - 1304 27 7 1993 40.0000000 33.8419090 - 1305 28 7 1993 40.0000000 24.8635754 - 1306 29 7 1993 36.0000000 17.9319948 - 1307 30 7 1993 40.0000000 54.1676481 - 1308 31 7 1993 61.0000000 36.3932172 - 1309 1 8 1993 36.0000000 18.7362205 - 1310 2 8 1993 46.0000000 18.4013419 - 1311 3 8 1993 32.0000000 18.0841817 - 1312 4 8 1993 38.0000000 17.7823556 - 1313 5 8 1993 32.0000000 17.4945264 - 1314 6 8 1993 25.0000000 17.2194944 - 1315 7 8 1993 26.0000000 16.9561825 - 1316 8 8 1993 29.0000000 16.7036220 - 1317 9 8 1993 29.0000000 20.5469761 - 1318 10 8 1993 28.0000000 20.4727520 - 1319 11 8 1993 37.0000000 17.5849848 - 1320 12 8 1993 40.0000000 16.0275728 - 1321 13 8 1993 49.0000000 15.8008605 - 1322 14 8 1993 32.0000000 16.6356124 - 1323 15 8 1993 37.0000000 15.4540792 - 1324 16 8 1993 37.0000000 15.2462846 - 1325 17 8 1993 27.0000000 15.0433767 - 1326 18 8 1993 24.0000000 14.8468630 - 1327 19 8 1993 24.0000000 14.6562853 - 1328 20 8 1993 22.0000000 14.4712278 - 1329 21 8 1993 21.0000000 14.2913132 - 1330 22 8 1993 16.0000000 15.2991874 - 1331 23 8 1993 21.0000000 16.0718901 - 1332 24 8 1993 27.0000000 13.8450030 - 1333 25 8 1993 26.0000000 13.6552297 - 1334 26 8 1993 23.0000000 13.4935929 - 1335 27 8 1993 21.0000000 15.5499560 - 1336 28 8 1993 28.0000000 15.8389886 - 1337 29 8 1993 17.0000000 13.0690106 - 1338 30 8 1993 24.0000000 12.9191400 - 1339 31 8 1993 25.0000000 12.7728862 - 1340 1 9 1993 25.0000000 12.6295230 - 1341 2 9 1993 19.0000000 12.4889012 - 1342 3 9 1993 17.0000000 14.8362997 - 1343 4 9 1993 16.0000000 16.6280474 - 1344 5 9 1993 19.0000000 12.1800506 - 1345 6 9 1993 23.0000000 12.0232002 - 1346 7 9 1993 25.0000000 27.0425281 - 1347 8 9 1993 34.0000000 21.9236850 - 1348 9 9 1993 31.0000000 30.5624462 - 1349 10 9 1993 35.0000000 48.7969370 - 1350 11 9 1993 53.0000000 69.5629499 - 1351 12 9 1993 71.0000000 54.7708657 - 1352 13 9 1993 74.0000000 78.8534989 - 1353 14 9 1993 87.0000000 70.5386806 - 1354 15 9 1993 173.0000000 55.8552307 - 1355 16 9 1993 117.0000000 31.7188904 - 1356 17 9 1993 93.0000000 26.4192091 - 1357 18 9 1993 77.0000000 25.0203449 - 1358 19 9 1993 62.0000000 23.7602621 - 1359 20 9 1993 54.0000000 22.6227059 - 1360 21 9 1993 48.0000000 22.3755108 - 1361 22 9 1993 46.0000000 36.7317520 - 1362 23 9 1993 55.0000000 38.2556991 - 1363 24 9 1993 66.0000000 40.3790456 - 1364 25 9 1993 64.0000000 34.2996987 - 1365 26 9 1993 52.0000000 25.2912210 - 1366 27 9 1993 68.0000000 23.4691570 - 1367 28 9 1993 69.0000000 27.4466574 - 1368 29 9 1993 62.0000000 25.0518973 - 1369 30 9 1993 76.0000000 21.4058510 - 1370 1 10 1993 72.0000000 38.5097051 - 1371 2 10 1993 68.0000000 34.5011843 - 1372 3 10 1993 72.0000000 26.8854683 - 1373 4 10 1993 78.0000000 29.7758472 - 1374 5 10 1993 116.0000000 88.2886533 - 1375 6 10 1993 131.0000000 60.5723721 - 1376 7 10 1993 180.0000000 38.3058511 - 1377 8 10 1993 203.0000000 41.3678929 - 1378 9 10 1993 164.0000000 40.0446145 - 1379 10 10 1993 178.0000000 58.0436671 - 1380 11 10 1993 161.0000000 62.4380930 - 1381 12 10 1993 287.0000000 64.0880260 - 1382 13 10 1993 360.0000000 91.5803641 - 1383 14 10 1993 374.0000000 77.2813934 - 1384 15 10 1993 297.0000000 62.6811308 - 1385 16 10 1993 247.0000000 73.7159182 - 1386 17 10 1993 273.0000000 70.7468003 - 1387 18 10 1993 261.0000000 60.2143464 - 1388 19 10 1993 265.0000000 55.1330513 - 1389 20 10 1993 230.0000000 50.2515796 - 1390 21 10 1993 199.0000000 49.1434976 - 1391 22 10 1993 173.0000000 52.8350259 - 1392 23 10 1993 182.0000000 67.5363952 - 1393 24 10 1993 203.0000000 61.2156293 - 1394 25 10 1993 213.0000000 49.9897082 - 1395 26 10 1993 180.0000000 46.8339950 - 1396 27 10 1993 154.0000000 44.1695981 - 1397 28 10 1993 118.0000000 41.7779536 - 1398 29 10 1993 112.0000000 39.6230702 - 1399 30 10 1993 98.0000000 37.6768791 - 1400 31 10 1993 97.0000000 35.9150450 - 1401 1 11 1993 91.0000000 34.3164132 - 1402 2 11 1993 85.0000000 32.8625474 - 1403 3 11 1993 75.0000000 31.5373419 - 1404 4 11 1993 76.0000000 30.3266946 - 1405 5 11 1993 78.0000000 29.2182309 - 1406 6 11 1993 72.0000000 28.2244532 - 1407 7 11 1993 76.0000000 29.0397033 - 1408 8 11 1993 69.0000000 27.5617130 - 1409 9 11 1993 66.0000000 26.5822499 - 1410 10 11 1993 71.0000000 26.8727908 - 1411 11 11 1993 64.0000000 35.4687786 - 1412 12 11 1993 67.0000000 35.6079800 - 1413 13 11 1993 80.0000000 34.9089401 - 1414 14 11 1993 78.0000000 58.6591409 - 1415 15 11 1993 80.0000000 51.8460488 - 1416 16 11 1993 86.0000000 42.1744203 - 1417 17 11 1993 125.0000000 36.7187328 - 1418 18 11 1993 96.0000000 35.1394879 - 1419 19 11 1993 82.0000000 33.6980758 - 1420 20 11 1993 77.0000000 32.3803197 - 1421 21 11 1993 67.0000000 31.1732739 - 1422 22 11 1993 71.0000000 30.0653069 - 1423 23 11 1993 61.0000000 29.0461496 - 1424 24 11 1993 42.0000000 28.1068112 - 1425 25 11 1993 63.0000000 27.5125712 - 1426 26 11 1993 57.0000000 27.5096012 - 1427 27 11 1993 58.0000000 26.2814121 - 1428 28 11 1993 49.0000000 25.5568322 - 1429 29 11 1993 50.0000000 24.8823488 - 1430 30 11 1993 55.0000000 24.2531640 - 1431 1 12 1993 54.0000000 23.6650567 - 1432 2 12 1993 54.0000000 29.5834899 - 1433 3 12 1993 50.0000000 26.3197988 - 1434 4 12 1993 51.0000000 26.9725200 - 1435 5 12 1993 62.0000000 24.6999167 - 1436 6 12 1993 62.0000000 23.6443172 - 1437 7 12 1993 71.0000000 56.1965610 - 1438 8 12 1993 79.0000000 96.4432988 - 1439 9 12 1993 153.0000000 80.6251060 - 1440 10 12 1993 291.0000000 121.9710606 - 1441 11 12 1993 332.0000000 132.5908824 - 1442 12 12 1993 465.0000000 158.0946061 - 1443 13 12 1993 518.0000000 180.9003369 - 1444 14 12 1993 539.0000000 194.9359274 - 1445 15 12 1993 559.0000000 210.9959481 - 1446 16 12 1993 500.0000000 254.1717400 - 1447 17 12 1993 526.0000000 279.0952708 - 1448 18 12 1993 583.0000000 290.2433639 - 1449 19 12 1993 677.0000000 370.3676296 - 1450 20 12 1993 781.0000000 611.0637451 - 1451 21 12 1993 1180.0000000 698.1664767 - 1452 22 12 1993 1460.0000000 711.5983178 - 1453 23 12 1993 1600.0000000 775.9684405 - 1454 24 12 1993 1410.0000000 796.3361805 - 1455 25 12 1993 1230.0000000 674.9554967 - 1456 26 12 1993 1070.0000000 545.7261809 - 1457 27 12 1993 746.0000000 447.8032913 - 1458 28 12 1993 542.0000000 378.9775190 - 1459 29 12 1993 492.0000000 375.4026197 - 1460 30 12 1993 491.0000000 440.1866431 - 1461 31 12 1993 617.0000000 621.3832609 diff --git a/check/case_10/simulation_mhm_case10.ini b/check/case_10/simulation_mhm_case10.ini new file mode 100644 index 00000000..8234e2e9 --- /dev/null +++ b/check/case_10/simulation_mhm_case10.ini @@ -0,0 +1,18 @@ +[main] +# path relative to wrapper.py +#path__input = ../mhm_dev/mpr_extract/ +path__input = ../../../mhm_dev/mpr_extract/ +#path__work = ../mhm_dev/mpr_extract/check/temp_work_environ/ +path__work = ../../../mhm_dev/mpr_extract/check/temp_work_environ/ +processes = mhm +basin = test_basin +python_env = eve_wrapper/0.1 +sim_folder_name = check_case_10 + +[mhm] +path__prog = ../../mhm +path__input = ../../$main__basin$/input/ + +nml__mainconfig__nbasins = 1 +nml__processselection__processcase(3) = 3 +nml__processselection__processcase(5) = -1 diff --git a/check/check_files.py b/check/check_files.py new file mode 100644 index 00000000..2804ee4d --- /dev/null +++ b/check/check_files.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +File Name : check_files +Project Name: mHM check case repo +Description : insert your description here, if applicable +Author : Robert Schweppe, Stephan Thober +Created : 07.05.18 15:10 +""" + +# IMPORTS +import xarray as xr +from numpy import allclose, loadtxt, array_equal +import argparse +import textwrap + +# GLOBAL VARIABLES +# NEW_FILE_DEFAULT = './case_00/output_b1/b1_mRM_restart_001.nc' +# REF_FILE_DEFAULT = './case_00/output_save/backup/b1_mRM_restart_001.nc' +NEW_FILE_DEFAULT = './case_10/output_b1/b1_mRM_Fluxes_States.nc' +REF_FILE_DEFAULT = './case_10/output_save/b1_mRM_Fluxes_States.nc' +RTOL = 1e-03 +ATOL = 1e-04 + +# FUNCTIONS +def parse_args(): + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, + description=textwrap.dedent('''\ + Description: + Check whether variables in two netcdf files are identical. + + Author: + Stephan Thober, Robert Schweppe + + Created: + Nov 2016 + + Example: + python check_files.py -n -s + + Note: + ''')) + parser.add_argument('-n', '--new_file', action='store', + default=NEW_FILE_DEFAULT, dest='new_file', metavar='new_file', + help='new file (default: {})'.format(NEW_FILE_DEFAULT)) + parser.add_argument('-s', '--save_file', action='store', + default=REF_FILE_DEFAULT, dest='save_file', metavar='save_file', + help='reference file that new file is compared against, ' + 'variables are taken from this file (default: {})'.format(REF_FILE_DEFAULT)) + args = parser.parse_args() + if args.new_file.endswith('.nc'): + return args.new_file, args.save_file, 'nc' + if args.new_file.endswith('discharge.out'): + return args.new_file, args.save_file, 'discharge' + if args.new_file.endswith('FinalParam.out'): + return args.new_file, args.save_file, 'param' + +def compare_nc_files(new_file, ref_file): + ds_new = read_nc_file(new_file) + ds_ref = read_nc_file(ref_file) + diff_cnt = 0 + big_diff_cnt = 0 + for var_name in ds_ref.data_vars: + if var_name in ds_new.data_vars: + if not ds_ref[var_name].equals(ds_ref[var_name]): + diff_cnt += 1 + big_diff_cnt += compare_arrays(ds_new[var_name].values, ds_ref[var_name].values) + else: + print(var_name, 'is not contained in reference') + diff_cnt += 1 + big_diff_cnt += 1 + message(diff_cnt, big_diff_cnt, len(ds_ref.data_vars)) + +def compare_csv_files(new_file, ref_file): + header_new, ds_new = read_csv_file(new_file) + header_ref, ds_ref = read_csv_file(ref_file) + diff_cnt = 0 + big_diff_cnt = 0 + if not array_equal(ds_ref, ds_new): + diff_cnt += 1 + big_diff_cnt += compare_arrays(ds_new, ds_ref) + message(diff_cnt, big_diff_cnt, len(header_ref)) + + +def compare_arrays(new_array, ref_array, rtol=RTOL, atol=ATOL): + if not allclose(ref_array, new_array, equal_nan=True, rtol=rtol, atol=atol): + return 1 + return 0 + +def read_nc_file(path): + with xr.open_dataset(path) as ds: + ds.load() + return ds + +def read_csv_file(path): + with open(path) as f_in: + # read the first lines with meta information + header = f_in.readline().strip().split() + # read the rest of the thing into a numpy array + return header, loadtxt(f_in, dtype=float) + +def message(n_diff, n_big_diff, n_total): + print(' {} of {} records differ'.format(n_diff, n_total)) + print(' {} of {} records differ more than {}'.format(n_big_diff, n_total, ATOL)) + +# CLASSES + +# SCRIPT +if __name__ == '__main__': + new_file, ref_file, ftype = parse_args() + if ftype == 'nc': + compare_nc_files(new_file, ref_file) + if ftype in ['param', 'discharge']: + compare_csv_files(new_file, ref_file) diff --git a/check/check_mhm_cases b/check/check_mhm_cases index 5a28818b..d4f4b590 100755 --- a/check/check_mhm_cases +++ b/check/check_mhm_cases @@ -98,6 +98,7 @@ set -e # Mar 2015 Matthias Zink - added soil moisture calibration test # Oct 2015 Matthias Cuntz - added multi-job make # Jan 2016 Matthias Cuntz - run only specific test cases +# May 2018 Robert Schweppe - use python script to compare *.out and *restart.nc files # ------------------------------------------------------------------------------------------- # @@ -245,26 +246,43 @@ if [[ "${icdo}z" == "z" ]] ; then if [[ ${system} == "eve" || ${system} == "eve2" ]] ; then echo ' try to load module cdo ...' - if [[ -f /home/$USER/.lmod-yes ]]; then - ## New module system (= Lmod), after Feb 2018, OR: - BASH_ENV="/software/lmod/lmod/init/profile" - else - ## Old module system (before Lmod system, prior to Feb 2018), OR: - source /etc/profile.d/000-modules.sh - fi - + ## New module system (= Lmod) + BASH_ENV="/software/lmod/lmod/init/profile" + if [[ $(hostname | cut -d . -f 1) == 'frontend1' || $(hostname | cut -d . -f 1) == 'frontend2' ]] ; then module load cdo - else - echo "Host not specified!" + else + echo "Host not specified!" fi - set +e - icdo=$(which cdo 2> /dev/null) - set -e + set +e + icdo=$(which cdo 2> /dev/null) + set -e fi fi #set -ex if [[ "${icdo}z" == "z" ]] ; then printf "Error ${pprog}: cdo not found.\n\n" ; exit 1 ; fi +# check for python3 environment with numpy and xarray installed +if [[ ${system} == "eve" || ${system} == "eve2" ]] ; then + echo ' try to load module python ...' + if [[ -f /home/$USER/.lmod-no ]]; then + ## Old module system (before Lmod system, prior to Feb 2018), OR: + source /etc/profile.d/000-modules.sh + else + ## New module system (= Lmod) + BASH_ENV="/software/lmod/lmod/init/profile" + fi + + if [[ $(hostname | cut -d . -f 1) == 'frontend1' || $(hostname | cut -d . -f 1) == 'frontend2' ]] ; then + # the complete path is /global/apps/chspython/modules/pyvenvs/3.6.2 + # but /global/apps/chspython/modules should be in MODULEPATH + module load pyvenvs/3.6.2 + else + echo "Host not specified!" + fi + set +e + ipython=$(which python 2> /dev/null) + set -e +fi # rm coloured ls if [[ -n ${CLICOLOR_FORCE} ]] ; then unset CLICOLOR_FORCE ; fi @@ -345,13 +363,18 @@ for irelease in ${release} ; do nRecordsDiffer=0 cd output_save set +e - nc_files=$(\ls *.nc 2> /dev/null) # causes failure if no such file exists - discharge_files=$(\ls *daily_discharge.out 2> /dev/null) # causes failure if no such file exists - finalpara_files=$(\ls *FinalParam.out 2> /dev/null) # causes failure if no such file exists + nc_files=$(\ls *discharge.nc *States.nc 2> /dev/null) # causes failure if no such file exists + restart_files=$(\ls *restart*.nc 2> /dev/null) # causes failure if no such file exists + discharge_files=$(\ls *discharge.out 2> /dev/null) # causes failure if no such file exists + finalpara_files=$(\ls *FinalParam.out 2> /dev/null) # causes failure if no such file exists + python_check_files=$(\ls *FinalParam.out *discharge.out *restart*.nc 2> /dev/null) # causes failure if no such file exists set -e if [[ -z ${nc_files} ]] ; then echo ' No NetCDF files written!' fi + if [[ -z ${nc_files} ]] ; then + echo ' No Restart files written!' + fi if [[ -z ${discharge_files} ]] ; then echo ' No discharge files written!' fi @@ -384,64 +407,29 @@ for irelease in ${release} ; do done # compare daily_discharge outputs in output_b1/ with reference in output_save/ - for discharge_file in ${discharge_files} ; do - echo ' * diff output_save/'${discharge_file}' output_b1/'${discharge_file} - set +e - if [[ ${verbose} -eq 1 ]] ; then - diff output_save/${discharge_file} output_b1/${discharge_file} | tee diff1.${pid}.terminal - else - diff output_save/${discharge_file} output_b1/${discharge_file} > diff1.${pid}.terminal - fi - set -e - iRecordsDiffer=$(echo $(wc -l diff1.${pid}.terminal) | cut -d ' ' -f 1) - if [[ ${iRecordsDiffer} -gt 0 ]] ; then - iRecordsDiffer=$(( (iRecordsDiffer - 2) / 2 )) - fi - nRecordsDiffer=$((nRecordsDiffer+iRecordsDiffer)) - nRecordsDiffer_allCases=$((nRecordsDiffer_allCases+iRecordsDiffer)) - echo ' Number of records that differ: '${iRecordsDiffer} - if [[ ${iRecordsDiffer} -gt 0 ]] ; then - echo ' --------------------------------------' - echo ' Details ' - echo ' --------------------------------------' - set +e - diff output_save/${discharge_file} output_b1/${discharge_file} - set -e - echo ' --------------------------------------' - fi - echo '' - done - - # compare FinalParam.out outputs in output_b1/ with reference in output_save/ - # --> only for optimization cases - for finalpara_file in ${finalpara_files} ; do - echo ' * diff output_save/'${finalpara_file}' output_b1/'${finalpara_file} + for python_check_file in ${python_check_files} ; do + echo ' * python ../check_files.py -s output_save/'${python_check_file}' -n output_b1/'${python_check_file} set +e - if [[ ${verbose} -eq 1 ]] ; then - diff output_save/${finalpara_file} output_b1/${finalpara_file} | tee diff2.${pid}.terminal - else - diff output_save/${finalpara_file} output_b1/${finalpara_file} > diff2.${pid}.terminal - fi - set -e - iRecordsDiffer=$(echo $(wc -l diff2.${pid}.terminal) | cut -d ' ' -f 1) - if [[ ${iRecordsDiffer} -gt 0 ]] ; then - iRecordsDiffer=$(( (iRecordsDiffer - 2) / 2 )) - fi + if [[ ${verbose} -eq 1 ]] ; then + ${ipython} ../check_files.py -s output_save/${python_check_file} -n output_b1/${python_check_file} | tee diff1.${pid}.terminal + else + ${ipython} ../check_files.py -s output_save/${python_check_file} -n output_b1/${python_check_file} > diff1.${pid}.terminal + fi + iRecordsDiffer=$(grep -i 'differ' diff1.${pid}.terminal | tail -1 | cut -f 1 -d 'o') nRecordsDiffer=$((nRecordsDiffer+iRecordsDiffer)) nRecordsDiffer_allCases=$((nRecordsDiffer_allCases+iRecordsDiffer)) - echo ' Number of records that differ: '${iRecordsDiffer} + echo ' Number of records that differ more than 0.001: '${iRecordsDiffer} if [[ ${iRecordsDiffer} -gt 0 ]] ; then echo ' --------------------------------------' echo ' Details ' echo ' --------------------------------------' set +e - diff output_save/${finalpara_file} output_b1/${finalpara_file} + ${ipython} ../check_files.py -s output_save/${python_check_file} -n output_b1/${python_check_file} set -e echo ' --------------------------------------' fi echo '' done - echo ' Total Number of records that differ: '${nRecordsDiffer} if [[ ${nRecordsDiffer} -eq 0 ]] ; then diff --git a/check/check_restart.py b/check/check_restart.py deleted file mode 100644 index 83ef5f55..00000000 --- a/check/check_restart.py +++ /dev/null @@ -1,51 +0,0 @@ -from ufz import readnc -import numpy as np - -new_file = 'output_b1/mRM_restart_001.nc' -save_file = 'output_save/mRM_restart_001.nc' - -import argparse -import textwrap -parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, - description=textwrap.dedent('''\ - Description: - Check whether variables in two netcdf files are identical. - - Author: - Stephan Thober - - Created: - Nov 2016 - - Example: - python check_restart.py -n -s - - Note: - ''')) -parser.add_argument('-n', '--new_file', action='store', - default=new_file, dest='new_file', metavar='new_file', - help='new file (default: output_b1/mRM_restart_001.nc)') -parser.add_argument('-s', '--save_file', action='store', - default=save_file, dest='save_file', metavar='save_file', - help='save file that new file is compared against, variables are taken from this file (default: output_save/mRM_restart_001.nc)') - -args = parser.parse_args() -new_file = args.new_file -save_file = args.save_file -del parser, args - -# get variables -v_names = readnc(save_file, variables=True) - -for var in v_names: - new_arr = readnc(new_file, var) - save_arr = readnc(save_file, var) - - diff = np.ma.abs(new_arr - save_arr) - - if np.ma.amax(diff) > 0.: - print('processing: ' + var) - print(' max diff: ', np.ma.amax(diff)) - print('') - -print('Done!') diff --git a/check/check_restart_file.py b/check/check_restart_file.py new file mode 100644 index 00000000..8fb50b22 --- /dev/null +++ b/check/check_restart_file.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +File Name : check_restart_file +Project Name: scripts +Description : insert your description here, if applicable +Author : ottor +Created : 07.05.18 15:10 +""" + +# IMPORTS +import xarray as xr +from numpy import allclose +import argparse +import textwrap + +# GLOBAL VARIABLES +MATCH_VARS = {'L1_basin_mask': 'L1_basin_Mask', 'L1_basin_cellarea': 'L1_areaCell', + 'L11_basin_mask': 'L11_basin_Mask', 'L11_basin_cellarea': 'L11_areaCell', + 'L11_nLinkFracFPimp': 'L11_FracFPimp'} +IGNORE_VARS = ['L1_basin_lat', 'L11_basin_lat', + 'L1_basin_lon', 'L11_basin_lon', + 'LC_year_start', 'LC_year_end', ] +NEW_FILE_DEFAULT = './case_00/output_b1/b1_mRM_restart_001.nc' +REF_FILE_DEFAULT = './case_00/output_save/backup/b1_mRM_restart_001.nc' +RTOL = 1e-03 +ATOL = 1e-03 + +# FUNCTIONS +def parse_args(): + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, + description=textwrap.dedent('''\ + Description: + Check whether variables in two netcdf files are identical. + + Author: + Stephan Thober, Robert Schweppe + + Created: + Nov 2016 + + Example: + python check_files.py -n -s + + Note: + ''')) + parser.add_argument('-n', '--new_file', action='store', + default=NEW_FILE_DEFAULT, dest='new_file', metavar='new_file', + help='new file (default: {})'.format(NEW_FILE_DEFAULT)) + parser.add_argument('-s', '--save_file', action='store', + default=REF_FILE_DEFAULT, dest='save_file', metavar='save_file', + help='reference file that new file is compared against, ' + 'variables are taken from this file (default: {})'.format(REF_FILE_DEFAULT)) + args = parser.parse_args() + if args.new_file.endswith('.nc'): + return args.new_file, args.save_file, 'nc' + if args.new_file.endswith('discharge.out'): + return args.new_file, args.save_file, 'discharge' + if args.new_file.endswith('FinalParam.out'): + return args.new_file, args.save_file, 'param' + +def compare_arrays(new_array, ref_array, rtol=RTOL, atol=ATOL): + if not allclose(ref_array, new_array, equal_nan=True, rtol=rtol, atol=atol): + return 1 + return 0 + +def read_nc_file(path): + with xr.open_dataset(path) as ds: + ds.load() + return ds + +def message(n_diff, n_big_diff, n_total): + print(' {} of {} records differ'.format(n_diff, n_total)) + print(' {} of {} records differ more than {}'.format(n_big_diff, n_total, ATOL)) + +def compare_restarts(new_file, ref_file): + elim_dim = ['LCoverScenes', 'LAI_timesteps'] + with xr.open_dataset(new_file) as ds_new: + if elim_dim[0] in ds_new.dims: + ds_new = next(iter(ds_new.groupby(elim_dim[0])))[1] + if elim_dim[1] in ds_new.dims: + it = iter(ds_new.groupby(elim_dim[1], squeeze=False)) + try: + while True: + ds_new = next(it) + except StopIteration: + ds_new = ds_new[1].squeeze(elim_dim[1]) + ds_new.load() + with xr.open_dataset(ref_file) as ds_ref: + ds_ref.load() + diff_cnt = 0 + big_diff_cnt = 0 + for var_name in ds_new.data_vars: + if var_name in ds_ref.data_vars or var_name in MATCH_VARS: + if not ds_ref[MATCH_VARS.get(var_name, var_name)].equals(ds_new[var_name]): + diff_cnt += 1 + # print(var_name, 'differs') + # pb = big_diff_cnt + big_diff_cnt += compare_arrays(ds_new[var_name].values, + ds_ref[MATCH_VARS.get(var_name, var_name)].values) + # if pb != big_diff_cnt: + # print(var_name, 'differs much') + elif var_name not in IGNORE_VARS: + print(var_name, 'is not contained in reference') + diff_cnt += 1 + big_diff_cnt += 1 + message(diff_cnt, big_diff_cnt, len(ds_ref.data_vars)) + + +# CLASSES + +# SCRIPT +if __name__ == '__main__': + new_file, ref_file, ftype = parse_args() + if ftype == 'nc': + compare_restarts(new_file, ref_file) diff --git a/make.config/ces255m.alias b/make.config/ces255m.alias new file mode 100644 index 00000000..8d56281a --- /dev/null +++ b/make.config/ces255m.alias @@ -0,0 +1,7 @@ +# Set aliases so that one can, for example, say ifort to invoke standard intel11 on eve +ifneq (,$(findstring $(compiler),gnu gfortran gcc gfortran49 gcc49)) + icompiler := gnu81 +endif +ifneq (,$(findstring $(compiler),nag nag60 nagfor)) + icompiler := nag62 +endif diff --git a/make.config/ces255m.gnu48 b/make.config/ces255m.gnu48 new file mode 100644 index 00000000..9e3826a6 --- /dev/null +++ b/make.config/ces255m.gnu48 @@ -0,0 +1,100 @@ +# -*- Makefile -*- + +# +# Setup file for Gnu compiler 4.9 at Luis' iMac +# +# LICENSE +# This file is part of the UFZ makefile project. +# +# The UFZ makefile project is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The UFZ makefile project is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with the UFZ makefile project. If not, see . +# +# Copyright 2012 Matthias Cuntz + +# The Makefile assumes the standard bin, include and lib directories +# i.e. if SOMEDIR = /path/to/lib, the make file will define the two dirs +# SOMEINC ?= SOMEDIR/include +# SOMELIB ?= SOMEDIR/lib +# Define subirectories if another structure + +# Paths +GNUDIR := /Users/ottor/miniconda3/pkgs/gcc-4.8.5-8 +# GNUDIR := /Users/ottor/miniconda3 +GNULIB := $(GNUDIR)/lib +GNUBIN := $(GNUDIR)/bin + +# Compiling +F90 := $(GNUBIN)/x86_64-apple-darwin11.4.2-gfortran +FC := $(F90) +CC := $(GNUDIR)/gcc +CPP := $(GNUDIR)/cpp # could be gcc -E -cpp on Linux but does not work on Mac +ifeq ($(release),debug) + F90FLAGS += -pedantic-errors -Wall -W -O -g -Wno-maybe-uninitialized + FCFLAGS += -pedantic-errors -Wall -W -O -g -Wno-maybe-uninitialized + CFLAGS += -pedantic -Wall -W -O -g -Wno-maybe-uninitialized +else + F90FLAGS += -O3 + FCFLAGS += -O3 + CFLAGS += -O3 +endif +F90FLAGS += -cpp -ffree-form -ffixed-line-length-132 +FCFLAGS += -ffixed-form -ffixed-line-length-132 +CFLAGS += +MODFLAG := -J# space significant +DEFINES += -DGFORTRAN -DgFortran + +# Linking +LIBS += -L$(GNULIB) +RPATH += -Wl,-rpath,$(GNULIB) +iLDPATH = $(GNUDIR)/lib/gcc/x86_64-apple-darwin11.4.2/4.8.5:/Users/ottor/miniconda3/pkgs/isl-0.12.2-1/lib:/Users/ottor/miniconda3/pkgs/cloog-0.18.0-0/lib:/Users/ottor/miniconda3/pkgs/mpc-1.1.0-4/lib:/Users/ottor/miniconda3/pkgs/mpfr-3.1.5-0/lib:/Users/ottor/miniconda3/pkgs/gmp-6.1.2-0/lib +ifneq ($(LDPATH),) + LDPATH += :$(iLDPATH) +else + LDPATH := $(iLDPATH) +endif + +# IMSL +IMSLDIR := + +# MKL +MKLDIR := +MKL95DIR := + +# NETCDF +ifeq ($(netcdf),netcdf3) + NCDIR := +else + NCDIR := /Users/ottor/miniconda3/pkgs/libnetcdf-4.6.1-2 + NCFDIR := /Users/ottor/miniconda3/pkgs/netcdf-fortran-4.4.4-7 + HDF5LIB := /Users/ottor/miniconda3/pkgs/hdf5-1.10.1-2/lib/ + CURLLIB := /Users/ottor/miniconda3/pkgs/curl-7.59.0-1/lib/ + ZLIB := /Users/ottor/miniconda3/pkgs/zlib-1.2.11-0/lib + SZLIB := /Users/ottor/miniconda3/pkgs/szip-2.1.1/lib +endif + +# PROJ +PROJ4DIR := /Users/ottor/miniconda3/pkgs/proj4-5.0.1-0/ +FPROJDIR := + +# LAPACK +LAPACKDIR := /Users/ottor/miniconda3/pkgs/lapack-3.6.1-1/ +GFORTRANDIR := $(GNUDIR) + +# MPI +MPIDIR := /Users/ottor/miniconda3/pkgs/openmpi-3.1.0-0/ + +# Documentation +DOXYGENDIR := /usr/local/bin +DOTDIR := /usr/local/bin +TEXDIR := /usr/texbin +PERLDIR := /usr/bin diff --git a/make.config/ces255m.gnu81 b/make.config/ces255m.gnu81 new file mode 100644 index 00000000..6f82cc0e --- /dev/null +++ b/make.config/ces255m.gnu81 @@ -0,0 +1,99 @@ +# -*- Makefile -*- + +# +# Setup file for Gnu compiler 4.9 at Luis' iMac +# +# LICENSE +# This file is part of the UFZ makefile project. +# +# The UFZ makefile project is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The UFZ makefile project is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with the UFZ makefile project. If not, see . +# +# Copyright 2012 Matthias Cuntz + +# The Makefile assumes the standard bin, include and lib directories +# i.e. if SOMEDIR = /path/to/lib, the make file will define the two dirs +# SOMEINC ?= SOMEDIR/include +# SOMELIB ?= SOMEDIR/lib +# Define subirectories if another structure + +# Paths +GNUDIR := /usr/local +GNULIB := $(GNUDIR)/lib +GNUBIN := $(GNUDIR)/bin + +# Compiling +F90 := $(GNUBIN)/x86_64-apple-darwin11.4.2-gfortran +FC := $(F90) +CC := $(GNUDIR)/gcc +CPP := $(GNUDIR)/cpp # could be gcc -E -cpp on Linux but does not work on Mac +ifeq ($(release),debug) + F90FLAGS += -pedantic-errors -Wall -W -O -g -Wno-maybe-uninitialized + FCFLAGS += -pedantic-errors -Wall -W -O -g -Wno-maybe-uninitialized + CFLAGS += -pedantic -Wall -W -O -g -Wno-maybe-uninitialized +else + F90FLAGS += -O3 + FCFLAGS += -O3 + CFLAGS += -O3 +endif +F90FLAGS += -cpp -ffree-form -ffixed-line-length-132 +FCFLAGS += -ffixed-form -ffixed-line-length-132 +CFLAGS += +MODFLAG := -J# space significant +DEFINES += -DGFORTRAN -DgFortran + +# Linking +LIBS += -L$(GNULIB) +RPATH += -Wl,-rpath,$(GNULIB) +iLDPATH = $(GNUDIR)/lib/gcc/x86_64-apple-darwin11.4.2/4.8.5:/Users/ottor/miniconda3/pkgs/isl-0.12.2-1/lib:/Users/ottor/miniconda3/pkgs/cloog-0.18.0-0/lib:/Users/ottor/miniconda3/pkgs/mpc-1.1.0-4/lib:/Users/ottor/miniconda3/pkgs/mpfr-3.1.5-0/lib:/Users/ottor/miniconda3/pkgs/gmp-6.1.2-0/lib +ifneq ($(LDPATH),) + LDPATH += :$(iLDPATH) +else + LDPATH := $(iLDPATH) +endif + +# IMSL +IMSLDIR := + +# MKL +MKLDIR := +MKL95DIR := + +# NETCDF +ifeq ($(netcdf),netcdf3) + NCDIR := +else + NCDIR := /Users/ottor/miniconda3/pkgs/libnetcdf-4.6.1-2 + NCFDIR := /Users/ottor/miniconda3/pkgs/netcdf-fortran-4.4.4-7 + HDF5LIB := /Users/ottor/miniconda3/pkgs/hdf5-1.10.1-2/lib/ + CURLLIB := /Users/ottor/miniconda3/pkgs/curl-7.59.0-1/lib/ + ZLIB := /Users/ottor/miniconda3/pkgs/zlib-1.2.11-0/lib + SZLIB := /Users/ottor/miniconda3/pkgs/szip-2.1.1/lib +endif + +# PROJ +PROJ4DIR := /Users/ottor/miniconda3/pkgs/proj4-5.0.1-0/ +FPROJDIR := + +# LAPACK +LAPACKDIR := /Users/ottor/miniconda3/pkgs/lapack-3.6.1-1/ +GFORTRANDIR := $(GNUDIR) + +# MPI +MPIDIR := /Users/ottor/miniconda3/pkgs/openmpi-3.1.0-0/ + +# Documentation +DOXYGENDIR := /usr/local/bin +DOTDIR := /usr/local/bin +TEXDIR := /usr/texbin +PERLDIR := /usr/bin diff --git a/make.config/ces255m.nag62 b/make.config/ces255m.nag62 new file mode 100644 index 00000000..f1bea611 --- /dev/null +++ b/make.config/ces255m.nag62 @@ -0,0 +1,109 @@ +# -*- Makefile -*- + +# +# Setup file for NAG compiler 6.0 at Luis' iMac +# + +# The Makefile assumes the standard bin, include and lib directories +# i.e. if SOMEDIR = /path/to/lib, the make file will define the two dirs +# SOMEINC ?= SOMEDIR/include +# SOMELIB ?= SOMEDIR/lib +# Define subdirectories if another structure + +# LICENSE +# This file is part of the UFZ makefile project. +# +# The UFZ makefile project is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The UFZ makefile project is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with the UFZ makefile project. If not, see . +# +# Copyright 2012-2014 Matthias Cuntz + +# Paths +NAGDIR := /usr/local +NAGLIB := $(NAGDIR)/lib/NAG_Fortran +NAGBIN := $(NAGDIR)/bin + +GNUDIR := /usr/local +GNULIB := $(GNUDIR)/lib +GNUBIN := $(GNUDIR)/bin + +# Compiling +F90 := $(NAGBIN)/nagfor +FC := $(F90) +CC := /usr/bin/gcc +CPP := /usr/bin/cpp +ifeq ($(release),debug) + # The compiler switch "-w=ques" turns off the message: + # Comment begins with the OpenMP sentinel but the -openmp option was not used + # but it also turns of + # Intrinsic function CMPLX with double precision argument and no KIND argument returns single precision result + # KIND argument to intrinsic LBOUND specifies a small integer kind + # KIND argument to intrinsic LEN specifies a small integer kind + # Expression in OpenMP clause is always .TRUE. + # Ordinary assignment of pointer function fname reference to pointer variable vname + # Last statement of DO loop body is an unconditional jump + # Array constructor has a polymorphic element but the constructor value will not be polymorphic + F90FLAGS += -C -C=dangling -g -nan -O0 -strict95 # -w=ques -g90 + ifneq ($(openmp),true) + F90FLAGS += -gline + endif + FCFLAGS += $(F90FLAGS) + CFLAGS += -pedantic -Wall -W -O -g + LDFLAGS += #-g90 +else + F90FLAGS += -O4 + FCFLAGS += $(F90FLAGS) + CFLAGS += -O3 +endif +F90FLAGS += -fpp -colour -unsharedf95 -kind=byte -ideclient -ieee=full -free # -ieee=stop -mismatch-all +MODFLAG := -mdir # space significant +FCFLAGS += -fixed +CFLAGS += +LDFLAGS += -ideclient -unsharedrts +DEFINES += -DNAG -DNAGf90Fortran + +# Linking +LIBS += -L$(NAGLIB) #$(NAGLIB)/thsafe.o +RPATH += -Wl,-rpath,$(NAGLIB) + +# IMSL +IMSLDIR := + +# MKL +MKLDIR := +MKL95DIR := + +# NETCDF +ifeq ($(netcdf),netcdf3) + NCDIR := +else + NCDIR := /usr/local + NCFDIR := /usr/local/netcdf-fortran-4.4.4-nagfor + CURLLIB := /usr/lib + SZLIB := /usr/local/lib + HDF5LIB := /usr/local/lib +endif + +# PROJ +PROJ4DIR := /usr/local +FPROJDIR := + +# LAPACK +LAPACKDIR := +GFORTRANDIR := /usr/local + +# Documentation +DOXYGENDIR := /usr/local/bin +DOTDIR := /usr/local/bin +TEXDIR := /usr/texbin +PERLDIR := /usr/bin diff --git a/make.config/eve.alias b/make.config/eve.alias index 03c572bd..2b0aa7a3 100644 --- a/make.config/eve.alias +++ b/make.config/eve.alias @@ -6,7 +6,7 @@ ifneq (,$(findstring $(compiler),intel ifort ifort13)) icompiler := intel13 endif ifneq (,$(findstring $(compiler),nag nagfor)) - icompiler := nag60 + icompiler := nag61 endif ifneq (,$(findstring $(compiler),pgi pgfortran pgfortran159)) icompiler := pgi159 diff --git a/make.config/eve.nag60 b/make.config/eve.nag61 similarity index 92% rename from make.config/eve.nag60 rename to make.config/eve.nag61 index 63175a13..5ddd5101 100644 --- a/make.config/eve.nag60 +++ b/make.config/eve.nag61 @@ -1,7 +1,7 @@ # -*- Makefile -*- # -# Setup file for NAG compiler 6.0 at eve.ufz.de +# Setup file for NAG compiler 6.1 at eve.ufz.de # # LICENSE # This file is part of the UFZ makefile project. @@ -28,7 +28,7 @@ # Define subdirectories if another structure # Paths -NAGDIR := /opt/nag/6.0 +NAGDIR := /opt/nag/6.1-6150 NAGLIB := $(NAGDIR)/lib NAGBIN := $(NAGDIR)/bin @@ -42,12 +42,14 @@ FC := $(F90) CC := $(GNUBIN)/gcc CPP := /usr/bin/cpp ifeq ($(release),debug) - #F90FLAGS += -C=all -g -gline -nan -O0 -strict95 -g90 - # -gline not supported in NAG v5.3 under OpenMP + # reactivate check for dangling pointers once NAG is patched + #F90FLAGS += -C -C=dangling + F90FLAGS += -C + # -gline not supported in NAG v5.3 under OpenMP ifeq ($(openmp),true) - F90FLAGS += -C -C=dangling -g -nan -O0 -strict95 -g90 + F90FLAGS += -g -nan -O0 -strict95 -g90 else - F90FLAGS += -C -C=dangling -g -gline -nan -O0 -strict95 -g90 + F90FLAGS += -g -gline -nan -O0 -strict95 -g90 endif FCFLAGS += $(F90FLAGS) CFLAGS += -pedantic -Wall -W -O -g -Wno-maybe-uninitialized diff --git a/make.config/stmac.nag62 b/make.config/stmac.nag62 old mode 100644 new mode 100755 diff --git a/mhm.nml b/mhm.nml index 14e9b2de..79c9099a 100644 --- a/mhm.nml +++ b/mhm.nml @@ -1,20 +1,20 @@ ! Emacs: -*- mode: f90 -*- !> \file mhm.nml ! -!> \brief Namelists of mHM +!> \brief Namelists of mHM, MPR, mRM ! -!> \details This files provides all namelists for mHM. +!> \details This files provides all namelists for mHM, MPR, mRM. ! !> \authors Matthias Zink, Matthias Cuntz !> \date Jan 2013 ! Modified, -! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist \n -! - added new namelist "LAI_data_information" \n +! Rohini Kumar, Aug 2013 - added "fracSealed_cityArea" in the LCover namelist +! - added new namelist "LAI_data_information" ! - added new directory paths for soil and geology LUTs -! which are common to all modeled basins \n +! which are common to all modeled basins ! Luis Samaniego, Nov 2013 - process description ! Matthias Zink, Mar 2014 - added evaluation and inflow gauge namelists -! Rohini Kumar, May 2014 - options for different cordinate system for the model run\n +! Rohini Kumar, May 2014 - options for different cordinate system for the model run ! Stephan Thober, May 2014 - added switch for chunk read in ! Stephan Thober, Jun 2014 - reorganized restart flags, added flag for performing mpr ! Kumar R., Rakovec O. Sep 2014 - added KGE estimator (OF number 9) @@ -27,10 +27,11 @@ ! Demirel M.C., Stisen S., May 2017 - added FC dependency on root fraction coef. at SM process(3)=3 ! Demirel M.C., Stisen S., Jun 2017 - added PET correction based on LAI at PET process(5)=-1 ! O. Rakovec, R. Kumar Nov 2017 - added project description for the netcdf outputs +! Robert Schweppe Apr 2018 - reorganized namelists depending on relation to processes (MPR, mHM, mRM) ! S. Thober, B. Guse May 2018 - added weighted NSE - + !****************************************************************************************** -! PROJECT DESCRIPTION +! PROJECT DESCRIPTION (mandatory) !****************************************************************************************** !----------------------------------------------------------------------------- !> Provide details on the model simulations, to appear in the netcdf output attributes @@ -55,72 +56,74 @@ history="model run version 1" !****************************************************************************************** ! !****************************************************************************************** -! MAIN +! MAIN (mandatory) !****************************************************************************************** !> Main namelist !> Most of the variables (if not all) given in this namelist are common !> to all basins to be modeled. &mainconfig !----------------------------------------------------------------------------- -!> model run timestep [h] either 1 or 24 -!----------------------------------------------------------------------------- -timestep = 1 -!----------------------------------------------------------------------------- !> input data & model run cordinate system !> 0 -> regular X & Y coordinate system (e.g., GK-4 or Lambert equal area system) !> 1 -> regular lat & lon coordinate system !----------------------------------------------------------------------------- iFlag_cordinate_sys = 0 !----------------------------------------------------------------------------- -!> Number of basins to be modeled. \n -!> Number given here should correspond to one given in "gaugeinfo.txt" file.\n -!> All gauging stations within those basins will be taken for the optimization.\n +!> Number of basins to be modeled. +!> Number given here should correspond to one given in "gaugeinfo.txt" file. +!> All gauging stations within those basins will be taken for the optimization. !> IF routing process is ON then give nBasins = 1, for this case, mHM will internally !> discard gauging station information. !----------------------------------------------------------------------------- nBasins = 2 !----------------------------------------------------------------------------- !> resolution of Level-1 hydrological simulations in mHM [m or degree] per basin -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] \n +!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Hydrology is in [m] +!> if iFlag_cordinate_sys = 1, then resolution_Hydrology is in [degree-decimal] !----------------------------------------------------------------------------- resolution_Hydrology(1) = 24000 resolution_Hydrology(2) = 24000 +!---------------------------------------------------------------------------- +!> specify same index for basins to share L0_data to save memory +!> the index must MONOTONICALLY increase. Index can be repeated. e.g., 1,1,2,2,3 +!> but not 1,2,1. The correct way should be: 1,1,2. +!----------------------------------------------------------------------------- +L0Basin(1) = 1 +L0Basin(2) = 2 +!----------------------------------------------------------------------------- +!> flag for writing restart output +!----------------------------------------------------------------------------- +write_restart = .TRUE. +/ +!****************************************************************************************** +! main config for mHM and mRM (mHM and mRM-related) +!****************************************************************************************** +&mainconfig_mhm_mrm +!----------------------------------------------------------------------------- +! DIRECTORIES !----------------------------------------------------------------------------- -!> resolution of Level-11 discharge routing [m or degree] per basin \n +!> Number in brackets indicates basin number. +!> directory where restart input is located +dir_RestartIn(1) = "test_basin/restart/" +!> directory where restart input is located +dir_RestartIn(2) = "test_basin_2/restart/" +!----------------------------------------------------------------------------- +!> resolution of Level-11 discharge routing [m or degree] per basin !> this level-11 discharge routing resolution must be >= and multiple of the -!> level-1 hydrological simulations resolution \n -!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] \n -!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] \n +!> level-1 hydrological simulations resolution +!> NOTE: if iFlag_cordinate_sys = 0, then resolution_Routing is in [m] +!> if iFlag_cordinate_sys = 1, then resolution_Routing is in [degree-decimal] !----------------------------------------------------------------------------- resolution_Routing(1) = 24000 resolution_Routing(2) = 24000 !----------------------------------------------------------------------------- -!> use ALMA convention for input and output variables -!> see http://www.lmd.jussieu.fr/~polcher/ALMA/convention_3.html -!> .False. -> default mHM units -!> .True. -> ALMA convention -!> CAUTION: at the moment, only Qall as input for mRM is affected -!----------------------------------------------------------------------------- -! ALMA_convention = .TRUE. +!> model run timestep [h] either 1 or 24 !----------------------------------------------------------------------------- -!> for using mRM as the routing module for input other than from mHM -!> additional specifications for filename and netCDF variable can be made -!> default behaviour: -!> none given: get variable 'total_runoff' from file 'total_runoff.nc' -!> varnametotalrunoff given: get variable '$varnametotalrunoff' from file '$varnametotalrunoff.nc' -!> filenametotalrunoff given: get variable 'total_runoff' from file '$varnametotalrunoff.nc' -!> both given: get variable '$varnametotalrunoff' from file '$filenametotalrunoff.nc' +timestep = 1 !----------------------------------------------------------------------------- -! varnametotalrunoff = 'total_runoff' -! filenametotalrunoff = 'total_runoff' -!---------------------------------------------------------------------------- -!> specify same index for basins to share L0_data to save memory \n -!> the index must MONOTONICALLY increase. Index can be repeated. e.g., 1,1,2,2,3 \n -!> but not 1,2,1. The correct way should be: 1,1,2.\n +!> flags for reading restart output !----------------------------------------------------------------------------- -L0Basin(1) = 1 -L0Basin(2) = 2 +read_restart = .FALSE. !----------------------------------------------------------------------------- !> flag for optimization: .TRUE.: optimization !> or .FALSE.: no optimazition @@ -129,101 +132,91 @@ optimize = .FALSE. !> Optimization shall be restarted from ./mo_.restart file, which !> should be located next to the mhm executable (mhm) optimize_restart = .FALSE. -!> (0) MCMC (requires single-objective (SO) function) \n -!> (1) DDS (requires single-objective (SO) function) \n -!> (2) Simulated Annealing (requires single-objective (SO) function) \n -!> (3) SCE (requires single-objective (SO) function) \n +!> (0) MCMC (requires single-objective (SO) function) +!> (1) DDS (requires single-objective (SO) function) +!> (2) Simulated Annealing (requires single-objective (SO) function) +!> (3) SCE (requires single-objective (SO) function) !> additional settings for the different methods can be provided below in namelist Optimization opti_method = 1 -!> (1) SO: Q: 1.0 - NSE \n -!> (2) SO: Q: 1.0 - lnNSE \n -!> (3) SO: Q: 1.0 - 0.5*(NSE+lnNSE) \n -!> (4) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed \n -!> (5) SO: Q: ((1-NSE)**6+(1-lnNSE)**6)**(1/6) \n -!> (6) SO: Q: SSE \n -!> (7) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors \n -!> (8) SO: Q: -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed \n -!> (9) SO: Q: 1.0 - KGE (Kling-Gupta efficiency measure) \n -!> (10) SO: SM: 1.0 - KGE of catchment average soilmoisture \n -!> (11) SO: SM: 1.0 - Pattern dissimilarity (PD) of spatially distributed soil moisture \n -!> (12) SO: SM: Sum of squared errors (SSE) of spatially distributed standard score (normalization) of soil moisture \n -!> (13) SO: SM: 1.0 - average temporal correlation of spatially distributed soil moisture \n -!> (14) SO: Q: sum[((1.0-KGE_i)/ nGauges)**6]**(1/6) > combination of KGE of every gauging station based on a power-6 norm \n -!> (15) SO: Q + basin_avg_TWS: [1.0-KGE(Q)]*RMSE(basin_avg_TWS) - objective function using Q and basin average (standard score) TWS \n -!> (16) (reserved) please use the next number when implementing a new one \n -!> MO: Q: 1st objective: (1) = 1.0 - NSE \n -!> Q: 2nd objective: (2) = 1.0 - lnNSE \n -!> (17) SO: N: 1.0 - KGE of spatio-temporal neutron data, catchment-average \n -!> (18) (reserved) please use the next number when implementing a new one \n -!> MO: Q: 1st objective: 1.0 - lnNSE(Q_highflow) (95% percentile) \n -!> Q: 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) \n -!> (19) (reserved) please use the next number when implementing a new one \n -!> MO: Q: 1st objective: 1.0 - lnNSE(Q_highflow) (non-low flow) \n -!> Q: 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) \n -!> (20) (reserved) please use the next number when implementing a new one \n -!> MO: Q: 1st objective: absolute difference in FDC's low-segment volume \n -!> Q: 2nd objective: 1.0 - NSE of discharge of months DJF \n -!> (21) (reserved) please use the next number when implementing a new one \n -!> SO: Q: ( (1.0-lnNSE(Q_highflow))**6 + (1.0-lnNSE(Q_lowflow))**6 )**(1/6) \n -!> where Q_highflow and Q_lowflow are calculated like in objective (19) \n -!> (22-26) (reserved MC/JM/ST) please use the next number when implementing a new one \n -!> (27) SO: ET: 1.0 - KGE of catchment average evapotranspiration \n -!> (28) SO: Q + SM: weighted OF using SM (OF12) and Q (OF14) equally weighted \n +!> (1) SO: Q: 1.0 - NSE +!> (2) SO: Q: 1.0 - lnNSE +!> (3) SO: Q: 1.0 - 0.5*(NSE+lnNSE) +!> (4) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed +!> (5) SO: Q: ((1-NSE)**6+(1-lnNSE)**6)**(1/6) +!> (6) SO: Q: SSE +!> (7) SO: Q: -1.0 * loglikelihood with trend removed from absolute errors +!> (8) SO: Q: -1.0 * loglikelihood with trend removed from the relative errors and then lag(1)-autocorrelation removed +!> (9) SO: Q: 1.0 - KGE (Kling-Gupta efficiency measure) +!> (10) SO: SM: 1.0 - KGE of catchment average soilmoisture +!> (11) SO: SM: 1.0 - Pattern dissimilarity (PD) of spatially distributed soil moisture +!> (12) SO: SM: Sum of squared errors (SSE) of spatially distributed standard score (normalization) of soil moisture +!> (13) SO: SM: 1.0 - average temporal correlation of spatially distributed soil moisture +!> (14) SO: Q: sum[((1.0-KGE_i)/ nGauges)**6]**(1/6) > combination of KGE of every gauging station based on a power-6 norm +!> (15) SO: Q + basin_avg_TWS: [1.0-KGE(Q)]*RMSE(basin_avg_TWS) - objective function using Q and basin average (standard score) TWS +!> (16) (reserved) please use the next number when implementing a new one +!> MO: Q: 1st objective: (1) = 1.0 - NSE +!> Q: 2nd objective: (2) = 1.0 - lnNSE +!> (17) SO: N: 1.0 - KGE of spatio-temporal neutron data, catchment-average +!> (18) (reserved) please use the next number when implementing a new one +!> MO: Q: 1st objective: 1.0 - lnNSE(Q_highflow) (95% percentile) +!> Q: 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) +!> (19) (reserved) please use the next number when implementing a new one +!> MO: Q: 1st objective: 1.0 - lnNSE(Q_highflow) (non-low flow) +!> Q: 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) +!> (20) (reserved) please use the next number when implementing a new one +!> MO: Q: 1st objective: absolute difference in FDC's low-segment volume +!> Q: 2nd objective: 1.0 - NSE of discharge of months DJF +!> (21) (reserved) please use the next number when implementing a new one +!> SO: Q: ( (1.0-lnNSE(Q_highflow))**6 + (1.0-lnNSE(Q_lowflow))**6 )**(1/6) +!> where Q_highflow and Q_lowflow are calculated like in objective (19) +!> (22-26) (reserved MC/JM/ST) please use the next number when implementing a new one +!> (27) SO: ET: 1.0 - KGE of catchment average evapotranspiration +!> (28) SO: Q + SM: weighted OF using SM (OF12) and Q (OF14) equally weighted +!> further functions can be implemented in mo_objective_function and mo_mrm_objective_function +!> (29) SO: Q + ET: weighted OF using ET (OF27) and Q (OF14) equally weighted +!> (30) SO: Q + basin_avg_ET: [1.0-KGE(Q)]*RMSE(basin_avg_ET) - objective function using Q and basin average ET (standard score)$ +!> (31) SO: Q: 1 - weighted NSE (NSE is weighted with observed discharge) + !> further functions can be implemented in mo_objective_function and mo_mrm_objective_function -!> (29) SO: Q + ET: weighted OF using ET (OF27) and Q (OF14) equally weighted \n -!> (30) SO: Q + basin_avg_ET: [1.0-KGE(Q)]*RMSE(basin_avg_ET) - objective function using Q and basin average ET (standard score)$ \n -!> further functions can be implemented in mo_objective_function and mo_mrm_objective_function \n -!> (31) SO: Q: 1 - weighted NSE (NSE is weighted with observed discharge) \n opti_function = 10 -!----------------------------------------------------------------------------- -!> flags for reading and writing restart output, and calculating mpr -!----------------------------------------------------------------------------- -read_restart = .FALSE. -write_restart = .TRUE. -perform_mpr = .TRUE. / - !****************************************************************************************** -! MRM COUPLING MODE +! main config for mRM (mRM-related) !****************************************************************************************** +&mainconfig_mrm !----------------------------------------------------------------------------- -!> coupling_mode can be either: 0 = stand-alone\n -!> 1 = coupling to a hydrologic model (general coupling)\n -!> 2 = coupling to mHM\n +!> use ALMA convention for input and output variables +!> see http://www.lmd.jussieu.fr/~polcher/ALMA/convention_3.html +!> .False. -> default mHM units +!> .True. -> ALMA convention +!> CAUTION: at the moment, only Qall as input for mRM is affected !----------------------------------------------------------------------------- -&coupling_config -mrm_coupling_mode = 2 +ALMA_convention = .TRUE. +!----------------------------------------------------------------------------- +!> for using mRM as the routing module for input other than from mHM +!> additional specifications for filename and netCDF variable can be made +!> default behaviour: +!> none given: get variable 'total_runoff' from file 'total_runoff.nc' +!> varnametotalrunoff given: get variable '${varnametotalrunoff}' from file '${varnametotalrunoff}.nc' +!> filenametotalrunoff given: get variable 'total_runoff' from file '${filenametotalrunoff}.nc' +!> both given: get variable '${varnametotalrunoff}' from file '${filenametotalrunoff}.nc' +!----------------------------------------------------------------------------- +varnametotalrunoff = 'total_runoff' +filenametotalrunoff = 'total_runoff' / !****************************************************************************************** ! DIRECTORIES !****************************************************************************************** -!> Namelist with all directories for common file as well as separate file for every basin.\n -!> Number in brackets indicates basin number.\n -!> This number HAS TO correspond with the number of basin given below in the "mainconfig" -!> namelist as well as the indices given in "evaluation_gauges" namelist.\n - -! directories used only by mRM -&directories_mRM -! -!----------------------------------------------------- -!> basin wise directory paths -!----------------------------------------------------- -! -!> directory where discharge files are located -dir_Gauges(1) = "test_basin/input/gauge/" -dir_Gauges(2) = "test_basin_2/input/gauge/" -!> directory where simulated runoff can be found (only required if coupling mode equals 0) -dir_Total_Runoff(1) = 'test_basin/output_b1/' -dir_Total_Runoff(2) = 'test_basin_2/output/' -/ - -! general directories used by mRM and mHM +!> Namelist with all directories for common file as well as separate file for every basin. +!> Number in brackets indicates basin number. +!> This number HAS TO correspond with the number of basin given in the "mainconfig" +!> namelist as well as the indices given in "evaluation_gauges" namelist. +!****************************************************************************************** +! directories (mandatory) +!****************************************************************************************** &directories_general -! -!----------------------------------------------------- -! Directory for common files (to all basins) -!----------------------------------------------------- +!> all directories are common to all basins !> config run out file common to all modeled basins should be written to directory dirConfigOut = "test_basin/" ! @@ -236,8 +229,6 @@ dirCommonFiles = "test_basin/input/morph/" dir_Morpho(1) = "test_basin/input/morph/" !> directory where land cover files are located dir_LCover(1) = "test_basin/input/luse/" -!> directory where restart input is located -dir_RestartIn(1) = "test_basin/restart/" !> directory where restart output should be written dir_RestartOut(1) = "test_basin/restart/" !> directory where output should be written @@ -250,8 +241,6 @@ file_LatLon(1) = "test_basin/input/latlon/latlon_1.nc" dir_Morpho(2) = "test_basin_2/input/morph/" !> directory where land cover files are located dir_LCover(2) = "test_basin_2/input/luse/" -!> directory where restart input is located -dir_RestartIn(2) = "test_basin_2/restart/" !> directory where restart output should be written dir_RestartOut(2) = "test_basin_2/restart/" !> directory where output should be written @@ -259,8 +248,9 @@ dir_Out(2) = "test_basin_2/output/" !> file containing latitude and longitude on the resolution_Hydrology file_LatLon(2) = "test_basin_2/input/latlon/latlon.nc" / - -! directories used only by mhm +!****************************************************************************************** +! directories (mHM-related) +!****************************************************************************************** &directories_mHM ! !> input format specification for the meteorological forcings: 'nc' or 'bin'. @@ -291,8 +281,6 @@ dir_NetRadiation(1) = "test_basin/input/meteo/" !> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified dir_absVapPressure(1) = "test_basin/input/meteo/" dir_windspeed(1) = "test_basin/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(1) = "test_basin/input/lai/" ! !**** for Basin 2 !> directory where meteorological input is located @@ -314,17 +302,45 @@ dir_NetRadiation(2) = "test_basin_2/input/meteo/" !> if processCase(5) == 3 input directory of absolute vapour pressure (eabs) and windspeed has to be specified dir_absVapPressure(2) = "test_basin_2/input/meteo/" dir_windspeed(2) = "test_basin_2/input/meteo/" -!> directory where gridded LAI files are located -dir_gridded_LAI(2) = "test_basin/input/lai/" +!> switch to control read input frequency of the gridded meteo input, +!> i.e. precipitation, potential evapotransiration, and temperature +!> >0: after each days +!> 0: only at beginning of the run +!> -1: daily +!> -2: monthly +!> -3: yearly +!> if timestep_model_inputs is non-zero, than it has to be non-zero +!> for all basins +time_step_model_inputs(1) = 0 +time_step_model_inputs(2) = 0 +/ +!****************************************************************************************** +! directories (mRM-related) +!****************************************************************************************** +&directories_mRM +! +!----------------------------------------------------- +!> basin wise directory paths +!----------------------------------------------------- +! +!> directory where discharge files are located +dir_Gauges(1) = "test_basin/input/gauge/" +dir_Gauges(2) = "test_basin_2/input/gauge/" +!> directory where simulated runoff can be found (only required if coupling mode equals 0) +dir_Total_Runoff(1) = 'test_basin/output_b1/' +dir_Total_Runoff(2) = 'test_basin_2/output/' / +!****************************************************************************************** +! Optional input (mHM-related) +!****************************************************************************************** !> data which are optionally needed for optimization &optional_data !> soil moisture data !> currently mhm can be calibrated against the fraction of moisture !> down to a specific mhm soil layer (integral over the layers) !> here soil moisture is defined as fraction between water content within the -!> soil column and saturated water content (porosity). \n +!> soil column and saturated water content (porosity). ! !> directory to soil moisture data ! expected file name: sm.nc, expected variable name: sm @@ -333,13 +349,13 @@ dir_soil_moisture(1) = "test_basin/input/optional_data/" !> input is representative for (counted top to down) nSoilHorizons_sm_input = 1 !> time stepping of the soil moisture input -!> -1: daily SM values\n -!> -2: monthly SM values\n -!> -3: yearly SM values\n +!> -1: daily SM values +!> -2: monthly SM values +!> -3: yearly SM values !----------------------------- timeStep_sm_input = -2 ! -!> basin average total water storage (tws) \n +!> basin average total water storage (tws) !> file name including path with timeseries of GRACE-based data file_tws(1) = "test_basin/input/optional_data/tws_basin_1.txt" file_tws(2) = "test_basin/input/optional_data/tws_basin_2.txt" @@ -355,18 +371,101 @@ dir_neutrons(1) = "test_basin/input/optional_data/" dir_evapotranspiration(1) = "test_basin/input/optional_data/" !> time stepping of the soil moisture input -!> -1: daily ET values\n -!> -2: monthly ET values\n -!> -3: yearly ET values\n +!> -1: daily ET values +!> -2: monthly ET values +!> -3: yearly ET values !----------------------------- timeStep_et_input = -2 / +!****************************************************************************************** +! PROCESSES (mandatory) +!****************************************************************************************** +!> This matrix manages which processes and process descriptions are used for simulation. +!> The number of processes and its corresponding numbering are fixed. The process description can be +!> chosen from the options listed above the name of the particular process case. This number has to be +!> given for processCase(*). +! +&processSelection +!> interception +!> 1 - maximum Interception +processCase(1) = 1 +!> snow +!> 1 - degree-day approach +processCase(2) = 1 +!> soil moisture +!> 1 - Feddes equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like +!> 2 - Jarvis equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like +!> 3 - Jarvis equation for ET reduction and FC dependency on root fraction coefficient +processCase(3) = 1 +!> directRunoff +!> 1 - linear reservoir exceedance approach +processCase(4) = 1 +!> potential evapotranspiration (PET) +!> -1 - PET is input, LAI driven correction +!> 0 - PET is input, aspect driven correction +!> 1 - Hargreaves-Sammani method +!> 2 - Priestley-Taylor mehtod +!> 3 - Penman-Monteith method +processCase(5) = 0 +!> interflow +!> 1 - storage reservoir with one outflow threshold and nonlinear response +processCase(6) = 1 +!> percolation +!> 1 - GW assumed as linear reservoir +processCase(7) = 1 +!> routing +!> 0 - deactivated +!> 1 - Muskingum approach +!> 2 - adaptive timestep +processCase(8) = 2 +!> baseflow +!> 1 - recession parameters (not regionalized yet) +processCase(9) = 1 +!> ground albedo of cosmic-ray neutrons +!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH +!> 0 - deactivated +!> 1 - inverse N0 based on Desilets et al. 2010 +!> 2 - COSMIC forward operator by Shuttleworth et al. 2013 +processCase(10) = 0 +/ + +!****************************************************************************************** +! LAND COVER (mandatory) +!****************************************************************************************** +&LCover +!> Variables given in this namelist are common to all basins to be modeled. +!> Please make sure that the land cover periods are covering the simulation period. +!> number of land cover scenes to be used +!> The land cover scene periods are shared by all catchments. +!> The names should be equal for all basins. The land cover scnes have to be ordered +!> chronologically. +nLCoverScene = 2 +! indicate period with brackets behind variable +! first scene +!> starting year of land cover scene 1 +LCoverYearStart(1) = 1981 +!> ending year of land cover scnene 1 +LCoverYearEnd(1) = 1990 +!> name of land cover file for scnene 1 +LCoverfName(1) = 'lc_1981.asc' + +!> starting year of land cover scene 2 +LCoverYearStart(2) = 1991 +!> ending year of land cover scnene 2 +LCoverYearEnd(2) = 2000 +!> name of land cover file for scnene 2 +LCoverfName(2) = 'lc_1991.asc' +/ + +!****************************************************************************************** +! Time periods (mHM and mRM-related) +!****************************************************************************************** &time_periods !----------------------------------------------------------------------------- -!> specification of number of warming days [d] and the simulation period.\n +!> specification of number of warming days [d] and the simulation period. !> All dynamic data sets(e.g., meteo. forcings, landcover scenes) should start -!> from warming days and ends at the last day of the evaluation period. \n +!> from warming days and ends at the last day of the evaluation period. ! !> 1---------2-------------------3 !> @@ -380,60 +479,49 @@ timeStep_et_input = -2 !> the effective modeling period of 2001/01/01 to 2003/12/31. !----------------------------------------------------------------------------- warming_Days(1) = 0 -warming_Days(2) = 180 +warming_Days(2) = 181 !> first year of wanted simulation period eval_Per(1)%yStart = 1990 -eval_Per(2)%yStart = 1993 +eval_Per(2)%yStart = 1990 !> first month of wanted simulation period -eval_Per(1)%mStart = 01 -eval_Per(2)%mStart = 01 -!> first day of wanted simulation period +eval_Per(1)%mStart = 07 +eval_Per(2)%mStart = 07 +!> first day of wanted simulation period eval_Per(1)%dStart = 01 eval_Per(2)%dStart = 01 -!> last year of wanted simulation period -eval_Per(1)%yEnd = 1993 -eval_Per(2)%yEnd = 1993 -!> last month of wanted simulation period -eval_Per(1)%mEnd = 12 -eval_Per(2)%mEnd = 12 -!> last day of wanted simulation period +!> last year of wanted simulation period +eval_Per(1)%yEnd = 1991 +eval_Per(2)%yEnd = 1991 +!> last month of wanted simulation period +eval_Per(1)%mEnd = 6 +eval_Per(2)%mEnd = 6 +!> last day of wanted simulation period eval_Per(1)%dEnd = 31 eval_Per(2)%dEnd = 31 -!> switch to control read input frequency of the gridded meteo input, -!> i.e. precipitation, potential evapotransiration, and temperature\n -!> >0: after each days\n -!> 0: only at beginning of the run\n -!> -1: daily\n -!> -2: monthly\n -!> -3: yearly\n -!> if timestep_model_inputs is non-zero, than it has to be non-zero\n -!> for all basins\n -time_step_model_inputs(1) = 0 -time_step_model_inputs(2) = 0 / !****************************************************************************************** -! INPUT SOIL DATABASE AND mHM LAYERING +! INPUT SOIL DATABASE AND mHM LAYERING (MPR-related) !****************************************************************************************** !> Namelist controlling the layer information of the soil database !> Variables given in this namelist are common to all basins to be modeled. -&soilLayer +&soildata !---------------------------------------------------------------------------------------------------------- !> iFlag_soilDB: -!> flag to handle multiple types of soil databases and their processing within the mHM.\n -!> This flag is unique and valid for all basins.\n -!> Depending on the choice of this flag you need to process your soil database differently.\n +!> flag to handle multiple types of soil databases and their processing within the mHM. +!> This flag is unique and valid for all basins. +!> Depending on the choice of this flag you need to process your soil database differently. ! !> iFlag_soilDB = 0: -!> Read and process the soil database in a classical mHM format which requires:\n -!> i) a single gridded ASCII file of soil-id (soil_class.asc - hard coded file name)\n +!> Read and process the soil database in a classical mHM format which requires: +!> i) a single gridded ASCII file of soil-id (soil_class.asc - hard coded file name) !> ii) a single soil look-up-table file (soil_classdefinition.txt) with information of -!> soil textural properties for every horizon.\n +!> soil textural properties for every horizon. ! !> Here mHM is quite flexible to handle multiple soil layers as specified in "nSoilHorizons_mHM" -!> and depths provided in "soil_Depth(:)".\n +!> and depths provided in "soil_Depth(:)". ! -!> The tillage depth is flexible in this case.\n +!> The tillage depth is flexible in this case. ! !> The depth of last mHM modeling layer is determined according the information given in the !> input soil database, which could vary spatially depending on the soil type. Therefore the @@ -451,19 +539,19 @@ time_step_model_inputs(2) = 0 !> and the empty spaces are (trailed) filled with Zeros. FORTRAN CODE I2.2 !> The horizon is numbered sequentially from top to bottom soil layers. !> E.g., for 1st horizon it is soil_class_horizon_01.asc, -!> for 2nd it is soil_class_horizon_02.asc, ... and so on. \n +!> for 2nd it is soil_class_horizon_02.asc, ... and so on. ! !> ii) a single soil look-up-table file with information of soil textural properties for each soil type. !> Note that there should be no horizon specific information in this LUT file -!> (soil_classdefinition_iFlag_soilDB_1.txt - filename is hard coded).\n +!> (soil_classdefinition_iFlag_soilDB_1.txt - filename is hard coded). ! !> The modeling soil horizons is as per the input data (i.e. for which the gridded ASCII files are available). ! -!> The depth of the last mHM horizon should be specified. It is fixed and uniform across the entire modeling domain.\n +!> The depth of the last mHM horizon should be specified. It is fixed and uniform across the entire modeling domain. ! -!> The tillage depth should conform with one of the horizon (lower) layer depths.\n +!> The tillage depth should conform with one of the horizon (lower) layer depths. ! -!> There is an overhead cost of reading and storing multiple (horizon specific) gridded ASCII files\n +!> There is an overhead cost of reading and storing multiple (horizon specific) gridded ASCII files ! !> Note: For both cases: The present model code mHM can handle maximum of 10 soil horizons (hard coded). !> To increase this number, edit the variable "maxNoSoilHorizons" in the "/src/mhm/mo_mhm_constants.f90" file @@ -489,76 +577,31 @@ soil_Depth(1) = 200 / !****************************************************************************************** -! LAND COVER -!****************************************************************************************** -&LCover -!> Variables given in this namelist are common to all basins to be modeled. -!> Please make sure that the land cover periods are covering the simulation period. -!>fraction of area within city assumed to be fully sealed [0.0-1.0] -fracSealed_cityArea = 0.6 -!> number of land cover scenes to be used\n -!> The land cover scene periods are shared by all catchments. -!> The names should be equal for all basins. The land cover scnes have to be ordered -!> chronologically. -nLcover_scene = 3 -! indicate period with brackets behind variable -! first scene -!> starting year of land cover scene 1 -LCoverYearStart(1) = 1975 -!> ending year of land cover scnene 1 -LCoverYearEnd(1) = 1989 -!> name of land cover file for scnene 1 -LCoverfName(1) = 'lc_1990.asc' - -!> starting year of land cover scene 2 -LCoverYearStart(2) = 1990 -!> ending year of land cover scnene 2 -LCoverYearEnd(2) = 1993 -!> name of land cover file for scnene 2 -LCoverfName(2) = 'lc_1990.asc' - -!> starting year of land cover scene 3 -LCoverYearStart(3) = 1994 -!> ending year of land cover scnene 3 -LCoverYearEnd(3) = 2004 -!> name of land cover file for scnene 3 -LCoverfName(3) = 'lc_1990.asc' -/ - -!****************************************************************************************** -! INFORMATION RELATED TO LAI DATA +! INFORMATION RELATED TO LAI DATA (MPR-related) !****************************************************************************************** &LAI_data_information ! !----------------------------------------------------------------------------------- !> Flag timeStep_LAI_input identifies how LAI is read in mHM. -!> This flag is unique and valid for all basins.\n +!> This flag is unique and valid for all basins. ! !> timeStep_LAI_input !> -!> 0: read LAI from longterm monthly mean lookup table (related to land cover file). +!> 0: read LAI from long term monthly mean lookup table (related to land cover file). !> The filename (LAI_classdefinition.txt) for the LUT is hard coded in mo_file.f90 !> Information regarding long-term monthly mean LAI for land cover classes !> appearing in all modeled basins should be included in this LUT file. -!> This is an unique file applicable to all basins to be modeled. \n +!> This is an unique file applicable to all basins to be modeled. !> The respective plant functional type is in LAI_class.asc, which must be also given !> and should be located in each basin's morph directory. !> -!>*NOTE: In this option-0, the LAI-LUT and the corresponding LC_LAI datasets are used in -!> regionalising the max. interception capacity parameter and some parameters -!> in the PET estimation approaches of the Priestley-Taylor method and -!> the Penman monteith equation. The PET estimation approaches uses these datasets -!> in various ways; and are currently not flexible enough to use other LAI options. -!> -!> **: THE BELOW MENTIONED OPTIONS ARE CURRENTLY USED FOR ONLY REGIONALIZING THE INTERCEPTION PARAMETERS -!> -!> < 0: Read gridded LAI files.\n -!> -1: gridded LAI are daily values\n -!> -2: gridded LAI are monthly values\n -!> -3: gridded LAI are yearly values\n +!> < 0: Read gridded LAI files. +!> -1: gridded LAI are daily values +!> -2: gridded LAI are monthly values +!> -3: gridded LAI are yearly values ! -!> 1: read mean monthly gridded LAI values.\n -!> must be a separate *.nc file for every (modeled) basins.\n +!> 1: read mean monthly gridded LAI values. +!> must be a separate *.nc file for every (modeled) basins. !----------------------------------------------------------------------------------- timeStep_LAI_input = 0 !> input file format of gridded file (if timeStep_LAI_input < 0) @@ -569,61 +612,27 @@ timeStep_LAI_input = 0 inputFormat_gridded_LAI = "nc" / -! !****************************************************************************************** -! PROCESSES +! LCover information (MPR-related) !****************************************************************************************** -!> This matrix manages which processes and process descriptions are used for simulation. -!> The number of processes and its corresponding numbering are fixed. The process description can be -!> chosen from the options listed above the name of the particular process case. This number has to be -!> given for processCase(*). -! -&processSelection -!> interception -!> 1 - maximum Interception -processCase(1) = 1 -!> snow -!> 1 - degree-day approach -processCase(2) = 1 -!> soil moisture -!> 1 - Feddes equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like -!> 2 - Jarvis equation for ET reduction, multi-layer infiltration capacity approach, Brooks-Corey like -!> 3 - Jarvis equation for ET reduction and FC dependency on root fraction coefficient -processCase(3) = 1 -!> directRunoff -!> 1 - linear reservoir exceedance approach -processCase(4) = 1 -!> potential evapotranspiration (PET) -!> -1 - PET is input, LAI driven correction -!> 0 - PET is input, aspect driven correction -!> 1 - Hargreaves-Sammani method -!> 2 - Priestley-Taylor mehtod -!> 3 - Penman-Monteith method -processCase(5) = 0 -!> interflow -!> 1 - storage reservoir with one outflow threshold and nonlinear response -processCase(6) = 1 -!> percolation -!> 1 - GW assumed as linear reservoir -processCase(7) = 1 -!> routing -!> 0 - deactivated -!> 1 - Muskingum approach -!> 2 - adaptive timestep -processCase(8) = 2 -!> baseflow -!> 1 - recession parameters (not regionalized yet) -processCase(9) = 1 -!> ground albedo of cosmic-ray neutrons -!> THIS IS WORK IN PROGRESS, DO NOT USE FOR RESEARCH -!> 0 - deactivated -!> 1 - inverse N0 based on Desilets et al. 2010 -!> 2 - COSMIC forward operator by Shuttleworth et al. 2013 -processCase(10) = 0 +&LCover_MPR +!>fraction of area within city assumed to be fully sealed [0.0-1.0] +fracSealed_cityArea = 0.6 +/ + +!****************************************************************************************** +! LAI gridded time series folder definition (optional, MPR-related) +!****************************************************************************************** +! this is only needed for timeStep_LAI_input != 0 +&directories_MPR +!> directory where gridded LAI files are located +dir_gridded_LAI(1) = "test_basin/input/lai/" +!> directory where gridded LAI files are located +dir_gridded_LAI(2) = "test_basin/input/lai/" / !****************************************************************************************** -! Specifcation of evaluation and inflow gauges +! Specifcation of evaluation and inflow gauges (mRM-related) !****************************************************************************************** !> namelist controlling the gauging station information !> The ID has to correspond to the ID's given in the 'gaugelocation.asc' and @@ -679,7 +688,7 @@ InflowGauge_Headwater(1,1) = .FALSE. / !****************************************************************************************** -! ANNUAL CYCLE PAN EVAPORATION +! ANNUAL CYCLE PAN EVAPORATION (mHM-related) !****************************************************************************************** &panEvapo ! MONTH Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec @@ -688,7 +697,7 @@ evap_coeff = 1.30, 1.20, 0.72, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, / !****************************************************************************************** -! ANNUAL CYCLE METEOROLOGICAL FORCINGS +! ANNUAL CYCLE METEOROLOGICAL FORCINGS (mHM-related) !****************************************************************************************** &nightDayRatio !> Alternatively to night day ratios, explicit weights for pet and average temperature can @@ -708,11 +717,11 @@ fnight_temp = -0.76, -1.30, -1.88, -2.38, -2.72, -2.75, -2.74, -3.04, -2.44, / !****************************************************************************************** -! SETTINGS FOR OPTIMIZATION +! SETTINGS FOR OPTIMIZATION (mHM and mRM-related) !****************************************************************************************** &Optimization ! ------------------------------------- -!> General: \n +!> General: ! ------------------------------------- !> number of iteration steps by parameterset nIterations = 7 @@ -720,18 +729,18 @@ nIterations = 7 !> if default: seed is obtained from system clock seed = 1235876 ! ------------------------------------- -!> DDS specific: \n +!> DDS specific: ! ------------------------------------- !> perturbation rate r (default: 0.2) dds_r = 0.2 ! ------------------------------------- -!> SA specific: \n +!> SA specific: ! ------------------------------------- !> Initial Temperature (default: -9.0) !> if default: temperature is determined by algorithm of Ben-Ameur (2004) sa_temp = -9.0 ! ------------------------------------- -!> SCE specific: \n +!> SCE specific: ! ------------------------------------- !> Number of Complexes (default: -9) !> if default: ngs = 2 @@ -743,7 +752,7 @@ sce_npg = -9 !> if default: nps = n+1 sce_nps = -9 ! ------------------------------------- -!> MCMC specific: \n +!> MCMC specific: ! ------------------------------------- !> .true.: use MCMC for optimisation and estimation of parameter uncertainty !> .false.: use MCMC for estimation of parameter uncertainty diff --git a/post-proc/format_doxygen_docs_in_f90.py b/post-proc/format_doxygen_docs_in_f90.py new file mode 100644 index 00000000..daafb838 --- /dev/null +++ b/post-proc/format_doxygen_docs_in_f90.py @@ -0,0 +1,613 @@ +#!/usr/bin/env python +# encoding: utf-8 + +""" +File Name : format_doxygen_docs_in_f90 +Project Name: mpr_extract +Description : insert your description here, if applicable +Author : ottor +Created : 16.05.18 15:23 +""" + +# IMPORTS +import pathlib +import re +import pytest +from datetime import datetime + +# GLOBAL VARIABLES +POSSIBLE_SUFFIXES = ['.f90', '.F'] +ROUTINE_FLAG = ['function', 'subroutine'] +MODIFIED_FLAG = ['Modified', 'Modifications'] +IMPLICIT_NONE_FLAG = 'implicit none' +USE_FLAG = r'^[\s]*use' +ARG_DESCRIPTION_SPLITTER = '::' +MAX_LINE_WIDTH = 100 + +# FUNCTIONS +def get_all_subfiles(path, relation=None): + if path.is_file() and path.suffix in POSSIBLE_SUFFIXES: + yield path.relative_to(relation or path) + else: + for sub_path in path.iterdir(): + yield from get_all_subfiles(sub_path, path) + +def check_for_line_to_ignore(line): + return not line.strip() or re.match('!\s+-+\s*$', line.strip()) + +# CLASSES +class Doc(object): + FILE_FLAGS = ['brief', 'details', 'authors', 'author', 'date', 'note', 'return'] + BLOCK_DICT = {'brief': 'PURPOSE', 'authors': 'HISTORY', 'note':'RESTRICTIONS', + 'return': 'RETURN'} + DOC_COMMENT = '!>' + COMMENT = '!' + FLAG_PREFIX = '\\' + + def __init__(self): + self._name = None + self.param_dict = {} + self._brief = None + self._details = None + self._return = None + self._author = None + self._authors = None + self._note = None + self._example = None + self._literature = None + self._date = None + + self._in_modified = False + self._modified = [] + self.cur_field = None + + def parse_doc(self, line): + if not check_for_line_to_ignore(line): + if any([re.search(pattern, line) for pattern in MODIFIED_FLAG]): + self._in_modified = True + + if self._in_modified: + self.parse_modifications(line) + elif line.strip().startswith(self.DOC_COMMENT): + # check for DOC_COMMENT + parsed = None + for pattern in self.FILE_FLAGS: + matched = re.match(self.DOC_COMMENT + + '\s*' + + self.FLAG_PREFIX * 2 + + pattern, line.strip(), re.IGNORECASE) + if matched: + self.cur_field = pattern + parsed = line.strip()[matched.end():].strip() + self.set_file_doc_attr(parsed) + if parsed is None: + self.set_file_doc_attr(line.lstrip(' ' + self.DOC_COMMENT)) + + def doc_to_str(self, fname=None, indent=0, module=False): + + def format_item(indent, comment, block_name, value): + value = value.replace('\n', '\n{indent}{comment:9}'.format(indent=' ' * indent, + comment=comment)) + template = '{indent}{comment:5}{block_name}\n{indent}{comment:9}{value}\n\n' + if block_name is None: + template = '{indent}{comment:9}{value}\n\n' + return template.format(indent=' ' * indent, + comment=comment, + block_name=block_name, + value=value) + + value = getattr(self, '_author') + if value is not None: + setattr(self, '_author', None) + setattr(self, '_authors', value) + + out_string = '' + + if module: + out_string += format_item(indent=indent, comment=self.COMMENT, + block_name='NAME', value=self._name) + for item in self.FILE_FLAGS: + value = getattr(self, '_{}'.format(item)) + if item == 'file' and fname is not None: + value = fname + if value is None: + if item == 'authors': + value = self.default_author + elif item == 'date': + value = '{:%b %Y}'.format(datetime.today()) + elif item in ['brief', 'details']: + value = 'TODO: add description' + if value is not None: + value = '{} {}'.format(self.FLAG_PREFIX + item, value) + out_string += format_item(indent=indent, comment=self.DOC_COMMENT, + block_name=self.BLOCK_DICT.get(item), value=value) + + out_string += '{}{} Modifications:\n'.format(' ' * indent, self.COMMENT) + if self._modified: + max_editor_length = max((mod.editor_length for mod in self._modified)) + for mod in self._modified: + mod.note = '- ' + mod.note.lstrip('- ').replace('- ', '\n{}{}{}- '.format(' ' * (indent), + self.COMMENT, + ' ' * (11 + max_editor_length))) + out_string += '{}{} {:{width}} {} {}\n'.format(' ' * indent, self.COMMENT, + mod.editor, mod.date, mod.note, width=max_editor_length) + + return out_string + '\n' + + def parse_modifications(self, line): + split = re.split('([A-Z][a-z]{2}\s+20\d\d)',line) + if len(split) == 3: + # modified is in line + for pattern in MODIFIED_FLAG: + matched = re.search(pattern, split[0]) + if matched: + split[0] = split[0][matched.end():] + editor = split[0].strip('! ') + date = split[1].strip() + note = split[2].strip() + self._modified.append(Modification(editor, date, note)) + else: + self._modified[-1].note += ' {}'.format(line.strip('! \n')) + + def set_file_doc_attr(self, value): + if self.cur_field is None: + raise Exception + cur_name = '_{}'.format(self.cur_field) + + cur_attr = getattr(self, cur_name) + value = value.strip().replace('\\n', '') + if cur_attr is None: + # get the info and append to string + setattr(self, cur_name, value) + else: + setattr(self, cur_name, cur_attr + '\n' + value) + + +class FortranFile(Doc): + FILE_FLAGS = ['file', 'brief', 'details', 'author', 'authors', 'date', 'version', 'copyright'] + BLOCK_DICT = {} + + MODULE_FLAG = ['module', 'program'] + + def __init__(self, default_author): + # parameters + super().__init__() + self._file = None + self._version = None + self._copyright = None + self.lines = [] + self.comments = None + self.modifications = [] + self._cur_doc = None + + # flags + self._cur_routine = None + self._in_module = False + self._in_modified = False + self._in_doc = False + self._in_routine = False + self._in_routine_args = False + self._is_line_continued = False + self._in_code = False + + self.default_author = default_author + + def read(self, fname): + print('reading', fname) + with open(fname, 'r') as f_in: + for line in f_in: + self._check_status(line) + + if not self._in_module: + self._parse_file_doc(line) + elif self._in_doc: + self._parse_doc(line) + elif self._in_routine: + self._parse_routine(line) + elif self._in_code: + if self._cur_routine is not None: + self.lines.append(self._cur_routine) + if self._cur_routine.comment_cache: + self.lines.extend(self._cur_routine.comment_cache) + self._cur_routine = None + self.lines.append(line) + # elif line.strip(): + else: + self.lines.append(line) + + def write(self, fname): + print('writing', fname) + with open(fname, 'w') as f_in: + f_in.write(self.doc_to_str(fname.name)) + for line in self.lines: + if isinstance(line, Routine): + f_in.write(line.to_str()) + else: + f_in.write(line) + + def _check_status(self, line): + if check_for_line_to_ignore(line): + pass + elif not self._in_module: + self._check_for_file_doc(line) + elif self._in_doc: + self._check_for_routine(line) + elif self._in_routine_args: + pass + elif self._in_routine: + self._check_for_code(line) + elif self._in_code: + self._check_for_code_end(line) + else: + self._check_for_doc(line) + self._check_for_routine(line) + + def _check_for_file_doc(self, line): + # check for MODULE_FLAG??? + if any([re.search(pattern, line.split(self.COMMENT)[0], re.IGNORECASE) for pattern in self.MODULE_FLAG]): + self._in_module = True + self._in_modified = False + self._cur_filedoc = None + + def _check_for_routine(self, line): + # check for ROUTINE_FLAG + if any([re.search(pattern, line.split(self.COMMENT)[0], re.IGNORECASE) for pattern in ROUTINE_FLAG]): + self._in_doc = False + self._in_modified = False + self._in_routine = True + self._in_routine_args = True + + def _check_for_line_continuation(self, line): + stripped = line.split(self.COMMENT)[0].strip() + if stripped.endswith('&'): + self._is_line_continued = True + elif stripped: + self._is_line_continued = False + + def _check_for_doc(self, line): + # check for DOC_COMMENT + if re.match(self.DOC_COMMENT, line.strip()) or re.match('!\s+NAME', line.strip()): + self._in_doc = True + + def _check_for_code(self, line): + # check for neither use nor "implicit none" nor :: and line + clean_line = line.split(self.COMMENT)[0].strip() + if not (ARG_DESCRIPTION_SPLITTER in clean_line or + re.match(USE_FLAG, clean_line, re.IGNORECASE) or + re.match(IMPLICIT_NONE_FLAG, clean_line, re.IGNORECASE)) \ + and not self._is_line_continued and clean_line: + self._in_routine = False + self._in_code = True + + def _check_for_code_end(self, line): + # check for end ROUTINE_FLAG + if any([re.match('end\s*' + pattern, line.split(self.COMMENT)[0], re.IGNORECASE) for pattern in ROUTINE_FLAG]): + self._in_code = False + + def _parse_doc(self, line): + if self._cur_doc is None: + self._cur_doc = Doc() + # check for DOC_COMMENT + self._cur_doc.parse_doc(line) + + def _parse_file_doc(self, line): + # update self._cur_doc + self.parse_doc(line) + + def _parse_routine(self, line): + if self._cur_routine is None: + self._cur_routine = Routine(doc=self._cur_doc) + # update self._cur_doc + self._cur_doc = None + self._cur_routine.parse_line(line, + is_line_continued=self._is_line_continued, + in_routine_args=self._in_routine_args, + ) + self._check_for_line_continuation(line) + if not self._is_line_continued and self._in_routine_args: + self._in_routine_args = False + + +class Routine(object): + ONLY_STR = 'only' + COMMENT = '!' + def __init__(self, doc=None): + self.doc = doc + self.args = [] + self.args_doc = [] + self.args_attrs = [] + self.implicit_none = False + self.used = [] + self.name = None + self.type = None + self.type_attrs = None + self.type_addon = None + self.comment_cache = [] + + def parse_line(self, line, is_line_continued=False, in_routine_args=False): + # check for DOC_COMMENT + if self.name is None: + for pattern in ROUTINE_FLAG: + matched = re.match(pattern, line.strip(), re.IGNORECASE) + if not matched: + continue + # get the type + self.type = pattern + # get the stuff like (elemental pure...) + self.type_attrs = line.strip()[:matched.start()] or None + # trim line + line = line.strip()[matched.end():] + split = line.split('(') + self.name = split[0].strip() + line = split[1] + in_routine_args = True + if self.name is None: + print(line) + raise Exception + if in_routine_args: + # remove comments + split = line.split('!') + if len(split) == 2: + comment = split[1] + else: + comment = '' + split = split[0].split(')') + if len(split) > 1 and split[1].rstrip('& \n'): + self.type_addon = split[1].rstrip('& \n') + ')' + cur_args = [arg.strip(' &') for arg in split[0].split(',') if arg.strip(' &')] + if len(cur_args) == 1 and comment: + self.args_doc += [comment] + else: + self.args_doc += [comment] * len(cur_args) + self.args += cur_args + else: + self._parse_body(line, is_line_continued) + + def _parse_body(self, line, is_line_continued): + if not line.strip().startswith(self.COMMENT): + self.comment_cache = [] + matched = re.match(IMPLICIT_NONE_FLAG, line.strip(), re.IGNORECASE) + if matched: + self.implicit_none = True + elif re.match(USE_FLAG, line.strip(), re.IGNORECASE): + line = line.strip()[re.match(USE_FLAG, line.strip(), re.IGNORECASE).end():] + matched = re.search(self.ONLY_STR, line, re.IGNORECASE) + if not matched: + raise Exception('use without "{}" discovered'.format(self.ONLY_STR)) + split = re.split(self.ONLY_STR, line, flags=re.IGNORECASE) + split[0] = split[0].strip(' ,').lower() + for item in split[1].split(','): + value = item.split(self.COMMENT)[0].strip(':&\n ') + if value: + self.used.append((split[0], value)) + elif ARG_DESCRIPTION_SPLITTER in line: + split = line.split(ARG_DESCRIPTION_SPLITTER) + name = split[1].split('!') + self.args_attrs.append(ArgumentAttributes(split[0], *name)) + elif line.strip().startswith('!'): + if line.count(self.COMMENT) >= 2: + self.args_attrs[-1].append_str(line.lstrip(self.COMMENT + ' ')) + #elif not check_for_line_to_ignore(line): + else: + self.comment_cache.append(line) + # self.args_attrs.append(line.lstrip('! ')) + # raise Exception + elif is_line_continued: + module = self.used[-1][0] + for item in line.split(','): + self.used.append((module, item.strip(':&\n '))) + + + def to_str(self): + routine_str = '' + indent=2 + # TODO: alter the doc depending on args + self.update_doc() + routine_str += self.doc.doc_to_str(indent=indent, module=True) + routine_str += self._args_to_str(indent=indent) + routine_str += self._imports_to_str(indent=indent+2) + routine_str += self._implicit_to_str(indent=indent+2) + routine_str += self._variables_to_str(indent=indent+2) + return routine_str + + def _args_to_str(self, indent=0): + args_str = '{}{}{}('.format(' ' * indent, + self.type_attrs or '', + self.type, + ) + arg_length = len(args_str) + total_length = 0 + for arg in self.args: + if arg_length + total_length + len(arg) + 2 > MAX_LINE_WIDTH: + args_str += '&\n{}'.format(' ' * arg_length) + total_length = 0 + args_str += '{}, '.format(arg) + total_length += len(arg) + 2 + + return '{}){}\n\n'.format(args_str[:-2], self.type_addon or '') + + def _imports_to_str(self, indent=0): + def format_use(use_item): + new_string = '{}use {}, {} {} {}'.format(' ' * indent, + use_item[0], + self.ONLY_STR, + ':', + use_item[1]) + return new_string, new_string.find(':') + 2 + if self.used: + used = sorted(self.used) + out_string, arg_length = format_use(used[0]) + total_length = 0 + for i_item, use_item in enumerate(used[1:], 1): + if use_item[0] == used[i_item-1][0]: + if arg_length + total_length + len(use_item[1]) + 2 > MAX_LINE_WIDTH: + out_string += ', &\n{}{}'.format(' ' * arg_length, use_item[1]) + total_length = len(use_item[1]) + else: + out_string += ', {}'.format(use_item[1]) + total_length += len(use_item[1]) + 2 + else: + out_string_addon, arg_length = format_use(use_item) + out_string += '\n' + out_string_addon + return '{}\n\n'.format(out_string) + else: + return '' + + def _variables_to_str(self, indent): + out_string = '' + for attr in self.args_attrs: + comment = '' + if attr.doc: + comment = ' {} {}'.format(self.COMMENT, attr.doc) + out_string += '{}{} {} {}{}\n'.format(' ' * indent, + ', '.join(attr.attrs), + ARG_DESCRIPTION_SPLITTER, + attr.name, + comment) + return out_string + '\n' + + def _implicit_to_str(self, indent): + if not self.implicit_none: + raise Exception('implicit none is not set in routine' + self.name) + return '{}{}\n\n'.format(' ' * indent, IMPLICIT_NONE_FLAG) + + def update_doc(self): + self.doc._name = self.name + for arg, arg_doc in zip(self.args, self.args_doc): + arg_attrs = self._get_args_attr(arg) + # set the doc it it was only in set in argument list + if not arg_attrs.doc and arg_doc: + arg_attrs.doc = arg_doc + if arg_attrs.intent_optional_key: + self.doc.param_dict.setdefault(arg_attrs.intent_optional_key, []).append(arg_attrs.doxygen_string) + + + def _get_args_attr(self, name): + for arg in self.args_attrs: + if arg.name == name: + return arg + raise KeyError('variable ' + name + ' was not found in the AttributeTable') + + +class ArgumentAttributes(object): + def __init__(self, attrs, name, docstring=''): + split = name.strip().split('(') + self.name = split[0].strip() + self.attrs = [] + self.intent_attr = '' + self.optional_attr = '' + self.dimension_attr = '' + + for i_attr, attr in enumerate(attrs.split(',')): + self.attrs.append(attr.strip().lower()) + if i_attr == 0: + self.type_attr = attr.strip(' ') + if attr.startswith('intent'): + self.intent_attr = attr.split('(')[1].strip(') ') + if attr.startswith('optional'): + self.optional_attr = attr.strip(' ') + if attr.startswith('dimension'): + self.dimension_attr = attr.strip(' ') + + if len(split) == 2: + attr_str = 'dimension(' + split[1] + self.attrs.append(attr_str) + self.dimension_attr = attr_str + self.doc = docstring.strip() or '' + + def append_str(self, to_append): + self.doc += to_append.strip() + + @property + def intent_optional_key(self): + keys = [] + keys += [self.intent_attr] + keys += [self.optional_attr] + return ''.join(keys) + + @property + def doxygen_string(self): + param_args = [arg for arg in [self.type_attr, self.dimension_attr] if arg] + return ('\\param[{}] "{} {} {}"'.format(self.intent_attr, + ', '.join(param_args), + ARG_DESCRIPTION_SPLITTER, + self.name), + self.doc) + """e.g. \param[in] "real(dp) :: parameterset(:)" 1D-array with parameters the model is run with""" + +class Modification(object): + def __init__(self, editor, date, note): + self.editor = editor.strip(', ') + self.date = date + self.note = note + + @property + def editor_length(self): + return len(self.editor) + +class TestFortranFile(object): + @pytest.fixture + def fortran_file(self): + return FortranFile() + + def test_check_for_file_doc(self, fortran_file): + lines = ['module example(&', 'MODULE EXAMPLE(&', 'module example(a, b, c)'] + for line in lines: + fortran_file._in_module = False + fortran_file._check_for_file_doc(line) + assert fortran_file._in_module + + def test_check_for_routine(self, fortran_file): + lines = ['function newDimAlias(aliases) result(newDimAlias)', + 'SUBROUTINE mpr_eval(parameterset)', + 'function majority_statistics(nClass, & ! number of classes', + ' elemental pure subroutine temporal_disagg_forcing(isday, &'] + for line in lines: + fortran_file._in_routine = False + fortran_file._check_for_routine(line) + assert fortran_file._in_routine + + def test_check_for_doc(self, fortran_file): + lines = [' !> \param[out] "real(dp), dimension(:) :: aet" actual ET [mm/s]', + '!> pervious areas is calculated as (omit \f$t\f$)', + ' !> \param[in] "integer(i4), :: processCase"'] + for line in lines: + fortran_file._in_doc = False + fortran_file._check_for_doc(line) + assert fortran_file._in_doc + + def test_check_for_code(self, fortran_file): + lines = [' runoff_sealed = 0.0_dp', + ' end do ! hh'] + for line in lines: + fortran_file._in_code = False + fortran_file._check_for_code(line) + assert fortran_file._in_code + + def test_check_for_code_end(self, fortran_file): + lines = ['END FUNCTION', + ' end subroutine dummy'] + for line in lines: + fortran_file._in_code = True + fortran_file._check_for_code_end(line) + assert not fortran_file._in_code + + +# SCRIPT +if __name__ == '__main__': + default_author = 'Robert Schweppe' + arg_path_in = '/Users/ottor/ownCloud/Home/local_libs/fortran/mpr_extract/src/mHM/' + arg_path_in = '/Users/ottor/ownCloud/Home/local_libs/fortran/mpr_extract/src/mHM/mo_mhm.f90' + arg_path_out = '/Users/ottor/temp/mpr_extract_test/' + path_in = pathlib.Path(arg_path_in) + + if path_in.is_file(): + path_list = [path_in.name] + path_in = path_in.parent + else: + path_list = get_all_subfiles(path_in) + + for path in path_list: + filereader = FortranFile(default_author) + filereader.read(pathlib.Path(path_in, path)) + filereader.write(pathlib.Path(arg_path_out, path)) \ No newline at end of file diff --git a/pre-proc/cut_mhm_input.py b/pre-proc/cut_mhm_input.py index d2e03392..08259411 100755 --- a/pre-proc/cut_mhm_input.py +++ b/pre-proc/cut_mhm_input.py @@ -36,7 +36,7 @@ def check_dir(dir): # default variables indir = '../test_basin/input/' outdir = './test_cut_mhm_input/' -lc_file = ['lc_1990.asc','lc_2000.asc','lc_2006.asc'] +lc_file = ['lc_1991.asc','lc_2000.asc','lc_2006.asc'] gauge_id = -9999. parser.add_argument('-g', '--gauge_id', action='store', dest='gauge_id', default=gauge_id, diff --git a/pre-proc/header.txt b/pre-proc/header.txt index cf152401..64dec6bb 100644 --- a/pre-proc/header.txt +++ b/pre-proc/header.txt @@ -1,6 +1,6 @@ -ncols 288 -nrows 432 -xllcorner 3973369 -yllcorner 2735847 -cellsize 500 -NODATA_value -9999 \ No newline at end of file +ncols 48 +nrows 58 +xllcorner 3451124.0 +yllcorner 5321772.5 +cellsize 1000 +NODATA_value -9999 \ No newline at end of file diff --git a/src/MPR/mo_mpr_constants.f90 b/src/MPR/mo_mpr_constants.f90 new file mode 100644 index 00000000..c2cee88b --- /dev/null +++ b/src/MPR/mo_mpr_constants.f90 @@ -0,0 +1,74 @@ +!> \file mo_mpr_constants.f90 + +!> \brief Provides MPR specific constants + +!> \details Provides MPR specific constants such as flood plain elevation. + +!> \author Matthias Cuntz +!> \date Nov 2011 + +MODULE mo_mpr_constants + + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PRIVATE + + ! hydrologic modeling + integer(i4), public, parameter :: nLCover_class = 3_i4 ! [-] Number of land cover class + integer(i4), public, parameter :: maxGeoUnit = 25_i4 ! maximum number of allowed geological classes + integer(i4), public, parameter :: maxNoSoilHorizons = 10_i4 ! maximum number of allowed soil layers + + ! default inital values for states and fluxes as well as parameter fields + real(dp), public, parameter :: P2_InitStateFluxes = 15.00_dp + real(dp), public, parameter :: P3_InitStateFluxes = 10.00_dp + real(dp), public, parameter :: P4_InitStateFluxes = 75.00_dp + real(dp), public, parameter :: P5_InitStateFluxes = 1500.00_dp + real(dp), public, parameter :: C1_InitStateSM = 0.25_dp + + ! soil paramterization (mo_mpr_soilmoist) + ! organic matter constant for calculation of mineral bulk density following RAWL + real(dp), public, parameter :: BulkDens_OrgMatter = 0.224_dp ! [g/cm3] from W.R. RAWLS + ! constants for determinination of the field capacity following Twarakavi + real(dp), public, parameter :: field_cap_c1 = -0.60_dp ! field capacity constant 1 + real(dp), public, parameter :: field_cap_c2 = 2.0_dp ! field capacity constant 2 + ! constants for determinination of the van Genuchten parameter n and sand treshold + real(dp), public, parameter :: vGenuchten_sandtresh = 66.5_dp ! van Genuchten snad treshold + real(dp), public, parameter :: vGenuchtenN_c1 = 1.392_dp ! constants for van Genuchten n + real(dp), public, parameter :: vGenuchtenN_c2 = 0.418_dp + real(dp), public, parameter :: vGenuchtenN_c3 = -0.024_dp + real(dp), public, parameter :: vGenuchtenN_c4 = 1.212_dp + real(dp), public, parameter :: vGenuchtenN_c5 = -0.704_dp + real(dp), public, parameter :: vGenuchtenN_c6 = -0.648_dp + real(dp), public, parameter :: vGenuchtenN_c7 = 0.023_dp + real(dp), public, parameter :: vGenuchtenN_c8 = 0.044_dp + real(dp), public, parameter :: vGenuchtenN_c9 = 3.168_dp + real(dp), public, parameter :: vGenuchtenN_c10 = -2.562_dp + real(dp), public, parameter :: vGenuchtenN_c11 = 7.0E-9_dp + real(dp), public, parameter :: vGenuchtenN_c12 = 4.004_dp + real(dp), public, parameter :: vGenuchtenN_c13 = 3.750_dp + real(dp), public, parameter :: vGenuchtenN_c14 = -0.016_dp + real(dp), public, parameter :: vGenuchtenN_c15 = -4.197_dp + real(dp), public, parameter :: vGenuchtenN_c16 = 0.013_dp + real(dp), public, parameter :: vGenuchtenN_c17 = 0.076_dp + real(dp), public, parameter :: vGenuchtenN_c18 = 0.276_dp + ! determinination Ks + real(dp), public, parameter :: Ks_c = 10.0_dp + ! permanent wiltung point (PWP) + real(dp), public, parameter :: PWP_c = 1.0_dp + real(dp), public, parameter :: PWP_matPot_ThetaR = 15000.0_dp ! [hPa] matrix potential of -1500 kPa, assumed as thetaR=0 + + !> assumed meteorol. measurement hight for estimation of aeroResist and surfResist + real(dp), public, parameter :: WindMeasHeight = 10.0_dp + !> von karman constant + real(dp), public, parameter :: karman = 0.41_dp + + !> LAI factor for bulk surface resistance formulation + real(dp), public, parameter :: LAI_factor_surfResi = 0.3_dp + !> LAI offset for bulk surface resistance formulation + real(dp), public, parameter :: LAI_offset_surfResi = 1.2_dp + !> maximum bulk surface resistance + real(dp), public, parameter :: max_surfResist = 250.0_dp + +END MODULE mo_mpr_constants diff --git a/src/MPR/mo_mpr_eval.f90 b/src/MPR/mo_mpr_eval.f90 new file mode 100644 index 00000000..db74a931 --- /dev/null +++ b/src/MPR/mo_mpr_eval.f90 @@ -0,0 +1,186 @@ +!> \file mo_mpr_eval.f90 + +!> \brief Runs MPR and writes to global effective parameters + +!> \details Runs MPR and writes to global effective parameters + +!> \authors Robert Schweppe +!> \date Feb 2018 + +MODULE mo_mpr_eval + + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: mpr_eval + + ! ------------------------------------------------------------------ + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! mpr_eval + + !> \brief Runs MPR and writes to global effective parameters + + !> \details Runs MPR and writes to global effective parameters + + ! INTENT(IN) + !> \param[in] "real(dp), dimension(:) :: parameterset" + !> a set of global parameter (gamma) to run mHM, DIMENSION [no. of global_Parameters] + + ! INTENT(INOUT) + ! None + + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + !> \param[out] "real(dp), dimension(:,:), optional :: runoff" + !> returns runoff time series, DIMENSION [nTimeSteps, nGaugesTotal] + !> \param[out] "real(dp), dimension(:,:), optional :: sm_opti" + !> returns soil moisture time series for all grid cells (of multiple basins concatenated), + !> DIMENSION [nCells, nTimeSteps] + !> \param[out] "real(dp), dimension(:,:), optional :: basin_avg_tws" + !> returns basin averaged total water storage time series, DIMENSION [nTimeSteps, nBasins] + !> \param[out] "real(dp), dimension(:,:), optional :: neutron_opti" + !> returns neuton counts time series for all grid cells (of multiple basins concatenated), + !> DIMENSION [nCells, nTimeSteps] + !> \param[out] "real(dp), dimension(:,:), optional :: et_opti" + !> returns evapotranspiration time series for all grid cells (of multiple basins concatenated), + !> DIMENSION [nCells, nTimeSteps] + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Juliane Mai, Rohini Kumar + !> \date Feb 2013 + ! Modified, R. Kumar, Jun 2013 - restart_flag_states_read is passed to mhm call + ! for the soil moisture initalisation + ! R. Kumar, Jun 2013 - frac_sealed_city_area is added + ! R. Kumar & S. Thober, Aug 2013 - code change to incorporate output timestep + ! during writing of the netcdf file + ! R. Kumar, Aug 2013 - added iFlag_LAI_data_format to handle LAI options, + ! and changed within the code made accordingly + ! R. Kumar, J. Mai, Sep 2013 - Splitting allocation and initialization of arrays + ! R. Kumar Nov 2013 - update intent variables in documentation + ! L. Samaniego, Nov 2013 - relational statements == to .eq., etc. + ! M. Zink, Feb 2014 - added PET calculation: Hargreaves-Samani (Process 5) + ! M. Zink, Mar 2014 - added inflow from upstream areas + ! Stephan Thober, Jun 2014 - added chunk read for meteorological input + ! Stephan Thober, Jun 2014 - updated flag for read_restart + ! M. Cuntz & J. Mai, Nov 2014 - LAI input from daily, monthly or yearly files + ! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells + ! Stephan Thober, Aug 2015 - moved writing of daily discharge to mo_write_routing, + ! included routing related variables from mRM + ! David Schaefer, Aug 2015 - changed to new netcdf-writing scheme + ! Stephan Thober, Sep 2015 - updated mrm_routing call + ! O. Rakovec, R. Kumar, Oct 2015 - added optional output for basin averaged TWS + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + ! Stephan Thober, Nov 2016 - added two options for routing + ! Rohini Kuamr, Dec 2016 - option to handle monthly mean gridded fields of LAI + ! Stephan Thober, Jan 2017 - added prescribed weights for tavg and pet + ! Zink M. Demirel C., Mar 2017 - Added Jarvis soil water stress function at SM process(3) + ! Robert Schweppe, Dec 2017 - extracted call to mpr from inside mhm + + + SUBROUTINE mpr_eval(parameterset) + use mo_string_utils, only : num2str + use mo_message, only : message + use mo_multi_param_reg, only : mpr + use mo_mpr_global_variables, only : & + L0_soilId, L0_slope_emp, & + L0_asp, L0_geoUnit, & + L0_gridded_LAI, & + L1_fSealed, L1_alpha, L1_degDayInc, & + L1_degDayMax, & + L1_degDayNoPre, L1_fAsp, L1_petLAIcorFactor, L1_HarSamCoeff, & + L1_PrieTayAlpha, L1_aeroResist, L1_surfResist, & + L1_fRoots, L1_maxInter, L1_karstLoss, L1_kfastFlow, & + L1_kSlowFlow, L1_kBaseFlow, L1_kPerco, & + L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp, & + L1_jarvis_thresh_c1, & + L1_tempThresh, L1_unsatThresh, L1_sealedThresh, & + L1_wiltingPoint + use mo_common_variables, only : & + L0_LCover, & + nBasins, & + l0_l1_remap, & + level0, L0_Basin, & + level1 + use mo_timer, only : timer_get, timer_start, timer_stop, timer_clear + + real(dp), dimension(:), intent(in), optional :: parameterset + ! counters and indexes + integer(i4) :: iBasin, itimer ! Counters + integer(i4) :: s0, e0 ! start and end index at level 0 for current basin + integer(i4) :: s1, e1 ! start and end index at level 1 for current basin + + !------------------------------------------------------------------- + ! NOW call MPR + !------------------------------------------------------------------- + call message(' Executing MPR ...') + itimer = 10 + call timer_start(itimer) + + !---------------------------------------- + ! loop over basins + !---------------------------------------- + do iBasin = 1, nBasins + + ! get basin information + s0 = level0(L0_Basin(iBasin))%iStart + e0 = level0(L0_Basin(iBasin))%iEnd + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + call mpr(level0(L0_Basin(iBasin))%mask, L0_geoUnit(s0 : e0), & + L0_soilId(s0 : e0, :), L0_asp(s0 : e0), L0_gridded_LAI(s0 : e0, :), & + L0_LCover(s0 : e0, :), L0_slope_emp(s0 : e0), & + pack(level0(L0_Basin(iBasin))%y, level0(L0_Basin(iBasin))%mask), & + level0(L0_Basin(iBasin))%Id, & + l0_l1_remap(iBasin)%upper_bound, l0_l1_remap(iBasin)%lower_bound, & + l0_l1_remap(iBasin)%left_bound, l0_l1_remap(iBasin)%right_bound, & + l0_l1_remap(iBasin)%n_subcells, & + L1_fSealed(s1 : e1, :, :), & + L1_alpha(s1 : e1, :, :), L1_degDayInc(s1 : e1, :, :), L1_degDayMax(s1 : e1, :, :), & + L1_degDayNoPre(s1 : e1, :, :), L1_fAsp(s1 : e1, :, :), L1_HarSamCoeff(s1 : e1, :, :), & + L1_PrieTayAlpha(s1 : e1, :, :), L1_aeroResist(s1 : e1, :, :), L1_surfResist(s1 : e1, :, :), & + L1_fRoots(s1 : e1, :, :), L1_kFastFlow(s1 : e1, :, :), & + L1_kSlowFlow(s1 : e1, :, :), L1_kBaseFlow(s1 : e1, :, :), L1_kPerco(s1 : e1, :, :), & + L1_karstLoss(s1 : e1, :, :), L1_soilMoistFC(s1 : e1, :, :), L1_soilMoistSat(s1 : e1, :, :), & + L1_soilMoistExp(s1 : e1, :, :), L1_jarvis_thresh_c1(s1 : e1, :, :), & + L1_tempThresh(s1 : e1, :, :), L1_unsatThresh(s1 : e1, :, :), L1_sealedThresh(s1 : e1, :, :), & + L1_wiltingPoint(s1 : e1, :, :), L1_maxInter(s1 : e1, :, :), L1_petLAIcorFactor(s1 : e1, :, :), & + parameterset) + + end do + call timer_stop(itimer) + call message(' in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.') + call timer_clear(itimer) + + END SUBROUTINE mpr_eval + +END MODULE mo_mpr_eval \ No newline at end of file diff --git a/src/MPR/mo_mpr_file.f90 b/src/MPR/mo_mpr_file.f90 new file mode 100644 index 00000000..ee85cc32 --- /dev/null +++ b/src/MPR/mo_mpr_file.f90 @@ -0,0 +1,76 @@ +!> \file mo_mpr_file.f90 + +!> \brief Provides file names and units for mRM + +!> \details Provides all filenames as well as all units used for the multiscale Routing Model mRM. + +!> \author Matthias Cuntz, Stephan Thober +!> \date Aug 2015 + +MODULE mo_mpr_file + + IMPLICIT NONE + + !> Current mHM model version + CHARACTER(len = *), PARAMETER :: version = '0.1' ! Version + !> Time of current mHM model version release + CHARACTER(len = *), PARAMETER :: version_date = 'Dec 2017' ! Release date + !> Driver file + CHARACTER(len = *), PARAMETER :: file_main = 'mpr_driver.f90' ! Driver + !> Namelist file name + CHARACTER(len = *), PARAMETER :: file_namelist_mpr = 'mpr.nml' ! Namelist + !> Unit for namelist + INTEGER, PARAMETER :: unamelist_mpr = 80 ! set different from mhm + !> Parameter namelists file name + CHARACTER(len = *), PARAMETER :: file_namelist_mpr_param = 'mpr_parameter.nml' ! Parameter namelists + !> Unit for namelist + INTEGER, PARAMETER :: unamelist_mpr_param = 31 ! + + + !> Soil database file (iFlag_soilDB = 0) = classical mHM format + CHARACTER(len = *), PARAMETER :: file_soil_database = 'soil_classdefinition.txt' ! Soil data base + !>> Soil database file (iFlag_soilDB = 1) + CHARACTER(len = *), PARAMETER :: file_soil_database_1 = 'soil_classdefinition_iFlag_soilDB_1.txt' + !> Unit for soil data base + INTEGER, PARAMETER :: usoil_database = 52 ! + !> slope input data file + CHARACTER(len = *), PARAMETER :: file_slope = 'slope.asc' ! slope + !> Unit for slope input data file + INTEGER, PARAMETER :: uslope = 54 ! + !> aspect input data file + CHARACTER(len = *), PARAMETER :: file_aspect = 'aspect.asc' ! aspect + !> Unit for aspect input data file + INTEGER, PARAMETER :: uaspect = 55 ! + !> hydrogeological classes input data file + CHARACTER(len = *), PARAMETER :: file_hydrogeoclass = 'geology_class.asc' ! hydrogeological classes + !> Unit for hydrogeological classes input data file + INTEGER, PARAMETER :: uhydrogeoclass = 58 ! + !> soil classes input data file + CHARACTER(len = *), PARAMETER :: file_soilclass = 'soil_class.asc' ! soil classes + !> Unit for soil classes input data file + INTEGER, PARAMETER :: usoilclass = 59 ! + !> LAI classes input data file + CHARACTER(len = *), PARAMETER :: file_laiclass = 'LAI_class.asc' ! LAI classes + !> Unit for LAI input data file + INTEGER, PARAMETER :: ulaiclass = 60 ! + + !> geological formation lookup table file + CHARACTER(len = *), PARAMETER :: file_geolut = 'geology_classdefinition.txt' ! geolog. formation lookup table + !> Unit for geological formation lookup table file + INTEGER, PARAMETER :: ugeolut = 64 ! + + !> LAI classes lookup table file + CHARACTER(len = *), PARAMETER :: file_lailut = 'LAI_classdefinition.txt' ! LAI classes lookup table + !> Unit for LAI classes lookup table file + INTEGER, PARAMETER :: ulailut = 65 ! + + !> Input nCols and nRows of binary meteo and LAI files are in header file + CHARACTER(len = *), PARAMETER :: file_meteo_header = 'header.txt' ! Meteo and LAI header + !> Unit for meteo header file + INTEGER, PARAMETER :: umeteo_header = 50 ! + !> File ending of meteo files + CHARACTER(len = *), PARAMETER :: file_meteo_binary_end = '.bin' ! Meteo and LAI + !> Unit for meteo files + INTEGER, PARAMETER :: umeteo = 51 ! + +END MODULE mo_mpr_file diff --git a/src/MPR/mo_mpr_global_variables.f90 b/src/MPR/mo_mpr_global_variables.f90 new file mode 100644 index 00000000..97a16c39 --- /dev/null +++ b/src/MPR/mo_mpr_global_variables.f90 @@ -0,0 +1,156 @@ +!> \file mo_mpr_global_variables.f90 + +!> \brief Global variables for mpr only + +!> \details + +!> \authors Robert Schweppe +!> \date Dec 2017 + +module mo_mpr_global_variables + + use mo_kind, only : i4, dp + use mo_common_variables, only : period + + implicit none + + private + + real(dp), public :: c2TSTu ! Unit transformation = timeStep/24 + ! ------------------------------------------------------------------ + ! SOIL DATA + ! ------------------------------------------------------------------ + real(dp), public :: tillageDepth ! [mm] Soil depth down to which organic + ! matter is possible + integer(i4), public :: nSoilTypes ! Number of soil types + integer(i4), public :: iFlag_soilDB ! options to handle different soil databases + integer(i4), public :: nSoilHorizons_mHM ! Number of horizons to model + real(dp), dimension(:), allocatable, public :: HorizonDepth_mHM ! [mm] Horizon depth from surface, + ! positive downwards + + type soilType + ! dim1 = nSoilType (e.g. i=1..72 for BUEK) + ! dim2 = the maximum of nHorizons + ! dim3 = land cover classes + ! input data + integer(i4), dimension(:), allocatable :: id ! Soil Id + integer(i4), dimension(:), allocatable :: nHorizons ! Number of horizons + integer(i4), dimension(:), allocatable :: is_present ! Wether this soil type is present in + ! ! this basin or not + real(dp), dimension(:, :), allocatable :: UD ! [mm] Upper Bound of depth + real(dp), dimension(:, :), allocatable :: LD ! [mm] Lower Bound of depth + real(dp), dimension(:, :), allocatable :: clay ! [%] Clay content + real(dp), dimension(:, :), allocatable :: sand ! [%] Sand content + real(dp), dimension(:, :), allocatable :: DbM ! [g/cm2] Mineral Bulk density + real(dp), dimension(:, :), allocatable :: depth ! [mm] Depth of the soil Horizon + real(dp), dimension(:), allocatable :: RZdepth ! [mm] Total soil depth + real(dp), dimension(:, :, :), allocatable :: Wd ! [1] Weights of mHM Horizons according to + ! ! horizons provided in soil database + integer(i4), dimension(:), allocatable :: nTillHorizons ! [1] Number of tillage horizons + + ! derived soil hydraulic properties + real(dp), dimension(:, :, :), allocatable :: thetaS_Till ! [1] Saturated water content of soil horizons + ! ! tillage depth - f(OM, management) + real(dp), dimension(:, :), allocatable :: thetaS ! [1] Saturated water content of soil horizons + ! ! after tillage depth + real(dp), dimension(:, :, :), allocatable :: Db ! [g/cm2] Bulk density, LUC dependent + ! ! = f( OM, management) + real(dp), dimension(:, :, :), allocatable :: thetaFC_Till ! [1] Field capacity of tillage layers; + ! ! LUC dependent - f(OM, management) + real(dp), dimension(:, :), allocatable :: thetaFC ! [1] Field capacity of deeper layers + real(dp), dimension(:, :, :), allocatable :: thetaPW_Till ! [1] Permament wilting point of tillage layers; + ! ! LUC dependent - f(OM, management) + real(dp), dimension(:, :), allocatable :: thetaPW ! [1] Permanent wilting point of deeper layers + real(dp), dimension(:, :, :), allocatable :: Ks ! [cm/d] Saturated hydaulic conductivity + end type soilType + type(soilType), public :: soilDB ! The soil database + + ! ----------------------------------------------------------------- + ! GEOLOGICAL FORMATION data + ! ----------------------------------------------------------------- + integer(i4), public :: nGeoUnits ! Number of geological formations + integer(i4), dimension(:), allocatable, public :: GeoUnitList ! List of ids of each geological formations + integer(i4), dimension(:), allocatable, public :: GeoUnitKar ! Id of Karstic formation (0 == does not exist) + + ! ----------------------------------------------------------------- + ! Land cover, LAI LUT data + ! ----------------------------------------------------------------- + character(256), public :: inputFormat_gridded_LAI ! format of gridded LAI data(bin or nc) + integer(i4), public :: timeStep_LAI_input ! time step of gridded LAI input + ! LAI data + ! variables used when timeStep_LAI_input == 0 + integer(i4), public :: nLAIclass ! Number of LAI classes + integer(i4), public :: nLAI ! Number of LAI slices (a.k.a timestep) + integer(i4), public, dimension(:), allocatable :: LAIUnitList ! List of ids of each LAI class in LAILUT + real(dp), public, dimension(:, :), allocatable :: LAILUT ! [m2/m2] Leaf area index for LAIUnit + ! ! dim1=land cover class, dim2=month of year + type(period), dimension(:), allocatable, public :: LAIPer ! time period for LAI_readin + real(dp), public :: fracSealed_cityArea ! fraction of area within city assumed to be + ! ! perfectly sealed [0-1] + + ! ------------------------------------------------------------------- + ! L0 DOMAIN description -> + ! ------------------------------------------------------------------- + ! mHM derived variables + ! dim1 = number grid cells L0 + real(dp), public, dimension(:), allocatable :: L0_slope_emp ! Empirical quantiles of slope + ! + real(dp), public, dimension(:, :), allocatable :: L0_gridded_LAI ! gridded LAI data used when timeStep_LAI_input<0 or==1 + ! ! dim1=number of gridcells, dim2=number LAI timesteps + + real(dp), public, dimension(:), allocatable :: L0_slope ! [%] Slope + real(dp), public, dimension(:), allocatable :: L0_asp ! [degree] Aspect degree + ! [dim1=number grid cells, dim2=Number of soil horizons] note: for iFlag_soilDB=0, dim2=1 + integer(i4), public, dimension(:, :), allocatable :: L0_soilId ! soil id (iFlag_soilDB = 0) + integer(i4), public, dimension(:), allocatable :: L0_geoUnit ! Geologic formation (unit) + + ! ------------------------------------------------------------------ + ! DIRECTORIES + ! ------------------------------------------------------------------ + ! has the dimension of nBasins + character(256), dimension(:), allocatable, public :: dirgridded_LAI ! Directory where gridded LAI is located + ! used when timeStep_LAI_input < 0 + + ! Effective parameters + ! dim1 = number grid cells L1 + ! dim2 = number model soil horizons or YearMonths or other auxiliary dimension + ! dim3 = number of LCscenes + real(dp), public, dimension(:, :, :), allocatable :: L1_fSealed ! [1] Fraction of sealed area (nCells, nLCscenes) + + real(dp), public, dimension(:, :, :), allocatable :: L1_alpha ! [1] Exponent for the upper reservoir + real(dp), public, dimension(:, :, :), allocatable :: L1_degDayInc ! [d-1 degC-1] Increase of the Degree-day factor + ! ! per mm of increase in precipitation + real(dp), public, dimension(:, :, :), allocatable :: L1_degDayMax ! [mm-1 degC-1] Maximum Degree-day factor + real(dp), public, dimension(:, :, :), allocatable :: L1_degDayNoPre ! [mm-1 degC-1] Degree-day factor with no + ! precipitation. + real(dp), public, dimension(:, :, :), allocatable :: L1_degDay ! [mm d-1degC-1] Degree-day factor. + real(dp), public, dimension(:, :, :), allocatable :: L1_karstLoss ! [1] Karstic percolation loss + real(dp), public, dimension(:, :, :), allocatable :: L1_fAsp ! [1] PET correction for aspect + real(dp), public, dimension(:, :, :), allocatable :: L1_petLAIcorFactor ! [-] PET correction based on LAI (KC by GEUS.dk) + + real(dp), public, dimension(:, :, :), allocatable :: L1_HarSamCoeff ! [1] Hargreaves Samani coeffiecient + real(dp), public, dimension(:, :, :), allocatable :: L1_PrieTayAlpha ! [1] Priestley Taylor coeffiecient + real(dp), public, dimension(:, :, :), allocatable :: L1_aeroResist ! [s m-1] aerodynamical resitance + real(dp), public, dimension(:, :, :), allocatable :: L1_surfResist ! [s m-1] bulk surface resitance + real(dp), public, dimension(:, :, :), allocatable :: L1_fRoots ! [1] Fraction of roots in soil horizons + real(dp), public, dimension(:, :, :), allocatable :: L1_maxInter ! [mm] Maximum interception + + real(dp), public, dimension(:, :, :), allocatable :: L1_kfastFlow ! [d-1] Fast interflow recession coefficient + real(dp), public, dimension(:, :, :), allocatable :: L1_kSlowFlow ! [d-1] Slow interflow recession coefficient + real(dp), public, dimension(:, :, :), allocatable :: L1_kBaseFlow ! [d-1] Baseflow recession coefficient + real(dp), public, dimension(:, :, :), allocatable :: L1_kPerco ! [d-1] percolation coefficient + real(dp), public, dimension(:, :, :), allocatable :: L1_soilMoistFC ! [mm] Soil moisture below which actual ET + ! ! is reduced linearly till PWP + real(dp), public, dimension(:, :, :), allocatable :: L1_soilMoistSat ! [mm] Saturation soil moisture for each horizon [mm] + real(dp), public, dimension(:, :, :), allocatable :: L1_soilMoistExp ! [1] Exponential parameter to how non-linear + ! ! is the soil water retention + real(dp), public, dimension(:, :, :), allocatable :: L1_jarvis_thresh_c1 ![1] jarvis critical value for normalized soil + ! ! water content + real(dp), public, dimension(:, :, :), allocatable :: L1_tempThresh ! [degC] Threshold temperature for snow/rain + real(dp), public, dimension(:, :, :), allocatable :: L1_unsatThresh ! [mm] Threshold waterdepth controlling fast interflow + real(dp), public, dimension(:, :, :), allocatable :: L1_sealedThresh ! [mm] Threshold waterdepth for surface runoff + ! ! in sealed surfaces + real(dp), public, dimension(:, :, :), allocatable :: L1_wiltingPoint ! [mm] Permanent wilting point: below which neither + ! ! plant can take water nor water can drain in + +end module mo_mpr_global_variables diff --git a/src/mHM/mo_mpr_pet.f90 b/src/MPR/mo_mpr_pet.f90 similarity index 52% rename from src/mHM/mo_mpr_pet.f90 rename to src/MPR/mo_mpr_pet.f90 index ac10a9ec..e639b735 100644 --- a/src/mHM/mo_mpr_pet.f90 +++ b/src/MPR/mo_mpr_pet.f90 @@ -9,7 +9,7 @@ module mo_mpr_pet - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none @@ -23,8 +23,8 @@ module mo_mpr_pet contains - -! ---------------------------------------------------------------------------- + + ! ---------------------------------------------------------------------------- ! NAME ! pet_correctbyLAI @@ -40,7 +40,7 @@ module mo_mpr_pet !> - param(3) = PET_a_pervious \n !> - param(4) = PET_b \n !> - param(5) = PET_c \n - + !> Example DSF=PET_a+PET_b*(1-exp(PET_c*LAI)) !> Similar to the crop coefficient concept Kc=a+b*(1-exp(c*LAI)) by Allen, R. G., L. S. Pereira, @@ -99,88 +99,89 @@ module mo_mpr_pet ! calling sequence ! call pet_correctbyLAI(param,nodata,LCOVER0,LAI0,mask0,cell_id0,upp_row_L1,low_row_L1, & ! lef_col_L1,rig_col_L1,nL0_in_L1,L1_petLAIcorFactor) - + ! HISTORY !> \author M. Cuneyd Demirel and Simon Stisen from GEUS.dk !> \date May. 2017 - subroutine pet_correctbyLAI( & - ! Input ----------------------------------------------------------------- - param , & ! global parameters, three are required - nodata , & ! no data value - LCOVER0 , & ! land use cover at L0 - LAI0 , & ! LAI at L0 - mask0 , & ! mask at L0 - cell_id0 , & ! cell ids at L0 - upp_row_L1 , & ! upper row of L0 block within L1 cell - low_row_L1 , & ! lower row of L0 block within L1 cell - lef_col_L1 , & ! left column of L0 block within L1 cell - rig_col_L1 , & ! right column of L0 block within L1 cell - nL0_in_L1 , & ! Number of L0 cells in L0 block within L1 cell - ! Output ---------------------------------------------------------------- - L1_petLAIcorFactor ) ! fraction of roots in soil horizons - - use mo_upscaling_operators, only: upscale_harmonic_mean + subroutine pet_correctbyLAI(& + ! Input ----------------------------------------------------------------- + param, & ! global parameters, three are required + nodata, & ! no data value + LCOVER0, & ! land use cover at L0 + LAI0, & ! LAI at L0 + mask0, & ! mask at L0 + cell_id0, & ! cell ids at L0 + upp_row_L1, & ! upper row of L0 block within L1 cell + low_row_L1, & ! lower row of L0 block within L1 cell + lef_col_L1, & ! left column of L0 block within L1 cell + rig_col_L1, & ! right column of L0 block within L1 cell + nL0_in_L1, & ! Number of L0 cells in L0 block within L1 cell + ! Output ---------------------------------------------------------------- + L1_petLAIcorFactor) ! pet cor factor at level-1 + + use mo_upscaling_operators, only : upscale_harmonic_mean !$ use omp_lib implicit none ! Input - real(dp), dimension(5), intent(in) :: param ! parameters - real(dp), intent(in) :: nodata ! no data value - integer(i4), dimension(:), intent(in) :: LCOVER0 ! Land cover at level 0 - real(dp), dimension(:), intent(in) :: LAI0 ! LAI at level-0 - + real(dp), dimension(5), intent(in) :: param ! parameters + real(dp), intent(in) :: nodata ! no data value + integer(i4), dimension(:), intent(in) :: LCOVER0 ! Land cover at level 0 + real(dp), dimension(:, :), intent(in) :: LAI0 ! LAI at level-0 + ! Ids of L0 cells beneath L1 cell - logical, dimension(:,:), intent(in) :: mask0 - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block - integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block - integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block - integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cel + logical, dimension(:, :), intent(in) :: mask0 + integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block + integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block + integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block + integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block + integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cel ! Output - ! The following five variables have the dimension: Number of cells at L1 times nHorizons_mHM - real(dp), dimension(:), intent(inout) :: L1_petLAIcorFactor ! pet cor factor at level-1 + real(dp), dimension(:, :), intent(inout) :: L1_petLAIcorFactor ! pet cor factor at level-1 ! Local Variables - real(dp), dimension(size(LCOVER0,1)) :: petLAIcorFactor_0 ! pet cor factor at level-0 + real(dp), dimension(size(LCOVER0, 1), size(LAI0, 2)) :: petLAIcorFactor_0 ! pet cor factor at level-0 ! local variables - integer(i4) :: kk ! loop index - integer(i4) :: LL ! loop index - + integer(i4) :: kk, tt ! loop index + integer(i4) :: LL ! loop index + ! ------------------------------------------------------------------ ! Estimate DSF=PET_a+PET_b*(1-exp(PET_c*LAI)) to correct PET as PET=DSF*PET ! ------------------------------------------------------------------ !$OMP PARALLEL !$OMP DO PRIVATE( LL ) SCHEDULE( STATIC ) - - ! need to be done for every landcover to get DSF + + ! need to be done for every landcover to get DSF do kk = 1, size(LCOVER0, 1) - LL = LCOVER0(kk) - - select case(LL) - case(1) ! forest - petLAIcorFactor_0(kk) = param(1)+(param(4)*(1.0_dp-exp(param(5)*LAI0(kk)))) - case(2) ! impervious - petLAIcorFactor_0(kk) = param(2)+(param(4)*(1.0_dp-exp(param(5)*LAI0(kk)))) - case(3) ! permeable - petLAIcorFactor_0(kk) = param(3)+(param(4)*(1.0_dp-exp(param(5)*LAI0(kk)))) - end select + LL = LCOVER0(kk) + + ! TODO: memory order of arrays is not optimal, how to improve? + select case(LL) + case(1) ! forest + petLAIcorFactor_0(kk, :) = param(1) + (param(4) * (1.0_dp - exp(param(5) * LAI0(kk, :)))) + case(2) ! impervious + petLAIcorFactor_0(kk, :) = param(2) + (param(4) * (1.0_dp - exp(param(5) * LAI0(kk, :)))) + case(3) ! permeable + petLAIcorFactor_0(kk, :) = param(3) + (param(4) * (1.0_dp - exp(param(5) * LAI0(kk, :)))) + end select end do - !$OMP END DO - - L1_petLAIcorFactor(:) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, petLAIcorFactor_0 ) - !$OMP END PARALLEL + do tt = 1, size(LAI0, 2) + L1_petLAIcorFactor(:, tt) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, petLAIcorFactor_0(:, tt)) + end do + + end subroutine pet_correctbyLAI ! ---------------------------------------------------------------------------- @@ -205,7 +206,7 @@ end subroutine pet_correctbyLAI ! INTENT(INOUT) ! None - + ! INTENT(OUT) !> \param[out] "real(dp) :: fAsp0(:,:)" - [1] PET correction factor for aspect @@ -250,54 +251,54 @@ end subroutine pet_correctbyLAI ! Luis Samaniego, Sep 2015 - PET correction on the southern hemisphere ! Matthias Zink, Jun 2017 - renamed and moved from mo_multi_scale_param_reg.f90 to mo_mpr_pet.f90 - subroutine pet_correctbyASP( Id0, latitude_l0, Asp0, param, nodata, fAsp0 ) + subroutine pet_correctbyASP(Id0, latitude_l0, Asp0, param, nodata, fAsp0) !$ use omp_lib - + implicit none ! Input integer(i4), dimension(:), intent(in) :: id0 ! Level 0 cell id - real(dp), dimension(:), intent(in) :: latitude_l0 ! latitude on l0 - real(dp), intent(in) :: nodata ! no data value - real(dp), dimension(3), intent(in) :: param ! process parameters - real(dp), dimension(:), intent(in) :: Asp0 ! [degree] Aspect at Level 0 + real(dp), dimension(:), intent(in) :: latitude_l0 ! latitude on l0 + real(dp), intent(in) :: nodata ! no data value + real(dp), dimension(3), intent(in) :: param ! process parameters + real(dp), dimension(:), intent(in) :: Asp0 ! [degree] Aspect at Level 0 ! Output - real(dp), dimension(:), intent(out):: fAsp0 ! PET correction for Aspect + real(dp), dimension(:), intent(out) :: fAsp0 ! PET correction for Aspect ! local real(dp), dimension(size(id0, 1)) :: fAsp0S ! PET correction for Aspect, south - logical, dimension(size(id0, 1)) :: mask_north_hemisphere_l0 - - real(dp) :: tmp_maxCorrectionFactorPET + logical, dimension(size(id0, 1)) :: mask_north_hemisphere_l0 + + real(dp) :: tmp_maxCorrectionFactorPET + + mask_north_hemisphere_l0 = merge(.TRUE., .FALSE., latitude_l0 .gt. 0.0_dp) - mask_north_hemisphere_l0 = merge(.TRUE.,.FALSE., latitude_l0 .gt. 0.0_dp) - tmp_maxCorrectionFactorPET = param(1) + param(2) ! for cells on the northern hemisphere !$OMP PARALLEL - fAsp0 = merge( & - param(1) + ( tmp_maxCorrectionFactorPET - param(1)) / param(3) * asp0, & - param(1) + ( tmp_maxCorrectionFactorPET - param(1) ) / (360._dp - param(3)) * (360._dp - Asp0), & - ! ( asp0 < param(3) ) .and. mask_north_hemisphere_l0 ) - asp0 < param(3) ) - fAsp0 = merge( fAsp0, nodata, Id0 /= int(nodata, i4) ) + fAsp0 = merge(& + param(1) + (tmp_maxCorrectionFactorPET - param(1)) / param(3) * asp0, & + param(1) + (tmp_maxCorrectionFactorPET - param(1)) / (360._dp - param(3)) * (360._dp - Asp0), & + ! ( asp0 < param(3) ) .and. mask_north_hemisphere_l0 ) + asp0 < param(3)) + fAsp0 = merge(fAsp0, nodata, Id0 /= int(nodata, i4)) !$OMP END PARALLEL ! for cells on the southern hemisphere !$OMP PARALLEL - fAsp0S = merge( & - param(1) + ( tmp_maxCorrectionFactorPET - param(1) ) / (360._dp - param(3)) * (360._dp - Asp0), & - param(1) + ( tmp_maxCorrectionFactorPET - param(1)) / param(3) * asp0, & - asp0 < param(3) ) - fAsp0S = merge( fAsp0S, nodata, Id0 /= int(nodata, i4) ) + fAsp0S = merge(& + param(1) + (tmp_maxCorrectionFactorPET - param(1)) / (360._dp - param(3)) * (360._dp - Asp0), & + param(1) + (tmp_maxCorrectionFactorPET - param(1)) / param(3) * asp0, & + asp0 < param(3)) + fAsp0S = merge(fAsp0S, nodata, Id0 /= int(nodata, i4)) !$OMP END PARALLEL !$OMP PARALLEL - fAsp0 = merge( fAsp0, fAsp0S, mask_north_hemisphere_l0 ) + fAsp0 = merge(fAsp0, fAsp0S, mask_north_hemisphere_l0) !$OMP END PARALLEL end subroutine pet_correctbyASP @@ -360,66 +361,51 @@ end subroutine pet_correctbyASP !> \date Apr 2013 ! Modified Matthias Zink, Jun 2017 - moved from mo_multi_scale_param_reg.f90 to mo_mpr_pet.f90 - subroutine priestley_taylor_alpha( & - LCover_LAI0, & ! land cover id for LAI at level 0 - LAILUT, & ! look up table for LAI - LAIUnitList, & ! List of ids of each LAI class in LAILUT - param, & ! parameter values (size=2) - mask0, & ! mask at level 0 - nodata, & ! given nodata value - cell_id0, & ! cell id at Level 0 - nL0_in_L1, & ! number of l0 cells within a l1 cell - Upp_row_L1, & ! upper row of a l1 cell in l0 grid - Low_row_L1, & ! lower row of a l1 cell in l0 grid - Lef_col_L1, & ! left col of a l1 cell in l0 grid - Rig_col_L1, & ! right col of a l1 cell in l0 grid - priestley_taylor_alpha1 & ! bulk surface resistance - ) - - use mo_upscaling_operators, only: upscale_arithmetic_mean - use mo_mhm_constants, only: YearMonths_i4 - use mo_constants, only: eps_dp + subroutine priestley_taylor_alpha(& + LAI0, & ! LAI at level-0 + param, & ! parameter values (size=2) + mask0, & ! mask at level 0 + nodata, & ! given nodata value + cell_id0, & ! cell id at Level 0 + nL0_in_L1, & ! number of l0 cells within a l1 cell + Upp_row_L1, & ! upper row of a l1 cell in l0 grid + Low_row_L1, & ! lower row of a l1 cell in l0 grid + Lef_col_L1, & ! left col of a l1 cell in l0 grid + Rig_col_L1, & ! right col of a l1 cell in l0 grid + priestley_taylor_alpha1 & ! bulk surface resistance + ) + + use mo_upscaling_operators, only : upscale_arithmetic_mean implicit none - integer(i4), dimension(:), intent(in) :: LCover_LAI0 ! land cover id for LAI - real(dp), dimension(:,:), intent(in) :: LAILUT ! look up table for LAI - ! ! dim1=land cover class, dim2=month of year - integer(i4), dimension(:), intent(in) :: LAIUnitList ! List of ids of each LAI class in LAILUT - real(dp), dimension(:), intent(in) :: param ! input parameter - logical, dimension(:,:), intent(in) :: mask0 ! mask at level 0 - real(dp), intent(in) :: nodata ! given nodata value - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! number of l0 cells within a l1 cell - integer(i4), dimension(:), intent(in) :: Upp_row_L1 ! upper row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Low_row_L1 ! lower row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Lef_col_L1 ! left col of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Rig_col_L1 ! right col of a l1 cell in l0 grid + real(dp), dimension(:, :), intent(in) :: LAI0 ! LAI at level-0 + real(dp), dimension(:), intent(in) :: param ! input parameter + logical, dimension(:, :), intent(in) :: mask0 ! mask at level 0 + real(dp), intent(in) :: nodata ! given nodata value + integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! number of l0 cells within a l1 cell + integer(i4), dimension(:), intent(in) :: Upp_row_L1 ! upper row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: Low_row_L1 ! lower row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: Lef_col_L1 ! left col of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: Rig_col_L1 ! right col of a l1 cell in l0 grid ! Output - real(dp), dimension(:,:), intent(out) :: priestley_taylor_alpha1 + real(dp), dimension(:, :), intent(out) :: priestley_taylor_alpha1 ! local - integer(i4) :: iMon, ll - real(dp), dimension(:,:), allocatable :: leafarea0 - real(dp), dimension(:,:), allocatable :: priestley_taylor_alpha0 ! dim 1 = number of cells on level 0, + integer(i4) :: tt + real(dp), dimension(:, :), allocatable :: priestley_taylor_alpha0 ! dim 1 = number of cells on level 0, time ! initialize some things - allocate(priestley_taylor_alpha0 (size(LCover_LAI0, dim=1), YearMonths_i4)) ; priestley_taylor_alpha0 = nodata - allocate(leafarea0 (size(LCover_LAI0, dim=1), YearMonths_i4)) ; leafarea0 = nodata + allocate(priestley_taylor_alpha0 (size(LAI0, 1), size(LAI0, 2))) ; priestley_taylor_alpha0 = nodata priestley_taylor_alpha1 = nodata ! - do iMon = 1, YearMonths_i4 - ! determine LAIs per month - do ll = 1, size(LAILUT, dim=1) - leafarea0(:,iMon) = merge( LAILUT(ll, iMon), leafarea0(:,iMon), LCover_LAI0(:) .EQ. LAIUnitList(ll)) - end do - ! correction for 0 LAI values to avoid numerical instabilities - leafarea0(:,iMon) = merge( 1.00E-10_dp, leafarea0(:,iMon), leafarea0(:,iMon) .LT. eps_dp) - - priestley_taylor_alpha0(:,iMon) = param(1) + param(2) * leafarea0(:,iMon) - - priestley_taylor_alpha1(:,iMon) = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, priestley_taylor_alpha0(:,iMon)) + do tt = 1, size(LAI0, 2) + priestley_taylor_alpha0(:, tt) = param(1) + param(2) * LAI0(:, tt) + + priestley_taylor_alpha1(:, tt) = upscale_arithmetic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, priestley_taylor_alpha0(:, tt)) + end do end subroutine priestley_taylor_alpha @@ -482,77 +468,63 @@ end subroutine priestley_taylor_alpha !> \date Apr 2013 ! Modified Matthias Zink, Jun 2017 - moved from mo_multi_scale_param_reg.f90 to mo_mpr_pet.f90 - subroutine bulksurface_resistance( & - LCover_LAI0, & ! land cover id for LAI at level 0 - LAILUT, & ! look up table for LAI - LAIUnitList, & ! List of ids of each LAI class in LAILUT - param, & ! parameter values (size=1) - mask0, & ! mask at level 0 - nodata, & ! given nodata value - cell_id0, & ! cell id at Level 0 - nL0_in_L1, & ! number of l0 cells within a l1 cell - Upp_row_L1, & ! upper row of a l1 cell in l0 grid - Low_row_L1, & ! lower row of a l1 cell in l0 grid - Lef_col_L1, & ! left col of a l1 cell in l0 grid - Rig_col_L1, & ! right col of a l1 cell in l0 grid - bulksurface_resistance1 & ! bulk surface resistance - ) - - use mo_upscaling_operators, only: upscale_arithmetic_mean - use mo_mhm_constants, only: YearMonths_i4, LAI_factor_surfResi, LAI_offset_surfResi, max_surfResist - use mo_constants, only: eps_dp + subroutine bulksurface_resistance(& + LAI0, & ! LAI at level-0 + param, & ! parameter values (size=1) + mask0, & ! mask at level 0 + nodata, & ! given nodata value + cell_id0, & ! cell id at Level 0 + nL0_in_L1, & ! number of l0 cells within a l1 cell + Upp_row_L1, & ! upper row of a l1 cell in l0 grid + Low_row_L1, & ! lower row of a l1 cell in l0 grid + Lef_col_L1, & ! left col of a l1 cell in l0 grid + Rig_col_L1, & ! right col of a l1 cell in l0 grid + bulksurface_resistance1 & ! bulk surface resistance + ) + + use mo_upscaling_operators, only : upscale_arithmetic_mean + use mo_mpr_constants, only : LAI_factor_surfResi, LAI_offset_surfResi, max_surfResist implicit none - integer(i4), dimension(:), intent(in) :: LCover_LAI0 ! land cover id for LAI - real(dp), dimension(:,:), intent(in) :: LAILUT ! look up table for LAI - ! ! dim1=land cover class, dim2=month of year - integer(i4), dimension(:), intent(in) :: LAIUnitList ! List of ids of each LAI class in LAILUT - real(dp), intent(in) :: param ! input parameter - logical, dimension(:,:), intent(in) :: mask0 ! mask at level 0 - real(dp), intent(in) :: nodata ! given nodata value - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! number of l0 cells within a l1 cell - integer(i4), dimension(:), intent(in) :: Upp_row_L1 ! upper row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Low_row_L1 ! lower row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Lef_col_L1 ! left col of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Rig_col_L1 ! right col of a l1 cell in l0 grid + real(dp), dimension(:, :), intent(in) :: LAI0 ! LAI at level-0 + real(dp), intent(in) :: param ! input parameter + logical, dimension(:, :), intent(in) :: mask0 ! mask at level 0 + real(dp), intent(in) :: nodata ! given nodata value + integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! number of l0 cells within a l1 cell + integer(i4), dimension(:), intent(in) :: Upp_row_L1 ! upper row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: Low_row_L1 ! lower row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: Lef_col_L1 ! left col of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: Rig_col_L1 ! right col of a l1 cell in l0 grid ! Output - real(dp), dimension(:,:), intent(out) :: bulksurface_resistance1 + real(dp), dimension(:, :), intent(out) :: bulksurface_resistance1 ! local - integer(i4) :: iMon, ll - real(dp), dimension(:,:), allocatable :: leafarea0 - real(dp), dimension(:,:), allocatable :: bulksurface_resistance0 ! dim 1 = number of cells on level 0, + integer(i4) :: tt + real(dp), dimension(:, :), allocatable :: bulksurface_resistance0 ! dim 1 = number of cells on level 0, ! ! dim 2 = number of months in year (12) ! initialize some things - allocate(bulksurface_resistance0 (size(LCover_LAI0, dim=1), YearMonths_i4)) ; bulksurface_resistance0 = nodata - allocate(leafarea0 (size(LCover_LAI0, dim=1), YearMonths_i4)) ; leafarea0 = nodata + allocate(bulksurface_resistance0 (size(LAI0, 1), size(LAI0, 2))) ; bulksurface_resistance0 = nodata bulksurface_resistance1 = nodata ! - do iMon = 1, YearMonths_i4 - - ! determine LAIs - do ll = 1, size(LAILUT, dim=1) - leafarea0(:,iMon) = merge( LAILUT(ll, iMon), leafarea0(:,iMon), LCover_LAI0(:) .EQ. LAIUnitList(ll)) - end do - ! correction for 0 LAI values - leafarea0(:,iMon) = merge( 1.00E-10_dp, leafarea0(:,iMon), leafarea0(:,iMon) .LT. eps_dp) - - bulksurface_resistance0(:,iMon) = param / ( leafarea0(:,iMon) / & - (LAI_factor_surfResi * leafarea0(:,iMon) + LAI_offset_surfResi)) - ! efeective LAI from McMahon et al ,2013 , HESS supplements - - ! since LAI may be very low, rs becomes very high - ! thus the values are restricted to maximum literaure values (i.e. McMahon et al ,2013 , HESS) - bulksurface_resistance0(:,iMon) = merge(max_surfResist, bulksurface_resistance0(:,iMon), & - bulksurface_resistance0(:,iMon) .GT. max_surfResist) - - bulksurface_resistance1(:,iMon) = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, bulksurface_resistance0(:,iMon)) + + do tt = 1, size(LAI0, 2) + bulksurface_resistance0(:, tt) = param / (LAI0(:, tt) / & + (LAI_factor_surfResi * LAI0(:, tt) + LAI_offset_surfResi)) + ! efeective LAI from McMahon et al ,2013 , HESS supplements + + ! since LAI may be very low, rs becomes very high + ! thus the values are restricted to maximum literaure values (i.e. McMahon et al ,2013 , HESS) + bulksurface_resistance0(:, tt) = merge(max_surfResist, bulksurface_resistance0(:, tt), & + bulksurface_resistance0(:, tt) .GT. max_surfResist) + + bulksurface_resistance1(:, tt) = upscale_arithmetic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, bulksurface_resistance0(:, tt)) + end do end subroutine bulksurface_resistance - + end module mo_mpr_pet diff --git a/src/MPR/mo_mpr_read_config.f90 b/src/MPR/mo_mpr_read_config.f90 new file mode 100644 index 00000000..818d36e7 --- /dev/null +++ b/src/MPR/mo_mpr_read_config.f90 @@ -0,0 +1,906 @@ +!> \file mo_mpr_read_config.f90 + +!> \brief read mpr config + +!> \details This module contains all mpr subroutines related to +!> reading the mpr configuration from file. + +!> \authors Stephan Thober +!> \date Aug 2015 +! Modified, Robert Schweppe Dec 2017 - adapted for mpr + + +module mo_mpr_read_config + + use mo_kind, only : i4, dp + + implicit none + + public :: mpr_read_config + +contains + + ! ------------------------------------------------------------------ + + ! NAME + ! read_mpr_config + + ! PURPOSE + !> \brief Read the general config of mpr + ! + !> \details Depending on the variable mrm_coupling_config, the + !> mRM config is either read from mrm.nml and parameters from + !> mrm_parameter.nml or copied from mHM. + ! + ! INTENT(IN) + !> \param[in] "logical :: do_message" - flag for writing mHM standard messages + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "logical :: readLatLon" - flag for reading LatLon file + ! + ! INTENT(IN), OPTIONAL + ! None + ! + ! INTENT(INOUT), OPTIONAL + ! None + ! + ! INTENT(OUT), OPTIONAL + ! None + ! + ! RETURN + ! None + ! + ! RESTRICTIONS + ! None + ! + ! EXAMPLE + ! None + ! + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober + !> \date Aug 2015 + ! Modified, + ! Sep 2015, Stephan Thober - removed stop condition when routing resolution is smaller than hydrologic resolution + ! Oct 2015, Stephan Thober - added NLoutputResults namelist, fileLatLon to directories_general namelist, + ! and readLatLon flag + ! Dec 2017, Robert Schweppe - adapted for MPR + subroutine mpr_read_config(file_namelist, unamelist, file_namelist_param, unamelist_param) + + use mo_mpr_global_variables, only : & + inputFormat_gridded_LAI, & ! format of gridded LAI data(bin or nc) + timeStep_LAI_input, & ! time step of gridded LAI input + iFlag_soilDB, & + tillageDepth, & ! soil horizons info for mHM + dirgridded_LAI, & ! directory where gridded LAI is located + nGeoUnits, & + HorizonDepth_mHM, nSoilHorizons_mHM, & + fracSealed_cityArea ! land cover information + use mo_mpr_constants, only : & + maxGeoUnit, & ! maximum number of allowed geological classes + maxNoSoilHorizons ! maximum number of allowed soil layers + use mo_common_constants, only : & + nColPars, & ! number of properties of the global variables + maxNoBasins, & ! maximum number of allowed basins + nodata_dp, & + eps_dp + use mo_common_variables, only : & + nBasins, & + global_parameters, & + global_parameters_name, & + processMatrix ! process configuration + use mo_append, only : append + use mo_utils, only : EQ + use mo_common_functions, only : in_bound + use mo_nml, only : open_nml, close_nml, position_nml + use mo_string_utils, only : num2str + use mo_message, only : message + + implicit none + + character(*), intent(in) :: file_namelist + integer, intent(in) :: unamelist + character(*), intent(in) :: file_namelist_param + integer, intent(in) :: unamelist_param + + integer(i4) :: ii + + ! some dummy arrays for namelist read in (allocatables not allowed in namelists) + real(dp), dimension(maxNoSoilHorizons) :: soil_Depth ! depth of the single horizons + character(256), dimension(maxNoBasins) :: dir_gridded_LAI ! directory of gridded LAI data + ! ! used when timeStep_LAI_input<0 + + ! LOCAL variables + ! PARAMETERS + ! some dummy arrays for namelist read in (allocatables not allowed in namelists) + character(256) :: dummy + real(dp), dimension(5, nColPars) :: dummy_2d_dp ! space holder for routing parameters + real(dp), dimension(1, nColPars) :: dummy_2d_dp_2 ! space holder for routing parameters + ! interception + real(dp), dimension(nColPars) :: canopyInterceptionFactor + ! snow + real(dp), dimension(nColPars) :: snowTreshholdTemperature + real(dp), dimension(nColPars) :: degreeDayFactor_forest + real(dp), dimension(nColPars) :: degreeDayFactor_impervious + real(dp), dimension(nColPars) :: degreeDayFactor_pervious + real(dp), dimension(nColPars) :: increaseDegreeDayFactorByPrecip + real(dp), dimension(nColPars) :: maxDegreeDayFactor_forest + real(dp), dimension(nColPars) :: maxDegreeDayFactor_impervious + real(dp), dimension(nColPars) :: maxDegreeDayFactor_pervious + ! soilmoisture + real(dp), dimension(nColPars) :: orgMatterContent_forest + real(dp), dimension(nColPars) :: orgMatterContent_impervious + real(dp), dimension(nColPars) :: orgMatterContent_pervious + real(dp), dimension(nColPars) :: PTF_lower66_5_constant + real(dp), dimension(nColPars) :: PTF_lower66_5_clay + real(dp), dimension(nColPars) :: PTF_lower66_5_Db + real(dp), dimension(nColPars) :: PTF_higher66_5_constant + real(dp), dimension(nColPars) :: PTF_higher66_5_clay + real(dp), dimension(nColPars) :: PTF_higher66_5_Db + real(dp), dimension(nColPars) :: infiltrationShapeFactor + real(dp), dimension(nColPars) :: PTF_Ks_constant + real(dp), dimension(nColPars) :: PTF_Ks_sand + real(dp), dimension(nColPars) :: PTF_Ks_clay + real(dp), dimension(nColPars) :: PTF_Ks_curveSlope + real(dp), dimension(nColPars) :: rootFractionCoefficient_forest + real(dp), dimension(nColPars) :: rootFractionCoefficient_impervious + real(dp), dimension(nColPars) :: rootFractionCoefficient_pervious + real(dp), dimension(nColPars) :: jarvis_sm_threshold_c1 + real(dp), dimension(nColPars) :: rootFractionCoefficient_sand + real(dp), dimension(nColPars) :: rootFractionCoefficient_clay + + ! directRunoff + real(dp), dimension(nColPars) :: imperviousStorageCapacity + ! PET0 + real(dp), dimension(nColPars) :: PET_a_forest + real(dp), dimension(nColPars) :: PET_a_impervious + real(dp), dimension(nColPars) :: PET_a_pervious + real(dp), dimension(nColPars) :: PET_b + real(dp), dimension(nColPars) :: PET_c + real(dp), dimension(nColPars) :: minCorrectionFactorPET + real(dp), dimension(nColPars) :: maxCorrectionFactorPET + real(dp), dimension(nColPars) :: aspectTresholdPET + real(dp), dimension(nColPars) :: HargreavesSamaniCoeff + real(dp), dimension(nColPars) :: PriestleyTaylorCoeff + real(dp), dimension(nColPars) :: PriestleyTaylorLAIcorr + real(dp), dimension(nColPars) :: canopyheigth_forest + real(dp), dimension(nColPars) :: canopyheigth_impervious + real(dp), dimension(nColPars) :: canopyheigth_pervious + real(dp), dimension(nColPars) :: displacementheight_coeff + real(dp), dimension(nColPars) :: roughnesslength_momentum_coeff + real(dp), dimension(nColPars) :: roughnesslength_heat_coeff + real(dp), dimension(nColPars) :: stomatal_resistance + ! interflow + real(dp), dimension(nColPars) :: interflowStorageCapacityFactor + real(dp), dimension(nColPars) :: interflowRecession_slope + real(dp), dimension(nColPars) :: fastInterflowRecession_forest + real(dp), dimension(nColPars) :: slowInterflowRecession_Ks + real(dp), dimension(nColPars) :: exponentSlowInterflow + ! percolation + real(dp), dimension(nColPars) :: rechargeCoefficient + real(dp), dimension(nColPars) :: rechargeFactor_karstic + real(dp), dimension(nColPars) :: gain_loss_GWreservoir_karstic + ! routing moved to mRM + ! geological parameters + real(dp), dimension(maxGeoUnit, nColPars) :: GeoParam + ! neutrons + real(dp), dimension(nColPars) :: Desilets_N0 + real(dp), dimension(nColPars) :: COSMIC_N0 + real(dp), dimension(nColPars) :: COSMIC_N1 + real(dp), dimension(nColPars) :: COSMIC_N2 + real(dp), dimension(nColPars) :: COSMIC_alpha0 + real(dp), dimension(nColPars) :: COSMIC_alpha1 + real(dp), dimension(nColPars) :: COSMIC_L30 + real(dp), dimension(nColPars) :: COSMIC_L31 + + ! namelist directories + namelist /directories_MPR/ dir_gridded_LAI + ! namelist soil database + namelist /soildata/ iFlag_soilDB, tillageDepth, nSoilHorizons_mHM, soil_Depth + ! namelist for LAI related data + namelist /LAI_data_information/ inputFormat_gridded_LAI, timeStep_LAI_input + ! namelist for land cover scenes + namelist /LCover_MPR/ fracSealed_cityArea + + ! namelist parameters + namelist /interception1/ canopyInterceptionFactor + namelist /snow1/snowTreshholdTemperature, degreeDayFactor_forest, degreeDayFactor_impervious, & + degreeDayFactor_pervious, increaseDegreeDayFactorByPrecip, maxDegreeDayFactor_forest, & + maxDegreeDayFactor_impervious, maxDegreeDayFactor_pervious + namelist /soilmoisture1/ orgMatterContent_forest, orgMatterContent_impervious, orgMatterContent_pervious, & + PTF_lower66_5_constant, PTF_lower66_5_clay, PTF_lower66_5_Db, PTF_higher66_5_constant, & + PTF_higher66_5_clay, PTF_higher66_5_Db, PTF_Ks_constant, & + PTF_Ks_sand, PTF_Ks_clay, PTF_Ks_curveSlope, & + rootFractionCoefficient_forest, rootFractionCoefficient_impervious, & + rootFractionCoefficient_pervious, infiltrationShapeFactor + namelist /soilmoisture2/ orgMatterContent_forest, orgMatterContent_impervious, orgMatterContent_pervious, & + PTF_lower66_5_constant, PTF_lower66_5_clay, PTF_lower66_5_Db, PTF_higher66_5_constant, & + PTF_higher66_5_clay, PTF_higher66_5_Db, PTF_Ks_constant, & + PTF_Ks_sand, PTF_Ks_clay, PTF_Ks_curveSlope, & + rootFractionCoefficient_forest, rootFractionCoefficient_impervious, & + rootFractionCoefficient_pervious, infiltrationShapeFactor, jarvis_sm_threshold_c1 + namelist /soilmoisture3/ orgMatterContent_forest, orgMatterContent_impervious, orgMatterContent_pervious, & + PTF_lower66_5_constant, PTF_lower66_5_clay, PTF_lower66_5_Db, PTF_higher66_5_constant, & + PTF_higher66_5_clay, PTF_higher66_5_Db, PTF_Ks_constant, & + PTF_Ks_sand, PTF_Ks_clay, PTF_Ks_curveSlope, & + rootFractionCoefficient_forest, rootFractionCoefficient_impervious, & + rootFractionCoefficient_pervious, infiltrationShapeFactor, jarvis_sm_threshold_c1, & + rootFractionCoefficient_sand, rootFractionCoefficient_clay + + namelist /directRunoff1/ imperviousStorageCapacity + ! PET is input, LAI driven correction + namelist /PETminus1/ PET_a_forest, PET_a_impervious, PET_a_pervious, PET_b, PET_c + ! PET is input, aspect driven correction + namelist /PET0/ minCorrectionFactorPET, maxCorrectionFactorPET, aspectTresholdPET + ! Hargreaves-Samani + namelist /PET1/ minCorrectionFactorPET, maxCorrectionFactorPET, aspectTresholdPET, HargreavesSamaniCoeff + ! Priestely-Taylor + namelist /PET2/ PriestleyTaylorCoeff, PriestleyTaylorLAIcorr + ! Penman-Monteith + namelist /PET3/ canopyheigth_forest, canopyheigth_impervious, canopyheigth_pervious, displacementheight_coeff, & + roughnesslength_momentum_coeff, roughnesslength_heat_coeff, stomatal_resistance + namelist /interflow1/ interflowStorageCapacityFactor, interflowRecession_slope, fastInterflowRecession_forest, & + slowInterflowRecession_Ks, exponentSlowInterflow + namelist /percolation1/ rechargeCoefficient, rechargeFactor_karstic, gain_loss_GWreservoir_karstic + namelist /neutrons1/ Desilets_N0, COSMIC_N0, COSMIC_N1, COSMIC_N2, COSMIC_alpha0, COSMIC_alpha1, COSMIC_L30, COSMIC_L31 + ! + namelist /geoparameter/ GeoParam + + !=============================================================== + ! INITIALIZATION + !=============================================================== + soil_Depth = 0.0_dp + dummy_2d_dp = nodata_dp + dummy_2d_dp_2 = nodata_dp + + call open_nml(file_namelist, unamelist, quiet = .true.) + + !=============================================================== + ! Read namelist for LCover + !=============================================================== + call position_nml('LCover_MPR', unamelist) + read(unamelist, nml = LCover_MPR) + + !=============================================================== + ! Read soil layering information + !=============================================================== + call position_nml('soildata', unamelist) + read(unamelist, nml = soildata) + + allocate(HorizonDepth_mHM(nSoilHorizons_mHM)) + HorizonDepth_mHM(:) = 0.0_dp + ! last layer is reset to 0 in MPR in case of iFlag_soilDB is 0 + HorizonDepth_mHM(1 : nSoilHorizons_mHM) = soil_Depth(1 : nSoilHorizons_mHM) + + ! counter checks -- soil horizons + if (nSoilHorizons_mHM .GT. maxNoSoilHorizons) then + call message() + call message('***ERROR: Number of soil horizons is resticted to ', trim(num2str(maxNoSoilHorizons)), '!') + stop + end if + + ! the default is the HorizonDepths are all set up to last + ! as is the default for option-1 where horizon specific information are taken into consideration + if(iFlag_soilDB .eq. 0) then + ! classical mhm soil database + HorizonDepth_mHM(nSoilHorizons_mHM) = 0.0_dp + else if(iFlag_soilDB .ne. 1) then + call message() + call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') + stop + end if + + ! some consistency checks for the specification of the tillage depth + if(iFlag_soilDB .eq. 1) then + if(count(abs(HorizonDepth_mHM(:) - tillageDepth) .lt. eps_dp) .eq. 0) then + call message() + call message('***ERROR: Soil tillage depth must conform with one of the specified horizon (lower) depth.') + stop + end if + end if + + !=============================================================== + ! Read LAI related information + !=============================================================== + call position_nml('LAI_data_information', unamelist) + read(unamelist, nml = LAI_data_information) + + if (timeStep_LAI_input .ne. 0) then + !=============================================================== + ! Read namelist for main directories + !=============================================================== + call position_nml('directories_MPR', unamelist) + read(unamelist, nml = directories_MPR) + + allocate(dirgridded_LAI(nBasins)) + dirgridded_LAI = dir_gridded_LAI(1 : nBasins) + + if ((timeStep_LAI_input .ne. -1) .and. (trim(inputFormat_gridded_LAI) .eq. 'bin')) then + call message() + call message('***ERROR: Gridded LAI input in bin format must be daily.') + stop + end if + if (timeStep_LAI_input .GT. 1) then + call message() + call message('***ERROR: option for selected timeStep_LAI_input not coded yet') + stop + end if + end if + + call close_nml(unamelist) + + !=============================================================== + ! Read namelist global parameters + !=============================================================== + call open_nml(file_namelist_param, unamelist_param, quiet = .true.) + ! decide which parameters to read depending on specified processes + + ! Process 1 - interception + select case (processMatrix(1, 1)) + ! 1 - maximum Interception + case(1) + call position_nml('interception1', unamelist_param) + read(unamelist_param, nml = interception1) + + processMatrix(1, 2) = 1_i4 + processMatrix(1, 3) = 1_i4 + call append(global_parameters, reshape(canopyInterceptionFactor, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'canopyInterceptionFactor'/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "interception1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "interception" does not exist!') + stop + end select + + ! Process 2 - snow + select case (processMatrix(2, 1)) + ! 1 - degree-day approach + case(1) + call position_nml('snow1', unamelist_param) + read(unamelist_param, nml = snow1) + + processMatrix(2, 2) = 8_i4 + processMatrix(2, 3) = sum(processMatrix(1 : 2, 2)) + call append(global_parameters, reshape(snowTreshholdTemperature, (/1, nColPars/))) + call append(global_parameters, reshape(degreeDayFactor_forest, (/1, nColPars/))) + call append(global_parameters, reshape(degreeDayFactor_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(degreeDayFactor_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(increaseDegreeDayFactorByPrecip, (/1, nColPars/))) + call append(global_parameters, reshape(maxDegreeDayFactor_forest, (/1, nColPars/))) + call append(global_parameters, reshape(maxDegreeDayFactor_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(maxDegreeDayFactor_pervious, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'snowTreshholdTemperature ', & + 'degreeDayFactor_forest ', & + 'degreeDayFactor_impervious ', & + 'degreeDayFactor_pervious ', & + 'increaseDegreeDayFactorByPrecip', & + 'maxDegreeDayFactor_forest ', & + 'maxDegreeDayFactor_impervious ', & + 'maxDegreeDayFactor_pervious '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "snow1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "snow" does not exist!') + stop + end select + + ! Process 3 - soilmoisture + select case (processMatrix(3, 1)) + + ! 1 - Feddes equation for PET reduction, bucket approach, Brooks-Corey like + case(1) + call position_nml('soilmoisture1', unamelist_param) + read(unamelist_param, nml = soilmoisture1) + processMatrix(3, 2) = 17_i4 + processMatrix(3, 3) = sum(processMatrix(1 : 3, 2)) + call append(global_parameters, reshape(orgMatterContent_forest, (/1, nColPars/))) + call append(global_parameters, reshape(orgMatterContent_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(orgMatterContent_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_Db, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_Db, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_sand, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_curveSlope, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_forest, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(infiltrationShapeFactor, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'orgMatterContent_forest ', & + 'orgMatterContent_impervious ', & + 'orgMatterContent_pervious ', & + 'PTF_lower66_5_constant ', & + 'PTF_lower66_5_clay ', & + 'PTF_lower66_5_Db ', & + 'PTF_higher66_5_constant ', & + 'PTF_higher66_5_clay ', & + 'PTF_higher66_5_Db ', & + 'PTF_Ks_constant ', & + 'PTF_Ks_sand ', & + 'PTF_Ks_clay ', & + 'PTF_Ks_curveSlope ', & + 'rootFractionCoefficient_forest ', & + 'rootFractionCoefficient_impervious', & + 'rootFractionCoefficient_pervious ', & + 'infiltrationShapeFactor '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "soilmoisture1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + ! 2- Jarvis equation for PET reduction, bucket approach, Brooks-Corey like + case(2) + call position_nml('soilmoisture2', unamelist_param) + read(unamelist_param, nml = soilmoisture2) + processMatrix(3, 2) = 18_i4 + processMatrix(3, 3) = sum(processMatrix(1 : 3, 2)) + call append(global_parameters, reshape(orgMatterContent_forest, (/1, nColPars/))) + call append(global_parameters, reshape(orgMatterContent_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(orgMatterContent_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_Db, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_Db, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_sand, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_curveSlope, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_forest, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(infiltrationShapeFactor, (/1, nColPars/))) + call append(global_parameters, reshape(jarvis_sm_threshold_c1, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'orgMatterContent_forest ', & + 'orgMatterContent_impervious ', & + 'orgMatterContent_pervious ', & + 'PTF_lower66_5_constant ', & + 'PTF_lower66_5_clay ', & + 'PTF_lower66_5_Db ', & + 'PTF_higher66_5_constant ', & + 'PTF_higher66_5_clay ', & + 'PTF_higher66_5_Db ', & + 'PTF_Ks_constant ', & + 'PTF_Ks_sand ', & + 'PTF_Ks_clay ', & + 'PTF_Ks_curveSlope ', & + 'rootFractionCoefficient_forest ', & + 'rootFractionCoefficient_impervious', & + 'rootFractionCoefficient_pervious ', & + 'infiltrationShapeFactor ', & + 'jarvis_sm_threshold_c1 '/)) + + + ! 3- Jarvis equation for ET reduction and FC dependency on root fraction coefficient + case(3) + call position_nml('soilmoisture3', unamelist_param) + read(unamelist_param, nml = soilmoisture3) + processMatrix(3, 2) = 20_i4 + processMatrix(3, 3) = sum(processMatrix(1 : 3, 2)) + call append(global_parameters, reshape(orgMatterContent_forest, (/1, nColPars/))) + call append(global_parameters, reshape(orgMatterContent_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(orgMatterContent_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_lower66_5_Db, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_higher66_5_Db, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_constant, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_sand, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_clay, (/1, nColPars/))) + call append(global_parameters, reshape(PTF_Ks_curveSlope, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_forest, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(infiltrationShapeFactor, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_sand, (/1, nColPars/))) + call append(global_parameters, reshape(rootFractionCoefficient_clay, (/1, nColPars/))) + call append(global_parameters, reshape(jarvis_sm_threshold_c1, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'orgMatterContent_forest ', & + 'orgMatterContent_impervious ', & + 'orgMatterContent_pervious ', & + 'PTF_lower66_5_constant ', & + 'PTF_lower66_5_clay ', & + 'PTF_lower66_5_Db ', & + 'PTF_higher66_5_constant ', & + 'PTF_higher66_5_clay ', & + 'PTF_higher66_5_Db ', & + 'PTF_Ks_constant ', & + 'PTF_Ks_sand ', & + 'PTF_Ks_clay ', & + 'PTF_Ks_curveSlope ', & + 'rootFractionCoefficient_forest ', & + 'rootFractionCoefficient_impervious', & + 'rootFractionCoefficient_pervious ', & + 'infiltrationShapeFactor ', & + 'rootFractionCoefficient_sand ', & + 'rootFractionCoefficient_clay ', & + 'jarvis_sm_threshold_c1 '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "soilmoisture1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "soilmoisture" does not exist!') + stop + end select + + ! Process 4 - sealed area directRunoff + select case (processMatrix(4, 1)) + ! 1 - bucket exceedance approach + case(1) + call position_nml('directRunoff1', unamelist_param) + read(unamelist_param, nml = directRunoff1) + processMatrix(4, 2) = 1_i4 + processMatrix(4, 3) = sum(processMatrix(1 : 4, 2)) + call append(global_parameters, reshape(imperviousStorageCapacity, (/1, nColPars/))) + + call append(global_parameters_name, (/'imperviousStorageCapacity'/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "directRunoff1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "directRunoff" does not exist!') + stop + end select + + ! Process 5 - potential evapotranspiration (PET) + select case (processMatrix(5, 1)) + case(-1) ! 0 - PET is input, correct PET by LAI + call position_nml('PETminus1', unamelist_param) + read(unamelist_param, nml = PETminus1) + processMatrix(5, 2) = 5_i4 + processMatrix(5, 3) = sum(processMatrix(1 : 5, 2)) + call append(global_parameters, reshape(PET_a_forest, (/1, nColPars/))) + call append(global_parameters, reshape(PET_a_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(PET_a_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(PET_b, (/1, nColPars/))) + call append(global_parameters, reshape(PET_c, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'PET_a_forest ', & + 'PET_a_impervious ', & + 'PET_a_pervious ', & + 'PET_b ', & + 'PET_c '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "PETminus1" out of bound n ', & + trim(adjustl(file_namelist_param))) + stop 1 + end if + + case(0) ! 0 - PET is input, correct PET by aspect + call position_nml('PET0', unamelist_param) + read(unamelist_param, nml = PET0) + processMatrix(5, 2) = 3_i4 + processMatrix(5, 3) = sum(processMatrix(1 : 5, 2)) + call append(global_parameters, reshape(minCorrectionFactorPET, (/1, nColPars/))) + call append(global_parameters, reshape(maxCorrectionFactorPET, (/1, nColPars/))) + call append(global_parameters, reshape(aspectTresholdPET, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'minCorrectionFactorPET ', & + 'maxCorrectionFactorPET ', & + 'aspectTresholdPET '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "PET0" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case(1) ! 1 - Hargreaves-Samani method (HarSam) - additional input needed: Tmin, Tmax + call position_nml('PET1', unamelist_param) + read(unamelist_param, nml = PET1) + processMatrix(5, 2) = 4_i4 + processMatrix(5, 3) = sum(processMatrix(1 : 5, 2)) + call append(global_parameters, reshape(minCorrectionFactorPET, (/1, nColPars/))) + call append(global_parameters, reshape(maxCorrectionFactorPET, (/1, nColPars/))) + call append(global_parameters, reshape(aspectTresholdPET, (/1, nColPars/))) + call append(global_parameters, reshape(HargreavesSamaniCoeff, (/1, nColPars/))) + call append(global_parameters_name, (/ & + 'minCorrectionFactorPET', & + 'maxCorrectionFactorPET', & + 'aspectTresholdPET ', & + 'HargreavesSamaniCoeff '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "PET1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case(2) ! 2 - Priestley-Taylor method (PrieTay) - additional input needed: net_rad + call position_nml('PET2', unamelist_param) + read(unamelist_param, nml = PET2) + processMatrix(5, 2) = 2_i4 + processMatrix(5, 3) = sum(processMatrix(1 : 5, 2)) + call append(global_parameters, reshape(PriestleyTaylorCoeff, (/1, nColPars/))) + call append(global_parameters, reshape(PriestleyTaylorLAIcorr, (/1, nColPars/))) + call append(global_parameters_name, (/ & + 'PriestleyTaylorCoeff ', & + 'PriestleyTaylorLAIcorr'/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "PET2" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case(3) ! 3 - Penman-Monteith method - additional input needed: net_rad, abs. vapour pressue, windspeed + call position_nml('PET3', unamelist_param) + read(unamelist_param, nml = PET3) + processMatrix(5, 2) = 7_i4 + processMatrix(5, 3) = sum(processMatrix(1 : 5, 2)) + + call append(global_parameters, reshape(canopyheigth_forest, (/1, nColPars/))) + call append(global_parameters, reshape(canopyheigth_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(canopyheigth_pervious, (/1, nColPars/))) + call append(global_parameters, reshape(displacementheight_coeff, (/1, nColPars/))) + call append(global_parameters, reshape(roughnesslength_momentum_coeff, (/1, nColPars/))) + call append(global_parameters, reshape(roughnesslength_heat_coeff, (/1, nColPars/))) + call append(global_parameters, reshape(stomatal_resistance, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'canopyheigth_forest ', & + 'canopyheigth_impervious ', & + 'canopyheigth_pervious ', & + 'displacementheight_coeff ', & + 'roughnesslength_momentum_coeff', & + 'roughnesslength_heat_coeff ', & + 'stomatal_resistance '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "PET3" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "actualET" does not exist!') + stop + end select + + + ! Process 6 - interflow + select case (processMatrix(6, 1)) + ! 1 - parallel soil reservoir approach + case(1) + call position_nml('interflow1', unamelist_param) + read(unamelist_param, nml = interflow1) + processMatrix(6, 2) = 5_i4 + processMatrix(6, 3) = sum(processMatrix(1 : 6, 2)) + call append(global_parameters, reshape(interflowStorageCapacityFactor, (/1, nColPars/))) + call append(global_parameters, reshape(interflowRecession_slope, (/1, nColPars/))) + call append(global_parameters, reshape(fastInterflowRecession_forest, (/1, nColPars/))) + call append(global_parameters, reshape(slowInterflowRecession_Ks, (/1, nColPars/))) + call append(global_parameters, reshape(exponentSlowInterflow, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'interflowStorageCapacityFactor', & + 'interflowRecession_slope ', & + 'fastInterflowRecession_forest ', & + 'slowInterflowRecession_Ks ', & + 'exponentSlowInterflow '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "interflow1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "interflow" does not exist!') + stop + end select + + ! Process 7 - percolation + select case (processMatrix(7, 1)) + ! 1 - GW layer is assumed as bucket + case(1) + call position_nml('percolation1', unamelist_param) + read(unamelist_param, nml = percolation1) + processMatrix(7, 2) = 3_i4 + processMatrix(7, 3) = sum(processMatrix(1 : 7, 2)) + call append(global_parameters, reshape(rechargeCoefficient, (/1, nColPars/))) + call append(global_parameters, reshape(rechargeFactor_karstic, (/1, nColPars/))) + call append(global_parameters, reshape(gain_loss_GWreservoir_karstic, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'rechargeCoefficient ', & + 'rechargeFactor_karstic ', & + 'gain_loss_GWreservoir_karstic'/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "percolation1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "percolation" does not exist!') + stop + end select + + ! Process 8 - routing + select case (processMatrix(8, 1)) + case(0) + ! 0 - deactivated + call message() + call message('***CAUTION: Routing is deativated! ') + + processMatrix(8, 2) = 0_i4 + processMatrix(8, 3) = sum(processMatrix(1 : 8, 2)) + case(1) + ! parameter values and names are set in mRM + ! 1 - Muskingum approach + processMatrix(8, 2) = 5_i4 + processMatrix(8, 3) = sum(processMatrix(1 : 8, 2)) + call append(global_parameters, dummy_2d_dp) + call append(global_parameters_name, (/'dummy', 'dummy', 'dummy', 'dummy', 'dummy'/)) + case(2) + processMatrix(8, 2) = 1_i4 + processMatrix(8, 3) = sum(processMatrix(1 : 8, 2)) + call append(global_parameters, dummy_2d_dp_2) + call append(global_parameters_name, (/'dummy'/)) + case DEFAULT + call message() + call message('***ERROR: Process description for process "routing" does not exist!') + stop + end select + + !=============================================================== + ! Geological formations + !=============================================================== + dummy = dummy // '' ! only to avoid warning + + ! Process 9 - geoparameter + select case (processMatrix(9, 1)) + case(1) + ! read in global parameters (NOT REGIONALIZED, i.e. these are and not ) for each geological formation used + call position_nml('geoparameter', unamelist_param) + GeoParam = nodata_dp + read(unamelist_param, nml = geoparameter) + + ! search number of geological parameters + do ii = 1, size(GeoParam, 1) ! no while loop to avoid risk of endless loop + if (EQ(GeoParam(ii, 1), nodata_dp)) then + nGeoUnits = ii - 1 + exit + end if + end do + + ! for geology parameters + processMatrix(9, 2) = nGeoUnits + processMatrix(9, 3) = sum(processMatrix(1 : 9, 2)) + + call append(global_parameters, GeoParam(1 : nGeoUnits, :)) + + ! create names + do ii = 1, nGeoUnits + dummy = 'GeoParam(' // trim(adjustl(num2str(ii))) // ',:)' + call append(global_parameters_name, (/ trim(dummy) /)) + end do + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "geoparameter" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + + case DEFAULT + call message() + call message('***ERROR: Process description for process "geoparameter" does not exist!') + stop + end select + + ! Process 10 - neutrons + ! 0 - deactivated + ! 1 - inverse N0 based on Desilets et al. 2010 + ! 2 - COSMIC forward operator by Shuttlworth et al. 2013 + if (processMatrix(10, 1) .gt. 0) then + + call position_nml('neutrons1', unamelist_param) + read(unamelist_param, nml = neutrons1) + + processMatrix(10, 2) = 8_i4 + processMatrix(10, 3) = sum(processMatrix(1 : 10, 2)) + call append(global_parameters, reshape(Desilets_N0, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_N0, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_N1, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_N2, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_alpha0, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_alpha1, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_L30, (/1, nColPars/))) + call append(global_parameters, reshape(COSMIC_L31, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'Desilets_N0 ', & + 'COSMIC_N0 ', & + 'COSMIC_N1 ', & + 'COSMIC_N2 ', & + 'COSMIC_alpha0 ', & + 'COSMIC_alpha1 ', & + 'COSMIC_L30 ', & + 'COSMIC_L31 '/)) + + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "neutrons1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop + end if + else + call message(' INFO: Process (10, neutrons) is deactivated, so output will be suppressed.') + ! this is done below, where nml_output is read + processMatrix(10, 2) = 0_i4 + processMatrix(10, 3) = sum(processMatrix(1 : 10, 2)) + end if + + call close_nml(unamelist_param) + + end subroutine mpr_read_config + +end module mo_mpr_read_config diff --git a/src/MPR/mo_mpr_restart.f90 b/src/MPR/mo_mpr_restart.f90 new file mode 100644 index 00000000..c316bd15 --- /dev/null +++ b/src/MPR/mo_mpr_restart.f90 @@ -0,0 +1,480 @@ +!> \file mo_restart.f90 + +!> \brief reading and writing states, fluxes and configuration for restart of mHM. + +!> \details routines are seperated for reading and writing variables for:\n +!> - states and fluxes, and \n +!> - configuration.\n +!> Reading of L11 configuration is also seperated from the rest, +!> since it is only required when routing is activated. + +!> \authors Stephan Thober +!> \date Jul 2013 + +MODULE mo_mpr_restart + + ! This module is a restart for the UFZ CHS mesoscale hydrologic model mHM. + + ! Written Stephan Thober, Apr 2011 + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: write_eff_params ! read restart files for configuration from a given path + PUBLIC :: write_mpr_restart_files ! write restart files for configuration to a given path + + INTERFACE unpack_field_and_write + MODULE PROCEDURE unpack_field_and_write_1d_i4, & + unpack_field_and_write_1d_dp, & + unpack_field_and_write_2d_dp, & + unpack_field_and_write_3d_dp + end interface unpack_field_and_write + + +CONTAINS + ! ------------------------------------------------------------------ + + ! NAME + ! write_restart + + ! PURPOSE + !> \brief write restart files for each basin + + !> \details write restart files for each basin. For each basin + !> three restart files are written. These are xxx_states.nc, + !> xxx_L11_config.nc, and xxx_config.nc (xxx being the three digit + !> basin index). If a variable is added here, it should also be added + !> in the read restart routines below. + + ! INTENT(IN) + !> \param[in] "character(256), dimension(:) :: OutPath" Output Path for each basin + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober + !> \date Jun 2014 + ! Modified Matthias Zink Nov. 2014 - added PET related parameter writing + ! Stephan Thober Aug 2015 - moved write of routing states to mRM + ! David Schaefer Nov 2015 - mo_netcdf + ! Stephan Thober Nov 2016 - moved processMatrix to common variables + ! Zink M. Demirel C.,Mar 2017 - Added Jarvis soil water stress function at SM process(3) + + ! ------------------------------------------------------------------ + subroutine write_mpr_restart_files(OutPath) + + use mo_kind, only : i4 + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_netcdf, only : NcDataset, NcDimension + use mo_mpr_global_variables, only : & + nSoilHorizons_mHM, & ! number of soil horizons + nLAI + use mo_common_variables, only : & + level1, & + nLCoverScene ! number of land cover scenes + use mo_common_restart, only : write_grid_info + + implicit none + + character(256) :: Fname + character(256), dimension(:), intent(in) :: OutPath ! list of Output paths per Basin + integer(i4) :: iBasin + integer(i4) :: s1 ! start index at level 1 + integer(i4) :: e1 ! end index at level 1 + logical, dimension(:, :), allocatable :: mask1 ! mask at level 1 + + type(NcDataset) :: nc + type(NcDimension) :: rows1, cols1, soil1, lcscenes, lais + + basin_loop : do iBasin = 1, size(OutPath) + + ! write restart file for iBasin + Fname = trim(OutPath(iBasin)) // "mHM_restart_" // trim(num2str(iBasin, "(i3.3)")) // ".nc" + ! print a message + call message(" Writing Restart-file: ", trim(adjustl(Fname)), " ...") + + nc = NcDataset(fname, "w") + + call write_grid_info(level1(iBasin), "1", nc) + + rows1 = nc%getDimension("nrows1") + cols1 = nc%getDimension("ncols1") + + soil1 = nc%setDimension("L1_soilhorizons", nSoilHorizons_mHM) + lcscenes = nc%setDimension("LCoverScenes", nLCoverScene) + lais = nc%setDimension("LAI_timesteps", nLAI) + + ! for appending and intialization + allocate(mask1(rows1%getLength(), cols1%getLength())) + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + mask1 = level1(iBasin)%mask + + call write_eff_params(mask1, s1, e1, rows1, cols1, soil1, lcscenes, lais, nc) + deallocate(mask1) + call nc%close() + + end do basin_loop + + end subroutine write_mpr_restart_files + + subroutine write_eff_params(mask1, s1, e1, rows1, cols1, soil1, lcscenes, lais, nc) + + use mo_kind, only : i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + use mo_common_constants, only : nodata_dp, nodata_i4 + use mo_mpr_global_variables, only : & + L1_fSealed, & + L1_alpha, & + L1_degDayInc, & + L1_degDayMax, & + L1_degDayNoPre, & + L1_degDay, & + L1_karstLoss, & + L1_fAsp, & + L1_HarSamCoeff, & + L1_PrieTayAlpha, & + L1_aeroResist, & + L1_surfResist, & + L1_fRoots, & + L1_maxInter, & + L1_kfastFlow, & + L1_kSlowFlow, & + L1_kBaseFlow, & + L1_kPerco, & + L1_soilMoistFC, & + L1_soilMoistSat, & + L1_soilMoistExp, & + L1_jarvis_thresh_c1, & + L1_petLAIcorFactor, & + L1_tempThresh, & + L1_unsatThresh, & + L1_sealedThresh, & + L1_wiltingPoint + use mo_common_variables, only : & + LC_year_start, LC_year_end, & ! LCscenes details + processMatrix ! process configuration + + implicit none + + logical, dimension(:, :), allocatable, intent(in) :: mask1 ! mask at level 1 + integer(i4), intent(in) :: s1 ! start index at level 1 + integer(i4), intent(in) :: e1 ! end index at level 1 + type(NcDimension), intent(in) :: rows1, cols1, soil1, lcscenes, lais + type(NcDataset), intent(inout) :: nc + type(NcVariable) :: var + + ! set variable + var = nc%setVariable("LC_year_start", "i32", (/lcscenes/)) + call var%setFillValue(nodata_i4) + call var%setData(LC_year_start) + call var%setAttribute("long_name", "start year of land cover scene") + + var = nc%setVariable("LC_year_end", "i32", (/lcscenes/)) + call var%setFillValue(nodata_i4) + call var%setData(LC_year_end) + call var%setAttribute("long_name", "end year of land cover scene") + + !------------------------------------------- + ! EFFECTIVE PARAMETERS + !------------------------------------------- + call unpack_field_and_write(nc, "L1_fSealed", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_fSealed(s1 : e1, 1, :), mask1, & + "fraction of Sealed area at level 1") + + call unpack_field_and_write(nc, "L1_alpha", & + (/rows1, cols1/), nodata_dp, L1_alpha(s1 : e1, 1, 1), mask1, & + "exponent for the upper reservoir at level 1") + + call unpack_field_and_write(nc, "L1_degDayInc", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_degDayInc(s1 : e1, 1, :), mask1, & + "increase of the Degree-day factor per mm of increase in precipitation at level 1") + + call unpack_field_and_write(nc, "L1_degDayMax", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_degDayMax(s1 : e1, 1, :), mask1, & + "maximum degree-day factor at level 1") + + call unpack_field_and_write(nc, "L1_degDayNoPre", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_degDayNoPre(s1 : e1, 1, :), mask1, & + "degree-day factor with no precipitation at level 1") + + call unpack_field_and_write(nc, "L1_degDay", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_degDay(s1 : e1, 1, :), mask1, & + "degree-day factor with no precipitation at level 1") + + call unpack_field_and_write(nc, "L1_karstLoss", & + (/rows1, cols1/), nodata_dp, L1_karstLoss(s1 : e1, 1, 1), mask1, & + "Karstic percolation loss at level 1") + + call unpack_field_and_write(nc, "L1_fRoots", & + (/rows1, cols1, soil1, lcscenes/), nodata_dp, L1_fRoots(s1 : e1, :, :), mask1, & + "Fraction of roots in soil horizons at level 1") + + call unpack_field_and_write(nc, "L1_maxInter", & + (/rows1, cols1, lais/), nodata_dp, L1_maxInter(s1 : e1, :, 1), mask1, & + "Maximum interception at level 1") + + call unpack_field_and_write(nc, "L1_kfastFlow", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_kfastFlow(s1 : e1, 1, :), mask1, & + "fast interflow recession coefficient at level 1") + + call unpack_field_and_write(nc, "L1_kSlowFlow", & + (/rows1, cols1/), nodata_dp, L1_kSlowFlow(s1 : e1, 1, 1), mask1, & + "slow interflow recession coefficient at level 1") + + call unpack_field_and_write(nc, "L1_kBaseFlow", & + (/rows1, cols1/), nodata_dp, L1_kBaseFlow(s1 : e1, 1, 1), mask1, & + "baseflow recession coefficient at level 1") + + call unpack_field_and_write(nc, "L1_kPerco", & + (/rows1, cols1/), nodata_dp, L1_kPerco(s1 : e1, 1, 1), mask1, & + "percolation coefficient at level 1") + + call unpack_field_and_write(nc, "L1_soilMoistFC", & + (/rows1, cols1, soil1, lcscenes/), nodata_dp, L1_soilMoistFC(s1 : e1, :, :), mask1, & + "SM below which actual ET is reduced linearly till PWP at level 1 for processCase(3)=1") + + call unpack_field_and_write(nc, "L1_soilMoistSat", & + (/rows1, cols1, soil1, lcscenes/), nodata_dp, L1_soilMoistSat(s1 : e1, :, :), mask1, & + "Saturation soil moisture for each horizon [mm] at level 1") + + call unpack_field_and_write(nc, "L1_soilMoistExp", & + (/rows1, cols1, soil1, lcscenes/), nodata_dp, L1_soilMoistExp(s1 : e1, :, :), mask1, & + "Exponential parameter to how non-linear is the soil water retention at level 1") + + if (processMatrix(3, 1) == 2) then + call unpack_field_and_write(nc, "L1_jarvis_thresh_c1", & + (/rows1, cols1/), nodata_dp, L1_jarvis_thresh_c1(s1 : e1, 1, 1), mask1, & + "jarvis critical value for normalized soil water content") + end if + + if (processMatrix(5, 1) == -1) then + call unpack_field_and_write(nc, "L1_petLAIcorFactor", & + (/rows1, cols1, lais, lcscenes/), nodata_dp, L1_petLAIcorFactor(s1 : e1, :, :), mask1, & + "PET correction factor based on LAI") + end if + + call unpack_field_and_write(nc, "L1_tempThresh", & + (/rows1, cols1, lcscenes/), nodata_dp, L1_tempThresh(s1 : e1, 1, :), mask1, & + "Threshold temperature for snow/rain at level 1") + + call unpack_field_and_write(nc, "L1_unsatThresh", & + (/rows1, cols1/), nodata_dp, L1_unsatThresh(s1 : e1, 1, 1), mask1, & + "Threshold water depth controlling fast interflow at level 1") + + call unpack_field_and_write(nc, "L1_sealedThresh", & + (/rows1, cols1/), nodata_dp, L1_sealedThresh(s1 : e1, 1, 1), mask1, & + "Threshold water depth for surface runoff in sealed surfaces at level 1") + + call unpack_field_and_write(nc, "L1_wiltingPoint", & + (/rows1, cols1, soil1, lcscenes/), nodata_dp, L1_wiltingPoint(s1 : e1, :, :), mask1, & + "Permanent wilting point at level 1") + + select case (processMatrix(5, 1)) + case(-1 : 0) ! PET is input + call unpack_field_and_write(nc, "L1_fAsp", & + (/rows1, cols1/), nodata_dp, L1_fAsp(s1 : e1, 1, 1), mask1, & + "PET correction factor due to terrain aspect at level 1") + + case(1) ! Hargreaves-Samani + call unpack_field_and_write(nc, "L1_fAsp", & + (/rows1, cols1/), nodata_dp, L1_fAsp(s1 : e1, 1, 1), mask1, & + "PET correction factor due to terrain aspect at level 1") + + call unpack_field_and_write(nc, "L1_HarSamCoeff", & + (/rows1, cols1/), nodata_dp, L1_HarSamCoeff(s1 : e1, 1, 1), mask1, & + "Hargreaves-Samani coefficient") + + case(2) ! Priestley-Taylor + call unpack_field_and_write(nc, "L1_PrieTayAlpha", & + (/rows1, cols1, lais/), nodata_dp, L1_PrieTayAlpha(s1 : e1, :, 1), mask1, & + "Priestley Taylor coeffiecient (alpha)") + + case(3) ! Penman-Monteith + call unpack_field_and_write(nc, "L1_aeroResist", & + (/rows1, cols1, lais, lcscenes/), nodata_dp, L1_aeroResist(s1 : e1, :, :), mask1, & + "aerodynamical resitance") + + call unpack_field_and_write(nc, "L1_surfResist", & + (/rows1, cols1, lais/), nodata_dp, L1_surfResist(s1 : e1, :, 1), mask1, & + "bulk surface resitance") + + end select + + end subroutine write_eff_params + + subroutine unpack_field_and_write_1d_i4 (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + integer(i4), intent(in) :: fill_value ! fill value used for missing values + integer(i4), dimension(:), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + + ! set variable + var = nc%setVariable(var_name, "i32", var_dims) + call var%setFillValue(fill_value) + + ! set the unpacked data + call var%setData(unpack(data, mask, fill_value)) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + + subroutine unpack_field_and_write_1d_dp (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : dp + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + real(dp), intent(in) :: fill_value ! fill value used for missing values + real(dp), dimension(:), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + + ! set variable + var = nc%setVariable(var_name, "f64", var_dims) + call var%setFillValue(fill_value) + + ! set the unpacked data + call var%setData(unpack(data, mask, fill_value)) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + + subroutine unpack_field_and_write_2d_dp (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : dp, i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + real(dp), intent(in) :: fill_value ! fill value used for missing values + real(dp), dimension(:, :), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + real(dp), dimension(:, :, :), allocatable :: dummy_arr + integer(i4), dimension(3) :: dim_length + integer(i4) :: ii + + ! set variable + var = nc%setVariable(var_name, "f64", var_dims) + call var%setFillValue(fill_value) + + dim_length = var%getShape() + allocate(dummy_arr(dim_length(1), dim_length(2), dim_length(3))) + do ii = 1, size(data, 2) + dummy_arr(:, :, ii) = unpack(data(:, ii), mask, fill_value) + end do + + ! set the unpacked data + call var%setData(dummy_arr) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + + subroutine unpack_field_and_write_3d_dp (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : dp, i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + real(dp), intent(in) :: fill_value ! fill value used for missing values + real(dp), dimension(:, :, :), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + real(dp), dimension(:, :, :, :), allocatable :: dummy_arr + integer(i4), dimension(4) :: dim_length + integer(i4) :: ii, jj + + ! set variable + var = nc%setVariable(var_name, "f64", var_dims) + call var%setFillValue(fill_value) + + dim_length = var%getShape() + allocate(dummy_arr(dim_length(1), dim_length(2), dim_length(3), dim_length(4))) + do ii = 1, size(data, 2) + do jj = 1, size(data, 3) + dummy_arr(:, :, ii, jj) = unpack(data(:, ii, jj), mask, fill_value) + end do + end do + + ! set the unpacked data + call var%setData(dummy_arr) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + +END MODULE mo_mpr_restart diff --git a/src/mHM/mo_mpr_runoff.f90 b/src/MPR/mo_mpr_runoff.f90 similarity index 58% rename from src/mHM/mo_mpr_runoff.f90 rename to src/MPR/mo_mpr_runoff.f90 index 67ee2945..d41a0a44 100644 --- a/src/mHM/mo_mpr_runoff.f90 +++ b/src/MPR/mo_mpr_runoff.f90 @@ -9,7 +9,7 @@ module mo_mpr_runoff - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none @@ -93,65 +93,64 @@ module mo_mpr_runoff ! Modified, Stephan Thober, Jan 2013 - updated calling sequence for upscaling operators ! Stephan Thober, Dec 2013 - made header conform with mo_template - subroutine mpr_runoff( & - ! Input ------------------------------------------------------- - LCOVER0, & - mask0, & - nodata, & - SMs_FC0, & - slope_emp0, & - KsVar_H0, & - param, & - cell_id0, & - upp_row_L1, & - low_row_L1, & - lef_col_L1, & - rig_col_L1, & - nL0_in_L1, & - c2TSTu, & - ! Output ------------------------------------------------------ - L1_HL1, & - L1_K0, & - L1_K1, & - L1_alpha ) - - use mo_upscaling_operators, only: upscale_arithmetic_mean + subroutine mpr_runoff(& + ! Input ------------------------------------------------------- + LCOVER0, & + mask0, & + SMs_FC0, & + slope_emp0, & + KsVar_H0, & + param, & + cell_id0, & + upp_row_L1, & + low_row_L1, & + lef_col_L1, & + rig_col_L1, & + nL0_in_L1, & + c2TSTu, & + ! Output ------------------------------------------------------ + L1_HL1, & + L1_K0, & + L1_K1, & + L1_alpha) + + use mo_upscaling_operators, only : upscale_arithmetic_mean + use mo_common_constants, only : nodata_dp, nodata_i4 implicit none ! Input - real(dp), dimension(5), intent(in) :: param ! global parameter - real(dp), intent(in) :: nodata ! nodata value - real(dp), dimension(:), intent(in) :: SMs_FC0 ! [-] soil mositure deficit from field - ! capacity w.r.t to saturation - real(dp), dimension(:), intent(in) :: slope_emp0 ! empirical quantile values F(slope) - real(dp), dimension(:), intent(in) :: KsVar_H0 ! [-] relative variability of saturated - ! hydraulic counductivity for - ! Horizantal flow at level 0 - integer(i4), dimension(:), intent(in) :: LCOVER0 ! land cover at level 0 + real(dp), dimension(5), intent(in) :: param ! global parameter + real(dp), dimension(:), intent(in) :: SMs_FC0 ! [-] soil mositure deficit from field + ! capacity w.r.t to saturation + real(dp), dimension(:), intent(in) :: slope_emp0 ! empirical quantile values F(slope) + real(dp), dimension(:), intent(in) :: KsVar_H0 ! [-] relative variability of saturated + ! hydraulic counductivity for + ! Horizantal flow at level 0 + integer(i4), dimension(:), intent(in) :: LCOVER0 ! land cover at level 0 ! Ids of L0 cells beneath L1 cell - logical, dimension(:,:), intent(in) :: mask0 ! mask at Level 0 - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block - integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block - integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block - integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cell - real(dp), intent(in) :: c2TSTu ! unit transformations + logical, dimension(:, :), intent(in) :: mask0 ! mask at Level 0 + integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block + integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block + integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block + integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block + integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cell + real(dp), intent(in) :: c2TSTu ! unit transformations ! Output - real(dp), dimension(:), intent(out):: L1_HL1 ! [10^-3 m] Threshhold water depth - ! in upper reservoir (for Runoff - ! contribution) - real(dp), dimension(:), intent(out):: L1_K0 ! [10^-3 m] Recession coefficient - ! of the upper reservoir, upper outlet - real(dp), dimension(:), intent(out):: L1_K1 ! [10^-3 m] Recession coefficient - ! of the upper reservoir, lower outlet - real(dp), dimension(:), intent(out):: L1_alpha ! [1] Exponent for the upper reservoir - + real(dp), dimension(:), intent(out) :: L1_HL1 ! [10^-3 m] Threshhold water depth + ! in upper reservoir (for Runoff + ! contribution) + real(dp), dimension(:), intent(out) :: L1_K0 ! [10^-3 m] Recession coefficient + ! of the upper reservoir, upper outlet + real(dp), dimension(:), intent(out) :: L1_K1 ! [10^-3 m] Recession coefficient + ! of the upper reservoir, lower outlet + real(dp), dimension(:), intent(out) :: L1_alpha ! [1] Exponent for the upper reservoir + ! Local Variables - real(dp), dimension(size(SMs_FC0,1)) :: tmp ! temporal variable + real(dp), dimension(size(SMs_FC0, 1)) :: tmp ! temporal variable !----------------------------- ! FAST INTERFLOW @@ -163,9 +162,9 @@ subroutine mpr_runoff( & ! NOTE: This value for the sandy soils will have higher value of HL1, as compared to ! to clayey soil and so these soils can hold larger amount of amount. - tmp = merge( param(1) * SMs_FC0, nodata, cell_id0 .ne. int(nodata, i4)) - L1_HL1 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, tmp ) + tmp = merge(param(1) * SMs_FC0, nodata_dp, cell_id0 .ne. nodata_i4) + L1_HL1 = upscale_arithmetic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, tmp) ! 1/K0 = f(terrian slope) [Booij, et. al.(2005), JoH] ! Steeper slopes resists (1/K0) fast water flows lesser as @@ -175,14 +174,14 @@ subroutine mpr_runoff( & ! In the forested area surface resistance to fast interflow is higher as compared ! to the permeable land surface - tmp = merge( param(2) * (2.0_dp - slope_emp0), nodata, cell_id0 .ne. int(nodata,i4) ) - tmp = merge( tmp * param(3), tmp, LCOVER0 .eq. 1 ) - L1_K0 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, tmp ) + tmp = merge(param(2) * (2.0_dp - slope_emp0), nodata_dp, cell_id0 .ne. nodata_i4) + tmp = merge(tmp * param(3), tmp, LCOVER0 .eq. 1) + L1_K0 = upscale_arithmetic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, tmp) ! To avoid numerical error in fully impervious areas (K0 == 0) ! minimum value of K0 is 1-day - L1_K0 = merge( 1.0_dp, L1_K0, L1_K0 .lt. 1.0_dp ) + L1_K0 = merge(1.0_dp, L1_K0, L1_K0 .lt. 1.0_dp) ! ------------------------------------------------------------------ ! SLOW INTERFLOW @@ -191,32 +190,32 @@ subroutine mpr_runoff( & ! = f(soil properties, LC & New modification) ! K1 = K0 + K1(soil-Ks) - tmp = merge( param(2) * (2.0_dp - slope_emp0) + param(4) * (1.0_dp + KsVar_H0), & - nodata, cell_id0 .ne. int(nodata,i4) ) - L1_K1 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, tmp ) + tmp = merge(param(2) * (2.0_dp - slope_emp0) + param(4) * (1.0_dp + KsVar_H0), & + nodata_dp, cell_id0 .ne. nodata_i4) + L1_K1 = upscale_arithmetic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, tmp) ! minimum value of K1 is 1-day - L1_K1 = merge( 2.0_dp, L1_K1, L1_K1 .lt. 2.0_dp ) + L1_K1 = merge(2.0_dp, L1_K1, L1_K1 .lt. 2.0_dp) + - ! alpha = f(soil type; variabitity of Ks) ! Lower the alpha (exponent of slow interflow) means lower amount of ! water released from the storage to contribute for slow interflow. ! For instance sandy soils will have lower value of alpha as comapred to ! the clayey soils. ! This assumption is quite realistic in physical sense... - tmp = merge( param(5) * (1.0_dp / KsVar_H0) * ( 1.0_dp / ( 1.0_dp + SMs_FC0) ), & - nodata, cell_id0 .ne. int(nodata,i4) ) - L1_alpha = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, & - Rig_col_L1, cell_id0, mask0, nodata, tmp ) + tmp = merge(param(5) * (1.0_dp / KsVar_H0) * (1.0_dp / (1.0_dp + SMs_FC0)), & + nodata_dp, cell_id0 .ne. nodata_i4) + L1_alpha = upscale_arithmetic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, & + Rig_col_L1, cell_id0, mask0, nodata_dp, tmp) ! constraints and unit transformation - L1_K0 = merge( L1_K1, L1_K0, L1_K0 .gt. L1_K1 ) + L1_K0 = merge(L1_K1, L1_K0, L1_K0 .gt. L1_K1) L1_K0 = c2TSTu / L1_K0 L1_K1 = c2TSTu / L1_K1 - + end subroutine mpr_runoff end module mo_mpr_runoff diff --git a/src/MPR/mo_mpr_smhorizons.f90 b/src/MPR/mo_mpr_smhorizons.f90 new file mode 100644 index 00000000..881ebe71 --- /dev/null +++ b/src/MPR/mo_mpr_smhorizons.f90 @@ -0,0 +1,603 @@ +!> \file mo_mpr_smhorizons.f90 + +!> \brief setting up the soil moisture horizons + +!> \details This module sets up the soil moisture horizons + +!> \author Stephan Thober, Rohini Kumar +!> \date Dec 2012 + +module mo_mpr_SMhorizons + + use mo_kind, only : i4, dp + use mo_common_constants, only : nodata_dp + + implicit none + + public :: mpr_SMhorizons + + private + +contains + + ! ---------------------------------------------------------------------------- + + ! NAME + ! mpr_SMhorizons + + !> \brief upscale soil moisture horizons + + !> \details calculate soil properties at the level 1.\n + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = rootFractionCoefficient_forest \n + !> - param(2) = rootFractionCoefficient_impervious \n + !> - param(3) = rootFractionCoefficient_pervious \n + !> - param(4) = infiltrationShapeFactor \n + + + ! INTENT(IN) + !> \param[in] "real(dp) :: param(:)" - four or six global parameters depending on SM process + !> \param[in] "integer(i4) :: processMatrix" - matrix specifying user defined processes + + !> \param[in] "real(dp) :: nodata_dp" - no data value + !> \param[in] "integer(i4) :: iFlag_soil" - flags for handling multiple soil databases + !> \param[in] "integer(i4) :: nHorizons_mHM" - number of horizons to model + !> \param[in] "integer(i4) :: HorizonDepth(:)" - [mm] horizon depth from surface, + !> postive downwards + !> \param[in] "integer(i4) :: L0_LUC(:,:)" - land use cover at level 0 + !> \param[in] "integer(i4) :: L0_soilID(:,:)" - soil IDs at level 0 + !> \param[in] "integer(i4) :: nHorizons(:)" - horizons per soil type + !> \param[in] "integer(i4) :: nTillHorizons(:)" - Number of Tillage horizons + !> \param[in] "real(dp) :: thetaS_till(:,:,:)" - saturated water content of soil + !> horizons upto tillage depth, + !> f(OM, management) + !> \param[in] "real(dp) :: thetaFC_till(:,:,:)" - Field capacity of tillage + !> layers; LUC dependent, f(OM, management) + !> \param[in] "real(dp) :: thetaPW_till(:,:,:)" - Permament wilting point of + !> tillage layers; LUC dependent, f(OM, management) + !> \param[in] "real(dp) :: thetaS(:,:)" - saturated water content of soil + !> horizons after tillage depth + !> \param[in] "real(dp) :: thetaFC(:,:)" - Field capacity of deeper layers + !> \param[in] "real(dp) :: thetaPW(:,:)" - Permanent wilting point of deeper layers + !> \param[in] "real(dp) :: Wd(:,:,:)" - weights of mHM Horizons according to horizons provided + !> in soil database + !> \param[in] "real(dp) :: Db(:,:,:)" - Bulk density + !> \param[in] "real(dp) :: DbM(:,:)" - mineral Bulk density + !> \param[in] "real(dp) :: RZdepth(:)" - [mm] Total soil depth + !> \param[in] "integer(i4) :: L0_cellCoor(:,:)" - cell coordinates at level 0 + !> \param[in] "integer(i4) :: L0_cell_id(:,:)" - cell ids of high resolution field, + !> Number of rows times Number of columns + !> of high resolution field + !> \param[in] "integer(i4) :: upp_row_L1(:)" - Upper row id in high resolution field + !> (L0) of low resolution cell (L1 cell) + !> \param[in] "integer(i4) :: low_row_L1(:)" - Lower row id in high resolution field + !> (L0) of low resolution cell (L1 cell) + !> \param[in] "integer(i4) :: lef_col_L1(:)" - Left column id in high resolution + !> field (L0) of low resolution cell + !> \param[in] "integer(i4) :: rig_col_L1(:)" - Right column id in high resolution + !> field (L0) of low resolution cell + !> \param[in] "integer(i4) :: nL0_in_L1(:)" - Number of high resolution cells (L0) + !> in low resolution cell (L1 cell) + + ! INTENT(OUT) + !> \param[in,out] "real(dp) :: L1_beta(:,:)" - Parameter that determines the + !> relative contribution to SM, upscaled + !> Bulk density. Number of cells at L1 + !> times number of horizons in mHM + !> \param[in,out] "real(dp) :: L1_SMs(:,:)" - [10^-3 m] depth of saturated SM cont + !> Number of cells at L1 times number + !> of horizons in mHM + !> \param[in,out] "real(dp) :: L1_FC(:,:)" - [10^-3 m] field capacity. Number + !> of cells at L1 times number of horizons + !> in mHM + !> \param[in,out] "real(dp) :: L1_PW(:,:)" - [10^-3 m] permanent wilting point. + !> Number of cells at L1 times number + !> of horizons in mHM + !> \param[in,out] "real(dp) :: L1_fRoots(:,:)" - fraction of roots in soil horizons. + !> Number of cells at L1 times number + !> of horizons in mHM + + ! HISTORY + !> \author Luis Samaniego, Rohini Kumar, Stephan Thober + !> \date Dec 2012 + ! Written Stephan Thober, Dec 2012 + ! Modified, Stephan Thober, Jan 2013 - updated calling sequence for upscaling operators + ! Juliane Mai, Oct 2013 - OLD parametrization + ! --> param(1) = rootFractionCoefficient_forest + ! --> param(2) = rootFractionCoefficient_impervious + ! --> param(3) = rootFractionCoefficient_pervious + ! --> param(4) = infiltrationShapeFactor + ! ------------------------------- + ! rootFractionCoeff_perv = rootFractionCoeff_forest - delta_1 + ! ------------------------------- + ! NEW parametrization + ! --> param(1) = rootFractionCoefficient_forest + ! --> param(2) = rootFractionCoefficient_impervious + ! --> param(3) = delta_1 + ! --> param(4) = infiltrationShapeFactor + ! ! if processMatrix(3,1) = 3 additionally + ! --> param(5) = rootFractionCoefficient_sand + ! --> param(6) = rootFractionCoefficient_clay + ! Stephan Thober, Mar 2014 - added omp parallelization + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + ! M. Cuneyd Demirel, Simon Stisen, Apr 2017 - added FC dependency on root fraction coefficient + + + subroutine mpr_SMhorizons(& + ! Input ----------------------------------------------------------------- + param, & ! global parameters, three are required + processMatrix, & ! matrix specifying user defined processes + iFlag_soil, & ! flag to handle different soil database + nHorizons_mHM, & ! number of horizons to model + HorizonDepth, & ! depth of the different horizons + LCOVER0, & ! land use cover at L0 + soilID0, & ! soil Ids at L0 + nHorizons, & ! Number of horizons per soilType + nTillHorizons, & ! Number of Tillage horizons + thetaS_till, & ! saturated water content of soil horizons upto tillage depth + thetaFC_till, & ! Field capacity of tillage layer + thetaPW_till, & ! Permament wilting point of tillage layer + thetaS, & ! saturated water content + thetaFC, & ! Field capacity of deeper layers + thetaPW, & ! Permanent wilting point + Wd, & ! weights of mHM Horizons according to horizons provided in soil database + Db, & ! Bulk density + DbM, & ! mineral Bulk density + RZdepth, & ! [mm] Total soil depth + mask0, & ! mask at L0 + cell_id0, & ! cell ids at L0 + upp_row_L1, & ! upper row of L0 block within L1 cell + low_row_L1, & ! lower row of L0 block within L1 cell + lef_col_L1, & ! left column of L0 block within L1 cell + rig_col_L1, & ! right column of L0 block within L1 cell + nL0_in_L1, & ! Number of L0 cells in L0 block within L1 cell + ! Output ---------------------------------------------------------------- + L1_beta, & ! Parameter that determines the relative contribution to SM + L1_SMs, & ! [10^-3 m] depth of saturated SM cont + L1_FC, & ! [10^-3 m] field capacity + L1_PW, & ! [10^-3 m] permanent wilting point + L1_fRoots) ! fraction of roots in soil horizons + + use mo_upscaling_operators, only : upscale_harmonic_mean + use mo_message, only : message + use mo_string_utils, only : num2str + + !$ use omp_lib + + implicit none + + ! Input + real(dp), dimension(:), intent(in) :: param ! parameters + integer(i4), dimension(:, :), intent(in) :: processMatrix ! matrix specifying user defined processes + integer(i4), intent(in) :: iFlag_soil ! flag to handle different soil database + integer(i4), intent(in) :: nHorizons_mHM ! Number of Horizons in mHM + real(dp), dimension(:), intent(in) :: HorizonDepth ! [10^-3 m] horizon depth from + ! ! surface, postive downwards + integer(i4), dimension(:), intent(in) :: LCOVER0 ! Land cover at level 0 + integer(i4), dimension(:, :), intent(in) :: soilID0 ! soil ID at level 0 + integer(i4), dimension(:), intent(in) :: nHorizons ! horizons per soil type + integer(i4), dimension(:), intent(in) :: nTillHorizons ! Number of Tillage horizons + real(dp), dimension(:, :, :), intent(in) :: thetaS_till ! saturated water content of soil + ! ! horizons upto tillage depth, + ! !f(OM, management) + real(dp), dimension(:, :, :), intent(in) :: thetaFC_till ! Field capacity of tillage + ! ! layers; LUC dependent, + ! !f(OM, management) + real(dp), dimension(:, :, :), intent(in) :: thetaPW_till ! Permament wilting point of + ! ! tillage layers; LUC dependent, + ! ! f(OM, management) + real(dp), dimension(:, :), intent(in) :: thetaS ! saturated water content of soil + ! ! horizons after tillage depth + real(dp), dimension(:, :), intent(in) :: thetaFC ! Field capacity of deeper layers + real(dp), dimension(:, :), intent(in) :: thetaPW ! Permanent wilting point of + ! ! deeper layers + real(dp), dimension(:, :, :), intent(in) :: Wd ! weights of mHM Horizons + ! ! according to horizons provided + ! ! in soil database + real(dp), dimension(:, :, :), intent(in) :: Db ! Bulk density + real(dp), dimension(:, :), intent(in) :: DbM ! mineral Bulk density + real(dp), dimension(:), intent(in) :: RZdepth ! [mm] Total soil depth + + ! Ids of L0 cells beneath L1 cell + logical, dimension(:, :), intent(in) :: mask0 + integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block + integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block + integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block + integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block + integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cel + + ! Output + ! The following five variables have the dimension: Number of cells at L1 times nHorizons_mHM + real(dp), dimension(:, :), intent(inout) :: L1_beta ! Parameter that determines the + ! ! relative contribution to SM, upscaled + ! ! Bulk density + real(dp), dimension(:, :), intent(inout) :: L1_SMs ! [10^-3 m] depth of saturated SM cont + real(dp), dimension(:, :), intent(inout) :: L1_FC ! [10^-3 m] field capacity + real(dp), dimension(:, :), intent(inout) :: L1_PW ! [10^-3 m] permanent wilting point + real(dp), dimension(:, :), intent(inout) :: L1_fRoots ! fraction of roots in soil horizons + + ! Local Variables + integer(i4) :: h ! loop index + integer(i4) :: k ! loop index + integer(i4) :: l ! loop index + integer(i4) :: s ! loop index + real(dp) :: dpth_f + real(dp) :: dpth_t + real(dp) :: fTotRoots + real(dp), dimension(size(LCOVER0, 1)) :: beta0 ! beta 0 + real(dp), dimension(size(LCOVER0, 1)) :: Bd0 ! [10^3 kg/m3] Bulk density + real(dp), dimension(size(LCOVER0, 1)) :: SMs0 ! [10^-3 m] depth of saturated SM cont + real(dp), dimension(size(LCOVER0, 1)) :: FC0 ! [10^-3 m] field capacity + real(dp), dimension(size(LCOVER0, 1)) :: PW0 ! [10^-3 m] permanent wilting point + real(dp), dimension(size(LCOVER0, 1)) :: fRoots0 ! fraction of roots in soil horizons + + real(dp) :: tmp_rootFractionCoefficient_forest + real(dp) :: tmp_rootFractionCoefficient_impervious + real(dp) :: tmp_rootFractionCoefficient_pervious + real(dp) :: tmp_rootFractionCoefficient_perviousFC ! Field capacity dependent + ! ! root frac coeffiecient + + real(dp) :: tmp_rootFractionCoefficient_sand ! Model parameter describing the threshold for + ! ! actual ET reduction for sand + real(dp) :: tmp_rootFractionCoefficient_clay ! Model parameter describing the threshold for actual + ! ! ET reduction for clay + + real(dp) :: tmp_FC0min ! Calculate FCmin at level 0 once to speed up the code + real(dp) :: tmp_FC0max ! Calculate FCmax at level 0 once to speed up the code + integer(i4) :: min_nTH ! the minimum number of till horizons + + + min_nTH = minval(nTillHorizons(:)) + ! decide which parameterization should be used for route fraction: + ! 1:2 - dependent on land cover + tmp_rootFractionCoefficient_forest = param(1) ! min(1.0_dp, param(2) + param(3) + param(1)) + tmp_rootFractionCoefficient_impervious = param(2) + tmp_rootFractionCoefficient_pervious = param(1) - param(3) ! min(1.0_dp, param(2) + param(3)) + + ! 3 - dependent on land cover and additionally soil texture + select case (processMatrix(3, 1)) + case(3) + !delta approach is used as in tmp_rootFractionCoefficient_pervious + tmp_rootFractionCoefficient_sand = param(6) - param(5) + !the value in parameter namelist is before substraction i.e. param(5) + tmp_rootFractionCoefficient_clay = param(6) + end select + + ! select case according to a given soil database flag + SELECT CASE(iFlag_soil) + ! classical mHM soil database format + CASE(0) + do h = 1, nHorizons_mHM + Bd0 = nodata_dp + SMs0 = nodata_dp + FC0 = nodata_dp + PW0 = nodata_dp + fRoots0 = nodata_dp + tmp_rootFractionCoefficient_perviousFC = nodata_dp + ! Initalise mHM horizon depth + ! Last layer depth is soil type dependent, and hence it assigned within the inner loop + ! by default for the first soil layer + dpth_f = 0.0_dp + dpth_t = HorizonDepth(H) + ! check for the layer (2, ... n-1 layers) update depth + if(H .gt. 1 .and. H .lt. nHorizons_mHM) then + dpth_f = HorizonDepth(H - 1) + dpth_t = HorizonDepth(H) + end if + + !$OMP PARALLEL + !$OMP DO PRIVATE( l, s ) SCHEDULE( STATIC ) + cellloop0 : do k = 1, size(LCOVER0, 1) + l = LCOVER0(k) + s = soilID0(k, 1) !>> in this case the second dimension of soilId0 = 1 + ! depth weightage bulk density + Bd0(k) = sum(Db(s, : nTillHorizons(s), L) * Wd(S, H, 1 : nTillHorizons(S)), & + Wd(S, H, 1 : nTillHorizons(S)) > 0.0_dp) & + + sum(dbM(S, nTillHorizons(S) + 1 : nHorizons(S)) & + * Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)), & + Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)) >= 0.0_dp) + ! depth weightage thetaS + SMs0(k) = sum(thetaS_till(S, : nTillHorizons(s), L) & + * Wd(S, H, 1 : nTillHorizons(S)), & + Wd(S, H, 1 : nTillHorizons(S)) > 0.0_dp) & + + sum(thetaS(S, nTillHorizons(S) + 1 - min_nTH : nHorizons(s) - min_nTH) & + * Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)), & + Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)) > 0.0_dp) + ! depth weightage FC + FC0(k) = sum(thetaFC_till(S, : nTillHorizons(s), L) & + * Wd(S, H, 1 : nTillHorizons(S)), & + Wd(S, H, 1 : nTillHorizons(S)) > 0.0_dp) & + + sum(thetaFC(S, nTillHorizons(S) + 1 - min_nTH : nHorizons(s) - min_nTH) & + * Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)), & + Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)) > 0.0_dp) + ! depth weightage PWP + PW0(k) = sum(thetaPW_till(S, : nTillHorizons(s), L) & + * Wd(S, H, 1 : nTillHorizons(S)), & + Wd(S, H, 1 : nTillHorizons(S)) > 0.0_dp) & + + sum(thetaPW(S, nTillHorizons(S) + 1 - min_nTH : nHorizons(s) - min_nTH) & + * Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)), & + Wd(S, H, nTillHorizons(S) + 1 : nHorizons(S)) > 0.0_dp) + ! Horizon depths: last soil horizon is varying, and thus the depth + ! of the horizon too... + if(H .eq. nHorizons_mHM) then + dpth_f = HorizonDepth(nHorizons_mHM - 1) + dpth_t = RZdepth(S) + end if + ! other soil properties [SMs, FC, PWP in mm] + SMs0(k) = SMs0(k) * (dpth_t - dpth_f) + FC0(k) = FC0(k) * (dpth_t - dpth_f) + PW0(k) = PW0(k) * (dpth_t - dpth_f) + end do cellloop0 + !$OMP END DO + !$OMP END PARALLEL + + tmp_FC0min = minval(FC0(:)) + tmp_FC0max = maxval(FC0(:)) + + if(tmp_FC0min .lt. 0.0_dp) then + tmp_FC0min = minval(FC0(cell_id0)) + end if + + !$OMP PARALLEL + !$OMP DO PRIVATE( l, tmp_rootFractionCoefficient_perviousFC ) SCHEDULE( STATIC ) + celllloop0 : do k = 1, size(LCOVER0, 1) + l = LCOVER0(k) + !--------------------------------------------------------------------- + ! Effective root fractions in soil horizon... + ! as weightage sum (according to LC fraction) + !--------------------------------------------------------------------- + ! vertical root distribution = f(LC), following asymptotic equation + ! [for refrence see, Jackson et. al., Oecologia, 1996. 108(389-411)] + + ! Roots(H) = 1 - beta^d + ! where, + ! Roots(H) = cumulative root fraction [-], range: 0-1 + ! beta = fitted extinction cofficient parameter [-], as a f(LC) + ! d = soil surface to depth [cm] + + ! NOTES ** + ! sum(fRoots) for soil horions = 1.0 + + ! if [sum(fRoots) for soil horions < 1.0], then + ! normalise fRoot distribution such that all roots end up + ! in soil horizon and thus satisfying the constrain that + ! sum(fRoots) = 1 + + ! The above constrains means that there are not roots below the soil horizon. + ! This may or may not be realistic but it has been coded here to satisfy the + ! conditions of the EVT vales, otherwise which the EVT values would be lesser + ! than the acutal EVT from whole soil layers. + + ! Code could be modified in a way that a portion of EVT comes from the soil layer + ! which is in between unsaturated and saturated zone or if necessary the saturated + ! layer (i.e. Groundwater layer) can also contribute to EVT. Note that the above + ! modification should be done only if and only if [sum(fRoots) for soil horions < 1.0]. + ! In such cases, you have to judiciously decide which layers (either soil layer between + ! unsaturated and saturated zone or saturated zone) will contribute to EVT and in which + ! proportions. Also note that there are no obervations on the depth avialable ata a + ! moment on these layers. + !------------------------------------------------------------------------ + + select case(L) + case(1) + ! forest + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_f * 0.1_dp)) + case(2) + ! impervious + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_f * 0.1_dp)) + case(3) + + select case (processMatrix(3, 1)) + case(1 : 2) + ! permeable + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_f * 0.1_dp)) + + case(3) + ! permeable + ! introducing FC dependency on root frac coef. by Simon Stisen and M. Cuneyd Demirel from GEUS.dk + tmp_rootFractionCoefficient_perviousFC = (((FC0(k) - tmp_FC0min) / & + ((tmp_FC0max - tmp_FC0min)) * tmp_rootFractionCoefficient_clay)) & + + ((1 - (FC0(k) - tmp_FC0min) / (tmp_FC0max - tmp_FC0min)) * & + tmp_rootFractionCoefficient_sand) + + if(tmp_rootFractionCoefficient_perviousFC .lt. 0.0_dp .OR. tmp_rootFractionCoefficient_perviousFC .gt. 1.0_dp) & + print*, "CHECK tmp_rootFractionCoefficient_perviousFC", tmp_rootFractionCoefficient_perviousFC + + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_f * 0.1_dp)) + + if((fRoots0(k) .lt. 0.0_dp) .OR. (fRoots0(k) .gt. 1.0_dp)) then + call message('***ERROR: Fraction of roots out of range [0,1]. Cell', & + num2str(k), ' has value ', num2str(fRoots0(k))) + ! stop + end if + end select + end select + + end do celllloop0 + !$OMP END DO + !$OMP END PARALLEL + + beta0 = Bd0 * param(4) + + !--------------------------------------------- + ! Upscale the soil related parameters + !--------------------------------------------- + L1_SMs(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, SMs0) + L1_beta(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, beta0) + L1_PW(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, PW0) + L1_FC(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, FC0) + L1_fRoots(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, fRoots0) + + end do + ! to handle multiple soil horizons with unique soil class + CASE(1) + ! horizon wise calculation + do h = 1, nHorizons_mHM + Bd0 = nodata_dp + SMs0 = nodata_dp + FC0 = nodata_dp + PW0 = nodata_dp + fRoots0 = nodata_dp + tmp_rootFractionCoefficient_perviousFC = nodata_dp + ! initalise mHM horizon depth + if (h .eq. 1) then + dpth_f = 0.0_dp + dpth_t = HorizonDepth(h) + ! check for the layer (2, ... n-1 layers) update depth + else + dpth_f = HorizonDepth(h - 1) + dpth_t = HorizonDepth(h) + end if + ! need to be done for every layer to get fRoots + !$OMP PARALLEL + !$OMP DO PRIVATE( l, s ) SCHEDULE( STATIC ) + cellloop1 : do k = 1, size(LCOVER0, 1) + L = LCOVER0(k) + s = soilID0(k, h) + if (h .le. nTillHorizons(1)) then + Bd0(k) = Db(s, 1, L) + SMs0(k) = thetaS_till (s, 1, L) * (dpth_t - dpth_f) ! in mm + FC0(k) = thetaFC_till(s, 1, L) * (dpth_t - dpth_f) ! in mm + PW0(k) = thetaPW_till(s, 1, L) * (dpth_t - dpth_f) ! in mm + else + Bd0(k) = DbM(s, 1) + SMs0(k) = thetaS (s, 1) * (dpth_t - dpth_f) ! in mm + FC0(k) = thetaFC(s, 1) * (dpth_t - dpth_f) ! in mm + PW0(k) = thetaPW(s, 1) * (dpth_t - dpth_f) ! in mm + end if + end do cellloop1 + !$OMP END DO + !$OMP END PARALLEL + + tmp_FC0min = minval(FC0(:)) + tmp_FC0max = maxval(FC0(:)) + + if(tmp_FC0min .lt. 0.0_dp) then + print*, "CHECK FC0min, -9999s effected", tmp_FC0min + tmp_FC0min = minval(FC0(cell_id0)) + print*, "NEW FC0min is", tmp_FC0min + end if + + !$OMP PARALLEL + !$OMP DO PRIVATE( l, tmp_rootFractionCoefficient_perviousFC ) SCHEDULE( STATIC ) + celllloop1 : do k = 1, size(LCOVER0, 1) + l = LCOVER0(k) + !================================================================================ + ! fRoots = f[LC] --> (fRoots(H) = 1 - beta^d) + ! see below for comments and references for the use of this simple equation + ! NOTE that in this equation the unit of soil depth is in cm + !================================================================================ + + select case(L) + case(1) + ! forest + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_f * 0.1_dp)) + case(2) + ! impervious + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_f * 0.1_dp)) + case(3) + + select case (processMatrix(3, 1)) + + case(1 : 2) + ! permeable + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_f * 0.1_dp)) + + case(3) + ! permeable + !introducing FC dependency on root frac coef. by Simon Stisen and M. Cuneyd Demirel from GEUS.dk + tmp_rootFractionCoefficient_perviousFC = (((FC0(k) - tmp_FC0min) / & + ((tmp_FC0max - tmp_FC0min)) * tmp_rootFractionCoefficient_clay))& + + ((1 - (FC0(k) - tmp_FC0min) / (tmp_FC0max - tmp_FC0min)) * & + tmp_rootFractionCoefficient_sand) + + if(tmp_rootFractionCoefficient_perviousFC .lt. 0.0_dp .OR. tmp_rootFractionCoefficient_perviousFC .gt. 1.0_dp) & + print*, "CHECK tmp_rootFractionCoefficient_perviousFC", tmp_rootFractionCoefficient_perviousFC + + fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_t * 0.1_dp)) & + - (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_f * 0.1_dp)) + + if((fRoots0(k) .lt. 0.0_dp) .OR. (fRoots0(k) .gt. 1.0_dp)) then + call message('***ERROR: Fraction of roots out of range [0,1]. Cell', & + num2str(k), ' has value ', num2str(fRoots0(k))) + ! stop + end if + end select + end select + + end do celllloop1 + !$OMP END DO + !$OMP END PARALLEL + + ! beta parameter + beta0 = Bd0 * param(4) + + ! Upscale the soil related parameters + L1_SMs(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, SMs0) + L1_beta(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, beta0) + L1_PW(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, PW0) + L1_FC(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, FC0) + L1_fRoots(:, h) = upscale_harmonic_mean(nL0_in_L1, Upp_row_L1, Low_row_L1, & + Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata_dp, fRoots0) + + end do + ! anything else + CASE DEFAULT + call message() + call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') + stop + END SELECT + + + ! below operations are common to all soil databases flags + !$OMP PARALLEL + !------------------------------------------------------------------------ + ! CHECK LIMITS OF PARAMETERS + ! [PW <= FC <= ThetaS] + ! units of all variables are now in [mm] + ! If by any means voilation of this rule appears (e.g. numerical errors) + ! than correct it --> threshold limit = 1% of the upper ones + !------------------------------------------------------------------------ + L1_FC = merge(L1_SMs - 0.01_dp * L1_SMs, L1_FC, L1_FC .gt. L1_SMs) + L1_PW = merge(L1_FC - 0.01_dp * L1_FC, L1_PW, L1_PW .gt. L1_FC) + ! check the physical limit + L1_SMs = merge(0.0001_dp, L1_SMs, L1_SMs .lt. 0.0_dp) + L1_FC = merge(0.0001_dp, L1_FC, L1_FC .lt. 0.0_dp) + L1_PW = merge(0.0001_dp, L1_PW, L1_PW .lt. 0.0_dp) + ! Normalise the vertical root distribution profile such that [sum(fRoots) = 1.0] + !$OMP DO PRIVATE( fTotRoots ) SCHEDULE( STATIC ) + do k = 1, size(L1_fRoots, 1) + fTotRoots = sum(L1_fRoots(k, :), L1_fRoots(k, :) .gt. 0.0_dp) + ! This if clause is necessary for test program but may be redundant in actual program + if (fTotRoots .gt. 0.0_dp) then + L1_fRoots(k, :) = L1_fRoots(k, :) / fTotRoots + else + L1_fRoots(k, :) = 0.0_dp + end If + end do + + !$OMP END DO + !$OMP END PARALLEL + + end subroutine mpr_SMhorizons + +end module mo_mpr_SMhorizons + + diff --git a/src/MPR/mo_mpr_soilmoist.f90 b/src/MPR/mo_mpr_soilmoist.f90 new file mode 100644 index 00000000..12bc8aa4 --- /dev/null +++ b/src/MPR/mo_mpr_soilmoist.f90 @@ -0,0 +1,821 @@ +!> \file mo_mpr_soilmoist.f90 + +!> \brief Multiscale parameter regionalization (MPR) for soil moisture + +!> \details This module contains all routines required for parametrizing +!> soil moisture processes. + +!> \author Stephan Thober, Rohini Kumar +!> \date Dec 2012 + +module mo_mpr_soilmoist + + use mo_kind, only : i4, dp + + implicit none + + public :: mpr_sm + + private + +contains + ! ---------------------------------------------------------------------------- + + ! NAME + ! mpr_sm + + !> \brief multiscale parameter regionalization for soil moisture + + !> \details This subroutine is a wrapper around all soil moisture + !> parameter routines. This subroutine requires 13 parameters. These + !> parameters have to correspond to the parameters in the original + !> parameter array at the following locations: 10-12, 13-18, 27-30.\n + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param( 1) = orgMatterContent_forest \n + !> - param( 2) = orgMatterContent_impervious \n + !> - param( 3) = orgMatterContent_pervious \n + !> - param( 4) = PTF_lower66_5_constant \n + !> - param( 5) = PTF_lower66_5_clay \n + !> - param( 6) = PTF_lower66_5_Db \n + !> - param( 7) = PTF_higher66_5_constant \n + !> - param( 8) = PTF_higher66_5_clay \n + !> - param( 9) = PTF_higher66_5_Db \n + !> - param(10) = PTF_Ks_constant \n + !> - param(11) = PTF_Ks_sand \n + !> - param(12) = PTF_Ks_clay \n + !> - param(13) = PTF_Ks_curveSlope \n + + ! INTENT(IN) + !> \param[in] "real(dp) :: param(13)" - global parameters + !> \param[in] "real(dp) :: nodata" - no data value + !> \param[in] "integer(i4) :: iFlag_soil" - flags for handling multiple soil databases + !> \param[in] "integer(i4) :: is_present(:)" - indicates whether soiltype is present + !> \param[in] "integer(i4) :: nHorizons(:)" - Number of Horizons per soiltype2 + !> \param[in] "integer(i4) :: nTillHorizons(:)" - Number of Tillage Horizons + !> \param[in] "real(dp) :: sand(:,:)" - sand content + !> \param[in] "real(dp) :: clay(:,:)" - clay content + !> \param[in] "real(dp) :: DbM(:,:)" - mineral Bulk density + !> \param[in] "integer(i4) :: L0_ID(:,:)" - cell ids at level 0 + !> \param[in] "integer(i4) :: L0_soilId(:,:)" - soil ids at level 0 + !> \param[in] "integer(i4) :: L0_LUC(:,:)" - land cover ids at level 0 + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: thetaS_till(:,:,:)" - saturated soil moisture tillage layer + !> \param[out] "real(dp) :: thetaFC_till(:,:,:)" - field capacity tillage layer + !> \param[out] "real(dp) :: thetaPW_till(:,:,:)" - permanent wilting point tillage layer + !> \param[out] "real(dp) :: thetaS(:,:)" - saturated soil moisture + !> \param[out] "real(dp) :: thetaFC(:,:)" - field capacity + !> \param[out] "real(dp) :: thetaPW(:,:)" - permanent wilting point + !> \param[out] "real(dp) :: Ks(:,:,:)" - saturated hydraulic conductivity + !> \param[out] "real(dp) :: Db(:,:,:)" - Bulk density + !> \param[out] "real(dp) :: L0_KsVar_H(:,:)" - relative variability of saturated + !> hydraulic counductivity for Horizantal flow + !> \param[out] "real(dp) :: L0_KsVar_V(:,:)" - relative variability of saturated + !> hydraulic counductivity for Vertical flow + !> \param[out] "real(dp) :: L0_SMs_FC(:,:)" - soil mositure deficit from field + !> capacity w.r.t to saturation + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written, Stephan Thober, Dec 2012 + ! Modified, Juliane Mai, Oct 2013 - OLD parametrization + ! --> param(1) = orgMatterContent_forest + ! --> param(2) = orgMatterContent_impervious + ! --> param(3) = orgMatterContent_pervious + ! --> param(4:13) = ... + ! ------------------------------- + ! orgMatterContent_forest = orgMatterContent_perv + delta_1 + ! ------------------------------- + ! NEW parametrization + ! --> param(1) = delta_1 + ! --> param(2) = orgMatterContent_impervious + ! --> param(3) = orgMatterContent_pervious + ! --> param(4:13) = ... + ! Modified, Matthias Zink, Nov 2013 - documentation, inouts --> out + ! moved constants to mhm_constants + ! Modified, Stephan Thober, Mar 2014 - separated cell loop from soil loop for better + ! scaling in parallelisation + ! Modified, David Schaefer, Mar 2015 - Added dummy variable to avoid redundant computations + ! -> Total number of instruction is reduced by ~25% + ! (tested on packaged example/gnu48/{release,debug}) + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + subroutine mpr_sm(param, & ! IN: global parameter set + is_present, & ! IN: flag indicating presence of soil + nHorizons, & ! IN: Number of Horizons of Soiltype + nTillHorizons, & ! IN: Number of tillage Horizons + sand, & ! IN: sand content + clay, & ! IN: clay content + DbM, & ! IN: mineral Bulk density + ID0, & ! IN: cell ids at level 0 + soilId0, & ! IN: soil ids at level 0 + LCover0, & ! IN: land cover ids at level 0 + thetaS_till, & ! OUT: saturated soil moisture tillage layer + thetaFC_till, & ! OUT: field capacity tillage layer + thetaPW_till, & ! OUT: permanent wilting point tillage layer + thetaS, & ! OUT: saturated soil moisture + thetaFC, & ! OUT: field capacity + thetaPW, & ! OUT: permanent wilting point + Ks, & ! OUT: saturated hydraulic conductivity + Db, & ! OUT: Bulk density + KsVar_H0, & ! OUT: relative variability of saturated + ! ! hydraulic counductivity for Horizantal flow + KsVar_V0, & ! OUT: relative variability of saturated + ! ! hydraulic counductivity for Horizantal flow + SMs_FC0 & ! OUT: soil moisture deficit from field capacity + ! ! w.r.t to saturation + ) + + use mo_mpr_constants, only : BulkDens_OrgMatter + use mo_common_constants, only : nodata_dp, nodata_i4 + use mo_mpr_global_variables, only : iFlag_soilDB + use mo_message, only : message + !$ use omp_lib + + implicit none + + ! Input -------------------------------------------------------------------- + real(dp), dimension(13), intent(in) :: param ! global parameters + + integer(i4), dimension(:), intent(in) :: is_present ! indicates whether soiltype is present + integer(i4), dimension(:), intent(in) :: nHorizons ! Number of Horizons per soiltype + integer(i4), dimension(:), intent(in) :: nTillHorizons! Number of Tillage Horizons + real(dp), dimension(:, :), intent(in) :: sand ! sand content + real(dp), dimension(:, :), intent(in) :: clay ! clay content + real(dp), dimension(:, :), intent(in) :: DbM ! mineral Bulk density + integer(i4), dimension(:), intent(in) :: ID0 ! cell ids at level 0 + integer(i4), dimension(:, :), intent(in) :: soilId0 ! soil ids at level 0 + integer(i4), dimension(:), intent(in) :: LCOVER0 ! land cover ids at level 0 + + + ! Output ------------------------------------------------------------------- + real(dp), dimension(:, :, :), intent(out) :: thetaS_till ! saturated soil moisture tillage layer + real(dp), dimension(:, :, :), intent(out) :: thetaFC_till ! field capacity tillage layer + real(dp), dimension(:, :, :), intent(out) :: thetaPW_till ! permanent wilting point tillage layer + real(dp), dimension(:, :), intent(out) :: thetaS ! saturated soil moisture + real(dp), dimension(:, :), intent(out) :: thetaFC ! field capacity + real(dp), dimension(:, :), intent(out) :: thetaPW ! permanent wilting point + real(dp), dimension(:, :, :), intent(out) :: Ks ! saturated hydraulic conductivity + real(dp), dimension(:, :, :), intent(out) :: Db ! Bulk density + real(dp), dimension(:), intent(out) :: KsVar_H0 ! rel. var. of Ks for horizontal flow + real(dp), dimension(:), intent(out) :: KsVar_V0 ! rel. var. of Ks for vertical flow + real(dp), dimension(:), intent(out) :: SMs_FC0 ! soil mositure deficit from + ! ! field cap. w.r.t to saturation + ! Local variables + integer(i4) :: i ! loop index + integer(i4) :: j ! loop index + integer(i4) :: l ! loop index + integer(i4) :: s ! dummy variable for storing soil class + integer(i4) :: tmp_minSoilHorizon + real(dp) :: pM + real(dp) :: pOM + real(dp) :: Ks_tmp ! temporal saturated hydr. cond + real(dp) :: Genu_Mual_n ! van Genuchten shape param + real(dp) :: Genu_Mual_alpha ! van Genuchten shape param + real(dp) :: tmp_orgMatterContent_forest + real(dp) :: tmp_orgMatterContent_pervious + real(dp) :: tmp_orgMatterContent_impervious + real(dp), dimension(:), allocatable :: SMs_tot0 ! total saturated soil mositure content + integer(i4) :: max_LCover ! maximum LCover class in L0 + ! some additional variables for iFlag_soil = 1 + real(dp), dimension(:, :), allocatable :: Ks_non_till ! saturated hydraulic conductivity + + tmp_orgMatterContent_forest = param(3) + param(1) + tmp_orgMatterContent_impervious = param(2) + tmp_orgMatterContent_pervious = param(3) + tmp_minSoilHorizon = minval(nTillHorizons(:)) + + ! allocatable local variables + ! total saturated soil moisture content + allocate(SMs_tot0(size(ID0, 1))) + + ! some additional variables for iFlag_soil = 1 + if(iFlag_soilDB .eq. 1) then + s = size(is_present, 1) + ! note: although second dimension is not required + ! we assign value 1 to be comparable to other assigned variables + allocate(Ks_non_till(s, 1)) + end if + + ! initializing soil hydraulic properties related params + KsVar_H0 = merge(0.0_dp, nodata_dp, ID0 .ne. nodata_i4) + KsVar_V0 = merge(0.0_dp, nodata_dp, ID0 .ne. nodata_i4) + SMs_tot0 = merge(0.0_dp, nodata_dp, ID0 .ne. nodata_i4) + SMs_FC0 = merge(0.0_dp, nodata_dp, ID0 .ne. nodata_i4) + + ! initialization + thetaS_till = 0.0_dp + thetaFC_till = 0.0_dp + thetaPW_till = 0.0_dp + thetaS = 0.0_dp + thetaFC = 0.0_dp + thetaPW = 0.0_dp + Ks = 0.0_dp + Db = 0.0_dp + if(allocated(Ks_non_till)) Ks_non_till = 0.0_dp + ! TODO: is it necessary to loop over 1:maxval, isn't it required to only loop over existing classes?! + max_LCover = maxval(LCOVER0) + ! select case according to a given soil database flag + SELECT CASE(iFlag_soilDB) + ! classical mHM soil database format + CASE(0) + !$OMP PARALLEL default(shared) + !$OMP DO & + !$OMP PRIVATE( i, j, L, pOM, pM, Ks_tmp, Genu_Mual_alpha, Genu_Mual_n ) & + !$OMP SCHEDULE( STATIC ) + do i = 1, size(is_present) + if (is_present(i) .lt. 1) cycle + horizon : do j = 1, nHorizons(i) + ! calculating vertical hydraulic conductivity + call hydro_cond(Ks_tmp, param(10 : 13), sand(i, j), clay(i, j)) + Ks(i, j, :) = Ks_tmp + ! calculating other soil hydraulic properties + ! tillage horizons + if (j .le. nTillHorizons(i)) then + ! LC class + do L = 1, max_LCover + select case (L) + case(1) ! forest + pOM = tmp_orgMatterContent_forest + case(2) ! impervious + pOM = tmp_orgMatterContent_impervious !param(2) + case(3) ! permeable + pOM = tmp_orgMatterContent_pervious + case default + stop 'Error mpr_sm: pOM used uninitialized.' + end select + pM = 100.0_dp - pOM + ! bulk density acording to Rawl's (1982) paper + Db(i, j, L) = 100.0_dp / ((pOM / BulkDens_OrgMatter) + (pM / DbM(i, j))) + ! Effect of organic matter content + ! This is taken into account in a simplified form by using + ! the ratio of(Bd / BdOM) + Ks_tmp = Ks_tmp * (DbM(i, j) / Db(i, j, L)) + Ks(i, j, L) = Ks_tmp + ! estimated SMs_till & van Genuchten's shape parameter (n) + call Genuchten(thetaS_till(i, j, L), Genu_Mual_n, Genu_Mual_alpha, & + param(4 : 9), sand(i, j), clay(i, j), Db(i, j, L)) + ! estimating field capacity + call field_cap(thetaFC_till(i, j, L), Ks_tmp, thetaS_till(i, j, L), Genu_Mual_n) + ! estimating permanent wilting point + call PWP(Genu_Mual_n, Genu_Mual_alpha, thetaS_till(i, j, L), thetaPW_till(i, j, L)) + end do + ! deeper layers + else + ! estimate SMs & van Genuchten's shape parameter (n) + call Genuchten(thetaS(i, j - tmp_minSoilHorizon), Genu_Mual_n, Genu_Mual_alpha, & + param(4 : 9), sand(i, j), clay(i, j), DbM(i, j)) + ! estimate field capacity + call field_cap(thetaFC(i, j - tmp_minSoilHorizon), & + Ks_tmp, thetaS(i, j - tmp_minSoilHorizon), Genu_Mual_n) + ! estimate permanent wilting point + call PWP(Genu_Mual_n, Genu_Mual_alpha, thetaS(i, j - tmp_minSoilHorizon), & + thetaPW(i, j - tmp_minSoilHorizon)) + end if + end do horizon + end do + !$OMP END DO + + ! calculate other soil properties at each location [L0] for regionalising model parameters + !$OMP DO PRIVATE( s, j ) SCHEDULE( STATIC ) + cellloop : do i = 1, size(soilId0, 1) !>> here = ncells0 + s = soilId0(i, 1) !>> in this case the second dimension of soilId0 = 1 + do j = 1, nHorizons(s) + if (j .le. nTillHorizons(s)) then + ! Soil properties over the whole soil coloum depth + KsVar_H0(i) = KsVar_H0(i) + thetaS_till(s, j, LCover0(i)) * Ks(s, j, LCover0(i)) + KsVar_V0(i) = KsVar_V0(i) + thetaS_till(s, j, LCover0(i)) / Ks(s, j, LCover0(i)) + SMs_FC0(i) = SMs_FC0(i) + thetaFC_till(s, j, LCover0(i)) + SMs_tot0(i) = SMs_tot0(i) + thetaS_till (s, j, LCover0(i)) + else + ! soil_properties over the whole soil column + KsVar_H0(i) = KsVar_H0(i) + thetaS(s, j - tmp_minSoilHorizon) * Ks(s, j, 1) + KsVar_V0(i) = KsVar_V0(i) + thetaS(s, j - tmp_minSoilHorizon) / Ks(s, j, 1) + SMs_FC0(i) = SMs_FC0(i) + thetaFC(s, j - tmp_minSoilHorizon) + SMs_tot0(i) = SMs_tot0(i) + thetaS (s, j - tmp_minSoilHorizon) + end if + end do + ! ------------------------------------------------------------------ + ! DETERMINE RELATIVE VARIABILITIES OF + ! Ks FOR HORIZONTAL FLOW (KsVar_H) + ! & + ! Ks FOR VERTICAL FLOW (KsVar_V) + ! ------------------------------------------------------------------ + ! soil moisture saturation deficit relative to the field capacity soil moisture + SMs_FC0(i) = (SMs_tot0(i) - SMs_FC0(i)) / SMs_tot0(i) + ! Ks variability over the whole soil coloum depth for + ! both horizontal and vertical flows including relative variabilities + KsVar_H0(i) = KsVar_H0(i) / SMs_tot0(i) / param(13) + KsVar_V0(i) = SMs_tot0(i) / KsVar_V0(i) / param(13) + end do cellloop + !$OMP END DO + !$OMP END PARALLEL + + ! to handle multiple soil horizons with unique soil class + CASE(1) + do i = 1, size(is_present) + if (is_present(i) .lt. 1) cycle + ! **** FOR THE TILLAGE TYPE OF SOIL ***** + ! there is actually no soil horizons/soil type in this case + ! but we assign of j = 1 to use variables as defined in the classical option (iFlag_soil = 0) + do j = 1, 1 + ! calculating vertical hydraulic conductivity + call hydro_cond(Ks_tmp, param(10 : 13), sand(i, j), clay(i, j)) + Ks_non_till(i, j) = Ks_tmp !>> non-till + Ks(i, j, :) = Ks_tmp !>> till layers + ! calculating other soil hydraulic properties + ! tillage horizons properties depending on the LC class + do L = 1, max_LCover + select case (L) + case(1) ! forest + pOM = tmp_orgMatterContent_forest + case(2) ! impervious + pOM = tmp_orgMatterContent_impervious !param(2) + case(3) ! permeable + pOM = tmp_orgMatterContent_pervious + case default + STOP 'Error mpr_sm: pOM used is not initialized.' + end select + pM = 100.0_dp - pOM + ! bulk density acording to Rawl's (1982) paper + Db(i, j, L) = 100.0_dp / ((pOM / BulkDens_OrgMatter) + (pM / DbM(i, j))) + ! Effect of organic matter content on Ks estimates + ! This is taken into account in a simplified form by using + ! the ratio of (Bd/BdOM) + Ks_tmp = Ks_tmp * (DbM(i, j) / Db(i, j, L)) + Ks(i, j, L) = Ks_tmp + ! estimated SMs_till & van Genuchten's shape parameter (n) + call Genuchten(thetaS_till(i, j, L), Genu_Mual_n, Genu_Mual_alpha, & + param(4 : 9), sand(i, j), clay(i, j), Db(i, j, L)) + ! estimating field capacity + call field_cap(thetaFC_till(i, j, L), Ks_tmp, thetaS_till(i, j, L), Genu_Mual_n) + ! estimating permanent wilting point + call PWP(Genu_Mual_n, Genu_Mual_alpha, thetaS_till(i, j, L), thetaPW_till(i, j, L)) + end do + + ! *** FOR NON-TILLAGE TYPE OF SOILS *** + ! note j = 1 + ! since Ks_tmp has changed earlier ... get the original Ks once again + Ks_tmp = Ks_non_till(i, j) + ! estimate SMs & van Genuchten's shape parameter (n) + call Genuchten(thetaS(i, j), Genu_Mual_n, Genu_Mual_alpha, param(4 : 9), sand(i, j), clay(i, j), DbM(i, j)) + ! estimate field capacity + call field_cap(thetaFC(i, j), Ks_tmp, thetaS(i, j), Genu_Mual_n) + ! estimate permanent wilting point + call PWP(Genu_Mual_n, Genu_Mual_alpha, thetaS(i, j), thetaPW(i, j)) + + end do !>> HORIZON + end do !>> SOIL TYPE + + ! calculate other soil properties at each location [L0] for regionalising model parameters + do i = 1, size(soilId0, 1) !! over all cells + do j = 1, size(soilId0, 2) !! over horizons + s = soilId0(i, j) + if (j .le. nTillHorizons(1)) then + ! soil properties over the whole soil coloum depth + KsVar_H0(i) = KsVar_H0(i) + thetaS_till (s, 1, LCover0(i)) * Ks(s, 1, LCover0(i)) + KsVar_V0(i) = KsVar_V0(i) + thetaS_till (s, 1, LCover0(i)) / Ks(s, 1, LCover0(i)) + SMs_FC0(i) = SMs_FC0 (i) + thetaFC_till(s, 1, LCover0(i)) + SMs_tot0(i) = SMs_tot0(i) + thetaS_till (s, 1, LCover0(i)) + else + ! soil_properties over the whole soil column + KsVar_H0(i) = KsVar_H0(i) + thetaS (s, 1) * Ks_non_till(s, 1) + KsVar_V0(i) = KsVar_V0(i) + thetaS (s, 1) / Ks_non_till(s, 1) + SMs_FC0(i) = SMs_FC0 (i) + thetaFC(s, 1) + SMs_tot0(i) = SMs_tot0(i) + thetaS (s, 1) + end if + end do + ! ------------------------------------------------------------------ + ! DETERMINE RELATIVE VARIABILITIES OF + ! Ks FOR HORIZONTAL FLOW (KsVar_H) & Ks FOR VERTICAL FLOW (KsVar_V) + ! ------------------------------------------------------------------ + ! soil moisture saturation deficit relative to the field capacity soil moisture + SMs_FC0(i) = (SMs_tot0(i) - SMs_FC0(i)) / SMs_tot0(i) + ! Ks variability over the whole soil coloum depth for + ! both horizontal and vertical flows including relative variabilities + KsVar_H0(i) = KsVar_H0(i) / SMs_tot0(i) / param(13) + KsVar_V0(i) = SMs_tot0(i) / KsVar_V0(i) / param(13) + end do + + CASE DEFAULT + call message() + call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') + stop + END SELECT + + ! free space ** + deallocate(SMs_tot0) + if(allocated(Ks_non_till)) deallocate(Ks_non_till) + + end subroutine mpr_sm + + ! ------------------------------------------------------------------ + + ! NAME + ! PWP + + !> \brief Permanent Wilting point + + !> \details This subroutine calculates the permanent wilting + !> point according to Zacharias et al. (2007, Soil Phy.) and + !> using van Genuchten 1980's equation. For the water retention curve at + !> a matrix potential of -1500 kPa, it is assumed that thetaR = 0. + + ! INTENT(IN) + !> \param[in] "real(dp) :: Genu_Mual_n" - Genuchten shape parameter + !> \param[in] "real(dp) :: Genu_Mual_alpha" - Genuchten shape parameter + !> \param[in] "real(dp) :: thetaS" - saturated water content + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: thetaPWP" - Permanent Wilting point + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! Zacharias et al. 2007, Soil Phy. + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec, 2012 + ! Written, Stephan Thober, Dec 2012 + ! Modified, Matthias Zink, Nov 2013 - documentation, moved constants to mhm_constants + ! ------------------------------------------------------------------ + + elemental pure subroutine PWP(Genu_Mual_n, Genu_Mual_alpha, thetaS, thetaPWP) + + use mo_mpr_constants, only : PWP_c ! constant for m, + use mo_mpr_constants, only : PWP_matPot_ThetaR ! matrix potential of 1500 kPa, assumed as thetaR = 0 + + implicit none + + ! Input + real(dp), intent(in) :: Genu_Mual_n ! Genuchten shape parameters + real(dp), intent(in) :: Genu_Mual_alpha ! Genuchten shape parameters + real(dp), intent(in) :: thetaS ! saturated water content + + ! Output + real(dp), intent(out) :: thetaPWP ! Permanent wilting point + + ! Local variable + real(dp) :: x + real(dp) :: Genu_Mual_m ! Genuchten shape parameter + + Genu_Mual_m = PWP_c - (PWP_c / Genu_Mual_n) + x = PWP_c + exp(Genu_Mual_n * log(Genu_Mual_alpha * PWP_matPot_ThetaR)) + x = exp(Genu_Mual_m * log(x)) + ! constrain + if (x < 1.0_dp) x = 1.0_dp + thetaPWP = thetaS / x + + end subroutine PWP + + ! ---------------------------------------------------------------------------- + + ! NAME + ! field_cap + + !> \brief calculates the field capacity + + !> \details estimate Field capacity; FC -- Flux based + !> approach (Twarakavi, et. al. 2009, WRR) \n + !> According to the + !> above reference FC is defined as the soil water content at + !> which the drainage from a profile ceases under natural + !> conditions. Since drainage from a soil profile in a simulation + !> never becomes zero, we assume that drainage ceases when the + !> bottom flux from the soil reaches a value that is equivalent to + !> the minimum amount of precipitation that could be recorded + !> (i.e. 0.01 cm/d == 1 mm/d). It is assumed that ThetaR = 0.0_dp + + ! INTENT(IN) + !> \param[in] "real(dp) :: Ks" - saturated hydraulic conductivity + !> \param[in] "real(dp) :: thetaS" - saturated water content + !> \param[in] "real(dp) :: Genu_Mual_n" - Genuchten shape parameter + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: thetaFC" - Field capacity + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! Twarakavi, et. al. 2009, WRR + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written, Stephan Thober, Dec 2012 + ! Modified, Matthias Zink, Nov 2013 - documentation, moved constants to mhm_constants + + + elemental pure subroutine field_cap(thetaFC, & ! Output + Ks, thetaS, Genu_Mual_n) ! Input + + use mo_mpr_constants, only : field_cap_c1, field_cap_c2 + + implicit none + + ! Input + real(dp), intent(in) :: Ks ! saturated hydraulic conductivity + real(dp), intent(in) :: thetaS ! saturated water content + real(dp), intent(in) :: Genu_Mual_n ! Genuchten shape parameter + + ! Output + real(dp), intent(out) :: thetaFC ! Field capacity + + ! Local variable + real(dp) :: x + + x = (field_cap_c1) * (field_cap_c2 + log10(Ks)) + thetaFC = thetaS * exp(x * log(Genu_Mual_n)) + + end subroutine field_cap + + ! ---------------------------------------------------------------------------- + + ! NAME + ! Genuchten + + !> \brief calculates the Genuchten shape parameter + + !> \details estimate SMs_till & van Genuchten's shape parameter (n) + !> (Zacharias et al, 2007, soil Phy.)\n + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param( 1) = PTF_lower66_5_constant \n + !> - param( 2) = PTF_lower66_5_clay \n + !> - param( 3) = PTF_lower66_5_Db \n + !> - param( 4) = PTF_higher66_5_constant \n + !> - param( 5) = PTF_higher66_5_clay \n + !> - param( 6) = PTF_higher66_5_Db \n + + ! INTENT(IN) + !> \param[in] "real(dp) :: param(6)" - given parameters + !> \param[in] "real(dp) :: sand" - [%] sand content + !> \param[in] "real(dp) :: clay" - [%] clay content + !> \param[in] "real(dp) :: Db" - [10^3 kg/m3] bulk density + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: thetaS" - saturated water content + !> \param[out] "real(dp) :: Genu_Mual_n" - van Genuchten shape parameter + !> \param[out] "real(dp) :: Genu_Mual_alpha" - van Genuchten shape parameter + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! Zacharias et al, 2007, soil Phy. + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written, Stephan Thober, Dec 2012 + ! Modified, Rohini Kumar , Mar 2014 - ThetaS limit changed from 0 to 0.001 + + subroutine Genuchten(thetaS, Genu_Mual_n, Genu_Mual_alpha, & ! Output variables + param, sand, clay, Db) ! Input variables + + use mo_mpr_constants, only : vGenuchten_sandtresh, & ! van Genuchten snad treshold + vGenuchtenN_c1, & ! constants for van Genuchten n + vGenuchtenN_c2, & ! constants for van Genuchten n + vGenuchtenN_c3, & ! constants for van Genuchten n + vGenuchtenN_c4, & ! constants for van Genuchten n + vGenuchtenN_c5, & ! constants for van Genuchten n + vGenuchtenN_c6, & ! constants for van Genuchten n + vGenuchtenN_c7, & ! constants for van Genuchten n + vGenuchtenN_c8, & ! constants for van Genuchten n + vGenuchtenN_c9, & ! constants for van Genuchten n + vGenuchtenN_c10, & ! constants for van Genuchten n + vGenuchtenN_c11, & ! constants for van Genuchten n + vGenuchtenN_c12, & ! constants for van Genuchten n + vGenuchtenN_c13, & ! constants for van Genuchten n + vGenuchtenN_c14, & ! constants for van Genuchten n + vGenuchtenN_c15, & ! constants for van Genuchten n + vGenuchtenN_c16, & ! constants for van Genuchten n + vGenuchtenN_c17, & ! constants for van Genuchten n + vGenuchtenN_c18 ! constants for van Genuchten n + + implicit none + + ! Input + real(dp), dimension(6), intent(in) :: param ! parameters + real(dp), intent(in) :: sand ! sand content + real(dp), intent(in) :: clay ! clay content + real(dp), intent(in) :: Db ! [10^3 kg/m3] bulk density + + ! Output + real(dp), intent(out) :: thetaS ! saturated water content + real(dp), intent(out) :: Genu_Mual_n ! van Genuchten shape parameter + real(dp), intent(out) :: Genu_Mual_alpha ! van Genuchten shape parameter + + ! Local variables + real(dp) :: x ! temporal variable + + ! estimate SMs_till & van Genuchten's parameters (alpha and n) + if (sand < vGenuchten_sandtresh) then + thetaS = param(1) + param(2) * clay + param(3) * Db + Genu_Mual_n = vGenuchtenN_c1 - vGenuchtenN_c2 * (sand**(vGenuchtenN_c3)) + & + vGenuchtenN_c4 * (clay**(vGenuchtenN_c5)) + x = vGenuchtenN_c6 + vGenuchtenN_c7 * sand + vGenuchtenN_c8 * clay - & + vGenuchtenN_c9 * Db + else + thetaS = param(4) + param(5) * clay + param(6) * Db + Genu_Mual_n = vGenuchtenN_c10 + vGenuchtenN_c11 * (sand**(vGenuchtenN_c12)) + & + vGenuchtenN_c13 * (clay**(vGenuchtenN_c14)) + x = vGenuchtenN_c15 + vGenuchtenN_c16 * sand + vGenuchtenN_c17 * clay - & + vGenuchtenN_c18 * Db + end if + + ! Mualem alpha + Genu_Mual_alpha = exp(x) + + ! hard coded limits, according to (Zacharias et al, 2007, soil Phy.) + if (thetaS < 0.01_dp) then + write(*, *) 'thetaS below threshold limit 1e-2, reset.' + ! Put constrains on theta_S + thetaS = 0.01_dp + end if + if (thetaS > 1.0_dp) then + write(*, *) 'thetaS above 1, reset.' + ! Put constrains on theta_S + thetaS = 1.0_dp + end if + if (Genu_Mual_n < 1.01000_dp) then + write(*, *) 'Genu_Mual_n below threshold limit 1.01, reset.' + Genu_Mual_n = 1.01000_dp + end if + if (Genu_Mual_alpha < 0.00001_dp) then + write(*, *) 'Genu_Mual_alpha below threshold limit 1e-5, reset.' + Genu_Mual_alpha = 0.00001_dp + end if + + end subroutine Genuchten + + ! ---------------------------------------------------------------------------- + + ! NAME + ! hydro_cond + + !> \brief calculates the hydraulic conductivity Ks + + !> \details By default save this value of Ks, particularly for the + !> deeper layers where OM content plays relatively low or no role\n + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = PTF_Ks_constant \n + !> - param(2) = PTF_Ks_sand \n + !> - param(3) = PTF_Ks_clay \n + !> - param(4) = PTF_Ks_curveSlope \n + + ! INTENT(IN) + !> \param[in] "real(dp) :: param(4)" - given parameters + !> \param[in] "real(dp) :: sand" - [%] sand content + !> \param[in] "real(dp) :: clay" - [%] clay content + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: Ks" - hydraulic conductivity + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written, Stephan Thober, Dec 2012 + ! Modified, Matthias Zink, Nov 2013 - documentation, moved constants to mhm_constants + ! Matthias Cuntz, Jun 2014 - suggested to fix param(4) + + subroutine hydro_cond(KS, param, sand, clay) + + use mo_mpr_constants, only : Ks_c + + implicit none + + ! Input + real(dp), dimension(4), intent(in) :: param + real(dp), intent(in) :: sand + real(dp), intent(in) :: clay + + ! Output + real(dp), intent(out) :: KS + + ! Local variables + real(dp) :: x ! temporal variable + + ! saturated vertical hydraulic conductivity, Ks (cm/d) + ! from Cosby et. al. (WRR 1984) Table 4 + ! param(4) is the unit conversion from inch/h to cm/d and should be a constant. + ! Fix it in the namelist, i.e. in + ! mhm_parameter.nml set the 4th value (=FLAG) to 0 and the third value to 60.96 + ! PTF_Ks_curveSlope = 60.96, 60.96, 60.96, 0, 1 + x = param(1) + param(2) * sand - param(3) * clay + Ks = param(4) * exp(X * log(Ks_c)) + + if (Ks < 1.10_dp) then + write(*, *) 'JMJMJM-Ks-BAD' + end if + + ! minimum value of Ks = 1.1cm/d + if (Ks < 1.10_dp) Ks = 1.10_dp + + end subroutine hydro_cond + +end module mo_mpr_soilmoist diff --git a/src/MPR/mo_mpr_startup.f90 b/src/MPR/mo_mpr_startup.f90 new file mode 100644 index 00000000..2cb38792 --- /dev/null +++ b/src/MPR/mo_mpr_startup.f90 @@ -0,0 +1,600 @@ +!> \file mo_startup.f90 + +!> \brief Startup procedures for mHM. + +!> \details This module initializes all variables required to run mHM. This +!> module needs to be run only one time at the beginning of a simulation if +!> re-starting files do not exist. + +!> \author Luis Samaniego, Rohini Kumar +!> \date Dec 2012 + +MODULE mo_mpr_startup + + ! This module provides the startup routines for mHM. + + ! Written Luis Samaniego, Rohini Kumar, Dec 2012 + + USE mo_kind, ONLY : i4, dp + use mo_common_constants, only : nodata_i4, nodata_dp ! global nodata values (i4, dp) + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: mpr_initialize, init_eff_params ! initialization sequence + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! initialise + + ! PURPOSE + !> \brief Initialize main mHM variables + + !> \details Initialize main mHM variables for a given basin. \n + !> Calls the following procedures in this order:\n + !> - Constant initialization. \n + !> - Generate soil database. \n + !> - Checking inconsistencies input fields. \n + !> - Variable initialization at level-0. \n + !> - Variable initialization at level-1. \n + !> - Variable initialization at level-11. \n + !> - Space allocation of remaining variable/parameters. \n + !> Global variables will be used at this stage. \n + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" basin id + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Luis Samaniego, Rohini Kumar + !> \date Dec 2012 + ! Modified Luis Samaniego, Mar 2008 - fully distributed multilayer + ! Rohini Kumar, Oct 2010 - matrix to vector version + ! - openmp parallelization + ! - routing level 11 + ! Luis Samaniego, Jul 2012 - removal of IMSL dependencies + ! Luis Samaniego, Dec 2012 - modular version + ! Rohini Kumar, May 2013 - code cleaned and error checks + ! Rohini Kumar, Nov 2013 - updated documentation + ! Stephan Thober, Jun 2014 - copied L2 initialization from mo_meteo_forcings + ! Stephan Thober, Jun 2014 - updated flag for read_restart + ! Stephan Thober, Aug 2015 - removed initialisation of routing + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + + subroutine mpr_initialize() + + use mo_kind, only : i4 + use mo_common_variables, only : & + L0_Basin, & + level0, level1, l0_l1_remap, nBasins, resolutionHydrology + ! dirRestartIn + use mo_soil_database, only : generate_soil_database + use mo_grid, only : init_lowres_level, set_basin_indices + use mo_read_latlon, only : read_latlon + + implicit none + + integer(i4) :: iBasin + + ! soilDB common for all basins + call generate_soil_database() + + allocate(level1(nBasins)) + allocate(l0_l1_remap(nBasins)) + + ! L0 and L1 initialization + do iBasin = 1, nBasins + if (iBasin .eq. 1) then + call L0_check_input(L0_Basin(iBasin)) + call L0_variable_init(L0_Basin(iBasin)) + else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1)) then + ! this needs only be done if there is new input + call L0_check_input(L0_Basin(iBasin)) + call L0_variable_init(L0_Basin(iBasin)) + end if + + call init_lowres_level(level0(L0_Basin(iBasin)), resolutionHydrology(iBasin), & + level1(iBasin), l0_l1_remap(iBasin)) + ! read lat lon coordinates for level 1 + call read_latlon(iBasin, "lon", "lat", "level1", level1(iBasin)) + + ! Parameter fields have to be allocated in any case + call init_eff_params(level1(iBasin)%nCells) + + end do + + call set_basin_indices(level1) + + end subroutine mpr_initialize + + + ! ------------------------------------------------------------------ + + ! NAME + ! L0_check_input + + !> \brief Check for errors in L0 input data + + !> \details Check for possible errors in input data (morphological and land cover) at level-0 + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" basin id + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + ! \author Rohini Kumar + ! \date Jan 2013 + ! Modified + ! Rohini Kumar, Aug 2013 - added iFlag_LAI_data_format to handle LAI options, + ! and changed within the code made accordingly + ! Rohini Kumar, Sep 2013 - read input data for routing processes according + ! & Stephan Thober, to process_matrix flag + ! Stephan Thober, Aug 2015 - moved check of L0 routing variables to mRM + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + + subroutine L0_check_input(iBasin) + + use mo_mpr_global_variables, only : & + L0_slope, L0_asp, & + nSoilHorizons_mHM, & ! soil horizons info for mHM + L0_geoUnit, & + L0_soilId, & ! soil class ID on input resolution (L0) + iFlag_soilDB, & ! options to handle different types of soil databases + L0_gridded_LAI, & + timeStep_LAI_input + use mo_common_variables, only : & + nLCoverScene, L0_elev, L0_LCover, level0 + use mo_common_constants, only : eps_dp + use mo_message, only : message, message_text + use mo_string_utils, only : num2str + use mo_utils, only : eq + + implicit none + + integer(i4), intent(in) :: iBasin + + ! local variables + integer(i4) :: k, n, nH + + ! START CHECKING VARIABLES + do k = level0(iBasin)%iStart, level0(iBasin)%iEnd + + ! elevation [m] + if (abs(L0_elev(k) - nodata_dp) .lt. eps_dp) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(iBasin, '(I5)')) + call message(' Error: elevation has missing value within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if + + ! slope [%] + if (abs(L0_slope(k) - nodata_dp) .lt. eps_dp) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(iBasin, '(I5)')) + call message(' Error: slope has missing value within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if + + ! aspect [degree] + if (abs(L0_asp(k) - nodata_dp) .lt. eps_dp) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(iBasin, '(I5)')) + call message(' Error: aspect has missing values within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if + + ! soil-Id [-] + nH = 1 !> by default; when iFlag_soilDB = 0 + if (iFlag_soilDB .eq. 1) nH = nSoilHorizons_mHM + ! another option to handle multiple soil horizons properties + do n = 1, nH + if (L0_soilId(k, n) .eq. nodata_i4) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(iBasin, '(I5)')) // ',' // trim(num2str(n, '(I5)')) + call message(' Error: soil id has missing values within the valid masked area at cell in basin and horizon ', & + trim(message_text)) + stop + end if + end do + + ! geological-Id [-] + if (L0_geoUnit(k) .eq. nodata_i4) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(iBasin, '(I5)')) + call message(' Error: geological formation id has missing values within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if + + ! landcover scenes + do n = 1, nLCoverScene + if (L0_LCover(k, n) .eq. nodata_i4) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(iBasin, '(I5)')) // ',' // trim(num2str(n, '(I5)')) + call message(' Error: land cover id has missing values within the valid masked area at cell in basin and scene ', & + trim(message_text)) + stop + end if + end do + + ! land cover scenes related to LAI + if(timeStep_LAI_input .EQ. 0) then + if (eq(L0_gridded_LAI(k, 1), nodata_dp)) then + message_text = trim(num2str(k, '(G5.3)')) // ',' // trim(num2str(iBasin, '(I5)')) + call message(' Error: gridded LAI has missing values within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if + end if + + end do + + end subroutine L0_check_input + + ! ------------------------------------------------------------------ + + ! NAME + ! L0_variable_init + + !> \brief level 0 variable initialization + + !> \details following tasks are performed for L0 data sets + !> - cell id & numbering + !> - storage of cell cordinates (row and coloum id) + !> - empirical dist. of terrain slope + !> - flag to determine the presence of a particular soil id + !> in this configuration of the model run + !> If a variable is added or removed here, then it also has to + !> be added or removed in the subroutine config_variables_set in + !> module mo_restart and in the subroutine set_config in module + !> mo_set_netcdf_restart + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" basin id + + ! INTENT(INOUT) + !> \param[in,out] "integer(i4), dimension(:) :: soilId_isPresent" + !> flag to indicate wether a given soil-id is present or not, DIMENSION [nSoilTypes] + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + ! \author Rohini Kumar + ! \date Jan 2013 + ! Modified + ! Rohini Kumar & Matthias Cuntz, May 2014 - cell area calulation based on a regular lat-lon grid or + ! on a regular X-Y coordinate system + ! Matthias Cuntz, May 2014 - changed empirical distribution function + ! so that doubles get the same value + ! Matthias Zink & Matthias Cuntz, Feb 2016 - code speed up due to reformulation of CDF calculation + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + ! Maren Kaluza, Feb 2018 - removed slope_val, temp, only sort the index to speed + ! up finding the empirical distribution slope_emp + + subroutine L0_variable_init(iBasin) + + use mo_mpr_global_variables, only : L0_slope, & + L0_slope_emp, & + L0_soilId, & ! soil class ID on input resolution (L0) + iFlag_soilDB, soilDB, & ! options to handle different types of soil databases + nSoilHorizons_mHM, & ! soil horizons info for mHM + nSoilTypes + use mo_common_variables, only : level0 + use mo_append, only : append + use mo_orderpack, only : sort_index + use mo_utils, only : eq + use mo_grid, only : L0_grid_setup + + implicit none + + integer(i4), intent(in) :: iBasin + + ! local variables + real(dp), dimension(:), allocatable :: slope_emp + integer(i4), dimension(:), allocatable :: slope_sorted_index + + integer(i4) :: i, j, k, nH, i_sort, i_sortpost + + !-------------------------------------------------------- + ! STEPS:: + ! 1) Estimate each variable locally for a given basin + ! 2) Pad each variable to its corresponding global one + !-------------------------------------------------------- + + !------------------------------------------------------ + ! Assign whether a given soil type is present or not + !------------------------------------------------------ + if (iBasin .eq. 1) then + allocate(soilDB%is_present(nSoilTypes)) + soilDB%is_present(:) = 0_i4 + end if + + call L0_grid_setup(level0(iBasin)) + + !--------------------------------------------------- + ! Estimate empirical distribution of slope + !--------------------------------------------------- + allocate(slope_emp(level0(iBasin)%nCells), slope_sorted_index(level0(iBasin)%nCells)) + + ! get sorted data and sorted indexes to remap later + slope_sorted_index = sort_index(L0_slope(level0(iBasin)%iStart : level0(iBasin)%iEnd)) + + ! empirical distribution of slopes = cumulated number points with slopes that are <= the slope at this point + ! + ! sorted data emp. CDF + ! 9 | x x 7/8 | x x + ! | | + ! 8 | x 5/8 | x + ! | | + ! 5 | x x x 4/8 | x x x + ! | | + ! 2 | x 1/8 | x + ! |__________________ |__________________ + ! + ! highest slope value = highest rank or No. of data points / (data points + 1) + slope_emp(slope_sorted_index(level0(iBasin)%nCells)) = real(level0(iBasin)%nCells, dp) / & + real(level0(iBasin)%nCells + 1_i4, dp) + + ! backward loop to check if the preceding data point has the same slope value + do i = level0(iBasin)%nCells - 1, 1, -1 + i_sort=slope_sorted_index(i) + i_sortpost=slope_sorted_index(i+1) + if (eq(L0_slope(level0(iBasin)%iStart-1_i4+i_sort), L0_slope(level0(iBasin)%iStart-1_i4+i_sortpost))) then + ! if yes: assign the same probabitity + slope_emp(i_sort) = slope_emp(i_sortpost) + else + ! if not: assign rank / (data points + 1) + slope_emp(i_sort) = real(i, dp) / real(level0(iBasin)%nCells + 1_i4, dp) + end if + end do + + ! EXAMPLE + ! in = [ 7, 20, 31, 31, 12, 31, 42 ] + ! sorted = [ 7, 12, 20, 31, 31, 31, 42 ] + ! index = [ 1, 5, 2, 3, 4, 6, 7 ] + ! temp = [ 1, 2, 3, 6, 6, 6, 7 ] + ! out = [ 1, 3, 6, 6, 2, 6, 7 ] / (len(out) + 1 ) + + !-------------------------------------------------------- + ! Start padding up local variables to global variables + !-------------------------------------------------------- + call append(L0_slope_emp, slope_emp) + + nH = 1_i4 !> by default; when iFlag_soilDB = 0 + if (iFlag_soilDB .eq. 1) nH = nSoilHorizons_mHM + do i = 1, nH + do k = level0(iBasin)%iStart, level0(iBasin)%iEnd + j = L0_soilId(k, i) + soilDB%is_present(j) = 1_i4 + end do + end do + + ! free space + deallocate(slope_emp, slope_sorted_index) + + + end subroutine L0_variable_init + + ! ------------------------------------------------------------------ + + ! NAME + ! variables_alloc + + !> \brief Allocation of space for mHM related L1 and L11 variables. + + !> \details Allocation of space for mHM related L1 and L11 variables (e.g., states, + !> fluxes, and parameters) for a given basin. Variables allocated here is + !> defined in them mo_global_variables.f90 file. After allocating any variable + !> in this routine, initalize them in the following variables_default_init + !> subroutine: + !> + ! + ! CALLING SEQUENCE + ! call variables_alloc(iBasin) + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" - basin id + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + + ! RETURN + + ! RESTRICTIONS + + ! EXAMPLE + + ! LITERATURE + + ! HISTORY + !> \author Rohini Kumar + !> \date Jan 2013 + ! Modified, R. Kumar, Sep 2013 - documentation added according to the template + ! S. Thober, Aug 2015 - removed routing related variables + ! Zink M. Demirel C.,Mar 2017 - Init Jarvis soil water stress variable at SM process(3) + ! Robert Schweppe, Dec 2017 - restructured allocation in variables_alloc, + ! expanded dimensions of effective parameters + + + subroutine init_eff_params(ncells1) + + use mo_mpr_global_variables, only : & + L1_fSealed, L1_alpha, L1_degDayInc, & + L1_degDayMax, L1_degDayNoPre, L1_degDay, L1_karstLoss, L1_fAsp, L1_petLAIcorFactor, & + L1_HarSamCoeff, L1_PrieTayAlpha, L1_aeroResist, L1_surfResist, & + L1_fRoots, L1_maxInter, L1_kfastFlow, L1_kSlowFlow, L1_kBaseFlow, & + L1_kPerco, L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp, & + L1_jarvis_thresh_c1, L1_tempThresh, L1_unsatThresh, L1_sealedThresh, L1_wiltingPoint, & + nSoilHorizons_mHM, nLAI + use mo_common_variables, only : & + nLCoverScene + use mo_common_constants, only : P1_InitStateFluxes + + use mo_common_constants, only : YearMonths_i4 + use mo_append, only : append ! append vector + + implicit none + + integer(i4), intent(in) :: ncells1 + + ! local variables + real(dp), dimension(:, :, :), allocatable :: dummy_3D + integer(i4) :: max_extent + + ! get maximum extent of one dimension 2 or 3 + max_extent = max(nSoilHorizons_mHM, YearMonths_i4, nLCoverScene, nLAI) + + ! for appending and intialization + allocate(dummy_3D(nCells1, max_extent, nLCoverScene)) + + dummy_3D = P1_InitStateFluxes + + !------------------------------------------- + ! EFFECTIVE PARAMETERS + !------------------------------------------- + call append(L1_fSealed, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! exponent for the upper reservoir + call append(L1_alpha, dummy_3D(:, 1 : 1, 1 : 1)) + ! increase of the Degree-day factor per mm of increase in precipitation + call append(L1_degDayInc, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! maximum degree-day factor + call append(L1_degDayMax, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! degree-day factor with no precipitation + call append(L1_degDayNoPre, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! degree-day factor + call append(L1_degDay, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! Karstic percolation loss + call append(L1_karstLoss, dummy_3D(:, 1 : 1, 1 : 1)) + ! PET correction factor due to terrain aspect + call append(L1_fAsp, dummy_3D(:, 1 : 1, 1 : 1)) + ! PET correction factor due to LAI + call append(L1_petLAIcorFactor, dummy_3D(:, 1 : nLAI, 1 : nLCoverScene)) + ! PET Hargreaves Samani coefficient + call append(L1_HarSamCoeff, dummy_3D(:, 1 : 1, 1 : 1)) + ! PET Prietley Taylor coefficient + call append(L1_PrieTayAlpha, dummy_3D(:, 1 : nLAI, 1 : 1)) + ! PET aerodynamical resistance + call append(L1_aeroResist, dummy_3D(:, 1 : nLAI, 1 : nLCoverScene)) + ! PET bulk surface resistance + call append(L1_surfResist, dummy_3D(:, 1 : nLAI, 1 : 1)) + ! Fraction of roots in soil horizons + call append(L1_fRoots, dummy_3D(:, 1 : nSoilHorizons_mHM, 1 : nLCoverScene)) + ! Maximum interception + call append(L1_maxInter, dummy_3D(:, 1 : nLAI, 1 : 1)) + ! fast interflow recession coefficient + call append(L1_kfastFlow, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! slow interflow recession coefficient + call append(L1_kSlowFlow, dummy_3D(:, 1 : 1, 1 : 1)) + ! baseflow recession coefficient + call append(L1_kBaseFlow, dummy_3D(:, 1 : 1, 1 : 1)) + ! percolation coefficient + call append(L1_kPerco, dummy_3D(:, 1 : 1, 1 : 1)) + ! Soil moisture below which actual ET is reduced linearly till PWP + call append(L1_soilMoistFC, dummy_3D(:, 1 : nSoilHorizons_mHM, 1 : nLCoverScene)) + ! Saturation soil moisture for each horizon [mm] + call append(L1_soilMoistSat, dummy_3D(:, 1 : nSoilHorizons_mHM, 1 : nLCoverScene)) + ! jarvis critical value for normalized soil water content + call append(L1_jarvis_thresh_c1, dummy_3D(:, 1 : 1, 1 : 1)) + ! Exponential parameter to how non-linear is the soil water retention + call append(L1_soilMoistExp, dummy_3D(:, 1 : nSoilHorizons_mHM, 1 : nLCoverScene)) + ! Threshold temperature for snow/rain + call append(L1_tempThresh, dummy_3D(:, 1 : 1, 1 : nLCoverScene)) + ! Threshhold water depth controlling fast interflow + call append(L1_unsatThresh, dummy_3D(:, 1 : 1, 1 : 1)) + ! Threshhold water depth for surface runoff in sealed surfaces + call append(L1_sealedThresh, dummy_3D(:, 1 : 1, 1 : 1)) + ! Permanent wilting point + call append(L1_wiltingPoint, dummy_3D(:, 1 : nSoilHorizons_mHM, 1 : nLCoverScene)) + + ! free space + if (allocated(dummy_3D)) deallocate(dummy_3D) + + end subroutine init_eff_params + +END MODULE mo_mpr_startup diff --git a/src/MPR/mo_multi_param_reg.f90 b/src/MPR/mo_multi_param_reg.f90 new file mode 100644 index 00000000..420bcf9d --- /dev/null +++ b/src/MPR/mo_multi_param_reg.f90 @@ -0,0 +1,1352 @@ +!> \file mo_multi_param_reg.f90 + +!> \brief Multiscale parameter regionalization (MPR). + +!> \details This module provides the routines for multiscale parameter regionalization (MPR). + +!> \authors Stephan Thober, Rohini Kumar +!> \date Dec 2012 + +! created Sa 16.02.2006 +! update Sa 17.09.2007 - betas new number +! update Sa 03.10.2007 - new name, land cover state +! update Ku 25.03.2008 - all parameters are regionalised +! update Ku 04.10.2010 - vector version +! update Th 20.12.2012 - modular version +! update MZ 27.11.2014 - added parameterization of PET +! update Ku Mar 2016 - changes for handling multiple soil database options +! M.C.Demirel & S.Stisen Apr 2017 - added ET reduction and FC dependency on root fraction coefficient at SM process(3) + + +MODULE mo_multi_param_reg + + use mo_kind, only : i4, dp + use mo_common_constants, only : nodata_dp, nodata_i4 + + implicit none + + private + + PUBLIC :: mpr ! calculates effective regionalised parameters + PUBLIC :: canopy_intercept_param ! estimate effective max. canopy interception + +contains + ! --------------------------------------------------------------------------- + + ! NAME + ! mpr + + !> \brief Regionalizing and Upscaling process parameters + + !> \details calculating process parameters at L0 scale (Regionalization), like:\n + !> - Baseflow recession parameter\n + !> - Soil moisture parameters\n + !> - PET correction for aspect\n + !> + !> and upscale these parameters to retrieve effective parameters at scale + !> L1. \n + !> Further parameter regionalizations are done for:\n + !> - snow accumulation and melting parameters\n + !> - threshold parameter for runoff generation on impervious layer\n + !> - karstic percolation loss\n + !> - setting up the Regionalized Routing Parameters\n + !> \n + + ! INTENT(IN) + !> \param[in] "integer(i4) :: mask0(:,:)" - mask at Level 0 + !> \param[in] "integer(i4) :: geoUnit0(:)" - geological units at level 0 + !> \param[in] "integer(i4) :: soilId0(:,:)" - soil Ids at level 0 + !> \param[in] "integer(i4) :: Asp0(:)" - [degree] Aspect at Level 0 + !> \param[in] "integer(i4) :: gridded_LAI0(:,:)" - [1] land cover ID for LAI estimation + !> \param[in] "integer(i4) :: LCover0(:,:)" - land use cover at level 0 + !> \param[in] "integer(i4) :: slope_emp0(:)" - Empirical quantiles of slope at Level 0 + !> \param[in] "integer(i4) :: y0(:)" - latitude at level 0 + !> \param[in] "integer(i4) :: Id0(:)" - cell Ids at level 0 + !> \param[in] "integer(i4) :: upper_bound1(:)" - upper row of L0 block within L1 cell + !> \param[in] "integer(i4) :: lower_bound1(:)" - lower row of L0 block within L1 cell + !> \param[in] "integer(i4) :: left_bound1(:)" - left column of L0 block within L1 cell + !> \param[in] "integer(i4) :: right_bound1(:)" - right column of L0 block within L1 cell + !> \param[in] "integer(i4) :: n_subcells1(:)" - Number of L0 cells in L0 block within L1 cell + + + ! INTENT(INOUT) + !> \param[in,out] "real(dp) :: fSealed1(:,:,:)" - fraction of sealed area at scale L1 + !> \param[in,out] "real(dp) :: alpha1(:,:,:)" - [1] Exponent for the upper reservoir + !> \param[in,out] "real(dp) :: degDayInc1(:,:,:)" - increase of the degree-day factor per mm + !> of increase in precipitation + !> \param[in,out] "real(dp) :: degDayMax1(:,:,:)" - Maximum Degree-day factor + !> \param[in,out] "real(dp) :: degDayNoPre1(:,:,:)" - Degree-day factor with no precipitation + !> \param[in,out] "real(dp) :: fAsp1(:,:,:)" - [1] PET correction for Aspect at level 1 + !> \param[in,out] "real(dp) :: HarSamCoeff1(:,:,:)" - [1] PET Hargreaves Samani coefficient at level 1 + !> \param[in,out] "real(dp) :: PrieTayAlpha1(:,:,:)" - [1] PET Priestley Taylor coefficient at level 1 + !> \param[in,out] "real(dp) :: aeroResist1(:,:,:)" - [s m-1] PET aerodynamical resitance at level 1 + !> \param[in,out] "real(dp) :: surfResist1(:,:,:)" - [s m-1] PET bulk surface resitance at level 1 + !> \param[in,out] "real(dp) :: fRoots1(:,:,:)" - fraction of roots in soil horizons + !> \param[in,out] "real(dp) :: kFastFlow1(:,:,:)" - [10^-3 m] Recession coefficient of the upper + !> reservoir, upper outlet + !> \param[in,out] "real(dp) :: kSlowFlow1(:,:,:)" - [10^-3 m] Recession coefficient of the upper + !> reservoir, lower outlet + !> \param[in,out] "real(dp) :: kBaseFlow1(:,:,:)" - baseflow recession parameter at level 1 + !> \param[in,out] "real(dp) :: kPerco1(:,:,:)" - [d-1] percolation coefficient + !> \param[in,out] "real(dp) :: karstLoss1(:,:,:)" - karstic percolation loss parameter + !> \param[in,out] "real(dp) :: soilMoistFC1(:,:,:)" - [10^-3 m] field capacity + !> \param[in,out] "real(dp) :: soilMoistSat1(:,:,:)" - [10^-3 m] depth of saturated SM cont + !> \param[in,out] "real(dp) :: soilMoistExp1(:,:,:)" - Parameter that determines the relative + !> contribution to SM + !> \param[in,out] "real(dp) :: jarvis_thresh_c1(:,:,:)" - [1] jarvis critical value for + !> normalized soil water content + !> \param[in,out] "real(dp) :: tempThresh1(:,:,:)" - threshold temperature for snow rain + !> \param[in,out] "real(dp) :: unsatThresh1(:,:,:)" - [10^-3 m] Threshhold water depth in upper reservoir + !> (for Runoff contribution) + !> \param[in,out] "real(dp) :: sealedThresh1(:,:,:)" - threshold parameter for runoff generation + !> on impervious Layer + !> \param[in,out] "real(dp) :: wiltingPoint1(:,:,:)" - [10^-3 m] permanent wilting point + !> \param[in,out] "real(dp) :: maxInter1(:,:,:)" - [10^-3 m] maximum canopy interception + !> \param[in,out] "real(dp) :: petLAIcorFactor(:,:,:)" - [10^-3 m] LAI-induced correction factor for PET + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written Stephan Thober, Dec 2012 - created + ! Modified, Stephan Thober, Jan 2013 - updated calling sequence for upscaling operators + ! Luis Samaniego, Feb 2013 - calling sequence, initial CHECK, call mpr_runoff + ! Stephan Thober, Feb 2013 - added subroutine for karstic percolation loss + ! removed L1_, L0_ in variable names + ! Stephan Thober, Aug 2015 - moved regionalization of routing to mRM + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + ! Zink M. & Demirel M.C., Mar 2017 - Added Jarvis soil water stress function at SM process(3) + ! Demirel M.C. & S. Stisen, Apr 2017 - Added FC dependency on root fraction coefficient + ! at SM process(3) + ! Robert Schweppe, Dec 2017 - added loop over LCscenes inside MPR, renamed variables + ! rewrite + + subroutine mpr(& + mask0, & + geoUnit0, & + soilId0, & + Asp0, & + gridded_LAI0, & + LCover0, & + slope_emp0, & + y0, & + Id0, & + upper_bound1, & + lower_bound1, & + left_bound1, & + right_bound1, & + n_subcells1, & + fSealed1, & + alpha1, & + degDayInc1, & + degDayMax1, & + degDayNoPre1, & + fAsp1, & + HarSamCoeff1, & + PrieTayAlpha1, & + aeroResist1, & + surfResist1, & + fRoots1, & + kFastFlow1, & + kSlowFlow1, & + kBaseFlow1, & + kPerco1, & + karstLoss1, & + soilMoistFC1, & + soilMoistSat1, & + soilMoistExp1, & + jarvis_thresh_c1, & + tempThresh1, & + unsatThresh1, & + sealedThresh1, & + wiltingPoint1, & + maxInter1, & + petLAIcorFactor, & + parameterset & + ) + + use mo_message, only : message + use mo_upscaling_operators, only : upscale_arithmetic_mean, L0_fractionalCover_in_Lx + use mo_mpr_soilmoist, only : mpr_sm + use mo_mpr_SMhorizons, only : mpr_SMhorizons + use mo_mpr_runoff, only : mpr_runoff + use mo_mpr_pet, only : pet_correctbyASP, priestley_taylor_alpha, & + bulksurface_resistance, pet_correctbyLAI!, aerodynamical_resistance + use mo_common_variables, only : & + processMatrix, & + global_parameters + use mo_mpr_global_variables, only : & + soilDB, & + iFlag_soilDB, & ! to handle dif. types of soil databases + fracSealed_CityArea, & + nSoilHorizons_mHM, HorizonDepth_mHM, & + c2TSTu + + implicit none + + ! Input ---------------------------------------------------------- + logical, dimension(:, :), intent(in) :: mask0 ! mask at level 0 field + + ! baseflow recession + integer(i4), dimension(:), intent(in) :: geoUnit0 ! L0 geological units + + ! level0 input fields + integer(i4), dimension(:, :), intent(in) :: soilId0 ! soil Ids at level 0 + real(dp), dimension(:), intent(in) :: Asp0 ! [degree] Aspect at Level 0 + real(dp), dimension(:, :), intent(in) :: gridded_LAI0 ! LAI grid at level 0, with dim2 = time + integer(i4), dimension(:, :), intent(in) :: LCOVER0 ! land cover at level 0 + + ! Ids of L0 cells beneath L1 cell + real(dp), dimension(:), intent(in) :: slope_emp0 ! Empirical quantiles of slope + integer(i4), dimension(:), intent(in) :: Id0 ! Cell ids at level 0 + integer(i4), dimension(:), intent(in) :: upper_bound1 ! Upper row of hi res block + integer(i4), dimension(:), intent(in) :: lower_bound1 ! Lower row of hi res block + integer(i4), dimension(:), intent(in) :: left_bound1 ! Left column of hi res block + integer(i4), dimension(:), intent(in) :: right_bound1 ! Right column of hi res block + integer(i4), dimension(:), intent(in) :: n_subcells1 ! Number of L0 cells within a L1 cell + real(dp), dimension(:), intent(in) :: y0 ! y0 at level 0 + + real(dp), dimension(:, :, :), intent(inout) :: fSealed1 ! [1] fraction of sealed area + + ! Output of soilmoisture parametrization + real(dp), dimension(:, :, :), intent(inout) :: soilMoistExp1 ! Parameter that determines the rel. + ! ! contribution to SM, upscal. Bulk den. + real(dp), dimension(:, :, :), intent(inout) :: jarvis_thresh_c1 ! [1] jarvis critical value for norm SWC + + real(dp), dimension(:, :, :), intent(inout) :: soilMoistSat1 ! [10^-3 m] depth of saturated SM + real(dp), dimension(:, :, :), intent(inout) :: soilMoistFC1 ! [10^-3 m] field capacity + real(dp), dimension(:, :, :), intent(inout) :: wiltingPoint1 ! [10^-3 m] permanent wilting point + real(dp), dimension(:, :, :), intent(inout) :: fRoots1 ! fraction of roots in soil horizon + real(dp), dimension(:, :, :), intent(inout) :: tempThresh1 ! [degreeC] threshold temperature + ! ! for snow rain + real(dp), dimension(:, :, :), intent(inout) :: degDayNoPre1 ! [mm-1 degreeC-1] Degree-day factor with + ! ! no precipitation + real(dp), dimension(:, :, :), intent(inout) :: degDayMax1 ! [mm-1 degreeC-1] Maximum Degree-day factor + real(dp), dimension(:, :, :), intent(inout) :: degDayInc1 ! [d-1 degreeC-1] Increase of the + ! ! Degree-day factor per mm of + ! ! increase in precipitation + + ! Output for PET parameterization + real(dp), dimension(:, :, :), intent(inout) :: fAsp1 ! [1] PET correction for Aspect at level 1 + real(dp), dimension(:, :, :), intent(inout) :: HarSamCoeff1 ! [1] PET Hargreaves Samani coeff. at level 1 + real(dp), dimension(:, :, :), intent(inout) :: PrieTayAlpha1 ! [1] PET Priestley Taylor coeff. at level 1 + real(dp), dimension(:, :, :), intent(inout) :: aeroResist1 ! [s m-1] PET aerodynamical resitance at level 1 + real(dp), dimension(:, :, :), intent(inout) :: surfResist1 ! [s m-1] PET bulk surface resitance at level 1 + + ! Output for impervious layer threshold generation + real(dp), dimension(:, :, :), intent(inout) :: sealedThresh1 ! threshold parameter + + ! Output of mpr runoff + real(dp), dimension(:, :, :), intent(inout) :: unsatThresh1 ! [10^-3 m] Threshhold water depth + ! ! in upper reservoir (for Runoff + ! ! contribution) + real(dp), dimension(:, :, :), intent(inout) :: kFastFlow1 ! [10^-3 m] Recession coefficient + ! ! of the upper reservoir, upper outlet + real(dp), dimension(:, :, :), intent(inout) :: kSlowFlow1 ! [10^-3 m] Recession coefficient + ! ! of the upper reservoir, lower outlet + ! Output of baseflow recession coefficient + real(dp), dimension(:, :, :), intent(inout) :: kBaseFlow1 ! Level 1 baseflow recession + real(dp), dimension(:, :, :), intent(inout) :: alpha1 ! [1] Exponent for the upper reservoir + real(dp), dimension(:, :, :), intent(inout) :: kPerco1 ! [d-1] percolation coefficient + + ! Output of karstic percolation loss + real(dp), dimension(:, :, :), intent(inout) :: karstLoss1 + + ! Output for canopy interception and PET correction + real(dp), dimension(:, :, :), intent(inout) :: maxInter1 + real(dp), dimension(:, :, :), intent(inout) :: petLAIcorFactor + real(dp), dimension(:), intent(in), optional, target :: parameterset + + ! Local Variables + real(dp), dimension(:), pointer :: param ! array of global parameters + real(dp), dimension(:, :, :), allocatable :: thetaS_till + real(dp), dimension(:, :, :), allocatable :: thetaFC_till + real(dp), dimension(:, :, :), allocatable :: thetaPW_till + real(dp), dimension(:, :, :), allocatable :: Ks ! saturated hydraulic conductivity + real(dp), dimension(:, :, :), allocatable :: Db ! Bulk density + real(dp), dimension(:, :), allocatable :: thetaS + real(dp), dimension(:, :), allocatable :: thetaFC + real(dp), dimension(:, :), allocatable :: thetaPW + real(dp), dimension(:), allocatable :: KsVar_H0 ! relative variability of saturated + ! ! hydraulic cound. for Horizantal flow + real(dp), dimension(:), allocatable :: KsVar_V0 ! relative variability of saturated + ! ! hydraulic cound. for vertical flow + real(dp), dimension(:), allocatable :: SMs_FC0 ! soil mositure deficit from + ! ! field cap. w.r.t to saturation + real(dp), dimension(size(Id0, 1)) :: k2_0 ! L0 baseflow parameter + real(dp), dimension(size(Id0, 1)) :: fAsp0 ! L0 Aspect + integer(i4) :: mSoil ! number of soil classes + integer(i4) :: mTill ! maximum of number of Tillage horizons + integer(i4) :: mHor ! maximum number of horizons + integer(i4) :: mLC ! number of Landcover classes + integer(i4) :: iStart ! indexing of parameter vector - start + integer(i4) :: iEnd ! indexing of parameter vector - end + integer(i4) :: iStart2 ! 2nd indexing of parameter vector - start + integer(i4) :: iEnd2 ! 2nd indexing of parameter vector - end + integer(i4) :: iiLC ! counter for looping over LCscenes + + real(dp), dimension(size(fSealed1, dim = 1)) :: fForest1 ! [1] Fraction of forest cover + real(dp), dimension(size(fSealed1, dim = 1)) :: fPerm1 ! [1] Fraction of permeable cover + + if (present(parameterset)) then + param => parameterset + else + param => global_parameters(:, 3) + end if + ! loop over all LCover scenes + do iiLC = 1, size(LCover0, 2) + + ! estimate land cover fractions for dominant landcover class + ! fSealed is intent inout, the rest only intent in + fForest1(:) = L0_fractionalCover_in_Lx(LCover0(:, iiLC), 1, mask0, & + upper_bound1, & + lower_bound1, & + left_bound1, & + right_bound1, & + n_subcells1) + fSealed1(:, 1, iiLC) = L0_fractionalCover_in_Lx(LCover0(:, iiLC), 2, mask0, & + upper_bound1, & + lower_bound1, & + left_bound1, & + right_bound1, & + n_subcells1) + fPerm1(:) = L0_fractionalCover_in_Lx(LCover0(:, iiLC), 3, mask0, & + upper_bound1, & + lower_bound1, & + left_bound1, & + right_bound1, & + n_subcells1) + !--------------------------------------------------------- + ! Update fractions of sealed area fractions + ! based on the sealing fraction[0-1] in cities + !--------------------------------------------------------- + fSealed1(:, 1, iiLC) = fracSealed_CityArea * fSealed1(:, 1, iiLC) + fPerm1(:) = fPerm1(:) + (1.0_dp - fracSealed_CityArea) * fSealed1(:, 1, iiLC) + + ! to make sure everything happens smoothly + fForest1(:) = fForest1(:) / (fForest1(:) + fSealed1(:, 1, iiLC) + fPerm1(:)) + fSealed1(:, 1, iiLC) = fSealed1(:, 1, iiLC) / (fForest1(:) + fSealed1(:, 1, iiLC) + fPerm1(:)) + fPerm1(:) = fPerm1(:) / (fForest1(:) + fSealed1(:, 1, iiLC) + fPerm1(:)) + + ! ------------------------------------------------------------------ + ! snow parameters + ! ------------------------------------------------------------------ + select case(processMatrix(2, 1)) + case(1) + + iStart = processMatrix(2, 3) - processMatrix(2, 2) + 1 + iEnd = processMatrix(2, 3) + + call snow_acc_melt_param(param(iStart : iEnd), c2TSTu, & ! intent(in) + fForest1, fSealed1(:, 1, iiLC), fPerm1, & ! intent(in) + tempThresh1(:, 1, iiLC), degDayNoPre1(:, 1, iiLC), & ! intent(out) + degDayInc1(:, 1, iiLC), degDayMax1(:, 1, iiLC) & ! intent(out) + ) + case DEFAULT + call message() + call message('***ERROR: Process description for process "snow pack" does not exist! mo_multi_param_reg') + stop + end select + + ! ------------------------------------------------------------------ + ! Soil moisture parametrization + ! ------------------------------------------------------------------ + msoil = size(soilDB%is_present, 1) + mLC = maxval(LCover0(:, iiLC), (LCover0(:, iiLC) .ne. nodata_i4)) + + ! depending on which kind of soil database processing is to be performed + if(iFlag_soilDB .eq. 0)then + mtill = maxval(soilDB%nTillHorizons, (soilDB%nTillHorizons .ne. nodata_i4)) + mHor = maxval(soilDB%nHorizons, (soilDB%nHorizons .ne. nodata_i4)) + else if(iFlag_soilDB .eq. 1) then + ! here for each soil type both till and non-till soil hydraulic properties are to be estimated + ! since a given soil type can lie in any horizon (till or non-till ones) + ! adopt it in a way that it do not break the consistency of iFlag_soilDB = 0 + ! ** NOTE: SDB_nTillHorizons and SDB_nHorizons are also assigned in + ! this flag option (see mo_soildatabase.f90 file - read_soil_LUT). + ! But we are not using those variables here since in this case we have not + ! varying number of soil horizons or either tillage horizons. + ! So assigning them with a value = 1 is more than enough. + mtill = 1 + mHor = 1 + end if + + allocate(thetaS_till(msoil, mtill, mLC)) + allocate(thetaFC_till(msoil, mtill, mLC)) + allocate(thetaPW_till(msoil, mtill, mLC)) + allocate(thetaS(msoil, mHor)) + allocate(thetaFC(msoil, mHor)) + allocate(thetaPW(msoil, mHor)) + allocate(Ks(msoil, mHor, mLC)) + allocate(Db(msoil, mHor, mLC)) + + ! earlier these variables were allocated with size(soilId0,1) + ! in which the variable "soilId0" changes according to the iFlag_soilDB + ! so better to use other variable which is common to both soilDB (0 AND 1) flags + allocate(KsVar_H0(size(Id0, 1))) + allocate(KsVar_V0(size(Id0, 1))) + allocate(SMs_FC0(size(Id0, 1))) + + select case(processMatrix(3, 1)) + case(1) + ! first thirteen parameters go to this routine + iStart = processMatrix(3, 3) - processMatrix(3, 2) + 1 + iEnd = processMatrix(3, 3) - 4 + + ! next four parameters go here + ! (the first three for the fRoots and the fourth one for the beta) + iStart2 = processMatrix(3, 3) - 4 + 1 + iEnd2 = processMatrix(3, 3) + + case(2) + ! first thirteen parameters go to this routine + iStart = processMatrix(3, 3) - processMatrix(3, 2) + 1 + iEnd = processMatrix(3, 3) - 5 + + ! next four parameters go here + ! (the first three for the fRoots and the fourth one for the beta) + iStart2 = processMatrix(3, 3) - 5 + 1 + iEnd2 = processMatrix(3, 3) - 1 + + ! last parameter is jarvis parameter - no need to be regionalized + jarvis_thresh_c1 = param(processMatrix(3, 3)) + case(3) + ! first thirteen parameters go to this routine + iStart = processMatrix(3, 3) - processMatrix(3, 2) + 1 + iEnd = processMatrix(3, 3) - 7 + + ! next four parameters go here + ! (the first three for the fRoots and the fourth one for the beta) + iStart2 = processMatrix(3, 3) - 7 + 1 + iEnd2 = processMatrix(3, 3) - 1 + + ! last parameter is jarvis parameter - no need to be regionalized + jarvis_thresh_c1 = param(processMatrix(3, 3)) + case DEFAULT + call message() + call message('***ERROR: Process description for process "soil moisture parametrization"', & + 'does not exist! mo_multi_param_reg') + stop 1 + end select + + call mpr_sm(param(iStart : iEnd), & + soilDB%is_present, soilDB%nHorizons, soilDB%nTillHorizons, & + soilDB%sand, soilDB%clay, soilDB%DbM, & + Id0, soilId0, LCover0(:, iiLC), & + thetaS_till, thetaFC_till, thetaPW_till, thetaS, & + thetaFC, thetaPW, Ks, Db, KsVar_H0, KsVar_V0, SMs_FC0) + + call mpr_SMhorizons(param(iStart2 : iEnd2), processMatrix, & + iFlag_soilDB, nSoilHorizons_mHM, HorizonDepth_mHM, & + LCover0(:, iiLC), soilId0, & + soilDB%nHorizons, soilDB%nTillHorizons, & + thetaS_till, thetaFC_till, thetaPW_till, & + thetaS, thetaFC, thetaPW, soilDB%Wd, Db, soilDB%DbM, soilDB%RZdepth, & + mask0, Id0, & + upper_bound1, lower_bound1, left_bound1, right_bound1, n_subcells1, & + soilMoistExp1(:, :, iiLC), soilMoistSat1(:, :, iiLC), soilMoistFC1(:, :, iiLC), & + wiltingPoint1(:, :, iiLC), fRoots1(:, :, iiLC)) + + deallocate(thetaS_till) + deallocate(thetaFC_till) + deallocate(thetaPW_till) + deallocate(thetaS) + deallocate(thetaFC) + deallocate(thetaPW) + deallocate(Ks) + deallocate(Db) + + ! ------------------------------------------------------------------ + ! potential evapotranspiration (PET) + ! ------------------------------------------------------------------ + ! Penman-Monteith method is only method that is LCscene dependent + if (processMatrix(5, 1) == 3) then + iStart = processMatrix(5, 3) - processMatrix(5, 2) + 1 + iEnd = processMatrix(5, 3) + call aerodynamical_resistance(gridded_LAI0, LCover0(:, iiLC), param(iStart : iEnd - 1), mask0, & + Id0, n_subcells1, upper_bound1, lower_bound1, left_bound1, right_bound1, & + aeroResist1(:, :, iiLC)) + else if (processMatrix(5, 1) == -1) then + iStart = processMatrix(5, 3) - processMatrix(5, 2) + 1 + iEnd = processMatrix(5, 3) + + call pet_correctbyLAI(param(iStart : iEnd), nodata_dp, & + LCover0(:, iiLC), gridded_LAI0, mask0, Id0, & + upper_bound1, lower_bound1, left_bound1, & + right_bound1, n_subcells1, petLAIcorFactor(:, :, iiLC)) + end if + + ! ------------------------------------------------------------------ + ! interflow + ! ------------------------------------------------------------------ + select case(processMatrix(6, 1)) + case (1) + ! + iStart = processMatrix(6, 3) - processMatrix(6, 2) + 1 + iEnd = processMatrix(6, 3) + ! TODO: this subroutine should be split into each param (or at least extract kFastFlow1) + ! because it is in the loop unnecessarily + call mpr_runoff(LCover0(:, iiLC), mask0, SMs_FC0, slope_emp0, & + KsVar_H0, param(iStart : iEnd), Id0, upper_bound1, lower_bound1, & + left_bound1, right_bound1, n_subcells1, c2TSTu, unsatThresh1(:, 1, 1), kFastFlow1(:, 1, iiLC), & + kSlowFlow1(:, 1, 1), alpha1(:, 1, 1)) + case DEFAULT + call message() + call message('***ERROR: Process description for process "interflow" does not exist! mo_multi_param_reg') + stop + END select + + ! ------------------------------------------------------------------ + ! percolation cofficient, karstic percolation loss + ! ------------------------------------------------------------------ + select case(processMatrix(7, 1)) + case(1) + + iStart = processMatrix(7, 3) - processMatrix(7, 2) + 1 + iEnd = processMatrix(7, 3) + call karstic_layer(& ! In + param(iStart : iEnd), & ! In + geoUnit0, mask0, & ! In + SMs_FC0, KsVar_V0, Id0, & ! In + n_subcells1, upper_bound1, lower_bound1, left_bound1, right_bound1, & ! In + karstLoss1(:, 1, 1), kPerco1(:, 1, 1) & ! Out + ) + + case DEFAULT + call message() + call message('***ERROR: Process description for process "percolation" does not exist! mo_multi_param_reg') + stop + end select + + deallocate(KsVar_H0) + deallocate(KsVar_V0) + deallocate(SMs_FC0) + + end do + ! ------------------------------------------------------------------ + ! sealed area threshold for runoff generation + ! ------------------------------------------------------------------ + select case(processMatrix(4, 1)) + case (1) + iStart = processMatrix(4, 3) - processMatrix(4, 2) + 1 + iEnd = processMatrix(4, 3) + call iper_thres_runoff(param(iStart : iEnd), sealedThresh1) + case DEFAULT + call message() + call message('***ERROR: Process description for process "runoff_generation" does not exist! mo_multi_param_reg') + stop + end select + + ! ------------------------------------------------------------------ + ! potential evapotranspiration (PET) + ! ------------------------------------------------------------------ + select case(processMatrix(5, 1)) + case(-1) ! LAI correction of input PET + iEnd = -9999 ! dummy statement + case(0) ! aspect correction of input PET + iStart = processMatrix(5, 3) - processMatrix(5, 2) + 1 + iEnd = processMatrix(5, 3) + call pet_correctbyASP(Id0, y0, Asp0, param(iStart : iEnd), nodata_dp, fAsp0) + fAsp1(:, 1, 1) = upscale_arithmetic_mean(n_subcells1, upper_bound1, lower_bound1, & + left_bound1, right_bound1, Id0, mask0, nodata_dp, fAsp0) + case(1) ! Hargreaves-Samani method + iStart = processMatrix(5, 3) - processMatrix(5, 2) + 1 + iEnd = processMatrix(5, 3) + call pet_correctbyASP(Id0, y0, Asp0, param(iStart : iEnd - 1), nodata_dp, fAsp0) + fAsp1(:, 1, 1) = upscale_arithmetic_mean(n_subcells1, upper_bound1, lower_bound1, & + left_bound1, right_bound1, Id0, mask0, nodata_dp, fAsp0) + HarSamCoeff1 = param(iEnd) + case(2) ! Priestley-Taylor Method + iStart = processMatrix(5, 3) - processMatrix(5, 2) + 1 + iEnd = processMatrix(5, 3) + call priestley_taylor_alpha(gridded_LAI0, param(iStart : iEnd), & + mask0, nodata_dp, Id0, n_subcells1, upper_bound1, lower_bound1, left_bound1, right_bound1, & + PrieTayAlpha1(:, :, 1)) + case(3) ! Penman-Monteith method + ! aerodynamic resistance is calculated inside LCscene loop + iStart = processMatrix(5, 3) - processMatrix(5, 2) + 1 + iEnd = processMatrix(5, 3) + call bulksurface_resistance(gridded_LAI0, param(iEnd), mask0, & + nodata_dp, Id0, n_subcells1, upper_bound1, lower_bound1, left_bound1, right_bound1, & + surfResist1(:, :, 1)) + case default + call message() + call message('***ERROR: Process description for process "pet correction" does not exist! mo_multi_param_reg') + stop + end select + ! ------------------------------------------------------------------ + ! baseflow recession parameter + ! ------------------------------------------------------------------ + select case(processMatrix(9, 1)) + case(1) + + ! the number of process parameters, so the number in processMatrix(9,2) has + ! to be equal to the size of geo_unit_list + iStart = processMatrix(9, 3) - processMatrix(9, 2) + 1 + iEnd = processMatrix(9, 3) + + call baseflow_param(param(iStart : iEnd), & + geoUnit0, k2_0) + ! + ! Upscale by arithmetic mean + kBaseFlow1(:, 1, 1) = upscale_arithmetic_mean(n_subcells1, upper_bound1, lower_bound1, & + left_bound1, right_bound1, Id0, mask0, nodata_dp, k2_0) + ! + ! correction and unit conversion + ! if percolation is ON: correct K2 such that it is at least k1 + if (processMatrix(7, 1) .gt. 0) kBaseFlow1 = merge(kSlowFlow1, kBaseFlow1, kBaseFlow1 .lt. kSlowFlow1) + kBaseFlow1 = c2TSTu / kBaseFlow1 + ! + case DEFAULT + call message() + call message('***ERROR: Process description for process "baseflow Recession" does not exist! mo_multi_param_reg') + stop + end select + + !------------------------------------------------------------------- + ! call regionalization of parameters related to LAI + ! it is now outside of mHM since LAI is now dynamic variable + !------------------------------------------------------------------- + call canopy_intercept_param(processMatrix, param(:), & + gridded_LAI0, n_subcells1, upper_bound1, lower_bound1, left_bound1, right_bound1, Id0, mask0, & + nodata_dp, maxInter1(:, :, 1)) + + end subroutine mpr + + ! ---------------------------------------------------------------------------- + + ! NAME + ! baseflow_param + + !> \brief baseflow recession parameter + + !> \details This subroutine calculates the baseflow recession parameter + !> based on the geological units at the Level 0 scale. For each level 0 + !> cell, it assigns the value specified in the parameter array param for the + !> geological unit in this cell.\n + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = GeoParam(1,:) \n + !> - param(2) = GeoParam(2,:) \n + !> - ...\n + + ! INTENT(IN) + !> \param[in] "real(dp) :: param(:)" - array of global baseflow recession + !> parameters + !> \param[in] "integer(i4) :: geoUnit0(:,:)" - array of geological units + !> at Level 0 + !> \param[in] "integer(i4) :: geoUnitList(:)" - array of indices for + !> geological units. + !> \param[in] "real(dp) :: nodata" - no data value + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: k2_0" - baseflow recession parameter at Level 0 + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written Stephan Thober, Dec 2012 + ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) + + subroutine baseflow_param(& + param, & ! Intent(in) + geoUnit0, & ! Intent(in) + k2_0 & ! Intent(out) + ) + + use mo_mpr_global_variables, only : & + GeoUnitList + + !$ use omp_lib + implicit none + + ! Input + real(dp), dimension(:), intent(in) :: param ! list of required parameters + integer(i4), dimension(:), intent(in) :: geoUnit0 ! ids of geological units at L0 + + ! output + real(dp), dimension(:), intent(out) :: k2_0 ! baseflow recession coefficient + + ! local variables + integer(i4) :: ii ! loop variable + integer(i4), dimension(1) :: gg ! geo unit + + if (size(param) .ne. size(geoUnitList)) & + stop ' mo_multi_param_reg: baseflow_param: size mismatch, subroutine baseflow parameters ' + + k2_0 = nodata_dp + + !$OMP PARALLEL + !$OMP DO PRIVATE(gg) SCHEDULE(STATIC) + do ii = 1, size(k2_0) + ! get parameter index in geoUnitList + gg = minloc(abs(geoUnitList - geoUnit0(ii))) + k2_0(ii) = param(gg(1)) + end do + !$OMP END DO + !$OMP END PARALLEL + + end subroutine baseflow_param + + ! ---------------------------------------------------------------------------- + + ! NAME + ! snow_acc_melt_param + + !> \brief Calculates the snow parameters. + + !> \details This subroutine calculates the snow parameters + !> threshold temperature (TT), degree-day factor without precipitation (DD) + !> and maximum degree-day factor (DDmax) as well as increase of degree-day + !> factor per mm of increase in precipitation (IDDP).\n + !> + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = snowTreshholdTemperature \n + !> - param(2) = degreeDayFactor_forest \n + !> - param(3) = degreeDayFactor_impervious \n + !> - param(4) = degreeDayFactor_pervious \n + !> - param(5) = increaseDegreeDayFactorByPrecip \n + !> - param(6) = maxDegreeDayFactor_forest \n + !> - param(7) = maxDegreeDayFactor_impervious \n + !> - param(8) = maxDegreeDayFactor_pervious \n + + !> INTENT(IN) + !> \param[in] "real(dp) :: param(8)" - There are eight snow parameters required + !> \param[in] "real(dp) :: c2TSTu" - unit transformation coefficient + !> \param[in] "real(dp) :: fForest1(:)" - fraction of forest cover at scale L1 + !> \param[in] "real(dp) :: fIperm1(:)" - fraction of sealed area at scale L1 + !> \param[in] "real(dp) :: fPerm1(:)" - fraction of permeable area at scale L1 + + ! INTENT(OUT) + !> \param[out] "real(dp) :: tempThresh1(:) " - threshold temperature for snow rain + !> \param[out] "real(dp) :: degDayNoPre1(:) " - Degree-day factor + !> \param[out] "real(dp) :: degDayMax1(:)" - Maximum Degree-day factor + !> \param[out] "real(dp) :: degDayInc1(:)" - increase of the degree-day factor per mm of + !> increase in precipitation + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written Stephan Thober, Dec 2012 + ! Modified, Juliane Mai, Oct 2013 - OLD parametrization + ! --> param(1) = snowTreshholdTemperature + ! --> param(2) = degreeDayFactor_forest + ! --> param(3) = degreeDayFactor_impervious + ! --> param(4) = degreeDayFactor_pervious + ! --> param(5) = increaseDegreeDayFactorByPrecip + ! --> param(6) = maxDegreeDayFactor_forest + ! --> param(7) = maxDegreeDayFactor_impervious + ! --> param(8) = maxDegreeDayFactor_pervious + ! ------------------------------- + ! degreeDayFactor_impervious = degreeDayFactor_forest + delta_1 + delta_2 + ! degreeDayFactor_pervious = degreeDayFactor_forest + delta_1 + ! maxDegreeDayFactor_forest = degreeDayFactor_forest + delta_3 + ! maxDegreeDayFactor_impervious = degreeDayFactor_impervious + delta_5 + ! = degreeDayFactor_forest + delta_1 + delta_2 + delta_5 + ! maxDegreeDayFactor_pervious = degreeDayFactor_pervious + delta_4 + ! = degreeDayFactor_forest + delta_1 + delta_4 + ! ------------------------------- + ! NEW parametrization + ! --> param(1) = snowTreshholdTemperature + ! --> param(2) = degreeDayFactor_forest + ! --> param(3) = delta_2 + ! --> param(4) = delta_1 + ! --> param(5) = increaseDegreeDayFactorByPrecip + ! --> param(6) = delta_3 + ! --> param(7) = delta_5 + ! --> param(8) = delta_4 + ! Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) + + subroutine snow_acc_melt_param(& + param, c2TSTu, fForest1, fIperm1, fPerm1, & ! Intent(in) + tempThresh1, degDayNoPre1, degDayInc1, degDayMax1 & ! Intent(out) + ) + + implicit none + + ! Input + real(dp), dimension(8), intent(in) :: param ! eight global parameters + real(dp), intent(in) :: c2TSTu ! unit transformations + real(dp), dimension(:), intent(in) :: fForest1 ! [1] fraction of forest cover + real(dp), dimension(:), intent(in) :: fIperm1 ! [1] fraction of sealed area + real(dp), dimension(:), intent(in) :: fPerm1 ! [1] fraction of permeable area + + ! Output + real(dp), dimension(:), intent(out) :: tempThresh1 ! [degreeC] threshold temperature for snow rain + real(dp), dimension(:), intent(out) :: degDayNoPre1 ! [mm-1 degreeC-1] Degree-day factor with + ! no precipitation + real(dp), dimension(:), intent(out) :: degDayMax1! [mm-1 degreeC-1] Maximum Degree-day factor + real(dp), dimension(:), intent(out) :: degDayInc1 ! [d-1 degreeC-1] Increase of the Degree-day + ! factor per mm of increase in precipitation + + ! local + real(dp) :: tmp_degreeDayFactor_forest, tmp_degreeDayFactor_impervious, tmp_degreeDayFactor_pervious + real(dp) :: tmp_maxDegreeDayFactor_forest, tmp_maxDegreeDayFactor_impervious, tmp_maxDegreeDayFactor_pervious + + tmp_degreeDayFactor_forest = param(2) ! OLD: param(2) + tmp_degreeDayFactor_impervious = param(2) + param(4) + param(3) ! OLD: param(3) + tmp_degreeDayFactor_pervious = param(2) + param(4) ! OLD: param(4) + tmp_maxDegreeDayFactor_forest = param(2) + param(6) ! OLD: param(6) + tmp_maxDegreeDayFactor_impervious = param(2) + param(4) + param(3) + param(7) ! OLD: param(7) + tmp_maxDegreeDayFactor_pervious = param(2) + param(4) + param(8) ! OLD: param(8) + + tempThresh1 = param(1) + degDayInc1 = param(5) + + degDayNoPre1 = (& + tmp_degreeDayFactor_forest * fForest1 + & + tmp_degreeDayFactor_impervious * fIperm1 + & + tmp_degreeDayFactor_pervious * fPerm1) * c2TSTu + degDayMax1 = (& + tmp_maxDegreeDayFactor_forest * fForest1 + & + tmp_maxDegreeDayFactor_impervious * fIperm1 + & + tmp_maxDegreeDayFactor_pervious * fPerm1) * c2TSTu + + end subroutine snow_acc_melt_param + + ! ---------------------------------------------------------------------------- + + ! NAME + ! iper_thres_runoff + + !> \brief sets the impervious layer threshold parameter for runoff generation + + !> \details to be done by Kumar\n + !> .... + !> + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = imperviousStorageCapacity \n + + ! INTENT(IN) + !> \param[in] "real(dp) :: param" - given threshold parameter + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: sealedThresh1(:)" - distributed parameter field + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober, Rohini Kumar + !> \date Dec 2012 + ! Written Stephan Thober, Dec 2012 + ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) + + subroutine iper_thres_runoff(param, sealedThresh1) + + implicit none + + ! Input + real(dp), dimension(1), intent(in) :: param ! threshold parameters + + ! Output + real(dp), dimension(:, :, :), intent(out) :: sealedThresh1 + + sealedThresh1 = param(1) + + end subroutine iper_thres_runoff + + ! ---------------------------------------------------------------------------- + + ! NAME + ! karstic_layer + + !> \brief calculates the Karstic percolation loss + + !> \details This subroutine calls first the karstic_fraction upscaling + !> routine for determine the karstic fraction area for every Level 1 + !> cell. Then, the karstic percolation loss is estimated given two + !> shape parameters by + !> \f[ karstLoss1 = 1 + ( fKarArea * param(1)) *( (-1)**INT(param(2),i4) ) \f] + !> where \f$ karstLoss1 \f$ is the karstic percolation loss and \f$ fKarArea \f$ + !> is the fraction of karstic area at level 1\n + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = rechargeCoefficient \n + !> - param(2) = rechargeFactor_karstic \n + !> - param(3) = gain_loss_GWreservoir_karstic \n + + ! INTENT(IN) + !> \param[in] "integer(i4) :: nGeoUnits" - number of geological formations + !> \param[in] "integer(i4) :: geoUnitKar(:)" - number of Karstic formation + !> \param[in] "integer(i4) :: geoUnit0(:)" - id of the Karstic formation + !> \param[in] "logical :: mask0(:,:)" - mask at level 0 + !> \param[in] "real(dp) :: nodata" - given nodata value + + !> \param[in] "integer(i4) :: n_subcells1(:)" - number of l0 cells within a l1 cell + !> \param[in] "integer(i4) :: upper_bound1(:)" - upper row of a l1 cell in l0 grid + !> \param[in] "integer(i4) :: lower_bound1(:)" - lower row of a l1 cell in l0 grid + !> \param[in] "integer(i4) :: left_bound1(:)" - left col of a l1 cell in l0 grid + !> \param[in] "integer(i4) :: right_bound1(:)" - right col of a l1 cell in l0 grid + ! + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: karstLoss1(:)" [-] Karstic percolation loss + !> \param[out] "real(dp) :: L1_Kp(:)" [d-1] percolation coefficient + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Rohini Kumar, Stephan Thober + !> \date Feb 2013 + ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) + ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) + ! + subroutine karstic_layer(& + param, & ! IN: parameters + geoUnit0, & ! IN: id of the Karstic formation + mask0, & ! IN: mask at level 0 + SMs_FC0, & ! IN: [-] soil mositure deficit from field + ! ! capacity w.r.t to saturation + KsVar_V0, & ! IN: [-] relative variability of saturated + Id0, & ! IN: cell id at Level 0 + n_subcells1, & ! IN: number of l0 cells within a l1 cell + upper_bound1, & ! IN: upper row of a l1 cell in l0 grid + lower_bound1, & ! IN: lower row of a l1 cell in l0 grid + left_bound1, & ! IN: left col of a l1 cell in l0 grid + right_bound1, & ! IN: right col of a l1 cell in l0 grid + karstLoss1, & ! OUT: [-] Karstic percolation loss + L1_Kp & ! OUT: [d-1] percolation coefficient + ) + + use mo_upscaling_operators, only : L0_fractionalCover_in_Lx, upscale_arithmetic_mean + use mo_mpr_global_variables, only : & + GeoUnitList, geoUnitKar, c2TSTu + + !$ use omp_lib + + implicit none + + ! Input + real(dp), dimension(3), intent(in) :: param ! parameters + integer(i4), dimension(:), intent(in) :: geoUnit0 ! id of the Karstic formation + + logical, dimension(:, :), intent(in) :: mask0 ! mask at level 0 + real(dp), dimension(:), intent(in) :: SMs_FC0 ! [-] soil mositure deficit from field + ! ! capacity w.r.t to saturation + real(dp), dimension(:), intent(in) :: KsVar_V0 ! [-] relative variability of saturated + + integer(i4), dimension(:), intent(in) :: Id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: n_subcells1 ! number of l0 cells within a l1 cell + integer(i4), dimension(:), intent(in) :: upper_bound1 ! upper row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: lower_bound1 ! lower row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: left_bound1 ! left col of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: right_bound1 ! right col of a l1 cell in l0 grid + + ! Output + real(dp), dimension(:), intent(out) :: karstLoss1 ! [-] Karstic percolation loss + real(dp), dimension(:), intent(out) :: L1_Kp ! [d-1] percolation coefficient + + ! Local variables + real(dp), dimension(:), allocatable :: fKarArea ! fraction of karstic area + real(dp), dimension(size(SMs_FC0, 1)) :: tmp ! temporal variable + integer(i4) :: nGeoUnits + integer(i4) :: i + + + ! ------------------------------------------------------------------ + ! PERCOLATION; 1/Kp = f(Ks) + ! ------------------------------------------------------------------ + ! Regionalise Kp with variability of last soil layer property + !$OMP PARALLEL + tmp = merge(param(1) * (1.0_dp + SMs_FC0) / (1.0_dp + KsVar_V0), & + nodata_dp, Id0 .ne. nodata_i4) + !$OMP END PARALLEL + + L1_Kp = upscale_arithmetic_mean(n_subcells1, upper_bound1, lower_bound1, & + left_bound1, right_bound1, Id0, mask0, nodata_dp, tmp) + + ! minimum constrains + L1_Kp = merge(2.0_dp, L1_Kp, L1_Kp .lt. 2.0_dp) + ! + ! Unit conversion + L1_Kp = c2TSTu / L1_Kp + + nGeoUnits = size(geoUnitlist, 1) + + ! 1st calculate fraction of Karstic area + allocate(fKarArea(size(karstLoss1, 1))) + fKarArea = 0.0_dp + + do i = 1, nGeoUnits + if(GeoUnitKar(i) .eq. 0) cycle + fKarArea(:) = L0_fractionalCover_in_Lx(geoUnit0, geoUnitlist(i), mask0, & + upper_bound1, lower_bound1, left_bound1, right_bound1, n_subcells1) + end do + + ! 2nd calculate karstLoss1 + karstLoss1 = 1.0_dp - (fKarArea * param(2)) + + deallocate(fKarArea) + + end subroutine karstic_layer + + ! ---------------------------------------------------------------------------- + + ! NAME + ! canopy_intercept_param + + !> \brief estimate effective maximum interception capacity at L1 + + !> \details estimate effective maximum interception capacity at L1 for a given + !> Leaf Area Index field. \n + !> Global parameters needed (see mhm_parameter.nml):\n + !> Process Case 1:\n + !> - param(1) = canopyInterceptionFactor \n + + ! INTENT(IN) + !> \param[in] "integer(i4) :: processMatrix(:,:)" - process matrix + !> \param[in] "real(dp) :: param(:)" - array of global parameters + !> \param[in] "real(dp) :: LAI0(:)" - LAI at level-0 + !> \param[in] "integer(i4) :: n_subcells1 (:)" - Number of L0 cells within a L1 cell + !> \param[in] "integer(i4) :: upper_bound1(:)" - Upper row of high resolution block + !> \param[in] "integer(i4) :: lower_bound1(:)" - Lower row of high resolution block + !> \param[in] "integer(i4) :: left_bound1(:)" - Left column of high resolution block + !> \param[in] "integer(i4) :: right_bound1(:)" - Right column of high resolution block + !> \param[in] "integer(i4) :: Id0 (:)" - Cell ids at level 0 + !> \param[in] "logical :: mask0(:,:)" - mask at level 0 field + !> \param[in] "real(dp) :: nodata" - nodata value + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: max_intercept1(:)" - maximum canopy interception at Level-1 + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! EXAMPLE + ! calling sequence + ! call canopy_intercept_param(processMatrix, param, & + ! LAI0, n_subcells1, upper_bound1, & + ! lower_bound1, left_bound1, & + ! right_bound1, Id0, mask0, & + ! nodata, max_intercept1 ) + + ! HISTORY + !> \author Rohini Kumar + !> \date Aug. 2013 + + ! ------------------------------------------------------------------ + subroutine canopy_intercept_param(processMatrix, param, & + LAI0, n_subcells1, upper_bound1, & + lower_bound1, left_bound1, & + right_bound1, Id0, mask0, & + nodata, max_intercept1) + + use mo_upscaling_operators, only : upscale_arithmetic_mean + use mo_string_utils, only : num2str + use mo_message, only : message + + implicit none + + ! input + integer(i4), dimension(:, :), intent(in) :: processMatrix ! indicate processes + real(dp), dimension(:), intent(in) :: param ! array of global parameters + real(dp), dimension(:, :), intent(in) :: LAI0 ! LAI at level-0(nCells0, time) + integer(i4), dimension(:), intent(in) :: n_subcells1 ! Number of L0 cells within a L1 cell + integer(i4), dimension(:), intent(in) :: upper_bound1 ! Upper row of high resolution block + integer(i4), dimension(:), intent(in) :: lower_bound1 ! Lower row of high resolution block + integer(i4), dimension(:), intent(in) :: left_bound1 ! Left column of high resolution block + integer(i4), dimension(:), intent(in) :: right_bound1 ! Right column of high resolution block + integer(i4), dimension(:), intent(in) :: Id0 ! Cell ids at level 0 + logical, dimension(:, :), intent(in) :: mask0 ! mask at level 0 field + real(dp), intent(in) :: nodata ! nodata value + ! output + real(dp), dimension(:, :), intent(out) :: max_intercept1 ! max interception at level-1(nCells1, time) + + ! local variables + integer(i4) :: iStart, iEnd, it + real(dp), dimension(:), allocatable :: max_intercept0 + real(dp), dimension(:), allocatable :: gamma_intercept + + ! ------------------------------------------------------------------ + ! Maximum interception parameter + ! ------------------------------------------------------------------ + select case(processMatrix(1, 1)) + case(1) + iStart = processMatrix(1, 3) - processMatrix(1, 2) + 1 + iEnd = processMatrix(1, 3) + + ! allocate space + allocate(gamma_intercept(iEnd - iStart + 1)) + allocate(max_intercept0 (size(Id0, 1))) + + ! estimate max. intercept at Level-0 + gamma_intercept(:) = param(iStart : iEnd) + + do it = 1, size(LAI0, 2) + !$OMP PARALLEL + max_intercept0(:) = LAI0(:, it) * gamma_intercept(1) + !$OMP END PARALLEL + + ! Upscale by arithmetic mean + max_intercept1(:, it) = upscale_arithmetic_mean(n_subcells1, upper_bound1, lower_bound1, left_bound1, & + right_bound1, Id0, mask0, nodata, max_intercept0(:)) + + end do + + deallocate(gamma_intercept) + deallocate(max_intercept0) + CASE DEFAULT + call message('mo_multi_param_reg: This processMatrix=', num2str(processMatrix(1, 1)), ' is not implemented!') + stop + end select + + end subroutine canopy_intercept_param + + + ! ---------------------------------------------------------------------------- + + ! NAME + ! aerodynamical_resistance + + !> \brief Regionalization of aerodynamic resistance + + !> \details estimation of aerodynamical resistance + !> Global parameters needed (see mhm_parameter.nml):\n + !> - param(1) = canopyheigth_forest \n + !> - param(2) = canopyheigth_impervious \n + !> - param(3) = canopyheigth_pervious \n + !> - param(4) = displacementheight_coeff \n + !> - param(5) = roughnesslength_momentum_coeff \n + !> - param(6) = roughnesslength_heat_coeff \n + + ! INTENT(IN) + !> \param[in] "integer(i4) :: LCover0(:)" - land cover at level 0 + !> \param[in] "real(dp) :: LAILUT(:)" - LUT of LAi values + !> \param[in] "integer(i4) :: LAIUnitList(:)" - List of ids of each LAI class in LAILUT + !> \param[in] "real(dp) :: param(:)" - vector with global parameters + !> \param[in] "logical :: mask0(:,:)" - mask at level 0 field + !> \param[in] "real(dp) :: nodata" - nodata value + !> \param[in] "integer(i4) :: Id0 (:)" - Cell ids at level 0 + !> \param[in] "integer(i4) :: n_subcells1 (:)" - Number of L0 cells within a L1 cell + !> \param[in] "integer(i4) :: upper_bound1(:)" - Upper row of high resolution block + !> \param[in] "integer(i4) :: lower_bound1(:)" - Lower row of high resolution block + !> \param[in] "integer(i4) :: left_bound1(:)" - Left column of high resolution block + !> \param[in] "integer(i4) :: right_bound1(:)" - Right column of high resolution block + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: aerodyn_resistance1(:)" - [s m-1] aerodynamical resistance + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink + !> \date Apr 2013 + ! Modified Matthias Zink, Jun 2017 - moved from mo_multi_scale_param_reg.f90 to mo_mpr_pet.f90 + + subroutine aerodynamical_resistance(& + LAI0, & ! LAI at L0 + LCover0, & ! land cover at level 0 + param, & ! parameter values (size=6) + mask0, & ! mask at level 0 + Id0, & ! cell id at Level 0 + n_subcells1, & ! number of l0 cells within a l1 cell + upper_bound1, & ! upper row of a l1 cell in l0 grid + lower_bound1, & ! lower row of a l1 cell in l0 grid + left_bound1, & ! left col of a l1 cell in l0 grid + right_bound1, & ! right col of a l1 cell in l0 grid + aerodyn_resistance1 & ! aerodynmaical resistance + ) + + use mo_upscaling_operators, only : upscale_arithmetic_mean + use mo_common_constants, only : eps_dp + use mo_mpr_constants, only : WindMeasHeight, karman + + implicit none + + real(dp), dimension(:, :), intent(in) :: LAI0 ! LAI at level-0 + integer(i4), dimension(:), intent(in) :: LCover0 ! land cover field + real(dp), dimension(6), intent(in) :: param ! input parameter + logical, dimension(:, :), intent(in) :: mask0 ! mask at level 0 + integer(i4), dimension(:), intent(in) :: Id0 ! Cell ids of hi res field + integer(i4), dimension(:), intent(in) :: n_subcells1 ! number of l0 cells within a l1 cell + integer(i4), dimension(:), intent(in) :: upper_bound1 ! upper row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: lower_bound1 ! lower row of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: left_bound1 ! left col of a l1 cell in l0 grid + integer(i4), dimension(:), intent(in) :: right_bound1 ! right col of a l1 cell in l0 grid + ! Output + real(dp), dimension(:, :), intent(out) :: aerodyn_resistance1 + + ! local + integer(i4) :: tt + real(dp), dimension(:), allocatable :: maxLAI + real(dp), dimension(:), allocatable :: zm + real(dp), dimension(:), allocatable :: canopy_height0 + real(dp), dimension(:), allocatable :: zm_zero, zh_zero, displace + real(dp), dimension(:, :), allocatable :: aerodyn_resistance0 ! dim 1 = number of cells on level 0, + ! ! dim2=month of year + + ! initialize some things + allocate(zm (size(LCover0, dim = 1))) ; zm = nodata_dp + allocate(zm_zero (size(LCover0, dim = 1))) ; zm_zero = nodata_dp + allocate(zh_zero (size(LCover0, dim = 1))) ; zh_zero = nodata_dp + allocate(displace (size(LCover0, dim = 1))) ; displace = nodata_dp + allocate(canopy_height0 (size(LCover0, dim = 1))) ; canopy_height0 = nodata_dp + allocate(aerodyn_resistance0 (size(LCover0, dim = 1), size(LAI0, 2))) ; aerodyn_resistance0 = nodata_dp + allocate(maxLAI (size(LCover0, dim = 1))) ; maxLAI = nodata_dp + + ! regionalization of canopy height + ! substitute with canopy height + canopy_height0 = merge(param(1), canopy_height0, LCover0 == 1) ! forest + canopy_height0 = merge(param(2), canopy_height0, LCover0 == 2) ! impervious + + ! old implementation used values from LUT statically for all cells (Jan-Dec, 12 values): + ! 7 Intensive-orchards: 2.0, 2.0, 2.0, 2.0, 3.0, 3.5, 4.0, 4.0, 4.0, 2.5, 2.0, 2.0 + maxLAI = MAXVAL(LAI0, dim=2) + + do tt = 1, size(LAI0, 2) + + ! pervious canopy height is scaled with LAI + canopy_height0 = merge((param(3) * LAI0(:, tt) / maxLAI), canopy_height0, LCover0 == 3) ! pervious + + ! estimation of the aerodynamic resistance on the lower level + ! see FAO Irrigation and Drainage Paper No. 56 (p. 19 ff) for more information + zm = WindMeasHeight + ! correction: if wind measurement height is below canopy height loagarithm becomes negative + zm = merge(canopy_height0 + zm, zm, ((abs(zm - nodata_dp) .GT. eps_dp) .AND. (zm .LT. canopy_height0))) + + ! zh = zm + displace = param(4) * canopy_height0 + zm_zero = param(5) * canopy_height0 + zh_zero = param(6) * zm_zero + ! + ! calculate aerodynamic resistance (changes monthly) + aerodyn_resistance0(:, tt) = log((zm - displace) / zm_zero) * log((zm - displace) / zh_zero) / (karman**2.0_dp) + aerodyn_resistance1(:, tt) = upscale_arithmetic_mean(n_subcells1, upper_bound1, lower_bound1, & + left_bound1, right_bound1, Id0, mask0, nodata_dp, aerodyn_resistance0(:, tt)) + + end do + + end subroutine aerodynamical_resistance + +END MODULE mo_multi_param_reg diff --git a/src/MPR/mo_prepare_gridded_lai.f90 b/src/MPR/mo_prepare_gridded_lai.f90 new file mode 100644 index 00000000..2900dc86 --- /dev/null +++ b/src/MPR/mo_prepare_gridded_lai.f90 @@ -0,0 +1,277 @@ +!> \file mo_prepare_gridded_LAI.f90 + +!> \brief Prepare daily LAI fields (e.g., MODIS data) for mHM + +!> \details Prepare daily LAI fields(e.g., MODIS data) for mHM + +!> \authors John Craven & Rohini Kumar +!> \date Aug 2013 + +MODULE mo_prepare_gridded_LAI + + ! This module provides routines to read daily gridded LAI data. + + ! Written John Craven & Rohini Kumar, August 2013 + ! Modified from mo_meteo_forcings + + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: prepare_gridded_daily_LAI_data + PUBLIC :: prepare_gridded_mean_monthly_LAI_data + + ! ------------------------------------------------------------------ + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! prepare_gridded_daily_LAI_data + + ! PURPOSE + !> \brief Prepare gridded daily LAI data + + !> \details Prepare gridded daily LAI data at Level-0 (e.g., using MODIS datasets) + + ! CALLING SEQUENCE + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" Basin Id + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + + ! EXAMPLE + + ! LITERATURE + ! None + + ! HISTORY + !> \author John Craven & Rohini Kumar + !> \date Aug 2013 + ! Modified Matthias Cuntz & Juliane Mai, Nov 2014 - use meteo reading routines + ! + subroutine prepare_gridded_daily_LAI_data(iBasin, nrows, ncols, mask, LAIPer_iBasin) + + use mo_mpr_global_variables, only : dirgridded_LAI, inputFormat_gridded_LAI, & + L0_gridded_LAI, timeStep_LAI_input, nLAI + use mo_append, only : append ! append vector + use mo_read_bin, only : read_bin ! Read binary files + use mo_read_forcing_nc, only : read_forcing_nc ! Read netCDF files + use mo_common_variables, only: period + use mo_message, only: message + + implicit none + ! input + integer(i4), intent(in) :: iBasin, nrows, ncols + logical, dimension(:, :), intent(in) :: mask + type(period), intent(in), optional :: LAIPer_iBasin + integer(i4) :: ncells, iLAI + ! + real(dp), dimension(:, :, :), allocatable :: LAI0_3D !data at level-0 [nRow X nCols X nTimeSteps] + real(dp), dimension(:, :), allocatable :: LAI0_2D !data at level-0 [nCells X nTimeSteps] + + + ! select case depending on input data format + SELECT CASE(trim(inputFormat_gridded_LAI)) + + ! netcdf file input option + CASE('nc') + CALL read_forcing_nc(dirgridded_LAI(iBasin), nRows, nCols, & + 'lai', mask, LAI0_3D, target_period = LAIPer_iBasin, & + lower = 1.00E-10_dp, upper = 30.0_dp, nctimestep = timeStep_LAI_input) + ! bin file input option + CASE('bin') + if (.not. present(LAIPer_iBasin)) then + call message() + call message('The period for gridded LAI selection data must be given, if reading from binary files.') + call message('If using #MPR_STANDALONE, please read from netcdf files instead.') + stop 1 + end if + CALL read_bin(dirgridded_LAI(iBasin), nRows, nCols, LAIPer_iBasin, & + LAI0_3D, mask, lower = 1.00E-10_dp, upper = 30.0_dp) + CASE DEFAULT + call message() + call message('***ERROR: No recognized input format') + stop 1 + + END SELECT + + ! pack variables + nCells = count(mask) + nLAI = size(LAI0_3D, 3) + allocate(LAI0_2D(nCells, nLAI)) + + do iLAI = 1, nLAI + LAI0_2D(:, iLAI) = pack(LAI0_3D(:, :, iLAI), MASK = mask(:, :)) + end do + + ! append to Global variable + call append(L0_gridded_LAI, LAI0_2D(:, :)) + + !free space + deallocate(LAI0_2D, LAI0_3D) + + end subroutine prepare_gridded_daily_LAI_data + + ! ------------------------------------------------------------------ + + ! NAME + ! prepare_gridded_mean_monthly_LAI_data + + ! PURPOSE + !> \brief prepare_gridded_mean_monthly_LAI_data + + !> \details Long term mean monthly gridded LAI data at Level-0 (e.g., using MODIS datasets)\n + !> The netcdf file should contain 12 (calender months) gridded fields of climatological \n + !> LAI data at the input L0 data resolution. + + ! CALLING SEQUENCE + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" Basin Id + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + + ! EXAMPLE + + ! LITERATURE + ! None + + ! HISTORY + !> \author Rohini Kumar + !> \date Dec 2016 + ! + subroutine prepare_gridded_mean_monthly_LAI_data(iBasin, nrows, ncols, mask) + + use mo_mpr_global_variables, only : dirgridded_LAI, L0_gridded_LAI, nLAI + use mo_append, only : append ! append vector + use mo_ncread, only : Get_NcDim, Get_NcVar, Get_NcVarAtt + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_utils, only : eq + + implicit none + ! input + integer(i4), intent(in) :: iBasin, nrows, ncols + logical, dimension(:, :), intent(in) :: mask + integer(i4) :: ncells, iLAI + ! + real(dp), dimension(:, :, :), allocatable :: LAI0_3D !data at level-0 [nRow X nCols X nTimeSteps] + real(dp), dimension(:, :), allocatable :: LAI0_2D !data at level-0 [nCells X nTimeSteps] + + integer(i4) :: t + + ! + character(256) :: fName ! name of NetCDF file + character(256) :: AttValues ! netcdf attribute values + integer(i4) :: datatype ! datatype of attribute + integer(i4), dimension(5) :: dimen ! dimension for NetCDF file + real(dp) :: nodata_value ! data nodata value + + fName = trim(dirgridded_LAI(iBasin)) // trim('lai.nc') + + ! get dimensions + dimen = Get_NcDim(trim(fName), 'lai') + if ((dimen(1) .ne. nRows) .or. (dimen(2) .ne. nCols)) then + stop '***ERROR: read_forcing_nc: mHM generated x and y are not matching NetCDF dimensions' + end if + if (dimen(3) .ne. 12) then + stop '***ERROR: read_forcing_nc: the time dimenion of LAI NetCDF file under the option-1 is not 12' + end if + + ! determine no data value + call Get_NcVarAtt(trim(fName), 'lai', '_FillValue', AttValues, dtype = datatype) + ! convert to number + read(AttValues, *) nodata_value + + call Get_NcVar(trim(fName), 'lai', LAI0_3D) + + ! start checking values + do t = 1, dimen(3) + ! checking for nodata values if optional nocheck is given + if (any(eq(LAI0_3D(:, :, t), nodata_value) .and. (mask))) then + call message('***ERROR: read_forcing_nc: nodata value within basin ') + call message(' boundary in variable: ', 'lai') + call message(' at timestep : ', trim(num2str(t))) + stop + end if + ! optional check + if (any((LAI0_3D(:, :, t) .lt. 0.0_dp) .AND. mask(:, :))) then + call message('***ERROR: read_forcing_nc: values in variable lai are lower than ', trim(num2str(0, '(F7.2)'))) + call message(' at timestep : ', trim(num2str(t))) + call message('File: ', trim(fName)) + call message('Minval at timestep: ', trim(num2str(minval(LAI0_3D(:, :, t)), '(F7.2)'))) + call message('Total minval: ', trim(num2str(minval(LAI0_3D(:, :, :)), '(F7.2)'))) + stop + end if + + if (any((LAI0_3D(:, :, t) .gt. 30.0_dp) .AND. mask(:, :))) then + call message('***ERROR: read_forcing_nc: values in variable lai are greater than ', trim(num2str(30, '(F7.2)'))) + call message(' at timestep : ', trim(num2str(t))) + call message('File: ', trim(fName)) + call message('Maxval at timestep: ', trim(num2str(maxval(LAI0_3D(:, :, t)), '(F7.2)'))) + call message('Total maxval: ', trim(num2str(maxval(LAI0_3D(:, :, :)), '(F7.2)'))) + stop + end if + end do + + ! pack variables + nCells = count(mask) + nLAI = size(LAI0_3D, 3) + allocate(LAI0_2D(nCells, nLAI)) + do iLAI = 1, nLAI + LAI0_2D(:, iLAI) = pack(LAI0_3D(:, :, iLAI), MASK = mask(:, :)) + end do + + ! append to Global variable + call append(L0_gridded_LAI, LAI0_2D(:, :)) + + !free space + deallocate(LAI0_2D, LAI0_3D) + + end subroutine prepare_gridded_mean_monthly_LAI_data + + +END MODULE mo_prepare_gridded_LAI diff --git a/src/mHM/mo_read_meteo.f90 b/src/MPR/mo_read_bin.f90 similarity index 50% rename from src/mHM/mo_read_meteo.f90 rename to src/MPR/mo_read_bin.f90 index 1dadd127..f73c3936 100644 --- a/src/mHM/mo_read_meteo.f90 +++ b/src/MPR/mo_read_bin.f90 @@ -1,4 +1,4 @@ -!> \file mo_read_meteo.f90 +!> \file mo_read_bin.f90 !> \brief Reads meteorological input data. @@ -13,7 +13,7 @@ !> \date Dec 2012 ! Modified Sep 2015, Stephan Thober - separated routines for netcdf files from routines for binary files -MODULE mo_read_meteo +MODULE mo_read_bin ! This module provides routines to read meteorological data. @@ -26,7 +26,7 @@ MODULE mo_read_meteo PRIVATE - PUBLIC :: read_meteo_bin ! Read binary files + PUBLIC :: read_bin ! Read binary files ! ------------------------------------------------------------------ @@ -105,134 +105,134 @@ MODULE mo_read_meteo !> \date Dec 2012 ! Modified, Stephan Thober, Jun 2014 -- added julstart and julend - subroutine read_meteo_bin(folder, nRows, nCols, periode, data, mask, & - lower, upper ) + subroutine read_bin(folder, nRows, nCols, periode, data, mask, & + lower, upper) - use mo_kind, only: i4, dp, sp - use mo_common_variables, only: period - use mo_julian, only: date2dec - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_file, only: file_meteo_header, umeteo_header, & - file_meteo_binary_end, umeteo + use mo_kind, only : i4, dp, sp + use mo_common_variables, only : period + use mo_julian, only : date2dec + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_mpr_file, only : file_meteo_header, umeteo_header, & + file_meteo_binary_end, umeteo implicit none - character(len=*), intent(in) :: folder ! folder where data are stored - integer(i4), intent(in) :: nRows ! number of rows of data fields: + character(len = *), intent(in) :: folder ! folder where data are stored + integer(i4), intent(in) :: nRows ! number of rows of data fields: ! LONGITUDE dimension - integer(i4), intent(in) :: nCols ! number of columns of data fields: + integer(i4), intent(in) :: nCols ! number of columns of data fields: ! LATITUDE dimension - type(period), intent(in) :: periode ! time period - logical, dimension(:,:), intent(in) :: mask ! mask of valid data fields - real(dp), dimension(:,:,:), allocatable, intent(out) :: data ! data read in - real(dp), optional, intent(in) :: lower ! lower bound for data points - real(dp), optional, intent(in) :: upper ! upper bound for data points + type(period), intent(in) :: periode ! time period + logical, dimension(:, :), intent(in) :: mask ! mask of valid data fields + real(dp), dimension(:, :, :), allocatable, intent(out) :: data ! data read in + real(dp), optional, intent(in) :: lower ! lower bound for data points + real(dp), optional, intent(in) :: upper ! upper bound for data points ! local variables - integer(i4) :: i - character(10) :: dummy - integer(i4) :: nc, nr - character(4) :: yearStr - integer(i4) :: julStartYear, julEndYear ! start and end in julianDay of year - integer(i4) :: julStartPeriod, julEndPeriod ! start and end in julianDay of Period - integer(i4) :: cummulativeDays ! which day will be read in - integer(i4) :: day ! counter: actual day - integer(i4) :: year ! counter: actual year - integer(i4) :: record_number ! counter: record number in file - real(sp), dimension(:,:), allocatable :: tmp ! data of a single day - real(sp) :: nodata_value - character(256) :: fName - real(dp) :: jday_frac + integer(i4) :: i + character(10) :: dummy + integer(i4) :: nc, nr + character(4) :: yearStr + integer(i4) :: julStartYear, julEndYear ! start and end in julianDay of year + integer(i4) :: julStartPeriod, julEndPeriod ! start and end in julianDay of Period + integer(i4) :: cummulativeDays ! which day will be read in + integer(i4) :: day ! counter: actual day + integer(i4) :: year ! counter: actual year + integer(i4) :: record_number ! counter: record number in file + real(sp), dimension(:, :), allocatable :: tmp ! data of a single day + real(sp) :: nodata_value + character(256) :: fName + real(dp) :: jday_frac ! checking input nCols and nRows with header file of data files stored under folder/header.txt - fName = trim(adjustl(folder) )//trim(adjustl(file_meteo_header)) - open (unit=umeteo_header, file=trim(fName), status='old') + fName = trim(adjustl(folder)) // trim(adjustl(file_meteo_header)) + open (unit = umeteo_header, file = trim(fName), status = 'old') read (umeteo_header, *) dummy, nc read (umeteo_header, *) dummy, nr read (umeteo_header, *) dummy read (umeteo_header, *) dummy read (umeteo_header, *) dummy read (umeteo_header, *) dummy, nodata_value - dummy = dummy//'' ! only to avoid warning + dummy = dummy // '' ! only to avoid warning close(umeteo_header) - if ( (nc .ne. nRows) .or. (nr .ne. nCols) ) then - stop 'read_meteo_bin: mHM generated nRows and nCols are not matching header.txt information' + if ((nc .ne. nRows) .or. (nr .ne. nCols)) then + stop 'read_meteo_bin: mHM generated nRows and nCols are not matching header.txt information' end if - allocate( data(nRows, nCols, periode%julEnd - periode%julStart + 1_i4) ) + allocate(data(nRows, nCols, periode%julEnd - periode%julStart + 1_i4)) cummulativeDays = 0_i4 - yearLoop: do year=periode%yStart, periode%yEnd + yearLoop : do year = periode%yStart, periode%yEnd - write(yearStr, '(I4)') year - fName = trim(folder) // trim(yearStr) // trim(file_meteo_binary_end) - open(unit=umeteo, file=trim(fName), & - form='unformatted', access='direct', recl=4*nRows*nCols) + write(yearStr, '(I4)') year + fName = trim(folder) // trim(yearStr) // trim(file_meteo_binary_end) + open(unit = umeteo, file = trim(fName), & + form = 'unformatted', access = 'direct', recl = 4 * nRows * nCols) - ! julian day of starting and end year - jday_frac = date2dec(dd=01, mm=01, yy=year) - julStartYear = nint(jday_frac) + ! julian day of starting and end year + jday_frac = date2dec(dd = 01, mm = 01, yy = year) + julStartYear = nint(jday_frac) - jday_frac = date2dec(dd=31, mm=12, yy=year) - julEndYear = nint(jday_frac) + jday_frac = date2dec(dd = 31, mm = 12, yy = year) + julEndYear = nint(jday_frac) - ! Julian Days for the read-in period within this year - ! - same as above in intermediate years - ! - different if start or end of period is not first and last day of the year - julStartPeriod = Max(julStartYear, periode%julStart) - julEndPeriod = Min(julEndYear, periode%julEnd) - ! DaysOfYear = julEndYear - julStartYear + 1_i4 + ! Julian Days for the read-in period within this year + ! - same as above in intermediate years + ! - different if start or end of period is not first and last day of the year + julStartPeriod = Max(julStartYear, periode%julStart) + julEndPeriod = Min(julEndYear, periode%julEnd) + ! DaysOfYear = julEndYear - julStartYear + 1_i4 - dayLoop: do day = julStartPeriod, julEndPeriod - cummulativeDays = cummulativeDays + 1_i4 - record_number = day - julStartYear + 1_i4 - allocate(tmp(nCols,nRows)) - read(umeteo,rec=record_number) tmp - data(:,:,cummulativeDays) = real(transpose(tmp(:,:)), dp) - deallocate(tmp) - end do dayLoop + dayLoop : do day = julStartPeriod, julEndPeriod + cummulativeDays = cummulativeDays + 1_i4 + record_number = day - julStartYear + 1_i4 + allocate(tmp(nCols, nRows)) + read(umeteo, rec = record_number) tmp + data(:, :, cummulativeDays) = real(transpose(tmp(:, :)), dp) + deallocate(tmp) + end do dayLoop - close(umeteo) + close(umeteo) end do yearLoop ! start checking values - do i = 1, size( data, dim = 3 ) - ! for no data value - if( any( & - ( abs(data(:,:,i) - nodata_value) .LT. tiny(1.0_dp) ) .AND. & - mask(:,:) & - ) & - ) then - call message('***ERROR: nodata value within basin boundary in timestep: ', & - trim( num2str(i,'(I5.5)') ) ) - end if - - - ! optinal check - if (present(lower)) then - if( any( (data(:,:,i) .lt. lower) .AND. mask(:,:) ) ) then - call message('read_meteo_bin: ERROR occured: values at timestep: ', & - trim(num2str(i,'(I5.5)')), & - ' are lower than ', trim(num2str(lower,'(F7.2)')) ) - stop - end if - end if - - if (present(upper)) then - if( any( (data(:,:,i) .gt. upper) .AND. mask(:,:) ) ) then - call message('read_meteo_bin: ERROR occured: values at timestep ', & - trim(num2str(i,'(I5.5)')), & - ' are greater than ', trim(num2str(upper,'(F7.2)')) ) - stop - end if - end if + do i = 1, size(data, dim = 3) + ! for no data value + if(any(& + (abs(data(:, :, i) - nodata_value) .LT. tiny(1.0_dp)) .AND. & + mask(:, :) & + ) & + ) then + call message('***ERROR: nodata value within basin boundary in timestep: ', & + trim(num2str(i, '(I5.5)'))) + end if + + + ! optinal check + if (present(lower)) then + if(any((data(:, :, i) .lt. lower) .AND. mask(:, :))) then + call message('read_meteo_bin: ERROR occured: values at timestep: ', & + trim(num2str(i, '(I5.5)')), & + ' are lower than ', trim(num2str(lower, '(F7.2)'))) + stop + end if + end if + + if (present(upper)) then + if(any((data(:, :, i) .gt. upper) .AND. mask(:, :))) then + call message('read_meteo_bin: ERROR occured: values at timestep ', & + trim(num2str(i, '(I5.5)')), & + ' are greater than ', trim(num2str(upper, '(F7.2)'))) + stop + end if + end if end do - end subroutine read_meteo_bin + end subroutine read_bin -END MODULE mo_read_meteo +END MODULE mo_read_bin diff --git a/src/mHM/mo_read_lut.f90 b/src/MPR/mo_read_lut.f90 similarity index 76% rename from src/mHM/mo_read_lut.f90 rename to src/MPR/mo_read_lut.f90 index 2fb19214..fe459c3c 100644 --- a/src/mHM/mo_read_lut.f90 +++ b/src/MPR/mo_read_lut.f90 @@ -15,7 +15,7 @@ MODULE mo_read_lut ! Written Juliane Mai, Jan 2013 ! Modified Matthias Zink, Jan 2013 - add read_gauge_lut - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE @@ -92,32 +92,32 @@ MODULE mo_read_lut subroutine read_geoformation_lut(filename, fileunit, nGeo, geo_unit, geo_karstic) - implicit none + implicit none - character(len=*), intent(in) :: filename ! name of file - integer(i4), intent(in) :: fileunit ! unit to open file - integer(i4), intent(out) :: nGeo ! number of geological formations - integer(i4), dimension(:), allocatable, intent(out) :: geo_unit ! list of id numbers of each geological formations - integer(i4), dimension(:), allocatable, intent(out) :: geo_karstic ! id of the Karstic formation (0 == does not exist) + character(len = *), intent(in) :: filename ! name of file + integer(i4), intent(in) :: fileunit ! unit to open file + integer(i4), intent(out) :: nGeo ! number of geological formations + integer(i4), dimension(:), allocatable, intent(out) :: geo_unit ! list of id numbers of each geological formations + integer(i4), dimension(:), allocatable, intent(out) :: geo_karstic ! id of the Karstic formation (0 == does not exist) ! local variables - integer(i4) :: i + integer(i4) :: i character(256) :: dummy - open(fileunit, file=filename, action='read', status='old') + open(fileunit, file = filename, action = 'read', status = 'old') ! read header read(fileunit, *) dummy, nGeo read(fileunit, *) dummy - dummy = dummy//'' ! only to avoid warning + dummy = dummy // '' ! only to avoid warning ! allocation of arrays allocate(geo_unit(nGeo)) allocate(geo_karstic(nGeo)) ! read data - do i=1,nGeo - read(fileunit,*) dummy, geo_unit(i), geo_karstic(i), dummy + do i = 1, nGeo + read(fileunit, *) dummy, geo_unit(i), geo_karstic(i), dummy end do close(fileunit) @@ -184,34 +184,34 @@ end subroutine read_geoformation_lut subroutine read_lai_lut(filename, fileunit, nLAI, LAIIDlist, LAI) - use mo_mhm_constants, only: YearMonths ! months per year + use mo_common_constants, only : YearMonths ! months per year - implicit none + implicit none - character(len=*), intent(in) :: filename ! name of file - integer(i4), intent(in) :: fileunit ! unit to open file - integer(i4), intent(out) :: nLAI ! number of LAI classes - integer(i4), dimension(:), allocatable, intent(out) :: LAIIDlist ! List of ids of LAI classes - real(dp), dimension(:,:), allocatable, intent(out) :: LAI ! LAI per class (row) and month (col) + character(len = *), intent(in) :: filename ! name of file + integer(i4), intent(in) :: fileunit ! unit to open file + integer(i4), intent(out) :: nLAI ! number of LAI classes + integer(i4), dimension(:), allocatable, intent(out) :: LAIIDlist ! List of ids of LAI classes + real(dp), dimension(:, :), allocatable, intent(out) :: LAI ! LAI per class (row) and month (col) ! local variables - integer(i4) :: i, j + integer(i4) :: i, j character(256) :: dummy - open(fileunit, file=filename, action='read') + open(fileunit, file = filename, action = 'read') ! read header read(fileunit, *) dummy, nLAI read(fileunit, *) dummy - dummy = dummy//'' ! only to avoid warning + dummy = dummy // '' ! only to avoid warning ! allocate arrays allocate(LAIIDList(nLAI)) - allocate(LAI(nLAI, int(YearMonths,i4))) + allocate(LAI(nLAI, int(YearMonths, i4))) ! read data - do i=1,nLAI - read(fileunit, *) LAIIDList(i), dummy, (LAI(i,j),j=1,int(YearMonths,i4)) + do i = 1, nLAI + read(fileunit, *) LAIIDList(i), dummy, (LAI(i, j), j = 1, int(YearMonths, i4)) end do close(fileunit) diff --git a/src/MPR/mo_read_wrapper.f90 b/src/MPR/mo_read_wrapper.f90 new file mode 100644 index 00000000..f3e1b768 --- /dev/null +++ b/src/MPR/mo_read_wrapper.f90 @@ -0,0 +1,458 @@ +!> \file mo_read_wrapper.f90 + +!> \brief Wrapper for all reading routines. + +!> \details This module is to wrap up all reading routines.\n +!> The general written reading routines are used to store now the read data into global variables. + +!> \authors Juliane Mai, Matthias Zink +!> \date Jan 2013 + +MODULE mo_read_wrapper + + ! Written Juliane Mai & Matthias Zink, Jan 2013 + ! Modified + ! Luis Samaniego, Feb 2013 ! rotate fdir variable to the new coordinate system + + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PUBLIC :: read_data ! reads all available data + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! read_data + + ! PURPOSE + !> \brief Reads data. + + !> \details The namelists are already read by read_config call./n + !> All LUTs are read from their respective directory and information within those + !> files are shared across all basins to be modeled. + ! INTENT(IN) + ! None + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + !> \note read_config has to be called before + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Juliane Mai & Matthias Zink + !> \date Feb 2013 + ! Modified, + ! Luis Samaniego, Feb 2013 - rotate fdir variable to the new coordinate system + ! Rohini Kumar, Aug 2013 - name changed from "L0_LAI" to "L0_LCover_LAI" + ! Rohini Kumar, Aug 2013 - added dirSoil_LUT and dirGeology_LUT, and changed to + ! read datapaths and variables made accordingly + ! Rohini Kumar, Aug 2013 - added iFlag_LAI_data_format to handle LAI options, + ! and changed within the code made accordingly + ! Rohini Kumar, Sep 2013 - read input data for routing processes according + ! Stephan Thober to process_matrix flag + ! Matthias Zink Mar 2014 added inflow gauge + ! Kumar & Schroen Apr 2014 - added check for consistency of L0 and L1 spatial resolution + ! Stephan Thober Jun 2014 - added perform_mpr for omitting L0 read + ! Matthias Cuntz & + ! Juliane Mai Nov 2014 - LAI input from daily, monthly or yearly files + ! Stephan Thober Aug 2015 - moved routing related variables and routines to mRM + ! Rohini Kumar, Mar 2016 - options to handle different soil databases + ! Matthias Zink Mar 2014 - added subroutine for consistency check + ! Stephan Thober, Nov 2016 - moved processMatrix to common variables + ! Rohini Kuamr, Dec 2016 - option to handle monthly mean gridded fields of LAI + ! ------------------------------------------------------------------ + + subroutine read_data(LAIPer) + ! + use mo_common_read_data, only : read_dem, read_lcover + USE mo_read_lut, ONLY : read_lai_lut, & + read_geoformation_lut + USE mo_soil_database, ONLY : read_soil_LUT + USE mo_read_spatial_data, ONLY : read_spatial_data_ascii + USE mo_read_latlon, ONLY : read_latlon + USE mo_append, ONLY : append, paste + USE mo_string_utils, ONLY : num2str + USE mo_message, ONLY : message + use mo_timer, only : timer_get, timer_start, timer_stop + ! + USE mo_mpr_file, ONLY : file_geolut, ugeolut, & ! file name and unit of hydrogeology LuT + file_lailut, ulailut, & ! file name and unit of LAI LuT + file_slope, uslope, & ! file name and unit of slope map + file_aspect, uaspect, & ! file name and unit of aspect map + file_soilclass, usoilclass, & ! file name and unit of soil class map + file_hydrogeoclass, uhydrogeoclass, & ! file name and unit of hydrogeo class map + file_laiclass, ulaiclass, & ! file name and unit of lai class map + file_soil_database, & ! file name of soil class map (iFlag_soilDB = 0) + file_soil_database_1 ! file name of soil class map (iFlag_soilDB = 1) + USE mo_mpr_global_variables, ONLY : nGeoUnits, GeoUnitList, GeoUnitKar, & ! geological class information + L0_slope, & ! slope on input resolution (L0) + L0_asp, & ! aspect on input resolution (L0) + L0_soilId, & ! soil ID on L0 resolution + L0_geoUnit, & ! hydrogeological class ID on input resolution (L0) + timeStep_LAI_input, & ! flag on how LAI data has to be read + iFlag_soilDB, & ! options to handle different types of soil databases + nLAIclass, LAIUnitList, LAILUT, soilDB, L0_gridded_LAI, & + nSoilHorizons_mHM, & ! soil horizons info for mHM + nLAI + use mo_common_variables, ONLY : processMatrix, & ! Info about which process runs in which option + level0, & ! grid information (ncols, nrows, ..) + dirMorpho, & ! directories + dirCommonFiles, & ! directory of common files + L0_Basin, & ! L0_Basin ID + nBasins, & ! number of basins + Grid, & + period, & + global_parameters ! global parameters + USE mo_common_constants, ONLY : nodata_i4, nodata_dp, YearMonths_i4 ! mHM's global nodata vales + use mo_prepare_gridded_lai, only : prepare_gridded_daily_LAI_data, prepare_gridded_mean_monthly_LAI_data + + implicit none + + type(period), dimension(:), intent(in), optional :: LAIPer + ! local variables + integer(i4) :: iBasin, iVar, iHorizon, iMon, itimer, ll ! loop variables + integer(i4) :: nH ! dummy variable + integer(i4) :: nunit ! file unit of file to read + character(256) :: fName ! file name of file to read + real(dp), dimension(:, :), allocatable :: data_dp_2d + integer(i4), dimension(:, :), allocatable :: data_i4_2d + integer(i4), dimension(:, :), allocatable :: dataMatrix_i4 + logical, dimension(:, :), allocatable :: mask_2d + integer(i4), dimension(:), allocatable :: dummy_i4 + type(Grid), pointer :: level0_iBasin + + ! min. value of slope and aspect + real(dp), parameter :: slope_minVal = 0.01_dp + real(dp), parameter :: aspect_minVal = 1.00_dp + + call message(' Reading data ...') + itimer = 1 + call timer_start(itimer) + + call message(' Reading dem and lcover ...') + call read_dem() + call read_lcover() + + ! ************************************************ + ! READ LOOKUP TABLES + ! ************************************************ + ! + ! Soil LUT + if(iFlag_soilDB .eq. 0) then + fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_soil_database)) + else if(iFlag_soilDB .eq. 1) then + fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_soil_database_1)) + end if + call read_soil_LUT(trim(fName)) + + ! Geological formation LUT + fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_geolut)) + call read_geoformation_lut(trim(fName), ugeolut, nGeoUnits, GeoUnitList, GeoUnitKar) + + ! LAI LUT + if(timeStep_LAI_input .EQ. 0) then + fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_lailut)) + call read_lai_lut(trim(fName), ulailut, nLAIclass, LAIUnitList, LAILUT) + end if + + basins : do iBasin = 1, nBasins + + level0_iBasin => level0(L0_Basin(iBasin)) + + call message(' Reading data for basin: ', trim(adjustl(num2str(iBasin))), ' ...') + ! check whether L0 data is shared + if (iBasin .gt. 1) then + if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then + ! + call message(' Using data of basin ', & + trim(adjustl(num2str(L0_Basin(iBasin)))), ' for basin: ',& + trim(adjustl(num2str(iBasin))), '...') + ! DO NOT read L0 data + cycle + + end if + end if + + itimer = 2 + call timer_start(itimer) + + ! read slope and aspect - datatype real + nVars_real : do iVar = 1, 2 + select case (iVar) + case(1) ! slope + call message(' Reading slope ...') + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_slope)) + nunit = uslope + case(2) ! aspect + call message(' Reading aspect ...') + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_aspect)) + nunit = uaspect + end select + + ! reading + call read_spatial_data_ascii(trim(fName), nunit, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_dp_2d, mask_2d) + ! put global nodata value into array (probably not all grid cells have values) + data_dp_2d = merge(data_dp_2d, nodata_dp, mask_2d) + ! put data in variable + select case (iVar) + case(1) ! slope + call append(L0_slope, pack(data_dp_2d, level0_iBasin%mask)) + + case(2) ! aspect + call append(L0_asp, pack(data_dp_2d, level0_iBasin%mask)) + end select + ! deallocate arrays + deallocate(data_dp_2d, mask_2d) + + end do nVars_real + + ! read datatype integer + ! ***** CHANGE IS MADE HERE TO ACCOMODATE READ SEVERAL TYPES OF SOIL DATABASES + ! change from the earlier code where everything was done in the DO loop (**see below **) + ! here everything is more explicit and no do loop appears as was the case in previous version + + ! read soilID in both options + call message(' Reading soil ids ...') + + nH = 1 !> by default; when iFlag_soilDB = 0 + if(iFlag_soilDB .eq. 1) nH = nSoilHorizons_mHM + ! modified way to read multiple horizons specific soil class + do iHorizon = 1, nH + if(iFlag_soilDB .eq. 0) then + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_soilclass)) + else if(iFlag_soilDB .eq. 1) then + write(fName, 172) iHorizon + 172 format('soil_class_horizon_', i2.2, '.asc') + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(fName)) + end if + call read_spatial_data_ascii(trim(fName), usoilclass, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_i4_2d, mask_2d) + ! put global nodata value into array (probably not all grid cells have values) + data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) + call paste(dataMatrix_i4, pack(data_i4_2d, level0_iBasin%mask), nodata_i4) + deallocate(data_i4_2d) + end do + call append(L0_soilId, dataMatrix_i4) + deallocate(dataMatrix_i4) + + ! read geoUnit + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_hydrogeoclass)) + ! reading and transposing + call read_spatial_data_ascii(trim(fName), uhydrogeoclass, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_i4_2d, mask_2d) + ! put global nodata value into array (probably not all grid cells have values) + data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) + call append(L0_geoUnit, pack(data_i4_2d, level0_iBasin%mask)) + deallocate(data_i4_2d, mask_2d) + + ! LAI values + call message(' Reading LAI ...') + select case (timeStep_LAI_input) + case(1) ! long term mean monthly gridded fields + call prepare_gridded_mean_monthly_LAI_data(iBasin, level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%mask) + + case(0) ! long term mean monthly values per class with LUT + nLAI = YearMonths_i4 + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_laiclass)) + ! reading and transposing + call read_spatial_data_ascii(trim(fName), ulaiclass, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_i4_2d, mask_2d) + ! put global nodata value into array (probably not all grid cells have values) + data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) + allocate(dummy_i4(count(level0_iBasin%mask))) + dummy_i4 = pack(data_i4_2d, level0_iBasin%mask) + deallocate(data_i4_2d, mask_2d) + + call check_consistency_lut_map(dummy_i4, LAIUnitList, file_laiclass) + + allocate(data_dp_2d(count(level0_iBasin%mask), nLAI)) + do iMon = 1, nLAI + ! determine LAIs per month + do ll = 1, size(LAILUT, dim = 1) + data_dp_2d(:, iMon) = merge(LAILUT(ll, iMon), data_dp_2d(:, iMon), dummy_i4(:) .EQ. LAIUnitList(ll)) + end do + end do + call append(L0_gridded_LAI, data_dp_2d(:, :)) + deallocate(dummy_i4, data_dp_2d) + ! correction for 0 LAI values to avoid numerical instabilities + L0_gridded_LAI(:, :) = merge(1.00E-10_dp, L0_gridded_LAI(:, :), L0_gridded_LAI(:, :) .LT. 1.00E-10_dp) + L0_gridded_LAI(:, :) = merge(30.0_dp, L0_gridded_LAI(:, :), L0_gridded_LAI(:, :) .GT. 30.0_dp) + case(-3 : -1) ! daily, monthly or yearly gridded fields (time-series) + call prepare_gridded_daily_LAI_data(iBasin, level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%mask, & + LAIPer(iBasin)) + + end select + + ! read lat lon coordinates of each basin + call message(' Reading latitude/logitude ...') + call read_latlon(iBasin, "lon_l0", "lat_l0", "level0", level0_iBasin) + + call timer_stop(itimer) + call message(' in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.') + + end do basins + itimer = 1 + call timer_stop(itimer) + call message(' in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.') + + !Soil + ! determine name od soil class definition file based on input option iFlag_soilDB + if(iFlag_soilDB .eq. 0) then + fName = file_soil_database + else if(iFlag_soilDB .eq. 1) then + fName = file_soil_database_1 + end if + + ! If you are getting segmentation fault with intel on large file (e.g. here on soils), then + ! make sure to include following into your Marefile: INTEL_EXCLUDE := mo_read_wrapper.f90 + call check_consistency_lut_map(reshape(L0_soilId, (/ size(L0_soilId, 1) * size(L0_soilId, 2) /)), & + soilDB%id(:), fName) + ! Geology + call check_consistency_lut_map(L0_geoUnit, GeoUnitList, file_hydrogeoclass, dummy_i4) + + ! deactivate parameters of non existing geological classes in study domain for optimization + ! loop over geological units in look up list + do iVar = 1, size(GeoUnitList, 1) + ! check if unit appears in geological map (dummy_i4 is unique number in L0_geoUnit) + if (.not. ANY(dummy_i4 .EQ. GeoUnitList(iVar))) then + ! deactivate optimization flag (dim=4 from global_parameters) + global_parameters(processMatrix(9, 3) - processMatrix(9, 2) + iVar, 4) = 0 + call message('***WARNING: Geological unit ', trim(adjustl(num2str(GeoUnitList(iVar))))) + call message(' is not appearing in study domain.') + end if + end do + + deallocate(dummy_i4) ! is allocated in subroutine check_consistency_lut_map - geology + + !---------------------------------------------------------------- + ! Correction for slope and aspect -- min value set above + !---------------------------------------------------------------- + ! keep the colons (:) in the statements because of Intel's reallocation lhs problem + L0_slope(:) = merge(slope_minVal, L0_slope(:), (L0_slope(:) .lt. slope_minVal)) + L0_asp(:) = merge(aspect_minVal, L0_asp(:), (L0_asp(:) .lt. aspect_minVal)) + + end subroutine read_data + + ! ------------------------------------------------------------------ + + ! NAME + ! check_consistency_lut_map + + ! PURPOSE + !> \brief Checks if classes in input maps appear in look up tables. + + !> \details Determines wether a class appearing in the morphological input + !> is occuring in the respective look up table. mHM breaks if inconsistencies + !> are discovered. + ! INTENT(IN) + !> \param[in] " integer(i4), dimension(:) :: data" map of study domain + !> \param[in] "integer(i4), dimension(:) :: lookuptable" look up table corresponding to map + !> \param[in] "character(*) :: filename" name of the lut file - ERORR warn + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + !> \param[out] "integer(i4), dimension(:), allocatable :: unique_values" array of unique values in data + + ! RETURN + ! None + + ! RESTRICTIONS + !> \none + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink + !> \date Nov 2016 + ! ------------------------------------------------------------------ + + subroutine check_consistency_lut_map(data, lookuptable, filename, unique_values) + + USE mo_orderpack, ONLY : unista + USE mo_string_utils, ONLY : num2str + USE mo_message, ONLY : message + + implicit none + + integer(i4), dimension(:), intent(in) :: data ! map of study domain + integer(i4), dimension(:), intent(in) :: lookuptable ! look up table corresponding to map + character(*), intent(in) :: filename ! name of the lut file - ERORR warn + integer(i4), dimension(:), allocatable, intent(out), optional :: unique_values ! array of unique values in data + + ! local variables + integer(i4) :: n_unique_elements + integer(i4) :: ielement + integer(i4), dimension(:), allocatable :: temp + + allocate(temp(size(data, 1))) + ! copy L0_geoUnit because subroutine unista overwrites the nunit entries of the + ! input array with the unique array values + temp = data + ! retrieve unique values of data + call unista(temp, n_unique_elements) + ! check if unit exists in look up table + do ielement = 1, n_unique_elements + if (.not. ANY(lookuptable .EQ. temp(ielement))) then + call message() + call message('***ERROR: Class ', trim(adjustl(num2str(temp(ielement)))), ' is missing') + call message(' in input file ', trim(adjustl(filename)), ' ...') + stop + end if + end do + + ! pass unique values if optional argument unique_values is given + if (present(unique_values)) then + allocate(unique_values(n_unique_elements)) + unique_values(:) = temp(1 : n_unique_elements) + end if + deallocate(temp) + + end subroutine check_consistency_lut_map + + +END MODULE mo_read_wrapper diff --git a/src/MPR/mo_soil_database.f90 b/src/MPR/mo_soil_database.f90 new file mode 100644 index 00000000..0b4f077d --- /dev/null +++ b/src/MPR/mo_soil_database.f90 @@ -0,0 +1,537 @@ +!> \file mo_soil_database.f90 + +!> \brief Generating soil database from input file. + +!> \details This module provides the routines for generating the soil database for mHM from an ASCII input file.\n +!> One routine \e read_soil_LUT reads a soil LookUpTable, performs some consistency checks and returns an initial soil database. +!> The second routine \e generate_soil_database calculates based on the initial one the proper soil database. + +!> \authors Juliane Mai +!> \date Dec 2012 + +MODULE mo_soil_database + + ! This module to provide a soil database for mHM. + + ! Written Juliane Mai, Dec 2012 + + use mo_kind, only : i4, dp + use mo_message, only : message + use mo_string_utils, only : num2str + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: read_soil_LUT ! Reads the soil LUT file + PUBLIC :: generate_soil_database ! Generates the soil database + + ! ------------------------------------------------------------------ + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! read_soil_LUT + + !> \brief Reads the soil LUT file. + + !> \details Reads the soil LookUpTable file and checks for consistency. + + ! INDENT(IN) + !> \param[in] "character(len=*) :: filename" filename of the soil LUT + !> \param[in] "integer(i4) :: iFlag_soilDB" option for which kind of database to read + + + ! INDENT(INOUT) + ! None + + ! INDENT(OUT) + !> \param[out] "type(soilType) :: soilDB" initialized soil database + + ! INDENT(IN), OPTIONAL + ! None + + ! INDENT(INOUT), OPTIONAL + ! None + + ! INDENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + !> \note Soil LUT is an ASCII file. + + ! EXAMPLE + ! call read_soil_LUT('soil_BUEK_1000_LUT.txt', soilDB) + + ! LITERATURE + ! None + + ! HISTORY + !> \author Juliane Mai + !> \date Dec 2012 + ! Modified: Luis Samaniego, Nov 2013, transform relation op. == -> .eq. etc + ! Rohini Kumar, Mar 2016 - new variables for handling different soil databases + + subroutine read_soil_LUT(filename) + use mo_mpr_global_variables, only : tillageDepth, nSoilHorizons_mHM, HorizonDepth_mHM ! value is used + use mo_mpr_global_variables, only : nSoilTypes, iFlag_soilDB, soilDB ! value is set + use mo_mpr_file, only : usoil_database + use mo_mpr_constants, only : nLCover_class ! number of land cover classes + use mo_common_constants, only : & + nodata_i4, nodata_dp, & ! global nodata values (i4, dp) + eps_dp ! epsilon(1.0) in double precision + + implicit none + + character(len = *), intent(in) :: filename ! filename of the soil LUT + + ! local variables + character(len = 10) :: dummy + integer(i4) :: ios + integer(i4) :: ii, jj, kk + integer(i4) :: nR, nH + real(dp) :: up, down + real(dp) :: cly, snd, bd + real(dp) :: dmin + integer(i4) :: maxNumberHorizons + integer(i4) :: minNumberTillHorizons, maxNumberTillHorizons + + SELECT CASE (iFlag_soilDB) + ! classical mHM soil database + CASE(0) + ios = 0_i4 + open(usoil_database, file = filename, status = 'old', iostat = ios) + read(usoil_database, *) dummy, nSoilTypes + dummy = dummy // '' ! only to avoid warning + + ! allocate space + allocate(soilDB%Id(nSoilTypes)) + allocate(soilDB%nHorizons(nSoilTypes)) + allocate(soilDB%nTillHorizons(nSoilTypes)) + allocate(soilDB%RZdepth(nSoilTypes)) + ! initialize + soilDB%Id(:) = nodata_i4 + soilDB%nHorizons(:) = nodata_i4 + soilDB%nTillHorizons(:) = nodata_i4 + soilDB%RZdepth(:) = nodata_dp + + ! initalise total rows to read + nR = 0_i4 + read(usoil_database, *) dummy + do while (.NOT. (ios .ne. 0)) + read(usoil_database, *, IOSTAT = ios) ii, jj, up, down, cly, snd, bd + + ! Checks + if(up .ge. down) then + call message('read_soil_LUT: ERROR occurred: Mixed horizon depths in soil type', & + num2str(ii, '(I3)'), ' and horizon no.', num2str(jj, '(I3)')) + stop + end if + if(cly .lt. 0.0_dp .OR. cly .gt. 100.0_dp .OR. & + snd .lt. 0.0_dp .OR. snd .gt. 100.0_dp .OR. & + bd .lt. 0.0_dp .OR. bd .gt. 5.0_dp) then + call message('read_soil_LUT: ERROR occurred: Inappropriate soil properties in soil type', & + num2str(ii, '(I3)'), ' and horizon no.', num2str(jj, '(I3)')) + stop + end if + + ! initalise soil id + soilDB%Id(ii) = ii + soilDB%nHorizons(ii) = jj + if(anint(down, dp) .gt. soilDB%RZdepth(ii)) soilDB%RZdepth(ii) = anint(down, dp) + + nR = nR + 1_i4 + + end do + + ! initalise minimum root zone depth among all soil types + dMin = minval(soilDB%RZdepth(:), soilDB%RZdepth(:) .gt. 0.0_dp) + + ! check the tillage depth...(if possible adjust it..) + if(tillageDepth .gt. dMin) then + call message('read_soil_LUT: ERROR occurred: ') + call message(' Tillage depth is greater than overall minimum total soil depth ') + call message(' So tillage depth should be at least', num2str(dMin, '(F7.2)')) + call message(' Please adjust!') + stop + end if + + ! insert a new tillage soil layer, only in those soil types, in which it is not present + rewind(usoil_database) + read(usoil_database, *) dummy + read(usoil_database, *) dummy + + ! Last row is read twice so, read only upto (nR - 1) + do ii = 1, nR - 1 + read(usoil_database, *) jj, nH, up, down, cly, snd, bd + if(tillageDepth .gt. anint(up, dp) .and. tillageDepth .lt. anint(down, dp)) then + soilDB%nHorizons(jj) = soilDB%nHorizons(jj) + 1_i4 + end if + + ! identify upto which soil horizon does the tillage depth goes in + if(tillageDepth .gt. anint(up, dp) .and. tillageDepth .le. anint(down, dp)) then + soilDB%nTillHorizons(jj) = nH + end if + end do + + maxNumberHorizons = maxval(soilDB%nHorizons(:)) + + ! the variables of soilType are all allocated with maximal number of Horizons although not for each of the + ! nSoilTypes the array will be used + ! loops for array(i,j) should be: j=1, nHorizons(i), otherwise a nodata_dp will appear + allocate(soilDB%UD(nSoilTypes, maxNumberHorizons)) + allocate(soilDB%LD(nSoilTypes, maxNumberHorizons)) + allocate(soilDB%depth(nSoilTypes, maxNumberHorizons)) + allocate(soilDB%clay(nSoilTypes, maxNumberHorizons)) + allocate(soilDB%sand(nSoilTypes, maxNumberHorizons)) + allocate(soilDB%dbM(nSoilTypes, maxNumberHorizons)) + + soilDB%UD(:, :) = nodata_dp + soilDB%LD(:, :) = nodata_dp + soilDB%depth(:, :) = nodata_dp + soilDB%clay(:, :) = nodata_dp + soilDB%sand(:, :) = nodata_dp + soilDB%dbM(:, :) = nodata_dp + + ! allocate space for other derived soil hydraulic properties ... + minNumberTillHorizons = minval(soilDB%nTillHorizons(:)) + maxNumberTillHorizons = maxval(soilDB%nTillHorizons(:)) + + allocate(soilDB%thetaS_till(nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class)) + allocate(soilDB%thetaS(nSoilTypes, minNumberTillHorizons + 1 : maxNumberHorizons)) + + allocate(soilDB%thetaFC_till(nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class)) + allocate(soilDB%thetaFC(nSoilTypes, minNumberTillHorizons + 1 : maxNumberHorizons)) + + allocate(soilDB%thetaPW_till(nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class)) + allocate(soilDB%thetaPW(nSoilTypes, minNumberTillHorizons + 1 : maxNumberHorizons)) + + allocate(soilDB%Db(nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class)) + + allocate(soilDB%Ks(nSoilTypes, 1 : maxNumberHorizons, nLCover_class)) + + ! Initialize with default nodata_dp + soilDB%thetaS_till(:, :, :) = nodata_dp + soilDB%thetaS(:, :) = nodata_dp + + soilDB%thetaFC_till(:, :, :) = nodata_dp + soilDB%thetaFC(:, :) = nodata_dp + + soilDB%thetaPW_till(:, :, :) = nodata_dp + soilDB%thetaPW(:, :) = nodata_dp + + soilDB%Db(:, :, :) = nodata_dp + soilDB%Ks(:, :, :) = nodata_dp + + ! Read again soil properties from the data base + rewind(usoil_database) + read(usoil_database, *) dummy + read(usoil_database, *) dummy + + ! Last row is read twice so, read only upto (nR - 1) + kk = 0_i4 + do ii = 1, nR - 1_i4 + read(usoil_database, *) jj, nH, up, down, cly, snd, bd + + ! to avoid numerical errors in PTF + if(cly .lt. 1.0_dp) cly = 1.0_dp + if(snd .lt. 1.0_dp) snd = 1.0_dp + + ! Physical consistency + if((cly + snd) .gt. 100.0_dp) then + cly = cly / (cly + snd) + snd = snd / (cly + snd) + end if + + ! check for an extra tillage horizon (if not exists create a layer) + if(tillageDepth .gt. anint(up, dp) .and. tillageDepth .lt. anint(down, dp)) then + + soilDB%UD(jj, nH) = anint(up, dp) + soilDB%LD(jj, nH) = tillageDepth + soilDB%depth(jj, nH) = soilDB%LD(jj, nH) - soilDB%UD(jj, nH) + soilDB%clay(jj, nH) = cly + soilDB%sand(jj, nH) = snd + soilDB%dbM(jj, nH) = bd + + ! initalise the upper depth to new value... and the increment counter + up = tillageDepth + kk = 1_i4 + end if + + ! increment nH by one once it encounter the upper loop.. + if(kk .eq. 1_i4) nH = nH + 1_i4 + + soilDB%UD(jj, nH) = anint(up, dp) + soilDB%LD(jj, nH) = anint(down, dp) + soilDB%depth(jj, nH) = soilDB%LD(jj, nH) - soilDB%UD(jj, nH) + soilDB%clay(jj, nH) = cly + soilDB%sand(jj, nH) = snd + soilDB%dbM(jj, nH) = bd + + ! check for number of soil horizons... + if(nH .gt. soilDB%nHorizons(jj)) then + call message('read_soil_LUT: ERROR occurred: ') + call message(' There is something wrong in allocating horizons in soil data base.') + call message(' Please check in code !') + STOP + end if + + ! initalise the increment counter to zero + if(nH .eq. soilDB%nHorizons(jj)) kk = 0_i4 + + end do + close(usoil_database) + + ! soil database for the horizon specific case + CASE(1) + open(usoil_database, file = filename, status = 'old', action = 'read') + read(usoil_database, *) dummy, nSoilTypes + dummy = dummy // '' ! only to avoid warning + allocate(soilDB%Id (nSoilTypes)) + allocate(soilDB%clay(nSoilTypes, 1)) + allocate(soilDB%sand(nSoilTypes, 1)) + allocate(soilDB%dbM (nSoilTypes, 1)) + soilDB%clay(:, :) = nodata_dp + soilDB%sand(:, :) = nodata_dp + soilDB%dbM (:, :) = nodata_dp + read(usoil_database, *) dummy + do kk = 1, nSoilTypes + read(usoil_database, *) jj, cly, snd, bd + ! to avoid numerical errors in PTF + if(cly .lt. 1.0_dp) cly = 1.0_dp + if(snd .lt. 1.0_dp) snd = 1.0_dp + soilDB%Id(kk) = jj + soilDB%clay(kk, 1) = cly + soilDB%sand(kk, 1) = snd + soilDB%dbM (kk, 1) = bd + end do + close(usoil_database) + + ! assign up to which horizon layer a soil is treated as tillage layer + ! since our horizon information is well defined for modeling too + ! this information is uniform across all soils/modeling cells + ! for compatibility with iFlag_soilDB == 0, assign + ! both nHorizons & tillage horizons + allocate(soilDB%nHorizons(1)) + allocate(soilDB%nTillHorizons(1)) + soilDB%nHorizons(:) = nSoilHorizons_mHM + soilDB%nTillHorizons(:) = -9 + do kk = 1, nSoilHorizons_mHM + if(abs(HorizonDepth_mHM(kk) - tillageDepth) .lt. eps_dp) then + soilDB%nTillHorizons(1) = kk + end if + end do + + ! check + if(soilDB%nTillHorizons(1) .eq. -9) then + ! rarely could happen *** since this is checked in reading of horizons depths only + ! but is checked here for double confirmation + call message() + call message('***ERROR: specification of tillage depths is not confirming') + call message(' with given depths of soil horizons to be modeled.') + stop + else + call message() + call message('Tillage layers: the tillage horizons are modelled ') + call message(' upto mHM layers: ', trim(num2str(soilDB%nTillHorizons(1)))) + end if + + CASE DEFAULT + call message() + call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') + stop + + END SELECT + + end subroutine read_soil_LUT + + ! ------------------------------------------------------------------ + + ! NAME + ! generate_soil_database + + !> \brief Generates soil database. + + !> \details Calculates the proper soil database using the initialized soil database from read_soil_LUT. + + ! INDENT(IN) + ! None + + ! INDENT(INOUT) + !> \param[in,out] "type(soilType) :: soilDB" initialized/ proper soil database + !> \param[in] "integer(i4) :: iFlag_soilDB" option for which kind of database to read + ! INDENT(OUT) + ! None + + ! INDENT(IN), OPTIONAL + ! None + + ! INDENT(INOUT), OPTIONAL + ! None + + ! INDENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! call generate_soil_database(soilDB) + + ! LITERATURE + ! None + + ! HISTORY + !> \author Juliane Mai + !> \date Dec 2012 + ! Modified, Rohini Kumar & + ! Juliane Mai, Apr, 2013 - wieght for no-contributing soil horizons are intialized with nodata value + ! Rohini Kumar, Mar, 2016 - new variables for handling different soil databases + + ! ------------------------------------------------------------------ + + subroutine generate_soil_database() + + use mo_mpr_global_variables, only : nSoilTypes, nSoilHorizons_mHM, HorizonDepth_mHM ! Type definition + use mo_common_constants, only : nodata_i4, nodata_dp ! global nodata values (i4, dp) + use mo_mpr_global_variables, only : soilDB, & + iFlag_soilDB ! options to handle different types of soil databases + + implicit none + + ! local variables + integer(i4) :: ii, jj, kk + real(dp) :: dmin + real(dp) :: dpth_f, dpth_t + integer(i4) :: layer_f, layer_t + real(dp), parameter :: small = 0.000001_dp + real(dp), parameter :: soil_dAccuracy = 0.5_dp ! [mm] soil depth accuracy + + SELECT CASE (iFlag_soilDB) + ! classical mHM soil database + CASE(0) + ! initalise minimum root zone depth among all soil types + dMin = minval(soilDB%RZdepth(:), soilDB%RZdepth(:) > 0.0_dp) + + ! check + if (HorizonDepth_mHM(nSoilHorizons_mHM - 1) .ge. dMin) then + call message('generate_soil_database: ERROR occurred: ') + call message(' The depth of soil Horizons provided for modelling is not appropriate') + call message(' The global minimum of total soil horizon depth among all soil type is ', num2str(dMin, '(F7.2)')) + call message(' Adjust your modeling soil horizon depth in this range') + call message(' OR Increase the soil depth in data base for only those soil types') + call message(' whose total depth is smaller than your given modeling depth.') + STOP + end if + + ! allocate and initalise depth weight + allocate(soilDB%Wd(nSoilTypes, nSoilHorizons_mHM, maxval(soilDB%nHorizons(:)))) + soilDB%Wd(:, :, :) = 0.0_dp + + ! Process further to estimate weight of each horizons + ! weightage according to soil depths + do ii = 1, nSoilTypes + soilDB%Wd(ii, :, soilDB%nHorizons(ii) + 1_i4 : maxval(soilDB%nHorizons(:))) = nodata_dp + + ! initalise last horizon depth to model w.r.t to surface + ! NOTE:: it is different for each soil + HorizonDepth_mHM(nSoilHorizons_mHM) = soilDB%RZdepth(ii) + + ! Estimate soil properties for each modeling layers + do jj = 1, nSoilHorizons_mHM + + ! modeling depth ( **from --> to ** ) + ! take into account the depth accuracy [0.5mm, defined in module..] + dpth_f = 0.0_dp + if(jj .ne. 1_i4) dpth_f = HorizonDepth_mHM(jj - 1) + dpth_t = HorizonDepth_mHM(jj) - soil_dAccuracy + + ! identify to which layer of batabase this mHM horizon lies + layer_f = nodata_i4 + layer_t = nodata_i4 + do kk = 1, soilDB%nHorizons(ii) + if(dpth_f .ge. soilDB%UD(ii, kk) .and. dpth_f .le. (soilDB%LD(ii, kk) - soil_dAccuracy)) layer_f = kk + if(dpth_t .ge. soilDB%UD(ii, kk) .and. dpth_t .le. (soilDB%LD(ii, kk) - soil_dAccuracy)) layer_t = kk + end do + + ! Check + if(layer_f .le. 0_i4 .or. layer_t .le. 0_i4) then + call message('generate_soil_database: ERROR occurred: ') + call message(' Horizon depths to model do not lie in database for soil type', num2str(ii, '(I3)')) + call message(' Please check!') + STOP + end if + if(layer_f .gt. layer_t) then + call message('generate_soil_database: ERROR occurred: ') + call message(' Something is wrong in assignment of modeling soil horizons or') + call message(' database of soil type ', num2str(ii, '(I3)')) + call message(' Please check!') + STOP + end if + + ! iF modeling depth of a given horizon falls in a same soil layer + if(layer_f .eq. layer_t) then + soilDB%Wd(ii, jj, layer_f) = 1.0_dp + + ! else estimate depth weightage... + else + + ! for starting layer... + soilDB%Wd(ii, jj, layer_f) = soilDB%LD(ii, layer_f) - dpth_f + + ! for ending layer + soilDB%Wd(ii, jj, layer_t) = (dpth_t + soil_dAccuracy) - soilDB%UD(ii, layer_t) + + ! other intermediate layers weight, if exit + if(layer_t - layer_f .gt. 1_i4) then + do kk = layer_f + 1, layer_t - 1 + soilDB%Wd(ii, jj, kk) = soilDB%LD(ii, kk) - soilDB%UD(ii, kk) + end do + end if + + ! Estimate depth weightage + if(jj .ne. 1_i4) then + soilDB%Wd(ii, jj, 1 : soilDB%nHorizons(ii)) = soilDB%Wd(ii, jj, 1 : soilDB%nHorizons(ii)) / & + (HorizonDepth_mHM(jj) - HorizonDepth_mHM(jj - 1_i4)) + else + soilDB%Wd(ii, jj, 1 : soilDB%nHorizons(ii)) = soilDB%Wd(ii, jj, 1 : soilDB%nHorizons(ii)) / & + HorizonDepth_mHM(jj) + end if + + ! Check (small margin for numerical errors) + if(sum(soilDB%Wd(ii, jj, :), soilDB%Wd(ii, jj, :) .gt. 0.0_dp) .le. 1.0_dp - small .or. & + sum(soilDB%Wd(ii, jj, :), soilDB%Wd(ii, jj, :) .gt. 0.0_dp) .ge. 1.0_dp + small) then + call message('generate_soil_database: ERROR occurred: ') + call message(' Weight assigned for each soil horizons are not correct.') + call message(' Please check!') + STOP + end if + + end if + + end do + end do + ! soil database for the horizon specific case + CASE(1) + ! right now nothing is done here + ! *** reserved for future changes + return + + CASE DEFAULT + call message() + call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') + stop + + END SELECT + + end subroutine generate_soil_database + +END MODULE mo_soil_database diff --git a/src/MPR/mo_upscaling_operators.f90 b/src/MPR/mo_upscaling_operators.f90 new file mode 100644 index 00000000..613cfe05 --- /dev/null +++ b/src/MPR/mo_upscaling_operators.f90 @@ -0,0 +1,717 @@ +!> \file mo_upscaling_operators.f90 + +!> \brief Module containing upscaling operators. + +!> \details This module provides the routines for upscaling_operators. + +!> \authors Giovanni Dalmasso, Rohini Kumar +!> \date Dec 2012 + +module mo_upscaling_operators + + ! This module contains the functions for upscaling grid L0_fineScale_2D_data. + + ! Written Giovanni Dalmasso, Rohini Kumar, Dec 2012 + + use mo_kind, only : i4, dp + + implicit none + + private + + public :: majority_statistics ! upscale grid L0_fineScale_2D_data based on a majority statistics + public :: L0_fractionalCover_in_Lx ! fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11) + public :: upscale_arithmetic_mean ! upscale grid L0_fineScale_2D_data based on a ARITHMETIC MEAN + public :: upscale_harmonic_mean ! upscale grid L0_fineScale_2D_data based on a HARMONIC MEAN + public :: upscale_geometric_mean ! upscale grid L0_fineScale_2D_data based on a GEOMETRIC MEAN + +contains + + ! ---------------------------------------------------------------------------- + + ! NAME + ! majority_statistics + + !> \brief majority statistics + + !> \details upscale grid L0_fineScale_2D_data based on a majority statistics + + ! INTENT(IN) + !> \param[in] "integer(i4) :: nClass" number of classes + !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L0_fineScale_2D_data(:,:)" high resolution data + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + !> \return integer(i4) :: majority_statistics(:) — Upscaled variable based on majority. + + ! RESTRICTIONS + !> \note Input values must be floating points. + + ! EXAMPLE + ! calling sequence + ! variable = majority_statistics( nClass, & + ! L1_upper_rowId_cell, & + ! L1_lower_rowId_cell, & + ! L1_left_colonId_cell, & + ! L1_right_colonId_cell, & + ! L0_fineScale_2D_data, & + ! ) + ! + ! LITERATURE + ! None + + ! HISTORY + !> \author Giovanni Dalmasso, Rohini Kumar + !> \date Dec 2012 + ! Written, Giovanni Dalmasso, Dec 2012 + + function majority_statistics(nClass, & ! number of classes + L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell + L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell + L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell + L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell + L0_fineScale_2D_data & ! high resolution data + ) + + implicit none + ! input + integer(i4), intent(in) :: nClass + integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell + integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell + integer(i4), dimension(:, :), intent(in) :: L0_fineScale_2D_data + ! output + integer(i4), dimension(size(L1_upper_rowId_cell, 1)) :: majority_statistics + + ! local variables + integer(i4) :: L1_nCells + integer(i4) :: iu, id, jl, jr + integer(i4) :: nC + integer(i4) :: max_val + integer(i4) :: kk, ll + + L1_nCells = size(majority_statistics, 1) + + do kk = 1, L1_nCells + iu = L1_upper_rowId_cell(kk) + id = L1_lower_rowId_cell(kk) + jl = L1_left_colonId_cell(kk) + jr = L1_right_colonId_cell(kk) + + max_val = -9999 + do ll = 1, nClass + nC = count(L0_fineScale_2D_data(iu : id, jl : jr) == ll) + if(nC > max_val) then + majority_statistics(kk) = ll + max_val = nC + end if + end do + end do + + end function majority_statistics + + ! ------------------------------------------------------------------ + + ! NAME + ! L0_fractionalCover_in_Lx + + !> \brief fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11) + + !> \details Fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11). + !> For example, this routine can be used for calculating the karstic fraction. + + ! INTENT(IN) + !> \param[in] "integer(i4), dimension(:,:) :: dataIn0" input fields at finer scale + !> \param[in] "integer(i4) :: classId" class id for which fraction has to be estimated + !> \param[in] "logical, dimension(:,:) :: mask0" finer scale L0 mask + !> \param[in] "integer(i4), dimension(:) :: L0upBound_inLx" row start at finer L0 scale + !> \param[in] "integer(i4), dimension(:) :: L0downBound_inLx" row end at finer L0 scale + !> \param[in] "integer(i4), dimension(:) :: L0leftBound_inLx" col start at finer L0 scale + !> \param[in] "integer(i4), dimension(:) :: L0rightBound_inLx" col end at finer L0 scale + !> \param[in] "integer(i4), dimension(:) :: nTCells0_inLx" total number of valid L0 cells in a given Lx cell + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + !> \return real(dp) :: L0_fractionalCover_in_Lx(:) — packed 1D fraction coverage (Lx) of given class id + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Rohini Kumar + !> \date Feb 2013 + + ! ------------------------------------------------------------------ + + function L0_fractionalCover_in_Lx(& + dataIn0, & ! input fields at finer scale + classId, & ! class id for which fraction has to be estimated + mask0, & ! finer scale L0 mask + L0upBound_inLx, & ! row start at finer L0 scale + L0downBound_inLx, & ! row end at finer L0 scale + L0leftBound_inLx, & ! col start at finer L0 scale + L0rightBound_inLx, & ! col end at finer L0 scale + nTCells0_inLx & ! total number of valid L0 cells in a given Lx cell + ) result(frac_cover_Lx) ! packed 1D data at coarser scale (Lx = L1 or L11) + + use mo_common_constants, only : nodata_i4 + + implicit none + + ! input + integer(i4), dimension(:), intent(in) :: dataIn0 + integer(i4), intent(in) :: classId + logical, dimension(:, :), intent(in) :: mask0 + integer(i4), dimension(:), intent(in) :: L0upBound_inLx + integer(i4), dimension(:), intent(in) :: L0downBound_inLx + integer(i4), dimension(:), intent(in) :: L0leftBound_inLx + integer(i4), dimension(:), intent(in) :: L0rightBound_inLx + integer(i4), dimension(:), intent(in) :: nTCells0_inLx + + ! return + real(dp), dimension(size(L0upBound_inLx, 1)) :: frac_cover_Lx + + ! local variables + integer(i4) :: kk, iu, id, jl, jr, nT + integer(i4) :: nrows0, ncols0 + integer(i4), dimension(:, :), allocatable :: dummy_Matrix + integer(i4), dimension(:, :), allocatable :: nodata_val + integer(i4) :: nCells1 + + ! estimate number of cells + nCells1 = size(L0upBound_inLx, 1) + + ! get nrows and ncols + nrows0 = size(mask0, 1) + ncols0 = size(mask0, 2) + + !unpack input data from 1D to 2D + allocate(dummy_Matrix(nrows0, ncols0)) + allocate(nodata_val(nrows0, ncols0)) + nodata_val(:, :) = nodata_i4 + dummy_Matrix(:, :) = unpack(dataIn0(:), mask0(:, :), nodata_val(:, :)) + + ! initalize return variable + frac_cover_Lx(:) = 0.0_dp + + ! start calculation + do kk = 1, nCells1 + iu = L0upBound_inLx(kk) + id = L0downBound_inLx(kk) + jl = L0leftBound_inLx(kk) + jr = L0rightBound_inLx(kk) + nT = nTCells0_inLx(kk) + + frac_cover_Lx(kk) = real(count(dummy_Matrix(iu : id, jl : jr) == classId), dp) / real(nT, dp) + + end do + + ! free space + deallocate(dummy_Matrix, nodata_val) + + end function L0_fractionalCover_in_Lx + + ! ---------------------------------------------------------------------------- + + ! NAME + ! upscale_arithmetic_mean + + !> \brief aritmetic mean + + !> \details upscaling of level-0 grid data to level-1 using aritmetic mean + + ! INTENT(IN) + !> \param[in] "integer(i4) :: nL0_cells_in_L1_cell(:)" number of level-0 cells within a level-1 cell + !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L0_cellId(:,:)" cell ID at level-0 + !> \param[in] "logical :: mask0(:,:)" mask at Level 0 + !> \param[in] "real(dp) :: nodata_value" no data value + !> \param[in] "real(dp) :: L0_fineScale_data(:,:)" high resolution data + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + !> \return real(dp) :: upscale_arithmetic_mean(:) — Upscaled variable from L0 to L1 using arithmetic mean + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! variable = upscale_arithmetic_mean( nL0_cells_in_L1_cell, & + ! L1_upper_rowId_cell, L1_lower_rowId_cell, & + ! L1_left_colonId_cell, L1_right_colonId_cell, & + ! L0_cellId, mask0, & + ! nodata_value, L0_fineScale_2D_data & + ! ) + + ! LITERATURE + ! None + + ! HISTORY + !> \author Giovanni Dalmasso, Rohini Kumar + !> \date Dec 2012 + ! Written, Giovanni Dalmasso, Dec 2012 + ! Modified, Stephan Thober, Feb 2013 - changed dimension of L0 input from 2d to 1d + + function upscale_arithmetic_mean(& + nL0_cells_in_L1_cell, & ! number of level-0 cells within a level-1 cell + L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell + L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell + L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell + L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell + L0_cellId, & ! cell ID at level-0 + mask0, & ! mask at level 0 + nodata_value, & ! no data value + L0_fineScale_data & ! high resolution data + ) + + implicit none + ! input + integer(i4), dimension(:), intent(in) :: nL0_cells_in_L1_cell + integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell + integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell + integer(i4), dimension(:), intent(in) :: L0_cellId + logical, dimension(:, :), intent(in) :: mask0 + real(dp), intent(in) :: nodata_value + real(dp), dimension(:), intent(in) :: L0_fineScale_data + ! output + real(dp), dimension(size(nL0_cells_in_L1_cell, 1)) :: upscale_arithmetic_mean + + ! local variables + integer(i4) :: L1_nCells + integer(i4) :: iu, id, jl, jr + integer(i4) :: kk + integer(i4), dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d + integer(i4), dimension(size(mask0, 1), size(mask0, 2)) :: L0_cellId_2d + real(dp), dimension(size(mask0, 1), size(mask0, 2)) :: L0_fineScale_2D_data + + ! allocation and initialisation + upscale_arithmetic_mean(:) = 0.0_dp + nodata_2d = int(nodata_value, i4) + L0_cellId_2d = unpack(L0_cellId, mask0, nodata_2d) + L0_fineScale_2D_data = unpack(L0_fineScale_data, mask0, nodata_value) + + L1_nCells = size(upscale_arithmetic_mean, 1) + + do kk = 1, L1_nCells + iu = L1_upper_rowId_cell(kk) + id = L1_lower_rowId_cell(kk) + jl = L1_left_colonId_cell(kk) + jr = L1_right_colonId_cell(kk) + upscale_arithmetic_mean(kk) = sum(L0_fineScale_2D_data(iu : id, jl : jr), L0_cellId_2d(iu : id, jl : jr) /= & + int(nodata_value, i4)) / real(nL0_cells_in_L1_cell(kk), dp) + end do + + end function upscale_arithmetic_mean + + ! ---------------------------------------------------------------------------- + + ! NAME + ! upscale_harmonic_mean + + !> \brief harmonic mean + + !> \details upscaling of level-0 grid data to level-1 using harmonic mean + + ! INTENT(IN) + !> \param[in] "integer(i4) :: nL0_cells_in_L1_cell(:)" number of level-0 cells within a level-1 cell + !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L0_cellId(:,:)" cell ID at level-0 + !> \param[in] "logical :: mask0(:,:)" mask at Level 0 + !> \param[in] "real(dp) :: nodata_value" no data value + !> \param[in] "real(dp) :: L0_fineScale_2D_data(:,:)" high resolution data + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + !> \return real(dp) :: upscale_harmonic_mean(:) — Upscaled variable from L0 to L1 using harmonic mean + + ! RESTRICTIONS + !> \note Input values must be floating points. + + ! EXAMPLE + ! calling sequence + ! variable = upscale_harmonic_mean( nL0_cells_in_L1_cell, & + ! L1_upper_rowId_cell, L1_lower_rowId_cell, & + ! L1_left_colonId_cell, L1_right_colonId_cell, & + ! L0_cellId, mask0, & + ! nodata_value, L0_fineScale_2D_data & + ! ) + + ! LITERATURE + ! None + + ! HISTORY + !> \author Giovanni Dalmasso, Rohini Kumar + !> \date Dec 2012 + ! Written, Giovanni Dalmasso, Dec 2012 + ! Modified, Stephan Thober, Jan 2013 - change example calling sequence + ! Stephan Thober, Feb 2013 - added Level 0 mask + + function upscale_harmonic_mean(& + nL0_cells_in_L1_cell, & ! number of level-0 cells within a level-1 cell + L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell + L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell + L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell + L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell + L0_cellId, & ! cell ID at level-0 + mask0, & ! mask at Level 0 + nodata_value, & ! no data value + L0_fineScale_data & ! high resolution data + ) + + implicit none + + ! input + integer(i4), dimension(:), intent(in) :: nL0_cells_in_L1_cell + integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell + integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell + integer(i4), dimension(:), intent(in) :: L0_cellId + logical, dimension(:, :), intent(in) :: mask0 + real(dp), intent(in) :: nodata_value + real(dp), dimension(:), intent(in) :: L0_fineScale_data + ! output + real(dp), dimension(size(nL0_cells_in_L1_cell, 1)) :: upscale_harmonic_mean + + ! local variables + integer(i4) :: L1_nCells + integer(i4) :: iu, id, jl, jr + integer(i4) :: kk + integer(i4), dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d + integer(i4), dimension(size(mask0, 1), size(mask0, 2)) :: L0_cellId_2d + real(dp), dimension(size(mask0, 1), size(mask0, 2)) :: L0_fineScale_2D_data + + ! allocation and initialisation + upscale_harmonic_mean(:) = 0.0_dp + nodata_2d = int(nodata_value, i4) + L0_cellId_2d = unpack(L0_cellId, mask0, nodata_2d) + L0_fineScale_2D_data = unpack(L0_fineScale_data, mask0, nodata_value) + + L1_nCells = size(upscale_harmonic_mean, 1) + + do kk = 1, L1_nCells + iu = L1_upper_rowId_cell(kk) + id = L1_lower_rowId_cell(kk) + jl = L1_left_colonId_cell(kk) + jr = L1_right_colonId_cell(kk) + upscale_harmonic_mean(kk) = real(nL0_cells_in_L1_cell(kk), dp) & + / sum(1.0_dp / L0_fineScale_2D_data(iu : id, jl : jr), L0_cellId_2d(iu : id, jl : jr) /= int(nodata_value, i4)) + end do + + end function upscale_harmonic_mean + + ! ---------------------------------------------------------------------------- + + ! NAME + ! upscale_geometric_mean + + !> \brief geometric mean + + !> \details upscaling of level-0 grid data to level-1 using geometric mean + + ! INTENT(IN) + !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell + !> \param[in] "logical :: mask0(:,:)" mask at Level 0 + !> \param[in] "real(dp) :: nodata_value" no data value + + ! INTENT(INOUT) + !> \param[in,out] real(dp) :: L0_fineScale_2D_data(:,:) high resolution data + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + !> \return real(dp) :: upscale_geometric_mean(:) — Upscaled variable from L0 to L1 using geometric mean + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! calling sequence + ! variable = upscale_geometric_mean( L1_upper_rowId_cell, L1_lower_rowId_cell, & + ! L1_left_colonId_cell, L1_right_colonId_cell, & + ! mask0, nodata_value, L0_fineScale_2D_data & + ! ) + + ! LITERATURE + ! None + + ! HISTORY + !> \author Giovanni Dalmasso, Rohini Kumar + !> \date Dec 2012 + ! Written, Giovanni Dalmasso, Dec 2012 + ! Modified, Rohini Kumar, Jun 2016 - fixed bug + + function upscale_geometric_mean(& + L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell + L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell + L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell + L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell + mask0, & ! mask at level 0 + nodata_value, & ! no data value + L0_fineScale_data & ! high resolution data + ) + use mo_utils, only : ne + implicit none + + ! input + integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell + integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell + logical, dimension(:, :), intent(in) :: mask0 + real(dp), intent(in) :: nodata_value + real(dp), dimension(:), intent(in) :: L0_fineScale_data + ! output + real(dp), dimension(size(L1_upper_rowId_cell, 1)) :: upscale_geometric_mean + + ! loca variables + integer(i4) :: iu, id, jl, jr + integer(i4) :: kk + integer(i4) :: nCells_L0_in_L1 + real(dp), dimension(size(mask0, 1), size(mask0, 2)) :: L0_fineScale_2D_data + real(dp), dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d + real(dp), dimension(:), allocatable :: dummy_V + + ! allocation and initialisation + upscale_geometric_mean(:) = nodata_value + nodata_2d = nodata_value + L0_fineScale_2D_data = unpack(L0_fineScale_data, mask0, nodata_2d) + + do kk = 1, size(upscale_geometric_mean, 1) + iu = L1_upper_rowId_cell(kk) + id = L1_lower_rowId_cell(kk) + jl = L1_left_colonId_cell(kk) + jr = L1_right_colonId_cell(kk) + nCells_L0_in_L1 = count(NE(L0_fineScale_2D_data(iu : id, jl : jr), nodata_value)) + allocate(dummy_V(nCells_L0_in_L1)) + dummy_V(:) = PACK(L0_fineScale_2D_data(iu : id, jl : jr), MASK = (NE(L0_fineScale_2D_data(iu : id, jl : jr), nodata_value))) + upscale_geometric_mean(kk) = PRODUCT(dummy_V(:)) + if(NE(upscale_geometric_mean(kk), 0.0_dp)) then + upscale_geometric_mean(kk) = upscale_geometric_mean(kk)**(1.0_dp / real(nCells_L0_in_L1, dp)) + else + upscale_geometric_mean(kk) = 0.0_dp + end if + deallocate(dummy_V) + !! + end do + + end function upscale_geometric_mean + + + ! ---------------------------------------------------------------------------- + + ! NAME + ! upscale_arithmetic_mean + + !> \brief aritmetic mean + + !> \details upscaling of level-0 grid data to level-1 using aritmetic mean + + ! INTENT(IN) + !> \param[in] "integer(i4) :: nL0_cells_in_L1_cell(:)" number of level-0 cells within a level-1 cell + !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell + !> \param[in] "integer(i4) :: L0_cellId(:,:)" cell ID at level-0 + !> \param[in] "logical :: mask0(:,:)" mask at Level 0 + !> \param[in] "real(dp) :: nodata_value" no data value + !> \param[in] "real(dp) :: L0_fineScale_data(:,:)" high resolution data + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + !> \return real(dp) :: upscale_arithmetic_mean(:) — Upscaled variable from L0 to L1 using arithmetic mean + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! variable = upscale_arithmetic_mean( nL0_cells_in_L1_cell, & + ! L1_upper_rowId_cell, L1_lower_rowId_cell, & + ! L1_left_colonId_cell, L1_right_colonId_cell, & + ! L0_cellId, mask0, & + ! nodata_value, L0_fineScale_2D_data & + ! ) + + ! LITERATURE + ! None + + ! HISTORY + !> \author Giovanni Dalmasso, Rohini Kumar + !> \date Dec 2012 + ! Written, Giovanni Dalmasso, Dec 2012 + ! Modified, Stephan Thober, Feb 2013 - changed dimension of L0 input from 2d to 1d + + function upscale_p_norm(& + nL0_cells_in_L1_cell, & ! number of level-0 cells within a level-1 cell + L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell + L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell + L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell + L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell + L0_cellId, & ! cell ID at level-0 + mask0, & ! mask at level 0 + nodata_value, & ! no data value + p_norm, & ! p_norm value + L0_fineScale_data & ! high resolution data + ) + use mo_utils, only : ne + + implicit none + ! input + integer(i4), dimension(:), intent(in) :: nL0_cells_in_L1_cell + integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell + integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell + integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell + integer(i4), dimension(:), intent(in) :: L0_cellId + logical, dimension(:, :), intent(in) :: mask0 + real(dp), intent(in) :: nodata_value + real(dp), intent(in) :: p_norm + real(dp), dimension(:), intent(in) :: L0_fineScale_data + ! output + real(dp), dimension(size(nL0_cells_in_L1_cell, 1)) :: upscale_p_norm + + ! local variables + integer(i4) :: L1_nCells + integer(i4) :: iu, id, jl, jr + integer(i4) :: kk + integer(i4), dimension(size(mask0, 1), size(mask0, 2)) :: nodata_2d + integer(i4), dimension(size(mask0, 1), size(mask0, 2)) :: L0_cellId_2d + real(dp), dimension(size(mask0, 1), size(mask0, 2)) :: L0_fineScale_2D_data + + ! allocation and initialisation + upscale_p_norm(:) = 0.0_dp + nodata_2d = int(nodata_value, i4) + L0_cellId_2d = unpack(L0_cellId, mask0, nodata_2d) + L0_fineScale_2D_data = unpack(L0_fineScale_data, mask0, nodata_value) + + L1_nCells = size(upscale_p_norm, 1) + + if (ne(p_norm, 0.0_dp)) then + ! geometric mean special case + do kk = 1, L1_nCells + iu = L1_upper_rowId_cell(kk) + id = L1_lower_rowId_cell(kk) + jl = L1_left_colonId_cell(kk) + jr = L1_right_colonId_cell(kk) + upscale_p_norm(kk) = product(L0_fineScale_2D_data(iu : id, jl : jr) ** p_norm, L0_cellId_2d(iu : id, jl : jr) /= & + int(nodata_value, i4)) ** (1.0_dp / real(nL0_cells_in_L1_cell(kk), dp)) + end do + else + ! all other cases + do kk = 1, L1_nCells + iu = L1_upper_rowId_cell(kk) + id = L1_lower_rowId_cell(kk) + jl = L1_left_colonId_cell(kk) + jr = L1_right_colonId_cell(kk) + upscale_p_norm(kk) = sum(L0_fineScale_2D_data(iu : id, jl : jr) ** p_norm, L0_cellId_2d(iu : id, jl : jr) /= & + int(nodata_value, i4)) / real(nL0_cells_in_L1_cell(kk), dp) ** (1.0_dp / p_norm) + end do + end if + + end function upscale_p_norm + + +end module mo_upscaling_operators diff --git a/src/MPR/mpr_driver.f90 b/src/MPR/mpr_driver.f90 new file mode 100644 index 00000000..f7808f99 --- /dev/null +++ b/src/MPR/mpr_driver.f90 @@ -0,0 +1,57 @@ +!> \file mpr_driver.f90 +#ifdef MPR_STANDALONE +program mpr_driver + + use mo_finish, only : finish + use mo_mpr_eval, only : mpr_eval + use mo_read_wrapper, only : read_data + use mo_mpr_read_config, only : mpr_read_config + USE mo_common_read_config, ONLY : common_read_config ! Read main configuration files + use mo_common_variables, only : dirRestartOut, write_restart + use mo_timer, only : timers_init + use mo_mpr_startup, only : mpr_initialize + use mo_mpr_restart, only : write_mpr_restart_files + use mo_mpr_file, only : & + file_namelist_mpr_param, unamelist_mpr_param, & ! filename of namelist: mhm model parameter + file_namelist_mpr, unamelist_mpr ! file containing main configurations + use mo_mpr_global_variables, only : c2TSTu + + implicit none + + ! -------------------------------------------------------------------------- + ! INITIALIZE + ! -------------------------------------------------------------------------- + call common_read_config(file_namelist_mpr, unamelist_mpr) + call mpr_read_config(file_namelist_mpr, unamelist_mpr, file_namelist_mpr_param, unamelist_mpr_param) + + ! Start timings + call timers_init + + call read_data() + + ! TODO: this might become part of the namelist in MPR-STANDALONE?! + c2TSTu = 1.0_dp / 24.0_dp + call mpr_initialize() + + ! ----------------------------------------------------------------------- + ! EXECUTION + ! ----------------------------------------------------------------------- + call mpr_eval() + + ! -------------------------------------------------------------------------- + ! WRITE OUTPUT + ! -------------------------------------------------------------------------- + if (write_restart) then + call write_mpr_restart_files(dirRestartOut) + end if + ! -------------------------------------------------------------------------- + ! FINISH UP + ! -------------------------------------------------------------------------- + call finish('MPR', 'Finished!') +end program mpr_driver +#else +! dummy module such that this file is never empty for compilation +module dummy_mpr + implicit none +end module dummy_mpr +#endif diff --git a/src/common/mo_common_constants.f90 b/src/common/mo_common_constants.f90 new file mode 100644 index 00000000..6be26c8d --- /dev/null +++ b/src/common/mo_common_constants.f90 @@ -0,0 +1,44 @@ +!> \file mo_common_constants.f90 + +!> \brief Provides constants commonly used by mHM, mRM and MPR + +!> \details Provides commonly used by mHM, mRM and MPR such as no_data values and eps + +!> \author Robert Schweppe +!> \date Dec 2017 + +MODULE mo_common_constants + + USE mo_kind, ONLY : i4, dp, sp + + IMPLICIT NONE + + PRIVATE + + ! Computational + !> epsilon(1.0) in double precision + REAL(dp), public, PARAMETER :: eps_dp = epsilon(1.0_dp) + !> epsilon(1.0) in single precision + REAL(sp), public, PARAMETER :: eps_sp = epsilon(1.0_sp) + + ! computational, these values need to be the same!!! + integer(i4), public, parameter :: nodata_i4 = -9999_i4 ! [-] global no data value + real(dp), public, parameter :: nodata_dp = -9999._dp ! [-] global no data value + + ! default inital values for states and fluxes as well as parameter fields + real(dp), public, parameter :: P1_InitStateFluxes = 0.00_dp + + ! hydrologic modeling + integer(i4), public, parameter :: nColPars = 5_i4 ! number of properties of the global variables + integer(i4), public, parameter :: maxNoBasins = 50_i4 ! maximum number of allowed basins + integer(i4), public, parameter :: maxNLcovers = 50_i4 ! maximum number of allowed LCover scenes + + ! temporal + real(dp), public, parameter :: DayHours = 24.0_dp ! hours per day + real(dp), public, parameter :: YearMonths = 12.0_dp ! months per year + integer(i4), public, parameter :: YearMonths_i4 = 12 ! months per year + real(dp), public, parameter :: YearDays = 365.0_dp ! days in a year + real(dp), public, parameter :: DaySecs = 86400.0_dp ! sec in a day + real(dp), public, parameter :: HourSecs = 3600.0_dp ! seconds per hour + +END MODULE mo_common_constants diff --git a/src/common/mo_common_file.f90 b/src/common/mo_common_file.f90 new file mode 100644 index 00000000..cf61a17c --- /dev/null +++ b/src/common/mo_common_file.f90 @@ -0,0 +1,27 @@ +!> \file mo_common_file.f90 + +!> \brief Provides file names and units for mRM + +!> \details Provides all filenames as well as all units used for the multiscale Routing Model mRM. + +!> \author Matthias Cuntz, Stephan Thober +!> \date Aug 2015 + +MODULE mo_common_file + + IMPLICIT NONE + !> DEM input data file + CHARACTER(len=*), PARAMETER :: file_dem = 'dem.asc' ! DEM + !> Unit for DEM input data file + INTEGER, PARAMETER :: udem = 53 ! + !> Unit for LCover input data file + INTEGER, PARAMETER :: ulcoverclass = 61 ! + + !> file defining mHM's outputs + CHARACTER(len=*), PARAMETER :: file_config = 'ConfigFile.log' ! configuration + !> Unit for file defining mHM's outputs + INTEGER, PARAMETER :: uconfig = 68 ! + + + +END MODULE mo_common_file diff --git a/src/common/mo_common_functions.f90 b/src/common/mo_common_functions.f90 new file mode 100644 index 00000000..ec95c875 --- /dev/null +++ b/src/common/mo_common_functions.f90 @@ -0,0 +1,37 @@ +!> \file mo_common_functions.f90 + +!> \brief Provides small utility functions used by multiple parts of the code (mHM, mRM, MPR) + +!> \details Provides the functions in_bound used to check global_parameter ranges + +!> \author Robert Schweppe +!> \date Dec 2017 + +! Modified Robert Schweppe, Dec 2017 - refactoring + +module mo_common_functions + use mo_kind, only : dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: in_bound ! check parameter bounds + +contains + + function in_bound(params) + real(dp), dimension(:, :), intent(in) :: params ! parameter: + ! ! col_1=Lower bound, + ! ! col_2=Upper bound + ! ! col_3=initial + logical :: in_bound + + if (any(params(:, 3) .lt. params(:, 1)) .or. any(params(:, 3) .gt. params(:, 2))) then + in_bound = .false. + else + in_bound = .true. + end if + + end function in_bound +end module mo_common_functions \ No newline at end of file diff --git a/src/common/mo_common_read_config.f90 b/src/common/mo_common_read_config.f90 new file mode 100644 index 00000000..7ccbb8ae --- /dev/null +++ b/src/common/mo_common_read_config.f90 @@ -0,0 +1,400 @@ +!> \file mo_common_read_config.f90 + +!> \brief Reading of main model configurations. + +!> \details This routine reads the configurations of namelists commonly used by mHM, mRM and MPR + +!> \authors Matthias Zink +!> \date Dec 2012 + +MODULE mo_common_read_config + + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: common_read_config, set_land_cover_scenes_id + + ! ------------------------------------------------------------------ + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! common_read_config + + ! PURPOSE + !> \brief Read main configurations commonly used by mHM, mRM and MPR + + !> \details Read the main configurations commonly used by mHM, mRM and MPR, namely: + !> project_description, directories_general, mainconfig, processSelection, LCover + + ! CALLING SEQUENCE + ! None + + ! INTENT(IN) + !> \param[in] "character(*) :: file_namelist" name of file + !> \param[in] "integer(i4) :: unamelist" id of file + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink + !> \date Dec 2012 + ! Modified Robert Schweppe Dec 2017 - refactoring and restructuring + + + subroutine common_read_config(file_namelist, unamelist) + + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_nml, only : open_nml, close_nml, position_nml + use mo_common_constants, only : maxNoBasins, & ! maximum number of allowed basins + maxNLcovers ! maximum number of allowed LCover scenes + use mo_common_variables, only : & + dirMorpho, dirLCover, & ! input directory of morphological + fileLatLon, & ! directory of latitude and longitude files + dirConfigOut, & ! configuration run output directory + dirCommonFiles, & ! directory where common files are located + dirOut, & ! output directory basin wise + dirRestartOut, & + resolutionHydrology, & ! resolutions of hydrology + write_restart, & + L0_Basin, & ! L0_Basin ID + nBasins, & ! number of basins + nuniquel0Basins, & + nLcoverScene, & ! land cover information + LCfilename, & + LC_year_start, & + LC_year_end, & + iFlag_cordinate_sys, & ! model run cordinate system + nProcesses, processMatrix, & ! process configuration + project_details, & ! project including funding instituion., PI, etc. + setup_description, & ! any specific description of simulation + simulation_type, & ! e.g. seasonal forecast, climate projection, ... + Conventions, & ! convention used for dataset + contact, & ! contact details, incl. PI name, modellers + mHM_details, & ! developing institution, version, specific mHM revision + history ! details on version/creation date + + implicit none + + character(*), intent(in) :: file_namelist + integer, intent(in) :: unamelist + ! LOCAL variables + ! PARAMETERS + integer(i4), dimension(nProcesses) :: processCase ! Choosen process description number + + character(256), dimension(maxNoBasins) :: dir_Morpho + character(256), dimension(maxNoBasins) :: dir_RestartOut + character(256), dimension(maxNoBasins) :: dir_LCover + character(256), dimension(maxNoBasins) :: dir_Out + character(256), dimension(maxNoBasins) :: file_LatLon + + real(dp), dimension(maxNoBasins) :: resolution_Hydrology + integer(i4), dimension(maxNoBasins) :: L0Basin + + ! namelist for land cover scenes + integer(i4), dimension(maxNLCovers) :: LCoverYearStart ! starting year LCover + integer(i4), dimension(maxNLCovers) :: LCoverYearEnd ! ending year LCover + character(256), dimension(maxNLCovers) :: LCoverfName ! filename of Lcover file + + integer(i4) :: iBasin + + ! define namelists + ! namelist directories + namelist /project_description/ project_details, setup_description, simulation_type, & + Conventions, contact, mHM_details, history + namelist /directories_general/ dirConfigOut, dirCommonFiles, & + dir_Morpho, dir_LCover, & + dir_Out, dir_RestartOut, & + file_LatLon + ! namelist spatial & temporal resolution, optimization information + namelist /mainconfig/ iFlag_cordinate_sys, resolution_Hydrology, nBasins, L0Basin, write_restart + ! namelist process selection + namelist /processSelection/ processCase + + ! namelist for land cover scenes + namelist/LCover/nLcoverScene, LCoverYearStart, LCoverYearEnd, LCoverfName + + !=============================================================== + ! Read namelist main directories + !=============================================================== + call open_nml(file_namelist, unamelist, quiet = .true.) + + !=============================================================== + ! Read namelist specifying the project description + !=============================================================== + call position_nml('project_description', unamelist) + read(unamelist, nml = project_description) + + !=============================================================== + ! Read namelist specifying the model configuration + !=============================================================== + call position_nml('mainconfig', unamelist) + read(unamelist, nml = mainconfig) + + if (nBasins .GT. maxNoBasins) then + call message() + call message('***ERROR: Number of basins is resticted to ', trim(num2str(maxNoBasins)), '!') + stop 1 + end if + + ! allocate patharray sizes + allocate(resolutionHydrology(nBasins)) + allocate(dirMorpho(nBasins)) + allocate(dirRestartOut(nBasins)) + allocate(dirLCover(nBasins)) + allocate(dirOut(nBasins)) + allocate(fileLatLon(nBasins)) + allocate(L0_Basin(nBasins)) + + resolutionHydrology = resolution_Hydrology(1 : nBasins) + L0_Basin = L0Basin(1 : nBasins) + + ! check for possible options + if(.NOT. (iFlag_cordinate_sys == 0 .OR. iFlag_cordinate_sys == 1)) then + call message() + call message('***ERROR: coordinate system for the model run should be 0 or 1') + stop 1 + end if + + nuniquel0Basins = 0_i4 + do iBasin = 1, nBasins + if (iBasin .gt. 1) then + if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then + cycle + end if + end if + nuniquel0Basins = nuniquel0Basins + 1_i4 + end do + + + !=============================================================== + ! Read land cover + !=============================================================== + call position_nml('LCover', unamelist) + read(unamelist, nml = LCover) + + ! put land cover scenes to corresponding file name and LuT + ! this is done already here for MPR, which does not check for the time periods + allocate(LCfilename(nLCoverScene)) + allocate(LC_year_start(nLCoverScene)) + allocate(LC_year_end(nLCoverScene)) + LCfilename(:) = LCoverfName(1 : nLCoverScene) + LC_year_start(:) = LCoverYearStart(1 : nLCoverScene) + LC_year_end(:) = LCoverYearEnd(1 : nLCoverScene) + + !=============================================================== + ! Read namelist for mainpaths + !=============================================================== + call position_nml('directories_general', unamelist) + read(unamelist, nml = directories_general) + + dirMorpho = dir_Morpho(1 : nBasins) + dirRestartOut = dir_RestartOut(1 : nBasins) + dirLCover = dir_LCover(1 : nBasins) + dirOut = dir_Out(1 : nBasins) + fileLatLon = file_LatLon(1 : nBasins) + + !=============================================================== + ! Read process selection list + !=============================================================== + call position_nml('processselection', unamelist) + read(unamelist, nml = processSelection) + + processMatrix = 0_i4 + processMatrix(:, 1) = processCase + + call close_nml(unamelist) + + end subroutine common_read_config + + ! ------------------------------------------------------------------ + + ! NAME + ! set_land_cover_scenes_id + + ! PURPOSE + !> \brief Read main configurations commonly used by mHM, mRM and MPR + + !> \details Read the main configurations commonly used by mHM, mRM and MPR, namely: + !> project_description, directories_general, mainconfig, processSelection, LCover + + ! CALLING SEQUENCE + ! None + + ! INTENT(IN) + !> \param[in] "character(*) :: file_namelist" name of file + !> \param[in] "integer(i4) :: unamelist" id of file + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink + !> \date Dec 2012 + ! Modified Robert Schweppe Dec 2017 - refactoring and restructuring + + subroutine set_land_cover_scenes_id(sim_Per, LCyear_Id, LCfilename) + + use mo_common_variables, only : & + nBasins, & ! number of basins + nLcoverScene, & ! land cover information + LC_year_start, & + LC_year_end, & + period + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_common_constants, only : nodata_i4 + + implicit none + + type(period), dimension(:), intent(in) :: sim_Per + integer(i4), dimension(:, :), allocatable, intent(inout) :: LCyear_Id + character(256), dimension(:), allocatable, intent(inout) :: LCfilename + + integer(i4) :: ii, iBasin, max_lcs, min_lcs, jj + character(256), dimension(:), allocatable :: dummy_LCfilenames + integer(i4), dimension(:,:), allocatable :: dummy_LCyears + + + ! countercheck if land cover covers simulation period + if (LC_year_start(1) .GT. minval(sim_Per(1 : nBasins)%yStart)) then + call message() + call message('***ERROR: Land cover for warming period is missing!') + call message(' SimStart : ', trim(num2str(minval(sim_Per(1 : nBasins)%yStart)))) + call message(' LCoverStart: ', trim(num2str(LC_year_start(1)))) + stop 1 + end if + if (LC_year_end(nLCoverScene) .LT. maxval(sim_Per(1 : nBasins)%yEnd)) then + call message() + call message('***ERROR: Land cover period shorter than modelling period!') + call message(' SimEnd : ', trim(num2str(maxval(sim_Per(1 : nBasins)%yEnd)))) + call message(' LCoverEnd: ', trim(num2str(LC_year_end(nLCoverScene)))) + stop 1 + end if + ! + allocate(LCyear_Id(minval(sim_Per(1 : nBasins)%yStart) : maxval(sim_Per(1 : nBasins)%yEnd), nBasins)) + LCyear_Id = nodata_i4 + do iBasin = 1, nBasins + do ii = 1, nLCoverScene + ! land cover before model period or land cover after model period + if ((LC_year_end(ii) .LT. sim_Per(iBasin)%yStart) .OR. & + (LC_year_start(ii) .GT. sim_Per(iBasin)%yEnd)) then + cycle + ! land cover period fully covers model period + else if ((LC_year_start(ii) .LE. sim_Per(iBasin)%yStart) .AND. & + (LC_year_end(ii) .GE. sim_Per(iBasin)%yEnd)) then + LCyear_Id(sim_Per(iBasin)%yStart : sim_Per(iBasin)%yEnd, iBasin) = ii + exit + ! land cover period covers beginning of model period + else if ((LC_year_start(ii) .LE. sim_Per(iBasin)%yStart) .AND. & + (LC_year_end(ii) .LT. sim_Per(iBasin)%yEnd)) then + LCyear_Id(sim_Per(iBasin)%yStart : LC_year_end(ii), iBasin) = ii + ! land cover period covers end of model period + else if ((LC_year_start(ii) .GT. sim_Per(iBasin)%yStart) .AND. & + (LC_year_end(ii) .GE. sim_Per(iBasin)%yEnd)) then + LCyear_Id(LC_year_start(ii) : sim_Per(iBasin)%yEnd, iBasin) = ii + ! land cover period covers part of model_period + else + LCyear_Id(LC_year_start(ii) : LC_year_end(ii), iBasin) = ii + end if + end do + end do + + ! correct number of input land cover scenes to number of needed scenes + max_lcs = maxval(LCyear_Id, mask = (LCyear_Id .gt. nodata_i4)) + min_lcs = minval(LCyear_Id, mask = (LCyear_Id .gt. nodata_i4)) + nLCoverScene = max_lcs - min_lcs + 1 + + ! select the LC_years for only the needed scenes + allocate(dummy_LCyears(2, nLCoverScene)) + jj = 1 + do ii = 1, size(LC_year_start) + if ((LC_year_start(ii) .lt. LC_year_end(max_lcs)) .and. (LC_year_end(ii) .gt. LC_year_start(min_lcs))) then + dummy_LCyears(1, jj) = LC_year_start(ii) + dummy_LCyears(2, jj) = LC_year_end(ii) + jj = jj + 1 + end if + end do + + ! put land cover scenes to corresponding file name and LuT + ! this was allocated for MPR before, now update using only needed scenes + allocate(dummy_LCfilenames(nLCoverScene)) + dummy_LCfilenames(:) = LCfilename(minval(LCyear_Id, mask = (LCyear_Id .gt. nodata_i4)) : & + maxval(LCyear_Id, mask = (LCyear_Id .gt. nodata_i4))) + deallocate(LCfilename, LC_year_start, LC_year_end) + allocate(LCfilename(nLCoverScene)) + allocate(LC_year_start(nLCoverScene)) + allocate(LC_year_end(nLCoverScene)) + LCfilename(:) = dummy_LCfilenames(:) + LC_year_start(:) = dummy_LCyears(1, :) + LC_year_end(:) = dummy_LCyears(2, :) + + ! update the ID's + if (maxval(sim_Per(1 : nBasins)%julStart) .eq. minval(sim_Per(1 : nBasins)%julStart) .and. & + maxval(sim_Per(1 : nBasins)%julEnd) .eq. minval(sim_Per(1 : nBasins)%julEnd)) then + if (any(LCyear_Id .EQ. nodata_i4)) then + call message() + call message('***ERROR: Intermediate land cover period is missing!') + stop 1 + end if + end if + + end subroutine set_land_cover_scenes_id + + +END MODULE mo_common_read_config diff --git a/src/common/mo_common_read_data.f90 b/src/common/mo_common_read_data.f90 new file mode 100644 index 00000000..1da10b44 --- /dev/null +++ b/src/common/mo_common_read_data.f90 @@ -0,0 +1,170 @@ +module mo_common_read_data + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: read_dem, read_lcover + + ! ------------------------------------------------------------------ + +CONTAINS + + subroutine read_dem + + USE mo_read_spatial_data, ONLY : read_header_ascii, & + read_spatial_data_ascii + USE mo_append, ONLY : append + USE mo_string_utils, ONLY : num2str + USE mo_message, ONLY : message + use mo_common_constants, only : nodata_dp + use mo_grid, only : set_basin_indices + ! + USE mo_common_file, ONLY : file_dem, udem ! file name and unit of elevation map + use mo_common_variables, ONLY : & + L0_elev, & ! elevation on input resolution (L0) + level0, & ! grid information (ncols, nrows, ..) + dirMorpho, & ! directories + nBasins, & ! number of basins + nuniquel0Basins, & + resolutionHydrology, & ! hydrology resolution (L1 scale) + L0_Basin, & + Grid + + implicit none + + ! local variables + integer(i4) :: iBasin ! loop variables + character(256) :: fName ! file name of file to read + real(dp), dimension(:, :), allocatable :: data_dp_2d + type(Grid), pointer :: level0_iBasin + + ! ************************************************ + ! READ SPATIAL DATA FOR EACH BASIN + ! ************************************************ + ! allocate necessary variables at Level0 + allocate(level0(nuniquel0Basins)) + + do iBasin = 1, nBasins + + level0_iBasin => level0(L0_Basin(iBasin)) + + ! check whether L0 data is shared + if (iBasin .gt. 1) then + if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then + ! + call message(' Using dem of basin ', & + trim(adjustl(num2str(L0_Basin(iBasin)))), ' for basin: ',& + trim(adjustl(num2str(iBasin))), '...') + + ! DO NOT read L0 data + cycle + + end if + end if + + call message(' Reading dem for basin: ', trim(adjustl(num2str(iBasin))), ' ...') + + ! Header (to check consistency) + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_dem)) + call read_header_ascii(trim(fName), udem, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, level0_iBasin%nodata_value) + + ! check for L0 and L1 scale consistency + if(resolutionHydrology(iBasin) .LT. level0_iBasin%cellsize) then + call message() + call message('***ERROR: resolutionHydrology (L1) should be smaller than the input data resolution (L0)') + call message(' check set-up (in mhm.nml) for basin: ', trim(adjustl(num2str(iBasin))), ' ...') + stop + end if + + ! DEM + overall mask creation + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_dem)) + call read_spatial_data_ascii(trim(fName), udem, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_dp_2d, level0_iBasin%mask) + + ! put global nodata value into array (probably not all grid cells have values) + data_dp_2d = merge(data_dp_2d, nodata_dp, level0_iBasin%mask) + ! put data in variable + call append(L0_elev, pack(data_dp_2d, level0_iBasin%mask)) + ! deallocate arrays + deallocate(data_dp_2d) + + level0_iBasin%nCells = count(level0_iBasin%mask) + + end do + + call set_basin_indices(level0) + + end subroutine read_dem + + subroutine read_lcover + + USE mo_read_spatial_data, ONLY : & + read_spatial_data_ascii + USE mo_append, ONLY : append, paste + USE mo_string_utils, ONLY : num2str + USE mo_message, ONLY : message + ! + USE mo_common_file, ONLY : & + ulcoverclass ! unit of land cover class map + use mo_common_variables, ONLY : & + L0_LCover, & ! classical mHM land cover class (L0) + level0, & ! grid information (ncols, nrows, ..) + dirLCover, & ! directories + L0_Basin, & ! L0_Basin ID + LCfilename, nLCoverScene, & ! file names and number of land cover scenes + nBasins, & ! number of basins + Grid + USE mo_common_constants, ONLY : nodata_i4 ! mHM's global nodata vales + + implicit none + + ! local variables + integer(i4) :: iBasin, iVar ! loop variables + character(256) :: fName ! file name of file to read + integer(i4), dimension(:, :), allocatable :: data_i4_2d + integer(i4), dimension(:, :), allocatable :: dataMatrix_i4 + logical, dimension(:, :), allocatable :: mask_2d + type(Grid), pointer :: level0_iBasin + + do iBasin = 1, nBasins + + level0_iBasin => level0(L0_Basin(iBasin)) + + ! check whether L0 data is shared + if (iBasin .gt. 1) then + if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then + call message(' Using lcover of basin ', & + trim(adjustl(num2str(L0_Basin(iBasin)))), ' for basin: ',& + trim(adjustl(num2str(iBasin))), '...') + ! DO NOT read L0 data + cycle + + end if + end if + + call message(' Reading lcover for basin: ', trim(adjustl(num2str(iBasin))), ' ...') + + ! LCover read in is realized seperated because of unknown number of scenes + do iVar = 1, nLCoverScene + fName = trim(adjustl(dirLCover(iBasin))) // trim(adjustl(LCfilename(iVar))) + call read_spatial_data_ascii(trim(fName), ulcoverclass, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_i4_2d, mask_2d) + ! put global nodata value into array (probably not all grid cells have values) + data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) + call paste(dataMatrix_i4, pack(data_i4_2d, level0_iBasin%mask), nodata_i4) + deallocate(data_i4_2d) + end do + call append(L0_LCover, dataMatrix_i4) + deallocate(dataMatrix_i4) + + end do + + end subroutine read_lcover + +end module mo_common_read_data \ No newline at end of file diff --git a/src/common/mo_common_restart.f90 b/src/common/mo_common_restart.f90 new file mode 100644 index 00000000..397d4686 --- /dev/null +++ b/src/common/mo_common_restart.f90 @@ -0,0 +1,244 @@ +module mo_common_restart + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: write_grid_info + PUBLIC :: read_grid_info ! read restart files for configuration from a given path + + + ! ------------------------------------------------------------------ + +CONTAINS + + + ! NAME + ! write_restart + + ! PURPOSE + !> \brief write restart files for each basin + + !> \details write restart files for each basin. For each basin + !> three restart files are written. These are xxx_states.nc, + !> xxx_L11_config.nc, and xxx_config.nc (xxx being the three digit + !> basin index). If a variable is added here, it should also be added + !> in the read restart routines below. + + ! INTENT(IN) + !> \param[in] "character(256), dimension(:) :: OutPath" Output Path for each basin + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober + !> \date Jun 2014 + ! Modified Matthias Zink Nov. 2014 - added PET related parameter writing + ! Stephan Thober Aug 2015 - moved write of routing states to mRM + ! David Schaefer Nov 2015 - mo_netcdf + ! Stephan Thober Nov 2016 - moved processMatrix to common variables + ! Zink M. Demirel C.,Mar 2017 - Added Jarvis soil water stress function at SM process(3) + ! Robert Schweppe, Feb 2018 - Removed all L0 references + + ! ------------------------------------------------------------------ + subroutine write_grid_info(grid_in, level_name, nc) + + use mo_kind, only : i4, dp + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + use mo_common_constants, only : nodata_dp, nodata_i4 + use mo_common_variables, only : & + Grid + + implicit none + + type(Grid), intent(in) :: grid_in ! level to be written + character(*), intent(in) :: level_name ! level_id + type(NcDataset), intent(inout) :: nc ! NcDataset to write information to + + type(NcDimension) :: rows, cols + type(NcVariable) :: var + + rows = nc%setDimension("nrows" // trim(level_name), grid_in%nrows) + cols = nc%setDimension("ncols" // trim(level_name), grid_in%ncols) + + ! now set everything related to the grid + var = nc%setVariable("L" // trim(level_name) // "_basin_mask", "i32", (/rows, cols/)) + call var%setFillValue(nodata_i4) + ! transform from logical to i32 + call var%setData(merge(1_i4, 0_i4, grid_in%mask)) + call var%setAttribute("long_name", "Mask at level " // trim(level_name)) + + var = nc%setVariable("L" // trim(level_name) // "_basin_lat", "f64", (/rows, cols/)) + call var%setFillValue(nodata_dp) + call var%setData(grid_in%y) + call var%setAttribute("long_name", "Latitude at level " // trim(level_name)) + + var = nc%setVariable("L" // trim(level_name) // "_basin_lon", "f64", (/rows, cols/)) + call var%setFillValue(nodata_dp) + call var%setData(grid_in%x) + call var%setAttribute("long_name", "Longitude at level " // trim(level_name)) + + var = nc%setVariable("L" // trim(level_name) // "_basin_cellarea", "f64", (/rows, cols/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(grid_in%CellArea * 1.0E-6_dp, grid_in%mask, nodata_dp)) + call var%setAttribute("long_name", "Cell area at level " // trim(level_name)) + + call nc%setAttribute("xllcorner_L" // trim(level_name), grid_in%xllcorner) + call nc%setAttribute("yllcorner_L" // trim(level_name), grid_in%yllcorner) + call nc%setAttribute("cellsize_L" // trim(level_name), grid_in%cellsize) + call nc%setAttribute("nrows_L" // trim(level_name), grid_in%nrows) + call nc%setAttribute("ncols_L" // trim(level_name), grid_in%ncols) + call nc%setAttribute("nCells_L" // trim(level_name), grid_in%nCells) + + end subroutine write_grid_info + + + ! ------------------------------------------------------------------ + + ! NAME + ! read_grid_info + + ! PURPOSE + !> \brief reads configuration apart from Level 11 configuration + !> from a restart directory + + !> \details read configuration variables from a given restart + !> directory and initializes all configuration variables, + !> that are initialized in the subroutine initialise, + !> contained in module mo_startup. + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" number of basin + !> \param[in] "character(256) :: InPath" Input Path including trailing slash + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + + ! RESTRICTIONS + !> \note Restart Files must have the format, as if + !> it would have been written by subroutine write_restart_files + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober + !> \date Apr 2013 + ! Modified David Schaefer Nov 2015 - mo_netcdf + ! Zink M. Demirel C.,Mar 2017 - Added Jarvis soil water stress function at SM process(3) + ! Robert Schweppe, Feb 2018 - Removed all L0 references + + subroutine read_grid_info(iBasin, InPath, level_name, fname_part, new_grid) + + use mo_kind, only : i4, dp + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_netcdf, only : NcDataset, NcVariable + use mo_common_variables, only : & + Grid + + implicit none + + integer(i4), intent(in) :: iBasin + character(256), intent(in) :: InPath ! list of Output paths per Basin + character(*), intent(in) :: level_name ! level_name (id) + character(*), intent(in) :: fname_part ! filename part (either "mHM" or "mRM") + type(Grid), intent(inout) :: new_grid ! grid to save information to + + ! Dummy Variables + integer(i4), dimension(:, :), allocatable :: dummyI2 ! dummy, 2 dimension I4 + real(dp), dimension(:, :), allocatable :: dummyD2 ! dummy, 2 dimension DP + + ! local variables + character(256) :: Fname + type(NcDataset) :: nc + type(NcVariable) :: var + integer(i4) :: k + + ! read config + fname = trim(InPath) // trim(fname_part) // '_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' ! '_restart.nc' + call message(' Reading config from ', trim(adjustl(Fname)), ' ...') + + nc = NcDataset(fname, "r") + + ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + ! Read L1 variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + ! read the grid properties + call nc%getAttribute("xllcorner_L" // trim(level_name), new_grid%xllcorner) + call nc%getAttribute("yllcorner_L" // trim(level_name), new_grid%yllcorner) + call nc%getAttribute("nrows_L" // trim(level_name), new_grid%nrows) + call nc%getAttribute("ncols_L" // trim(level_name), new_grid%ncols) + call nc%getAttribute("cellsize_L" // trim(level_name), new_grid%cellsize) + call nc%getAttribute("nCells_L" // trim(level_name), new_grid%nCells) + + allocate(new_grid%mask(new_grid%nrows, new_grid%ncols)) + allocate(new_grid%x(new_grid%nrows, new_grid%ncols)) + allocate(new_grid%y(new_grid%nrows, new_grid%ncols)) + ! read L1 mask + var = nc%getVariable("L" // trim(level_name) // "_basin_mask") + ! read integer + call var%getData(dummyI2) + ! transform to logical + new_grid%mask = (dummyI2 .eq. 1_i4) + + var = nc%getVariable("L" // trim(level_name) // "_basin_lat") + call var%getData(new_grid%y) + + var = nc%getVariable("L" // trim(level_name) // "_basin_lon") + call var%getData(new_grid%x) + + var = nc%getVariable("L" // trim(level_name) // "_basin_cellarea") + call var%getData(dummyD2) + new_grid%CellArea = pack(dummyD2 / 1.0E-6_dp, new_grid%mask) + + call nc%close() + + new_grid%Id = (/ (k, k = 1, new_grid%nCells) /) + + end subroutine read_grid_info + +end module mo_common_restart + + diff --git a/src/common/mo_common_variables.f90 b/src/common/mo_common_variables.f90 index b407ea88..2be0dbdc 100644 --- a/src/common/mo_common_variables.f90 +++ b/src/common/mo_common_variables.f90 @@ -1,21 +1,139 @@ !> \file mo_common_variables.f90 -!> \brief Provides structures needed by mHM and mRM. +!> \brief Provides structures needed by mHM, mRM and/or mpr. !> \details Provides the global structure period that is used !> by both mHM and mRM. !> \author Stephan Thober !> \date Sep 2015 -! Modified Stephan Thober, Nov 2016 - moved processdescription from mo_global_variables to here +! Modified Stephan Thober, Nov 2016 - moved processdescription from mo_global_variables to here +! Robert Schweppe, Dec 2017 - merged more duplicated variables from mhm and mrm global variables module mo_common_variables - use mo_kind, only: i4, i8, dp + + use mo_kind, only : i4, i8, dp implicit none + ! ------------------------------------------------------------------- + ! PROJECT DESCRIPTION for the NETCDF output file + ! ------------------------------------------------------------------- + character(1024), public :: project_details ! project including funding instituion., PI, etc. + character(1024), public :: setup_description ! any specific description of simulation + character(1024), public :: simulation_type ! e.g. seasonal forecast, climate projection, ... + character(256), public :: Conventions ! convention used for dataset + character(1024), public :: contact ! contact details, incl. PI name + character(1024), public :: mHM_details ! developing institution, specific mHM revision + character(1024), public :: history ! details on version/creation date + + ! ------------------------------------------------------------------- + ! INPUT variables for configuration of main part + ! ------------------------------------------------------------------- + integer(i4), public :: iFlag_cordinate_sys ! options model for the run cordinate system + real(dp), dimension(:), allocatable, public :: resolutionHydrology ! [m or degree] resolution of hydrology - Level 1 + integer(i4), dimension(:), allocatable, public :: L0_Basin + logical, public :: write_restart ! flag + + ! ------------------------------------------------------------------ + ! DIRECTORIES + ! ------------------------------------------------------------------ + ! has the dimension of nBasins + character(256), dimension(:), allocatable, public :: dirRestartOut ! Directory where output of restart is written + character(256), public :: dirConfigOut + character(256), public :: dirCommonFiles ! directory where common input files should be located + character(256), dimension(:), allocatable, public :: dirMorpho ! Directory where morphological files are located + character(256), dimension(:), allocatable, public :: dirLCover ! Directory where land cover files are located + character(256), dimension(:), allocatable, public :: dirOut ! Directory where output is written to + character(256), dimension(:), allocatable, public :: fileLatLon ! Directory where the Lat Lon Files are located + + ! ------------------------------------------------------------------- + ! PERIOD description + ! ------------------------------------------------------------------- + type period + integer(i4) :: dStart ! first day + integer(i4) :: mStart ! first month + integer(i4) :: yStart ! first year + integer(i4) :: dEnd ! last day + integer(i4) :: mEnd ! last month + integer(i4) :: yEnd ! last year + integer(i4) :: julStart ! first julian day + integer(i4) :: julEnd ! last julian day + integer(i4) :: nObs ! total number of observations + end type period + + ! ------------------------------------------------------------------- + ! GRID description + ! ------------------------------------------------------------------- + type Grid + ! general basin information + integer(i4) :: ncols ! Number of columns + integer(i4) :: nrows ! Number of rows + integer(i4) :: nCells ! Number of rows + real(dp) :: xllcorner ! x coordinate of the lowerleft corner + real(dp) :: yllcorner ! y coordinate of the lowerleft corner + real(dp) :: cellsize ! Cellsize x = cellsize y + real(dp) :: nodata_value ! Code to define the mask + real(dp), dimension(:, :), allocatable :: x ! 2d longitude array (unmasked version is needed for output anyway) + real(dp), dimension(:, :), allocatable :: y ! 2d latitude array (unmasked version is needed for output anyway) + logical, dimension(:, :), allocatable :: mask ! the mask for valid cells in the original grid (nrows*ncols) + ! for referencing values in the nValidCells vector + integer(i4) :: iStart ! Starting cell index of a given basin + integer(i4) :: iEnd ! Ending cell index of a given basin + ! dimension(nCells, (x,y) ) + integer(i4), dimension(:, :), allocatable :: CellCoor ! this is only used for mRM + real(dp), dimension(:), allocatable :: CellArea ! area of the cell in sqkm + integer(i4), dimension(:), allocatable :: Id + + end type Grid + + type(Grid), dimension(:), target, allocatable, public :: level0 ! grid information at morphological level (e.g., dem, fDir) + type(Grid), dimension(:), target, allocatable, public :: level1 ! grid information at runoff level + + type GridRemapper + type(Grid), pointer :: high_res_grid + type(Grid), pointer :: low_res_grid + + ! dimension nCells + integer(i4), dimension(:), allocatable :: lower_bound ! 1d index of lower side subgrid + integer(i4), dimension(:), allocatable :: upper_bound ! 1d index of upper side subgrid + integer(i4), dimension(:), allocatable :: left_bound ! 1d index of left side subgrid + integer(i4), dimension(:), allocatable :: right_bound ! 1d index of right side subgrid + integer(i4), dimension(:), allocatable :: n_subcells ! 1d numberof valid subgrid cells + integer(i4), dimension(:, :), allocatable :: lowres_id_on_highres ! 2d index array of lowres id + + end type GridRemapper + + type(GridRemapper), dimension(:), allocatable, public :: l0_l1_remap ! grid information at morphological level (e.g., dem, fDir) + + ! ------------------------------------------------------------------- + ! L0 DOMAIN description -> + ! ------------------------------------------------------------------- + ! dim1 = number grid cells + ! input data - morphological variables + real(dp), public, dimension(:), allocatable :: L0_elev ! [m] Elevation (sinks removed) + ! target variable for coupling to mRM + integer(i4), public, dimension(:, :), allocatable :: L0_LCover ! Classic mHM landcover class (upto 3 classes) + ! ! dim1=number grid cells, dim2=Number of land cover scenes + ! ! target variable for coupling to mRM + + ! ------------------------------------------------------------------- + ! BASIN general description + ! ------------------------------------------------------------------- + integer(i4), public :: nBasins ! Number of basins for multi-basin optimization + integer(i4), public :: nuniquel0Basins ! Number of unique basins for L0 + + ! ----------------------------------------------------------------- + ! LAND COVER DATA + ! ----------------------------------------------------------------- + ! Land cover information + integer(i4), public :: nLCoverScene ! Number of land cover scene (lcs) + character(256), dimension(:), allocatable, public :: LCfilename ! file names for the different lcs + integer(i4), dimension(:), allocatable, public :: LC_year_start ! vector of start years for lcs + integer(i4), dimension(:), allocatable, public :: LC_year_end ! vector of end years for lcs + ! ------------------------------------------------------------------- ! PROCESSES description ! ------------------------------------------------------------------- - integer(i4), parameter, public :: nProcesses = 10 ! Number of possible processes to consider + integer(i4), parameter, public :: nProcesses = 10 ! Number of possible processes to consider ! ! process 1 :: interception ! ! process 2 :: snow ! ! process 3 :: soilmoisture @@ -33,70 +151,24 @@ module mo_common_variables ! ! col3: cum. no. of parameters ! ------------------------------------------------------------------- - ! PERIOD description + ! PARAMETERS ! ------------------------------------------------------------------- - type period - integer(i4) :: dStart ! first day - integer(i4) :: mStart ! first month - integer(i4) :: yStart ! first year - integer(i4) :: dEnd ! last day - integer(i4) :: mEnd ! last month - integer(i4) :: yEnd ! last year - integer(i4) :: julStart ! first julian day - integer(i4) :: julEnd ! last julian day - integer(i4) :: nObs ! total number of observations - end type period - ! ------------------------------------------------------------------- - ! OPTIMIZATION - ! ------------------------------------------------------------------- - integer(i4), public :: opti_method ! Optimization algorithm: - ! ! 1 - DDS - ! ! 2 - Simulated Annealing - ! ! 3 - SCE - integer(i4), public :: opti_function ! Objective function: - ! ! 1 - 1.0-NSE - ! ! 2 - 1.0-lnNSE - ! ! 3 - 1.0-0.5*(NSE+lnNSE) - logical, public :: optimize ! Optimization (.true. ) or - ! ! Evaluation run (.false.) - logical, public :: optimize_restart ! Optimization will be restarted from - ! ! mo_.restart file (.true.) - ! settings for optimization algorithms: - integer(i8), public :: seed ! seed used for optimization - ! ! default: -9 --> system time - integer(i4), public :: nIterations ! number of iterations for optimization - real(dp), public :: dds_r ! DDS: perturbation rate - ! ! default: 0.2 - real(dp), public :: sa_temp ! SA: initial temperature - ! ! default: -9.0 --> estimated - integer(i4), public :: sce_ngs ! SCE: # of complexes - ! ! default: 2 - integer(i4), public :: sce_npg ! SCE: # of points per complex - ! ! default: -9 --> 2n+1 - integer(i4), public :: sce_nps ! SCE: # of points per subcomplex - ! ! default: -9 --> n+1 - logical, public :: mcmc_opti ! MCMC: Optimization (.true. ) or - ! ! Only parameter uncertainty (.false.) - integer(i4), public, parameter :: nerror_model = 2 ! # possible parameters in error model - ! ! e.g. for opti_function=8: 2 - real(dp), public, dimension(nerror_model) :: mcmc_error_params ! Parameters of error model if mcmc_opti=.false. - ! ! e.g. for opti_function=8: 0.01, 0.3 - - ! ------------------------------------------------------------------- - ! PARAMETERS - ! ------------------------------------------------------------------- - real(dp), dimension(:,:), allocatable, public :: global_parameters ! Matrix of global parameters (former: gamma) - ! ! col1: min, col2: max, col3: initial, - ! ! col4: flag, col5: scaling - character(256), dimension(:), allocatable, public :: global_parameters_name ! Matrix of global parameters (former: gamma) - ! ! col1: names - ! ------------------------------------------------------------------- - ! ALMA convention - ! ------------------------------------------------------------------- - logical :: ALMA_convention ! flag for ALMA convention - ! ! see http://www.lmd.jussieu.fr/~polcher/ALMA/convention_3.html - ! ! .True.: ALMA convention is used for Input/Output - ! ! .False.: default mHM units are used - ! ! CAUTION: only Qall is considered at the moment - + real(dp), dimension(:, :), allocatable, public, target :: global_parameters + ! ! Matrix of global parameters (former: gamma) + ! ! col1: min, col2: max, col3: initial, + ! ! col4: flag, col5: scaling + character(256), dimension(:), allocatable, public :: global_parameters_name + ! ! Matrix of global parameters (former: gamma) + ! ! col1: names + ! ------------------------------------------------------------------- + ! ALMA convention + ! ------------------------------------------------------------------- + ! TODO: this is currently used only be mRM, but could be useful for MPR and mHM also, ... + ! so it is already in common_variables + logical :: ALMA_convention ! flag for ALMA convention + ! ! see http://www.lmd.jussieu.fr/~polcher/ALMA/convention_3.html + ! ! .True.: ALMA convention is used for Input/Output + ! ! .False.: default mHM units are used + ! ! CAUTION: only Qall is considered at the moment + end module mo_common_variables diff --git a/src/common/mo_grid.f90 b/src/common/mo_grid.f90 new file mode 100644 index 00000000..1f7da67a --- /dev/null +++ b/src/common/mo_grid.f90 @@ -0,0 +1,597 @@ +module mo_grid + use mo_kind, only : dp, i4 + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: init_lowres_level, set_basin_indices, L0_grid_setup, & + mapCoordinates, geoCoordinates +contains + ! ------------------------------------------------------------------ + + ! NAME + ! L1_variable_init + + !> \brief Level-1 variable initialization + + !> \details following tasks are performed for L1 datasets + !> - cell id & numbering + !> - mask creation + !> - storage of cell cordinates (row and coloum id) + !> - sorage of four corner L0 cordinates + !> If a variable is added or removed here, then it also has to + !> be added or removed in the subroutine config_variables_set in + !> module mo_restart and in the subroutine set_config in module + !> mo_set_netcdf_restart + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" basin id + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + ! \author Rohini Kumar + ! \date Jan 2013 + + subroutine init_lowres_level(highres, target_resolution, lowres, highres_lowres_remap) + + use mo_common_variables, only : & + Grid, GridRemapper + use mo_common_constants, only : nodata_dp, nodata_i4 + + implicit none + + type(Grid), target, intent(in) :: highres + real(dp), intent(in) :: target_resolution + type(Grid), target, intent(inout) :: lowres + type(GridRemapper), intent(inout), optional :: highres_lowres_remap + + ! local variables + real(dp), dimension(:, :), allocatable :: areaCell0_2D + + real(dp) :: cellFactor + + integer(i4) :: iup, idown + integer(i4) :: jl, jr + + integer(i4) :: i, j, k, ic, jc + + !-------------------------------------------------------- + ! STEPS:: + ! 1) Estimate each variable locally for a given basin + ! 2) Pad each variable to its corresponding global one + !-------------------------------------------------------- + + ! grid properties + if (.not. allocated(lowres%mask)) then + call calculate_grid_properties(highres%nrows, highres%ncols, & + highres%xllcorner, highres%yllcorner, highres%cellsize, & + target_resolution, & + lowres%nrows, lowres%ncols, & + lowres%xllcorner, lowres%yllcorner, lowres%cellsize) + ! cellfactor = leve1-1 / level-0 + cellFactor = lowres%cellsize / highres%cellsize + + ! allocation and initalization of mask at level-1 + allocate(lowres%mask(lowres%nrows, lowres%ncols)) + lowres%mask(:, :) = .FALSE. + + ! create mask at level-1 + do j = 1, highres%ncols + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, highres%nrows + if (.NOT. highres%mask(i, j)) cycle + ic = ceiling(real(i, dp) / cellFactor) + lowres%mask(ic, jc) = .TRUE. + end do + end do + + ! estimate ncells and initalize related variables + lowres%nCells = count(lowres%mask) + ! allocate and initalize cell1 related variables + allocate(lowres%Id (lowres%nCells)) + lowres%Id = (/ (k, k = 1, lowres%nCells) /) + end if + + if (present(highres_lowres_remap)) then + ! cellfactor = leve1-1 / level-0, set again in case not yet initialized + cellFactor = lowres%cellsize / highres%cellsize + + ! lowres additional properties + allocate(areaCell0_2D(highres%nrows, highres%ncols)) + areaCell0_2D(:, :) = UNPACK(highres%CellArea, highres%mask, nodata_dp) + + if (.not. allocated(lowres%CellCoor)) then + allocate(lowres%CellCoor (lowres%nCells, 2)) + allocate(lowres%CellArea (lowres%nCells)) + end if + + allocate(highres_lowres_remap%lower_bound(lowres%nCells)) + allocate(highres_lowres_remap%upper_bound(lowres%nCells)) + allocate(highres_lowres_remap%left_bound (lowres%nCells)) + allocate(highres_lowres_remap%right_bound(lowres%nCells)) + allocate(highres_lowres_remap%n_subcells (lowres%nCells)) + allocate(highres_lowres_remap%lowres_id_on_highres (highres%nrows, highres%ncols)) + highres_lowres_remap%lowres_id_on_highres = nodata_i4 + + highres_lowres_remap%high_res_grid => highres + highres_lowres_remap%low_res_grid => lowres + + k = 0 + do jc = 1, lowres%ncols + do ic = 1, lowres%nrows + if (.NOT. lowres%mask(ic, jc)) cycle + k = k + 1 + + lowres%CellCoor(k, 1) = ic + lowres%CellCoor(k, 2) = jc + + ! coord. of all corners -> of finer scale level-0 + iup = (ic - 1) * nint(cellFactor, i4) + 1 + idown = ic * nint(cellFactor, i4) + jl = (jc - 1) * nint(cellFactor, i4) + 1 + jr = jc * nint(cellFactor, i4) + + ! constrain the range of up, down, left, and right boundaries + if(iup < 1) iup = 1 + if(idown > highres%nrows) idown = highres%nrows + if(jl < 1) jl = 1 + if(jr > highres%ncols) jr = highres%ncols + + highres_lowres_remap%upper_bound (k) = iup + highres_lowres_remap%lower_bound (k) = idown + highres_lowres_remap%left_bound (k) = jl + highres_lowres_remap%right_bound(k) = jr + + ! effective area [km2] & total no. of L0 cells within a given L1 cell + lowres%CellArea(k) = sum(areacell0_2D(iup : idown, jl : jr), highres%mask(iup : idown, jl : jr)) + highres_lowres_remap%n_subcells(k) = count(highres%mask(iup : idown, jl : jr)) + ! Delimitation of level-11 cells on level-0 + highres_lowres_remap%lowres_id_on_highres(iup : idown, jl : jr) = k + end do + end do + + ! free space + deallocate(areaCell0_2D) + + end if + + end subroutine init_lowres_level + + subroutine set_basin_indices(grids) + ! this is separate because the Grid initialization is usually called within a basin loop... + + use mo_common_variables, only : Grid + implicit none + + type(Grid), intent(inout), dimension(:) :: grids + + ! local variables + integer(i4) :: iBasin + + do iBasin = 1, size(grids) + ! Saving indices of mask and packed data + if(iBasin .eq. 1_i4) then + grids(iBasin)%iStart = 1_i4 + else + grids(iBasin)%iStart = grids(iBasin - 1_i4)%iEnd + 1_i4 + end if + grids(iBasin)%iEnd = grids(iBasin)%iStart + grids(iBasin)%nCells - 1_i4 + end do + + end subroutine set_basin_indices + + ! ------------------------------------------------------------------ + + ! NAME + ! L0_variable_init + + !> \brief level 0 variable initialization + + !> \details following tasks are performed for L0 data sets + !> - cell id & numbering + !> - storage of cell cordinates (row and coloum id) + !> - empirical dist. of terrain slope + !> - flag to determine the presence of a particular soil id + !> in this configuration of the model run + !> If a variable is added or removed here, then it also has to + !> be added or removed in the subroutine config_variables_set in + !> module mo_restart and in the subroutine set_config in module + !> mo_set_netcdf_restart + + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" basin id + + ! INTENT(INOUT) + !> \param[in,out] "integer(i4), dimension(:) :: soilId_isPresent" + !> flag to indicate wether a given soil-id is present or not, DIMENSION [nSoilTypes] + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + ! \author Rohini Kumar + ! \date Jan 2013 + ! Modified + ! Rohini Kumar & Matthias Cuntz, May 2014 - cell area calulation based on a regular lat-lon grid or + ! on a regular X-Y coordinate system + ! Matthias Cuntz, May 2014 - changed empirical distribution function + ! so that doubles get the same value + ! Matthias Zink & Matthias Cuntz, Feb 2016 - code speed up due to reformulation of CDF calculation + ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options + + subroutine L0_grid_setup(new_grid) + + use mo_common_variables, only : Grid, iFlag_cordinate_sys + use mo_constants, only : TWOPI_dp, RadiusEarth_dp + + implicit none + + type(Grid), intent(inout) :: new_grid + + ! local variables + real(dp), dimension(:, :), allocatable :: areaCell_2D + + integer(i4) :: i, j, k + real(dp) :: rdum, degree_to_radian, degree_to_metre + + !-------------------------------------------------------- + ! STEPS:: + ! 1) Estimate each variable locally for a given basin + ! 2) Pad each variable to its corresponding global one + !-------------------------------------------------------- + + ! level-0 information + new_grid%nCells = count(new_grid%mask) + + allocate(new_grid%CellCoor(new_grid%nCells, 2)) + allocate(new_grid%Id(new_grid%nCells)) + allocate(new_grid%CellArea(new_grid%nCells)) + allocate(areaCell_2D(new_grid%nrows, new_grid%ncols)) + + new_grid%Id = (/ (k, k = 1, new_grid%nCells) /) + + !------------------------------------------------ + ! start looping for cell cordinates and ids + !------------------------------------------------ + k = 0 + do j = 1, new_grid%ncols + do i = 1, new_grid%nrows + if (.NOT. new_grid%mask(i, j)) cycle + k = k + 1 + new_grid%cellCoor(k, 1) = i + new_grid%cellCoor(k, 2) = j + end do + end do + + ! ESTIMATE AREA [m2] + + ! regular X-Y coordinate system + if(iFlag_cordinate_sys .eq. 0) then + new_grid%CellArea(:) = new_grid%cellsize * new_grid%cellsize + + ! regular lat-lon coordinate system + else if(iFlag_cordinate_sys .eq. 1) then + + degree_to_radian = TWOPI_dp / 360.0_dp + degree_to_metre = RadiusEarth_dp * TWOPI_dp / 360.0_dp + do i = new_grid%ncols, 1, -1 + j = new_grid%ncols - i + 1 + ! get latitude in degrees + rdum = new_grid%yllcorner + (real(j, dp) - 0.5_dp) * new_grid%cellsize + ! convert to radians + rdum = rdum * degree_to_radian + ! AREA [m2] + areaCell_2D(:, i) = (new_grid%cellsize * cos(rdum) * degree_to_metre) * (new_grid%cellsize * degree_to_metre) + end do + new_grid%CellArea(:) = pack(areaCell_2D(:, :), new_grid%mask) + + end if + + ! free space + deallocate(areaCell_2D) + + end subroutine L0_grid_setup + + + !------------------------------------------------------------------ + ! NAME + ! mapCoordinates + ! + ! PURPOSE + !> \brief Generate map coordinates + !> \details Generate map coordinate arrays for given basin and level + ! + ! CALLING SEQUENCE + ! call mapCoordinates(ibasin, level, y, x) + ! + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" -> basin number + !> \param[in] "type(geoGridRef) :: level" -> grid reference + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "real(:) :: y(:)" -> y-coordinates + !> \param[out] "real(dp) :: x(:)" -> x-coorindates + ! + ! INTENT(IN), OPTIONAL + ! None + ! + ! INTENT(INOUT), OPTIONAL + ! None + ! + ! INTENT(OUT), OPTIONAL + ! None + ! + ! RETURN + ! None + ! + ! RESTRICTIONS + ! None + ! + ! EXAMPLE + ! None + ! + ! LITERATURE + ! None + ! + ! HISTORY + !> \author Matthias Zink + !> \date Apr 2013 + ! Modified: + ! Stephan Thober, Nov 2013 - removed fproj dependency + ! David Schaefer, Jun 2015 - refactored the former subroutine CoordSystem + subroutine mapCoordinates(level, y, x) + + use mo_common_variables, only : Grid + + implicit none + + type(Grid), intent(in) :: level + real(dp), intent(out), allocatable :: x(:), y(:) + integer(i4) :: ii, ncols, nrows + real(dp) :: cellsize + + cellsize = level%cellsize + nrows = level%nrows + ncols = level%ncols + + allocate(x(nrows), y(ncols)) + + x(1) = level%xllcorner + 0.5_dp * cellsize + do ii = 2, nrows + x(ii) = x(ii - 1) + cellsize + end do + + ! inverse for Panoply, ncview display + y(ncols) = level%yllcorner + 0.5_dp * cellsize + do ii = ncols - 1, 1, -1 + y(ii) = y(ii + 1) + cellsize + end do + + end subroutine mapCoordinates + + !------------------------------------------------------------------ + ! NAME + ! geoCoordinates + ! + ! PURPOSE + !> \brief Generate geographic coordinates + !> \details Generate geographic coordinate arrays for given basin and level + ! + ! CALLING SEQUENCE + ! call mapCoordinates(ibasin, level, y, x) + ! + ! INTENT(IN) + !> \param[in] "integer(i4) :: iBasin" -> basin number + !> \param[in] "type(Grid) :: level" -> grid reference + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "real(dp) :: lat(:,:)" -> lat-coordinates + !> \param[out] "real(dp) :: lon(:,:)" -> lon-coorindates + ! + ! INTENT(IN), OPTIONAL + ! None + ! + ! INTENT(INOUT), OPTIONAL + ! None + ! + ! INTENT(OUT), OPTIONAL + ! None + ! + ! RETURN + ! None + ! + ! RESTRICTIONS + ! None + ! + ! EXAMPLE + ! None + ! + ! LITERATURE + ! None + ! + ! HISTORY + !> \author Matthias Zink + !> \date Apr 2013 + ! Modified: + ! Stephan Thober, Nov 2013 - removed fproj dependency + ! David Schaefer, Jun 2015 - refactored the former subroutine CoordSystem + ! Stephan Thober, Sep 2015 - using mask to unpack coordinates + ! Stephan Thober, Oct 2015 - writing full lat/lon again + subroutine geoCoordinates(level, lat, lon) + + use mo_common_variables, only : Grid + + implicit none + + type(Grid), intent(in) :: level + real(dp), intent(out), allocatable :: lat(:, :), lon(:, :) + + lat = level%y + lon = level%x + + end subroutine geoCoordinates + + ! ------------------------------------------------------------------ + + ! NAME + ! calculate_grid_properties + + ! PURPOSE + !> \brief Calculates basic grid properties at a required coarser level using + !> information of a given finer level. + + !> \brief Calculates basic grid properties at a required coarser level (e.g., L11) using + !> information of a given finer level (e.g., L0). Basic grid properties such as + !> nrows, ncols, xllcorner, yllcorner cellsize are estimated in this + !> routine. + + ! CALLING SEQUENCE + ! call calculate_grid_properties( nrowsIn, ncolsIn, xllcornerIn, & + ! yllcornerIn, cellsizeIn, nodata_valueIn, & + ! aimingResolution, nrowsOut, ncolsOut, xllcornerOut, & + ! yllcornerOut, cellsizeOut, nodata_valueOut ) + ! INTENT(IN) + !> \param[in] "integer(i4) :: nrowsIn" no. of rows at an input level + !> \param[in] "integer(i4) :: ncolsIn" no. of cols at an input level + !> \param[in] "real(dp) :: xllcornerIn" xllcorner at an input level + !> \param[in] "real(dp) :: yllcornerIn" yllcorner at an input level + !> \param[in] "real(dp) :: cellsizeIn" cell size at an input level + !> \param[in] "real(dp) :: nodata_valueIn" nodata value at an input level + !> \param[in] "real(dp) :: aimingResolution" resolution of an output level + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "integer(i4) :: nrowsOut" no. of rows at an output level + !> \param[out] "integer(i4) :: ncolsOut" no. of cols at an output level + !> \param[out] "real(dp) :: xllcornerOut" xllcorner at an output level + !> \param[out] "real(dp) :: yllcornerOut" yllcorner at an output level + !> \param[out] "real(dp) :: cellsizeOut" cell size at an output level + !> \param[out] "real(dp) :: nodata_valueOut" nodata value at an output level + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + !> \note resolutions of input and output levels should confirm each other. + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink & Rohini Kumar + !> \date Feb 2013 + ! Modified, R. Kumar, Sep 2013 - documentation added according to the template + + subroutine calculate_grid_properties(& + nrowsIn, ncolsIn, xllcornerIn, yllcornerIn, cellsizeIn, & + aimingResolution, & + nrowsOut, ncolsOut, xllcornerOut, yllcornerOut, cellsizeOut) + + use mo_message, only : message ! for print out + use mo_string_utils, only : num2str + + implicit none + + integer(i4), intent(in) :: nrowsIn + integer(i4), intent(in) :: ncolsIn + real(dp), intent(in) :: xllcornerIn + real(dp), intent(in) :: yllcornerIn + real(dp), intent(in) :: cellsizeIn + real(dp), intent(in) :: aimingResolution + + integer(i4), intent(out) :: nrowsOut + integer(i4), intent(out) :: ncolsOut + real(dp), intent(out) :: xllcornerOut + real(dp), intent(out) :: yllcornerOut + real(dp), intent(out) :: cellsizeOut + + ! local variables + real(dp) :: cellfactor + + cellFactor = aimingResolution / cellsizeIn + + if (nint(mod(aimingResolution, cellsizeIn)) /= 0) then + call message() + call message('***ERROR: Two resolutions size do not confirm: ', & + trim(adjustl(num2str(nint(AimingResolution)))), & + trim(adjustl(num2str(nint(cellsizeIn))))) + stop 1 + end if + + cellsizeOut = cellsizeIn * cellFactor + ncolsOut = ceiling(real(ncolsIn, dp) / cellFactor) + nrowsOut = ceiling(real(nrowsIn, dp) / cellFactor) + xllcornerOut = xllcornerIn + real(ncolsIn, dp) * cellsizeIn - real(ncolsOut, dp) * cellsizeOut + yllcornerOut = yllcornerIn + real(nrowsIn, dp) * cellsizeIn - real(nrowsOut, dp) * cellsizeOut + + end subroutine calculate_grid_properties + +end module mo_grid \ No newline at end of file diff --git a/src/common/mo_optimization.f90 b/src/common/mo_optimization.f90 deleted file mode 100644 index 661cef76..00000000 --- a/src/common/mo_optimization.f90 +++ /dev/null @@ -1,284 +0,0 @@ -!> \file mo_optimization.f90 - -!> \brief Wrapper subroutine for optimization against runoff and sm. - -!> \details This module provides a wrapper subroutine for optimization of mRM/mHM -!> against runoff or soil moisture.\n - -!> \authors Stephan Thober -!> \date Oct 2015 -module mo_optimization - implicit none - public :: optimization - private -contains - ! ------------------------------------------------------------------ - - ! NAME - ! optimization - - !> \brief Wrapper for optimization. - - !> \details This subroutine selects the optimization defined in a namelist, - !> i.e. the global variable \e opti\_method.\n - !> It return the objective function value for a specific parameter set. - - ! INTENT(IN) - !> \param[in] "real(dp) :: objective" - objective function used in the optimization - !> \param[in] "character(len=*) :: dirConfigOut" - directory where to write ascii output - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: funcBest" - best objective function value obtained during optimization - !> \param[out] "logical, allocatable :: maskpara(:) " - mask of optimized parameters - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - - ! HISTORY - !> \author Matthias Cuntz, Luis Samaniego, Juliane Mai, Matthias Zink and Stephan Thober - !> \date Oct 2015 - - subroutine optimization(objective, dirConfigOut, funcBest, maskpara) - use mo_kind, only: i4, i8, dp - use mo_anneal, only: anneal ! Optimize with Simulated Annealing SA - use mo_dds, only: dds ! Optimize with Dynam. Dimens. Search DDS - use mo_string_utils, only: num2str - use mo_common_variables, only: & - opti_method, & ! Optimization algorithm used - opti_function, & ! Objective function used - optimize_restart, & ! Optimization will be restarted from - ! ! mo_.restart file (.true.) - global_parameters, & ! Matrix of global parameters (former: gamma) - ! ! col1: min, col2: max, col3: initial, - ! ! col4: flag, col5: scaling - nIterations, & ! number of iterations for optimization - seed, & ! seed used for optimization - mcmc_opti, & ! MCMC: Optimization (.true. ) or - ! ! Only parameter uncertainty (.false.) - mcmc_error_params, & ! Parameters of error model if mcmc_opti=.false. - ! ! e.g. for opti_function=8: 0.01, 0.3 - sa_temp, & ! SA: initial temperature - dds_r, & ! DDS: perturbation rate - sce_ngs, & ! SCE: # of complexes - sce_npg, & ! SCE: # of points per complex - sce_nps ! SCE: # of points per subcomplex - USE mo_mcmc, only: mcmc, mcmc_stddev ! Monte Carlo Markov Chain method - use mo_sce, only: sce ! Optimize with Shuffled Complex evolution - use mo_message, only: message - use mo_finish, only: finish - use mo_timer, only: timer_start, timer_stop, timer_get ! Timing of processes - use mo_xor4096, only: get_timeseed ! generating a seed from clock - ! objective functions and likelihood for runoff only - use mo_mrm_objective_function_runoff, only: loglikelihood, loglikelihood_stddev - - implicit none - - ! ------------------------------------------------------------------------- - ! INPUT VARIABLES - ! ------------------------------------------------------------------------- - interface - function objective (pp) - use mo_kind, only: dp - implicit none - real(dp), intent (in) :: pp(:) - real(dp) :: objective - end function objective - end interface - character(len=*), intent(in) :: dirConfigOut - - ! ------------------------------------------------------------------------- - ! OUTPUT VARIABLES - ! ------------------------------------------------------------------------- - real(dp), intent(out) :: funcbest ! best objective function achivied during optimization - logical, intent(out), allocatable :: maskpara(:) ! true = parameter will be optimized = parameter(i,4) = 1 - ! ! false = parameter will not be optimized = parameter(i,4) = 0 - - ! ------------------------------------------------------------------------- - ! LOCAL VARIABLES - ! ------------------------------------------------------------------------- - integer(i4) :: ii - integer(i4) :: iTimer ! current timer number - ! mcmc - real(dp), allocatable :: burnin_paras(:,:) ! parameter sets sampled during burnin - real(dp), allocatable :: mcmc_paras(:,:) ! parameter sets sampled during proper mcmc - ! setting step sizes manually - ! real(dp), dimension(:), allocatable :: step ! pre-determined stepsize - integer(i4) :: npara - real(dp), allocatable :: local_parameters(:,:) ! global_parameters but includes a and b for likelihood - logical, allocatable :: local_maskpara(:) ! maskpara but includes a and b for likelihood - integer(i8) :: iseed ! local seed used for optimization - character(256) :: tFile ! file for temporal optimization outputs - character(256) :: pFile ! file for temporal SCE optimization outputs - - ! ------------------------------------------------------------------------- - ! START - ! ------------------------------------------------------------------------- - call message(' Start optimization') - iTimer = 1 - call timer_start(iTimer) - - ! mask parameter which have a FLAG=0 in mhm_parameter.nml - ! maskpara = true : parameter will be optimized - ! maskpara = false : parameter is discarded during optimization - npara = size(global_parameters,1) - allocate(maskpara(npara)) - maskpara = .true. - do ii=1, npara - if ( nint(global_parameters(ii,4),i4) .eq. 0_i4 ) then - maskpara(ii) = .false. - end if - end do - - ! add two extra parameter for optimisation of likelihood - if (opti_function == 8) then - allocate(local_parameters(npara+2,size(global_parameters,2))) - allocate(local_maskpara(npara+2)) - ! setting step sizes manually - ! allocate(step(npara+2)) - local_parameters(1:npara,:) = global_parameters(:,:) - local_maskpara(1:npara) = maskpara(:) - local_parameters(npara+1,1) = 0.001_dp - local_parameters(npara+1,2) = 100._dp - local_parameters(npara+1,3) = 1._dp - local_parameters(npara+1,4) = 1._dp - local_parameters(npara+1,5) = 0._dp - local_parameters(npara+2,1) = 0.001_dp - local_parameters(npara+2,2) = 10._dp - local_parameters(npara+2,3) = 0.1_dp - local_parameters(npara+2,4) = 1._dp - local_parameters(npara+2,5) = 0._dp - local_maskpara(npara+1:) = .true. - if ((opti_method == 0) .and. (.not. mcmc_opti)) then ! MCMC but only for parameter uncertainties - local_parameters(npara+1,3) = mcmc_error_params(1) - local_parameters(npara+2,3) = mcmc_error_params(2) - local_maskpara(npara+1:) = .false. - end if - else - allocate(local_parameters(npara,size(global_parameters,2))) - allocate(local_maskpara(npara)) - local_parameters = global_parameters - local_maskpara = maskpara - end if - - ! Seed for random numbers in optimisation - if (seed .gt. 0_i8) then ! fixed user-defined seed - iseed = seed - else ! flexible clock-time seed - call get_timeseed(iseed) - end if - - select case (opti_method) - case (0) - call message(' Use MCMC') - - tFile = trim(adjustl(dirConfigOut)) // 'mcmc_tmp_parasets.nc' - - ! setting step sizes manually - ! step=(/ 1.00000000000000, ... , /) - - if (opti_function == 8) then - call message(' Use MCMC') - call mcmc(loglikelihood, local_parameters(:,3), local_parameters(:,1:2), mcmc_paras, burnin_paras, & - ParaSelectMode_in=2_i4, tmp_file=tFile, & - maskpara_in=local_maskpara, & - restart=optimize_restart, restart_file='mo_mcmc.restart', & - ! stepsize_in=step, & - seed_in=iseed, loglike_in=.true., printflag_in=.true.) - else - if (optimize_restart) then - call message('ERROR: A restart of this optimization method is not implemented yet!') - stop - end if - call message(' Use MCMC_STDDEV') - call mcmc_stddev(loglikelihood_stddev, local_parameters(:,3), local_parameters(:,1:2), mcmc_paras, burnin_paras, & - ParaSelectMode_in=2_i4, tmp_file=tFile, & - maskpara_in=local_maskpara, & - seed_in=iseed, loglike_in=.true., printflag_in=.true.) - end if - - case (1) - call message(' Use DDS') - - tFile = trim(adjustl(dirConfigOut)) // 'dds_results.out' - - if (optimize_restart) then - call message('ERROR: A restart of this optimization method is not implemented yet!') - stop - end if - ! use fixed user-defined seed - local_parameters(:,3) = dds(objective, local_parameters(:,3), local_parameters(:,1:2), & - maxiter=int(nIterations,i8), r=dds_r, seed=iseed, & - tmp_file=tFile, mask=local_maskpara, & - funcbest=funcbest) - - case (2) - call message(' Use Simulated Annealing') - - tFile = trim(adjustl(dirConfigOut)) // 'anneal_results.out' - - if (optimize_restart) then - call message('ERROR: A restart of this optimization method is not implemented yet!') - stop - end if - - if (sa_temp .gt. 0.0_dp) then - ! use fixed user-defined seed and user-defined initial temperature - local_parameters(:,3) = anneal(objective, local_parameters(:,3), local_parameters(:,1:2), & - temp=sa_temp, seeds=(/iseed, iseed+1000_i8, iseed+2000_i8/), nITERmax=nIterations, & - tmp_file=tFile, maskpara=local_maskpara, & - funcbest=funcbest) - else - ! use fixed user-defined seed and adaptive initial temperature - local_parameters(:,3) = anneal(objective, local_parameters(:,3), local_parameters(:,1:2), & - seeds=(/iseed, iseed+1000_i8, iseed+2000_i8/), nITERmax=nIterations, & - tmp_file=tFile, maskpara=local_maskpara, & - funcbest=funcbest) - end if - case (3) - call message(' Use SCE') - - tFile = trim(adjustl(dirConfigOut)) // 'sce_results.out' - pFile = trim(adjustl(dirConfigOut)) // 'sce_population.out' - - ! use fixed user-defined seed - local_parameters(:,3) = sce(objective, local_parameters(:,3), local_parameters(:,1:2), & - mymaxn=int(nIterations,i8), myseed=iseed, myngs=sce_ngs, mynpg=sce_npg, mynps=sce_nps, & - parallel=.false., mymask=local_maskpara, & - restart=optimize_restart, restart_file='mo_sce.restart', & - tmp_file=tFile, popul_file=pFile, & - bestf=funcbest) - case default - call finish('mRM','This optimization method is not implemented.') - end select - call timer_stop(iTimer) - call message(' in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.') - - global_parameters(:,:) = local_parameters(1:npara,:) - maskpara(:) = local_maskpara(1:npara) - - deallocate(local_parameters) - deallocate(local_maskpara) - - end subroutine optimization - -end module mo_optimization diff --git a/src/common/mo_read_forcing_nc.f90 b/src/common/mo_read_forcing_nc.f90 index 52b8533a..7f6ea6e4 100644 --- a/src/common/mo_read_forcing_nc.f90 +++ b/src/common/mo_read_forcing_nc.f90 @@ -14,7 +14,6 @@ ! Modified Sep 2015, Stephan Thober - separated routines for netcdf files from routines for binary files ! Jan 2017, Stephan Thober - added reading weights for disaggregation of daily meteorological values to hourly ones ! Nov 2017, Robert Schweppe - switched to mo_netcdf library and restuctured routines - module mo_read_forcing_nc implicit none public :: read_forcing_nc @@ -41,28 +40,27 @@ module mo_read_forcing_nc !> Additionally in this case an mask of vild data points can be received from the routine in maskout. ! CALLING SEQUENCE - ! periode%dStart = 2_i4 ! day - ! periode%mStart = 2_i4 ! month - ! periode%yStart = 1972_i4 ! year - ! periode%dEnd = 7_i4 ! day - ! periode%mEnd = 8_i4 ! month - ! periode%yEnd = 1977_i4 ! year - ! periode%julStart = NDAYS(periode%dStart, periode%mStart, periode%yStart) ! julian day starting - ! periode%julEnd = NDAYS(periode%dEnd, periode%mEnd, periode%yEnd ) ! julian day ending - ! periode%nObs = periode%julEnd - periode%julStart + 1_i4 ! total number of observation - - ! call read_forcing_bin('old_code/sub_00020/input/forcing/pre/' , 21_i4, 28_i4, periode, precipitation, & + ! target_period%dStart = 2_i4 ! day + ! target_period%mStart = 2_i4 ! month + ! target_period%yStart = 1972_i4 ! year + ! target_period%dEnd = 7_i4 ! day + ! target_period%mEnd = 8_i4 ! month + ! target_period%yEnd = 1977_i4 ! year + ! target_period%julStart = NDAYS(target_period%dStart, target_period%mStart, target_period%yStart) ! julian day starting + ! target_period%julEnd = NDAYS(target_period%dEnd, target_period%mEnd, target_period%yEnd ) ! julian day ending + ! target_period%nObs = target_period%julEnd - target_period%julStart + 1_i4 ! total number of observation + + ! call read_forcing_nc('old_code/sub_00020/input/forcing/pre/' , 21_i4, 28_i4, precipitation, target_period, & ! lower= 0.0_dp) - ! call read_forcing_bin('old_code/sub_00020/input/forcing/pet/' , 21_i4, 28_i4, periode, pot_evapo_trans, & + ! call read_forcing_nc('old_code/sub_00020/input/forcing/pet/' , 21_i4, 28_i4, pot_evapo_trans, target_period, & ! lower= 0.0_dp, upper=20.0_dp) - ! call read_forcing_bin('old_code/sub_00020/input/forcing/tavg/', 21_i4, 28_i4, periode, temp_average, & + ! call read_forcing_nc('old_code/sub_00020/input/forcing/tavg/', 21_i4, 28_i4, temp_average, target_period, & ! lower=-50.0_dp, upper=50.0_dp) ! INTENT(IN) !> \param[in] "character(len=*) :: folder" Name of the folder where data are stored !> \param[in] "integer(i4) :: nRows" Number of datapoints in longitudinal direction !> \param[in] "integer(i4) :: nCols" Number of datapoints in latitudinal direction - !> \param[in] "type(period) :: periode" Period the data are needed for !> \param[in] "character(len=*) :: varName" Name of variable name to read !> \param[in] "logical, dimension(:,:) :: mask" mask of valid data fields @@ -74,13 +72,14 @@ module mo_read_forcing_nc !> dim_1 = longitude, dim_2 = latitude, dim_3 = time ! INTENT(IN), OPTIONAL - !> \param[in] "real(dp), optional, intent(in) :: lower" Lower bound for check of validity of data values - !> \param[in] "real(dp), optional, intent(in) :: upper" Upper bound for check of validity of data values - !> \param[in] "logical, optional, intent(in) :: nocheck" .TRUE. if check for nodata values deactivated - !> default = .FALSE. - check is done - !> \param[in] "integer(i4) optional, intent(in) :: nctimestep" timestep in netcdf file + !> \param[in] "type(period),optional, intent(in) :: target_period" Period the data are needed for + !> \param[in] "real(dp), optional, intent(in) :: lower" Lower bound for check of validity of data values + !> \param[in] "real(dp), optional, intent(in) :: upper" Upper bound for check of validity of data values + !> \param[in] "logical, optional, intent(in) :: nocheck" .TRUE. if check for nodata values deactivated + !> default = .FALSE. - check is done + !> \param[in] "integer(i4) optional, intent(in) :: nctimestep" timestep in netcdf file + - ! INTENT(INOUT), OPTIONAL ! None @@ -112,49 +111,49 @@ module mo_read_forcing_nc ! Stephan Thober Sep 2015 - added read for hourly data ! Robert Schweppe Nov 2017 - switched to mo_netcdf library and restuctured routines - subroutine read_forcing_nc(folder, nRows, nCols, periode, varName, data, mask, lower, upper, nctimestep, & - nocheck, maskout, fileName) + subroutine read_forcing_nc(folder, nRows, nCols, varName, mask, data, target_period, lower, upper, nctimestep, & + fileName, nocheck, maskout) - use mo_kind, only: i4, dp - use mo_common_variables, only: period - use mo_message, only: message - use mo_netcdf, only: NcDataset, NcVariable, NcDimension - use mo_string_utils, only: num2str - use mo_utils, only: eq, ne + use mo_kind, only : i4, dp + use mo_common_variables, only : period + use mo_message, only : message + use mo_netcdf, only : NcDataset, NcVariable + use mo_string_utils, only : num2str + use mo_utils, only : eq, ne implicit none - character(len=*), intent(in) :: folder ! folder where data are stored - integer(i4), intent(in) :: nRows ! number of rows of data fields: - integer(i4), intent(in) :: nCols ! number of columns of data fields: - type(period), intent(in) :: periode ! time period - character(len=*), intent(in) :: varName ! name of NetCDF variable - logical, dimension(:,:), intent(in) :: mask ! mask of valid data fields - real(dp), optional, intent(in) :: lower ! lower bound for data points - real(dp), optional, intent(in) :: upper ! upper bound for data points - integer(i4), optional, intent(in) :: nctimestep ! -1: daily (default); + character(len = *), intent(in) :: folder ! folder where data are stored + integer(i4), intent(in) :: nRows ! number of rows of data fields: + integer(i4), intent(in) :: nCols ! number of columns of data fields: + character(len = *), intent(in) :: varName ! name of NetCDF variable + logical, dimension(:, :), intent(in) :: mask ! mask of valid data fields + type(period), optional, intent(in) :: target_period ! time period + real(dp), optional, intent(in) :: lower ! lower bound for data points + real(dp), optional, intent(in) :: upper ! upper bound for data points + integer(i4), optional, intent(in) :: nctimestep ! -1: daily (default); ! ! -2: monthly; ! ! -3: yearly; ! ! -4: hourly; DEPRECATED!!! - character(256), optional, intent(in) :: fileName ! name of variable, defaults to fileName - logical, optional, intent(in) :: nocheck ! .TRUE. if check for nodata values deactivated + character(256), optional, intent(in) :: fileName ! name of variable, defaults to fileName + logical, optional, intent(in) :: nocheck ! .TRUE. if check for nodata values deactivated ! ! default = .FALSE. - check is done - real(dp), dimension(:,:,:), allocatable, intent(out) :: data ! data read in - logical, dimension(:,:,:), allocatable, optional, intent(out) :: maskout ! mask of data to read + real(dp), dimension(:, :, :), allocatable, intent(out) :: data ! data read in + logical, dimension(:, :, :), allocatable, optional, intent(out) :: maskout ! mask of data to read ! ! local variables - type(NcDataset) :: nc ! netcdf file - type(NcVariable) :: var, time_var! variables for data and time form netcdf + type(NcDataset) :: nc ! netcdf file + type(NcVariable) :: var, time_var! variables for data and time form netcdf integer(i4), allocatable, dimension(:) :: var_shape ! shape of NetCDF variable - integer(i4) :: time_start ! index for selecting time vector - integer(i4) :: time_cnt ! length of vector of selected time values + integer(i4) :: time_start ! index for selecting time vector + integer(i4) :: time_cnt ! length of vector of selected time values - character(256) :: fName ! name of NetCDF file - integer(i4) :: i ! loop variable - real(dp) :: nodata_value ! data nodata value - logical :: checking ! check if model domain is covered by data - integer(i4) :: inctimestep ! check if model domain is covered by data + character(256) :: fName ! name of NetCDF file + integer(i4) :: i ! loop variable + real(dp) :: nodata_value ! data nodata value + logical :: checking ! check if model domain is covered by data + integer(i4) :: inctimestep ! check if model domain is covered by data ! check optional nctimestep inctimestep = -1 @@ -180,8 +179,8 @@ subroutine read_forcing_nc(folder, nRows, nCols, periode, varName, data, mask, l ! get dimensions and check if plane is correct var_shape = var%getShape() - if ( (var_shape(1) .ne. nRows) .or. (var_shape(2) .ne. nCols) ) then - stop '***ERROR: read_forcing_nc: mHM generated x and y are not matching NetCDF dimensions' + if ((var_shape(1) .ne. nRows) .or. (var_shape(2) .ne. nCols)) then + stop '***ERROR: read_forcing_nc: mHM generated x and y are not matching NetCDF dimensions' end if ! determine no data value, use _FillValue first, fall back to missing_value @@ -196,54 +195,54 @@ subroutine read_forcing_nc(folder, nRows, nCols, periode, varName, data, mask, l ! get time variable time_var = nc%getVariable('time') ! read the time vector and get start index and count of selection - call get_time_vector_and_select(time_var, fname, inctimestep, periode, time_start, time_cnt) + call get_time_vector_and_select(time_var, fname, inctimestep, time_start, time_cnt, target_period) ! extract data and select time slice - call var%getData(data, start=(/1,1,time_start/), cnt=(/nRows,nCols,time_cnt/)) + call var%getData(data, start = (/1, 1, time_start/), cnt = (/nRows, nCols, time_cnt/)) ! save output mask if optional maskout is given if (present(maskout)) then - allocate(maskout(var_shape(1), var_shape(2), var_shape(3))) - maskout = ne(data(:,:,:), nodata_value) + allocate(maskout(var_shape(1), var_shape(2), var_shape(3))) + maskout = ne(data(:, :, :), nodata_value) end if ! start checking values - do i = 1, size(data, dim=3) - ! neglect checking for nodata values if optional nocheck is given - if (checking) then - if (any(eq(data(:,:,i),nodata_value) .and. (mask))) then - call message('***ERROR: read_forcing_nc: nodata value within basin ') - call message(' boundary in variable: ', trim(varName)) - call message(' at timestep : ', trim(num2str(i))) - stop - end if - end if - ! optional check - if (present(lower)) then - if ( any( (data(:,:,i) .lt. lower) .AND. mask(:,:) ) ) then - call message('***ERROR: read_forcing_nc: values in variable "', & - trim(varName), & - '" are lower than ', trim(num2str(lower,'(F7.2)')) ) - call message(' at timestep : ', trim(num2str(i))) - call message('File: ', trim(fName)) - call message('Minval at timestep: ', trim(num2str(minval(data(:,:,i))))) - call message('Total minval: ', trim(num2str(minval(data(:,:,:))))) - stop - end if - end if - - if (present(upper)) then - if ( any( (data(:,:,i) .gt. upper) .AND. mask(:,:) ) ) then - call message('***ERROR: read_forcing_nc: values in variable "', & - trim(varName), & - '" are greater than ', trim(num2str(upper,'(F7.2)')) ) - call message(' at timestep : ', trim(num2str(i))) - call message('File: ', trim(fName)) - call message('Maxval at timestep: ', trim(num2str(maxval(data(:,:,i))))) - call message('Total maxval: ', trim(num2str(maxval(data(:,:,:))))) - print*, data(:,:,i) - stop - end if - end if + do i = 1, size(data, dim = 3) + ! neglect checking for nodata values if optional nocheck is given + if (checking) then + if (any(eq(data(:, :, i), nodata_value) .and. (mask))) then + call message('***ERROR: read_forcing_nc: nodata value within basin ') + call message(' boundary in variable: ', trim(varName)) + call message(' at timestep : ', trim(num2str(i))) + stop + end if + end if + ! optional check + if (present(lower)) then + if (any((data(:, :, i) .lt. lower) .AND. mask(:, :))) then + call message('***ERROR: read_forcing_nc: values in variable "', & + trim(varName), & + '" are lower than ', trim(num2str(lower, '(F7.2)'))) + call message(' at timestep : ', trim(num2str(i))) + call message('File: ', trim(fName)) + call message('Minval at timestep: ', trim(num2str(minval(data(:, :, i))))) + call message('Total minval: ', trim(num2str(minval(data(:, :, :))))) + stop + end if + end if + + if (present(upper)) then + if (any((data(:, :, i) .gt. upper) .AND. mask(:, :))) then + call message('***ERROR: read_forcing_nc: values in variable "', & + trim(varName), & + '" are greater than ', trim(num2str(upper, '(F7.2)'))) + call message(' at timestep : ', trim(num2str(i))) + call message('File: ', trim(fName)) + call message('Maxval at timestep: ', trim(num2str(maxval(data(:, :, i))))) + call message('Total maxval: ', trim(num2str(maxval(data(:, :, :))))) + print*, data(:, :, i) + stop + end if + end if end do @@ -286,7 +285,7 @@ end subroutine read_forcing_nc !> \param[in] "real(dp), optional, intent(in) :: upper" Upper bound for check of validity of data values !> \param[in] "logical, optional, intent(in) :: nocheck" .TRUE. if check for nodata values deactivated !> default = .FALSE. - check is done - + ! INTENT(INOUT), OPTIONAL ! None @@ -310,45 +309,45 @@ end subroutine read_forcing_nc !> \date Jan 2017 ! modified Robert Schweppe Nov 2017 - switched to mo_netcdf library and restuctured routine - + subroutine read_weights_nc(folder, nRows, nCols, varName, data, mask, lower, upper, nocheck, maskout, fileName) - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_netcdf, only: NcDataset, NcVariable + use mo_kind, only : i4, dp + use mo_message, only : message + use mo_netcdf, only : NcDataset, NcVariable - use mo_string_utils, only: num2str - use mo_utils, only: eq, ne + use mo_string_utils, only : num2str + use mo_utils, only : eq, ne implicit none - character(len=*), intent(in) :: folder ! folder where data are stored - integer(i4), intent(in) :: nRows ! number of rows of data fields: + character(len = *), intent(in) :: folder ! folder where data are stored + integer(i4), intent(in) :: nRows ! number of rows of data fields: ! LONGITUDE dimension - integer(i4), intent(in) :: nCols ! number of columns of data fields: + integer(i4), intent(in) :: nCols ! number of columns of data fields: ! LATITUDE dimension - character(len=*), intent(in) :: varName ! name of NetCDF variable - logical, dimension(:,:), intent(in) :: mask ! mask of valid data fields - real(dp), optional, intent(in) :: lower ! lower bound for data points - real(dp), optional, intent(in) :: upper ! upper bound for data points - logical, optional, intent(in) :: nocheck ! .TRUE. if check for nodata values deactivated + character(len = *), intent(in) :: varName ! name of NetCDF variable + logical, dimension(:, :), intent(in) :: mask ! mask of valid data fields + real(dp), optional, intent(in) :: lower ! lower bound for data points + real(dp), optional, intent(in) :: upper ! upper bound for data points + logical, optional, intent(in) :: nocheck ! .TRUE. if check for nodata values deactivated ! ! default = .FALSE. - check is done - character(256), optional, intent(in) :: fileName! name of variable, defaults to fileName - real(dp), dimension(:,:,:,:), allocatable, intent(out) :: data ! data read in + character(256), optional, intent(in) :: fileName! name of variable, defaults to fileName + real(dp), dimension(:, :, :, :), allocatable, intent(out) :: data ! data read in ! ! dim 1 = rows ! ! dim 2 = cols ! ! dim 3 = months ! ! dim 4 = hours - logical, dimension(:,:,:,:), allocatable, optional, intent(out) :: maskout ! mask of data to read + logical, dimension(:, :, :, :), allocatable, optional, intent(out) :: maskout ! mask of data to read ! local variables - character(256) :: fName ! name of NetCDF file - integer(i4) :: i ! loop variable - integer(i4) :: j ! loop variable - real(dp) :: nodata_value ! data nodata value - logical :: checking ! check if model domain is covered by data - type(NcDataset) :: nc ! container for Netcdf data - type(NcVariable) :: var ! container for Netcdf variable + character(256) :: fName ! name of NetCDF file + integer(i4) :: i ! loop variable + integer(i4) :: j ! loop variable + real(dp) :: nodata_value ! data nodata value + logical :: checking ! check if model domain is covered by data + type(NcDataset) :: nc ! container for Netcdf data + type(NcVariable) :: var ! container for Netcdf variable integer(i4), allocatable, dimension(:) :: var_shape ! shape of NetCDF variable checking = .TRUE. @@ -366,8 +365,8 @@ subroutine read_weights_nc(folder, nRows, nCols, varName, data, mask, lower, upp ! get dimensions var_shape = var%getShape() - if ( (var_shape(1) .ne. nRows) .or. (var_shape(2) .ne. nCols) ) then - stop '***ERROR: read_forcing_nc: mHM generated x and y are not matching NetCDF dimensions' + if ((var_shape(1) .ne. nRows) .or. (var_shape(2) .ne. nCols)) then + stop '***ERROR: read_forcing_nc: mHM generated x and y are not matching NetCDF dimensions' end if ! determine no data value @@ -378,50 +377,50 @@ subroutine read_weights_nc(folder, nRows, nCols, varName, data, mask, lower, upp ! save output mask if optional maskout is given if (present(maskout)) then - allocate(maskout(var_shape(1), var_shape(2), var_shape(3), var_shape(4))) - maskout = ne(data(:,:,:,:),nodata_value) + allocate(maskout(var_shape(1), var_shape(2), var_shape(3), var_shape(4))) + maskout = ne(data(:, :, :, :), nodata_value) end if - + ! start checking values do i = 1, var_shape(3) - do j = 1, var_shape(4) - ! neglect checking for naodata values if optional nocheck is given - if (checking) then - if (any(eq(data(:,:,i,j),nodata_value) .and. (mask))) then - call message('***ERROR: read_forcing_nc: nodata value within basin ') - call message(' boundary in variable: ', trim(varName)) - call message(' at hour : ', trim(num2str(i))) - stop - end if + do j = 1, var_shape(4) + ! neglect checking for naodata values if optional nocheck is given + if (checking) then + if (any(eq(data(:, :, i, j), nodata_value) .and. (mask))) then + call message('***ERROR: read_forcing_nc: nodata value within basin ') + call message(' boundary in variable: ', trim(varName)) + call message(' at hour : ', trim(num2str(i))) + stop end if - ! optional check - if (present(lower)) then - if ( any( (data(:,:,i,j) .lt. lower) .AND. mask(:,:) ) ) then - call message('***ERROR: read_forcing_nc: values in variable "', & - trim(varName), & - '" are lower than ', trim(num2str(lower,'(F7.2)')) ) - call message(' at hour : ', trim(num2str(i))) - call message('File: ', trim(fName)) - call message('Minval at hour: ', trim(num2str(minval(data(:,:,i,j)),'(F7.2)'))) - call message('Total minval: ', trim(num2str(minval(data(:,:,:,:)),'(F7.2)'))) - stop - end if + end if + ! optional check + if (present(lower)) then + if (any((data(:, :, i, j) .lt. lower) .AND. mask(:, :))) then + call message('***ERROR: read_forcing_nc: values in variable "', & + trim(varName), & + '" are lower than ', trim(num2str(lower, '(F7.2)'))) + call message(' at hour : ', trim(num2str(i))) + call message('File: ', trim(fName)) + call message('Minval at hour: ', trim(num2str(minval(data(:, :, i, j)), '(F7.2)'))) + call message('Total minval: ', trim(num2str(minval(data(:, :, :, :)), '(F7.2)'))) + stop end if - - if (present(upper)) then - if ( any( (data(:,:,i,j) .gt. upper) .AND. mask(:,:) ) ) then - call message('***ERROR: read_forcing_nc: values in variable "', & - trim(varName), & - '" are greater than ', trim(num2str(upper,'(F7.2)')) ) - call message(' at hour : ', trim(num2str(i))) - call message('File: ', trim(fName)) - call message('Maxval at hour: ', trim(num2str(maxval(data(:,:,i,j)),'(F7.2)'))) - call message('Total maxval: ', trim(num2str(maxval(data(:,:,:,:)),'(F7.2)'))) - stop - end if + end if + + if (present(upper)) then + if (any((data(:, :, i, j) .gt. upper) .AND. mask(:, :))) then + call message('***ERROR: read_forcing_nc: values in variable "', & + trim(varName), & + '" are greater than ', trim(num2str(upper, '(F7.2)'))) + call message(' at hour : ', trim(num2str(i))) + call message('File: ', trim(fName)) + call message('Maxval at hour: ', trim(num2str(maxval(data(:, :, i, j)), '(F7.2)'))) + call message('Total maxval: ', trim(num2str(maxval(data(:, :, :, :)), '(F7.2)'))) + stop end if - - end do + end if + + end do end do end subroutine read_weights_nc @@ -445,41 +444,41 @@ end subroutine read_weights_nc ! Robert Schweppe Nov 2017 - restructured routine, reads vector now ! Maren Kaluza May 2018 - fixed bug in time reading - - subroutine get_time_vector_and_select(var, fname, inctimestep, periode, time_start, time_cnt) + subroutine get_time_vector_and_select(var, fname, inctimestep, time_start, time_cnt, target_period) ! - use mo_kind, only: i4, i8, dp - use mo_julian, only: julday, caldat, dec2date - use mo_message, only: message - use mo_netcdf, only: NcVariable - use mo_string_utils, only: DIVIDE_STRING - use mo_common_variables, only: period - use mo_constants, only: DaySecs, DayHours, YearDays + use mo_kind, only : i4, i8, dp + use mo_julian, only : julday, caldat, dec2date + use mo_message, only : message + use mo_netcdf, only : NcVariable + use mo_string_utils, only : DIVIDE_STRING + use mo_common_variables, only : period + use mo_constants, only : DaySecs, DayHours, YearDays ! implicit none ! intent(in) - type(NcVariable), intent(in) :: var ! variable of interest - character(256), intent(in) :: fname ! fname of ncfile for error message - integer(i4), intent(in) :: inctimestep ! flag for requested time step - type(period), intent(in) :: periode ! reference period + type(NcVariable), intent(in) :: var ! variable of interest + character(256), intent(in) :: fname ! fname of ncfile for error message + integer(i4), intent(in) :: inctimestep ! flag for requested time step ! intent(out) - integer(i4), intent(out) :: time_start ! time_start index of time selection - integer(i4), intent(out) :: time_cnt ! time_count of indexes of time selection + integer(i4), intent(out) :: time_start ! time_start index of time selection + integer(i4), intent(out) :: time_cnt ! time_count of indexes of time selection + ! intent(in) optional + type(period), intent(in), optional :: target_period ! reference period ! local - integer(i4) :: yRef, dRef, mRef, hRef, jRef ! reference time of NetCDF - character(256) :: AttValues ! netcdf attribute values + integer(i4) :: yRef, dRef, mRef, hRef, jRef ! reference time of NetCDF + character(256) :: AttValues ! netcdf attribute values character(256), dimension(:), allocatable :: strArr, date, time ! dummies for netcdf attribute handling - integer(i8) :: time_step_seconds ! native time step converter in ncfile - integer(i8), allocatable, dimension(:) :: time_data ! time vector - type(period) :: nc_period ! period of ncfile + integer(i8) :: time_step_seconds ! native time step converter in ncfile + integer(i8), allocatable, dimension(:) :: time_data ! time vector + type(period) :: nc_period, clip_period ! period of ncfile, for clipping ! time helpers - integer(i4) :: ncJulSta1, dd, n_time - integer(i4) :: mmcalstart, mmcalend, yycalstart, yycalend - integer(i4) :: mmncstart, yyncstart - integer(i4) :: hstart_int, hend_int ! helper variable for error output - character(256) :: error_msg ! helper variable for error output + integer(i4) :: ncJulSta1, dd, n_time + integer(i4) :: mmcalstart, mmcalend, yycalstart, yycalend + integer(i4) :: mmncstart, yyncstart + integer(i4) :: hstart_int, hend_int ! helper variable for error output + character(256) :: error_msg ! helper variable for error output call var%getAttribute('units', AttValues) ! AttValues looks like " since YYYY-MM-DD[ HH:MM:SS]" @@ -488,22 +487,22 @@ subroutine get_time_vector_and_select(var, fname, inctimestep, periode, time_sta ! determine reference time at '-' and convert to integer call DIVIDE_STRING(trim(strArr(3)), '-', date) - read(date(1),*) yRef - read(date(2),*) mRef - read(date(3),*) dRef + read(date(1), *) yRef + read(date(2), *) mRef + read(date(3), *) dRef - jRef = julday(dd=dRef, mm=mRef, yy=yRef) + jRef = julday(dd = dRef, mm = mRef, yy = yRef) ! if existing also read in the time (only hour so far) hRef = 0 - if( size(strArr) .gt. 3 ) then + if(size(strArr) .gt. 3) then call DIVIDE_STRING(trim(strArr(4)), ':', time) - read(time(1),*) hRef + read(time(1), *) hRef end if ! determine the step_size if (strArr(1) .EQ. 'days') then - time_step_seconds = int(DaySecs) + time_step_seconds = int(DaySecs) else if (strArr(1) .eq. 'hours') then time_step_seconds = int(DaySecs / DayHours) else if (strArr(1) .eq. 'minutes') then @@ -511,9 +510,9 @@ subroutine get_time_vector_and_select(var, fname, inctimestep, periode, time_sta else if (strArr(1) .eq. 'seconds') then time_step_seconds = 1_i8 else - call message('***ERROR: Please provide the input data in (days, hours, minutes, seconds) ', & - 'since YYYY-MM-DD[ HH:MM:SS] in the netcdf file. Found: ', trim(AttValues)) - stop + call message('***ERROR: Please provide the input data in (days, hours, minutes, seconds) ', & + 'since YYYY-MM-DD[ HH:MM:SS] in the netcdf file. Found: ', trim(AttValues)) + stop end if ! get the time vector @@ -523,13 +522,13 @@ subroutine get_time_vector_and_select(var, fname, inctimestep, periode, time_sta ! check for length of time vector, needs to be at least of length 2, otherwise step width check fails if (size(time_data) .le. 1) then - call message('***ERROR: length of time dimension needs to be at least 2 in file: '//trim(fname)) + call message('***ERROR: length of time dimension needs to be at least 2 in file: ' // trim(fname)) stop end if ! check for equal timesteps and timestep must not be multiple of native timestep - error_msg = '***ERROR: time_steps are not equal over all times in file and/or do not conform to'// & - ' requested timestep in file ('//trim(fname)//') : ' + error_msg = '***ERROR: time_steps are not equal over all times in file and/or do not conform to' // & + ' requested timestep in file (' // trim(fname) // ') : ' ! compare the read period from ncfile to the period required ! convert julian second information back to date via conversion to float @@ -537,73 +536,80 @@ subroutine get_time_vector_and_select(var, fname, inctimestep, periode, time_sta n_time = size(time_data) call dec2date(time_data(1) / DaySecs - 0.5_dp + jRef + hRef / 24._dp, nc_period%dStart, nc_period%mStart, & nc_period%yStart, hstart_int) - nc_period%julStart=int(time_data(1) / DaySecs + jRef + hRef / 24._dp) - call dec2date(time_data(n_time) / DaySecs - 0.5_dp + jRef + hRef / 24._dp, nc_period%dEnd, nc_period%mEnd, & + nc_period%julStart = int(time_data(1) / DaySecs + jRef + hRef / 24._dp) + call dec2date(time_data(n_time) / DaySecs - 0.5_dp + jRef + hRef / 24._dp, nc_period%dEnd, nc_period%mEnd, & nc_period%yEnd, hend_int) - nc_period%julEnd=int(time_data(n_time) / DaySecs + jRef + hRef / 24._dp) + nc_period%julEnd = int(time_data(n_time) / DaySecs + jRef + hRef / 24._dp) + + ! if no target period is present, use the whole time period + if (present(target_period)) then + clip_period = target_period + else + clip_period = nc_period + end if ! prepare the selection and check for required time_step select case(inctimestep) case(-1) ! daily ! difference must be 1 day - if (.not. all(abs((time_data(2:n_time) - time_data(1:n_time-1)) / DaySecs - 1._dp) .lt. 1.e-6 )) then - call message(error_msg//trim('daily')) + if (.not. all(abs((time_data(2 : n_time) - time_data(1 : n_time - 1)) / DaySecs - 1._dp) .lt. 1.e-6)) then + call message(error_msg // trim('daily')) stop end if ncJulSta1 = nc_period%julStart - time_start = periode%julStart-ncJulSta1 + 1_i4 - time_cnt = periode%julEnd - periode%julStart + 1_i4 + time_start = clip_period%julStart - ncJulSta1 + 1_i4 + time_cnt = clip_period%julEnd - clip_period%julStart + 1_i4 case(-2) ! monthly ! difference must be between 28 and 31 days - if ( any(abs((time_data(2:n_time) - time_data(1:n_time-1)) / DaySecs) .gt. 31._dp) .or. & - any(abs((time_data(2:n_time) - time_data(1:n_time-1)) / DaySecs) .lt. 28._dp)) then - call message(error_msg//trim('monthly')) + if (any(abs((time_data(2 : n_time) - time_data(1 : n_time - 1)) / DaySecs) .gt. 31._dp) .or. & + any(abs((time_data(2 : n_time) - time_data(1 : n_time - 1)) / DaySecs) .lt. 28._dp)) then + call message(error_msg // trim('monthly')) stop end if - call caldat(periode%julStart, dd, mmcalstart, yycalstart) + call caldat(clip_period%julStart, dd, mmcalstart, yycalstart) call caldat(nc_period%julStart, dd, mmncstart, yyncstart) ! monthly timesteps are usually set by month end, so for beginning, we need 1st of month ncJulSta1 = julday(1, mmncstart, yyncstart) - call caldat(periode%julEnd, dd, mmcalend, yycalend) - time_start = (yycalstart*12+mmcalstart) - (yyncstart*12+mmncstart) + 1_i4 - time_cnt = (yycalend*12+mmcalend) - (yycalstart*12+mmcalstart) + 1_i4 + call caldat(clip_period%julEnd, dd, mmcalend, yycalend) + time_start = (yycalstart * 12 + mmcalstart) - (yyncstart * 12 + mmncstart) + 1_i4 + time_cnt = (yycalend * 12 + mmcalend) - (yycalstart * 12 + mmcalstart) + 1_i4 case(-3) ! yearly ! difference must be between 365 and 366 days - if ( any(abs((time_data(2:n_time) - time_data(1:n_time-1)) / DaySecs) .gt. (YearDays + 1._dp)) .or. & - any(abs((time_data(2:n_time) - time_data(1:n_time-1)) / DaySecs) .lt. YearDays)) then - call message(error_msg//'yearly') + if (any(abs((time_data(2 : n_time) - time_data(1 : n_time - 1)) / DaySecs) .gt. (YearDays + 1._dp)) .or. & + any(abs((time_data(2 : n_time) - time_data(1 : n_time - 1)) / DaySecs) .lt. YearDays)) then + call message(error_msg // 'yearly') stop end if - call caldat(periode%julStart, dd, mmcalstart, yycalstart) + call caldat(clip_period%julStart, dd, mmcalstart, yycalstart) call caldat(nc_period%julStart, dd, mmncstart, yyncstart) ! yearly timesteps are usually set by year end, so for beginning, we need 1st of year ncJulSta1 = julday(1, 1, yyncstart) - call caldat(periode%julEnd, dd, mmcalend, yycalend) + call caldat(clip_period%julEnd, dd, mmcalend, yycalend) time_start = yycalstart - yyncstart + 1_i4 time_cnt = yycalend - yycalstart + 1_i4 case(-4) ! hourly ! difference must be 1 hour - if (.not. all(abs((time_data(2:n_time) - time_data(1:n_time-1) ) / 3600._dp - 1._dp) .lt. 1.e-6 )) then - call message(error_msg//'hourly') + if (.not. all(abs((time_data(2 : n_time) - time_data(1 : n_time - 1)) / 3600._dp - 1._dp) .lt. 1.e-6)) then + call message(error_msg // 'hourly') stop end if ncJulSta1 = nc_period%julStart - time_start = (periode%julStart-ncJulSta1) * 24_i4 + 1_i4 ! convert to hours; always starts at one - time_cnt = (periode%julEnd - periode%julStart + 1_i4) * 24_i4 ! convert to hours + time_start = (clip_period%julStart - ncJulSta1) * 24_i4 + 1_i4 ! convert to hours; always starts at one + time_cnt = (clip_period%julEnd - clip_period%julStart + 1_i4) * 24_i4 ! convert to hours case default ! no output at all - call message('***ERROR: read_forcing_nc: unknown nctimestep switch.') - stop + call message('***ERROR: read_forcing_nc: unknown nctimestep switch.') + stop end select ! Check if time steps in file cover simulation period - if (.not. ((ncJulSta1 .LE. periode%julStart) .AND. (nc_period%julEnd .GE. periode%julEnd))) then - call message('***ERROR: read_forcing_nc: time period of input data: ', trim(fname), & - ' is not matching modelling period.') - stop + if (.not. ((ncJulSta1 .LE. clip_period%julStart) .AND. (nc_period%julEnd .GE. clip_period%julEnd))) then + call message('***ERROR: read_forcing_nc: time period of input data: ', trim(fname), & + ' is not matching modelling period.') + stop end if - end subroutine get_time_vector_and_select + end subroutine get_time_vector_and_select end module mo_read_forcing_nc diff --git a/src/common/mo_read_latlon.f90 b/src/common/mo_read_latlon.f90 new file mode 100644 index 00000000..4e5757b4 --- /dev/null +++ b/src/common/mo_read_latlon.f90 @@ -0,0 +1,144 @@ +!> \file mo_read_latlon.f90 + +!> \brief reading latitude and longitude coordinates for each basin + +!> \authors Stephan Thober +!> \date Nov 2013 + +MODULE mo_read_latlon + + ! This module provides routines for reading latitude and longitude coordinates + ! from file. + + ! Written Stephan Thober, Nov 2013 + + USE mo_kind, ONLY : i4, dp + + ! Of course + IMPLICIT NONE + + PUBLIC :: read_latlon + + PRIVATE + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! read_latlon + + ! PURPOSE + !> \brief reads latitude and longitude coordinates + + !> \details reads latitude and longitude coordinates from + !> netcdf file for each basin and appends it to the global + !> variables latitude and longitude. + + ! CALLING SEQUENCE + ! call read_latlon(ii) + + ! INTENT(IN) + !> \param[in] "integer(i4) :: ii" basin index + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + !> File name of the basins must be xxx_latlon.nc, where + !> xxx is the basin id. Variable names in the netcdf file + !> have to be 'lat' for latitude and 'lon' for longitude. + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Stephan Thober + !> \date Nov 2013 + ! modified, Stephan Thober, Sep 2015 - added latitude and longitude for level 0 + ! Stephan Thober, Oct 2015 - added L1_rect_latitude and L1_rect_longitude + ! David Schaefer, May 2016 - removed ncread dependency + ! Robert Schweppe, Mar 2018 - major rewrite + + subroutine read_latlon(ii, lon_var_name, lat_var_name, level_name, level) + + use mo_common_variables, only : fileLatLon, Grid + USE mo_message, ONLY : message + use mo_netcdf, only : NcDataset, NcVariable + use mo_string_utils, only : num2str + + implicit none + + integer(i4), intent(in) :: ii ! basin index + character(*), intent(in) :: lon_var_name + character(*), intent(in) :: lat_var_name + character(*), intent(in) :: level_name + type(Grid), intent(inout) :: level + + ! local variables + character(256) :: fname ! file name + real(dp), dimension(:, :), allocatable :: dummy ! dummy variable + type(NcDataset) :: nc + type(NcVariable) :: var + + ! construct filename + fname = trim(fileLatLon(ii)) + + nc = NcDataset(fname, "r") + + ! ------------------------------------------------------------------------- + ! READ LEVEL LATITUDE / LONGITUDE + ! ------------------------------------------------------------------------- + var = nc%getVariable(trim(lat_var_name)) + call var%getData(dummy) + ! consistency check + if ((size(dummy, dim = 1) .NE. level%nrows) .or. & + (size(dummy, dim = 2) .NE. level%ncols)) then + call message(' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file for ', trim(level_name), & + ' in basin ', trim(adjustl(num2str(ii))), '!') + call message(' Latitude expected to have following dimensions ... rows:', & + trim(adjustl(num2str(level%nrows))), ', cols:', trim(adjustl(num2str(level%ncols)))) + call message(' Latitude provided ... rows:', & + trim(adjustl(num2str(size(dummy, dim = 1)))), ', cols:', trim(adjustl(num2str(size(dummy, dim = 2))))) + stop 1 + end if + level%y = dummy + + var = nc%getVariable(trim(lon_var_name)) + call var%getData(dummy) + ! consistency check + if ((size(dummy, dim = 1) .NE. level%nrows) .or. & + (size(dummy, dim = 2) .NE. level%ncols)) then + call message(' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file for ', trim(level_name), & + ' in basin ', trim(adjustl(num2str(ii))), '!') + call message(' Longitude expected to have following dimensions ... rows:', & + trim(adjustl(num2str(level%nrows))), ', cols:', trim(adjustl(num2str(level%ncols)))) + call message(' Longitude provided ... rows:', & + trim(adjustl(num2str(size(dummy, dim = 1)))), ', cols:', trim(adjustl(num2str(size(dummy, dim = 2))))) + stop 1 + end if + level%x = dummy + + call nc%close() + + end subroutine read_latlon + +END MODULE mo_read_latlon diff --git a/src/common/mo_read_spatial_data.f90 b/src/common/mo_read_spatial_data.f90 index 411fd80e..d3462c3b 100644 --- a/src/common/mo_read_spatial_data.f90 +++ b/src/common/mo_read_spatial_data.f90 @@ -17,7 +17,7 @@ MODULE mo_read_spatial_data ! Written Juliane Mai, Jan 2013 ! Modified - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE @@ -106,7 +106,7 @@ MODULE mo_read_spatial_data ! Modified, David Schaefer, Mar 2015, removed double allocation of temporary data INTERFACE read_spatial_data_ascii - MODULE PROCEDURE read_spatial_data_ascii_i4, read_spatial_data_ascii_dp + MODULE PROCEDURE read_spatial_data_ascii_i4, read_spatial_data_ascii_dp END INTERFACE read_spatial_data_ascii ! ------------------------------------------------------------------ @@ -120,76 +120,76 @@ MODULE mo_read_spatial_data ! ------------------------------------------------------------------ subroutine read_spatial_data_ascii_dp(filename, fileunit, & - header_ncols, header_nrows, & - header_xllcorner, header_yllcorner, & - header_cellsize, & - data, mask) + header_ncols, header_nrows, & + header_xllcorner, header_yllcorner, & + header_cellsize, & + data, mask) implicit none - character(len=*), intent(in) :: filename ! filename with location - integer(i4), intent(in) :: fileunit ! unit for opening the file - integer(i4), intent(in) :: header_nRows ! number of rows of data fields: - ! LONGITUDE dimension - integer(i4), intent(in) :: header_nCols ! number of columns of data fields: - ! LATITUDE dimension - real(dp), intent(in) :: header_xllcorner ! header read in lower left corner - real(dp), intent(in) :: header_yllcorner ! header read in lower left corner - real(dp), intent(in) :: header_cellsize ! header read in cellsize - real(dp), dimension(:,:), allocatable, intent(out) :: data ! data - logical, dimension(:,:), allocatable, intent(out) :: mask ! mask + character(len = *), intent(in) :: filename ! filename with location + integer(i4), intent(in) :: fileunit ! unit for opening the file + integer(i4), intent(in) :: header_nRows ! number of rows of data fields: + ! LONGITUDE dimension + integer(i4), intent(in) :: header_nCols ! number of columns of data fields: + ! LATITUDE dimension + real(dp), intent(in) :: header_xllcorner ! header read in lower left corner + real(dp), intent(in) :: header_yllcorner ! header read in lower left corner + real(dp), intent(in) :: header_cellsize ! header read in cellsize + real(dp), dimension(:, :), allocatable, intent(out) :: data ! data + logical, dimension(:, :), allocatable, intent(out) :: mask ! mask ! local variables - integer(i4) :: file_nRows ! number of rows of data fields: - ! LONGITUDE dimension - integer(i4) :: file_nCols ! number of columns of data fields: - ! LATITUDE dimension - real(dp) :: file_xllcorner ! file read in lower left corner - real(dp) :: file_yllcorner ! file read in lower left corner - real(dp) :: file_cellsize ! file read in cellsize - real(dp) :: file_nodata ! file read in nodata value - integer(i4) :: i,j - real(dp), dimension(:,:), allocatable :: tmp_data ! data - logical, dimension(:,:), allocatable :: tmp_mask ! mask + integer(i4) :: file_nRows ! number of rows of data fields: + ! LONGITUDE dimension + integer(i4) :: file_nCols ! number of columns of data fields: + ! LATITUDE dimension + real(dp) :: file_xllcorner ! file read in lower left corner + real(dp) :: file_yllcorner ! file read in lower left corner + real(dp) :: file_cellsize ! file read in cellsize + real(dp) :: file_nodata ! file read in nodata value + integer(i4) :: i, j + real(dp), dimension(:, :), allocatable :: tmp_data ! data + logical, dimension(:, :), allocatable :: tmp_mask ! mask ! compare headers always with reference header (intent in) call read_header_ascii(filename, fileunit, & - file_ncols, file_nrows, & - file_xllcorner, file_yllcorner, file_cellsize, file_nodata) - if ( (file_ncols .ne. header_ncols) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: ncols' - if ( (file_nrows .ne. header_nrows) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: nrows' - if ( (abs(file_xllcorner - header_xllcorner) .gt. tiny(1.0_dp)) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: xllcorner' - if ( (abs(file_yllcorner - header_yllcorner) .gt. tiny(1.0_dp)) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: yllcorner' - if ( (abs(file_cellsize - header_cellsize) .gt. tiny(1.0_dp)) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: cellsize' + file_ncols, file_nrows, & + file_xllcorner, file_yllcorner, file_cellsize, file_nodata) + if ((file_ncols .ne. header_ncols)) & + stop 'read_spatial_data_ascii: header not matching with reference header: ncols' + if ((file_nrows .ne. header_nrows)) & + stop 'read_spatial_data_ascii: header not matching with reference header: nrows' + if ((abs(file_xllcorner - header_xllcorner) .gt. tiny(1.0_dp))) & + stop 'read_spatial_data_ascii: header not matching with reference header: xllcorner' + if ((abs(file_yllcorner - header_yllcorner) .gt. tiny(1.0_dp))) & + stop 'read_spatial_data_ascii: header not matching with reference header: yllcorner' + if ((abs(file_cellsize - header_cellsize) .gt. tiny(1.0_dp))) & + stop 'read_spatial_data_ascii: header not matching with reference header: cellsize' ! allocation and initialization of matrices allocate(tmp_data(file_nrows, file_ncols)) tmp_data = file_nodata allocate(tmp_mask(file_nrows, file_ncols)) tmp_mask = .true. - + ! read in ! recl is only a rough estimate on bytes per line in the ascii ! default for nag: recl=1024(byte) which is not enough for 100s of columns - open (unit=fileunit, file=filename, action='read', status='old',recl=48*file_ncols) + open (unit = fileunit, file = filename, action = 'read', status = 'old', recl = 48 * file_ncols) ! (a) skip header do i = 1, 6 - read(fileunit, *) + read(fileunit, *) end do ! (b) read data do i = 1, file_nrows - read(fileunit, *) (tmp_data(i,j), j=1,file_ncols) + read(fileunit, *) (tmp_data(i, j), j = 1, file_ncols) end do close(fileunit) ! set mask .false. if nodata value appeared - where ( abs(tmp_data-file_nodata) .lt. tiny(1.0_dp) ) - tmp_mask = .false. + where (abs(tmp_data - file_nodata) .lt. tiny(1.0_dp)) + tmp_mask = .false. end where ! transpose of data due to longitude-latitude ordering @@ -204,76 +204,76 @@ subroutine read_spatial_data_ascii_dp(filename, fileunit, & end subroutine read_spatial_data_ascii_dp subroutine read_spatial_data_ascii_i4(filename, fileunit, & - header_ncols, header_nrows, & - header_xllcorner, header_yllcorner, & - header_cellsize, & - data, mask) + header_ncols, header_nrows, & + header_xllcorner, header_yllcorner, & + header_cellsize, & + data, mask) implicit none - character(len=*), intent(in) :: filename ! filename with location - integer(i4), intent(in) :: fileunit ! unit for opening the file - integer(i4), intent(in) :: header_nRows ! number of rows of data fields: - ! LONGITUDE dimension - integer(i4), intent(in) :: header_nCols ! number of columns of data fields: - ! LATITUDE dimension - real(dp), intent(in) :: header_xllcorner ! header read in lower left corner - real(dp), intent(in) :: header_yllcorner ! header read in lower left corner - real(dp), intent(in) :: header_cellsize ! header read in cellsize - integer(i4),dimension(:,:), allocatable, intent(out) :: data ! data - logical, dimension(:,:), allocatable, intent(out) :: mask ! mask + character(len = *), intent(in) :: filename ! filename with location + integer(i4), intent(in) :: fileunit ! unit for opening the file + integer(i4), intent(in) :: header_nRows ! number of rows of data fields: + ! LONGITUDE dimension + integer(i4), intent(in) :: header_nCols ! number of columns of data fields: + ! LATITUDE dimension + real(dp), intent(in) :: header_xllcorner ! header read in lower left corner + real(dp), intent(in) :: header_yllcorner ! header read in lower left corner + real(dp), intent(in) :: header_cellsize ! header read in cellsize + integer(i4), dimension(:, :), allocatable, intent(out) :: data ! data + logical, dimension(:, :), allocatable, intent(out) :: mask ! mask ! local variables - integer(i4) :: file_nRows ! number of rows of data fields: - ! LONGITUDE dimension - integer(i4) :: file_nCols ! number of columns of data fields: - ! LATITUDE dimension - real(dp) :: file_xllcorner ! file read in lower left corner - real(dp) :: file_yllcorner ! file read in lower left corner - real(dp) :: file_cellsize ! file read in cellsize - real(dp) :: file_nodata ! file read in nodata value - integer(i4) :: i,j - integer(i4),dimension(:,:), allocatable :: tmp_data ! data - logical, dimension(:,:), allocatable :: tmp_mask ! mask + integer(i4) :: file_nRows ! number of rows of data fields: + ! LONGITUDE dimension + integer(i4) :: file_nCols ! number of columns of data fields: + ! LATITUDE dimension + real(dp) :: file_xllcorner ! file read in lower left corner + real(dp) :: file_yllcorner ! file read in lower left corner + real(dp) :: file_cellsize ! file read in cellsize + real(dp) :: file_nodata ! file read in nodata value + integer(i4) :: i, j + integer(i4), dimension(:, :), allocatable :: tmp_data ! data + logical, dimension(:, :), allocatable :: tmp_mask ! mask ! compare headers always with reference header (intent in) call read_header_ascii(filename, fileunit, & - file_ncols, file_nrows, & - file_xllcorner, file_yllcorner, file_cellsize, file_nodata) - if ( (file_ncols .ne. header_ncols) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: ncols' - if ( (file_nrows .ne. header_nrows) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: nrows' - if ( (abs(file_xllcorner - header_xllcorner) .gt. tiny(1.0_dp)) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: xllcorner' - if ( (abs(file_yllcorner - header_yllcorner) .gt. tiny(1.0_dp)) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: yllcorner' - if ( (abs(file_cellsize - header_cellsize) .gt. tiny(1.0_dp)) ) & - stop 'read_spatial_data_ascii: header not matching with reference header: cellsize' + file_ncols, file_nrows, & + file_xllcorner, file_yllcorner, file_cellsize, file_nodata) + if ((file_ncols .ne. header_ncols)) & + stop 'read_spatial_data_ascii: header not matching with reference header: ncols' + if ((file_nrows .ne. header_nrows)) & + stop 'read_spatial_data_ascii: header not matching with reference header: nrows' + if ((abs(file_xllcorner - header_xllcorner) .gt. tiny(1.0_dp))) & + stop 'read_spatial_data_ascii: header not matching with reference header: xllcorner' + if ((abs(file_yllcorner - header_yllcorner) .gt. tiny(1.0_dp))) & + stop 'read_spatial_data_ascii: header not matching with reference header: yllcorner' + if ((abs(file_cellsize - header_cellsize) .gt. tiny(1.0_dp))) & + stop 'read_spatial_data_ascii: header not matching with reference header: cellsize' ! allocation and initialization of matrices allocate(tmp_data(file_nrows, file_ncols)) tmp_data = int(file_nodata, i4) allocate(tmp_mask(file_nrows, file_ncols)) tmp_mask = .true. - + ! read in ! recl is only a rough estimate on bytes per line in the ascii ! default for nag: recl=1024(byte) which is not enough for 100s of columns - open (unit=fileunit, file=filename, action='read', status='old',recl=48*file_ncols) + open (unit = fileunit, file = filename, action = 'read', status = 'old', recl = 48 * file_ncols) ! (a) skip header do i = 1, 6 - read(fileunit, *) + read(fileunit, *) end do ! (b) read data do i = 1, file_nrows - read(fileunit, *) (tmp_data(i,j), j=1,file_ncols) + read(fileunit, *) (tmp_data(i, j), j = 1, file_ncols) end do close(fileunit) ! set mask .false. if nodata value appeared - where ( tmp_data .EQ. int(file_nodata, i4)) - tmp_mask = .false. + where (tmp_data .EQ. int(file_nodata, i4)) + tmp_mask = .false. end where ! transpose of data due to longitude-latitude ordering @@ -342,26 +342,26 @@ end subroutine read_spatial_data_ascii_i4 !> \date Jan 2013 subroutine read_header_ascii(filename, fileunit, & - header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, header_nodata) + header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, header_nodata) implicit none - character(len=*), intent(in) :: filename ! filename with location - integer(i4), intent(in) :: fileunit ! unit for opening the file - integer(i4), intent(out) :: header_nRows ! number of rows of data fields: - ! LONGITUDE dimension - integer(i4), intent(out) :: header_nCols ! number of columns of data fields: - ! LATITUDE dimension - real(dp), intent(out) :: header_xllcorner ! header read in lower left corner - real(dp), intent(out) :: header_yllcorner ! header read in lower left corner - real(dp), intent(out) :: header_cellsize ! header read in cellsize - real(dp), intent(out) :: header_nodata ! header read in nodata value + character(len = *), intent(in) :: filename ! filename with location + integer(i4), intent(in) :: fileunit ! unit for opening the file + integer(i4), intent(out) :: header_nRows ! number of rows of data fields: + ! LONGITUDE dimension + integer(i4), intent(out) :: header_nCols ! number of columns of data fields: + ! LATITUDE dimension + real(dp), intent(out) :: header_xllcorner ! header read in lower left corner + real(dp), intent(out) :: header_yllcorner ! header read in lower left corner + real(dp), intent(out) :: header_cellsize ! header read in cellsize + real(dp), intent(out) :: header_nodata ! header read in nodata value ! local variables - character(5) :: dummy + character(5) :: dummy ! reading header from a file - open (unit=fileunit, file=filename, status='old') + open (unit = fileunit, file = filename, status = 'old') read (fileunit, *) dummy, header_nCols read (fileunit, *) dummy, header_nRows read (fileunit, *) dummy, header_xllcorner @@ -369,7 +369,7 @@ subroutine read_header_ascii(filename, fileunit, & read (fileunit, *) dummy, header_cellsize read (fileunit, *) dummy, header_nodata close(fileunit) - dummy = dummy//'' ! only to avoid warning + dummy = dummy // '' ! only to avoid warning end subroutine read_header_ascii diff --git a/src/common/mo_read_timeseries.f90 b/src/common/mo_read_timeseries.f90 index 66d2176a..0e0cf7e3 100644 --- a/src/common/mo_read_timeseries.f90 +++ b/src/common/mo_read_timeseries.f90 @@ -10,7 +10,7 @@ MODULE mo_read_timeseries - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE @@ -97,141 +97,143 @@ MODULE mo_read_timeseries subroutine read_timeseries(filename, fileunit, periodStart, periodEnd, optimize, opti_function, data, mask, nMeasPerDay) - use mo_julian, only: julday - use mo_message, only: message + use mo_julian, only : julday + use mo_message, only : message implicit none - character(len=*), intent(in) :: filename ! name of input file - integer(i4), intent(in) :: fileunit ! file unit - integer(i4), dimension(3), intent(in) :: periodStart ! format (/YYYY, MM, DD/) - integer(i4), dimension(3), intent(in) :: periodEnd ! format (/YYYY, MM, DD/) - logical, intent(in) :: optimize ! optimization on or off (.TRUE. or .FALSE.) + character(len = *), intent(in) :: filename ! name of input file + integer(i4), intent(in) :: fileunit ! file unit + integer(i4), dimension(3), intent(in) :: periodStart ! format (/YYYY, MM, DD/) + integer(i4), dimension(3), intent(in) :: periodEnd ! format (/YYYY, MM, DD/) + logical, intent(in) :: optimize ! optimization on or off (.TRUE. or .FALSE.) ! number of optimization function in mHM determining the type of data used - integer(i4), intent(in) :: opti_function - real(dp), dimension(:), allocatable, intent(out) :: data ! time series output (periodStart:periodEnd) - logical, dimension(:), allocatable, optional, intent(out) :: mask ! indicating valid data (false + integer(i4), intent(in) :: opti_function + real(dp), dimension(:), allocatable, intent(out) :: data ! time series output (periodStart:periodEnd) + logical, dimension(:), allocatable, optional, intent(out) :: mask ! indicating valid data (false ! ! at no data value points) - integer(i4), optional, intent(out) :: nMeasPerDay ! Number of data points read in + integer(i4), optional, intent(out) :: nMeasPerDay ! Number of data points read in ! ! per day, e.g. hourly = 24 ! local vaiables - real(dp) :: nodata_file ! no data value of data - integer(i4) :: timestep_file ! [h] time resolution of input data - integer(i4), dimension(3) :: periodStart_file ! starting date of timeseries data within file - integer(i4), dimension(3) :: periodEnd_file ! ending date of timeseries data within file - integer(i4), dimension(5) :: time_file ! year, month, day, hour, minute - - integer(i4) :: i, j - integer(i4) :: idx_st_period ! index to put data from file to data - integer(i4) :: idx_en_period ! index to put data from file to data - integer(i4) :: idx_st_file ! index to put data from file to data - integer(i4) :: idx_en_file ! index to put data from file to data - integer(i4) :: startJul_file ! start julian day of available data - integer(i4) :: endJul_file ! end julian day of available data - integer(i4) :: startJul_period ! start julian day of needed data - integer(i4) :: endJul_period ! end julian day of needed data - integer(i4) :: length_file ! number of days in file - integer(i4) :: length_period ! number of days in period - real(dp), dimension(:), allocatable :: data_file ! time series output (fileStart:fileEnd) + real(dp) :: nodata_file ! no data value of data + integer(i4) :: timestep_file ! [h] time resolution of input data + integer(i4), dimension(3) :: periodStart_file ! starting date of timeseries data within file + integer(i4), dimension(3) :: periodEnd_file ! ending date of timeseries data within file + integer(i4), dimension(5) :: time_file ! year, month, day, hour, minute + + integer(i4) :: i, j + integer(i4) :: idx_st_period ! index to put data from file to data + integer(i4) :: idx_en_period ! index to put data from file to data + integer(i4) :: idx_st_file ! index to put data from file to data + integer(i4) :: idx_en_file ! index to put data from file to data + integer(i4) :: startJul_file ! start julian day of available data + integer(i4) :: endJul_file ! end julian day of available data + integer(i4) :: startJul_period ! start julian day of needed data + integer(i4) :: endJul_period ! end julian day of needed data + integer(i4) :: length_file ! number of days in file + integer(i4) :: length_period ! number of days in period + real(dp), dimension(:), allocatable :: data_file ! time series output (fileStart:fileEnd) ! ! points --> 0.25 [d-1] - character(256) :: dummy ! dummy for char read in - - open(unit=fileunit, file=filename, action='read', status='old') - ! read header - read(fileunit,'(a256)') dummy - read(fileunit,*) dummy, nodata_file - read(fileunit,*) dummy, timestep_file - read(fileunit,*) dummy, (periodStart_file(i), i = 1, 3) - read(fileunit,*) dummy, (periodEnd_file(i), i = 1, 3) - dummy = dummy//'' ! only to avoid warning - if ((timestep_file .lt. 1_i4) .or. (timestep_file .gt. 1440_i4)) then - call message('***ERROR: Number of measurements per day has to be between 1 (daily) and 1440 (every minute)! ',& - trim(filename)) - stop - end if - - ! checking if period is covered by data in file - startJul_period = julday(periodStart(3), periodStart(2), periodStart(1)) - endJul_period = julday(periodEnd(3) , periodEnd(2) , periodEnd(1) ) - startJul_file = julday(periodStart_file(3), periodStart_file(2), periodStart_file(1) ) - endJul_file = julday(periodEnd_file(3), periodEnd_file(2), periodEnd_file(1) ) - - if (((startJul_period < startJul_file) .OR. (endJul_period > endJul_file )) & - .AND. optimize .and. ((opti_function .le. 9_i4) .or. (opti_function .eq. 14_i4) .or. (opti_function .eq. 31_i4))) then - ! adjust this whenever a new opti function on discharge is added to mhm! - call message('***ERROR: Simulation period is not covered by observations! ', trim(filename)) - stop - end if - - ! allocation of arrays - allocate( data ( (endJul_period - startJul_period + 1_i4) * timestep_file)) - data = nodata_file - allocate( data_file( (endJul_file - startJul_file + 1_i4) * timestep_file)) - data_file = nodata_file - - if (present(mask)) then - allocate( mask( (endJul_period - startJul_period + 1_i4) * timestep_file)) - mask = .true. - end if - - ! read data from file to temporal array - do i=1, (endJul_file - startJul_file + 1_i4) * timestep_file - ! read date and data - read(fileunit, *) (time_file(j),j=1,5), data_file(i) - end do - time_file(1) = time_file(2) + 1 ! only to avoid warning - - length_file = (endJul_file - startJul_file + 1 ) - length_period = (endJul_period - startJul_period + 1 ) - - ! |---------------------------------| FILE - ! |--------------| PERIOD - if (( startJul_period .ge. startJul_file ) .and. ( endJul_period .le. endJul_file )) then - idx_st_period = 1 - idx_en_period = length_period * timestep_file - idx_st_file = (startJul_period - startJul_file + 1 ) * timestep_file - idx_en_file = (idx_st_file + length_period - 1 ) * timestep_file - end if - - ! |--------------| FILE - ! |---------------------------------| PERIOD - if (( startJul_period .lt. startJul_file ) .and. ( endJul_period .gt. endJul_file )) then - idx_st_period = (startJul_file - startJul_period + 1 ) * timestep_file - idx_en_period = (idx_st_period + length_file - 1 ) * timestep_file - idx_st_file = 1 - idx_en_file = length_file * timestep_file - end if - - ! |--------------| FILE - ! |---------------------------------| PERIOD - if (( startJul_period .ge. startJul_file ) .and. ( endJul_period .gt. endJul_file )) then - idx_st_period = 1 - idx_en_period = ( endJul_file - startJul_period + 1 ) * timestep_file - idx_st_file = ( startJul_period - startJul_file + 1 ) * timestep_file - idx_en_file = length_file * timestep_file - end if - - ! |--------------| FILE - ! |---------------------------------| PERIOD - if (( startJul_period .lt. startJul_file ) .and. ( endJul_period .le. endJul_file )) then - idx_st_period = ( startJul_file - startJul_period + 1 ) * timestep_file - idx_en_period = ( length_period ) * timestep_file - idx_st_file = 1 - idx_en_file = ( endJul_period - startJul_file + 1 ) * timestep_file - end if - - data(idx_st_period:idx_en_period) = data_file(idx_st_file:idx_en_file) - - if (present(mask)) then - where ( abs(data-nodata_file) .lt. tiny(1.0_dp) ) - mask = .false. - end where - end if - - if (present(nMeasPerDay)) then - nMeasPerDay = timestep_file - end if + character(256) :: dummy ! dummy for char read in + + open(unit = fileunit, file = filename, action = 'read', status = 'old') + ! read header + read(fileunit, '(a256)') dummy + read(fileunit, *) dummy, nodata_file + read(fileunit, *) dummy, timestep_file + read(fileunit, *) dummy, (periodStart_file(i), i = 1, 3) + read(fileunit, *) dummy, (periodEnd_file(i), i = 1, 3) + dummy = dummy // '' ! only to avoid warning + if ((timestep_file .lt. 1_i4) .or. (timestep_file .gt. 1440_i4)) then + call message('***ERROR: Number of measurements per day has to be between 1 (daily) and 1440 (every minute)! ', & + trim(filename)) + stop + end if + + ! checking if period is covered by data in file + startJul_period = julday(periodStart(3), periodStart(2), periodStart(1)) + endJul_period = julday(periodEnd(3), periodEnd(2), periodEnd(1)) + startJul_file = julday(periodStart_file(3), periodStart_file(2), periodStart_file(1)) + endJul_file = julday(periodEnd_file(3), periodEnd_file(2), periodEnd_file(1)) + + if (((startJul_period < startJul_file) .OR. (endJul_period > endJul_file)) & + .AND. optimize .and. ((opti_function .le. 9_i4) .or. & + (opti_function .eq. 14_i4) .or. & + (opti_function .eq. 31_i4))) then + ! adjust this whenever a new opti function on discharge is added to mhm! + call message('***ERROR: Simulation period is not covered by observations! ', trim(filename)) + stop + end if + + ! allocation of arrays + allocate(data ((endJul_period - startJul_period + 1_i4) * timestep_file)) + data = nodata_file + allocate(data_file((endJul_file - startJul_file + 1_i4) * timestep_file)) + data_file = nodata_file + + if (present(mask)) then + allocate(mask((endJul_period - startJul_period + 1_i4) * timestep_file)) + mask = .true. + end if + + ! read data from file to temporal array + do i = 1, (endJul_file - startJul_file + 1_i4) * timestep_file + ! read date and data + read(fileunit, *) (time_file(j), j = 1, 5), data_file(i) + end do + time_file(1) = time_file(2) + 1 ! only to avoid warning + + length_file = (endJul_file - startJul_file + 1) + length_period = (endJul_period - startJul_period + 1) + + ! |---------------------------------| FILE + ! |--------------| PERIOD + if ((startJul_period .ge. startJul_file) .and. (endJul_period .le. endJul_file)) then + idx_st_period = 1 + idx_en_period = length_period * timestep_file + idx_st_file = (startJul_period - startJul_file + 1) * timestep_file + idx_en_file = (idx_st_file + length_period - 1) * timestep_file + end if + + ! |--------------| FILE + ! |---------------------------------| PERIOD + if ((startJul_period .lt. startJul_file) .and. (endJul_period .gt. endJul_file)) then + idx_st_period = (startJul_file - startJul_period + 1) * timestep_file + idx_en_period = (idx_st_period + length_file - 1) * timestep_file + idx_st_file = 1 + idx_en_file = length_file * timestep_file + end if + + ! |--------------| FILE + ! |---------------------------------| PERIOD + if ((startJul_period .ge. startJul_file) .and. (endJul_period .gt. endJul_file)) then + idx_st_period = 1 + idx_en_period = (endJul_file - startJul_period + 1) * timestep_file + idx_st_file = (startJul_period - startJul_file + 1) * timestep_file + idx_en_file = length_file * timestep_file + end if + + ! |--------------| FILE + ! |---------------------------------| PERIOD + if ((startJul_period .lt. startJul_file) .and. (endJul_period .le. endJul_file)) then + idx_st_period = (startJul_file - startJul_period + 1) * timestep_file + idx_en_period = (length_period) * timestep_file + idx_st_file = 1 + idx_en_file = (endJul_period - startJul_file + 1) * timestep_file + end if + + data(idx_st_period : idx_en_period) = data_file(idx_st_file : idx_en_file) + + if (present(mask)) then + where (abs(data - nodata_file) .lt. tiny(1.0_dp)) + mask = .false. + end where + end if + + if (present(nMeasPerDay)) then + nMeasPerDay = timestep_file + end if close(fileunit) diff --git a/src/mHM/mo_template.f90 b/src/common/mo_template.f90 similarity index 83% rename from src/mHM/mo_template.f90 rename to src/common/mo_template.f90 index 77080cc4..a9c21ff8 100644 --- a/src/mHM/mo_template.f90 +++ b/src/common/mo_template.f90 @@ -20,7 +20,7 @@ MODULE mo_template ! Always use the number precisions of mo_kind ! All USE statements have the only clause - USE mo_kind, ONLY: i4, sp, dp + USE mo_kind, ONLY : i4, sp, dp ! Of course IMPLICIT NONE @@ -96,7 +96,7 @@ MODULE mo_template ! Modified, Matthias Cuntz, Nov 2011 - include mask ! Matthias Cuntz, Nov 2011 - test size(mask) == size(dat) Interface mean - MODULE PROCEDURE mean_sp, mean_dp + MODULE PROCEDURE mean_sp, mean_dp END INTERFACE mean ! Make everything private by default, after the interfaces PRIVATE @@ -108,7 +108,7 @@ MODULE mo_template REAL(sp), PARAMETER :: PI_sp = 3.141592653589793238462643383279502884197_sp ! Private global parameters (not used, only for demonstration) - INTEGER(i4), PARAMETER :: iTest=1 + INTEGER(i4), PARAMETER :: iTest = 1 ! ------------------------------------------------------------------ @@ -168,7 +168,7 @@ elemental pure function circum(radius) implicit none real(dp), intent(in) :: radius - real(dp) :: circum + real(dp) :: circum circum = 2.0_dp * pi_dp * radius @@ -180,54 +180,54 @@ FUNCTION mean_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: mean_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: mean_dp REAL(dp) :: n LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) /= size(dat)) stop 'Error mean_dp: size(mask) /= size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) /= size(dat)) stop 'Error mean_dp: size(mask) /= size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if - if (n <= (1.0_dp+tiny(1.0_dp))) stop 'mean_dp: n must be at least 2' + if (n <= (1.0_dp + tiny(1.0_dp))) stop 'mean_dp: n must be at least 2' ! Mean - mean_dp = sum(dat(:), mask=maske)/n + mean_dp = sum(dat(:), mask = maske) / n END FUNCTION mean_dp - + FUNCTION mean_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: mean_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: mean_sp REAL(sp) :: n LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) /= size(dat)) stop 'Error mean_sp: size(mask) /= size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) /= size(dat)) stop 'Error mean_sp: size(mask) /= size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n <= (1.0_sp+tiny(1.0_sp))) stop 'mean_sp: n must be at least 2' + if (n <= (1.0_sp + tiny(1.0_sp))) stop 'mean_sp: n must be at least 2' ! Mean - mean_sp = sum(dat(:), mask=maske)/n + mean_sp = sum(dat(:), mask = maske) / n END FUNCTION mean_sp diff --git a/src/common_mHM_mRM/mo_common_mHM_mRM_file.f90 b/src/common_mHM_mRM/mo_common_mHM_mRM_file.f90 new file mode 100644 index 00000000..22aedb5a --- /dev/null +++ b/src/common_mHM_mRM/mo_common_mHM_mRM_file.f90 @@ -0,0 +1,23 @@ +!> \file mo_file.f90 + +!> \brief Provides file names and units for mHM + +!> \details Provides all filenames as well as all units used for the hydrologic model mHM. + +!> \author Matthias Cuntz +!> \date Jan 2012 + +MODULE mo_common_mhm_mrm_file + + IMPLICIT NONE + + !> file defining optimization outputs (objective and parameter set) + CHARACTER(len = *), PARAMETER :: file_opti = 'FinalParam.out' ! final parameters & objective + !> Unit for file optimization outputs (objective and parameter set) + INTEGER, PARAMETER :: uopti = 72 ! + !> file defining optimization outputs in a namelist format (parameter set) + CHARACTER(len = *), PARAMETER :: file_opti_nml = 'FinalParam.nml' ! final parameters + !> Unit for file optimization outputs in a namelist format (parameter set) + INTEGER, PARAMETER :: uopti_nml = 73 ! + +END MODULE mo_common_mhm_mrm_file diff --git a/src/common_mHM_mRM/mo_common_mHM_mRM_read_config.f90 b/src/common_mHM_mRM/mo_common_mHM_mRM_read_config.f90 new file mode 100644 index 00000000..a4b2da81 --- /dev/null +++ b/src/common_mHM_mRM/mo_common_mHM_mRM_read_config.f90 @@ -0,0 +1,320 @@ +!> \file mo_common_mHM_mRM_read_config.f90 + +!> \brief Reading of main model configurations. + +!> \details This routine reads the configurations of common program parts + +!> \authors Matthias Zink +!> \date Dec 2012 + +MODULE mo_common_mHM_mRM_read_config + + USE mo_kind, ONLY : i4, dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: common_mHM_mRM_read_config, common_check_resolution, check_optimization_settings + + ! ------------------------------------------------------------------ + +CONTAINS + + ! ------------------------------------------------------------------ + + ! NAME + ! common_mHM_mRM_read_config + + ! PURPOSE + !> \brief Read main configurations for common parts + + ! CALLING SEQUENCE + ! None + + ! INTENT(IN) + ! None + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + ! None + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink + !> \date Dec 2012 + ! Modified Robert Schweppe Dec 2017 - based on mhm_read_config + + + subroutine common_mHM_mRM_read_config(file_namelist, unamelist) + + use mo_julian, only : julday, caldat + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_nml, only : open_nml, close_nml, position_nml + use mo_common_constants, only : & + maxNoBasins + use mo_common_read_config, only : set_land_cover_scenes_id + use mo_common_variables, only : & + period, nBasins, LCfilename + use mo_common_mHM_mRM_variables, only : & + nTStepDay, & + resolutionRouting, & + read_restart, & + warmingDays, warmPer, & ! warming days and warming period + evalPer, simPer, & ! model eval. & sim. periods + LCyearId, & + dirRestartIn, & + timestep, & ! model time step + opti_method, & ! Optimization algorithm: + opti_function, & ! Objective function: + optimize, & ! Optimization (.true. ) or + optimize_restart, & ! Optimization will be restarted from + seed, & ! seed used for optimization + nIterations, & ! number of iterations for optimization + dds_r, & ! DDS: perturbation rate + sa_temp, & ! SA: initial temperature + sce_ngs, & ! SCE: # of complexes + sce_npg, & ! SCE: # of points per complex + sce_nps, & ! SCE: # of points per subcomplex + mcmc_opti, & ! MCMC: Optimization (.true. ) or + mcmc_error_params ! Parameters of error model if mcmc_opti=.false. + + implicit none + + character(*), intent(in) :: file_namelist + integer, intent(in) :: unamelist + + integer(i4) :: jday + integer(i4) :: iBasin + integer(i4), dimension(maxNoBasins) :: warming_Days + type(period), dimension(maxNoBasins) :: eval_Per + real(dp), dimension(maxNoBasins) :: resolution_Routing + + character(256), dimension(maxNoBasins) :: dir_RestartIn + + ! namelist spatial & temporal resolution, otmization information + namelist /mainconfig_mhm_mrm/ timestep, resolution_Routing, optimize, & + optimize_restart, opti_method, opti_function, & + read_restart, dir_RestartIn + ! namelist for optimization settings + namelist /Optimization/ nIterations, seed, dds_r, sa_temp, sce_ngs, & + sce_npg, sce_nps, mcmc_opti, mcmc_error_params + ! namelist for time settings + namelist /time_periods/ warming_Days, eval_Per + + !=============================================================== + ! Read namelist main directories + !=============================================================== + call open_nml(file_namelist, unamelist, quiet = .true.) + + !=============================================================== + ! Read namelist specifying the model configuration + !=============================================================== + call position_nml('mainconfig_mhm_mrm', unamelist) + read(unamelist, nml = mainconfig_mhm_mrm) + + allocate(resolutionRouting(nBasins)) + allocate(dirRestartIn(nBasins)) + dirRestartIn = dir_RestartIn(1 : nBasins) + + resolutionRouting = resolution_Routing(1 : nBasins) + + ! check for optimize and read restart + if ((read_restart) .and. (optimize)) then + call message() + call message('***ERROR: cannot read states from restart file when optimizing') + stop 1 + end if + + !=============================================================== + ! INIT !!! (merged from mo_startup and mo_mrm_read_config) + !=============================================================== + ! transformation of time units & constants + if (mod(24, timeStep) > 0) then + call message('mo_startup: timeStep must be a divisor of 24: ', num2str(timeStep)) + stop 1 + end if + nTStepDay = 24_i4 / timeStep ! # of time steps per day + + ! allocate time periods + allocate(simPer(nBasins)) + allocate(evalPer(nBasins)) + allocate(warmingDays(nBasins)) + allocate(warmPer(nBasins)) + + !=============================================================== + ! read simulation time periods incl. warming days + !=============================================================== + call position_nml('time_periods', unamelist) + read(unamelist, nml = time_periods) + warmingDays = warming_Days(1 : nBasins) + evalPer = eval_Per(1 : nBasins) + + !=============================================================== + ! determine simulation time period incl. warming days for each + ! basin + !=============================================================== + do iBasin = 1, nBasins + ! julian days for evaluation period + jday = julday(dd = evalPer(iBasin)%dStart, mm = evalPer(iBasin)%mStart, yy = evalPer(iBasin)%yStart) + evalPer(iBasin)%julStart = jday + + jday = julday(dd = evalPer(iBasin)%dEnd, mm = evalPer(iBasin)%mEnd, yy = evalPer(iBasin)%yEnd) + evalPer(iBasin)%julEnd = jday + + ! determine warming period + warmPer(iBasin)%julStart = evalPer(iBasin)%julStart - warmingDays(iBasin) + warmPer(iBasin)%julEnd = evalPer(iBasin)%julStart - 1 + + call caldat(warmPer(iBasin)%julStart, dd = warmPer(iBasin)%dStart, mm = warmPer(iBasin)%mStart, yy = warmPer(iBasin)%yStart) + call caldat(warmPer(iBasin)%julEnd, dd = warmPer(iBasin)%dEnd, mm = warmPer(iBasin)%mEnd, yy = warmPer(iBasin)%yEnd) + + ! simulation Period = warming Period + evaluation Period + simPer(iBasin)%dStart = warmPer(iBasin)%dStart + simPer(iBasin)%mStart = warmPer(iBasin)%mStart + simPer(iBasin)%yStart = warmPer(iBasin)%yStart + simPer(iBasin)%julStart = warmPer(iBasin)%julStart + simPer(iBasin)%dEnd = evalPer(iBasin)%dEnd + simPer(iBasin)%mEnd = evalPer(iBasin)%mEnd + simPer(iBasin)%yEnd = evalPer(iBasin)%yEnd + simPer(iBasin)%julEnd = evalPer(iBasin)%julEnd + end do + + call set_land_cover_scenes_id(simPer, LCyearId, LCfilename) + + !=============================================================== + ! Settings for Optimization + !=============================================================== + ! namelist for Optimization settings + call position_nml('Optimization', unamelist) + read(unamelist, nml = Optimization) + ! checking of settings and default value initialization moved to new subroutine + ! because global_parameters need to be set, which is not the case right now + call close_nml(unamelist) + + end subroutine common_mHM_mRM_read_config + + subroutine check_optimization_settings() + + use mo_common_variables, only : global_parameters + use mo_message, only : message + use mo_common_mHM_mRM_variables, only : & + nIterations, & ! number of iterations for optimization + dds_r, & ! DDS: perturbation rate + sce_ngs, & ! SCE: # of complexes + sce_npg, & ! SCE: # of points per complex + sce_nps ! SCE: # of points per subcomplex + + implicit none + + integer(i4) :: n_true_pars + + ! check and set default values + if (nIterations .le. 0_i4) then + call message('Number of iterations for Optimization (nIterations) must be greater than zero') + stop 1 + end if + if (dds_r .lt. 0.0_dp .or. dds_r .gt. 1.0_dp) then + call message('dds_r must be between 0.0 and 1.0') + stop 1 + end if + if (sce_ngs .lt. 1_i4) then + call message ('number of complexes in SCE (sce_ngs) must be at least 1') + stop 1 + end if + ! number of points in each complex: default = 2n+1 + if (sce_npg .lt. 0_i4) then + n_true_pars = count(nint(global_parameters(:, 4)) .eq. 1) + sce_npg = 2 * n_true_pars + 1_i4 + end if + ! number of points in each sub-complex: default = n+1 + if (sce_nps .lt. 0_i4) then + n_true_pars = count(nint(global_parameters(:, 4)) .eq. 1) + sce_nps = n_true_pars + 1_i4 + end if + if (sce_npg .lt. sce_nps) then + call message ('number of points per complex (sce_npg) must be greater or') + call message ('equal number of points per sub-complex (sce_nps)') + stop 1 + end if + + end subroutine check_optimization_settings + + subroutine common_check_resolution(do_message, allow_subgrid_routing) + use mo_common_mHM_mRM_variables, only : & + resolutionRouting ! resolution of routing + use mo_common_variables, only : & + resolutionHydrology, & ! resolutions of hydrology + nBasins ! number of basins + use mo_string_utils, only : num2str + use mo_message, only : message + + logical, intent(in) :: do_message + logical, intent(in) :: allow_subgrid_routing + + integer(i4) :: ii + real(dp) :: cellFactorRbyH ! conversion factor L11 to L1 + + !=============================================================== + ! check matching of resolutions: hydrology, forcing and routing + !=============================================================== + do ii = 1, nBasins + cellFactorRbyH = resolutionRouting(ii) / resolutionHydrology(ii) + if (do_message) then + call message() + call message('Basin ', trim(adjustl(num2str(ii))), ': ') + call message('resolution Hydrology (basin ', trim(adjustl(num2str(ii))), ') = ', & + trim(adjustl(num2str(resolutionHydrology(ii))))) + call message('resolution Routing (basin ', trim(adjustl(num2str(ii))), ') = ', & + trim(adjustl(num2str(resolutionRouting(ii))))) + end if + ! + if(nint(cellFactorRbyH * 100.0_dp) .eq. 100) then + if (do_message) then + call message() + call message('Resolution of routing and hydrological modeling are equal!') + end if + + else if ((nint(cellFactorRbyH * 100.0_dp) .gt. 100) .and. .not.allow_subgrid_routing) then + if(nint(mod(cellFactorRbyH, 2.0_dp) * 100.0_dp) .ne. 0) then + call message() + call message('***ERROR: Resolution of routing is not a multiple of hydrological model resolution!') + call message(' FILE: mhm.nml, namelist: mainconfig, variable: resolutionRouting') + STOP + end if + ! + if (do_message) then + call message() + call message('Resolution of routing is bigger than hydrological model resolution by ', & + trim(adjustl(num2str(nint(cellFactorRbyH)))), ' times !') + end if + end if + ! + end do + + end subroutine common_check_resolution + +END MODULE mo_common_mHM_mRM_read_config diff --git a/src/common_mHM_mRM/mo_common_mHM_mRM_variables.f90 b/src/common_mHM_mRM/mo_common_mHM_mRM_variables.f90 new file mode 100644 index 00000000..57cf4bee --- /dev/null +++ b/src/common_mHM_mRM/mo_common_mHM_mRM_variables.f90 @@ -0,0 +1,85 @@ +!> \file mo_common_mHM_mRM_variables.f90 + +!> \brief Provides structures needed by mHM, mRM and/or mpr. + +!> \details Provides the global structure period that is used +!> by both mHM and mRM. + +!> \author Stephan Thober +!> \date Sep 2015 +! Modified Stephan Thober, Nov 2016 - moved processdescription from mo_global_variables to here +! Robert Schweppe, Dec 2017 - merged more duplicated variables from mhm and mrm global variables + +module mo_common_mHM_mRM_variables + + use mo_kind, only : i4, i8, dp + use mo_common_variables, only : period + implicit none + + ! ------------------------------------------------------------------- + ! INPUT variables for configuration of main part + ! ------------------------------------------------------------------- + integer(i4) :: mrm_coupling_mode !-1 = no mrm (mHM only) + ! ! 0 = stand alone (mRM only) + ! ! 1 = general coupling to a model (not used) + ! ! 2 = specific coupling to mHM (mHM and mRM) + + integer(i4), public :: timeStep ! [h] simulation time step (= TS) in [h] + real(dp), dimension(:), allocatable, public :: resolutionRouting ! [m or degree] resolution of routing - Level 11 + logical, public :: read_restart ! flag + + type(period), dimension(:), allocatable, public :: warmPer ! time period for warming + type(period), dimension(:), allocatable, public :: evalPer ! time period for model evaluation + type(period), dimension(:), allocatable, public :: simPer ! warmPer + evalPer + type(period), public :: readPer ! start and end dates of read period + integer(i4), dimension(:), allocatable, public :: warmingDays ! number of days for warm up period + integer(i4), dimension(:, :), allocatable, public :: LCyearId ! Mapping of landcover scenes (1, 2,..) for each basin + + ! ------------------------------------------------------------------ + ! CONSTANT + ! ------------------------------------------------------------------ + integer(i4), public :: nTstepDay ! Number of time intervals per day + + ! ------------------------------------------------------------------ + ! DIRECTORIES + ! ------------------------------------------------------------------ + ! has the dimension of nBasins + character(256), dimension(:), allocatable, public :: dirRestartIn! Directory where input of restart is read from + + ! ------------------------------------------------------------------- + ! OPTIMIZATION + ! ------------------------------------------------------------------- + integer(i4), public :: opti_method ! Optimization algorithm: + ! ! 1 - DDS + ! ! 2 - Simulated Annealing + ! ! 3 - SCE + integer(i4), public :: opti_function ! Objective function: + ! ! 1 - 1.0-NSE + ! ! 2 - 1.0-lnNSE + ! ! 3 - 1.0-0.5*(NSE+lnNSE) + logical, public :: optimize ! Optimization (.true. ) or + ! ! Evaluation run (.false.) + logical, public :: optimize_restart ! Optimization will be restarted from + ! ! mo_.restart file (.true.) + ! settings for optimization algorithms: + integer(i8), public :: seed ! seed used for optimization + ! ! default: -9 --> system time + integer(i4), public :: nIterations ! number of iterations for optimization + real(dp), public :: dds_r ! DDS: perturbation rate + ! ! default: 0.2 + real(dp), public :: sa_temp ! SA: initial temperature + ! ! default: -9.0 --> estimated + integer(i4), public :: sce_ngs ! SCE: # of complexes + ! ! default: 2 + integer(i4), public :: sce_npg ! SCE: # of points per complex + ! ! default: -9 --> 2n+1 + integer(i4), public :: sce_nps ! SCE: # of points per subcomplex + ! ! default: -9 --> n+1 + logical, public :: mcmc_opti ! MCMC: Optimization (.true. ) or + ! ! Only parameter uncertainty (.false.) + integer(i4), public, parameter :: nerror_model = 2 ! # possible parameters in error model + ! ! e.g. for opti_function=8: 2 + real(dp), public, dimension(nerror_model) :: mcmc_error_params ! Parameters of error model if mcmc_opti=.false. + ! ! e.g. for opti_function=8: 0.01, 0.3 + +end module mo_common_mHM_mRM_variables diff --git a/src/common_mHM_mRM/mo_optimization.f90 b/src/common_mHM_mRM/mo_optimization.f90 new file mode 100644 index 00000000..2ad39238 --- /dev/null +++ b/src/common_mHM_mRM/mo_optimization.f90 @@ -0,0 +1,284 @@ +!> \file mo_optimization.f90 + +!> \brief Wrapper subroutine for optimization against runoff and sm. + +!> \details This module provides a wrapper subroutine for optimization of mRM/mHM +!> against runoff or soil moisture.\n + +!> \authors Stephan Thober +!> \date Oct 2015 +module mo_optimization + use mo_kind, only : i4, i8, dp + use mo_optimization_utils, only : eval_interface, objective_interface + implicit none + private + public :: optimization + +contains + ! ------------------------------------------------------------------ + + ! NAME + ! optimization + + !> \brief Wrapper for optimization. + + !> \details This subroutine selects the optimization defined in a namelist, + !> i.e. the global variable \e opti\_method.\n + !> It return the objective function value for a specific parameter set. + + ! INTENT(IN) + !> \param[in] "real(dp) :: objective" - objective function used in the optimization + !> \param[in] "character(len=*) :: dirConfigOut" - directory where to write ascii output + + ! INTENT(INOUT) + ! None + + ! INTENT(OUT) + !> \param[out] "real(dp) :: funcBest" - best objective function value obtained during optimization + !> \param[out] "logical, allocatable :: maskpara(:) " - mask of optimized parameters + + ! INTENT(IN), OPTIONAL + ! None + + ! INTENT(INOUT), OPTIONAL + ! None + + ! INTENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + + ! HISTORY + !> \author Matthias Cuntz, Luis Samaniego, Juliane Mai, Matthias Zink and Stephan Thober + !> \date Oct 2015 + + subroutine optimization(eval, objective, dirConfigOut, funcBest, maskpara) + use mo_anneal, only : anneal ! Optimize with Simulated Annealing SA + use mo_dds, only : dds ! Optimize with Dynam. Dimens. Search DDS + use mo_string_utils, only : num2str + use mo_common_mHM_mRM_variables, only : & + opti_method, & ! Optimization algorithm used + opti_function, & ! Objective function used + optimize_restart, & ! Optimization will be restarted from + ! ! mo_.restart file (.true.) + nIterations, & ! number of iterations for optimization + seed, & ! seed used for optimization + mcmc_opti, & ! MCMC: Optimization (.true. ) or + ! ! Only parameter uncertainty (.false.) + mcmc_error_params, & ! Parameters of error model if mcmc_opti=.false. + ! ! e.g. for opti_function=8: 0.01, 0.3 + sa_temp, & ! SA: initial temperature + dds_r, & ! DDS: perturbation rate + sce_ngs, & ! SCE: # of complexes + sce_npg, & ! SCE: # of points per complex + sce_nps ! SCE: # of points per subcomplex + + use mo_common_variables, only : & + global_parameters ! Matrix of global parameters (former: gamma) + ! ! col1: min, col2: max, col3: initial, + ! ! col4: flag, col5: scaling + USE mo_mcmc, only : mcmc, mcmc_stddev ! Monte Carlo Markov Chain method + use mo_sce, only : sce ! Optimize with Shuffled Complex evolution + use mo_message, only : message + use mo_finish, only : finish + use mo_timer, only : timer_start, timer_stop, timer_get ! Timing of processes + use mo_xor4096, only : get_timeseed ! generating a seed from clock + + implicit none + + ! ------------------------------------------------------------------------- + ! INPUT VARIABLES + ! ------------------------------------------------------------------------- + procedure(eval_interface), intent(in), pointer :: eval + procedure(objective_interface), intent(in), pointer :: objective + character(len = *), intent(in) :: dirConfigOut + + ! ------------------------------------------------------------------------- + ! OUTPUT VARIABLES + ! ------------------------------------------------------------------------- + real(dp), intent(out) :: funcbest ! best objective function achivied during optimization + logical, intent(out), allocatable :: maskpara(:) ! true = parameter will be optimized = parameter(i,4) = 1 + ! ! false = parameter will not be optimized = parameter(i,4) = 0 + + ! ------------------------------------------------------------------------- + ! LOCAL VARIABLES + ! ------------------------------------------------------------------------- + integer(i4) :: ii + integer(i4) :: iTimer ! current timer number + ! mcmc + real(dp), allocatable :: burnin_paras(:, :) ! parameter sets sampled during burnin + real(dp), allocatable :: mcmc_paras(:, :) ! parameter sets sampled during proper mcmc + ! setting step sizes manually + ! real(dp), dimension(:), allocatable :: step ! pre-determined stepsize + integer(i4) :: npara + real(dp), allocatable :: local_parameters(:, :) ! global_parameters but includes a and b for likelihood + logical, allocatable :: local_maskpara(:) ! maskpara but includes a and b for likelihood + integer(i8) :: iseed ! local seed used for optimization + character(256) :: tFile ! file for temporal optimization outputs + character(256) :: pFile ! file for temporal SCE optimization outputs + + ! ------------------------------------------------------------------------- + ! START + ! ------------------------------------------------------------------------- + call message(' Start optimization') + iTimer = 1 + call timer_start(iTimer) + + ! mask parameter which have a FLAG=0 in mhm_parameter.nml + ! maskpara = true : parameter will be optimized + ! maskpara = false : parameter is discarded during optimization + npara = size(global_parameters, 1) + allocate(maskpara(npara)) + maskpara = .true. + do ii = 1, npara + if (nint(global_parameters(ii, 4), i4) .eq. 0_i4) then + maskpara(ii) = .false. + end if + end do + + ! add two extra parameter for optimisation of likelihood + if (opti_function == 8) then + allocate(local_parameters(npara + 2, size(global_parameters, 2))) + allocate(local_maskpara(npara + 2)) + ! setting step sizes manually + ! allocate(step(npara+2)) + local_parameters(1 : npara, :) = global_parameters(:, :) + local_maskpara(1 : npara) = maskpara(:) + local_parameters(npara + 1, 1) = 0.001_dp + local_parameters(npara + 1, 2) = 100._dp + local_parameters(npara + 1, 3) = 1._dp + local_parameters(npara + 1, 4) = 1._dp + local_parameters(npara + 1, 5) = 0._dp + local_parameters(npara + 2, 1) = 0.001_dp + local_parameters(npara + 2, 2) = 10._dp + local_parameters(npara + 2, 3) = 0.1_dp + local_parameters(npara + 2, 4) = 1._dp + local_parameters(npara + 2, 5) = 0._dp + local_maskpara(npara + 1 :) = .true. + if ((opti_method == 0) .and. (.not. mcmc_opti)) then ! MCMC but only for parameter uncertainties + local_parameters(npara + 1, 3) = mcmc_error_params(1) + local_parameters(npara + 2, 3) = mcmc_error_params(2) + local_maskpara(npara + 1 :) = .false. + end if + else + allocate(local_parameters(npara, size(global_parameters, 2))) + allocate(local_maskpara(npara)) + local_parameters = global_parameters + local_maskpara = maskpara + end if + + ! Seed for random numbers in optimisation + if (seed .gt. 0_i8) then ! fixed user-defined seed + iseed = seed + else ! flexible clock-time seed + call get_timeseed(iseed) + end if + + select case (opti_method) + case (0) + call message(' Use MCMC') + + tFile = trim(adjustl(dirConfigOut)) // 'mcmc_tmp_parasets.nc' + + ! setting step sizes manually + ! step=(/ 1.00000000000000, ... , /) + + select case (opti_function) + case (8) + call message(' Use MCMC') + call mcmc(eval, objective, local_parameters(:, 3), local_parameters(:, 1 : 2), mcmc_paras, burnin_paras, & + ParaSelectMode_in = 2_i4, tmp_file = tFile, & + maskpara_in = local_maskpara, & + restart = optimize_restart, restart_file = 'mo_mcmc.restart', & + ! stepsize_in=step, & + seed_in = iseed, loglike_in = .true., printflag_in = .true.) + case (4) + if (optimize_restart) then + call message('ERROR: A restart of this optimization method is not implemented yet!') + stop 1 + end if + call message(' Use MCMC_STDDEV') + call mcmc_stddev(eval, objective, local_parameters(:, 3), local_parameters(:, 1 : 2), mcmc_paras, burnin_paras, & + ParaSelectMode_in = 2_i4, tmp_file = tFile, & + maskpara_in = local_maskpara, & + seed_in = iseed, loglike_in = .true., printflag_in = .true.) + case default + call message("Error objective: This opti_function is either not implemented yet.") + stop 1 + end select + + case (1) + call message(' Use DDS') + + tFile = trim(adjustl(dirConfigOut)) // 'dds_results.out' + + if (optimize_restart) then + call message('ERROR: A restart of this optimization method is not implemented yet!') + stop 1 + end if + ! use fixed user-defined seed + local_parameters(:, 3) = dds(eval, objective, local_parameters(:, 3), local_parameters(:, 1 : 2), & + maxiter = int(nIterations, i8), r = dds_r, seed = iseed, & + tmp_file = tFile, mask = local_maskpara, & + funcbest = funcbest) + + case (2) + call message(' Use Simulated Annealing') + + tFile = trim(adjustl(dirConfigOut)) // 'anneal_results.out' + + if (optimize_restart) then + call message('ERROR: A restart of this optimization method is not implemented yet!') + stop 1 + end if + + if (sa_temp .gt. 0.0_dp) then + ! use fixed user-defined seed and user-defined initial temperature + local_parameters(:, 3) = anneal(eval, objective, local_parameters(:, 3), local_parameters(:, 1 : 2), & + temp = sa_temp, seeds = (/iseed, iseed + 1000_i8, iseed + 2000_i8/), nITERmax = nIterations, & + tmp_file = tFile, maskpara = local_maskpara, & + funcbest = funcbest) + else + ! use fixed user-defined seed and adaptive initial temperature + local_parameters(:, 3) = anneal(eval, objective, local_parameters(:, 3), local_parameters(:, 1 : 2), & + seeds = (/iseed, iseed + 1000_i8, iseed + 2000_i8/), nITERmax = nIterations, & + tmp_file = tFile, maskpara = local_maskpara, & + funcbest = funcbest) + end if + case (3) + call message(' Use SCE') + + tFile = trim(adjustl(dirConfigOut)) // 'sce_results.out' + pFile = trim(adjustl(dirConfigOut)) // 'sce_population.out' + + ! use fixed user-defined seed + local_parameters(:, 3) = sce(eval, objective, local_parameters(:, 3), local_parameters(:, 1 : 2), & + mymaxn = int(nIterations, i8), myseed = iseed, myngs = sce_ngs, mynpg = sce_npg, mynps = sce_nps, & + parallel = .false., mymask = local_maskpara, & + restart = optimize_restart, restart_file = 'mo_sce.restart', & + tmp_file = tFile, popul_file = pFile, & + bestf = funcbest) + case default + call finish('mRM', 'This optimization method is not implemented.') + end select + call timer_stop(iTimer) + call message(' in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.') + + global_parameters(:, :) = local_parameters(1 : npara, :) + maskpara(:) = local_maskpara(1 : npara) + + deallocate(local_parameters) + deallocate(local_maskpara) + + end subroutine optimization + +end module mo_optimization diff --git a/src/lib/mo_anneal.f90 b/src/lib/mo_anneal.f90 index 995bfe07..3e381fbb 100644 --- a/src/lib/mo_anneal.f90 +++ b/src/lib/mo_anneal.f90 @@ -35,9 +35,10 @@ MODULE mo_anneal ! Copyright 2012-13 Juliane Mai - USE mo_kind, ONLY: i4, i8, dp - USE mo_utils, ONLY: le, ge - USE mo_xor4096, ONLY: get_timeseed, xor4096, xor4096g, n_save_state + USE mo_kind, ONLY : i4, i8, dp + USE mo_utils, ONLY : le, ge + USE mo_xor4096, ONLY : get_timeseed, xor4096, xor4096g, n_save_state + USE mo_optimization_utils, ONLY : eval_interface, objective_interface IMPLICIT NONE @@ -212,7 +213,7 @@ MODULE mo_anneal ! ------------------------------------------------------------------ INTERFACE anneal - MODULE PROCEDURE anneal_dp + MODULE PROCEDURE anneal_dp END INTERFACE anneal ! ------------------------------------------------------------------ @@ -330,413 +331,407 @@ MODULE mo_anneal ! ------------------------------------------------------------------ INTERFACE GetTemperature - MODULE PROCEDURE GetTemperature_dp + MODULE PROCEDURE GetTemperature_dp END INTERFACE GetTemperature PRIVATE INTERFACE Generate_Neighborhood_weight - MODULE PROCEDURE Generate_Neighborhood_weight_dp + MODULE PROCEDURE Generate_Neighborhood_weight_dp END INTERFACE Generate_Neighborhood_weight ! ------------------------------------------------------------------ CONTAINS - FUNCTION anneal_dp( cost, para, & ! obligatory - prange, prange_func, & ! optional IN: exactly one of both - temp, Dt, nITERmax, Len, nST, eps, acc, & ! optional IN - seeds, printflag, maskpara, weight, & ! optional IN - changeParaMode, reflectionFlag, & ! optional IN - pertubFlexFlag, maxit, undef_funcval, & ! optional IN - tmp_file, & ! optional IN - funcbest, history & ! optional OUT - ) & - result(parabest) + FUNCTION anneal_dp(eval, cost, para, & ! obligatory + prange, prange_func, & ! optional IN: exactly one of both + temp, Dt, nITERmax, Len, nST, eps, acc, & ! optional IN + seeds, printflag, maskpara, weight, & ! optional IN + changeParaMode, reflectionFlag, & ! optional IN + pertubFlexFlag, maxit, undef_funcval, & ! optional IN + tmp_file, & ! optional IN + funcbest, history & ! optional OUT + ) & + result(parabest) IMPLICIT NONE - INTERFACE - FUNCTION cost(paraset) - ! calculates the cost function at a certain parameter set paraset - use mo_kind - REAL(DP), DIMENSION(:), INTENT(IN) :: paraset - REAL(DP) :: cost - END FUNCTION cost - END INTERFACE + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: cost INTERFACE - SUBROUTINE prange_func(paraset,iPar,rangePar) - ! gives the range (min,max) of the parameter iPar at a certain parameter set paraset - use mo_kind - REAL(DP), DIMENSION(:), INTENT(IN) :: paraset - INTEGER(I4), INTENT(IN) :: iPar - REAL(DP), DIMENSION(2), INTENT(OUT) :: rangePar - END SUBROUTINE prange_func + SUBROUTINE prange_func(paraset, iPar, rangePar) + ! gives the range (min,max) of the parameter iPar at a certain parameter set paraset + use mo_kind + REAL(DP), DIMENSION(:), INTENT(IN) :: paraset + INTEGER(I4), INTENT(IN) :: iPar + REAL(DP), DIMENSION(2), INTENT(OUT) :: rangePar + END SUBROUTINE prange_func END INTERFACE optional :: prange_func - REAL(DP), DIMENSION(:), INTENT(IN) :: para + REAL(DP), DIMENSION(:), INTENT(IN) :: para ! ! initial parameter - REAL(DP), DIMENSION(size(para,1)) :: parabest + REAL(DP), DIMENSION(size(para, 1)) :: parabest ! ! parameter set minimizing objective ! optionals - REAL(DP), OPTIONAL, DIMENSION(size(para,1),2), INTENT(IN) :: prange + REAL(DP), OPTIONAL, DIMENSION(size(para, 1), 2), INTENT(IN) :: prange ! ! lower and upper limit per parameter - REAL(DP), OPTIONAL, INTENT(IN) :: temp + REAL(DP), OPTIONAL, INTENT(IN) :: temp ! ! starting temperature ! ! (DEFAULT: Get_Temperature) - REAL(DP), OPTIONAL, INTENT(IN) :: Dt + REAL(DP), OPTIONAL, INTENT(IN) :: Dt ! ! geometrical decreement, 0.7 weight + ! acc_ratio close to 0 --> weight uniform + ! gradual weighting is linear combination of these two weights + weightGrad(:) = weightUni(:) + (ac_ratio) * (weight_in(:) - weightUni(:)) + + select case(changeParaMode_inin) + case(1_i4) ! only one parameter is changed + ! (1a) Change one parameter traditionally + call xor4096(seeds_in(2), RN2, save_state = save_state_2) + iPar = 1_i4 + ! + do while (weightGrad(iPar) .lt. RN2) + iPar = iPar + 1_i4 + end do + if (present(prange_func)) then + call prange_func(gamma(:)%old, iPar, iParRange) + else + iParRange(1) = prange(iPar, 1) + iParRange(2) = prange(iPar, 2) end if - - if (pertubFlexFlag_inin) then - pertubationR = max(dR/5.0_dp,0.05_dp) + gamma(iPar)%min = iParRange(1) + gamma(iPar)%max = iParRange(2) + if (reflectionFlag_inin) then + call xor4096g(seeds_in(3), RN3, save_state = save_state_3) + gamma(iPar)%new = parGen_dds_dp(gamma(iPar)%old, pertubationR, & + gamma(iPar)%min, gamma(iPar)%max, RN3) else - pertubationR = 0.2_dp + call xor4096(seeds_in(2), RN2, save_state = save_state_2) + gamma(iPar)%new = parGen_anneal_dp(gamma(iPar)%old, dR, & + gamma(iPar)%min, gamma(iPar)%max, RN2) end if - - ! gradual weights: - ! acc_ratio close to 1 --> weight - ! acc_ratio close to 0 --> weight uniform - ! gradual weighting is linear combination of these two weights - weightGrad(:) = weightUni(:)+(ac_ratio)*(weight_in(:)-weightUni(:)) - - select case(changeParaMode_inin) - case(1_i4) ! only one parameter is changed - ! (1a) Change one parameter traditionally - call xor4096(seeds_in(2),RN2, save_state=save_state_2) - iPar=1_i4 - ! - do while (weightGrad(iPar) .lt. RN2) - iPar = iPar + 1_i4 - end do - if (present(prange_func)) then - call prange_func(gamma(:)%old, iPar, iParRange) - else - iParRange(1) = prange(iPar,1) - iParRange(2) = prange(iPar,2) - end if - gamma(iPar)%min = iParRange(1) - gamma(iPar)%max = iParRange(2) - if (reflectionFlag_inin) then - call xor4096g(seeds_in(3),RN3, save_state=save_state_3) - gamma(iPar)%new = parGen_dds_dp( gamma(iPar)%old, pertubationR, & - gamma(iPar)%min, gamma(iPar)%max,RN3) - else - call xor4096(seeds_in(2),RN2, save_state=save_state_2) - gamma(iPar)%new = parGen_anneal_dp( gamma(iPar)%old, dR, & - gamma(iPar)%min, gamma(iPar)%max,RN2) - end if - case(2_i4) ! all parameter are changed - do par=1, size(truepara) - iPar = truepara(par) - if (present(prange_func)) then - call prange_func(gamma(:)%old, iPar, iParRange) - else - iParRange(1) = prange(iPar,1) - iParRange(2) = prange(iPar,2) - end if - gamma(iPar)%min = iParRange(1) - gamma(iPar)%max = iParRange(2) - if (reflectionFlag_inin) then - call xor4096g(seeds_in(3),RN3, save_state=save_state_3) - gamma(iPar)%new = parGen_dds_dp( gamma(iPar)%old, pertubationR, & - gamma(iPar)%min, gamma(iPar)%max,RN3) - else - call xor4096(seeds_in(2),RN2, save_state=save_state_2) - gamma(iPar)%new = parGen_anneal_dp( gamma(iPar)%old, dR, & - gamma(iPar)%min, gamma(iPar)%max,RN2) - end if - end do - case(3_i4) ! parameter in neighborhood are changed - ! Generate new neighborhood - call generate_neighborhood_weight_dp( truepara, weightGrad, save_state_1, & + case(2_i4) ! all parameter are changed + do par = 1, size(truepara) + iPar = truepara(par) + if (present(prange_func)) then + call prange_func(gamma(:)%old, iPar, iParRange) + else + iParRange(1) = prange(iPar, 1) + iParRange(2) = prange(iPar, 2) + end if + gamma(iPar)%min = iParRange(1) + gamma(iPar)%max = iParRange(2) + if (reflectionFlag_inin) then + call xor4096g(seeds_in(3), RN3, save_state = save_state_3) + gamma(iPar)%new = parGen_dds_dp(gamma(iPar)%old, pertubationR, & + gamma(iPar)%min, gamma(iPar)%max, RN3) + else + call xor4096(seeds_in(2), RN2, save_state = save_state_2) + gamma(iPar)%new = parGen_anneal_dp(gamma(iPar)%old, dR, & + gamma(iPar)%min, gamma(iPar)%max, RN2) + end if + end do + case(3_i4) ! parameter in neighborhood are changed + ! Generate new neighborhood + call generate_neighborhood_weight_dp(truepara, weightGrad, save_state_1, & iTotalCounter, nIterMax_in, neighborhood) - ! - ! change parameter in neighborhood - do iPar=1, n - if (neighborhood(iPar)) then - ! find range of parameter - if (present(prange_func)) then - call prange_func(gamma(:)%old, iPar, iParRange) - else - iParRange(1) = prange(iPar,1) - iParRange(2) = prange(iPar,2) - end if - gamma(iPar)%min = iParRange(1) - gamma(iPar)%max = iParRange(2) - ! - if (reflectionFlag_inin) then - ! generate gaussian distributed new parameter value which is reflected if out of bound - call xor4096g(seeds_in(3),RN3, save_state=save_state_3) - gamma(iPar)%new = parGen_dds_dp( gamma(iPar)%old, pertubationR, & - gamma(iPar)%min, gamma(iPar)%max,RN3) - else - ! generate new parameter value uniform distributed in range (no reflection) - call xor4096(seeds_in(2),RN2, save_state=save_state_2) - gamma(iPar)%new = parGen_anneal_dp( gamma(iPar)%old, dR, & - gamma(iPar)%min, gamma(iPar)%max,RN2) - end if - end if - end do - end select - - ! (2) Calculate new objective function value - fn = cost(gamma(:)%new) * maxit_in - coststatus = .true. - if (present(undef_funcval)) then - if ( abs(fn*maxit_in-undef_funcval) .lt. tiny(1.0_dp) ) then - coststatus = .false. - end if + ! + ! change parameter in neighborhood + do iPar = 1, n + if (neighborhood(iPar)) then + ! find range of parameter + if (present(prange_func)) then + call prange_func(gamma(:)%old, iPar, iParRange) + else + iParRange(1) = prange(iPar, 1) + iParRange(2) = prange(iPar, 2) + end if + gamma(iPar)%min = iParRange(1) + gamma(iPar)%max = iParRange(2) + ! + if (reflectionFlag_inin) then + ! generate gaussian distributed new parameter value which is reflected if out of bound + call xor4096g(seeds_in(3), RN3, save_state = save_state_3) + gamma(iPar)%new = parGen_dds_dp(gamma(iPar)%old, pertubationR, & + gamma(iPar)%min, gamma(iPar)%max, RN3) + else + ! generate new parameter value uniform distributed in range (no reflection) + call xor4096(seeds_in(2), RN2, save_state = save_state_2) + gamma(iPar)%new = parGen_anneal_dp(gamma(iPar)%old, dR, & + gamma(iPar)%min, gamma(iPar)%max, RN2) + end if + end if + end do + end select + + ! (2) Calculate new objective function value + fn = cost(gamma(:)%new, eval) * maxit_in + coststatus = .true. + if (present(undef_funcval)) then + if (abs(fn * maxit_in - undef_funcval) .lt. tiny(1.0_dp)) then + coststatus = .false. end if + end if - feasible: if (coststatus) then ! feasible parameter set - fn = fn/normPhi + feasible : if (coststatus) then ! feasible parameter set + fn = fn / normPhi - ! Change in cost function value - df = fn-fo + ! Change in cost function value + df = fn - fo - ! analyze change in the objective function: df - if (df < 0.0_DP) then + ! analyze change in the objective function: df + if (df < 0.0_DP) then - ! accept the new state - Ipos=Ipos+1_i4 - fo = fn - gamma(:)%old = gamma(:)%new - - ! keep best solution - if (fo < fBest) then - fBest = fo - gamma(:)%best = gamma(:)%new - end if - else - if ( df > eps_in ) then - rho=-df/T_in - if (rho < small) then - pa=0.0_DP - else - pa=EXP(rho) - end if - ! - call xor4096(seeds_in(1), RN1, save_state=save_state_1) - ! - if (pa > RN1) then - ! accept new state with certain probability - Ineg=Ineg+1_i4 - fo = fn - ! save old state - gamma(:)%old = gamma(:)%new - end if - end if - end if - j=j+1 - else - ! function value was not valid - iTotalCounterR = iTotalCounterR - 1_i4 - iTotalCounter = iTotalCounter - 1_i4 - end if feasible !valid parameter set - end do loopLEN - - ! estimate acceptance ratio - ac_ratio=(real(Ipos,dp) + real(Ineg,dp))/real(LEN_IN,dp) - if (modulo(iTotalCounter,LEN_IN*nST_in)/LEN_IN .gt. 0_i4) then - idummy = modulo(iTotalCounter,LEN_IN*nST_in)/LEN_IN - else - idummy = nST_in - end if - iPos_iNeg_history(idummy,:) = (/ iPos, iNeg /) - - ! store current best in history vector - history_out(iTotalCounter/LEN_IN,1) = real(iTotalCounter,dp) - history_out(iTotalCounter/LEN_IN,2) = maxit_in * fBest*normPhi - - file_write2: if (present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', position='append',recl=(n+2)*30) - write(999,*) iTotalCounter, maxit_in * fBest*normPhi, gamma(:)%best - close(999) - end if file_write2 - - if (printflag_in) then - print '(I8, 2I5, E15.7, 3E15.7)', ITotalCounter, Ipos, Ineg, ac_ratio, T_in, & - fo*NormPhi*maxit_in, fBest*NormPhi*maxit_in - end if - - ! Cooling schedule - if (fbb .gt. tiny(1.0_dp)) then - fInc= (fbb-fBest)/fbb - else - fInc = 1.0_dp - end if - if (fInc < 0.00000001_dp) then - iConF= iConF+1_i4 - else - iConF=0_i4 - end if - - if ((ac_ratio < 0.15_dp) .and. (iConF > 5_i4) .and. (iConR <= -3_i4)) then ! - iConR no reheating - ! Re-heating - if (printflag_in) then - print *, 'Re-heating: ', iConR - end if - iConR = iConR+1_i4 - T_in = T0/2._DP - iter = 0_i4 ! for LEN - iTotalCounterR = 0_i4 ! for dR - ! start from current best - gamma(:)%old = gamma(:)%best - else - ! Update Temperature (geometrical decrement) - if (ac_ratio < 0.4_dp) then - DT_IN=0.995_dp + ! accept the new state + Ipos = Ipos + 1_i4 + fo = fn + gamma(:)%old = gamma(:)%new + + ! keep best solution + if (fo < fBest) then + fBest = fo + gamma(:)%best = gamma(:)%new + end if else - DT_IN=DT0 - end if - T_in = T_in*DT_IN - end if - - ! Stop Criteria: consecutive MC with marginal decrements and acceptance ratio - if (fInc < eps_in) then - iConL= iConL+1_i4 - else - iConL=0_i4 - end if - if ( (iConL > nST_in) .and. (ac_ratio < acc_in) .and. (iConR > 2_i4) .and. & - (sum(iPos_iNeg_history(:,:)) .lt. 1_i4 ) ) then - iStop=.FALSE. - end if - ! a way out maximum - if ( (iTotalCounter > nITERmax_in) .and. & !(ac_ratio > acc_in) .and. & - (sum(iPos_iNeg_history(:,:)) .ge. 1_i4 )) then - - ! store achieved history so far - allocate(history_out_tmp(size(history_out,1),size(history_out,2))) - history_out_tmp = history_out - deallocate(history_out) - - nITERmax_in = max(nITERmax_in+LEN_IN,int(real(nITERmax_in,dp)* 1.10_dp,i4)) - if (printflag_in) then - print *, 'nITERmax changed to =', nITERmax_in + if (df > eps_in) then + rho = -df / T_in + if (rho < small) then + pa = 0.0_DP + else + pa = EXP(rho) + end if + ! + call xor4096(seeds_in(1), RN1, save_state = save_state_1) + ! + if (pa > RN1) then + ! accept new state with certain probability + Ineg = Ineg + 1_i4 + fo = fn + ! save old state + gamma(:)%old = gamma(:)%new + end if + end if end if - - ! increase lenght of history vecor - idummy = nITERmax_in/LEN_IN+1_i4 - allocate(history_out(idummy,2)) - - do j=1,size(history_out_tmp,1) - history_out(j,:) = history_out_tmp(j,:) - end do - - deallocate(history_out_tmp) - - end if - ! STOP condition - if ( iTotalCounter > nITERmax_in ) then - iStop=.FALSE. - end if + j = j + 1 + else + ! function value was not valid + iTotalCounterR = iTotalCounterR - 1_i4 + iTotalCounter = iTotalCounter - 1_i4 + end if feasible !valid parameter set + end do loopLEN + + ! estimate acceptance ratio + ac_ratio = (real(Ipos, dp) + real(Ineg, dp)) / real(LEN_IN, dp) + if (modulo(iTotalCounter, LEN_IN * nST_in) / LEN_IN .gt. 0_i4) then + idummy = modulo(iTotalCounter, LEN_IN * nST_in) / LEN_IN + else + idummy = nST_in + end if + iPos_iNeg_history(idummy, :) = (/ iPos, iNeg /) + + ! store current best in history vector + history_out(iTotalCounter / LEN_IN, 1) = real(iTotalCounter, dp) + history_out(iTotalCounter / LEN_IN, 2) = maxit_in * fBest * normPhi + + file_write2 : if (present(tmp_file)) then + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', position = 'append', recl = (n + 2) * 30) + write(999, *) iTotalCounter, maxit_in * fBest * normPhi, gamma(:)%best + close(999) + end if file_write2 + + if (printflag_in) then + print '(I8, 2I5, E15.7, 3E15.7)', ITotalCounter, Ipos, Ineg, ac_ratio, T_in, & + fo * NormPhi * maxit_in, fBest * NormPhi * maxit_in + end if + + ! Cooling schedule + if (fbb .gt. tiny(1.0_dp)) then + fInc = (fbb - fBest) / fbb + else + fInc = 1.0_dp + end if + if (fInc < 0.00000001_dp) then + iConF = iConF + 1_i4 + else + iConF = 0_i4 + end if + + if ((ac_ratio < 0.15_dp) .and. (iConF > 5_i4) .and. (iConR <= -3_i4)) then ! - iConR no reheating + ! Re-heating + if (printflag_in) then + print *, 'Re-heating: ', iConR + end if + iConR = iConR + 1_i4 + T_in = T0 / 2._DP + iter = 0_i4 ! for LEN + iTotalCounterR = 0_i4 ! for dR + ! start from current best + gamma(:)%old = gamma(:)%best + else + ! Update Temperature (geometrical decrement) + if (ac_ratio < 0.4_dp) then + DT_IN = 0.995_dp + else + DT_IN = DT0 + end if + T_in = T_in * DT_IN + end if + + ! Stop Criteria: consecutive MC with marginal decrements and acceptance ratio + if (fInc < eps_in) then + iConL = iConL + 1_i4 + else + iConL = 0_i4 + end if + if ((iConL > nST_in) .and. (ac_ratio < acc_in) .and. (iConR > 2_i4) .and. & + (sum(iPos_iNeg_history(:, :)) .lt. 1_i4)) then + iStop = .FALSE. + end if + ! a way out maximum + if ((iTotalCounter > nITERmax_in) .and. & !(ac_ratio > acc_in) .and. & + (sum(iPos_iNeg_history(:, :)) .ge. 1_i4)) then + + ! store achieved history so far + allocate(history_out_tmp(size(history_out, 1), size(history_out, 2))) + history_out_tmp = history_out + deallocate(history_out) + + nITERmax_in = max(nITERmax_in + LEN_IN, int(real(nITERmax_in, dp) * 1.10_dp, i4)) + if (printflag_in) then + print *, 'nITERmax changed to =', nITERmax_in + end if + + ! increase lenght of history vecor + idummy = nITERmax_in / LEN_IN + 1_i4 + allocate(history_out(idummy, 2)) + + do j = 1, size(history_out_tmp, 1) + history_out(j, :) = history_out_tmp(j, :) + end do + + deallocate(history_out_tmp) + + end if + ! STOP condition + if (iTotalCounter > nITERmax_in) then + iStop = .FALSE. + end if end do loopTest ! calculate cost function again (only for check and return values) parabest = gamma(:)%best - costbest = cost(parabest) * maxit_in + costbest = cost(parabest, eval) * maxit_in if (present (funcbest)) then - funcbest = costbest * maxit_in + funcbest = costbest * maxit_in end if - fo = costbest/NormPhi + fo = costbest / NormPhi if (printflag_in) then - print *, ' ' - print '(A15,E15.7)', ' end cost = ', maxit_in * fBest*normPhi - print *, 'end parameter: ' - do kk = 1,N - print '(A10,I3,A3, E15.7)' , ' para #',kk,' = ', gamma(kk)%best - end do - - print *, 'Final check: ', (fo - fBest) + print *, ' ' + print '(A15,E15.7)', ' end cost = ', maxit_in * fBest * normPhi + print *, 'end parameter: ' + do kk = 1, N + print '(A10,I3,A3, E15.7)', ' para #', kk, ' = ', gamma(kk)%best + end do + + print *, 'Final check: ', (fo - fBest) end if if (present(history)) then - allocate(history(size(history_out,1)-1,size(history_out,2))) - history(:,:) = history_out(1:size(history_out,1)-1,:) + allocate(history(size(history_out, 1) - 1, size(history_out, 2))) + history(:, :) = history_out(1 : size(history_out, 1) - 1, :) end if deallocate(truepara) @@ -1087,282 +1082,275 @@ END SUBROUTINE prange_func END FUNCTION anneal_dp - real(DP) function GetTemperature_dp( paraset, cost, acc_goal, & ! obligatory - prange, prange_func, & ! optional IN: exactly one of both - samplesize, maskpara, seeds, printflag, & ! optional IN - weight, maxit, undef_funcval & ! optional IN - ) - use mo_kind, only: dp, i4, i8 + real(DP) function GetTemperature_dp(paraset, cost, eval, acc_goal, & ! obligatory + prange, prange_func, & ! optional IN: exactly one of both + samplesize, maskpara, seeds, printflag, & ! optional IN + weight, maxit, undef_funcval & ! optional IN + ) + use mo_kind, only : dp, i4, i8 implicit none - real(dp), dimension(:), intent(in) :: paraset + real(dp), dimension(:), intent(in) :: paraset ! ! a valid parameter set of the model - real(dp), intent(in) :: acc_goal + real(dp), intent(in) :: acc_goal ! ! acceptance ratio to achieve - real(dp), optional, dimension(size(paraset,1),2), intent(in) :: prange + real(dp), optional, dimension(size(paraset, 1), 2), intent(in) :: prange ! ! lower and upper limit per parameter - integer(i4), optional, intent(in) :: samplesize + integer(i4), optional, intent(in) :: samplesize ! ! size of random set the ! ! acc_estimate is based on ! ! DEFAULT: Max(250, 20*Number paras) - logical, optional, dimension(size(paraset,1)), intent(in) :: maskpara + logical, optional, dimension(size(paraset, 1)), intent(in) :: maskpara ! ! true if parameter will be optimized ! ! false if parameter is discarded in ! ! optimization ! ! DEFAULT: .true. - integer(i8), optional, dimension(2), intent(in) :: seeds + integer(i8), optional, dimension(2), intent(in) :: seeds ! ! Seeds of random numbers ! ! DEFAULT: time dependent - logical, optional, intent(in) :: printflag + logical, optional, intent(in) :: printflag ! ! .true. if detailed temperature ! ! estimation is printed ! ! DEFAULT: .false. - REAL(DP), OPTIONAL, DIMENSION(size(paraset,1)), INTENT(IN) :: weight + REAL(DP), OPTIONAL, DIMENSION(size(paraset, 1)), INTENT(IN) :: weight ! ! vector of weights per parameter ! ! gives the frequency of parameter to ! ! be chosen for optimization ! ! DEFAULT: equal weighting - LOGICAL, OPTIONAL, INTENT(IN) :: maxit + LOGICAL, OPTIONAL, INTENT(IN) :: maxit ! ! Maxim. or minim. of function ! ! maximization = .true., ! ! minimization = .false. ! ! DEFAULT: .false. - REAL(DP), OPTIONAL, INTENT(IN) :: undef_funcval + REAL(DP), OPTIONAL, INTENT(IN) :: undef_funcval ! ! objective function value occuring ! ! if parameter set leads to ! ! invalid model results, e.g. -999.0_dp ! ! DEFAULT: not present + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: cost INTERFACE - FUNCTION cost(paraset) - ! calculates the cost function at a certain parameter set paraset - use mo_kind - REAL(DP), DIMENSION(:), INTENT(IN) :: paraset - REAL(DP) :: cost - END FUNCTION cost - END INTERFACE - - INTERFACE - SUBROUTINE prange_func(paraset,iPar,rangePar) - ! gives the range (min,max) of the parameter iPar at a certain parameter set paraset - use mo_kind - REAL(DP), DIMENSION(:), INTENT(IN) :: paraset - INTEGER(I4), INTENT(IN) :: iPar - REAL(DP), DIMENSION(2), INTENT(OUT) :: rangePar - END SUBROUTINE prange_func + SUBROUTINE prange_func(paraset, iPar, rangePar) + ! gives the range (min,max) of the parameter iPar at a certain parameter set paraset + use mo_kind + REAL(DP), DIMENSION(:), INTENT(IN) :: paraset + INTEGER(I4), INTENT(IN) :: iPar + REAL(DP), DIMENSION(2), INTENT(OUT) :: rangePar + END SUBROUTINE prange_func END INTERFACE OPTIONAL :: prange_func ! ! Local variables - integer(i4) :: n - integer(i4) :: samplesize_in - integer(i4) :: idummy, i, j - integer(i4) :: iPar - real(dp), dimension(2) :: iParRange - real(dp) :: NormPhi - real(dp) :: fo, fn, dr - real(dp) :: T - - LOGICAL :: coststatus ! true if model output is valid - LOGICAL, DIMENSION(size(paraset,1)) :: maskpara_in ! true if parameter will be optimized - INTEGER(I4), DIMENSION(:), ALLOCATABLE :: truepara ! indexes of parameters to be optimized - LOGICAL :: printflag_in ! if detailed estimation of temperature is printed - REAL(DP), DIMENSION(size(paraset,1)) :: weight_in ! CDF of parameter to chose for optimization - REAL(DP) :: maxit_in ! Maximization or minimization of function: + integer(i4) :: n + integer(i4) :: samplesize_in + integer(i4) :: idummy, i, j + integer(i4) :: iPar + real(dp), dimension(2) :: iParRange + real(dp) :: NormPhi + real(dp) :: fo, fn, dr + real(dp) :: T + + LOGICAL :: coststatus ! true if model output is valid + LOGICAL, DIMENSION(size(paraset, 1)) :: maskpara_in ! true if parameter will be optimized + INTEGER(I4), DIMENSION(:), ALLOCATABLE :: truepara ! indexes of parameters to be optimized + LOGICAL :: printflag_in ! if detailed estimation of temperature is printed + REAL(DP), DIMENSION(size(paraset, 1)) :: weight_in ! CDF of parameter to chose for optimization + REAL(DP) :: maxit_in ! Maximization or minimization of function: ! ! -1 = maxim, 1 = minim type paramLim - real(DP) :: min ! minimum value - real(DP) :: max ! maximum value - real(DP) :: new ! new state value - real(DP) :: old ! old state value - real(DP) :: best ! best value found - real(DP) :: dMult ! sensitivity multiplier - ! ! for parameter search + real(DP) :: min ! minimum value + real(DP) :: max ! maximum value + real(DP) :: new ! new state value + real(DP) :: old ! old state value + real(DP) :: best ! best value found + real(DP) :: dMult ! sensitivity multiplier + ! ! for parameter search end type paramLim - type (paramLim), dimension (size(paraset,1)), target :: gamma ! Parameter + type (paramLim), dimension (size(paraset, 1)), target :: gamma ! Parameter ! for random numbers - INTEGER(I8) :: seeds_in(2) - real(DP) :: RN1, RN2 ! Random numbers - integer(I8), dimension(n_save_state) :: save_state_1 ! optional arguments for restarting RN stream 1 - integer(I8), dimension(n_save_state) :: save_state_2 ! optional arguments for restarting RN stream 2 + INTEGER(I8) :: seeds_in(2) + real(DP) :: RN1, RN2 ! Random numbers + integer(I8), dimension(n_save_state) :: save_state_1 ! optional arguments for restarting RN stream 1 + integer(I8), dimension(n_save_state) :: save_state_2 ! optional arguments for restarting RN stream 2 ! for initial temperature estimate - real(DP) :: acc_estim ! estimate of acceptance probability + real(DP) :: acc_estim ! estimate of acceptance probability ! depends on temperature ! goal: find a temperature such that acc_estim ~ 0.9 - real(DP), dimension(:,:), allocatable :: Energy ! dim(LEN,2) cost function values before (:,1) and + real(DP), dimension(:, :), allocatable :: Energy ! dim(LEN,2) cost function values before (:,1) and ! ! after (:,2) transition - n = size(paraset,1) + n = size(paraset, 1) ! either range or rangfunc has to be given - if ( present(prange) .eqv. present(prange_func) ) then - stop 'anneal: Either range or prange_func has to be given' + if (present(prange) .eqv. present(prange_func)) then + stop 'anneal: Either range or prange_func has to be given' end if if (present(samplesize)) then - if (samplesize .lt. Max(20_i4*n,250_i4)) then - !stop 'Input argument LEN must be greater than Max(250,20*N), N=number of parameters' - print*, 'WARNING (GetTemperature): ' - print*, 'Input argument samplesize should be greater than Max(250,20*N), N=number of parameters' - samplesize_in = samplesize - else - samplesize_in = samplesize - end if + if (samplesize .lt. Max(20_i4 * n, 250_i4)) then + !stop 'Input argument LEN must be greater than Max(250,20*N), N=number of parameters' + print*, 'WARNING (GetTemperature): ' + print*, 'Input argument samplesize should be greater than Max(250,20*N), N=number of parameters' + samplesize_in = samplesize + else + samplesize_in = samplesize + end if else - samplesize_in = Max(20_i4*n,250_i4) + samplesize_in = Max(20_i4 * n, 250_i4) end if if (present(maskpara)) then - if (count(maskpara) .eq. 0_i4) then - stop 'Input argument maskpara: At least one element has to be true' - else - maskpara_in = maskpara - end if + if (count(maskpara) .eq. 0_i4) then + stop 'Input argument maskpara: At least one element has to be true' + else + maskpara_in = maskpara + end if else - maskpara_in = .true. + maskpara_in = .true. end if if (present(seeds)) then - seeds_in = seeds + seeds_in = seeds else - ! Seeds depend on actual time - call get_timeseed(seeds_in) - print*,'temp: seeds(1)=', seeds_in(1) + ! Seeds depend on actual time + call get_timeseed(seeds_in) + print*, 'temp: seeds(1)=', seeds_in(1) end if if (present(printflag)) then - printflag_in = printflag + printflag_in = printflag else - printflag_in = .false. + printflag_in = .false. end if if (present(maxit)) then - if (maxit) then - maxit_in = -1._dp - else - maxit_in = 1._dp - end if + if (maxit) then + maxit_in = -1._dp + else + maxit_in = 1._dp + end if else - maxit_in = 1._dp + maxit_in = 1._dp end if - allocate(Energy(samplesize_in,2)) + allocate(Energy(samplesize_in, 2)) - allocate ( truepara(count(maskpara_in)) ) + allocate (truepara(count(maskpara_in))) idummy = 0_i4 - do i=1,N - if ( maskpara_in(i) ) then - idummy = idummy+1_i4 - truepara(idummy) = i - end if + do i = 1, N + if (maskpara_in(i)) then + idummy = idummy + 1_i4 + truepara(idummy) = i + end if end do - weight_in = 0.0_dp + weight_in = 0.0_dp if (present(weight)) then - where ( maskpara_in(:) ) - weight_in(:) = weight(:) - end where + where (maskpara_in(:)) + weight_in(:) = weight(:) + end where else - where ( maskpara_in(:) ) - weight_in(:) = 1.0_dp - end where + where (maskpara_in(:)) + weight_in(:) = 1.0_dp + end where end if ! scaling the weights - weight_in = weight_in/sum(weight_in) + weight_in = weight_in / sum(weight_in) ! cummulating the weights - do i=2,n - weight_in(i) = weight_in(i) + weight_in(i-1) + do i = 2, n + weight_in(i) = weight_in(i) + weight_in(i - 1) end do ! Setting up the RNG ! (1) Seeds depend on actual time or on input seeds ! (2) Initialize the streams - call xor4096(seeds_in(1), RN1, save_state=save_state_1) - call xor4096(seeds_in(2), RN2, save_state=save_state_2) + call xor4096(seeds_in(1), RN1, save_state = save_state_1) + call xor4096(seeds_in(2), RN2, save_state = save_state_2) seeds_in = 0_i8 ! (3) Now ready for calling gamma(:)%dmult = 1.0_dp - gamma(:)%new = paraset(:) - gamma(:)%old = paraset(:) - gamma(:)%best = paraset(:) - NormPhi = -9999.9_dp + gamma(:)%new = paraset(:) + gamma(:)%old = paraset(:) + gamma(:)%best = paraset(:) + NormPhi = -9999.9_dp - fo = cost(paraset) * maxit_in - if ( abs(fo) .lt. tiny(0.0_dp) ) fo = 0.0000001_dp * maxit_in + fo = cost(paraset, eval) * maxit_in + if (abs(fo) .lt. tiny(0.0_dp)) fo = 0.0000001_dp * maxit_in NormPhi = fo - fo = fo/NormPhi * maxit_in - - j=1 - loopSamplesize: do while (j .le. samplesize_in) - ! Generate a random subsequent state and evaluate its objective function - ! (1) Generate new parameter set - dR=1.0_DP - - ! (1a) Select parameter to be changed - call xor4096(seeds_in(1),RN1, save_state=save_state_1) - iPar=1_i4 - do while (weight_in(iPar) .lt. RN1) - iPar = iPar + 1_i4 - end do - - ! (1b) Generate new value of selected parameter - if ( present(prange_func) ) then - call prange_func(gamma(:)%old, iPar, iParRange ) - else - iParRange(1) = prange(iPar,1) - iParRange(2) = prange(iPar,2) - end if - gamma(iPar)%min = iParRange(1) - gamma(iPar)%max = iParRange(2) - call xor4096(seeds_in(2),RN2, save_state=save_state_2) - gamma(iPar)%new = parGen_anneal_dp( gamma(iPar)%old, gamma(iPar)%dMult*dR, & - gamma(iPar)%min, gamma(iPar)%max, RN2) - ! - ! (2) Calculate new objective function value and normalize it - fn = cost(gamma(:)%new) * maxit_in - coststatus = .true. - if (present(undef_funcval)) then - if ( abs(fn*maxit_in-undef_funcval) .lt. tiny(1.0_dp) ) then - coststatus = .false. - end if - end if - - feasible: if (coststatus) then ! feasible parameter set - fn = fn/normPhi - ! Save Energy states of feasible transitions - ! for adaption of optimal initial temperature - ! Walid Ben-Ameur: "Comput. the Initial Temperature of Sim. Annealing" - ! Comput. Opt. and App. 2004 - Energy(j,2) = fn ! E_max_t - Energy(j,1) = fo ! E_min_t - j=j+1 - end if feasible !valid parameter set + fo = fo / NormPhi * maxit_in + + j = 1 + loopSamplesize : do while (j .le. samplesize_in) + ! Generate a random subsequent state and evaluate its objective function + ! (1) Generate new parameter set + dR = 1.0_DP + + ! (1a) Select parameter to be changed + call xor4096(seeds_in(1), RN1, save_state = save_state_1) + iPar = 1_i4 + do while (weight_in(iPar) .lt. RN1) + iPar = iPar + 1_i4 + end do + + ! (1b) Generate new value of selected parameter + if (present(prange_func)) then + call prange_func(gamma(:)%old, iPar, iParRange) + else + iParRange(1) = prange(iPar, 1) + iParRange(2) = prange(iPar, 2) + end if + gamma(iPar)%min = iParRange(1) + gamma(iPar)%max = iParRange(2) + call xor4096(seeds_in(2), RN2, save_state = save_state_2) + gamma(iPar)%new = parGen_anneal_dp(gamma(iPar)%old, gamma(iPar)%dMult * dR, & + gamma(iPar)%min, gamma(iPar)%max, RN2) + ! + ! (2) Calculate new objective function value and normalize it + fn = cost(gamma(:)%new, eval) * maxit_in + coststatus = .true. + if (present(undef_funcval)) then + if (abs(fn * maxit_in - undef_funcval) .lt. tiny(1.0_dp)) then + coststatus = .false. + end if + end if + + feasible : if (coststatus) then ! feasible parameter set + fn = fn / normPhi + ! Save Energy states of feasible transitions + ! for adaption of optimal initial temperature + ! Walid Ben-Ameur: "Comput. the Initial Temperature of Sim. Annealing" + ! Comput. Opt. and App. 2004 + Energy(j, 2) = fn ! E_max_t + Energy(j, 1) = fo ! E_min_t + j = j + 1 + end if feasible !valid parameter set end do loopSamplesize ! estimation of the acceptance probability based on the random set |||| ! only if actual temperature (T) equals initial temperature (temp) T = maxval(Energy) - acc_estim = sum(exp(-(Energy(:,2)/T))) / sum(exp(-(Energy(:,1)/T))) + acc_estim = sum(exp(-(Energy(:, 2) / T))) / sum(exp(-(Energy(:, 1) / T))) if (printflag_in) then - print*, "acc_estimate = ", acc_estim, " ( T = ",T," )" + print*, "acc_estimate = ", acc_estim, " ( T = ", T, " )" end if - Do While ( (acc_estim .lt. 1.0_dp) .and. (abs(acc_estim - acc_goal) .gt. 0.0001_dp)) - T = T * (Log(acc_estim)/Log(acc_goal))**(0.5_dp) ! **(1.0/p) with p=1.0 - if ( all(T .gt. Energy(:,1)/709._dp) .and. all(T .gt. Energy(:,2)/709._dp) ) then - acc_estim = sum(exp(-(Energy(:,2)/T))) / sum(exp(-(Energy(:,1)/T))) - if (printflag_in) then - print*, "acc_estimate = ", acc_estim, " ( T = ",T," )" - end if - else - T = T/(Log(acc_estim)/Log(acc_goal))**(0.5_dp) - exit - end if + Do While ((acc_estim .lt. 1.0_dp) .and. (abs(acc_estim - acc_goal) .gt. 0.0001_dp)) + T = T * (Log(acc_estim) / Log(acc_goal))**(0.5_dp) ! **(1.0/p) with p=1.0 + if (all(T .gt. Energy(:, 1) / 709._dp) .and. all(T .gt. Energy(:, 2) / 709._dp)) then + acc_estim = sum(exp(-(Energy(:, 2) / T))) / sum(exp(-(Energy(:, 1) / T))) + if (printflag_in) then + print*, "acc_estimate = ", acc_estim, " ( T = ", T, " )" + end if + else + T = T / (Log(acc_estim) / Log(acc_goal))**(0.5_dp) + exit + end if end do GetTemperature_dp = T @@ -1372,43 +1360,43 @@ end function GetTemperature_dp !* PRIVATE FUNCTIONS * !*************************************************** - real(DP) function parGen_anneal_dp(old, dMax, oMin, oMax,RN) - use mo_kind, only: dp,i4 + real(DP) function parGen_anneal_dp(old, dMax, oMin, oMax, RN) + use mo_kind, only : dp, i4 implicit none - real(DP), intent(IN) :: old, dMax, oMin,oMax - real(DP), intent(IN) :: RN + real(DP), intent(IN) :: old, dMax, oMin, oMax + real(DP), intent(IN) :: RN ! local variables - real(DP) :: oi, ox, delta, dMaxScal - integer(I4) :: iDigit,iszero ! were intent IN before + real(DP) :: oi, ox, delta, dMaxScal + integer(I4) :: iDigit, iszero ! were intent IN before ! iszero = 1_i4 iDigit = 8_i4 - oi=oMin - ox=oMax + oi = oMin + ox = oMax ! scaling (new) dMaxScal = dMax * ABS(oMax - oMin) - if( ge(oi , ox) ) then - parGen_anneal_dp = (oi+ox)/2.0_DP + if(ge(oi, ox)) then + parGen_anneal_dp = (oi + ox) / 2.0_DP else - if ( (old - dMaxScal) > oi) oi = old - dMaxScal - if ( (old + dMaxScal) < ox) ox = old + dMaxScal - delta = (oi + RN * (ox - oi) ) - old - if ( delta > dMaxScal) delta = dMaxScal - if ( delta <-dMaxScal) delta = -dMaxScal - parGen_anneal_dp = old + dChange_dp(delta,iDigit,isZero) + if ((old - dMaxScal) > oi) oi = old - dMaxScal + if ((old + dMaxScal) < ox) ox = old + dMaxScal + delta = (oi + RN * (ox - oi)) - old + if (delta > dMaxScal) delta = dMaxScal + if (delta <-dMaxScal) delta = -dMaxScal + parGen_anneal_dp = old + dChange_dp(delta, iDigit, isZero) end if ! Parameter is bounded between Max and Min. ! Correction from Kumar and Luis if (parGen_anneal_dp < oMin) then - parGen_anneal_dp = oMin + parGen_anneal_dp = oMin elseif(parGen_anneal_dp > oMax)then - parGen_anneal_dp = oMax + parGen_anneal_dp = oMax end if end function parGen_anneal_dp @@ -1420,72 +1408,72 @@ real(DP) function parGen_dds_dp(old, perturb, oMin, oMax, RN) ! implicit none - real(DP), intent(IN) :: old, perturb, oMin, oMax - real(DP), intent(IN) :: RN + real(DP), intent(IN) :: old, perturb, oMin, oMax + real(DP), intent(IN) :: RN ! generating new value parGen_dds_dp = old + perturb * (oMax - oMin) * RN ! reflect one time and set to boundary value if (parGen_dds_dp .lt. oMin) then - parGen_dds_dp = oMin + ( oMin - parGen_dds_dp ) - if (parGen_dds_dp .gt. oMax) parGen_dds_dp = oMin + parGen_dds_dp = oMin + (oMin - parGen_dds_dp) + if (parGen_dds_dp .gt. oMax) parGen_dds_dp = oMin end if if (parGen_dds_dp .gt. oMax) then - parGen_dds_dp = oMax - ( parGen_dds_dp - oMax ) - if (parGen_dds_dp .lt. oMin) parGen_dds_dp = oMax + parGen_dds_dp = oMax - (parGen_dds_dp - oMax) + if (parGen_dds_dp .lt. oMin) parGen_dds_dp = oMax end if end function parGen_dds_dp - real(DP) function dChange_dp(delta,iDigit,isZero) - use mo_kind, only: i4,i8, dp + real(DP) function dChange_dp(delta, iDigit, isZero) + use mo_kind, only : i4, i8, dp implicit none - integer(I4), intent(IN) :: iDigit,isZero - real(DP), intent(IN) :: delta + integer(I4), intent(IN) :: iDigit, isZero + real(DP), intent(IN) :: delta ! local variables - integer(I4) :: ioszt - integer(I8) :: iDelta + integer(I4) :: ioszt + integer(I8) :: iDelta ioszt = 10**iDigit - iDelta = int( delta * real(ioszt,dp),i8 ) + iDelta = int(delta * real(ioszt, dp), i8) if(isZero == 1_i4) then - if(iDelta == 0_i8) then - if(delta < 0_i4) then - iDelta = -1_i8 - else - iDelta = 1_i8 - end if - end if + if(iDelta == 0_i8) then + if(delta < 0_i4) then + iDelta = -1_i8 + else + iDelta = 1_i8 + end if + end if end if - dChange_dp=real(iDelta,dp)/real(ioszt,dp) + dChange_dp = real(iDelta, dp) / real(ioszt, dp) end function dChange_dp subroutine generate_neighborhood_weight_dp(truepara, cum_weight, save_state_xor, iTotalCounter, & - nITERmax, neighborhood) + nITERmax, neighborhood) ! PURPOSE: ! generates a new neighborhood ! Tolson et al. (2007): STEP 3 ! - integer(i4), dimension(:), intent(in) :: truepara - real(dp), dimension(:), intent(in) :: cum_weight - integer(i8), dimension(n_save_state), intent(inout) :: save_state_xor - integer(i4), intent(in) :: iTotalCounter - integer(i4), intent(in) :: nITERmax - logical, dimension(size(cum_weight)), intent(out) :: neighborhood + integer(i4), dimension(:), intent(in) :: truepara + real(dp), dimension(:), intent(in) :: cum_weight + integer(i8), dimension(n_save_state), intent(inout) :: save_state_xor + integer(i4), intent(in) :: iTotalCounter + integer(i4), intent(in) :: nITERmax + logical, dimension(size(cum_weight)), intent(out) :: neighborhood ! local variables - integer(i4) :: ipar, npar - integer(i4) :: iSize, size_neighbor - real(dp) :: prob - real(dp) :: rn - real(dp) :: weight, norm + integer(i4) :: ipar, npar + integer(i4) :: iSize, size_neighbor + real(dp) :: prob + real(dp) :: rn + real(dp) :: weight, norm real(dp), dimension(size(cum_weight)) :: local_cum_weight - prob = 1.0_dp - Log(real(iTotalCounter,dp)) / Log(real(nITERmax,dp)) + prob = 1.0_dp - Log(real(iTotalCounter, dp)) / Log(real(nITERmax, dp)) neighborhood = .false. npar = size(cum_weight) @@ -1493,46 +1481,46 @@ subroutine generate_neighborhood_weight_dp(truepara, cum_weight, save_state_xor, ! How many parameters will be selected for neighborhood? size_neighbor = 0_i4 - do ipar=1, size(truepara) - call xor4096(0_i8, rn, save_state=save_state_xor) - if (rn < prob) then - size_neighbor = size_neighbor + 1_i4 - end if + do ipar = 1, size(truepara) + call xor4096(0_i8, rn, save_state = save_state_xor) + if (rn < prob) then + size_neighbor = size_neighbor + 1_i4 + end if end do ! at least one... size_neighbor = max(1_i4, size_neighbor) ! Which parameter will be used for neighborhood? do iSize = 1, size_neighbor - ! (1) generate RN - call xor4096(0_i8, rn, save_state=save_state_xor) - ! - ! (2) find location in cummulative distribution function - iPar = 1_i4 - do while (local_cum_weight(iPar) .lt. rn) - iPar = iPar + 1_i4 - end do - ! - ! (3) add parameter to neighborhood - neighborhood(iPar) = .true. - ! - ! (4) recalculate cummulative distribution function - ! (4.1) Which weight had iPar? - if (iPar .gt. 1_i4) then - weight = local_cum_weight(iPar) - local_cum_weight(iPar-1) - else - weight = local_cum_weight(1) - end if - ! (4.2) Substract this weight from cummulative array starting at iPar - local_cum_weight(iPar:nPar) = local_cum_weight(iPar:nPar) - weight - ! (4.3) Renormalize cummulative weight to one - if ( count(neighborhood) .lt. size(truepara) ) then - norm = 1.0_dp/local_cum_weight(nPar) - else - norm = 1.0_dp - end if - local_cum_weight(:) = local_cum_weight(:) * norm - ! + ! (1) generate RN + call xor4096(0_i8, rn, save_state = save_state_xor) + ! + ! (2) find location in cummulative distribution function + iPar = 1_i4 + do while (local_cum_weight(iPar) .lt. rn) + iPar = iPar + 1_i4 + end do + ! + ! (3) add parameter to neighborhood + neighborhood(iPar) = .true. + ! + ! (4) recalculate cummulative distribution function + ! (4.1) Which weight had iPar? + if (iPar .gt. 1_i4) then + weight = local_cum_weight(iPar) - local_cum_weight(iPar - 1) + else + weight = local_cum_weight(1) + end if + ! (4.2) Substract this weight from cummulative array starting at iPar + local_cum_weight(iPar : nPar) = local_cum_weight(iPar : nPar) - weight + ! (4.3) Renormalize cummulative weight to one + if (count(neighborhood) .lt. size(truepara)) then + norm = 1.0_dp / local_cum_weight(nPar) + else + norm = 1.0_dp + end if + local_cum_weight(:) = local_cum_weight(:) * norm + ! end do end subroutine generate_neighborhood_weight_dp diff --git a/src/lib/mo_append.f90 b/src/lib/mo_append.f90 index 396fc7ff..bff259a0 100644 --- a/src/lib/mo_append.f90 +++ b/src/lib/mo_append.f90 @@ -39,7 +39,7 @@ MODULE mo_append ! Copyright 2012-2013 Juliane Mai, Matthias Cuntz - USE mo_kind, only: i4, i8, sp, dp + USE mo_kind, only : i4, i8, sp, dp IMPLICIT NONE @@ -54,7 +54,7 @@ MODULE mo_append ! PURPOSE !> \brief Append (rows) scalars, vectors, and matrixes onto existing array. - + !> \details Appends one input to the rows of another, i.e. append !> on the first dimension.\n !> The input might be a scalar, a vector or a matrix.\n @@ -113,19 +113,18 @@ MODULE mo_append ! Modified Matthias Zink, Feb 2015 - added optional 'fill_value' for logical append ! Modified Stephan Thober, Jan 2017 - added 3d version for append - INTERFACE append - MODULE PROCEDURE append_i4_v_s, append_i4_v_v, append_i4_m_m, & - append_i8_v_s, append_i8_v_v, append_i8_m_m, & - append_i8_3d, & - append_sp_v_s, append_sp_v_v, append_sp_m_m, & - append_sp_3d, & - append_dp_v_s, append_dp_v_v, append_dp_m_m, & - append_dp_3d, & - append_char_v_s, append_char_v_v, append_char_m_m, & - append_char_3d, & - append_lgt_v_s, append_lgt_v_v, append_lgt_m_m, & - append_lgt_3d + MODULE PROCEDURE append_i4_v_s, append_i4_v_v, append_i4_m_m, & + append_i8_v_s, append_i8_v_v, append_i8_m_m, & + append_i8_3d, & + append_sp_v_s, append_sp_v_v, append_sp_m_m, & + append_sp_3d, & + append_dp_v_s, append_dp_v_v, append_dp_m_m, & + append_dp_3d, & + append_char_v_s, append_char_v_v, append_char_m_m, & + append_char_3d, & + append_lgt_v_s, append_lgt_v_v, append_lgt_m_m, & + append_lgt_3d END INTERFACE append ! ------------------------------------------------------------------ @@ -135,7 +134,7 @@ MODULE mo_append ! PURPOSE !> \brief Paste (columns) scalars, vectors, and matrixes onto existing array. - + !> \details Pastes one input to the columns of another, i.e. append !> on the second dimension.\n !> The input might be a scalar, a vector or a matrix.\n @@ -192,12 +191,12 @@ MODULE mo_append ! Modified Matthias Cuntz, Feb 2013 - logical append and paste INTERFACE paste - MODULE PROCEDURE paste_i4_m_s, paste_i4_m_v, paste_i4_m_m, & - paste_i8_m_s, paste_i8_m_v, paste_i8_m_m, & - paste_sp_m_s, paste_sp_m_v, paste_sp_m_m, & - paste_dp_m_s, paste_dp_m_v, paste_dp_m_m, & - paste_char_m_s, paste_char_m_v, paste_char_m_m, & - paste_lgt_m_s, paste_lgt_m_v, paste_lgt_m_m + MODULE PROCEDURE paste_i4_m_s, paste_i4_m_v, paste_i4_m_m, & + paste_i8_m_s, paste_i8_m_v, paste_i8_m_m, & + paste_sp_m_s, paste_sp_m_v, paste_sp_m_m, & + paste_dp_m_s, paste_dp_m_v, paste_dp_m_m, & + paste_char_m_s, paste_char_m_v, paste_char_m_m, & + paste_lgt_m_s, paste_lgt_m_v, paste_lgt_m_m END INTERFACE paste @@ -215,30 +214,30 @@ SUBROUTINE append_i4_v_s(vec1, sca2) implicit none - integer(i4), dimension(:), allocatable, intent(inout) :: vec1 - integer(i4), intent(in) :: sca2 + integer(i4), dimension(:), allocatable, intent(inout) :: vec1 + integer(i4), intent(in) :: sca2 ! local variables - integer(i4) :: n1, n2 - integer(i4), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 + integer(i4), dimension(:), allocatable :: tmp n2 = 1_i4 if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4) = sca2 + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4) = sca2 else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(1_i4) = sca2 + allocate(vec1(n2)) + vec1(1_i4) = sca2 end if END SUBROUTINE append_i4_v_s @@ -247,30 +246,30 @@ SUBROUTINE append_i4_v_v(vec1, vec2) implicit none - integer(i4), dimension(:), allocatable, intent(inout) :: vec1 - integer(i4), dimension(:), intent(in) :: vec2 + integer(i4), dimension(:), allocatable, intent(inout) :: vec1 + integer(i4), dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: n1, n2 ! length of vectors - integer(i4), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 ! length of vectors + integer(i4), dimension(:), allocatable :: tmp n2 = size(vec2) if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + allocate(vec1(n2)) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) end if END SUBROUTINE append_i4_v_v @@ -279,57 +278,57 @@ SUBROUTINE append_i4_m_m(mat1, mat2, fill_value) implicit none - integer(i4), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i4), dimension(:,:), intent(in) :: mat2 - integer(i4), optional, intent(in) :: fill_value + integer(i4), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i4), dimension(:, :), intent(in) :: mat2 + integer(i4), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - - if ((n1 .ne. n2) .and. .not. present(fill_value) ) then - print*, 'append: columns of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( n1 .eq. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2,:) = mat2(1:m2,:) - end if - - if ( n1 .gt. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2, 1:n2) = mat2(1:m2,:) - mat1(m1+1_i4:m1+m2,n2+1:n1) = fill_value - end if - - if ( n1 .lt. n2 ) then - allocate(mat1(m1+m2,n2)) - mat1( 1:m1, 1:n1) = tmp(1:m1,:) - mat1( 1:m1, n1+1:n2) = fill_value - mat1(m1+1_i4:m1+m2, : ) = mat2(1:m2,:) - end if - - else - n1 = 0_i4 - - allocate(mat1(m2,n2)) - mat1 = mat2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + + if ((n1 .ne. n2) .and. .not. present(fill_value)) then + print*, 'append: columns of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (n1 .eq. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + if (n1 .gt. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, 1 : n2) = mat2(1 : m2, :) + mat1(m1 + 1_i4 : m1 + m2, n2 + 1 : n1) = fill_value + end if + + if (n1 .lt. n2) then + allocate(mat1(m1 + m2, n2)) + mat1(1 : m1, 1 : n1) = tmp(1 : m1, :) + mat1(1 : m1, n1 + 1 : n2) = fill_value + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + else + n1 = 0_i4 + + allocate(mat1(m2, n2)) + mat1 = mat2 end if END SUBROUTINE append_i4_m_m @@ -338,47 +337,47 @@ SUBROUTINE append_i4_3d(mat1, mat2, fill_value) implicit none - integer(i4), dimension(:,:,:), allocatable, intent(inout) :: mat1 - integer(i4), dimension(:,:,:), intent(in) :: mat2 - integer(i4), optional, intent(in) :: fill_value + integer(i4), dimension(:, :, :), allocatable, intent(inout) :: mat1 + integer(i4), dimension(:, :, :), intent(in) :: mat2 + integer(i4), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4) :: j1, j2 ! dim3 of matrixes: something else - integer(i4), dimension(:,:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4) :: j1, j2 ! dim3 of matrixes: something else + integer(i4), dimension(:, :, :), allocatable :: tmp if (present(fill_value)) print*, '***warning: fill_value is ignored in append_i4_3d' - - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns - j2 = size(mat2,3) ! something else + + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns + j2 = size(mat2, 3) ! something else if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - j1 = size(mat1,3) ! something else + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + j1 = size(mat1, 3) ! something else - if ((n1 .ne. n2) .or. (j1 .ne. j2) ) then - print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & - // '(',m1,',',n1,',',j1,') and (',m2,',',n2,',',j2,')' - STOP - end if + if ((n1 .ne. n2) .or. (j1 .ne. j2)) then + print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & + // '(', m1, ',', n1, ',', j1, ') and (', m2, ',', n2, ',', j2, ')' + STOP + end if - ! save mat1 - allocate(tmp(m1,n1,j1)) - tmp=mat1 - deallocate(mat1) + ! save mat1 + allocate(tmp(m1, n1, j1)) + tmp = mat1 + deallocate(mat1) - allocate(mat1(m1+m2,n1,j1)) - mat1(1:m1,:,:) = tmp(1:m1,:,:) - mat1(m1+1_i4:m1+m2,:,:) = mat2(1:m2,:,:) + allocate(mat1(m1 + m2, n1, j1)) + mat1(1 : m1, :, :) = tmp(1 : m1, :, :) + mat1(m1 + 1_i4 : m1 + m2, :, :) = mat2(1 : m2, :, :) else - allocate(mat1(m2,n2,j2)) - mat1 = mat2 - + allocate(mat1(m2, n2, j2)) + mat1 = mat2 + end if END SUBROUTINE append_i4_3d @@ -387,30 +386,30 @@ SUBROUTINE append_i8_v_s(vec1, sca2) implicit none - integer(i8), dimension(:), allocatable, intent(inout) :: vec1 - integer(i8), intent(in) :: sca2 + integer(i8), dimension(:), allocatable, intent(inout) :: vec1 + integer(i8), intent(in) :: sca2 ! local variables - integer(i4) :: n1, n2 - integer(i8), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 + integer(i8), dimension(:), allocatable :: tmp n2 = 1_i4 if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4) = sca2 + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4) = sca2 else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(1_i4) = sca2 + allocate(vec1(n2)) + vec1(1_i4) = sca2 end if END SUBROUTINE append_i8_v_s @@ -419,30 +418,30 @@ SUBROUTINE append_i8_v_v(vec1, vec2) implicit none - integer(i8), dimension(:), allocatable, intent(inout) :: vec1 - integer(i8), dimension(:), intent(in) :: vec2 + integer(i8), dimension(:), allocatable, intent(inout) :: vec1 + integer(i8), dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: n1, n2 ! length of vectors - integer(i8), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 ! length of vectors + integer(i8), dimension(:), allocatable :: tmp n2 = size(vec2) if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + allocate(vec1(n2)) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) end if END SUBROUTINE append_i8_v_v @@ -451,57 +450,57 @@ SUBROUTINE append_i8_m_m(mat1, mat2, fill_value) implicit none - integer(i8), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i8), dimension(:,:), intent(in) :: mat2 - integer(i8), optional, intent(in) :: fill_value - + integer(i8), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i8), dimension(:, :), intent(in) :: mat2 + integer(i8), optional, intent(in) :: fill_value + ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i8), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i8), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - - if ((n1 .ne. n2) .and. .not. present(fill_value) ) then - print*, 'append: columns of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( n1 .eq. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2,:) = mat2(1:m2,:) - end if - - if ( n1 .gt. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2, 1:n2) = mat2(1:m2,:) - mat1(m1+1_i4:m1+m2,n2+1:n1) = fill_value - end if - - if ( n1 .lt. n2 ) then - allocate(mat1(m1+m2,n2)) - mat1( 1:m1, 1:n1) = tmp(1:m1,:) - mat1( 1:m1, n1+1:n2) = fill_value - mat1(m1+1_i4:m1+m2, : ) = mat2(1:m2,:) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + + if ((n1 .ne. n2) .and. .not. present(fill_value)) then + print*, 'append: columns of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (n1 .eq. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + if (n1 .gt. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, 1 : n2) = mat2(1 : m2, :) + mat1(m1 + 1_i4 : m1 + m2, n2 + 1 : n1) = fill_value + end if + + if (n1 .lt. n2) then + allocate(mat1(m1 + m2, n2)) + mat1(1 : m1, 1 : n1) = tmp(1 : m1, :) + mat1(1 : m1, n1 + 1 : n2) = fill_value + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if else - n1 = 0_i4 + n1 = 0_i4 - allocate(mat1(m2,n2)) - mat1 = mat2 + allocate(mat1(m2, n2)) + mat1 = mat2 end if END SUBROUTINE append_i8_m_m @@ -510,47 +509,47 @@ SUBROUTINE append_i8_3d(mat1, mat2, fill_value) implicit none - integer(i8), dimension(:,:,:), allocatable, intent(inout) :: mat1 - integer(i8), dimension(:,:,:), intent(in) :: mat2 - integer(i8), optional, intent(in) :: fill_value + integer(i8), dimension(:, :, :), allocatable, intent(inout) :: mat1 + integer(i8), dimension(:, :, :), intent(in) :: mat2 + integer(i8), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4) :: j1, j2 ! dim3 of matrixes: something else - integer(i8), dimension(:,:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4) :: j1, j2 ! dim3 of matrixes: something else + integer(i8), dimension(:, :, :), allocatable :: tmp if (present(fill_value)) print*, '***warning: fill_value is ignored in append_i8_3d' - - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns - j2 = size(mat2,3) ! something else + + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns + j2 = size(mat2, 3) ! something else if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - j1 = size(mat1,3) ! something else + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + j1 = size(mat1, 3) ! something else - if ((n1 .ne. n2) .or. (j1 .ne. j2) ) then - print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & - // '(',m1,',',n1,',',j1,') and (',m2,',',n2,',',j2,')' - STOP - end if + if ((n1 .ne. n2) .or. (j1 .ne. j2)) then + print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & + // '(', m1, ',', n1, ',', j1, ') and (', m2, ',', n2, ',', j2, ')' + STOP + end if - ! save mat1 - allocate(tmp(m1,n1,j1)) - tmp=mat1 - deallocate(mat1) + ! save mat1 + allocate(tmp(m1, n1, j1)) + tmp = mat1 + deallocate(mat1) - allocate(mat1(m1+m2,n1,j1)) - mat1(1:m1,:,:) = tmp(1:m1,:,:) - mat1(m1+1_i4:m1+m2,:,:) = mat2(1:m2,:,:) + allocate(mat1(m1 + m2, n1, j1)) + mat1(1 : m1, :, :) = tmp(1 : m1, :, :) + mat1(m1 + 1_i4 : m1 + m2, :, :) = mat2(1 : m2, :, :) else - allocate(mat1(m2,n2,j2)) - mat1 = mat2 - + allocate(mat1(m2, n2, j2)) + mat1 = mat2 + end if END SUBROUTINE append_i8_3d @@ -559,30 +558,30 @@ SUBROUTINE append_sp_v_s(vec1, sca2) implicit none - real(sp), dimension(:), allocatable, intent(inout) :: vec1 - real(sp), intent(in) :: sca2 + real(sp), dimension(:), allocatable, intent(inout) :: vec1 + real(sp), intent(in) :: sca2 ! local variables - integer(i4) :: n1, n2 - real(sp), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 + real(sp), dimension(:), allocatable :: tmp n2 = 1_i4 if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4) = sca2 + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4) = sca2 else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(1_i4) = sca2 + allocate(vec1(n2)) + vec1(1_i4) = sca2 end if END SUBROUTINE append_sp_v_s @@ -591,30 +590,30 @@ SUBROUTINE append_sp_v_v(vec1, vec2) implicit none - real(sp), dimension(:), allocatable, intent(inout) :: vec1 - real(sp), dimension(:), intent(in) :: vec2 + real(sp), dimension(:), allocatable, intent(inout) :: vec1 + real(sp), dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: n1, n2 ! length of vectors - real(sp), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 ! length of vectors + real(sp), dimension(:), allocatable :: tmp n2 = size(vec2) if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + allocate(vec1(n2)) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) end if END SUBROUTINE append_sp_v_v @@ -623,57 +622,57 @@ SUBROUTINE append_sp_m_m(mat1, mat2, fill_value) implicit none - real(sp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(sp), dimension(:,:), intent(in) :: mat2 - real(sp), optional, intent(in) :: fill_value + real(sp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(sp), dimension(:, :), intent(in) :: mat2 + real(sp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - real(sp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + real(sp), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - - if ((n1 .ne. n2) .and. .not. present(fill_value) ) then - print*, 'append: columns of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( n1 .eq. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2,:) = mat2(1:m2,:) - end if - - if ( n1 .gt. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2, 1:n2) = mat2(1:m2,:) - mat1(m1+1_i4:m1+m2,n2+1:n1) = fill_value - end if - - if ( n1 .lt. n2 ) then - allocate(mat1(m1+m2,n2)) - mat1( 1:m1, 1:n1) = tmp(1:m1,:) - mat1( 1:m1, n1+1:n2) = fill_value - mat1(m1+1_i4:m1+m2, : ) = mat2(1:m2,:) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + + if ((n1 .ne. n2) .and. .not. present(fill_value)) then + print*, 'append: columns of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (n1 .eq. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + if (n1 .gt. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, 1 : n2) = mat2(1 : m2, :) + mat1(m1 + 1_i4 : m1 + m2, n2 + 1 : n1) = fill_value + end if + + if (n1 .lt. n2) then + allocate(mat1(m1 + m2, n2)) + mat1(1 : m1, 1 : n1) = tmp(1 : m1, :) + mat1(1 : m1, n1 + 1 : n2) = fill_value + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if else - n1 = 0_i4 + n1 = 0_i4 - allocate(mat1(m2,n2)) - mat1 = mat2 + allocate(mat1(m2, n2)) + mat1 = mat2 end if END SUBROUTINE append_sp_m_m @@ -682,47 +681,47 @@ SUBROUTINE append_sp_3d(mat1, mat2, fill_value) implicit none - real(sp), dimension(:,:,:), allocatable, intent(inout) :: mat1 - real(sp), dimension(:,:,:), intent(in) :: mat2 - real(sp), optional, intent(in) :: fill_value + real(sp), dimension(:, :, :), allocatable, intent(inout) :: mat1 + real(sp), dimension(:, :, :), intent(in) :: mat2 + real(sp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4) :: j1, j2 ! dim3 of matrixes: something else - real(sp), dimension(:,:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4) :: j1, j2 ! dim3 of matrixes: something else + real(sp), dimension(:, :, :), allocatable :: tmp if (present(fill_value)) print*, '***warning: fill_value is ignored in append_sp_3d' - - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns - j2 = size(mat2,3) ! something else + + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns + j2 = size(mat2, 3) ! something else if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - j1 = size(mat1,3) ! something else + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + j1 = size(mat1, 3) ! something else - if ((n1 .ne. n2) .or. (j1 .ne. j2) ) then - print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & - // '(',m1,',',n1,',',j1,') and (',m2,',',n2,',',j2,')' - STOP - end if + if ((n1 .ne. n2) .or. (j1 .ne. j2)) then + print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & + // '(', m1, ',', n1, ',', j1, ') and (', m2, ',', n2, ',', j2, ')' + STOP + end if - ! save mat1 - allocate(tmp(m1,n1,j1)) - tmp=mat1 - deallocate(mat1) + ! save mat1 + allocate(tmp(m1, n1, j1)) + tmp = mat1 + deallocate(mat1) - allocate(mat1(m1+m2,n1,j1)) - mat1(1:m1,:,:) = tmp(1:m1,:,:) - mat1(m1+1_i4:m1+m2,:,:) = mat2(1:m2,:,:) + allocate(mat1(m1 + m2, n1, j1)) + mat1(1 : m1, :, :) = tmp(1 : m1, :, :) + mat1(m1 + 1_i4 : m1 + m2, :, :) = mat2(1 : m2, :, :) else - allocate(mat1(m2,n2,j2)) - mat1 = mat2 - + allocate(mat1(m2, n2, j2)) + mat1 = mat2 + end if END SUBROUTINE append_sp_3d @@ -731,30 +730,30 @@ SUBROUTINE append_dp_v_s(vec1, sca2) implicit none - real(dp), dimension(:), allocatable, intent(inout) :: vec1 - real(dp), intent(in) :: sca2 + real(dp), dimension(:), allocatable, intent(inout) :: vec1 + real(dp), intent(in) :: sca2 ! local variables - integer(i4) :: n1, n2 - real(dp), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 + real(dp), dimension(:), allocatable :: tmp n2 = 1_i4 if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4) = sca2 + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4) = sca2 else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(1_i4) = sca2 + allocate(vec1(n2)) + vec1(1_i4) = sca2 end if END SUBROUTINE append_dp_v_s @@ -763,30 +762,30 @@ SUBROUTINE append_dp_v_v(vec1, vec2) implicit none - real(dp), dimension(:), allocatable, intent(inout) :: vec1 - real(dp), dimension(:), intent(in) :: vec2 + real(dp), dimension(:), allocatable, intent(inout) :: vec1 + real(dp), dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: n1, n2 ! length of vectors - real(dp), dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 ! length of vectors + real(dp), dimension(:), allocatable :: tmp n2 = size(vec2) if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + allocate(vec1(n2)) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) end if END SUBROUTINE append_dp_v_v @@ -795,57 +794,57 @@ SUBROUTINE append_dp_m_m(mat1, mat2, fill_value) implicit none - real(dp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(dp), dimension(:,:), intent(in) :: mat2 - real(dp), optional, intent(in) :: fill_value + real(dp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(dp), dimension(:, :), intent(in) :: mat2 + real(dp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - real(dp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + real(dp), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - - if ((n1 .ne. n2) .and. .not. present(fill_value) ) then - print*, 'append: columns of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( n1 .eq. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2,:) = mat2(1:m2,:) - end if - - if ( n1 .gt. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2, 1:n2) = mat2(1:m2,:) - mat1(m1+1_i4:m1+m2,n2+1:n1) = fill_value - end if - - if ( n1 .lt. n2 ) then - allocate(mat1(m1+m2,n2)) - mat1( 1:m1, 1:n1) = tmp(1:m1,:) - mat1( 1:m1, n1+1:n2) = fill_value - mat1(m1+1_i4:m1+m2, : ) = mat2(1:m2,:) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + + if ((n1 .ne. n2) .and. .not. present(fill_value)) then + print*, 'append: columns of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (n1 .eq. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + if (n1 .gt. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, 1 : n2) = mat2(1 : m2, :) + mat1(m1 + 1_i4 : m1 + m2, n2 + 1 : n1) = fill_value + end if + + if (n1 .lt. n2) then + allocate(mat1(m1 + m2, n2)) + mat1(1 : m1, 1 : n1) = tmp(1 : m1, :) + mat1(1 : m1, n1 + 1 : n2) = fill_value + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if else - n1 = 0_i4 + n1 = 0_i4 - allocate(mat1(m2,n2)) - mat1 = mat2 + allocate(mat1(m2, n2)) + mat1 = mat2 end if END SUBROUTINE append_dp_m_m @@ -854,47 +853,47 @@ SUBROUTINE append_dp_3d(mat1, mat2, fill_value) implicit none - real(dp), dimension(:,:,:), allocatable, intent(inout) :: mat1 - real(dp), dimension(:,:,:), intent(in) :: mat2 - real(dp), optional, intent(in) :: fill_value + real(dp), dimension(:, :, :), allocatable, intent(inout) :: mat1 + real(dp), dimension(:, :, :), intent(in) :: mat2 + real(dp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4) :: j1, j2 ! dim3 of matrixes: something else - real(dp), dimension(:,:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4) :: j1, j2 ! dim3 of matrixes: something else + real(dp), dimension(:, :, :), allocatable :: tmp if (present(fill_value)) print*, '***warning: fill_value is ignored in append_dp_3d' - - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns - j2 = size(mat2,3) ! something else + + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns + j2 = size(mat2, 3) ! something else if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - j1 = size(mat1,3) ! something else + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + j1 = size(mat1, 3) ! something else - if ((n1 .ne. n2) .or. (j1 .ne. j2) ) then - print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & - // '(',m1,',',n1,',',j1,') and (',m2,',',n2,',',j2,')' - STOP - end if + if ((n1 .ne. n2) .or. (j1 .ne. j2)) then + print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & + // '(', m1, ',', n1, ',', j1, ') and (', m2, ',', n2, ',', j2, ')' + STOP + end if - ! save mat1 - allocate(tmp(m1,n1,j1)) - tmp=mat1 - deallocate(mat1) + ! save mat1 + allocate(tmp(m1, n1, j1)) + tmp = mat1 + deallocate(mat1) - allocate(mat1(m1+m2,n1,j1)) - mat1(1:m1,:,:) = tmp(1:m1,:,:) - mat1(m1+1_i4:m1+m2,:,:) = mat2(1:m2,:,:) + allocate(mat1(m1 + m2, n1, j1)) + mat1(1 : m1, :, :) = tmp(1 : m1, :, :) + mat1(m1 + 1_i4 : m1 + m2, :, :) = mat2(1 : m2, :, :) else - allocate(mat1(m2,n2,j2)) - mat1 = mat2 - + allocate(mat1(m2, n2, j2)) + mat1 = mat2 + end if END SUBROUTINE append_dp_3d @@ -903,60 +902,60 @@ SUBROUTINE append_char_v_s(vec1, sca2) implicit none - character(len=*), dimension(:), allocatable, intent(inout) :: vec1 - character(len=*), intent(in) :: sca2 + character(len = *), dimension(:), allocatable, intent(inout) :: vec1 + character(len = *), intent(in) :: sca2 ! local variables - integer(i4) :: n1, n2 + integer(i4) :: n1, n2 character(len(vec1)), dimension(:), allocatable :: tmp n2 = 1_i4 if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4) = sca2 + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4) = sca2 else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(1_i4) = sca2 + allocate(vec1(n2)) + vec1(1_i4) = sca2 end if END SUBROUTINE append_char_v_s SUBROUTINE append_char_v_v(vec1, vec2) - character(len=*), dimension(:), allocatable, intent(inout) :: vec1 - character(len=*), dimension(:), intent(in) :: vec2 + character(len = *), dimension(:), allocatable, intent(inout) :: vec1 + character(len = *), dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: n1, n2 + integer(i4) :: n1, n2 character(len(vec1)), dimension(:), allocatable :: tmp n2 = size(vec2) if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + allocate(vec1(n2)) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) end if END SUBROUTINE append_char_v_v @@ -965,57 +964,57 @@ SUBROUTINE append_char_m_m(mat1, mat2, fill_value) implicit none - character(len=*), dimension(:,:), allocatable, intent(inout) :: mat1 - character(len=*), dimension(:,:), intent(in) :: mat2 - character(len=*), optional, intent(in) :: fill_value + character(len = *), dimension(:, :), allocatable, intent(inout) :: mat1 + character(len = *), dimension(:, :), intent(in) :: mat2 + character(len = *), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - character(len(mat1)), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + character(len(mat1)), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - - if ((n1 .ne. n2) .and. .not. present(fill_value) ) then - print*, 'append: columns of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( n1 .eq. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2,:) = mat2(1:m2,:) - end if - - if ( n1 .gt. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2, 1:n2) = mat2(1:m2,:) - mat1(m1+1_i4:m1+m2,n2+1:n1) = fill_value - end if - - if ( n1 .lt. n2 ) then - allocate(mat1(m1+m2,n2)) - mat1( 1:m1, 1:n1) = tmp(1:m1,:) - mat1( 1:m1, n1+1:n2) = fill_value - mat1(m1+1_i4:m1+m2, : ) = mat2(1:m2,:) - end if - - else - n1 = 0_i4 - - allocate(mat1(m2,n2)) - mat1 = mat2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + + if ((n1 .ne. n2) .and. .not. present(fill_value)) then + print*, 'append: columns of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (n1 .eq. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + if (n1 .gt. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, 1 : n2) = mat2(1 : m2, :) + mat1(m1 + 1_i4 : m1 + m2, n2 + 1 : n1) = fill_value + end if + + if (n1 .lt. n2) then + allocate(mat1(m1 + m2, n2)) + mat1(1 : m1, 1 : n1) = tmp(1 : m1, :) + mat1(1 : m1, n1 + 1 : n2) = fill_value + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + else + n1 = 0_i4 + + allocate(mat1(m2, n2)) + mat1 = mat2 end if END SUBROUTINE append_char_m_m @@ -1024,47 +1023,47 @@ SUBROUTINE append_char_3d(mat1, mat2, fill_value) implicit none - character(len=*), dimension(:,:,:), allocatable, intent(inout) :: mat1 - character(len=*), dimension(:,:,:), intent(in) :: mat2 - character(len=*), optional, intent(in) :: fill_value + character(len = *), dimension(:, :, :), allocatable, intent(inout) :: mat1 + character(len = *), dimension(:, :, :), intent(in) :: mat2 + character(len = *), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4) :: j1, j2 ! dim3 of matrixes: something else - character(len(mat1)), dimension(:,:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4) :: j1, j2 ! dim3 of matrixes: something else + character(len(mat1)), dimension(:, :, :), allocatable :: tmp if (present(fill_value)) print*, '***warning: fill_value is ignored in append_i8_3d' - - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns - j2 = size(mat2,3) ! something else + + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns + j2 = size(mat2, 3) ! something else if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - j1 = size(mat1,3) ! something else + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + j1 = size(mat1, 3) ! something else - if ((n1 .ne. n2) .or. (j1 .ne. j2) ) then - print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & - // '(',m1,',',n1,',',j1,') and (',m2,',',n2,',',j2,')' - STOP - end if + if ((n1 .ne. n2) .or. (j1 .ne. j2)) then + print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & + // '(', m1, ',', n1, ',', j1, ') and (', m2, ',', n2, ',', j2, ')' + STOP + end if - ! save mat1 - allocate(tmp(m1,n1,j1)) - tmp=mat1 - deallocate(mat1) + ! save mat1 + allocate(tmp(m1, n1, j1)) + tmp = mat1 + deallocate(mat1) - allocate(mat1(m1+m2,n1,j1)) - mat1(1:m1,:,:) = tmp(1:m1,:,:) - mat1(m1+1_i4:m1+m2,:,:) = mat2(1:m2,:,:) + allocate(mat1(m1 + m2, n1, j1)) + mat1(1 : m1, :, :) = tmp(1 : m1, :, :) + mat1(m1 + 1_i4 : m1 + m2, :, :) = mat2(1 : m2, :, :) else - allocate(mat1(m2,n2,j2)) - mat1 = mat2 - + allocate(mat1(m2, n2, j2)) + mat1 = mat2 + end if END SUBROUTINE append_char_3d @@ -1073,30 +1072,30 @@ SUBROUTINE append_lgt_v_s(vec1, sca2) implicit none - logical, dimension(:), allocatable, intent(inout) :: vec1 - logical, intent(in) :: sca2 + logical, dimension(:), allocatable, intent(inout) :: vec1 + logical, intent(in) :: sca2 ! local variables - integer(i4) :: n1, n2 - logical, dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 + logical, dimension(:), allocatable :: tmp n2 = 1_i4 if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4) = sca2 + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4) = sca2 else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(1_i4) = sca2 + allocate(vec1(n2)) + vec1(1_i4) = sca2 end if END SUBROUTINE append_lgt_v_s @@ -1105,30 +1104,30 @@ SUBROUTINE append_lgt_v_v(vec1, vec2) implicit none - logical, dimension(:), allocatable, intent(inout) :: vec1 - logical, dimension(:), intent(in) :: vec2 + logical, dimension(:), allocatable, intent(inout) :: vec1 + logical, dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: n1, n2 ! length of vectors - logical, dimension(:), allocatable :: tmp + integer(i4) :: n1, n2 ! length of vectors + logical, dimension(:), allocatable :: tmp n2 = size(vec2) if (allocated(vec1)) then - n1 = size(vec1) - ! save vec1 - allocate(tmp(n1)) - tmp=vec1 - deallocate(vec1) - - allocate(vec1(n1+n2)) - vec1(1:n1) = tmp(1:n1) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + n1 = size(vec1) + ! save vec1 + allocate(tmp(n1)) + tmp = vec1 + deallocate(vec1) + + allocate(vec1(n1 + n2)) + vec1(1 : n1) = tmp(1 : n1) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) else - n1 = 0_i4 + n1 = 0_i4 - allocate(vec1(n2)) - vec1(n1+1_i4:n1+n2) = vec2(1:n2) + allocate(vec1(n2)) + vec1(n1 + 1_i4 : n1 + n2) = vec2(1 : n2) end if END SUBROUTINE append_lgt_v_v @@ -1137,57 +1136,57 @@ SUBROUTINE append_lgt_m_m(mat1, mat2, fill_value) implicit none - logical, dimension(:,:), allocatable, intent(inout) :: mat1 - logical, dimension(:,:), intent(in) :: mat2 - logical, optional, intent(in) :: fill_value - + logical, dimension(:, :), allocatable, intent(inout) :: mat1 + logical, dimension(:, :), intent(in) :: mat2 + logical, optional, intent(in) :: fill_value + ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - logical, dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + logical, dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - - if ( (n1 .ne. n2) .and. .not. present(fill_value) ) then - print*, 'append: columns of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( n1 .eq. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2,:) = mat2(1:m2,:) - end if - - if ( n1 .gt. n2 ) then - allocate(mat1(m1+m2,n1)) - mat1(1:m1,:) = tmp(1:m1,:) - mat1(m1+1_i4:m1+m2, 1:n2) = mat2(1:m2,:) - mat1(m1+1_i4:m1+m2,n2+1:n1) = fill_value - end if - - if ( n1 .lt. n2 ) then - allocate(mat1(m1+m2,n2)) - mat1( 1:m1, 1:n1) = tmp(1:m1,:) - mat1( 1:m1, n1+1:n2) = fill_value - mat1(m1+1_i4:m1+m2, : ) = mat2(1:m2,:) - end if - + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + + if ((n1 .ne. n2) .and. .not. present(fill_value)) then + print*, 'append: columns of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (n1 .eq. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + + if (n1 .gt. n2) then + allocate(mat1(m1 + m2, n1)) + mat1(1 : m1, :) = tmp(1 : m1, :) + mat1(m1 + 1_i4 : m1 + m2, 1 : n2) = mat2(1 : m2, :) + mat1(m1 + 1_i4 : m1 + m2, n2 + 1 : n1) = fill_value + end if + + if (n1 .lt. n2) then + allocate(mat1(m1 + m2, n2)) + mat1(1 : m1, 1 : n1) = tmp(1 : m1, :) + mat1(1 : m1, n1 + 1 : n2) = fill_value + mat1(m1 + 1_i4 : m1 + m2, :) = mat2(1 : m2, :) + end if + else - n1 = 0_i4 + n1 = 0_i4 - allocate(mat1(m2,n2)) - mat1 = mat2 + allocate(mat1(m2, n2)) + mat1 = mat2 end if END SUBROUTINE append_lgt_m_m @@ -1196,47 +1195,47 @@ SUBROUTINE append_lgt_3d(mat1, mat2, fill_value) implicit none - logical, dimension(:,:,:), allocatable, intent(inout) :: mat1 - logical, dimension(:,:,:), intent(in) :: mat2 - logical, optional, intent(in) :: fill_value + logical, dimension(:, :, :), allocatable, intent(inout) :: mat1 + logical, dimension(:, :, :), intent(in) :: mat2 + logical, optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes: rows - integer(i4) :: n1, n2 ! dim2 of matrixes: columns - integer(i4) :: j1, j2 ! dim3 of matrixes: something else - logical, dimension(:,:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes: rows + integer(i4) :: n1, n2 ! dim2 of matrixes: columns + integer(i4) :: j1, j2 ! dim3 of matrixes: something else + logical, dimension(:, :, :), allocatable :: tmp if (present(fill_value)) print*, '***warning: fill_value is ignored in append_i8_3d' - - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns - j2 = size(mat2,3) ! something else + + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns + j2 = size(mat2, 3) ! something else if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - j1 = size(mat1,3) ! something else + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + j1 = size(mat1, 3) ! something else - if ((n1 .ne. n2) .or. (j1 .ne. j2) ) then - print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & - // '(',m1,',',n1,',',j1,') and (',m2,',',n2,',',j2,')' - STOP - end if + if ((n1 .ne. n2) .or. (j1 .ne. j2)) then + print*, 'append: size mismatch: dim 2 and 3 of matrix1 and matrix2 are unequal : ' & + // '(', m1, ',', n1, ',', j1, ') and (', m2, ',', n2, ',', j2, ')' + STOP + end if - ! save mat1 - allocate(tmp(m1,n1,j1)) - tmp=mat1 - deallocate(mat1) + ! save mat1 + allocate(tmp(m1, n1, j1)) + tmp = mat1 + deallocate(mat1) - allocate(mat1(m1+m2,n1,j1)) - mat1(1:m1,:,:) = tmp(1:m1,:,:) - mat1(m1+1_i4:m1+m2,:,:) = mat2(1:m2,:,:) + allocate(mat1(m1 + m2, n1, j1)) + mat1(1 : m1, :, :) = tmp(1 : m1, :, :) + mat1(m1 + 1_i4 : m1 + m2, :, :) = mat2(1 : m2, :, :) else - allocate(mat1(m2,n2,j2)) - mat1 = mat2 - + allocate(mat1(m2, n2, j2)) + mat1 = mat2 + end if END SUBROUTINE append_lgt_3d @@ -1247,32 +1246,32 @@ SUBROUTINE paste_i4_m_s(mat1, sca2) implicit none - integer(i4), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i4), intent(in) :: sca2 + integer(i4), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i4), intent(in) :: sca2 ! local variables - integer(i4) :: m1 ! dim1 of matrix - integer(i4) :: n1 ! dim2 of matrix - integer(i4), dimension(:,:), allocatable :: tmp + integer(i4) :: m1 ! dim1 of matrix + integer(i4) :: n1 ! dim2 of matrix + integer(i4), dimension(:, :), allocatable :: tmp if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. 1_i4) then - print*, 'paste: scalar paste to matrix only works with one-line matrix' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(1_i4,n1+1_i4)) - mat1(1,1:n1) = tmp(1,1:n1) - mat1(1,n1+1_i4) = sca2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. 1_i4) then + print*, 'paste: scalar paste to matrix only works with one-line matrix' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(1_i4, n1 + 1_i4)) + mat1(1, 1 : n1) = tmp(1, 1 : n1) + mat1(1, n1 + 1_i4) = sca2 else - allocate(mat1(1_i4,1_i4)) - mat1(1,1) = sca2 + allocate(mat1(1_i4, 1_i4)) + mat1(1, 1) = sca2 end if END SUBROUTINE paste_i4_m_s @@ -1281,56 +1280,56 @@ SUBROUTINE paste_i4_m_v(mat1, vec2, fill_value) implicit none - integer(i4), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i4), dimension(:), intent(in) :: vec2 - integer(i4), optional, intent(in) :: fill_value + integer(i4), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i4), dimension(:), intent(in) :: vec2 + integer(i4), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - integer(i4), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + integer(i4), dimension(:, :), allocatable :: tmp - m2 = size(vec2,1) ! rows + m2 = size(vec2, 1) ! rows n2 = 1_i4 ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(1:m1,1:n1) = tmp(:,1:n1) - mat1(1:m2,n1+n2) = vec2(1:m2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+n2) = vec2(1:m2) - mat1(m2+1:m1,n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1(m1+1:m2,1:n1) = fill_value - mat1( 1:m2,n1+n2) = vec2(1:m2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + mat1(m2 + 1 : m1, n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(1:m2,n1+n2) = vec2(1:m2) + allocate(mat1(m2, n2)) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) end if END SUBROUTINE paste_i4_m_v @@ -1339,56 +1338,56 @@ SUBROUTINE paste_i4_m_m(mat1, mat2, fill_value) implicit none - integer(i4), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i4), dimension(:,:), intent(in) :: mat2 - integer(i4), optional, intent(in) :: fill_value + integer(i4), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i4), dimension(:, :), intent(in) :: mat2 + integer(i4), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - integer(i4), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + integer(i4), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( : ,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+1_i4:n1+n2) = mat2(:,1:n2) - mat1(m2+1:m1,n1+1_i4:n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1, 1:n1 ) = tmp(:,1:n1) - mat1(m1+1:m2, 1:n1 ) = fill_value - mat1( : ,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + mat1(m2 + 1 : m1, n1 + 1_i4 : n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + allocate(mat1(m2, n2)) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) end if END SUBROUTINE paste_i4_m_m @@ -1397,32 +1396,32 @@ SUBROUTINE paste_i8_m_s(mat1, sca2) implicit none - integer(i8), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i8), intent(in) :: sca2 + integer(i8), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i8), intent(in) :: sca2 ! local variables - integer(i4) :: m1 ! dim1 of matrix - integer(i4) :: n1 ! dim2 of matrix - integer(i8), dimension(:,:), allocatable :: tmp + integer(i4) :: m1 ! dim1 of matrix + integer(i4) :: n1 ! dim2 of matrix + integer(i8), dimension(:, :), allocatable :: tmp if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. 1_i4) then - print*, 'paste: scalar paste to matrix only works with one-line matrix' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(1_i4,n1+1_i4)) - mat1(1,1:n1) = tmp(1,1:n1) - mat1(1,n1+1_i4) = sca2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. 1_i4) then + print*, 'paste: scalar paste to matrix only works with one-line matrix' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(1_i4, n1 + 1_i4)) + mat1(1, 1 : n1) = tmp(1, 1 : n1) + mat1(1, n1 + 1_i4) = sca2 else - allocate(mat1(1_i4,1_i4)) - mat1(1,1) = sca2 + allocate(mat1(1_i4, 1_i4)) + mat1(1, 1) = sca2 end if END SUBROUTINE paste_i8_m_s @@ -1431,56 +1430,56 @@ SUBROUTINE paste_i8_m_v(mat1, vec2, fill_value) implicit none - integer(i8), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i8), dimension(:), intent(in) :: vec2 - integer(i8), optional, intent(in) :: fill_value + integer(i8), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i8), dimension(:), intent(in) :: vec2 + integer(i8), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - integer(i8), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + integer(i8), dimension(:, :), allocatable :: tmp - m2 = size(vec2,1) ! rows + m2 = size(vec2, 1) ! rows n2 = 1_i4 ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(1:m1,1:n1) = tmp(:,1:n1) - mat1(1:m2,n1+n2) = vec2(1:m2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+n2) = vec2(1:m2) - mat1(m2+1:m1,n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1(m1+1:m2,1:n1) = fill_value - mat1( 1:m2,n1+n2) = vec2(1:m2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + mat1(m2 + 1 : m1, n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(1:m2,n1+n2) = vec2(1:m2) + allocate(mat1(m2, n2)) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) end if END SUBROUTINE paste_i8_m_v @@ -1489,56 +1488,56 @@ SUBROUTINE paste_i8_m_m(mat1, mat2, fill_value) implicit none - integer(i8), dimension(:,:), allocatable, intent(inout) :: mat1 - integer(i8), dimension(:,:), intent(in) :: mat2 - integer(i8), optional, intent(in) :: fill_value + integer(i8), dimension(:, :), allocatable, intent(inout) :: mat1 + integer(i8), dimension(:, :), intent(in) :: mat2 + integer(i8), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - integer(i8), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + integer(i8), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( : ,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+1_i4:n1+n2) = mat2(:,1:n2) - mat1(m2+1:m1,n1+1_i4:n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1, 1:n1 ) = tmp(:,1:n1) - mat1(m1+1:m2, 1:n1 ) = fill_value - mat1( : ,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - - else - n1 = 0_i4 - m1 = m2 - - allocate(mat1(m2,n2)) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + mat1(m2 + 1 : m1, n1 + 1_i4 : n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + + else + n1 = 0_i4 + m1 = m2 + + allocate(mat1(m2, n2)) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) end if END SUBROUTINE paste_i8_m_m @@ -1547,32 +1546,32 @@ SUBROUTINE paste_sp_m_s(mat1, sca2) implicit none - real(sp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(sp), intent(in) :: sca2 + real(sp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(sp), intent(in) :: sca2 ! local variables - integer(i4) :: m1 ! dim1 of matrix - integer(i4) :: n1 ! dim2 of matrix - real(sp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1 ! dim1 of matrix + integer(i4) :: n1 ! dim2 of matrix + real(sp), dimension(:, :), allocatable :: tmp if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. 1_i4) then - print*, 'paste: scalar paste to matrix only works with one-line matrix' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(1_i4,n1+1_i4)) - mat1(1,1:n1) = tmp(1,1:n1) - mat1(1,n1+1_i4) = sca2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. 1_i4) then + print*, 'paste: scalar paste to matrix only works with one-line matrix' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(1_i4, n1 + 1_i4)) + mat1(1, 1 : n1) = tmp(1, 1 : n1) + mat1(1, n1 + 1_i4) = sca2 else - allocate(mat1(1_i4,1_i4)) - mat1(1,1) = sca2 + allocate(mat1(1_i4, 1_i4)) + mat1(1, 1) = sca2 end if END SUBROUTINE paste_sp_m_s @@ -1581,56 +1580,56 @@ SUBROUTINE paste_sp_m_v(mat1, vec2, fill_value) implicit none - real(sp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(sp), dimension(:), intent(in) :: vec2 - real(sp), optional, intent(in) :: fill_value + real(sp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(sp), dimension(:), intent(in) :: vec2 + real(sp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - real(sp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + real(sp), dimension(:, :), allocatable :: tmp - m2 = size(vec2,1) ! rows + m2 = size(vec2, 1) ! rows n2 = 1_i4 ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(1:m1,1:n1) = tmp(:,1:n1) - mat1(1:m2,n1+n2) = vec2(1:m2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+n2) = vec2(1:m2) - mat1(m2+1:m1,n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1(m1+1:m2,1:n1) = fill_value - mat1( 1:m2,n1+n2) = vec2(1:m2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + mat1(m2 + 1 : m1, n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(1:m2,n1+n2) = vec2(1:m2) + allocate(mat1(m2, n2)) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) end if END SUBROUTINE paste_sp_m_v @@ -1639,57 +1638,56 @@ SUBROUTINE paste_sp_m_m(mat1, mat2, fill_value) implicit none - real(sp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(sp), dimension(:,:), intent(in) :: mat2 - real(sp), optional, intent(in) :: fill_value + real(sp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(sp), dimension(:, :), intent(in) :: mat2 + real(sp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - real(sp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + real(sp), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( : ,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+1_i4:n1+n2) = mat2(:,1:n2) - mat1(m2+1:m1,n1+1_i4:n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1, 1:n1 ) = tmp(:,1:n1) - mat1(m1+1:m2, 1:n1 ) = fill_value - mat1( : ,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + mat1(m2 + 1 : m1, n1 + 1_i4 : n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + allocate(mat1(m2, n2)) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) end if END SUBROUTINE paste_sp_m_m @@ -1698,32 +1696,32 @@ SUBROUTINE paste_dp_m_s(mat1, sca2) implicit none - real(dp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(dp), intent(in) :: sca2 + real(dp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(dp), intent(in) :: sca2 ! local variables - integer(i4) :: m1 ! dim1 of matrix - integer(i4) :: n1 ! dim2 of matrix - real(dp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1 ! dim1 of matrix + integer(i4) :: n1 ! dim2 of matrix + real(dp), dimension(:, :), allocatable :: tmp if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. 1_i4) then - print*, 'paste: scalar paste to matrix only works with one-line matrix' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(1_i4,n1+1_i4)) - mat1(1,1:n1) = tmp(1,1:n1) - mat1(1,n1+1_i4) = sca2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. 1_i4) then + print*, 'paste: scalar paste to matrix only works with one-line matrix' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(1_i4, n1 + 1_i4)) + mat1(1, 1 : n1) = tmp(1, 1 : n1) + mat1(1, n1 + 1_i4) = sca2 else - allocate(mat1(1_i4,1_i4)) - mat1(1,1) = sca2 + allocate(mat1(1_i4, 1_i4)) + mat1(1, 1) = sca2 end if END SUBROUTINE paste_dp_m_s @@ -1732,56 +1730,56 @@ SUBROUTINE paste_dp_m_v(mat1, vec2, fill_value) implicit none - real(dp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(dp), dimension(:), intent(in) :: vec2 - real(dp), optional, intent(in) :: fill_value + real(dp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(dp), dimension(:), intent(in) :: vec2 + real(dp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - real(dp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + real(dp), dimension(:, :), allocatable :: tmp - m2 = size(vec2,1) ! rows + m2 = size(vec2, 1) ! rows n2 = 1_i4 ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(1:m1,1:n1) = tmp(:,1:n1) - mat1(1:m2,n1+n2) = vec2(1:m2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+n2) = vec2(1:m2) - mat1(m2+1:m1,n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1(m1+1:m2,1:n1) = fill_value - mat1( 1:m2,n1+n2) = vec2(1:m2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + mat1(m2 + 1 : m1, n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(1:m2,n1+n2) = vec2(1:m2) + allocate(mat1(m2, n2)) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) end if END SUBROUTINE paste_dp_m_v @@ -1790,56 +1788,56 @@ SUBROUTINE paste_dp_m_m(mat1, mat2, fill_value) implicit none - real(dp), dimension(:,:), allocatable, intent(inout) :: mat1 - real(dp), dimension(:,:), intent(in) :: mat2 - real(dp), optional, intent(in) :: fill_value + real(dp), dimension(:, :), allocatable, intent(inout) :: mat1 + real(dp), dimension(:, :), intent(in) :: mat2 + real(dp), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - real(dp), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + real(dp), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( : ,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+1_i4:n1+n2) = mat2(:,1:n2) - mat1(m2+1:m1,n1+1_i4:n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1, 1:n1 ) = tmp(:,1:n1) - mat1(m1+1:m2, 1:n1 ) = fill_value - mat1( : ,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + mat1(m2 + 1 : m1, n1 + 1_i4 : n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + allocate(mat1(m2, n2)) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) end if END SUBROUTINE paste_dp_m_m @@ -1848,32 +1846,32 @@ SUBROUTINE paste_char_m_s(mat1, sca2) implicit none - character(len=*), dimension(:,:), allocatable, intent(inout) :: mat1 - character(len=*), intent(in) :: sca2 + character(len = *), dimension(:, :), allocatable, intent(inout) :: mat1 + character(len = *), intent(in) :: sca2 ! local variables - integer(i4) :: m1 ! dim1 of matrix - integer(i4) :: n1 ! dim2 of matrix - character(len(mat1)), dimension(:,:), allocatable :: tmp + integer(i4) :: m1 ! dim1 of matrix + integer(i4) :: n1 ! dim2 of matrix + character(len(mat1)), dimension(:, :), allocatable :: tmp if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. 1_i4) then - print*, 'paste: scalar paste to matrix only works with one-line matrix' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(1_i4,n1+1_i4)) - mat1(1,1:n1) = tmp(1,1:n1) - mat1(1,n1+1_i4) = sca2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. 1_i4) then + print*, 'paste: scalar paste to matrix only works with one-line matrix' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(1_i4, n1 + 1_i4)) + mat1(1, 1 : n1) = tmp(1, 1 : n1) + mat1(1, n1 + 1_i4) = sca2 else - allocate(mat1(1_i4,1_i4)) - mat1(1,1) = sca2 + allocate(mat1(1_i4, 1_i4)) + mat1(1, 1) = sca2 end if END SUBROUTINE paste_char_m_s @@ -1882,56 +1880,56 @@ SUBROUTINE paste_char_m_v(mat1, vec2, fill_value) implicit none - character(len=*), dimension(:,:), allocatable, intent(inout) :: mat1 - character(len=*), dimension(:), intent(in) :: vec2 - character(len=*), optional, intent(in) :: fill_value + character(len = *), dimension(:, :), allocatable, intent(inout) :: mat1 + character(len = *), dimension(:), intent(in) :: vec2 + character(len = *), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - character(len(mat1)), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + character(len(mat1)), dimension(:, :), allocatable :: tmp - m2 = size(vec2,1) ! rows + m2 = size(vec2, 1) ! rows n2 = 1_i4 ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(1:m1,1:n1) = tmp(:,1:n1) - mat1(1:m2,n1+n2) = vec2(1:m2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+n2) = vec2(1:m2) - mat1(m2+1:m1,n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1,1:n1) = tmp(:,1:n1) - mat1(m1+1:m2,1:n1) = fill_value - mat1( 1:m2,n1+n2) = vec2(1:m2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + mat1(m2 + 1 : m1, n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(1 : m2, n1 + n2) = vec2(1 : m2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(1:m2,n1+n2) = vec2(1:m2) + allocate(mat1(m2, n2)) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) end if END SUBROUTINE paste_char_m_v @@ -1940,56 +1938,56 @@ SUBROUTINE paste_char_m_m(mat1, mat2, fill_value) implicit none - character(len=*), dimension(:,:), allocatable, intent(inout) :: mat1 - character(len=*), dimension(:,:), intent(in) :: mat2 - character(len=*), optional, intent(in) :: fill_value + character(len = *), dimension(:, :), allocatable, intent(inout) :: mat1 + character(len = *), dimension(:, :), intent(in) :: mat2 + character(len = *), optional, intent(in) :: fill_value ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - character(len(mat1)), dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + character(len(mat1)), dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if ( (m1 .ne. m2) .and. .not. present( fill_value ) ) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - if ( m1 .eq. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if - - if ( m1 .gt. m2 ) then - allocate(mat1(m1,n1+n2)) - mat1( : ,1:n1) = tmp(:,1:n1) - mat1( 1:m2,n1+1_i4:n1+n2) = mat2(:,1:n2) - mat1(m2+1:m1,n1+1_i4:n1+n2) = fill_value - end if - - if ( m1 .lt. m2 ) then - allocate(mat1(m2,n1+n2)) - mat1( 1:m1, 1:n1 ) = tmp(:,1:n1) - mat1(m1+1:m2, 1:n1 ) = fill_value - mat1( : ,n1+1_i4:n1+n2) = mat2(:,1:n2) - end if + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if ((m1 .ne. m2) .and. .not. present(fill_value)) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + if (m1 .eq. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if + + if (m1 .gt. m2) then + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + mat1(m2 + 1 : m1, n1 + 1_i4 : n1 + n2) = fill_value + end if + + if (m1 .lt. m2) then + allocate(mat1(m2, n1 + n2)) + mat1(1 : m1, 1 : n1) = tmp(:, 1 : n1) + mat1(m1 + 1 : m2, 1 : n1) = fill_value + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) + end if else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + allocate(mat1(m2, n2)) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) end if END SUBROUTINE paste_char_m_m @@ -1998,32 +1996,32 @@ SUBROUTINE paste_lgt_m_s(mat1, sca2) implicit none - logical, dimension(:,:), allocatable, intent(inout) :: mat1 - logical, intent(in) :: sca2 + logical, dimension(:, :), allocatable, intent(inout) :: mat1 + logical, intent(in) :: sca2 ! local variables - integer(i4) :: m1 ! dim1 of matrix - integer(i4) :: n1 ! dim2 of matrix - logical, dimension(:,:), allocatable :: tmp + integer(i4) :: m1 ! dim1 of matrix + integer(i4) :: n1 ! dim2 of matrix + logical, dimension(:, :), allocatable :: tmp if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. 1_i4) then - print*, 'paste: scalar paste to matrix only works with one-line matrix' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(1_i4,n1+1_i4)) - mat1(1,1:n1) = tmp(1,1:n1) - mat1(1,n1+1_i4) = sca2 + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. 1_i4) then + print*, 'paste: scalar paste to matrix only works with one-line matrix' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(1_i4, n1 + 1_i4)) + mat1(1, 1 : n1) = tmp(1, 1 : n1) + mat1(1, n1 + 1_i4) = sca2 else - allocate(mat1(1_i4,1_i4)) - mat1(1,1) = sca2 + allocate(mat1(1_i4, 1_i4)) + mat1(1, 1) = sca2 end if END SUBROUTINE paste_lgt_m_s @@ -2032,38 +2030,38 @@ SUBROUTINE paste_lgt_m_v(mat1, vec2) implicit none - logical, dimension(:,:), allocatable, intent(inout) :: mat1 - logical, dimension(:), intent(in) :: vec2 + logical, dimension(:, :), allocatable, intent(inout) :: mat1 + logical, dimension(:), intent(in) :: vec2 ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - logical, dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + logical, dimension(:, :), allocatable :: tmp - m2 = size(vec2,1) ! rows + m2 = size(vec2, 1) ! rows n2 = 1_i4 ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. m2) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(1:m2,n1+n2) = vec2(1:m2) + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. m2) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(1:m2,n1+n2) = vec2(1:m2) + allocate(mat1(m2, n2)) + mat1(1 : m2, n1 + n2) = vec2(1 : m2) end if END SUBROUTINE paste_lgt_m_v @@ -2072,38 +2070,38 @@ SUBROUTINE paste_lgt_m_m(mat1, mat2) implicit none - logical, dimension(:,:), allocatable, intent(inout) :: mat1 - logical, dimension(:,:), intent(in) :: mat2 + logical, dimension(:, :), allocatable, intent(inout) :: mat1 + logical, dimension(:, :), intent(in) :: mat2 ! local variables - integer(i4) :: m1, m2 ! dim1 of matrixes - integer(i4) :: n1, n2 ! dim2 of matrixes - logical, dimension(:,:), allocatable :: tmp + integer(i4) :: m1, m2 ! dim1 of matrixes + integer(i4) :: n1, n2 ! dim2 of matrixes + logical, dimension(:, :), allocatable :: tmp - m2 = size(mat2,1) ! rows - n2 = size(mat2,2) ! columns + m2 = size(mat2, 1) ! rows + n2 = size(mat2, 2) ! columns if (allocated(mat1)) then - m1 = size(mat1,1) ! rows - n1 = size(mat1,2) ! columns - if (m1 .ne. m2) then - print*, 'paste: rows of matrix1 and matrix2 are unequal : (',m1,',',n1,') and (',m2,',',n2,')' - STOP - end if - ! save mat1 - allocate(tmp(m1,n1)) - tmp=mat1 - deallocate(mat1) - - allocate(mat1(m1,n1+n2)) - mat1(:,1:n1) = tmp(:,1:n1) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + m1 = size(mat1, 1) ! rows + n1 = size(mat1, 2) ! columns + if (m1 .ne. m2) then + print*, 'paste: rows of matrix1 and matrix2 are unequal : (', m1, ',', n1, ') and (', m2, ',', n2, ')' + STOP + end if + ! save mat1 + allocate(tmp(m1, n1)) + tmp = mat1 + deallocate(mat1) + + allocate(mat1(m1, n1 + n2)) + mat1(:, 1 : n1) = tmp(:, 1 : n1) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) else - n1 = 0_i4 - m1 = m2 + n1 = 0_i4 + m1 = m2 - allocate(mat1(m2,n2)) - mat1(:,n1+1_i4:n1+n2) = mat2(:,1:n2) + allocate(mat1(m2, n2)) + mat1(:, n1 + 1_i4 : n1 + n2) = mat2(:, 1 : n2) end if END SUBROUTINE paste_lgt_m_m diff --git a/src/lib/mo_constants.f90 b/src/lib/mo_constants.f90 index 9a161eaa..d51bd0af 100644 --- a/src/lib/mo_constants.f90 +++ b/src/lib/mo_constants.f90 @@ -36,26 +36,20 @@ MODULE mo_constants ! Copyright 2011-2014 Matthias Cuntz - USE mo_kind, ONLY: sp, dp - use, intrinsic :: iso_fortran_env, only: input_unit, output_unit, error_unit + USE mo_kind, ONLY : sp, dp + use, intrinsic :: iso_fortran_env, only : input_unit, output_unit, error_unit IMPLICIT NONE - ! Computational - !> epsilon(1.0) in double precision - REAL(dp), PARAMETER :: eps_dp = epsilon(1.0_dp) - !> epsilon(1.0) in single precision - REAL(sp), PARAMETER :: eps_sp = epsilon(1.0_sp) - ! Mathematical !> Pi in double precision - REAL(dp), PARAMETER :: PI_dp = 3.141592653589793238462643383279502884197_dp ! Pi + REAL(dp), PARAMETER :: PI_dp = 3.141592653589793238462643383279502884197_dp ! Pi !> Pi in single precision - REAL(sp), PARAMETER :: PI_sp = 3.141592653589793238462643383279502884197_sp + REAL(sp), PARAMETER :: PI_sp = 3.141592653589793238462643383279502884197_sp !> Pi/2 in double precision - REAL(dp), PARAMETER :: PIO2_dp = 1.57079632679489661923132169163975144209858_dp ! Pi/2 + REAL(dp), PARAMETER :: PIO2_dp = 1.57079632679489661923132169163975144209858_dp ! Pi/2 !> Pi/2 in single precision - REAL(sp), PARAMETER :: PIO2_sp = 1.57079632679489661923132169163975144209858_sp + REAL(sp), PARAMETER :: PIO2_sp = 1.57079632679489661923132169163975144209858_sp !> 2*Pi in double precision REAL(dp), PARAMETER :: TWOPI_dp = 6.283185307179586476925286766559005768394_dp ! 2*Pi !> 2*Pi in single precision @@ -69,93 +63,93 @@ MODULE mo_constants !> 2/3 in single precision REAL(sp), PARAMETER :: TWOTHIRD_sp = 0.6666666666666666666666666666666666667_sp !> degree to radian conversion (pi/180) in double precision - REAL(dp), PARAMETER :: deg2rad_dp = PI_dp/180._dp ! deg2rad + REAL(dp), PARAMETER :: deg2rad_dp = PI_dp / 180._dp ! deg2rad !> degree to radian conversion (pi/180) in double precision - REAL(sp), PARAMETER :: deg2rad_sp = PI_sp/180._sp + REAL(sp), PARAMETER :: deg2rad_sp = PI_sp / 180._sp !> radian to conversion (180/pi) in double precision - REAL(dp), PARAMETER :: rad2deg_dp = 180._dp/PI_dp ! rad2deg + REAL(dp), PARAMETER :: rad2deg_dp = 180._dp / PI_dp ! rad2deg !> radian to degree conversion (180/pi) in single precision - REAL(sp), PARAMETER :: rad2deg_sp = 180._sp/PI_sp + REAL(sp), PARAMETER :: rad2deg_sp = 180._sp / PI_sp !> Time conversion !> Seconds per day [s] in single precision - REAL(sp), public, PARAMETER :: secday_sp = 86400.0_sp - REAL(dp), public, PARAMETER :: secday_dp = 86400.0_dp ! secday [s] - REAL(dp), public, parameter :: DayHours = 24.0_dp ! hours per day - real(dp), public, parameter :: YearMonths = 12.0_dp ! months per year - real(dp), public, parameter :: YearDays = 365.0_dp ! days in a year - real(dp), public, parameter :: DaySecs = 86400.0_dp ! sec in a day + REAL(sp), public, PARAMETER :: secday_sp = 86400.0_sp + REAL(dp), public, PARAMETER :: secday_dp = 86400.0_dp ! secday [s] + REAL(dp), public, parameter :: DayHours = 24.0_dp ! hours per day + real(dp), public, parameter :: YearMonths = 12.0_dp ! months per year + real(dp), public, parameter :: YearDays = 365.0_dp ! days in a year + real(dp), public, parameter :: DaySecs = 86400.0_dp ! sec in a day ! Physical !> Psychrometric constant [kPa K^-1] in double precision - REAL(dp), PARAMETER :: Psychro_dp = 0.0646_dp ! psychrometric constant [kPa C-1] + REAL(dp), PARAMETER :: Psychro_dp = 0.0646_dp ! psychrometric constant [kPa C-1] !> Psychrometric constant [kPa K^-1] in sibgle precision - REAL(sp), PARAMETER :: Psychro_sp = 0.0646_sp + REAL(sp), PARAMETER :: Psychro_sp = 0.0646_sp !> Gravity accelaration [m^2 s^-1] in double precision - REAL(dp), PARAMETER :: Gravity_dp = 9.81_dp ! Gravity acceleration [m^2/s] + REAL(dp), PARAMETER :: Gravity_dp = 9.81_dp ! Gravity acceleration [m^2/s] !> Gravity accelaration [m^2 s^-1] in single precision - REAL(sp), PARAMETER :: Gravity_sp = 9.81_sp + REAL(sp), PARAMETER :: Gravity_sp = 9.81_sp !> Solar constant in [J m^-2 s^-1] in double precision - REAL(dp), PARAMETER :: SolarConst_dp = 1367._dp ! Solar constant in [W m-2 = kg s-3] + REAL(dp), PARAMETER :: SolarConst_dp = 1367._dp ! Solar constant in [W m-2 = kg s-3] !> Solar constant in [J m^-2 s^-1] in single precision - REAL(sp), PARAMETER :: SolarConst_sp = 1367._sp + REAL(sp), PARAMETER :: SolarConst_sp = 1367._sp !> Specific heat for vaporization of water in [J m-2 mm-1] in double precision - REAL(dp), PARAMETER :: SpecHeatET_dp = 2.45e06_dp ! Specific heat in [W s m-2 mm-1 = kg s-2 mm-1] + REAL(dp), PARAMETER :: SpecHeatET_dp = 2.45e06_dp ! Specific heat in [W s m-2 mm-1 = kg s-2 mm-1] !> Specific heat for vaporization of water in [J m-2 mm-1] in single precision - REAL(sp), PARAMETER :: SpecHeatET_sp = 2.45e06_sp + REAL(sp), PARAMETER :: SpecHeatET_sp = 2.45e06_sp !> Standard temperature [K] in double precision - REAL(dp), PARAMETER :: T0_dp = 273.15_dp ! Celcius <-> Kelvin [K] + REAL(dp), PARAMETER :: T0_dp = 273.15_dp ! Celcius <-> Kelvin [K] !> Standard temperature [K] in single precision - REAL(sp), PARAMETER :: T0_sp = 273.15_sp + REAL(sp), PARAMETER :: T0_sp = 273.15_sp !> Stefan-Boltzmann constant [W m^-2 K^-4] in double precision - REAL(dp), PARAMETER :: sigma_dp = 5.67e-08_dp ! Stefan-Boltzmann constant [W/m^2/K^4] + REAL(dp), PARAMETER :: sigma_dp = 5.67e-08_dp ! Stefan-Boltzmann constant [W/m^2/K^4] !> Stefan-Boltzmann constant [W m^-2 K^-4] in single precision - REAL(sp), PARAMETER :: sigma_sp = 5.67e-08_sp + REAL(sp), PARAMETER :: sigma_sp = 5.67e-08_sp ! Earth radius [m] in single precision - REAL(sp), PARAMETER :: RadiusEarth_sp = 6371228._sp + REAL(sp), PARAMETER :: RadiusEarth_sp = 6371228._sp ! Earth radius [m] in double precision - REAL(dp), PARAMETER :: RadiusEarth_dp = 6371228._dp + REAL(dp), PARAMETER :: RadiusEarth_dp = 6371228._dp !> standard atmospehere !> Standard pressure [Pa] in double precision - REAL(dp), PARAMETER :: P0_dp = 101325._dp ! Standard pressure [Pa] + REAL(dp), PARAMETER :: P0_dp = 101325._dp ! Standard pressure [Pa] !> Standard pressure [Pa] in single precision - REAL(sp), PARAMETER :: P0_sp = 101325._sp + REAL(sp), PARAMETER :: P0_sp = 101325._sp !> standard density [kg m^-3] in double precision - REAL(dp), PARAMETER :: rho0_dp = 1.225_dp ! Standard air density + REAL(dp), PARAMETER :: rho0_dp = 1.225_dp ! Standard air density !> standard density [kg m^-3] in single precision - REAL(sp), PARAMETER :: rho0_sp = 1.225_sp + REAL(sp), PARAMETER :: rho0_sp = 1.225_sp !> specific heat capacity of air [J kg^-1 K^-1] in double precision - REAL(dp), PARAMETER :: cp0_dp = 1005.0_dp ! Standard specific heat of air + REAL(dp), PARAMETER :: cp0_dp = 1005.0_dp ! Standard specific heat of air !> specific heat capacity of air [J kg^-1 K^-1] in single precision - REAL(sp), PARAMETER :: cp0_sp = 1005.0_sp + REAL(sp), PARAMETER :: cp0_sp = 1005.0_sp ! Numerical Recipes !> Pi in double precision - REAL(dp), PARAMETER :: PI_D = 3.141592653589793238462643383279502884197_dp ! Pi + REAL(dp), PARAMETER :: PI_D = 3.141592653589793238462643383279502884197_dp ! Pi !> Pi in single precision - REAL(sp), PARAMETER :: PI = 3.141592653589793238462643383279502884197_sp + REAL(sp), PARAMETER :: PI = 3.141592653589793238462643383279502884197_sp !> Pi/2 in double precision - REAL(dp), PARAMETER :: PIO2_D = 1.57079632679489661923132169163975144209858_dp ! Pi/2 + REAL(dp), PARAMETER :: PIO2_D = 1.57079632679489661923132169163975144209858_dp ! Pi/2 !> Pi/2 in single precision - REAL(sp), PARAMETER :: PIO2 = 1.57079632679489661923132169163975144209858_sp + REAL(sp), PARAMETER :: PIO2 = 1.57079632679489661923132169163975144209858_sp !> 2*Pi in double precision REAL(dp), PARAMETER :: TWOPI_D = 6.283185307179586476925286766559005768394_dp ! 2*Pi !> 2*Pi in single precision - REAL(sp), PARAMETER :: TWOPI = 6.283185307179586476925286766559005768394_sp + REAL(sp), PARAMETER :: TWOPI = 6.283185307179586476925286766559005768394_sp !> Square root of 2 in double precision REAL(dp), PARAMETER :: SQRT2_D = 1.41421356237309504880168872420969807856967_dp ! Sqrt(2) !> Square root of 2 in single precision - REAL(sp), PARAMETER :: SQRT2 = 1.41421356237309504880168872420969807856967_sp + REAL(sp), PARAMETER :: SQRT2 = 1.41421356237309504880168872420969807856967_sp !> Euler''s constant in double precision REAL(dp), PARAMETER :: EULER_D = 0.5772156649015328606065120900824024310422_dp ! Euler !> Euler''s constant in single precision - REAL(sp), PARAMETER :: EULER = 0.5772156649015328606065120900824024310422_sp + REAL(sp), PARAMETER :: EULER = 0.5772156649015328606065120900824024310422_sp ! Standard file units !> Standard input file unit ! INTEGER, PARAMETER :: nin = 5 ! standard input stream - INTEGER, PARAMETER :: nin = input_unit ! standard input stream + INTEGER, PARAMETER :: nin = input_unit ! standard input stream !> Standard output file unit ! INTEGER, PARAMETER :: nout = 6 ! standard output stream INTEGER, PARAMETER :: nout = output_unit ! standard output stream diff --git a/src/lib/mo_corr.f90 b/src/lib/mo_corr.f90 index 7b26a969..826c6247 100644 --- a/src/lib/mo_corr.f90 +++ b/src/lib/mo_corr.f90 @@ -61,8 +61,8 @@ MODULE mo_corr ! If you do not hold a Numerical Recipes License, this code is only for ! informational and educational purposes but cannot be used. - USE mo_kind, ONLY: i4, sp, dp, spc, dpc - USE mo_constants, ONLY: TWOPI_sp, TWOPI_dp, PI_dp + USE mo_kind, ONLY : i4, sp, dp, spc, dpc + USE mo_constants, ONLY : TWOPI_sp, TWOPI_dp, PI_dp Implicit NONE @@ -125,8 +125,8 @@ MODULE mo_corr ! Written, Matthias Cuntz, Nov 2011 ! Modified, Stephan Thober, Nov 2012 - added 1d version INTERFACE autocoeffk - MODULE PROCEDURE autocoeffk_sp, autocoeffk_dp, & - autocoeffk_1d_dp, autocoeffk_1d_sp + MODULE PROCEDURE autocoeffk_sp, autocoeffk_dp, & + autocoeffk_1d_dp, autocoeffk_1d_sp END INTERFACE autocoeffk ! ------------------------------------------------------------------ @@ -182,8 +182,8 @@ MODULE mo_corr ! Written, Matthias Cuntz, Nov 2011 ! Modified, Stephan Thober, Nov 2012 - added 1d version INTERFACE autocorr - MODULE PROCEDURE autocorr_sp, autocorr_dp, & - autocorr_1d_sp, autocorr_1d_dp + MODULE PROCEDURE autocorr_sp, autocorr_dp, & + autocorr_1d_sp, autocorr_1d_dp END INTERFACE autocorr ! ------------------------------------------------------------------ @@ -251,7 +251,7 @@ MODULE mo_corr ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE corr - MODULE PROCEDURE corr_sp, corr_dp + MODULE PROCEDURE corr_sp, corr_dp END INTERFACE corr ! ------------------------------------------------------------------ @@ -308,7 +308,7 @@ MODULE mo_corr ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE crosscoeffk - MODULE PROCEDURE crosscoeffk_sp, crosscoeffk_dp + MODULE PROCEDURE crosscoeffk_sp, crosscoeffk_dp END INTERFACE crosscoeffk ! ------------------------------------------------------------------ @@ -364,7 +364,7 @@ MODULE mo_corr ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE crosscorr - MODULE PROCEDURE crosscorr_sp, crosscorr_dp + MODULE PROCEDURE crosscorr_sp, crosscorr_dp END INTERFACE crosscorr ! ------------------------------------------------------------------ @@ -375,35 +375,35 @@ MODULE mo_corr ! Private routines, mostly from numerical recipes INTERFACE arth - MODULE PROCEDURE arth_sp, arth_dp, arth_i4 + MODULE PROCEDURE arth_sp, arth_dp, arth_i4 END INTERFACE arth INTERFACE four1 - MODULE PROCEDURE four1_sp, four1_dp + MODULE PROCEDURE four1_sp, four1_dp END INTERFACE four1 INTERFACE fourrow - MODULE PROCEDURE fourrow_sp, fourrow_dp + MODULE PROCEDURE fourrow_sp, fourrow_dp END INTERFACE fourrow INTERFACE realft - MODULE PROCEDURE realft_sp, realft_dp + MODULE PROCEDURE realft_sp, realft_dp END INTERFACE realft INTERFACE swap - MODULE PROCEDURE & ! swap_i4, & - !swap_sp, swap_1d_sp, & - !swap_dp, & !swap_1d_dp, & - ! swap_spc, & - swap_1d_spc, & - ! swap_dpc, & - swap_1d_dpc !, & - ! masked_swap_sp, masked_swap_1d_sp, masked_swap_2d_sp, & - ! masked_swap_dp, masked_swap_1d_dp, masked_swap_2d_dp, & - ! masked_swap_spc, masked_swap_1d_spc, masked_swap_2d_spc, & - ! masked_swap_dpc, masked_swap_1d_dpc, masked_swap_2d_dpc + MODULE PROCEDURE & ! swap_i4, & + !swap_sp, swap_1d_sp, & + !swap_dp, & !swap_1d_dp, & + ! swap_spc, & + swap_1d_spc, & + ! swap_dpc, & + swap_1d_dpc !, & + ! masked_swap_sp, masked_swap_1d_sp, masked_swap_2d_sp, & + ! masked_swap_dp, masked_swap_1d_dp, masked_swap_2d_dp, & + ! masked_swap_spc, masked_swap_1d_spc, masked_swap_2d_spc, & + ! masked_swap_dpc, masked_swap_1d_dpc, masked_swap_2d_dpc END INTERFACE swap !INTERFACE zroots_unity ! MODULE PROCEDURE zroots_unity_sp, zroots_unity_dp !END INTERFACE zroots_unity - INTEGER(i4), PARAMETER :: NPAR_ARTH=16, NPAR2_ARTH=8 + INTEGER(i4), PARAMETER :: NPAR_ARTH = 16, NPAR2_ARTH = 8 ! ------------------------------------------------------------------ @@ -416,101 +416,101 @@ MODULE mo_corr ! first value is first and whose increment is increment. If first and ! increment have rank greater than zero, returns an array of one larger rank, ! with the last subscript having size n and indexing the progressions. - FUNCTION arth_sp(first,increment,n) + FUNCTION arth_sp(first, increment, n) IMPLICIT NONE - REAL(sp), INTENT(IN) :: first, increment + REAL(sp), INTENT(IN) :: first, increment INTEGER(i4), INTENT(IN) :: n - REAL(sp), DIMENSION(n) :: arth_sp + REAL(sp), DIMENSION(n) :: arth_sp INTEGER(i4) :: k, k2 REAL(sp) :: temp - if (n > 0) arth_sp(1)=first + if (n > 0) arth_sp(1) = first if (n <= NPAR_ARTH) then - do k=2, n - arth_sp(k) = arth_sp(k-1)+increment - end do + do k = 2, n + arth_sp(k) = arth_sp(k - 1) + increment + end do else - do k=2, NPAR2_ARTH - arth_sp(k) = arth_sp(k-1)+increment - end do - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - do - if (k >= n) exit - k2 = k+k - arth_sp(k+1:min(k2,n)) = temp+arth_sp(1:min(k,n-k)) - temp = temp+temp - k = k2 - end do + do k = 2, NPAR2_ARTH + arth_sp(k) = arth_sp(k - 1) + increment + end do + temp = increment * NPAR2_ARTH + k = NPAR2_ARTH + do + if (k >= n) exit + k2 = k + k + arth_sp(k + 1 : min(k2, n)) = temp + arth_sp(1 : min(k, n - k)) + temp = temp + temp + k = k2 + end do end if END FUNCTION arth_sp - FUNCTION arth_dp(first,increment,n) + FUNCTION arth_dp(first, increment, n) IMPLICIT NONE - REAL(dp), INTENT(IN) :: first,increment + REAL(dp), INTENT(IN) :: first, increment INTEGER(i4), INTENT(IN) :: n - REAL(dp), DIMENSION(n) :: arth_dp + REAL(dp), DIMENSION(n) :: arth_dp INTEGER(i4) :: k, k2 REAL(dp) :: temp - if (n > 0) arth_dp(1)=first + if (n > 0) arth_dp(1) = first if (n <= NPAR_ARTH) then - do k=2, n - arth_dp(k) = arth_dp(k-1)+increment - end do + do k = 2, n + arth_dp(k) = arth_dp(k - 1) + increment + end do else - do k=2, NPAR2_ARTH - arth_dp(k) = arth_dp(k-1)+increment - end do - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - do - if (k >= n) exit - k2 = k+k - arth_dp(k+1:min(k2,n)) = temp+arth_dp(1:min(k,n-k)) - temp = temp+temp - k = k2 - end do + do k = 2, NPAR2_ARTH + arth_dp(k) = arth_dp(k - 1) + increment + end do + temp = increment * NPAR2_ARTH + k = NPAR2_ARTH + do + if (k >= n) exit + k2 = k + k + arth_dp(k + 1 : min(k2, n)) = temp + arth_dp(1 : min(k, n - k)) + temp = temp + temp + k = k2 + end do end if END FUNCTION arth_dp - FUNCTION arth_i4(first,increment,n) + FUNCTION arth_i4(first, increment, n) IMPLICIT NONE - INTEGER(i4), INTENT(IN) :: first, increment, n + INTEGER(i4), INTENT(IN) :: first, increment, n INTEGER(i4), DIMENSION(n) :: arth_i4 INTEGER(i4) :: k, k2, temp - if (n > 0) arth_i4(1)=first + if (n > 0) arth_i4(1) = first if (n <= NPAR_ARTH) then - do k=2, n - arth_i4(k) = arth_i4(k-1)+increment - end do + do k = 2, n + arth_i4(k) = arth_i4(k - 1) + increment + end do else - do k=2, NPAR2_ARTH - arth_i4(k) = arth_i4(k-1)+increment - end do - temp = increment*NPAR2_ARTH - k = NPAR2_ARTH - do - if (k >= n) exit - k2 = k+k - arth_i4(k+1:min(k2,n)) = temp+arth_i4(1:min(k,n-k)) - temp = temp+temp - k = k2 - end do + do k = 2, NPAR2_ARTH + arth_i4(k) = arth_i4(k - 1) + increment + end do + temp = increment * NPAR2_ARTH + k = NPAR2_ARTH + do + if (k >= n) exit + k2 = k + k + arth_i4(k + 1 : min(k2, n)) = temp + arth_i4(1 : min(k, n - k)) + temp = temp + temp + k = k2 + end do end if END FUNCTION arth_i4 @@ -521,16 +521,16 @@ FUNCTION autocoeffk_dp(x, k, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: autocoeffk_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: autocoeffk_dp if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocoeffk_dp: size(mask) /= size(x)' - autocoeffk_dp = crosscoeffk(x, x, k, mask) + if (size(mask) /= size(x)) stop 'Error autocoeffk_dp: size(mask) /= size(x)' + autocoeffk_dp = crosscoeffk(x, x, k, mask) else - autocoeffk_dp = crosscoeffk(x, x, k) + autocoeffk_dp = crosscoeffk(x, x, k) end if END FUNCTION autocoeffk_dp @@ -540,16 +540,16 @@ FUNCTION autocoeffk_sp(x, k, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: autocoeffk_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: autocoeffk_sp if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocoeffk_sp: size(mask) /= size(x)' - autocoeffk_sp = crosscoeffk(x, x, k, mask) + if (size(mask) /= size(x)) stop 'Error autocoeffk_sp: size(mask) /= size(x)' + autocoeffk_sp = crosscoeffk(x, x, k, mask) else - autocoeffk_sp = crosscoeffk(x, x, k) + autocoeffk_sp = crosscoeffk(x, x, k) end if END FUNCTION autocoeffk_sp @@ -558,21 +558,21 @@ FUNCTION autocoeffk_1d_dp(x, k, mask) result(acf) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), DIMENSION(:), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4) :: i - REAL(dp), DIMENSION(size(k)) :: acf + REAL(dp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), DIMENSION(:), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4) :: i + REAL(dp), DIMENSION(size(k)) :: acf if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocoeffk_1d_dp: size(mask) /= size(x)' - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i), mask) - end do + if (size(mask) /= size(x)) stop 'Error autocoeffk_1d_dp: size(mask) /= size(x)' + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i), mask) + end do else - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i)) - end do + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i)) + end do end if END FUNCTION autocoeffk_1d_dp @@ -582,21 +582,21 @@ FUNCTION autocoeffk_1d_sp(x, k, mask) result(acf) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), DIMENSION(:), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4) :: i - REAL(sp), DIMENSION(size(k)) :: acf + REAL(sp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), DIMENSION(:), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4) :: i + REAL(sp), DIMENSION(size(k)) :: acf if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocoeffk_1d_sp: size(mask) /= size(x)' - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i), mask) - end do + if (size(mask) /= size(x)) stop 'Error autocoeffk_1d_sp: size(mask) /= size(x)' + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i), mask) + end do else - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i)) - end do + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i)) + end do end if END FUNCTION autocoeffk_1d_sp @@ -607,16 +607,16 @@ FUNCTION autocorr_dp(x, k, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: autocorr_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: autocorr_dp if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocorr_1d_dp: size(mask) /= size(x)' - autocorr_dp = crosscoeffk(x, x, k, mask) / crosscoeffk(x, x, 0, mask) + if (size(mask) /= size(x)) stop 'Error autocorr_1d_dp: size(mask) /= size(x)' + autocorr_dp = crosscoeffk(x, x, k, mask) / crosscoeffk(x, x, 0, mask) else - autocorr_dp = crosscoeffk(x, x, k) / crosscoeffk(x, x, 0) + autocorr_dp = crosscoeffk(x, x, k) / crosscoeffk(x, x, 0) end if END FUNCTION autocorr_dp @@ -626,16 +626,16 @@ FUNCTION autocorr_sp(x, k, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: autocorr_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: autocorr_sp if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocorr_1d_sp: size(mask) /= size(x)' - autocorr_sp = crosscoeffk(x, x, k, mask) / crosscoeffk(x, x, 0, mask) + if (size(mask) /= size(x)) stop 'Error autocorr_1d_sp: size(mask) /= size(x)' + autocorr_sp = crosscoeffk(x, x, k, mask) / crosscoeffk(x, x, 0, mask) else - autocorr_sp = crosscoeffk(x, x, k) / crosscoeffk(x, x, 0) + autocorr_sp = crosscoeffk(x, x, k) / crosscoeffk(x, x, 0) end if END FUNCTION autocorr_sp @@ -644,24 +644,24 @@ FUNCTION autocorr_1d_dp(x, k, mask) result(acf) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4),DIMENSION(:), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4) :: i - REAL(dp), DIMENSION(size(k)) :: acf - REAL(dp) :: c0 + REAL(dp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), DIMENSION(:), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4) :: i + REAL(dp), DIMENSION(size(k)) :: acf + REAL(dp) :: c0 if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocorr_dp: size(mask) /= size(x)' - c0 = crosscoeffk(x, x, 0, mask) - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i), mask) / c0 - end do + if (size(mask) /= size(x)) stop 'Error autocorr_dp: size(mask) /= size(x)' + c0 = crosscoeffk(x, x, 0, mask) + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i), mask) / c0 + end do else - c0 = crosscoeffk(x, x, 0) - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i)) / c0 - end do + c0 = crosscoeffk(x, x, 0) + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i)) / c0 + end do end if END FUNCTION autocorr_1d_dp @@ -670,125 +670,125 @@ FUNCTION autocorr_1d_sp(x, k, mask) result(acf) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4),DIMENSION(:), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4) :: i - REAL(sp), DIMENSION(size(k)) :: acf - REAL(sp) :: c0 + REAL(sp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), DIMENSION(:), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4) :: i + REAL(sp), DIMENSION(size(k)) :: acf + REAL(sp) :: c0 if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error autocorr_sp: size(mask) /= size(x)' - c0 = crosscoeffk(x, x, 0, mask) - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i), mask) / c0 - end do + if (size(mask) /= size(x)) stop 'Error autocorr_sp: size(mask) /= size(x)' + c0 = crosscoeffk(x, x, 0, mask) + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i), mask) / c0 + end do else - c0 = crosscoeffk(x, x, 0) - do i = 1, size(k) - acf(i) = crosscoeffk(x, x, k(i)) / c0 - end do + c0 = crosscoeffk(x, x, 0) + do i = 1, size(k) + acf(i) = crosscoeffk(x, x, k(i)) / c0 + end do end if END FUNCTION autocorr_1d_sp ! ------------------------------------------------------------------ - FUNCTION corr_dp(data1,data2,nadjust,nhigh,nwin) + FUNCTION corr_dp(data1, data2, nadjust, nhigh, nwin) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: data1, data2 - INTEGER(i4), OPTIONAL, INTENT(OUT) :: nadjust - INTEGER(i4), OPTIONAL, INTENT(IN) :: nhigh - INTEGER(i4), OPTIONAL, INTENT(IN) :: nwin - REAL(dp), DIMENSION(size(data1)) :: corr_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: data1, data2 + INTEGER(i4), OPTIONAL, INTENT(OUT) :: nadjust + INTEGER(i4), OPTIONAL, INTENT(IN) :: nhigh + INTEGER(i4), OPTIONAL, INTENT(IN) :: nwin + REAL(dp), DIMENSION(size(data1)) :: corr_dp - REAL(dp), DIMENSION(:), ALLOCATABLE :: dat1, dat2, corrout + REAL(dp), DIMENSION(:), ALLOCATABLE :: dat1, dat2, corrout COMPLEX(dpc), DIMENSION(:), ALLOCATABLE :: cdat1, cdat2 - REAL(dp), DIMENSION(:), ALLOCATABLE :: win1 + REAL(dp), DIMENSION(:), ALLOCATABLE :: win1 !COMPLEX(dpc), DIMENSION(:), ALLOCATABLE :: cwin1 INTEGER(i4) :: i, n, no2, iwin, ihigh - REAL(dp) :: no2_1, ihigh1 + REAL(dp) :: no2_1, ihigh1 n = size(data1) if (size(data2) /= n) stop 'Error corr_dp: size(data1) /= size(data2)' if (present(nwin)) then - iwin = nwin + iwin = nwin else - iwin = 1 + iwin = 1 end if if (present(nhigh)) then - ihigh = nhigh + ihigh = nhigh else - ihigh = 0 + ihigh = 0 end if - if (iand(n,n-1) /= 0) then - if (present(nadjust)) then - n = 2**floor(log(real(n,dp))/log(2.0_dp)) - nadjust = n - else - stop 'Error corr_dp: size(data1) must be a power of 2' - end if + if (iand(n, n - 1) /= 0) then + if (present(nadjust)) then + n = 2**floor(log(real(n, dp)) / log(2.0_dp)) + nadjust = n + else + stop 'Error corr_dp: size(data1) must be a power of 2' + end if else - if (present(nadjust)) then - nadjust = n - end if + if (present(nadjust)) then + nadjust = n + end if end if allocate(dat1(n)) allocate(dat2(n)) - dat1 = data1(1:n) - dat2 = data2(1:n) + dat1 = data1(1 : n) + dat2 = data2(1 : n) - no2 = n/2 - no2_1 = 1.0_dp / real(no2,dp) + no2 = n / 2 + no2_1 = 1.0_dp / real(no2, dp) allocate(cdat1(no2)) allocate(cdat2(no2)) allocate(corrout(n)) ! FFT - call realft(dat1,1,cdat1) - call realft(dat2,1,cdat2) + call realft(dat1, 1, cdat1) + call realft(dat2, 1, cdat2) ! Highpass if (ihigh > 0) then - ! FxH - allocate(win1(no2)) - !allocate(cwin1(no2)) - select case(iwin) - case(0) ! no window - win1(1:no2) = 1.0_dp - case(1) ! ideal high pass filter - win1(1:ihigh) = 0.0_dp - win1(ihigh+1:no2) = 1.0_dp - case(2) ! similar Bartlett window - ihigh1 = 1.0_dp / real(ihigh,dp) - forall(i=1:ihigh) win1(i) = real(i-1,dp) * ihigh1 - win1(ihigh+1:no2) = 1.0_dp - case default - stop 'Unimplemented window option in corr_dp' - end select - !cwin1 = cmplx(win1, win1, kind=dpc) - ! low pass - ! cdat1(1:no2) = cdat1(1:no2)*cwin1(1:no2) - ! cdat2(1:no2) = cdat2(1:no2)*cwin1(1:no2) - cdat1(1:no2) = cdat1(1:no2) * win1(1:no2) - cdat2(1:no2) = cdat2(1:no2) * win1(1:no2) + ! FxH + allocate(win1(no2)) + !allocate(cwin1(no2)) + select case(iwin) + case(0) ! no window + win1(1 : no2) = 1.0_dp + case(1) ! ideal high pass filter + win1(1 : ihigh) = 0.0_dp + win1(ihigh + 1 : no2) = 1.0_dp + case(2) ! similar Bartlett window + ihigh1 = 1.0_dp / real(ihigh, dp) + forall(i = 1 : ihigh) win1(i) = real(i - 1, dp) * ihigh1 + win1(ihigh + 1 : no2) = 1.0_dp + case default + stop 'Unimplemented window option in corr_dp' + end select + !cwin1 = cmplx(win1, win1, kind=dpc) + ! low pass + ! cdat1(1:no2) = cdat1(1:no2)*cwin1(1:no2) + ! cdat2(1:no2) = cdat2(1:no2)*cwin1(1:no2) + cdat1(1 : no2) = cdat1(1 : no2) * win1(1 : no2) + cdat2(1 : no2) = cdat2(1 : no2) * win1(1 : no2) end if ! FxF* - cdat1(1) = cmplx(real(cdat1(1))*real(cdat2(1))*no2_1, & - aimag(cdat1(1))*aimag(cdat2(1))*no2_1, kind=dpc) - cdat1(2:) = cdat1(2:)*conjg(cdat2(2:))*no2_1 + cdat1(1) = cmplx(real(cdat1(1)) * real(cdat2(1)) * no2_1, & + aimag(cdat1(1)) * aimag(cdat2(1)) * no2_1, kind = dpc) + cdat1(2 :) = cdat1(2 :) * conjg(cdat2(2 :)) * no2_1 ! IFFT - call realft(corrout,-1,cdat1) - corr_dp(1:n) = corrout(1:n) - if (size(corr_dp) > n) corr_dp(n+1:) = 0.0_dp + call realft(corrout, -1, cdat1) + corr_dp(1 : n) = corrout(1 : n) + if (size(corr_dp) > n) corr_dp(n + 1 :) = 0.0_dp deallocate(dat1) deallocate(dat2) @@ -796,108 +796,108 @@ FUNCTION corr_dp(data1,data2,nadjust,nhigh,nwin) deallocate(cdat2) deallocate(corrout) if (ihigh > 0) then - deallocate(win1) - !deallocate(cwin1) + deallocate(win1) + !deallocate(cwin1) end if END FUNCTION corr_dp - FUNCTION corr_sp(data1,data2,nadjust,nhigh,nwin) + FUNCTION corr_sp(data1, data2, nadjust, nhigh, nwin) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: data1, data2 - INTEGER(i4), OPTIONAL, INTENT(OUT) :: nadjust - INTEGER(i4), OPTIONAL, INTENT(IN) :: nhigh - INTEGER(i4), OPTIONAL, INTENT(IN) :: nwin - REAL(sp), DIMENSION(size(data1)) :: corr_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: data1, data2 + INTEGER(i4), OPTIONAL, INTENT(OUT) :: nadjust + INTEGER(i4), OPTIONAL, INTENT(IN) :: nhigh + INTEGER(i4), OPTIONAL, INTENT(IN) :: nwin + REAL(sp), DIMENSION(size(data1)) :: corr_sp - REAL(sp), DIMENSION(:), ALLOCATABLE :: dat1, dat2, corrout + REAL(sp), DIMENSION(:), ALLOCATABLE :: dat1, dat2, corrout COMPLEX(spc), DIMENSION(:), ALLOCATABLE :: cdat1, cdat2 - REAL(sp), DIMENSION(:), ALLOCATABLE :: win1 + REAL(sp), DIMENSION(:), ALLOCATABLE :: win1 !COMPLEX(spc), DIMENSION(:), ALLOCATABLE :: cwin1 INTEGER(i4) :: i, n, no2, iwin, ihigh - REAL(sp) :: no2_1, ihigh1 + REAL(sp) :: no2_1, ihigh1 n = size(data1) if (size(data2) /= n) stop 'Error corr_sp: size(data1) /= size(data2)' if (present(nwin)) then - iwin = nwin + iwin = nwin else - iwin = 1 + iwin = 1 end if if (present(nhigh)) then - ihigh = nhigh + ihigh = nhigh else - ihigh = 0 + ihigh = 0 end if - if (iand(n,n-1) /= 0) then - if (present(nadjust)) then - n = 2**floor(log(real(n,sp))/log(2.0_sp)) - nadjust = n - else - stop 'Error corr_sp: size(data1) must be a power of 2' - end if + if (iand(n, n - 1) /= 0) then + if (present(nadjust)) then + n = 2**floor(log(real(n, sp)) / log(2.0_sp)) + nadjust = n + else + stop 'Error corr_sp: size(data1) must be a power of 2' + end if else - if (present(nadjust)) then - nadjust = n - end if + if (present(nadjust)) then + nadjust = n + end if end if allocate(dat1(n)) allocate(dat2(n)) - dat1 = data1(1:n) - dat2 = data2(1:n) + dat1 = data1(1 : n) + dat2 = data2(1 : n) - no2 = n/2 - no2_1 = 1.0_sp / real(no2,sp) + no2 = n / 2 + no2_1 = 1.0_sp / real(no2, sp) allocate(cdat1(no2)) allocate(cdat2(no2)) allocate(corrout(n)) ! FFT - call realft(dat1,1,cdat1) - call realft(dat2,1,cdat2) + call realft(dat1, 1, cdat1) + call realft(dat2, 1, cdat2) ! Highpass if (ihigh > 0) then - ! FxH - allocate(win1(no2)) - !allocate(cwin1(no2)) - select case(iwin) - case(0) ! no window - win1(1:no2) = 1.0_sp - case(1) ! ideal high pass filter - win1(1:ihigh) = 0.0_sp - win1(ihigh+1:no2) = 1.0_sp - case(2) ! similar Bartlett window - ihigh1 = 1.0_sp / real(ihigh,sp) - forall(i=1:ihigh) win1(i) = real(i-1,sp) * ihigh1 - win1(ihigh+1:no2) = 1.0_sp - case default - stop 'Unimplemented window option in corr_sp' - end select - !cwin1 = cmplx(win1, win1, kind=spc) - ! low pass - ! cdat1(1:no2) = cdat1(1:no2)*cwin1(1:no2) - ! cdat2(1:no2) = cdat2(1:no2)*cwin1(1:no2) - cdat1(1:no2) = cdat1(1:no2) * win1(1:no2) - cdat2(1:no2) = cdat2(1:no2) * win1(1:no2) + ! FxH + allocate(win1(no2)) + !allocate(cwin1(no2)) + select case(iwin) + case(0) ! no window + win1(1 : no2) = 1.0_sp + case(1) ! ideal high pass filter + win1(1 : ihigh) = 0.0_sp + win1(ihigh + 1 : no2) = 1.0_sp + case(2) ! similar Bartlett window + ihigh1 = 1.0_sp / real(ihigh, sp) + forall(i = 1 : ihigh) win1(i) = real(i - 1, sp) * ihigh1 + win1(ihigh + 1 : no2) = 1.0_sp + case default + stop 'Unimplemented window option in corr_sp' + end select + !cwin1 = cmplx(win1, win1, kind=spc) + ! low pass + ! cdat1(1:no2) = cdat1(1:no2)*cwin1(1:no2) + ! cdat2(1:no2) = cdat2(1:no2)*cwin1(1:no2) + cdat1(1 : no2) = cdat1(1 : no2) * win1(1 : no2) + cdat2(1 : no2) = cdat2(1 : no2) * win1(1 : no2) end if ! FxF* - cdat1(1) = cmplx(real(cdat1(1))*real(cdat2(1))*no2_1, & - aimag(cdat1(1))*aimag(cdat2(1))*no2_1, kind=spc) - cdat1(2:) = cdat1(2:)*conjg(cdat2(2:))*no2_1 + cdat1(1) = cmplx(real(cdat1(1)) * real(cdat2(1)) * no2_1, & + aimag(cdat1(1)) * aimag(cdat2(1)) * no2_1, kind = spc) + cdat1(2 :) = cdat1(2 :) * conjg(cdat2(2 :)) * no2_1 ! IFFT - call realft(corrout,-1,cdat1) - corr_sp(1:n) = corrout(1:n) - if (size(corr_sp) > n) corr_sp(n+1:) = 0.0_sp + call realft(corrout, -1, cdat1) + corr_sp(1 : n) = corrout(1 : n) + if (size(corr_sp) > n) corr_sp(n + 1 :) = 0.0_sp deallocate(dat1) deallocate(dat2) @@ -905,8 +905,8 @@ FUNCTION corr_sp(data1,data2,nadjust,nhigh,nwin) deallocate(cdat2) deallocate(corrout) if (ihigh > 0) then - deallocate(win1) - !deallocate(cwin1) + deallocate(win1) + !deallocate(cwin1) end if END FUNCTION corr_sp @@ -917,96 +917,96 @@ FUNCTION crosscoeffk_dp(x, y, k, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - REAL(dp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: crosscoeffk_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + REAL(dp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: crosscoeffk_dp INTEGER(i4) :: nn ! number of true values in mask INTEGER(i4) :: nnn ! number of true values in mask .and. shifted mask by lag k - REAL(dp) :: n ! real of nn or nnn + REAL(dp) :: n ! real of nn or nnn INTEGER(i4) :: kk ! absolute value of lag k - REAL(dp) :: ave + REAL(dp) :: ave - REAL(dp), DIMENSION(size(x)) :: xdash - REAL(dp), DIMENSION(size(x)) :: ydash - LOGICAL, DIMENSION(size(x)) :: maske + REAL(dp), DIMENSION(size(x)) :: xdash + REAL(dp), DIMENSION(size(x)) :: ydash + LOGICAL, DIMENSION(size(x)) :: maske maske(:) = .true. if (present(mask)) then - if (size(x) /= size(y)) stop 'Error crosscoeffk_dp: size(x) /= size(y)' - if (size(mask) /= size(x)) stop 'Error crosscoeffk_dp: size(mask) /= size(x)' - maske = mask + if (size(x) /= size(y)) stop 'Error crosscoeffk_dp: size(x) /= size(y)' + if (size(mask) /= size(x)) stop 'Error crosscoeffk_dp: size(mask) /= size(x)' + maske = mask end if - nn = count(maske) - n = real(nn,dp) + nn = count(maske) + n = real(nn, dp) ! crosscoeffk(x, y, k) = crosscoeffk(y, x, -k) if (k >= 0) then - ave = sum(x(:), mask=maske)/n - xdash = x - ave - ave = sum(y(:), mask=maske)/n - ydash = y - ave + ave = sum(x(:), mask = maske) / n + xdash = x - ave + ave = sum(y(:), mask = maske) / n + ydash = y - ave else - ave = sum(y(:), mask=maske)/n - xdash = y - ave - ave = sum(x(:), mask=maske)/n - ydash = x - ave + ave = sum(y(:), mask = maske) / n + xdash = y - ave + ave = sum(x(:), mask = maske) / n + ydash = x - ave end if kk = abs(k) - nnn = size(x,1) - n = real(count(maske(1:nnn-kk).and.maske(1+kk:nnn)),dp) - crosscoeffk_dp = sum(xdash(1:nnn-kk)*ydash(1+kk:nnn), mask=(maske(1:nnn-kk).and.maske(1+kk:nnn))) / n - + nnn = size(x, 1) + n = real(count(maske(1 : nnn - kk).and.maske(1 + kk : nnn)), dp) + crosscoeffk_dp = sum(xdash(1 : nnn - kk) * ydash(1 + kk : nnn), mask = (maske(1 : nnn - kk).and.maske(1 + kk : nnn))) / n + END FUNCTION crosscoeffk_dp FUNCTION crosscoeffk_sp(x, y, k, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - REAL(sp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: crosscoeffk_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + REAL(sp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: crosscoeffk_sp INTEGER(i4) :: nn ! number of true values in mask INTEGER(i4) :: nnn ! number of true values in mask .and. shifted mask by lag k - REAL(sp) :: n ! real of nn or nnn + REAL(sp) :: n ! real of nn or nnn INTEGER(i4) :: kk ! absolute value of lag k - REAL(sp) :: ave + REAL(sp) :: ave - REAL(sp), DIMENSION(size(x)) :: xdash - REAL(sp), DIMENSION(size(x)) :: ydash - LOGICAL, DIMENSION(size(x)) :: maske + REAL(sp), DIMENSION(size(x)) :: xdash + REAL(sp), DIMENSION(size(x)) :: ydash + LOGICAL, DIMENSION(size(x)) :: maske maske(:) = .true. if (present(mask)) then - if (size(x) /= size(y)) stop 'Error crosscoeffk_sp: size(x) /= size(y)' - if (size(mask) /= size(x)) stop 'Error crosscoeffk_sp: size(mask) /= size(x)' - maske = mask + if (size(x) /= size(y)) stop 'Error crosscoeffk_sp: size(x) /= size(y)' + if (size(mask) /= size(x)) stop 'Error crosscoeffk_sp: size(mask) /= size(x)' + maske = mask end if - nn = count(maske) - n = real(nn,sp) + nn = count(maske) + n = real(nn, sp) ! crosscoeffk(x, y, k) = crosscoeffk(y, x, -k) if (k >= 0) then - ave = sum(x(:), mask=maske)/n - xdash = x - ave - ave = sum(y(:), mask=maske)/n - ydash = y - ave + ave = sum(x(:), mask = maske) / n + xdash = x - ave + ave = sum(y(:), mask = maske) / n + ydash = y - ave else - ave = sum(y(:), mask=maske)/n - xdash = y - ave - ave = sum(x(:), mask=maske)/n - ydash = x - ave + ave = sum(y(:), mask = maske) / n + xdash = y - ave + ave = sum(x(:), mask = maske) / n + ydash = x - ave end if kk = abs(k) - nnn = size(x,1) - n = real(count(maske(1:nnn-kk).and.maske(1+kk:nnn)),sp) - crosscoeffk_sp = sum(xdash(1:nnn-kk)*ydash(1+kk:nnn), mask=(maske(1:nnn-kk).and.maske(1+kk:nnn))) / n - + nnn = size(x, 1) + n = real(count(maske(1 : nnn - kk).and.maske(1 + kk : nnn)), sp) + crosscoeffk_sp = sum(xdash(1 : nnn - kk) * ydash(1 + kk : nnn), mask = (maske(1 : nnn - kk).and.maske(1 + kk : nnn))) / n + END FUNCTION crosscoeffk_sp ! ------------------------------------------------------------------ @@ -1015,18 +1015,18 @@ FUNCTION crosscorr_dp(x, y, k, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - REAL(dp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: crosscorr_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + REAL(dp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: crosscorr_dp if (size(x) /= size(y)) stop 'Error crosscorr_dp: size(x) /= size(y)' if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error crosscorr_dp: size(mask) /= size(x)' - crosscorr_dp = crosscoeffk(x, y, k, mask) / crosscoeffk(x, y, 0, mask) + if (size(mask) /= size(x)) stop 'Error crosscorr_dp: size(mask) /= size(x)' + crosscorr_dp = crosscoeffk(x, y, k, mask) / crosscoeffk(x, y, 0, mask) else - crosscorr_dp = crosscoeffk(x, y, k) / crosscoeffk(x, y, 0) + crosscorr_dp = crosscoeffk(x, y, k) / crosscoeffk(x, y, 0) end if END FUNCTION crosscorr_dp @@ -1035,18 +1035,18 @@ FUNCTION crosscorr_sp(x, y, k, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - REAL(sp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: crosscorr_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + REAL(sp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: crosscorr_sp if (size(x) /= size(y)) stop 'Error crosscorr_sp: size(x) /= size(y)' if (present(mask)) then - if (size(mask) /= size(x)) stop 'Error crosscorr_sp: size(mask) /= size(x)' - crosscorr_sp = crosscoeffk(x, y, k, mask) / crosscoeffk(x, y, 0, mask) + if (size(mask) /= size(x)) stop 'Error crosscorr_sp: size(mask) /= size(x)' + crosscorr_sp = crosscoeffk(x, y, k, mask) / crosscoeffk(x, y, 0, mask) else - crosscorr_sp = crosscoeffk(x, y, k) / crosscoeffk(x, y, 0) + crosscorr_sp = crosscoeffk(x, y, k) / crosscoeffk(x, y, 0) end if END FUNCTION crosscorr_sp @@ -1060,72 +1060,72 @@ END FUNCTION crosscorr_sp ! by internally reshaping the input array to two dimensions. (Use this version if fourrow is ! faster than fourcol on your machine.) - SUBROUTINE four1_sp(data,isign) + SUBROUTINE four1_sp(data, isign) IMPLICIT NONE COMPLEX(spc), DIMENSION(:), INTENT(INOUT) :: data - INTEGER(i4), INTENT(IN) :: isign + INTEGER(i4), INTENT(IN) :: isign - COMPLEX(spc), DIMENSION(:,:), ALLOCATABLE :: dat,temp - COMPLEX(dpc), DIMENSION(:), ALLOCATABLE :: w,wp - REAL(dp), DIMENSION(:), ALLOCATABLE :: theta + COMPLEX(spc), DIMENSION(:, :), ALLOCATABLE :: dat, temp + COMPLEX(dpc), DIMENSION(:), ALLOCATABLE :: w, wp + REAL(dp), DIMENSION(:), ALLOCATABLE :: theta INTEGER(i4) :: n, m1, m2, j n = size(data) - if (iand(n,n-1) /= 0) stop 'Error four1_sp: size(data1) must be a power of 2' - - m1 = 2**ceiling(0.5_sp*log(real(n,sp))/0.693147_sp) - m2 = n/m1 - allocate(dat(m1,m2),theta(m1),w(m1),wp(m1),temp(m2,m1)) - dat = reshape(data,shape(dat)) - call fourrow(dat,isign) - theta = arth(0,isign,m1)*TWOPI_dp/real(n,dp) - wp = cmplx(-2.0_dp*sin(0.5_dp*theta)**2,sin(theta),kind=dpc) - w = cmplx(1.0_dp,0.0_dp,kind=dpc) - do j=2, m2 - w = w*wp+w - dat(:,j) = dat(:,j)*cmplx(w,kind=spc) + if (iand(n, n - 1) /= 0) stop 'Error four1_sp: size(data1) must be a power of 2' + + m1 = 2**ceiling(0.5_sp * log(real(n, sp)) / 0.693147_sp) + m2 = n / m1 + allocate(dat(m1, m2), theta(m1), w(m1), wp(m1), temp(m2, m1)) + dat = reshape(data, shape(dat)) + call fourrow(dat, isign) + theta = arth(0, isign, m1) * TWOPI_dp / real(n, dp) + wp = cmplx(-2.0_dp * sin(0.5_dp * theta)**2, sin(theta), kind = dpc) + w = cmplx(1.0_dp, 0.0_dp, kind = dpc) + do j = 2, m2 + w = w * wp + w + dat(:, j) = dat(:, j) * cmplx(w, kind = spc) end do - temp=transpose(dat) - call fourrow(temp,isign) - data=reshape(temp,shape(data)) - deallocate(dat,w,wp,theta,temp) + temp = transpose(dat) + call fourrow(temp, isign) + data = reshape(temp, shape(data)) + deallocate(dat, w, wp, theta, temp) END SUBROUTINE four1_sp - SUBROUTINE four1_dp(data,isign) + SUBROUTINE four1_dp(data, isign) IMPLICIT NONE COMPLEX(dpc), DIMENSION(:), INTENT(INOUT) :: data - INTEGER(i4), INTENT(IN) :: isign + INTEGER(i4), INTENT(IN) :: isign - COMPLEX(dpc), DIMENSION(:,:), ALLOCATABLE :: dat,temp - COMPLEX(dpc), DIMENSION(:), ALLOCATABLE :: w,wp - REAL(dp), DIMENSION(:), ALLOCATABLE :: theta + COMPLEX(dpc), DIMENSION(:, :), ALLOCATABLE :: dat, temp + COMPLEX(dpc), DIMENSION(:), ALLOCATABLE :: w, wp + REAL(dp), DIMENSION(:), ALLOCATABLE :: theta INTEGER(i4) :: n, m1, m2, j - n=size(data) - if (iand(n,n-1) /= 0) stop 'Error four1_dp: size(data1) must be a power of 2' - - m1 = 2**ceiling(0.5_sp*log(real(n,sp))/0.693147_sp) - m2 = n/m1 - allocate(dat(m1,m2),theta(m1),w(m1),wp(m1),temp(m2,m1)) - dat = reshape(data,shape(dat)) - call fourrow(dat,isign) - theta = arth(0,isign,m1)*TWOPI_dp/real(n,dp) - wp = cmplx(-2.0_dp*sin(0.5_dp*theta)**2,sin(theta),kind=dpc) - w = cmplx(1.0_dp,0.0_dp,kind=dpc) - do j=2, m2 - w = w*wp+w - dat(:,j) = dat(:,j)*w + n = size(data) + if (iand(n, n - 1) /= 0) stop 'Error four1_dp: size(data1) must be a power of 2' + + m1 = 2**ceiling(0.5_sp * log(real(n, sp)) / 0.693147_sp) + m2 = n / m1 + allocate(dat(m1, m2), theta(m1), w(m1), wp(m1), temp(m2, m1)) + dat = reshape(data, shape(dat)) + call fourrow(dat, isign) + theta = arth(0, isign, m1) * TWOPI_dp / real(n, dp) + wp = cmplx(-2.0_dp * sin(0.5_dp * theta)**2, sin(theta), kind = dpc) + w = cmplx(1.0_dp, 0.0_dp, kind = dpc) + do j = 2, m2 + w = w * wp + w + dat(:, j) = dat(:, j) * w end do - temp=transpose(dat) - call fourrow(temp,isign) - data=reshape(temp,shape(data)) - deallocate(dat,w,wp,theta,temp) + temp = transpose(dat) + call fourrow(temp, isign) + data = reshape(temp, shape(data)) + deallocate(dat, w, wp, theta, temp) END SUBROUTINE four1_dp @@ -1137,101 +1137,101 @@ END SUBROUTINE four1_dp ! by N times its inverse discrete Fourier transform, if isign is input as -1. N must be an ! integer power of 2. Parallelism is M-fold on the first index of data. - SUBROUTINE fourrow_sp(data,isign) + SUBROUTINE fourrow_sp(data, isign) IMPLICIT NONE - COMPLEX(spc), DIMENSION(:,:), INTENT(INOUT) :: data - INTEGER(i4), INTENT(IN) :: isign + COMPLEX(spc), DIMENSION(:, :), INTENT(INOUT) :: data + INTEGER(i4), INTENT(IN) :: isign INTEGER(i4) :: n, i, istep, j, m, mmax, n2 - REAL(dp) :: theta - COMPLEX(spc), DIMENSION(size(data,1)) :: temp + REAL(dp) :: theta + COMPLEX(spc), DIMENSION(size(data, 1)) :: temp COMPLEX(dpc) :: w, wp COMPLEX(spc) :: ws - n=size(data,2) - if (iand(n,n-1) /= 0) stop 'Error fourrow_sp: size(data,2) must be a power of 2' - n2 = n/2 + n = size(data, 2) + if (iand(n, n - 1) /= 0) stop 'Error fourrow_sp: size(data,2) must be a power of 2' + n2 = n / 2 j = n2 - do i=1, n-2 - if (j > i) call swap(data(:,j+1),data(:,i+1)) - m = n2 - do - if (m < 2 .or. j < m) exit - j = j-m - m = m/2 - end do - j = j+m + do i = 1, n - 2 + if (j > i) call swap(data(:, j + 1), data(:, i + 1)) + m = n2 + do + if (m < 2 .or. j < m) exit + j = j - m + m = m / 2 + end do + j = j + m end do mmax = 1 do - if (n <= mmax) exit - istep = 2*mmax - theta = PI_dp/real(isign*mmax,dp) - wp = cmplx(-2.0_dp*sin(0.5_dp*theta)**2,sin(theta),kind=dpc) - w = cmplx(1.0_dp,0.0_dp,kind=dpc) - do m=1, mmax - ws = cmplx(w,kind=spc) - do i=m, n, istep - j = i+mmax - temp = ws*data(:,j) - data(:,j) = data(:,i)-temp - data(:,i) = data(:,i)+temp - end do - w = w*wp+w - end do - mmax = istep + if (n <= mmax) exit + istep = 2 * mmax + theta = PI_dp / real(isign * mmax, dp) + wp = cmplx(-2.0_dp * sin(0.5_dp * theta)**2, sin(theta), kind = dpc) + w = cmplx(1.0_dp, 0.0_dp, kind = dpc) + do m = 1, mmax + ws = cmplx(w, kind = spc) + do i = m, n, istep + j = i + mmax + temp = ws * data(:, j) + data(:, j) = data(:, i) - temp + data(:, i) = data(:, i) + temp + end do + w = w * wp + w + end do + mmax = istep end do END SUBROUTINE fourrow_sp - SUBROUTINE fourrow_dp(data,isign) + SUBROUTINE fourrow_dp(data, isign) IMPLICIT NONE - COMPLEX(dpc), DIMENSION(:,:), INTENT(INOUT) :: data - INTEGER(i4), INTENT(IN) :: isign + COMPLEX(dpc), DIMENSION(:, :), INTENT(INOUT) :: data + INTEGER(i4), INTENT(IN) :: isign INTEGER(i4) :: n, i, istep, j, m, mmax, n2 - REAL(dp) :: theta - COMPLEX(dpc), DIMENSION(size(data,1)) :: temp + REAL(dp) :: theta + COMPLEX(dpc), DIMENSION(size(data, 1)) :: temp COMPLEX(dpc) :: w, wp COMPLEX(dpc) :: ws - n=size(data,2) - if (iand(n,n-1) /= 0) stop 'Error fourrow_dp: size(data,2) must be a power of 2' - n2 = n/2 - j = n2 - do i=1, n-2 - if (j > i) call swap(data(:,j+1),data(:,i+1)) - m = n2 - do - if (m < 2 .or. j < m) exit - j = j-m - m = m/2 - end do - j = j+m + n = size(data, 2) + if (iand(n, n - 1) /= 0) stop 'Error fourrow_dp: size(data,2) must be a power of 2' + n2 = n / 2 + j = n2 + do i = 1, n - 2 + if (j > i) call swap(data(:, j + 1), data(:, i + 1)) + m = n2 + do + if (m < 2 .or. j < m) exit + j = j - m + m = m / 2 + end do + j = j + m end do mmax = 1 do - if (n <= mmax) exit - istep = 2*mmax - theta = PI_dp/real(isign*mmax,dp) - wp = cmplx(-2.0_dp*sin(0.5_dp*theta)**2,sin(theta),kind=dpc) - w = cmplx(1.0_dp,0.0_dp,kind=dpc) - do m=1, mmax - ws = w - do i=m, n, istep - j = i+mmax - temp = ws*data(:,j) - data(:,j) = data(:,i)-temp - data(:,i) = data(:,i)+temp - end do - w = w*wp+w - end do - mmax = istep + if (n <= mmax) exit + istep = 2 * mmax + theta = PI_dp / real(isign * mmax, dp) + wp = cmplx(-2.0_dp * sin(0.5_dp * theta)**2, sin(theta), kind = dpc) + w = cmplx(1.0_dp, 0.0_dp, kind = dpc) + do m = 1, mmax + ws = w + do i = m, n, istep + j = i + mmax + temp = ws * data(:, j) + data(:, j) = data(:, i) - temp + data(:, i) = data(:, i) + temp + end do + w = w * wp + w + end do + mmax = istep end do END SUBROUTINE fourrow_dp @@ -1248,121 +1248,121 @@ END SUBROUTINE fourrow_dp ! calculates the inverse transform of a complex data array if it is the transform of real data. ! (Result in this case must be multiplied by 2/N.) The data can be supplied either in data, ! with zdata absent, or inzdata. - SUBROUTINE realft_dp(data,isign,zdata) + SUBROUTINE realft_dp(data, isign, zdata) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(INOUT) :: data - INTEGER(i4), INTENT(IN) :: isign + REAL(dp), DIMENSION(:), INTENT(INOUT) :: data + INTEGER(i4), INTENT(IN) :: isign COMPLEX(dpc), DIMENSION(:), OPTIONAL, TARGET :: zdata INTEGER(i4) :: n, nh, nq - COMPLEX(dpc), DIMENSION(size(data)/4) :: w - COMPLEX(dpc), DIMENSION(size(data)/4-1) :: h1,h2 + COMPLEX(dpc), DIMENSION(size(data) / 4) :: w + COMPLEX(dpc), DIMENSION(size(data) / 4 - 1) :: h1, h2 COMPLEX(dpc), DIMENSION(:), POINTER :: cdata COMPLEX(dpc) :: z - REAL(dp) :: c1=0.5_dp, c2 + REAL(dp) :: c1 = 0.5_dp, c2 n = size(data) - if (iand(n,n-1) /= 0) stop 'Error realft_dp: size(data) must be a power of 2' - nh = n/2 - nq = n/4 + if (iand(n, n - 1) /= 0) stop 'Error realft_dp: size(data) must be a power of 2' + nh = n / 2 + nq = n / 4 if (present(zdata)) then - if (n/2 /= size(zdata)) stop 'Error realft_dp: size(zdata) /= size(data)/2' - cdata => zdata - if (isign == 1) cdata = cmplx(data(1:n-1:2),data(2:n:2),kind=dpc) + if (n / 2 /= size(zdata)) stop 'Error realft_dp: size(zdata) /= size(data)/2' + cdata => zdata + if (isign == 1) cdata = cmplx(data(1 : n - 1 : 2), data(2 : n : 2), kind = dpc) else - allocate(cdata(n/2)) - cdata = cmplx(data(1:n-1:2),data(2:n:2),kind=dpc) + allocate(cdata(n / 2)) + cdata = cmplx(data(1 : n - 1 : 2), data(2 : n : 2), kind = dpc) end if if (isign == 1) then - c2 = -0.5_dp - call four1(cdata,+1) + c2 = -0.5_dp + call four1(cdata, +1) else - c2 = 0.5_dp + c2 = 0.5_dp end if - w = zroots_unity_dp(sign(n,isign),n/4) - w = cmplx(-aimag(w),real(w),kind=dpc) - h1 = c1*(cdata(2:nq)+conjg(cdata(nh:nq+2:-1))) - h2 = c2*(cdata(2:nq)-conjg(cdata(nh:nq+2:-1))) - cdata(2:nq) = h1+w(2:nq)*h2 - cdata(nh:nq+2:-1) = conjg(h1-w(2:nq)*h2) + w = zroots_unity_dp(sign(n, isign), n / 4) + w = cmplx(-aimag(w), real(w), kind = dpc) + h1 = c1 * (cdata(2 : nq) + conjg(cdata(nh : nq + 2 : -1))) + h2 = c2 * (cdata(2 : nq) - conjg(cdata(nh : nq + 2 : -1))) + cdata(2 : nq) = h1 + w(2 : nq) * h2 + cdata(nh : nq + 2 : -1) = conjg(h1 - w(2 : nq) * h2) z = cdata(1) if (isign == 1) then - cdata(1) = cmplx(real(z)+aimag(z),real(z)-aimag(z),kind=dpc) + cdata(1) = cmplx(real(z) + aimag(z), real(z) - aimag(z), kind = dpc) else - cdata(1) = cmplx(c1*(real(z)+aimag(z)),c1*(real(z)-aimag(z)),kind=dpc) - call four1(cdata,-1) + cdata(1) = cmplx(c1 * (real(z) + aimag(z)), c1 * (real(z) - aimag(z)), kind = dpc) + call four1(cdata, -1) end if if (present(zdata)) then - if (isign /= 1) then - data(1:n-1:2) = real(cdata) - data(2:n:2) = aimag(cdata) - end if + if (isign /= 1) then + data(1 : n - 1 : 2) = real(cdata) + data(2 : n : 2) = aimag(cdata) + end if else - data(1:n-1:2) = real(cdata) - data(2:n:2) = aimag(cdata) - deallocate(cdata) + data(1 : n - 1 : 2) = real(cdata) + data(2 : n : 2) = aimag(cdata) + deallocate(cdata) end if END SUBROUTINE realft_dp - SUBROUTINE realft_sp(data,isign,zdata) + SUBROUTINE realft_sp(data, isign, zdata) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(INOUT) :: data - INTEGER(i4), INTENT(IN) :: isign + REAL(sp), DIMENSION(:), INTENT(INOUT) :: data + INTEGER(i4), INTENT(IN) :: isign COMPLEX(spc), DIMENSION(:), OPTIONAL, TARGET :: zdata INTEGER(i4) :: n, nh, nq - COMPLEX(spc), DIMENSION(size(data)/4) :: w - COMPLEX(spc), DIMENSION(size(data)/4-1) :: h1,h2 + COMPLEX(spc), DIMENSION(size(data) / 4) :: w + COMPLEX(spc), DIMENSION(size(data) / 4 - 1) :: h1, h2 COMPLEX(spc), DIMENSION(:), POINTER :: cdata COMPLEX(spc) :: z - REAL(sp) :: c1=0.5_sp, c2 + REAL(sp) :: c1 = 0.5_sp, c2 n = size(data) - if (iand(n,n-1) /= 0) stop 'Error realft_sp: size(data) must be a power of 2' - nh = n/2 - nq = n/4 + if (iand(n, n - 1) /= 0) stop 'Error realft_sp: size(data) must be a power of 2' + nh = n / 2 + nq = n / 4 if (present(zdata)) then - if (n/2 /= size(zdata)) stop 'Error realft_sp: size(zdata) /= size(data)/2' - cdata => zdata - if (isign == 1) cdata = cmplx(data(1:n-1:2),data(2:n:2),kind=spc) + if (n / 2 /= size(zdata)) stop 'Error realft_sp: size(zdata) /= size(data)/2' + cdata => zdata + if (isign == 1) cdata = cmplx(data(1 : n - 1 : 2), data(2 : n : 2), kind = spc) else - allocate(cdata(n/2)) - cdata = cmplx(data(1:n-1:2),data(2:n:2),kind=spc) + allocate(cdata(n / 2)) + cdata = cmplx(data(1 : n - 1 : 2), data(2 : n : 2), kind = spc) end if if (isign == 1) then - c2 = -0.5_sp - call four1(cdata,+1) + c2 = -0.5_sp + call four1(cdata, +1) else - c2 = 0.5_sp + c2 = 0.5_sp end if - w = zroots_unity_sp(sign(n,isign),n/4) - w = cmplx(-aimag(w),real(w),kind=spc) - h1 = c1*(cdata(2:nq)+conjg(cdata(nh:nq+2:-1))) - h2 = c2*(cdata(2:nq)-conjg(cdata(nh:nq+2:-1))) - cdata(2:nq) = h1+w(2:nq)*h2 - cdata(nh:nq+2:-1) = conjg(h1-w(2:nq)*h2) + w = zroots_unity_sp(sign(n, isign), n / 4) + w = cmplx(-aimag(w), real(w), kind = spc) + h1 = c1 * (cdata(2 : nq) + conjg(cdata(nh : nq + 2 : -1))) + h2 = c2 * (cdata(2 : nq) - conjg(cdata(nh : nq + 2 : -1))) + cdata(2 : nq) = h1 + w(2 : nq) * h2 + cdata(nh : nq + 2 : -1) = conjg(h1 - w(2 : nq) * h2) z = cdata(1) if (isign == 1) then - cdata(1) = cmplx(real(z)+aimag(z),real(z)-aimag(z),kind=spc) + cdata(1) = cmplx(real(z) + aimag(z), real(z) - aimag(z), kind = spc) else - cdata(1) = cmplx(c1*(real(z)+aimag(z)),c1*(real(z)-aimag(z)),kind=spc) - call four1(cdata,-1) + cdata(1) = cmplx(c1 * (real(z) + aimag(z)), c1 * (real(z) - aimag(z)), kind = spc) + call four1(cdata, -1) end if if (present(zdata)) then - if (isign /= 1) then - data(1:n-1:2) = real(cdata) - data(2:n:2) = aimag(cdata) - end if + if (isign /= 1) then + data(1 : n - 1 : 2) = real(cdata) + data(2 : n : 2) = aimag(cdata) + end if else - data(1:n-1:2) = real(cdata) - data(2:n:2) = aimag(cdata) - deallocate(cdata) + data(1 : n - 1 : 2) = real(cdata) + data(2 : n : 2) = aimag(cdata) + deallocate(cdata) end if END SUBROUTINE realft_sp @@ -1536,12 +1536,12 @@ END SUBROUTINE realft_sp ! END SUBROUTINE masked_swap_2d_spc - SUBROUTINE swap_1d_spc(a,b) - COMPLEX(spc), DIMENSION(:), INTENT(INOUT) :: a,b + SUBROUTINE swap_1d_spc(a, b) + COMPLEX(spc), DIMENSION(:), INTENT(INOUT) :: a, b COMPLEX(spc), DIMENSION(SIZE(a)) :: dum - dum=a - a=b - b=dum + dum = a + a = b + b = dum END SUBROUTINE swap_1d_spc @@ -1590,12 +1590,12 @@ END SUBROUTINE swap_1d_spc ! END SUBROUTINE masked_swap_2d_dpc - SUBROUTINE swap_1d_dpc(a,b) - COMPLEX(dpc), DIMENSION(:), INTENT(INOUT) :: a,b + SUBROUTINE swap_1d_dpc(a, b) + COMPLEX(dpc), DIMENSION(:), INTENT(INOUT) :: a, b COMPLEX(dpc), DIMENSION(SIZE(a)) :: dum - dum=a - a=b - b=dum + dum = a + a = b + b = dum END SUBROUTINE swap_1d_dpc ! ------------------------------------------------------------------ @@ -1603,43 +1603,43 @@ END SUBROUTINE swap_1d_dpc ! From numerical recipes documentation ! Returns a complex array containing nn consecutive powers of the nth ! complex root of unity. - FUNCTION zroots_unity_dp(n,nn) + FUNCTION zroots_unity_dp(n, nn) - INTEGER(i4), INTENT(IN) :: n,nn + INTEGER(i4), INTENT(IN) :: n, nn COMPLEX(dpc), DIMENSION(nn) :: zroots_unity_dp INTEGER(i4) :: k - REAL(dp) :: theta + REAL(dp) :: theta zroots_unity_dp(1) = 1.0_dp - theta = TWOPI_dp/n + theta = TWOPI_dp / n k = 1 do - if (k >= nn) exit - zroots_unity_dp(k+1) = cmplx(cos(k*theta),sin(k*theta),kind=dpc) - zroots_unity_dp(k+2:min(2*k,nn)) = zroots_unity_dp(k+1) * & - zroots_unity_dp(2:min(k,nn-k)) - k = 2*k + if (k >= nn) exit + zroots_unity_dp(k + 1) = cmplx(cos(k * theta), sin(k * theta), kind = dpc) + zroots_unity_dp(k + 2 : min(2 * k, nn)) = zroots_unity_dp(k + 1) * & + zroots_unity_dp(2 : min(k, nn - k)) + k = 2 * k end do END FUNCTION zroots_unity_dp - FUNCTION zroots_unity_sp(n,nn) + FUNCTION zroots_unity_sp(n, nn) - INTEGER(i4), INTENT(IN) :: n,nn + INTEGER(i4), INTENT(IN) :: n, nn COMPLEX(spc), DIMENSION(nn) :: zroots_unity_sp INTEGER(i4) :: k - REAL(sp) :: theta + REAL(sp) :: theta zroots_unity_sp(1) = 1.0_sp - theta = TWOPI_sp/n + theta = TWOPI_sp / n k = 1 do - if (k >= nn) exit - zroots_unity_sp(k+1) = cmplx(cos(k*theta),sin(k*theta),kind=spc) - zroots_unity_sp(k+2:min(2*k,nn)) = zroots_unity_sp(k+1) * & - zroots_unity_sp(2:min(k,nn-k)) - k = 2*k + if (k >= nn) exit + zroots_unity_sp(k + 1) = cmplx(cos(k * theta), sin(k * theta), kind = spc) + zroots_unity_sp(k + 2 : min(2 * k, nn)) = zroots_unity_sp(k + 1) * & + zroots_unity_sp(2 : min(k, nn - k)) + k = 2 * k end do END FUNCTION zroots_unity_sp diff --git a/src/lib/mo_dds.f90 b/src/lib/mo_dds.f90 index 6978a502..53a807a5 100644 --- a/src/lib/mo_dds.f90 +++ b/src/lib/mo_dds.f90 @@ -138,56 +138,52 @@ module mo_dds ! Juliane Mai, Nov 2012 - masked parameter ! Juliane Mai, Dec 2012 - history output - function DDS(obj_func, pini, prange, r, seed, maxiter, maxit, mask, tmp_file, funcbest, history) + function DDS(eval, obj_func, pini, prange, r, seed, maxiter, maxit, mask, tmp_file, funcbest, history) - use mo_kind, only: i4, i8, dp - use mo_xor4096, only: xor4096, xor4096g + use mo_kind, only : i4, i8, dp + use mo_xor4096, only : xor4096, xor4096g + use mo_optimization_utils, only : eval_interface, objective_interface implicit none - INTERFACE - function obj_func(pp) - use mo_kind, only: dp - implicit none - real(dp), dimension(:), intent(in) :: pp - real(dp) :: obj_func - end function obj_func - END INTERFACE - real(dp), dimension(:), intent(in) :: pini ! inital value of decision variables - real(dp), dimension(:,:), intent(in) :: prange ! Min/max values of decision variables - real(dp), optional, intent(in) :: r ! DDS perturbation parameter (-> 0.2 by default) - integer(i8), optional, intent(in) :: seed ! User seed to initialise the random number generator - integer(i8), optional, intent(in) :: maxiter ! Maximum number of iteration or function evaluation - logical, optional, intent(in) :: maxit ! Maximization or minimization of function - logical, dimension(:), optional, intent(in) :: mask ! parameter to be optimized (true or false) - character(len=*), optional, intent(in) :: tmp_file ! file for temporal output - real(dp), optional, intent(out) :: funcbest ! Best value of the function. - real(dp), dimension(:), optional, intent(out), & - allocatable :: history ! History of objective function values - real(dp), dimension(size(pini)) :: DDS ! Best value of decision variables + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: obj_func + + real(dp), dimension(:), intent(in) :: pini ! inital value of decision variables + real(dp), dimension(:, :), intent(in) :: prange ! Min/max values of decision variables + real(dp), optional, intent(in) :: r ! DDS perturbation parameter (-> 0.2 by default) + integer(i8), optional, intent(in) :: seed ! User seed to initialise the random number generator + integer(i8), optional, intent(in) :: maxiter ! Maximum number of iteration or function evaluation + logical, optional, intent(in) :: maxit ! Maximization or minimization of function + logical, dimension(:), optional, intent(in) :: mask ! parameter to be optimized (true or false) + character(len = *), optional, intent(in) :: tmp_file ! file for temporal output + real(dp), optional, intent(out) :: funcbest ! Best value of the function. + real(dp), dimension(:), optional, intent(out), & + allocatable :: history ! History of objective function values + real(dp), dimension(size(pini)) :: DDS ! Best value of decision variables ! Local variables - integer(i4) :: pnum ! Total number of decision variables - integer(i8) :: iseed ! User given seed - integer(i8) :: imaxiter ! Maximum number of iteration or function evaluation - real(dp) :: ir ! DDS perturbation parameter - real(dp) :: imaxit ! Maximization or minimization of function - real(dp) :: of_new, of_best ! intermediate results - real(dp) :: Pn, new_value ! intermediate results - real(dp), dimension(size(pini)) :: pnew ! Test value of decision variables - real(dp) :: ranval ! random value - integer(i8) :: i ! maxiter=i8 - integer(i4) :: j, dvn_count, dv ! pnum=i4 - integer(i4) :: idummy ! dummy vaiable - integer, dimension(8) :: sdate ! date_and_time return - logical, dimension(size(pini)) :: maske ! parameter to be optimized (true or false) - integer(i4), dimension(:), allocatable :: truepara ! parameter to be optimized (their indexes) + integer(i4) :: pnum ! Total number of decision variables + integer(i8) :: iseed ! User given seed + integer(i8) :: imaxiter ! Maximum number of iteration or function evaluation + real(dp) :: ir ! DDS perturbation parameter + real(dp) :: imaxit ! Maximization or minimization of function + real(dp) :: of_new, of_best ! intermediate results + real(dp) :: Pn, new_value ! intermediate results + real(dp), dimension(size(pini)) :: pnew ! Test value of decision variables + real(dp) :: ranval ! random value + integer(i8) :: i ! maxiter=i8 + integer(i4) :: j, dvn_count, dv ! pnum=i4 + integer(i4) :: idummy ! dummy vaiable + integer, dimension(8) :: sdate ! date_and_time return + logical, dimension(size(pini)) :: maske ! parameter to be optimized (true or false) + integer(i4), dimension(:), allocatable :: truepara ! parameter to be optimized (their indexes) ! Check input pnum = size(pini) - if (size(prange,1) /= pnum) stop 'Error DDS: size(prange,1) /= size(pini)' - if (size(prange,2) /= 2) stop 'Error DDS: size(prange,2) /= 2' + if (size(prange, 1) /= pnum) stop 'Error DDS: size(prange,1) /= size(pini)' + if (size(prange, 2) /= 2) stop 'Error DDS: size(prange,2) /= 2' ! r Perturbation parameter ir = 0.2_dp if (present(r)) ir = r @@ -198,12 +194,12 @@ end function obj_func if (imaxiter < 6) stop 'Error DDS: max function evals must be minimum 6' ! history output if (present(history)) then - allocate(history(imaxiter)) + allocate(history(imaxiter)) end if ! Min or max objective function imaxit = 1.0_dp if (present(maxit)) then - if (maxit) imaxit = -1.0_dp + if (maxit) imaxit = -1.0_dp end if ! Given seed iseed = 0 @@ -211,120 +207,120 @@ end function obj_func iseed = max(iseed, 0_i8) if (present(mask)) then - if (count(mask) .eq. 0_i4) then - stop 'Input argument mask: At least one element has to be true' - else - maske = mask - end if + if (count(mask) .eq. 0_i4) then + stop 'Input argument mask: At least one element has to be true' + else + maske = mask + end if else - maske = .true. + maske = .true. end if - allocate ( truepara(count(maske)) ) + allocate (truepara(count(maske))) idummy = 0_i4 - do j=1,size(pini,1) - if ( maske(j) ) then - idummy = idummy+1_i4 - truepara(idummy) = j - end if + do j = 1, size(pini, 1) + if (maske(j)) then + idummy = idummy + 1_i4 + truepara(idummy) = j + end if end do ! Seed random numbers if (iseed == 0) then - call date_and_time(values=sdate) - iseed = sdate(1)*31536000000_i8 + sdate(2)*2592000000_i8 + sdate(3)*86400000_i8 + & - sdate(5)*3600000_i8 + sdate(6)*60000_i8 + sdate(7)*1000_i8 + sdate(8) - call xor4096(iseed,ranval) - call xor4096g(iseed,ranval) + call date_and_time(values = sdate) + iseed = sdate(1) * 31536000000_i8 + sdate(2) * 2592000000_i8 + sdate(3) * 86400000_i8 + & + sdate(5) * 3600000_i8 + sdate(6) * 60000_i8 + sdate(7) * 1000_i8 + sdate(8) + call xor4096(iseed, ranval) + call xor4096g(iseed, ranval) else - call xor4096(iseed,ranval) - call xor4096g(iseed,ranval) + call xor4096(iseed, ranval) + call xor4096g(iseed, ranval) end if ! Temporal file writing if(present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', status = 'unknown') - write(999,*) '# settings :: general' - write(999,*) '# nIterations iseed' - write(999,*) imaxiter, iseed - write(999,*) '# settings :: dds specific' - write(999,*) '# dds_r' - write(999,*) ir - write(999,*) '# iter bestf (bestx(j),j=1,nopt)' - close(999) + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', status = 'unknown') + write(999, *) '# settings :: general' + write(999, *) '# nIterations iseed' + write(999, *) imaxiter, iseed + write(999, *) '# settings :: dds specific' + write(999, *) '# dds_r' + write(999, *) ir + write(999, *) '# iter bestf (bestx(j),j=1,nopt)' + close(999) end if - + ! Evaluate initial solution and return objective function value ! and Initialise the other variables (e.g. of_best) ! imaxit is 1.0 for MIN problems, -1 for MAX problems - DDS = pini + DDS = pini print *, imaxit - of_new = imaxit * obj_func(pini) - of_best = of_new + of_new = imaxit * obj_func(pini, eval) + of_best = of_new if (present(history)) history(1) = of_new - file_write: if (present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', position='append', recl=(pnum+2)*30) - if (imaxit .lt. 0.0_dp) then - ! Maximize - write(999,*) '0', -of_best, pini - else - ! Minimize - write(999,*) '0', of_best, pini - end if - close(999) + file_write : if (present(tmp_file)) then + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', position = 'append', recl = (pnum + 2) * 30) + if (imaxit .lt. 0.0_dp) then + ! Maximize + write(999, *) '0', -of_best, pini + else + ! Minimize + write(999, *) '0', of_best, pini + end if + close(999) end if file_write ! Code below is now the DDS algorithm as presented in Figure 1 of Tolson and Shoemaker (2007) - do i=1, imaxiter-1 - ! Determine Decision Variable (DV) selected for perturbation: - Pn = 1.0_dp - log(real(i,dp))/log(real(imaxiter-1,dp)) ! probability each DV selected - dvn_count = 0 ! counter for how many DVs selected for perturbation - pnew = DDS ! define pnew initially as best current solution - - ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) - do j=1, size(truepara) !pnum - call xor4096(0_i8,ranval) ! selects next uniform random number in sequence - ! Step 4 of Fig 1 of Tolson and Shoemaker (2007) - if (ranval < Pn) then ! jth DV selected for perturbation - dvn_count = dvn_count + 1 - ! call 1-D perturbation function to get new DV value (new_value) - call neigh_value(DDS(truepara(j)), prange(truepara(j),1), prange(truepara(j),2), ir, new_value) - pnew(truepara(j)) = new_value - end if - end do - - ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) in case {N} empty - if (dvn_count == 0) then ! no DVs selected at random, so select one - call xor4096(0_i8,ranval) ! selects next uniform random number in sequence - dv = truepara(int(( ranval * real(size(truepara),dp)) + 1.0_dp, i4 )) ! index for one DV - ! call 1-D perturbation function to get new DV value (new_value): - call neigh_value(DDS(dv), prange(dv,1), prange(dv,2), ir, new_value) - pnew(dv) = new_value ! change relevant DV value in stest - end if - - ! Step 5 of Fig 1 of Tolson and Shoemaker (2007) - ! Evaluate obj function value for test - of_new = imaxit * obj_func(pnew) ! imaxit handles min(=1) and max(=-1) problems - ! update current best solution - if (of_new <= of_best) then - of_best = of_new - DDS = pnew - end if - if (present(history)) history(i+1) = of_best - - file_write2: if (present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', position='append', recl=(pnum+2)*30) - if (imaxit .lt. 0.0_dp) then - ! Maximize - write(999,*) i, -of_best, dds - else - ! Minimize - write(999,*) i, of_best, dds - end if - close(999) - end if file_write2 + do i = 1, imaxiter - 1 + ! Determine Decision Variable (DV) selected for perturbation: + Pn = 1.0_dp - log(real(i, dp)) / log(real(imaxiter - 1, dp)) ! probability each DV selected + dvn_count = 0 ! counter for how many DVs selected for perturbation + pnew = DDS ! define pnew initially as best current solution + + ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) + do j = 1, size(truepara) !pnum + call xor4096(0_i8, ranval) ! selects next uniform random number in sequence + ! Step 4 of Fig 1 of Tolson and Shoemaker (2007) + if (ranval < Pn) then ! jth DV selected for perturbation + dvn_count = dvn_count + 1 + ! call 1-D perturbation function to get new DV value (new_value) + call neigh_value(DDS(truepara(j)), prange(truepara(j), 1), prange(truepara(j), 2), ir, new_value) + pnew(truepara(j)) = new_value + end if + end do + + ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) in case {N} empty + if (dvn_count == 0) then ! no DVs selected at random, so select one + call xor4096(0_i8, ranval) ! selects next uniform random number in sequence + dv = truepara(int((ranval * real(size(truepara), dp)) + 1.0_dp, i4)) ! index for one DV + ! call 1-D perturbation function to get new DV value (new_value): + call neigh_value(DDS(dv), prange(dv, 1), prange(dv, 2), ir, new_value) + pnew(dv) = new_value ! change relevant DV value in stest + end if + + ! Step 5 of Fig 1 of Tolson and Shoemaker (2007) + ! Evaluate obj function value for test + of_new = imaxit * obj_func(pnew, eval) ! imaxit handles min(=1) and max(=-1) problems + ! update current best solution + if (of_new <= of_best) then + of_best = of_new + DDS = pnew + end if + if (present(history)) history(i + 1) = of_best + + file_write2 : if (present(tmp_file)) then + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', position = 'append', recl = (pnum + 2) * 30) + if (imaxit .lt. 0.0_dp) then + ! Maximize + write(999, *) i, -of_best, dds + else + ! Minimize + write(999, *) i, of_best, dds + end if + close(999) + end if file_write2 end do if (present(funcbest)) funcbest = of_best @@ -422,67 +418,62 @@ end function DDS ! Modified, Juliane Mai, Nov 2012 - masked parameter ! Juliane Mai, Dec 2012 - history output - function MDDS(obj_func, pini, prange, seed, maxiter, maxit, mask, tmp_file, funcbest, history) + function MDDS(eval, obj_func, pini, prange, seed, maxiter, maxit, mask, tmp_file, funcbest, history) - use mo_kind, only: i4, i8, dp - use mo_xor4096, only: xor4096, xor4096g + use mo_kind, only : i4, i8, dp + use mo_xor4096, only : xor4096, xor4096g + use mo_optimization_utils, only : eval_interface, objective_interface implicit none - INTERFACE - function obj_func(pp) - use mo_kind, only: dp - implicit none - real(dp), dimension(:), intent(in) :: pp - real(dp) :: obj_func - end function obj_func - END INTERFACE - real(dp), dimension(:), intent(in) :: pini ! inital value of decision variables - real(dp), dimension(:,:), intent(in) :: prange ! Min/max values of decision variables - integer(i8), optional, intent(in) :: seed ! User seed to initialise the random number generator - integer(i8), optional, intent(in) :: maxiter ! Maximum number of iteration or function evaluation - logical, optional, intent(in) :: maxit ! Maximization or minimization of function - logical, dimension(:), optional, intent(in) :: mask ! parameter to be optimized (true or false) - character(len=*), optional, intent(in) :: tmp_file ! file for temporal output - real(dp), optional, intent(out) :: funcbest ! Best value of the function. - real(dp), dimension(:), optional, intent(out), & - allocatable :: history ! History of objective function values - real(dp), dimension(size(pini)) :: MDDS ! Best value of decision variables + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: obj_func + real(dp), dimension(:), intent(in) :: pini ! inital value of decision variables + real(dp), dimension(:, :), intent(in) :: prange ! Min/max values of decision variables + integer(i8), optional, intent(in) :: seed ! User seed to initialise the random number generator + integer(i8), optional, intent(in) :: maxiter ! Maximum number of iteration or function evaluation + logical, optional, intent(in) :: maxit ! Maximization or minimization of function + logical, dimension(:), optional, intent(in) :: mask ! parameter to be optimized (true or false) + character(len = *), optional, intent(in) :: tmp_file ! file for temporal output + real(dp), optional, intent(out) :: funcbest ! Best value of the function. + real(dp), dimension(:), optional, intent(out), & + allocatable :: history ! History of objective function values + real(dp), dimension(size(pini)) :: MDDS ! Best value of decision variables ! Local variables - integer(i4) :: pnum ! Total number of decision variables - integer(i8) :: iseed ! User given seed - integer(i8) :: imaxiter ! Maximum number of iteration or function evaluation - real(dp) :: ir ! MDDS perturbation parameter - real(dp) :: imaxit ! Maximization or minimization of function - real(dp) :: of_new, of_best ! intermediate results - real(dp) :: Pn, new_value ! intermediate results - real(dp), dimension(size(pini)) :: pnew ! Test value of decision variables - real(dp) :: ranval ! random value - integer(i8) :: i ! maxiter=i8 - integer(i4) :: j, dvn_count, dv ! pnum=i4 - integer(i4) :: idummy ! dummy vaiable - integer, dimension(8) :: sdate ! date_and_time return - logical, dimension(size(pini)) :: maske ! parameter to be optimized (true or false) - integer(i4), dimension(:), allocatable :: truepara ! parameter to be optimized (their indexes) + integer(i4) :: pnum ! Total number of decision variables + integer(i8) :: iseed ! User given seed + integer(i8) :: imaxiter ! Maximum number of iteration or function evaluation + real(dp) :: ir ! MDDS perturbation parameter + real(dp) :: imaxit ! Maximization or minimization of function + real(dp) :: of_new, of_best ! intermediate results + real(dp) :: Pn, new_value ! intermediate results + real(dp), dimension(size(pini)) :: pnew ! Test value of decision variables + real(dp) :: ranval ! random value + integer(i8) :: i ! maxiter=i8 + integer(i4) :: j, dvn_count, dv ! pnum=i4 + integer(i4) :: idummy ! dummy vaiable + integer, dimension(8) :: sdate ! date_and_time return + logical, dimension(size(pini)) :: maske ! parameter to be optimized (true or false) + integer(i4), dimension(:), allocatable :: truepara ! parameter to be optimized (their indexes) ! Check input pnum = size(pini) - if (size(prange,1) /= pnum) stop 'Error MDDS: size(prange,1) /= size(pini)' - if (size(prange,2) /= 2) stop 'Error MDDS: size(prange,2) /= 2' + if (size(prange, 1) /= pnum) stop 'Error MDDS: size(prange,1) /= size(pini)' + if (size(prange, 2) /= 2) stop 'Error MDDS: size(prange,2) /= 2' ! max. iteration imaxiter = 1000 if (present(maxiter)) imaxiter = maxiter if (imaxiter < 6) stop 'Error MDDS: max function evals must be minimum 6' ! history output if (present(history)) then - allocate(history(imaxiter)) + allocate(history(imaxiter)) end if ! Min or max objective function imaxit = 1.0_dp if (present(maxit)) then - if (maxit) imaxit = -1.0_dp + if (maxit) imaxit = -1.0_dp end if ! Given seed iseed = 0 @@ -491,138 +482,138 @@ end function obj_func ! Seed random numbers if (iseed == 0) then - call date_and_time(values=sdate) - iseed = sdate(1)*31536000000_i8 + sdate(2)*2592000000_i8 + sdate(3)*86400000_i8 + & - sdate(5)*3600000_i8 + sdate(6)*60000_i8 + sdate(7)*1000_i8 + sdate(8) - call xor4096(iseed,ranval) - call xor4096g(iseed,ranval) + call date_and_time(values = sdate) + iseed = sdate(1) * 31536000000_i8 + sdate(2) * 2592000000_i8 + sdate(3) * 86400000_i8 + & + sdate(5) * 3600000_i8 + sdate(6) * 60000_i8 + sdate(7) * 1000_i8 + sdate(8) + call xor4096(iseed, ranval) + call xor4096g(iseed, ranval) else - call xor4096(iseed,ranval) - call xor4096g(iseed,ranval) + call xor4096(iseed, ranval) + call xor4096g(iseed, ranval) end if ! Masked parameters if (present(mask)) then - if (count(mask) .eq. 0_i4) then - stop 'Input argument mask: At least one element has to be true' - else - maske = mask - end if + if (count(mask) .eq. 0_i4) then + stop 'Input argument mask: At least one element has to be true' + else + maske = mask + end if else - maske = .true. + maske = .true. end if - allocate ( truepara(count(maske)) ) + allocate (truepara(count(maske))) idummy = 0_i4 - do j=1,size(pini,1) - if ( maske(j) ) then - idummy = idummy+1_i4 - truepara(idummy) = j - end if + do j = 1, size(pini, 1) + if (maske(j)) then + idummy = idummy + 1_i4 + truepara(idummy) = j + end if end do ! Temporal file writing if(present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', status = 'unknown') - write(999,*) '# settings :: general' - write(999,*) '# nIterations iseed' - write(999,*) imaxiter, iseed - write(999,*) '# settings :: mdds specific' - write(999,*) '# None' - write(999,*) '' - write(999,*) '# iter bestf (bestx(j),j=1,nopt)' - close(999) + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', status = 'unknown') + write(999, *) '# settings :: general' + write(999, *) '# nIterations iseed' + write(999, *) imaxiter, iseed + write(999, *) '# settings :: mdds specific' + write(999, *) '# None' + write(999, *) '' + write(999, *) '# iter bestf (bestx(j),j=1,nopt)' + close(999) end if ! Evaluate initial solution and return objective function value ! and Initialise the other variables (e.g. of_best) ! imaxit is 1.0 for MIN problems, -1 for MAX problems - MDDS = pini - of_new = imaxit * obj_func(pini) + MDDS = pini + of_new = imaxit * obj_func(pini, eval) of_best = of_new if (present(history)) history(1) = of_new - file_write: if (present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', position='append', recl=(pnum+2)*30) - if (imaxit .lt. 0.0_dp) then - ! Maximize - write(999,*) '0', -of_best, mdds - else - ! Minimize - write(999,*) '0', of_best, mdds - end if - close(999) + file_write : if (present(tmp_file)) then + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', position = 'append', recl = (pnum + 2) * 30) + if (imaxit .lt. 0.0_dp) then + ! Maximize + write(999, *) '0', -of_best, mdds + else + ! Minimize + write(999, *) '0', of_best, mdds + end if + close(999) end if file_write ! Code below is now the MDDS algorithm as presented in Figure 1 of Tolson and Shoemaker (2007) - do i=1, imaxiter-1 - ! Determine Decision Variable (DV) selected for perturbation: - Pn = 1.0_dp - log(real(i,dp))/log(real(imaxiter-1,dp)) ! probability each DV selected - dvn_count = 0 ! counter for how many DVs selected for perturbation - pnew = MDDS ! define pnew initially as best current solution - ! Modifications by Huang et al. (2010) - Pn = max(Pn, 0.05_dp) - ir = max(min(0.3_dp, Pn), 0.05_dp) - - ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) - do j=1, pnum - call xor4096(0_i8,ranval) ! selects next uniform random number in sequence - ! Step 4 of Fig 1 of Tolson and Shoemaker (2007) - if (ranval < Pn) then ! jth DV selected for perturbation - dvn_count = dvn_count + 1 - ! call 1-D perturbation function to get new DV value (new_value) - call neigh_value(MDDS(truepara(j)), prange(truepara(j),1), prange(truepara(j),2), ir, new_value) - pnew(truepara(j)) = new_value - end if - end do - - ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) in case {N} empty - if (dvn_count == 0) then ! no DVs selected at random, so select one - call xor4096(0_i8,ranval) ! selects next uniform random number in sequence - dv = truepara(int(( ranval * real(size(truepara),dp)) + 1.0_dp, i4 )) ! index for one DV - ! call 1-D perturbation function to get new DV value (new_value): - call neigh_value(MDDS(dv), prange(dv,1), prange(dv,2), ir, new_value) - pnew(dv) = new_value ! change relevant DV value in stest - end if - - ! Step 5 of Fig 1 of Tolson and Shoemaker (2007) - ! Evaluate obj function value for test - of_new = imaxit * obj_func(pnew) ! imaxit handles min(=1) and max(=-1) problems - ! update current best solution - if (of_new <= of_best) then + do i = 1, imaxiter - 1 + ! Determine Decision Variable (DV) selected for perturbation: + Pn = 1.0_dp - log(real(i, dp)) / log(real(imaxiter - 1, dp)) ! probability each DV selected + dvn_count = 0 ! counter for how many DVs selected for perturbation + pnew = MDDS ! define pnew initially as best current solution + ! Modifications by Huang et al. (2010) + Pn = max(Pn, 0.05_dp) + ir = max(min(0.3_dp, Pn), 0.05_dp) + + ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) + do j = 1, pnum + call xor4096(0_i8, ranval) ! selects next uniform random number in sequence + ! Step 4 of Fig 1 of Tolson and Shoemaker (2007) + if (ranval < Pn) then ! jth DV selected for perturbation + dvn_count = dvn_count + 1 + ! call 1-D perturbation function to get new DV value (new_value) + call neigh_value(MDDS(truepara(j)), prange(truepara(j), 1), prange(truepara(j), 2), ir, new_value) + pnew(truepara(j)) = new_value + end if + end do + + ! Step 3 of Fig 1 of Tolson and Shoemaker (2007) in case {N} empty + if (dvn_count == 0) then ! no DVs selected at random, so select one + call xor4096(0_i8, ranval) ! selects next uniform random number in sequence + dv = truepara(int((ranval * real(size(truepara), dp)) + 1.0_dp, i4)) ! index for one DV + ! call 1-D perturbation function to get new DV value (new_value): + call neigh_value(MDDS(dv), prange(dv, 1), prange(dv, 2), ir, new_value) + pnew(dv) = new_value ! change relevant DV value in stest + end if + + ! Step 5 of Fig 1 of Tolson and Shoemaker (2007) + ! Evaluate obj function value for test + of_new = imaxit * obj_func(pnew, eval) ! imaxit handles min(=1) and max(=-1) problems + ! update current best solution + if (of_new <= of_best) then + of_best = of_new + MDDS = pnew + else ! Modifications by Huang et al. (2010) + call xor4096(0_i8, ranval) + if (exp(-(of_new - of_best) / of_best) > (1.0_dp - ranval * Pn)) then of_best = of_new - MDDS = pnew - else ! Modifications by Huang et al. (2010) - call xor4096(0_i8,ranval) - if (exp(-(of_new-of_best)/of_best) > (1.0_dp-ranval*Pn)) then - of_best = of_new - MDDS = pnew - end if - end if - if (present(history)) then - if (present(maxit)) then - if (maxit) then - history(i+1) = max(history(i),of_best) - else - history(i+1) = min(history(i),of_best) - end if + MDDS = pnew + end if + end if + if (present(history)) then + if (present(maxit)) then + if (maxit) then + history(i + 1) = max(history(i), of_best) else - history(i+1) = min(history(i),of_best) + history(i + 1) = min(history(i), of_best) end if - end if - - file_write2: if (present(tmp_file)) then - open(unit=999,file=trim(adjustl(tmp_file)), action='write', position='append', recl=(pnum+2)*30) - if (imaxit .lt. 0.0_dp) then - ! Maximize - write(999,*) i, -of_best, mdds - else - ! Minimize - write(999,*) i, of_best, mdds - end if - close(999) - end if file_write2 + else + history(i + 1) = min(history(i), of_best) + end if + end if + + file_write2 : if (present(tmp_file)) then + open(unit = 999, file = trim(adjustl(tmp_file)), action = 'write', position = 'append', recl = (pnum + 2) * 30) + if (imaxit .lt. 0.0_dp) then + ! Maximize + write(999, *) i, -of_best, mdds + else + ! Minimize + write(999, *) i, of_best, mdds + end if + close(999) + end if file_write2 end do if (present(funcbest)) funcbest = of_best @@ -645,40 +636,40 @@ end function MDDS subroutine neigh_value(x_cur, x_min, x_max, r, new_value) - use mo_kind, only: i8, dp - use mo_xor4096, only: xor4096g + use mo_kind, only : i8, dp + use mo_xor4096, only : xor4096g implicit none - real(dp), intent(in) :: x_cur, x_min, x_max, r - real(dp), intent(out) :: new_value - real(dp) :: x_range + real(dp), intent(in) :: x_cur, x_min, x_max, r + real(dp), intent(out) :: new_value + real(dp) :: x_range real(dp) :: zvalue x_range = x_max - x_min ! generate a standard normal random variate (zvalue) - call xor4096g(0_i8,zvalue) + call xor4096g(0_i8, zvalue) ! calculate new decision variable value: - new_value = x_cur + zvalue*r*x_range + new_value = x_cur + zvalue * r * x_range ! check new value is within bounds. If not, bounds are reflecting. if (new_value < x_min) then - new_value = x_min + (x_min - new_value) - if (new_value > x_max) then - ! if reflection goes past x_max then value should be x_min since - ! without reflection the approach goes way past lower bound. - ! This keeps x close to lower bound when x_cur is close to lower bound - ! Practically speaking, this should never happen with r values <0.3. - new_value = x_min - end if + new_value = x_min + (x_min - new_value) + if (new_value > x_max) then + ! if reflection goes past x_max then value should be x_min since + ! without reflection the approach goes way past lower bound. + ! This keeps x close to lower bound when x_cur is close to lower bound + ! Practically speaking, this should never happen with r values <0.3. + new_value = x_min + end if else if (new_value > x_max) then - new_value = x_max - (new_value - x_max) - if (new_value < x_min) then - ! if reflection goes past x_min then value should be x_max for same reasons as above. - new_value = x_max - end if + new_value = x_max - (new_value - x_max) + if (new_value < x_min) then + ! if reflection goes past x_min then value should be x_max for same reasons as above. + new_value = x_max + end if end if end subroutine neigh_value diff --git a/src/lib/mo_errormeasures.f90 b/src/lib/mo_errormeasures.f90 index f73e7b7a..fc097fb8 100644 --- a/src/lib/mo_errormeasures.f90 +++ b/src/lib/mo_errormeasures.f90 @@ -28,7 +28,7 @@ MODULE mo_errormeasures ! Copyright 2012 Matthias Zink - USE mo_kind, ONLY: i4, sp, dp + USE mo_kind, ONLY : i4, sp, dp IMPLICIT NONE @@ -102,7 +102,7 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE BIAS - MODULE PROCEDURE BIAS_sp_1d, BIAS_dp_1d, BIAS_sp_2d, BIAS_dp_2d, BIAS_sp_3d, BIAS_dp_3d + MODULE PROCEDURE BIAS_sp_1d, BIAS_dp_1d, BIAS_sp_2d, BIAS_dp_2d, BIAS_sp_3d, BIAS_dp_3d END INTERFACE BIAS ! ------------------------------------------------------------------ @@ -117,16 +117,16 @@ MODULE mo_errormeasures !> where \n !> \f$ r \f$ = Pearson product-moment correlation coefficient \n !> \f$ \alpha \f$ = ratio of simulated mean to observed mean \n - !> \f$ \beta \f$ = ratio of simulated standard deviation to + !> \f$ \beta \f$ = ratio of simulated standard deviation to !> observed standard deviation \n - !> This three measures are calculated between two arrays (1d, 2d, or 3d). + !> This three measures are calculated between two arrays (1d, 2d, or 3d). !> Usually, one is an observation and the second is a modelled variable.\n !> - !> The higher the KGE the better the observation and simulation are matching. + !> The higher the KGE the better the observation and simulation are matching. !> The upper limit of KGE is 1.\n - !> - !> Therefore, if you apply a minimization algorithm to calibrate regarding - !> KGE you have to use the objective function + !> + !> Therefore, if you apply a minimization algorithm to calibrate regarding + !> KGE you have to use the objective function !> \f[ obj\_value = 1.0 - KGE \f] !> which has then the optimum at 0.0. !> (Like for the NSE where you always optimize 1-NSE.)\n @@ -169,9 +169,9 @@ MODULE mo_errormeasures ! kge = kge(x,y,mask=mask) ! LITERATURE - !> Gupta, Hoshin V., et al. - !> "Decomposition of the mean squared error and NSE performance criteria: - !> Implications for improving hydrological modelling." + !> Gupta, Hoshin V., et al. + !> "Decomposition of the mean squared error and NSE performance criteria: + !> Implications for improving hydrological modelling." !> Journal of Hydrology 377.1 (2009): 80-91. @@ -184,7 +184,7 @@ MODULE mo_errormeasures ! - 1d, 2d, 3d, version in sp and dp INTERFACE KGE - MODULE PROCEDURE KGE_dp_1d, KGE_dp_2d, KGE_dp_3d, KGE_sp_1d, KGE_sp_2d, KGE_sp_3d + MODULE PROCEDURE KGE_dp_1d, KGE_dp_2d, KGE_dp_3d, KGE_sp_1d, KGE_sp_2d, KGE_sp_3d END INTERFACE KGE ! ------------------------------------------------------------------ @@ -198,16 +198,16 @@ MODULE mo_errormeasures !> \f[ KGEnocorr = 1 - \sqrt{( (1-\alpha)^2 + (1-\beta)^2 )} \f] !> where \n !> \f$ \alpha \f$ = ratio of simulated mean to observed mean \n - !> \f$ \beta \f$ = ratio of simulated standard deviation to + !> \f$ \beta \f$ = ratio of simulated standard deviation to !> observed standard deviation \n - !> This two measures are calculated between two arrays (1d, 2d, or 3d). + !> This two measures are calculated between two arrays (1d, 2d, or 3d). !> Usually, one is an observation and the second is a modelled variable.\n !> - !> The higher the KGEnocorr the better the observation and simulation are matching. + !> The higher the KGEnocorr the better the observation and simulation are matching. !> The upper limit of KGEnocorr is 1.\n - !> - !> Therefore, if you apply a minimization algorithm to calibrate regarding - !> KGEnocorr you have to use the objective function + !> + !> Therefore, if you apply a minimization algorithm to calibrate regarding + !> KGEnocorr you have to use the objective function !> \f[ obj\_value = 1.0 - KGEnocorr \f] !> which has then the optimum at 0.0. !> (Like for the NSE where you always optimize 1-NSE.)\n @@ -250,23 +250,23 @@ MODULE mo_errormeasures ! kgenocorr = kgenocorr(x,y,mask=mask) ! LITERATURE - !> Gupta, Hoshin V., et al. - !> "Decomposition of the mean squared error and NSE performance criteria: - !> Implications for improving hydrological modelling." + !> Gupta, Hoshin V., et al. + !> "Decomposition of the mean squared error and NSE performance criteria: + !> Implications for improving hydrological modelling." !> Journal of Hydrology 377.1 (2009): 80-91. ! HISTORY !> \author Rohini Kumar !> \date August 2014 - ! Modified, M. Schroen - Jul 2017 add KGEnocorr (KGE without correlation) + ! Modified, M. Schroen - Jul 2017 add KGEnocorr (KGE without correlation) ! R. Kumar & O. Rakovec - Sep. 2014 ! J. Mai - remove double packing of input data (bug) ! - KGE instead of 1.0-KGE ! - 1d, 2d, 3d, version in sp and dp INTERFACE KGEnocorr - MODULE PROCEDURE KGEnocorr_dp_1d, KGEnocorr_dp_2d, KGEnocorr_dp_3d, KGEnocorr_sp_1d, KGEnocorr_sp_2d, KGEnocorr_sp_3d + MODULE PROCEDURE KGEnocorr_dp_1d, KGEnocorr_dp_2d, KGEnocorr_dp_3d, KGEnocorr_sp_1d, KGEnocorr_sp_2d, KGEnocorr_sp_3d END INTERFACE KGEnocorr @@ -332,7 +332,7 @@ MODULE mo_errormeasures ! Written, Juliane Mai, May 2013 ! updated, Rohin Kumar, May 2013 ! for mean of logQ INTERFACE LNNSE - MODULE PROCEDURE LNNSE_sp_1d, LNNSE_dp_1d, LNNSE_dp_2d, LNNSE_sp_2d, LNNSE_sp_3d, LNNSE_dp_3d + MODULE PROCEDURE LNNSE_sp_1d, LNNSE_dp_1d, LNNSE_dp_2d, LNNSE_sp_2d, LNNSE_sp_3d, LNNSE_dp_3d END INTERFACE LNNSE ! ------------------------------------------------------------------ @@ -393,7 +393,7 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE MAE - MODULE PROCEDURE MAE_sp_1d, MAE_dp_1d, MAE_sp_2d, MAE_dp_2d, MAE_sp_3d, MAE_dp_3d + MODULE PROCEDURE MAE_sp_1d, MAE_dp_1d, MAE_sp_2d, MAE_dp_2d, MAE_sp_3d, MAE_dp_3d END INTERFACE MAE ! ------------------------------------------------------------------ @@ -454,7 +454,7 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE MSE - MODULE PROCEDURE MSE_sp_1d, MSE_dp_1d, MSE_sp_2d, MSE_dp_2d, MSE_sp_3d, MSE_dp_3d + MODULE PROCEDURE MSE_sp_1d, MSE_dp_1d, MSE_sp_2d, MSE_dp_2d, MSE_sp_3d, MSE_dp_3d END INTERFACE MSE ! ------------------------------------------------------------------ @@ -517,7 +517,7 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE NSE - MODULE PROCEDURE NSE_sp_1d, NSE_dp_1d, NSE_dp_2d, NSE_sp_2d, NSE_sp_3d, NSE_dp_3d + MODULE PROCEDURE NSE_sp_1d, NSE_dp_1d, NSE_dp_2d, NSE_sp_2d, NSE_sp_3d, NSE_dp_3d END INTERFACE NSE ! ------------------------------------------------------------------ @@ -578,7 +578,7 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE SAE - MODULE PROCEDURE SAE_sp_1d, SAE_dp_1d, SAE_sp_2d, SAE_dp_2d, SAE_sp_3d, SAE_dp_3d + MODULE PROCEDURE SAE_sp_1d, SAE_dp_1d, SAE_sp_2d, SAE_dp_2d, SAE_sp_3d, SAE_dp_3d END INTERFACE SAE ! ------------------------------------------------------------------ @@ -639,7 +639,7 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE SSE - MODULE PROCEDURE SSE_sp_1d, SSE_dp_1d, SSE_sp_2d, SSE_dp_2d, SSE_sp_3d, SSE_dp_3d + MODULE PROCEDURE SSE_sp_1d, SSE_dp_1d, SSE_sp_2d, SSE_dp_2d, SSE_sp_3d, SSE_dp_3d END INTERFACE SSE ! ------------------------------------------------------------------ @@ -700,9 +700,9 @@ MODULE mo_errormeasures ! HISTORY ! Written, Matthias Zink, Sept 2012 INTERFACE RMSE - MODULE PROCEDURE RMSE_sp_1d, RMSE_dp_1d, RMSE_sp_2d, RMSE_dp_2d, RMSE_sp_3d, RMSE_dp_3d + MODULE PROCEDURE RMSE_sp_1d, RMSE_dp_1d, RMSE_sp_2d, RMSE_dp_2d, RMSE_sp_3d, RMSE_dp_3d END INTERFACE RMSE - + ! ------------------------------------------------------------------ ! NAME @@ -781,239 +781,239 @@ MODULE mo_errormeasures FUNCTION BIAS_sp_1d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: BIAS_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: BIAS_sp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'BIAS_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'BIAS_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if ! if (n .LE. 1_i4) stop 'BIAS_sp_1d: number of arguments must be at least 2' ! - BIAS_sp_1d = average(y, mask=maske) - average(x, mask=maske) + BIAS_sp_1d = average(y, mask = maske) - average(x, mask = maske) END FUNCTION BIAS_sp_1d FUNCTION BIAS_dp_1d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: BIAS_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: BIAS_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'BIAS_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'BIAS_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'BIAS_dp_1d: number of arguments must be at least 2' ! - BIAS_dp_1d = average(y, mask=maske) - average(x, mask=maske) + BIAS_dp_1d = average(y, mask = maske) - average(x, mask = maske) END FUNCTION BIAS_dp_1d FUNCTION BIAS_sp_2d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: BIAS_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: BIAS_sp_2d - INTEGER(i4) :: n + INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)):: maske + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'BIAS_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'BIAS_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if ! if (n .LE. 1_i4) stop 'BIAS_sp_2d: number of arguments must be at least 2' ! - BIAS_sp_2d = average(reshape(y, (/size(y,dim=1) * size(y,dim=2)/)), & - mask=reshape(maske,(/size(y,dim=1) * size(y,dim=2)/))) - & - average(reshape(x, (/size(x,dim=1) * size(x,dim=2)/)), & - mask=reshape(maske,(/size(x,dim=1) * size(x,dim=2)/))) + BIAS_sp_2d = average(reshape(y, (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske, (/size(y, dim = 1) * size(y, dim = 2)/))) - & + average(reshape(x, (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske, (/size(x, dim = 1) * size(x, dim = 2)/))) ! END FUNCTION BIAS_sp_2d FUNCTION BIAS_dp_2d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: BIAS_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: BIAS_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)):: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'BIAS_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'BIAS_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if ! if (n .LE. 1_i4) stop 'BIAS_dp_2d: number of arguments must be at least 2' ! - BIAS_dp_2d = average(reshape(y, (/size(y,dim=1) * size(y,dim=2)/)), & - mask=reshape(maske,(/size(y,dim=1) * size(y,dim=2)/))) - & - average(reshape(x, (/size(x,dim=1) * size(x,dim=2)/)), & - mask=reshape(maske,(/size(x,dim=1) * size(x,dim=2)/))) + BIAS_dp_2d = average(reshape(y, (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske, (/size(y, dim = 1) * size(y, dim = 2)/))) - & + average(reshape(x, (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske, (/size(x, dim = 1) * size(x, dim = 2)/))) ! END FUNCTION BIAS_dp_2d FUNCTION BIAS_sp_3d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: BIAS_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: BIAS_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), & - size(x, dim=2), size(x, dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), & + size(x, dim = 2), size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'BIAS_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'BIAS_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) * size(x, dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if ! ! not really sopisticated, it has to be checked if the 3 numbers of x and y are matching in arry position if (n .LE. 1_i4) stop 'BIAS_sp_3d: number of arguments must be at least 2' ! - BIAS_sp_3d = average(reshape(y, (/size(y,dim=1) * size(y,dim=2) * size(y,dim=3)/)), & - mask=reshape(maske,(/size(y,dim=1) * size(y,dim=2) * size(y,dim=3)/))) - & - average(reshape(x, (/size(x,dim=1) * size(x,dim=2) * size(x,dim=3)/)), & - mask=reshape(maske,(/size(x,dim=1) * size(x,dim=2) * size(x,dim=3)/))) + BIAS_sp_3d = average(reshape(y, (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske, (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) - & + average(reshape(x, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) ! END FUNCTION BIAS_sp_3d FUNCTION BIAS_dp_3d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: BIAS_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: BIAS_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), & - size(x, dim=2), size(x, dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), & + size(x, dim = 2), size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'BIAS_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'BIAS_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) * size(x, dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if ! ! not really sopisticated, it has to be checked if the 3 numbers of x and y are matching in arry position if (n .LE. 1_i4) stop 'BIAS_dp_3d: number of arguments must be at least 2' ! - BIAS_dp_3d = average(reshape(y, (/size(y,dim=1) * size(y,dim=2) * size(y,dim=3)/)), & - mask=reshape(maske,(/size(y,dim=1) * size(y,dim=2) * size(y,dim=3)/))) - & - average(reshape(x, (/size(x,dim=1) * size(x,dim=2) * size(x,dim=3)/)), & - mask=reshape(maske,(/size(x,dim=1) * size(x,dim=2) * size(x,dim=3)/))) + BIAS_dp_3d = average(reshape(y, (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske, (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) - & + average(reshape(x, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) ! END FUNCTION BIAS_dp_3d @@ -1021,692 +1021,692 @@ END FUNCTION BIAS_dp_3d FUNCTION KGE_sp_1d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev, correlation IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: KGE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: KGE_sp_1d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske - - REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y - REAL(sp) :: pearson_coor ! Pearson Corr. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske + + REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + REAL(sp) :: pearson_coor ! Pearson Corr. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGE_sp_1d: sample size must be at least 2' ! Mean - mu_Obs = average(x, mask=maske) - mu_Sim = average(y, mask=maske) + mu_Obs = average(x, mask = maske) + mu_Sim = average(y, mask = maske) ! Standard Deviation - sigma_Obs = stddev(x, mask=maske) - sigma_Sim = stddev(y, mask=maske) + sigma_Obs = stddev(x, mask = maske) + sigma_Sim = stddev(y, mask = maske) ! Pearson product-moment correlation coefficient is with (N-1) not N - pearson_coor = correlation(x, y, mask=maske) * real(n,sp) / real(n-1,sp) - ! - KGE_sp_1d = 1.0 - SQRT( & - ( 1.0_sp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_sp - (sigma_Sim/sigma_Obs) )**2 + & - ( 1.0_sp - pearson_coor)**2 & - ) - + pearson_coor = correlation(x, y, mask = maske) * real(n, sp) / real(n - 1, sp) + ! + KGE_sp_1d = 1.0 - SQRT(& + (1.0_sp - (mu_Sim / mu_Obs))**2 + & + (1.0_sp - (sigma_Sim / sigma_Obs))**2 + & + (1.0_sp - pearson_coor)**2 & + ) + END FUNCTION KGE_sp_1d FUNCTION KGE_sp_2d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev, correlation IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: KGE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: KGE_sp_2d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)) :: maske - REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y - REAL(sp) :: pearson_coor ! Pearson Corr. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske + REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + REAL(sp) :: pearson_coor ! Pearson Corr. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGE_sp_2d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - mu_Sim = average( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) + mu_Obs = average(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + mu_Sim = average(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - sigma_Sim = stddev( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) + sigma_Obs = stddev(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + sigma_Sim = stddev(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) ! Pearson product-moment correlation coefficient is with (N-1) not N pearson_coor = correlation(& - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) * & - real(n,sp) / real(n-1,sp) - ! - KGE_sp_2d = 1.0 - SQRT( & - ( 1.0_sp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_sp - (sigma_Sim/sigma_Obs) )**2 + & - ( 1.0_sp - pearson_coor)**2 & - ) - + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) * & + real(n, sp) / real(n - 1, sp) + ! + KGE_sp_2d = 1.0 - SQRT(& + (1.0_sp - (mu_Sim / mu_Obs))**2 + & + (1.0_sp - (sigma_Sim / sigma_Obs))**2 + & + (1.0_sp - pearson_coor)**2 & + ) + END FUNCTION KGE_sp_2d FUNCTION KGE_sp_3d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev, correlation IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: KGE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: KGE_sp_3d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2), size(x, dim=3)) :: maske - REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y - REAL(sp) :: pearson_coor ! Pearson Corr. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske + REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + REAL(sp) :: pearson_coor ! Pearson Corr. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGE_sp_3d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - mu_Sim = average( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) + mu_Obs = average(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + mu_Sim = average(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - sigma_Sim = stddev( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) + sigma_Obs = stddev(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + sigma_Sim = stddev(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) ! Pearson product-moment correlation coefficient is with (N-1) not N pearson_coor = correlation(& - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) * & - real(n,sp) / real(n-1,sp) - ! - KGE_sp_3d = 1.0 - SQRT( & - ( 1.0_sp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_sp - (sigma_Sim/sigma_Obs) )**2 + & - ( 1.0_sp - pearson_coor)**2 & - ) - + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) * & + real(n, sp) / real(n - 1, sp) + ! + KGE_sp_3d = 1.0 - SQRT(& + (1.0_sp - (mu_Sim / mu_Obs))**2 + & + (1.0_sp - (sigma_Sim / sigma_Obs))**2 + & + (1.0_sp - pearson_coor)**2 & + ) + END FUNCTION KGE_sp_3d FUNCTION KGE_dp_1d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev, correlation IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: KGE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: KGE_dp_1d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske - - REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y - REAL(dp) :: pearson_coor ! Pearson Corr. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske + + REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + REAL(dp) :: pearson_coor ! Pearson Corr. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGE_dp_1d: sample size must be at least 2' ! Mean - mu_Obs = average(x, mask=maske) - mu_Sim = average(y, mask=maske) + mu_Obs = average(x, mask = maske) + mu_Sim = average(y, mask = maske) ! Standard Deviation - sigma_Obs = stddev(x, mask=maske) - sigma_Sim = stddev(y, mask=maske) + sigma_Obs = stddev(x, mask = maske) + sigma_Sim = stddev(y, mask = maske) ! Pearson product-moment correlation coefficient is with (N-1) not N - pearson_coor = correlation(x, y, mask=maske) * real(n,dp) / real(n-1,dp) - ! - KGE_dp_1d = 1.0 - SQRT( & - ( 1.0_dp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_dp - (sigma_Sim/sigma_Obs) )**2 + & - ( 1.0_dp - pearson_coor)**2 & - ) - + pearson_coor = correlation(x, y, mask = maske) * real(n, dp) / real(n - 1, dp) + ! + KGE_dp_1d = 1.0 - SQRT(& + (1.0_dp - (mu_Sim / mu_Obs))**2 + & + (1.0_dp - (sigma_Sim / sigma_Obs))**2 + & + (1.0_dp - pearson_coor)**2 & + ) + END FUNCTION KGE_dp_1d FUNCTION KGE_dp_2d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev, correlation IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: KGE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: KGE_dp_2d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)) :: maske - REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y - REAL(dp) :: pearson_coor ! Pearson Corr. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske + REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + REAL(dp) :: pearson_coor ! Pearson Corr. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGE_dp_2d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - mu_Sim = average( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) + mu_Obs = average(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + mu_Sim = average(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - sigma_Sim = stddev( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) + sigma_Obs = stddev(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + sigma_Sim = stddev(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) ! Pearson product-moment correlation coefficient is with (N-1) not N pearson_coor = correlation(& - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) * & - real(n,dp) / real(n-1,dp) - ! - KGE_dp_2d = 1.0 - SQRT( & - ( 1.0_dp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_dp - (sigma_Sim/sigma_Obs) )**2 + & - ( 1.0_dp - pearson_coor)**2 & - ) - + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) * & + real(n, dp) / real(n - 1, dp) + ! + KGE_dp_2d = 1.0 - SQRT(& + (1.0_dp - (mu_Sim / mu_Obs))**2 + & + (1.0_dp - (sigma_Sim / sigma_Obs))**2 + & + (1.0_dp - pearson_coor)**2 & + ) + END FUNCTION KGE_dp_2d FUNCTION KGE_dp_3d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev, correlation IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: KGE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: KGE_dp_3d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2), size(x, dim=3)) :: maske - REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y - REAL(dp) :: pearson_coor ! Pearson Corr. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske + REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + REAL(dp) :: pearson_coor ! Pearson Corr. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGE_dp_3d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - mu_Sim = average( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) + mu_Obs = average(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + mu_Sim = average(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - sigma_Sim = stddev( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) + sigma_Obs = stddev(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + sigma_Sim = stddev(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) ! Pearson product-moment correlation coefficient is with (N-1) not N pearson_coor = correlation(& - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) * & - real(n,dp) / real(n-1,dp) - ! - KGE_dp_3d = 1.0 - SQRT( & - ( 1.0_dp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_dp - (sigma_Sim/sigma_Obs) )**2 + & - ( 1.0_dp - pearson_coor)**2 & - ) - + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) * & + real(n, dp) / real(n - 1, dp) + ! + KGE_dp_3d = 1.0 - SQRT(& + (1.0_dp - (mu_Sim / mu_Obs))**2 + & + (1.0_dp - (sigma_Sim / sigma_Obs))**2 + & + (1.0_dp - pearson_coor)**2 & + ) + END FUNCTION KGE_dp_3d ! ------------------------------------------------------------------ FUNCTION KGEnocorr_sp_1d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: KGEnocorr_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: KGEnocorr_sp_1d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske - - REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske + + REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGEnocorr_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGEnocorr_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGEnocorr_sp_1d: sample size must be at least 2' ! Mean - mu_Obs = average(x, mask=maske) - mu_Sim = average(y, mask=maske) + mu_Obs = average(x, mask = maske) + mu_Sim = average(y, mask = maske) ! Standard Deviation - sigma_Obs = stddev(x, mask=maske) - sigma_Sim = stddev(y, mask=maske) - - ! - KGEnocorr_sp_1d = 1.0 - SQRT( & - ( 1.0_sp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_sp - (sigma_Sim/sigma_Obs) )**2 & - ) - + sigma_Obs = stddev(x, mask = maske) + sigma_Sim = stddev(y, mask = maske) + + ! + KGEnocorr_sp_1d = 1.0 - SQRT(& + (1.0_sp - (mu_Sim / mu_Obs))**2 + & + (1.0_sp - (sigma_Sim / sigma_Obs))**2 & + ) + END FUNCTION KGEnocorr_sp_1d FUNCTION KGEnocorr_sp_2d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: KGEnocorr_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: KGEnocorr_sp_2d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)) :: maske - REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske + REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGEnocorr_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGEnocorr_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGEnocorr_sp_2d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - mu_Sim = average( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) + mu_Obs = average(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + mu_Sim = average(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - sigma_Sim = stddev( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) - ! - KGEnocorr_sp_2d = 1.0 - SQRT( & - ( 1.0_sp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_sp - (sigma_Sim/sigma_Obs) )**2 & - ) - + sigma_Obs = stddev(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + sigma_Sim = stddev(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) + ! + KGEnocorr_sp_2d = 1.0 - SQRT(& + (1.0_sp - (mu_Sim / mu_Obs))**2 + & + (1.0_sp - (sigma_Sim / sigma_Obs))**2 & + ) + END FUNCTION KGEnocorr_sp_2d FUNCTION KGEnocorr_sp_3d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: KGEnocorr_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: KGEnocorr_sp_3d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2), size(x, dim=3)) :: maske - REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske + REAL(sp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(sp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGEnocorr_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGEnocorr_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGEnocorr_sp_3d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - mu_Sim = average( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) + mu_Obs = average(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + mu_Sim = average(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - sigma_Sim = stddev( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) - - ! - KGEnocorr_sp_3d = 1.0 - SQRT( & - ( 1.0_sp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_sp - (sigma_Sim/sigma_Obs) )**2 & - ) - + sigma_Obs = stddev(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + sigma_Sim = stddev(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) + + ! + KGEnocorr_sp_3d = 1.0 - SQRT(& + (1.0_sp - (mu_Sim / mu_Obs))**2 + & + (1.0_sp - (sigma_Sim / sigma_Obs))**2 & + ) + END FUNCTION KGEnocorr_sp_3d FUNCTION KGEnocorr_dp_1d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: KGEnocorr_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: KGEnocorr_dp_1d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske - - REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske + + REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGEnocorr_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGEnocorr_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGEnocorr_dp_1d: sample size must be at least 2' ! Mean - mu_Obs = average(x, mask=maske) - mu_Sim = average(y, mask=maske) + mu_Obs = average(x, mask = maske) + mu_Sim = average(y, mask = maske) ! Standard Deviation - sigma_Obs = stddev(x, mask=maske) - sigma_Sim = stddev(y, mask=maske) - - ! - KGEnocorr_dp_1d = 1.0 - SQRT( & - ( 1.0_dp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_dp - (sigma_Sim/sigma_Obs) )**2 & - ) - + sigma_Obs = stddev(x, mask = maske) + sigma_Sim = stddev(y, mask = maske) + + ! + KGEnocorr_dp_1d = 1.0 - SQRT(& + (1.0_dp - (mu_Sim / mu_Obs))**2 + & + (1.0_dp - (sigma_Sim / sigma_Obs))**2 & + ) + END FUNCTION KGEnocorr_dp_1d FUNCTION KGEnocorr_dp_2d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: KGEnocorr_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: KGEnocorr_dp_2d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)) :: maske - REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske + REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGEnocorr_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGEnocorr_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGEnocorr_dp_2d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - mu_Sim = average( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) + mu_Obs = average(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + mu_Sim = average(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) - sigma_Sim = stddev( & - reshape(y(:,:), (/size(y, dim=1)*size(y, dim=2)/)), & - mask=reshape(maske(:,:), (/size(y, dim=1)*size(y, dim=2)/))) - ! - KGEnocorr_dp_2d = 1.0 - SQRT( & - ( 1.0_dp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_dp - (sigma_Sim/sigma_Obs) )**2 & - ) - + sigma_Obs = stddev(& + reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) + sigma_Sim = stddev(& + reshape(y(:, :), (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(y, dim = 1) * size(y, dim = 2)/))) + ! + KGEnocorr_dp_2d = 1.0 - SQRT(& + (1.0_dp - (mu_Sim / mu_Obs))**2 + & + (1.0_dp - (sigma_Sim / sigma_Obs))**2 & + ) + END FUNCTION KGEnocorr_dp_2d FUNCTION KGEnocorr_dp_3d(x, y, mask) - USE mo_moment, ONLY: average, stddev, correlation + USE mo_moment, ONLY : average, stddev IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: KGEnocorr_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: KGEnocorr_dp_3d ! local variables - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2), size(x, dim=3)) :: maske - REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y - REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske + REAL(dp) :: mu_Obs, mu_Sim ! Mean of x and y + REAL(dp) :: sigma_Obs, sigma_Sim ! Standard dev. of x and y if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'KGEnocorr_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'KGEnocorr_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'KGEnocorr_dp_3d: sample size must be at least 2' ! Mean - mu_Obs = average( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - mu_Sim = average( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) + mu_Obs = average(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + mu_Sim = average(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) ! Standard Deviation - sigma_Obs = stddev( & - reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) - sigma_Sim = stddev( & - reshape(y(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(y, dim=1)*size(y, dim=2)*size(y, dim=3)/))) - - ! - KGEnocorr_dp_3d = 1.0 - SQRT( & - ( 1.0_dp - (mu_Sim/mu_Obs) )**2 + & - ( 1.0_dp - (sigma_Sim/sigma_Obs) )**2 & - ) - + sigma_Obs = stddev(& + reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) + sigma_Sim = stddev(& + reshape(y(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(y, dim = 1) * size(y, dim = 2) * size(y, dim = 3)/))) + + ! + KGEnocorr_dp_3d = 1.0 - SQRT(& + (1.0_dp - (mu_Sim / mu_Obs))**2 + & + (1.0_dp - (sigma_Sim / sigma_Obs))**2 & + ) + END FUNCTION KGEnocorr_dp_3d @@ -1714,37 +1714,37 @@ END FUNCTION KGEnocorr_dp_3d FUNCTION LNNSE_sp_1d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(INOUT) :: mask - REAL(sp) :: LNNSE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(INOUT) :: mask + REAL(sp) :: LNNSE_sp_1d - INTEGER(i4) :: n + INTEGER(i4) :: n INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(sp) :: xmean - REAL(sp), DIMENSION(size(x)) :: logx, logy, v1, v2 - LOGICAL, DIMENSION(size(x)) :: maske + REAL(sp) :: xmean + REAL(sp), DIMENSION(size(x)) :: logx, logy, v1, v2 + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'LNNSE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'LNNSE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if ! mask all negative and zero entries where (x .lt. tiny(1.0_sp) .or. y .lt. tiny(1.0_sp)) - maske = .false. + maske = .false. end where n = count(maske) if (n .LE. 1_i4) stop 'LNNSE_sp_1d: number of arguments must be at least 2' @@ -1753,17 +1753,17 @@ FUNCTION LNNSE_sp_1d(x, y, mask) logx = 0.0_sp logy = 0.0_sp where (maske) - logx = log(x) - logy = log(y) + logx = log(x) + logy = log(y) end where - + ! mean of x - xmean = average(logx, mask=maske) + xmean = average(logx, mask = maske) ! NSE - v1 = merge(logy - logx, 0.0_sp, maske) + v1 = merge(logy - logx, 0.0_sp, maske) v2 = merge(logx - xmean, 0.0_sp, maske) - LNNSE_sp_1d = 1.0_sp - dot_product(v1,v1) / dot_product(v2,v2) + LNNSE_sp_1d = 1.0_sp - dot_product(v1, v1) / dot_product(v2, v2) END FUNCTION LNNSE_sp_1d @@ -1771,37 +1771,37 @@ END FUNCTION LNNSE_sp_1d FUNCTION LNNSE_dp_1d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(INOUT) :: mask - REAL(dp) :: LNNSE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(INOUT) :: mask + REAL(dp) :: LNNSE_dp_1d - INTEGER(i4) :: n + INTEGER(i4) :: n INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(dp) :: xmean - REAL(dp), DIMENSION(size(x)) :: logx, logy, v1, v2 - LOGICAL, DIMENSION(size(x)) :: maske + REAL(dp) :: xmean + REAL(dp), DIMENSION(size(x)) :: logx, logy, v1, v2 + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'LNNSE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'LNNSE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if ! mask all negative and zero entries where (x .lt. tiny(1.0_dp) .or. y .lt. tiny(1.0_dp)) - maske = .false. + maske = .false. end where n = count(maske) if (n .LE. 1_i4) stop 'LNNSE_dp_1d: number of arguments must be at least 2' @@ -1810,17 +1810,17 @@ FUNCTION LNNSE_dp_1d(x, y, mask) logx = 0.0_dp logy = 0.0_dp where (maske) - logx = log(x) - logy = log(y) + logx = log(x) + logy = log(y) end where - + ! mean of x - xmean = average(logx, mask=maske) + xmean = average(logx, mask = maske) ! NSE - v1 = merge(logy - logx, 0.0_dp, maske) + v1 = merge(logy - logx, 0.0_dp, maske) v2 = merge(logx - xmean, 0.0_dp, maske) - LNNSE_dp_1d = 1.0_dp - sum(v1*v1, mask=maske) / sum(v2*v2, mask=maske) + LNNSE_dp_1d = 1.0_dp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske) END FUNCTION LNNSE_dp_1d @@ -1828,37 +1828,37 @@ END FUNCTION LNNSE_dp_1d FUNCTION LNNSE_sp_2d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: mask - REAL(sp) :: LNNSE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(INOUT) :: mask + REAL(sp) :: LNNSE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(sp) :: xmean - REAL(sp), DIMENSION(size(x,dim=1),size(x,dim=2)) :: logx, logy, v1, v2 - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(sp) :: xmean + REAL(sp), DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: logx, logy, v1, v2 + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'LNNSE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'LNNSE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if ! mask all negative and zero entries where (x .lt. tiny(1.0_sp) .or. y .lt. tiny(1.0_sp)) - maske = .false. + maske = .false. end where n = count(maske) if (n .LE. 1_i4) stop 'LNNSE_sp_2d: number of arguments must be at least 2' @@ -1867,17 +1867,17 @@ FUNCTION LNNSE_sp_2d(x, y, mask) logx = 0.0_sp logy = 0.0_sp where (maske) - logx = log(x) - logy = log(y) + logx = log(x) + logy = log(y) end where - + ! mean of x - xmean = average(pack(logx,maske)) + xmean = average(pack(logx, maske)) ! NSE - v1 = merge(logy - logx, 0.0_sp, maske) + v1 = merge(logy - logx, 0.0_sp, maske) v2 = merge(logx - xmean, 0.0_sp, maske) - LNNSE_sp_2d = 1.0_sp - sum(v1*v1, mask=maske) / sum(v2*v2, mask=maske) + LNNSE_sp_2d = 1.0_sp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske) END FUNCTION LNNSE_sp_2d @@ -1885,37 +1885,37 @@ END FUNCTION LNNSE_sp_2d FUNCTION LNNSE_dp_2d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: mask - REAL(dp) :: LNNSE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(INOUT) :: mask + REAL(dp) :: LNNSE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(dp) :: xmean - REAL(dp), DIMENSION(size(x,dim=1),size(x,dim=2)) :: logx, logy, v1, v2 - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(dp) :: xmean + REAL(dp), DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: logx, logy, v1, v2 + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'LNNSE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'LNNSE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if ! mask all negative and zero entries where (x .lt. tiny(1.0_dp) .or. y .lt. tiny(1.0_dp)) - maske = .false. + maske = .false. end where n = count(maske) if (n .LE. 1_i4) stop 'LNNSE_dp_2d: number of arguments must be at least 2' @@ -1924,17 +1924,17 @@ FUNCTION LNNSE_dp_2d(x, y, mask) logx = 0.0_dp logy = 0.0_dp where (maske) - logx = log(x) - logy = log(y) + logx = log(x) + logy = log(y) end where - + ! mean of x - xmean = average(pack(logx,maske)) + xmean = average(pack(logx, maske)) ! NSE - v1 = merge(logy - logx, 0.0_dp, maske) + v1 = merge(logy - logx, 0.0_dp, maske) v2 = merge(logx - xmean, 0.0_dp, maske) - LNNSE_dp_2d = 1.0_dp - sum(v1*v1, mask=maske) / sum(v2*v2, mask=maske) + LNNSE_dp_2d = 1.0_dp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske) END FUNCTION LNNSE_dp_2d @@ -1942,37 +1942,37 @@ END FUNCTION LNNSE_dp_2d FUNCTION LNNSE_sp_3d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: mask - REAL(sp) :: LNNSE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(INOUT) :: mask + REAL(sp) :: LNNSE_sp_3d + + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(sp) :: xmean + REAL(sp), DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: logx, logy, v1, v2 + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(sp) :: xmean - REAL(sp), DIMENSION(size(x,dim=1),size(x,dim=2),size(x,dim=3)) :: logx, logy, v1, v2 - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2),size(x,dim=3)) :: maske - if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'LNNSE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'LNNSE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if ! mask all negative and zero entries where (x .lt. tiny(1.0_sp) .or. y .lt. tiny(1.0_sp)) - maske = .false. + maske = .false. end where n = count(maske) if (n .LE. 1_i4) stop 'LNNSE_sp_3d: number of arguments must be at least 2' @@ -1981,17 +1981,17 @@ FUNCTION LNNSE_sp_3d(x, y, mask) logx = 0.0_sp logy = 0.0_sp where (maske) - logx = log(x) - logy = log(y) + logx = log(x) + logy = log(y) end where - + ! mean of x - xmean = average(pack(logx,maske)) + xmean = average(pack(logx, maske)) ! NSE - v1 = merge(logy - logx, 0.0_sp, maske) + v1 = merge(logy - logx, 0.0_sp, maske) v2 = merge(logx - xmean, 0.0_sp, maske) - LNNSE_sp_3d = 1.0_sp - sum(v1*v1, mask=maske) / sum(v2*v2, mask=maske) + LNNSE_sp_3d = 1.0_sp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske) END FUNCTION LNNSE_sp_3d @@ -1999,37 +1999,37 @@ END FUNCTION LNNSE_sp_3d FUNCTION LNNSE_dp_3d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: mask - REAL(dp) :: LNNSE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(INOUT) :: mask + REAL(dp) :: LNNSE_dp_3d + + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(dp) :: xmean + REAL(dp), DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: logx, logy, v1, v2 + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), size(x, dim = 3)) :: maske - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(dp) :: xmean - REAL(dp), DIMENSION(size(x,dim=1),size(x,dim=2),size(x,dim=3)) :: logx, logy, v1, v2 - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2),size(x,dim=3)) :: maske - if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'LNNSE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'LNNSE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if ! mask all negative and zero entries where (x .lt. tiny(1.0_dp) .or. y .lt. tiny(1.0_dp)) - maske = .false. + maske = .false. end where n = count(maske) if (n .LE. 1_i4) stop 'LNNSE_dp_3d: number of arguments must be at least 2' @@ -2038,17 +2038,17 @@ FUNCTION LNNSE_dp_3d(x, y, mask) logx = 0.0_dp logy = 0.0_dp where (maske) - logx = log(x) - logy = log(y) + logx = log(x) + logy = log(y) end where - + ! mean of x - xmean = average(pack(logx,maske)) + xmean = average(pack(logx, maske)) ! NSE - v1 = merge(logy - logx, 0.0_dp, maske) + v1 = merge(logy - logx, 0.0_dp, maske) v2 = merge(logx - xmean, 0.0_dp, maske) - LNNSE_dp_3d = 1.0_dp - sum(v1*v1, mask=maske) / sum(v2*v2, mask=maske) + LNNSE_dp_3d = 1.0_dp - sum(v1 * v1, mask = maske) / sum(v2 * v2, mask = maske) END FUNCTION LNNSE_dp_3d @@ -2058,32 +2058,32 @@ FUNCTION MAE_sp_1d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: MAE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: MAE_sp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MAE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MAE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) + maske = .true. + n = size(x, dim = 1) end if if (n .LE. 1_i4) stop 'MAE_sp_1d: number of arguments must be at least 2' ! - MAE_sp_1d = SAE_sp_1d(x,y,mask=maske) / real(n, sp) + MAE_sp_1d = SAE_sp_1d(x, y, mask = maske) / real(n, sp) END FUNCTION MAE_sp_1d @@ -2091,32 +2091,32 @@ FUNCTION MAE_dp_1d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: MAE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: MAE_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MAE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MAE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) + maske = .true. + n = size(x, dim = 1) end if if (n .LE. 1_i4) stop 'MAE_dp_1d: number of arguments must be at least 2' ! - MAE_dp_1d = SAE_dp_1d(x,y,mask=maske) / real(n, dp) + MAE_dp_1d = SAE_dp_1d(x, y, mask = maske) / real(n, dp) END FUNCTION MAE_dp_1d @@ -2124,32 +2124,32 @@ FUNCTION MAE_sp_2d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: MAE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: MAE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MAE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MAE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'MAE_sp_2d: number of arguments must be at least 2' ! - MAE_sp_2d = SAE_sp_2d(x,y,mask=maske) / real(n, sp) + MAE_sp_2d = SAE_sp_2d(x, y, mask = maske) / real(n, sp) END FUNCTION MAE_sp_2d @@ -2157,32 +2157,32 @@ FUNCTION MAE_dp_2d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: MAE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: MAE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MAE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MAE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'MAE_dp_2d: number of arguments must be at least 2' ! - MAE_dp_2d = SAE_dp_2d(x,y,mask=maske) / real(n, dp) + MAE_dp_2d = SAE_dp_2d(x, y, mask = maske) / real(n, dp) END FUNCTION MAE_dp_2d @@ -2190,33 +2190,33 @@ FUNCTION MAE_sp_3d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: MAE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: MAE_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MAE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MAE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'MAE_sp_3d: number of arguments must be at least 2' ! - MAE_sp_3d = SAE_sp_3d(x,y,mask=maske) / real(n, sp) + MAE_sp_3d = SAE_sp_3d(x, y, mask = maske) / real(n, sp) END FUNCTION MAE_sp_3d @@ -2224,33 +2224,33 @@ FUNCTION MAE_dp_3d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: MAE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: MAE_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MAE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MAE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'MAE_dp_3d: number of arguments must be at least 2' ! - MAE_dp_3d = SAE_dp_3d(x,y,mask=maske) / real(n, dp) + MAE_dp_3d = SAE_dp_3d(x, y, mask = maske) / real(n, dp) END FUNCTION MAE_dp_3d @@ -2260,32 +2260,32 @@ FUNCTION MSE_sp_1d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: MSE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: MSE_sp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MSE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MSE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) + maske = .true. + n = size(x, dim = 1) end if if (n .LE. 1_i4) stop 'MSE_sp_1d: number of arguments must be at least 2' ! - MSE_sp_1d = SSE_sp_1d(x,y,mask=maske) / real(n, sp) + MSE_sp_1d = SSE_sp_1d(x, y, mask = maske) / real(n, sp) END FUNCTION MSE_sp_1d @@ -2293,32 +2293,32 @@ FUNCTION MSE_dp_1d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: MSE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: MSE_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MSE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MSE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) + maske = .true. + n = size(x, dim = 1) end if if (n .LE. 1_i4) stop 'MSE_dp_1d: number of arguments must be at least 2' ! - MSE_dp_1d = SSE_dp_1d(x,y,mask=maske) / real(n, dp) + MSE_dp_1d = SSE_dp_1d(x, y, mask = maske) / real(n, dp) END FUNCTION MSE_dp_1d @@ -2326,32 +2326,32 @@ FUNCTION MSE_sp_2d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: MSE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: MSE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MSE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MSE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'MSE_sp_2d: number of arguments must be at least 2' ! - MSE_sp_2d = SSE_sp_2d(x,y,mask=maske) / real(n, sp) + MSE_sp_2d = SSE_sp_2d(x, y, mask = maske) / real(n, sp) END FUNCTION MSE_sp_2d @@ -2359,32 +2359,32 @@ FUNCTION MSE_dp_2d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: MSE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: MSE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MSE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MSE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'MSE_dp_2d: number of arguments must be at least 2' ! - MSE_dp_2d = SSE_dp_2d(x,y,mask=maske) / real(n, dp) + MSE_dp_2d = SSE_dp_2d(x, y, mask = maske) / real(n, dp) END FUNCTION MSE_dp_2d @@ -2392,33 +2392,33 @@ FUNCTION MSE_sp_3d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: MSE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: MSE_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MSE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MSE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'MSE_sp_3d: number of arguments must be at least 2' ! - MSE_sp_3d = SSE_sp_3d(x,y,mask=maske) / real(n, sp) + MSE_sp_3d = SSE_sp_3d(x, y, mask = maske) / real(n, sp) END FUNCTION MSE_sp_3d @@ -2426,33 +2426,33 @@ FUNCTION MSE_dp_3d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: MSE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: MSE_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'MSE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'MSE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'MSE_dp_3d: number of arguments must be at least 2' ! - MSE_dp_3d = SSE_dp_3d(x,y,mask=maske) / real(n, dp) + MSE_dp_3d = SSE_dp_3d(x, y, mask = maske) / real(n, dp) END FUNCTION MSE_dp_3d @@ -2460,247 +2460,247 @@ END FUNCTION MSE_dp_3d FUNCTION NSE_sp_1d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: NSE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: NSE_sp_1d - INTEGER(i4) :: n + INTEGER(i4) :: n INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - REAL(sp) :: xmean - REAL(sp), DIMENSION(size(x)) :: v1, v2 - LOGICAL, DIMENSION(size(x)) :: maske + REAL(sp) :: xmean + REAL(sp), DIMENSION(size(x)) :: v1, v2 + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'NSE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'NSE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'NSE_sp_1d: number of arguments must be at least 2' ! mean of x - xmean = average(x, mask=maske) + xmean = average(x, mask = maske) ! - v1 = merge(y - x , 0.0_sp, maske) + v1 = merge(y - x, 0.0_sp, maske) v2 = merge(x - xmean, 0.0_sp, maske) ! - NSE_sp_1d = 1.0_sp - dot_product(v1,v1) / dot_product(v2,v2) + NSE_sp_1d = 1.0_sp - dot_product(v1, v1) / dot_product(v2, v2) END FUNCTION NSE_sp_1d FUNCTION NSE_dp_1d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: NSE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: NSE_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - REAL(dp) :: xmean - REAL(dp), DIMENSION(size(x)) :: v1, v2 - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(dp) :: xmean + REAL(dp), DIMENSION(size(x)) :: v1, v2 + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'NSE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'NSE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'NSE_dp_1d: number of arguments must be at least 2' ! mean of x - xmean = average(x, mask=maske) + xmean = average(x, mask = maske) ! - v1 = merge(y - x , 0.0_dp, maske) + v1 = merge(y - x, 0.0_dp, maske) v2 = merge(x - xmean, 0.0_dp, maske) ! - NSE_dp_1d = 1.0_dp - dot_product(v1,v1) / dot_product(v2,v2) + NSE_dp_1d = 1.0_dp - dot_product(v1, v1) / dot_product(v2, v2) END FUNCTION NSE_dp_1d FUNCTION NSE_sp_2d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: NSE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: NSE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - REAL(sp) :: xmean - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)):: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(sp) :: xmean + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'NSE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'NSE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if ! if (n .LE. 1_i4) stop 'NSE_sp_2d: number of arguments must be at least 2' ! mean of x - xmean = average(reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) + xmean = average(reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) ! - NSE_sp_2d = 1.0_sp - sum((y-x)*(y-x), mask=maske) / sum((x-xmean)*(x-xmean), mask=maske) + NSE_sp_2d = 1.0_sp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske) ! END FUNCTION NSE_sp_2d FUNCTION NSE_dp_2d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: NSE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: NSE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - REAL(dp) :: xmean - LOGICAL, DIMENSION(size(x, dim=1), size(x, dim=2)):: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(dp) :: xmean + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'NSE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'NSE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if ! if (n .LE. 1_i4) stop 'NSE_dp_2d: number of arguments must be at least 2' ! mean of x - xmean = average(reshape(x(:,:), (/size(x, dim=1)*size(x, dim=2)/)), & - mask=reshape(maske(:,:), (/size(x, dim=1)*size(x, dim=2)/))) + xmean = average(reshape(x(:, :), (/size(x, dim = 1) * size(x, dim = 2)/)), & + mask = reshape(maske(:, :), (/size(x, dim = 1) * size(x, dim = 2)/))) ! - NSE_dp_2d = 1.0_dp - sum((y-x)*(y-x), mask=maske) / sum((x-xmean)*(x-xmean), mask=maske) + NSE_dp_2d = 1.0_dp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske) ! END FUNCTION NSE_dp_2d FUNCTION NSE_sp_3d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: NSE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: NSE_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - REAL(sp) :: xmean - LOGICAL, DIMENSION(size(x, dim=1), & - size(x, dim=2), size(x, dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(sp) :: xmean + LOGICAL, DIMENSION(size(x, dim = 1), & + size(x, dim = 2), size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'NSE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'NSE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) * size(x, dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if ! if (n .LE. 1_i4) stop 'NSE_sp_3d: number of arguments must be at least 2' ! mean of x - xmean = average(reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) + xmean = average(reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) ! - NSE_sp_3d = 1.0_sp - sum((y-x)*(y-x), mask=maske) / sum((x-xmean)*(x-xmean), mask=maske) + NSE_sp_3d = 1.0_sp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske) ! END FUNCTION NSE_sp_3d FUNCTION NSE_dp_3d(x, y, mask) - USE mo_moment, ONLY: average + USE mo_moment, ONLY : average IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: NSE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: NSE_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - REAL(dp) :: xmean - LOGICAL, DIMENSION(size(x, dim=1), & - size(x, dim=2), size(x, dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + REAL(dp) :: xmean + LOGICAL, DIMENSION(size(x, dim = 1), & + size(x, dim = 2), size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'NSE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'NSE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x, dim=1) * size(x, dim=2) * size(x, dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if ! if (n .LE. 1_i4) stop 'NSE_dp_3d: number of arguments must be at least 2' ! Average of x - xmean = average(reshape(x(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/)), & - mask=reshape(maske(:,:,:), (/size(x, dim=1)*size(x, dim=2)*size(x, dim=3)/))) + xmean = average(reshape(x(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske(:, :, :), (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/))) ! - NSE_dp_3d = 1.0_dp - sum((y-x)*(y-x), mask=maske) / sum((x-xmean)*(x-xmean), mask=maske) + NSE_dp_3d = 1.0_dp - sum((y - x) * (y - x), mask = maske) / sum((x - xmean) * (x - xmean), mask = maske) ! END FUNCTION NSE_dp_3d @@ -2711,33 +2711,33 @@ FUNCTION SAE_sp_1d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: SAE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: SAE_sp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SAE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SAE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SAE_sp_1d: number of arguments must be at least 2' ! - SAE_sp_1d = sum(abs(y - x) ,mask = maske) + SAE_sp_1d = sum(abs(y - x), mask = maske) END FUNCTION SAE_sp_1d @@ -2745,33 +2745,33 @@ FUNCTION SAE_dp_1d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: SAE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: SAE_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SAE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SAE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SAE_dp_1d: number of arguments must be at least 2' ! - SAE_dp_1d = sum(abs(y - x) ,mask = maske) + SAE_dp_1d = sum(abs(y - x), mask = maske) END FUNCTION SAE_dp_1d @@ -2779,35 +2779,35 @@ FUNCTION SAE_sp_2d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: SAE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: SAE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SAE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SAE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'SAE_sp_2d: number of arguments must be at least 2' ! - SAE_sp_2d = SAE_sp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2)/)) ) + SAE_sp_2d = SAE_sp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2)/))) END FUNCTION SAE_sp_2d @@ -2815,35 +2815,35 @@ FUNCTION SAE_dp_2d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: SAE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: SAE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SAE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SAE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'SAE_dp_2d: number of arguments must be at least 2' ! - SAE_dp_2d = SAE_dp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2)/)) ) + SAE_dp_2d = SAE_dp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2)/))) END FUNCTION SAE_dp_2d @@ -2851,37 +2851,37 @@ FUNCTION SAE_sp_3d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: SAE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: SAE_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SAE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SAE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'SAE_sp_3d: number of arguments must be at least 2' ! - SAE_sp_3d = SAE_sp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2) * size(x, dim=3)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2) * size(x, dim=3)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2) & - * size(maske, dim=3)/)) ) + SAE_sp_3d = SAE_sp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2) & + * size(maske, dim = 3)/))) END FUNCTION SAE_sp_3d @@ -2889,37 +2889,37 @@ FUNCTION SAE_dp_3d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: SAE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: SAE_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SAE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SAE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'SAE_dp_3d: number of arguments must be at least 2' ! - SAE_dp_3d = SAE_dp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2) * size(x, dim=3)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2) * size(x, dim=3)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2) & - * size(maske, dim=3)/)) ) + SAE_dp_3d = SAE_dp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2) & + * size(maske, dim = 3)/))) END FUNCTION SAE_dp_3d @@ -2929,33 +2929,33 @@ FUNCTION SSE_sp_1d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: SSE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: SSE_sp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if ! - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SSE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SSE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SSE_sp_1d: number of arguments must be at least 2' ! - SSE_sp_1d = sum((y - x)**2_i4 ,mask = maske) + SSE_sp_1d = sum((y - x)**2_i4, mask = maske) END FUNCTION SSE_sp_1d @@ -2963,32 +2963,32 @@ FUNCTION SSE_dp_1d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: SSE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: SSE_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SSE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SSE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SSE_dp_1d: number of arguments must be at least 2' ! - SSE_dp_1d = sum((y - x)**2_i4 ,mask = maske) + SSE_dp_1d = sum((y - x)**2_i4, mask = maske) END FUNCTION SSE_dp_1d @@ -2996,34 +2996,34 @@ FUNCTION SSE_sp_2d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: SSE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: SSE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1), size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SSE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SSE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SSE_sp_2d: number of arguments must be at least 2' ! - SSE_sp_2d = SSE_sp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2)/)) ) + SSE_sp_2d = SSE_sp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2)/))) END FUNCTION SSE_sp_2d @@ -3031,34 +3031,34 @@ FUNCTION SSE_dp_2d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: SSE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: SSE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1), size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SSE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SSE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SSE_dp_2d: number of arguments must be at least 2' ! - SSE_dp_2d = SSE_dp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2)/)) ) + SSE_dp_2d = SSE_dp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2)/))) END FUNCTION SSE_dp_2d @@ -3066,36 +3066,36 @@ FUNCTION SSE_sp_3d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: SSE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: SSE_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1), size(x,dim=2),& - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SSE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SSE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SSE_sp_3d: number of arguments must be at least 2' ! - SSE_sp_3d = SSE_sp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2) * size(x, dim=3)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2) * size(x, dim=3)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2) & - * size(maske, dim=3)/))) + SSE_sp_3d = SSE_sp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2) & + * size(maske, dim = 3)/))) END FUNCTION SSE_sp_3d @@ -3103,36 +3103,36 @@ FUNCTION SSE_dp_3d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: SSE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: SSE_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1), size(x,dim=2),& - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'SSE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'SSE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x) + maske = .true. + n = size(x) end if if (n .LE. 1_i4) stop 'SSE_dp_3d: number of arguments must be at least 2' ! - SSE_dp_3d = SSE_dp_1d(reshape(x, (/size(x, dim=1) * size(x, dim=2) * size(x, dim=3)/)), & - reshape(y, (/size(y, dim=1) * size(y, dim=2) * size(x, dim=3)/)), & - mask=reshape(maske, (/size(maske, dim=1) * size(maske, dim=2) & - * size(maske, dim=3)/))) + SSE_dp_3d = SSE_dp_1d(reshape(x, (/size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3)/)), & + reshape(y, (/size(y, dim = 1) * size(y, dim = 2) * size(x, dim = 3)/)), & + mask = reshape(maske, (/size(maske, dim = 1) * size(maske, dim = 2) & + * size(maske, dim = 3)/))) END FUNCTION SSE_dp_3d @@ -3142,32 +3142,32 @@ FUNCTION RMSE_sp_1d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: RMSE_sp_1d + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: RMSE_sp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'RMSE_sp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'RMSE_sp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) + maske = .true. + n = size(x, dim = 1) end if if (n .LE. 1_i4) stop 'RMSE_sp_1d: number of arguments must be at least 2' ! - RMSE_sp_1d = sqrt(MSE_sp_1d(x,y,mask=maske)) + RMSE_sp_1d = sqrt(MSE_sp_1d(x, y, mask = maske)) END FUNCTION RMSE_sp_1d @@ -3175,32 +3175,32 @@ FUNCTION RMSE_dp_1d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: RMSE_dp_1d + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: RMSE_dp_1d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x, dim=1)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'RMSE_dp_1d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'RMSE_dp_1d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) + maske = .true. + n = size(x, dim = 1) end if if (n .LE. 1_i4) stop 'RMSE_dp_1d: number of arguments must be at least 2' ! - RMSE_dp_1d = sqrt(MSE_dp_1d(x,y,mask=maske)) + RMSE_dp_1d = sqrt(MSE_dp_1d(x, y, mask = maske)) END FUNCTION RMSE_dp_1d @@ -3208,32 +3208,32 @@ FUNCTION RMSE_sp_2d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: RMSE_sp_2d + REAL(sp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: RMSE_sp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'RMSE_sp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'RMSE_sp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'RMSE_sp_2d: number of arguments must be at least 2' ! - RMSE_sp_2d = sqrt(MSE_sp_2d(x,y,mask=maske)) + RMSE_sp_2d = sqrt(MSE_sp_2d(x, y, mask = maske)) END FUNCTION RMSE_sp_2d @@ -3241,32 +3241,32 @@ FUNCTION RMSE_dp_2d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: RMSE_dp_2d + REAL(dp), DIMENSION(:, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: RMSE_dp_2d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'RMSE_dp_2d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'RMSE_dp_2d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) end if if (n .LE. 1_i4) stop 'RMSE_dp_2d: number of arguments must be at least 2' ! - RMSE_dp_2d = sqrt(MSE_dp_2d(x,y,mask=maske)) + RMSE_dp_2d = sqrt(MSE_dp_2d(x, y, mask = maske)) END FUNCTION RMSE_dp_2d @@ -3274,33 +3274,33 @@ FUNCTION RMSE_sp_3d(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: RMSE_sp_3d + REAL(sp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: RMSE_sp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'RMSE_sp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'RMSE_sp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'RMSE_sp_3d: number of arguments must be at least 2' ! - RMSE_sp_3d = sqrt(MSE_sp_3d(x,y,mask=maske)) + RMSE_sp_3d = sqrt(MSE_sp_3d(x, y, mask = maske)) END FUNCTION RMSE_sp_3d @@ -3308,36 +3308,36 @@ FUNCTION RMSE_dp_3d(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: x, y - LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: RMSE_dp_3d + REAL(dp), DIMENSION(:, :, :), INTENT(IN) :: x, y + LOGICAL, DIMENSION(:, :, :), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: RMSE_dp_3d - INTEGER(i4) :: n - INTEGER(i4), DIMENSION(size(shape(x)) ) :: shapemask - LOGICAL, DIMENSION(size(x,dim=1),size(x,dim=2), & - size(x,dim=3)) :: maske + INTEGER(i4) :: n + INTEGER(i4), DIMENSION(size(shape(x))) :: shapemask + LOGICAL, DIMENSION(size(x, dim = 1), size(x, dim = 2), & + size(x, dim = 3)) :: maske if (present(mask)) then - shapemask = shape(mask) + shapemask = shape(mask) else - shapemask = shape(x) + shapemask = shape(x) end if - if ( (any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask)) ) & - stop 'RMSE_dp_3d: shapes of inputs(x,y) or mask are not matching' + if ((any(shape(x) .NE. shape(y))) .OR. (any(shape(x) .NE. shapemask))) & + stop 'RMSE_dp_3d: shapes of inputs(x,y) or mask are not matching' ! if (present(mask)) then - maske = mask - n = count(maske) + maske = mask + n = count(maske) else - maske = .true. - n = size(x,dim=1) * size(x,dim=2) * size(x,dim=3) + maske = .true. + n = size(x, dim = 1) * size(x, dim = 2) * size(x, dim = 3) end if if (n .LE. 1_i4) stop 'RMSE_dp_3d: number of arguments must be at least 2' ! - RMSE_dp_3d = sqrt(MSE_dp_3d(x,y,mask=maske)) + RMSE_dp_3d = sqrt(MSE_dp_3d(x, y, mask = maske)) END FUNCTION RMSE_dp_3d - + ! ------------------------------------------------------------------ FUNCTION wNSE_sp_1d(x, y, mask) diff --git a/src/lib/mo_finish.f90 b/src/lib/mo_finish.f90 index 4d68dd6a..db4b772b 100644 --- a/src/lib/mo_finish.f90 +++ b/src/lib/mo_finish.f90 @@ -34,7 +34,7 @@ MODULE mo_finish ! Copyright 2011 Matthias Cuntz - USE mo_string_utils, ONLY: separator + USE mo_string_utils, ONLY : separator IMPLICIT NONE @@ -97,30 +97,30 @@ SUBROUTINE finish(name, text, unit) IMPLICIT NONE - CHARACTER(len=*), INTENT(IN) :: name - CHARACTER(len=*), INTENT(IN), OPTIONAL :: text - INTEGER, INTENT(IN), OPTIONAL :: unit + CHARACTER(len = *), INTENT(IN) :: name + CHARACTER(len = *), INTENT(IN), OPTIONAL :: text + INTEGER, INTENT(IN), OPTIONAL :: unit IF (PRESENT(unit)) THEN - WRITE (unit,'(a)') separator + WRITE (unit, '(a)') separator - IF (PRESENT(text)) THEN - WRITE (unit,'(a,a,a)') name, ': ', text - ELSE - WRITE (unit,'(a)') name - END IF + IF (PRESENT(text)) THEN + WRITE (unit, '(a,a,a)') name, ': ', text + ELSE + WRITE (unit, '(a)') name + END IF - WRITE (unit,'(a)') separator + WRITE (unit, '(a)') separator ELSE - WRITE (*,'(a)') separator + WRITE (*, '(a)') separator - IF (PRESENT(text)) THEN - WRITE (*,'(a,a,a)') name, ': ', text - ELSE - WRITE (*,'(a)') name - END IF + IF (PRESENT(text)) THEN + WRITE (*, '(a,a,a)') name, ': ', text + ELSE + WRITE (*, '(a)') name + END IF - WRITE (*,'(a)') separator + WRITE (*, '(a)') separator end if STOP diff --git a/src/lib/mo_julian.f90 b/src/lib/mo_julian.f90 index 3004aa26..c995d896 100644 --- a/src/lib/mo_julian.f90 +++ b/src/lib/mo_julian.f90 @@ -50,7 +50,7 @@ MODULE mo_julian ! Copyright 2011-2014 Matthias Cuntz - USE mo_kind, ONLY: i4, i8, dp + USE mo_kind, ONLY : i4, i8, dp IMPLICIT NONE @@ -64,13 +64,13 @@ MODULE mo_julian PUBLIC :: ndyin ! Day, month and year from IMSL Julian day public :: setCalendar public :: caldatJulian - + integer(i4), save, private :: calendar = 1 interface setCalendar - module procedure setCalendarInteger, setCalendarString + module procedure setCalendarInteger, setCalendarString end interface setCalendar - + CONTAINS @@ -106,19 +106,19 @@ MODULE mo_julian ! HISTORY !> \author Written, David Schaefer !> \date Jan 2015 - subroutine setCalendarString(selector) + subroutine setCalendarString(selector) character(*), intent(in) :: selector - + select case(selector) case("julian") - call setCalendarInteger(1) + call setCalendarInteger(1) case("365day") - call setCalendarInteger(2) + call setCalendarInteger(2) case("360day") - call setCalendarInteger(3) + call setCalendarInteger(3) case default - print*, "Unknown selector! Select on of 'julian', '365day', '360day'." - stop 1 + print*, "Unknown selector! Select on of 'julian', '365day', '360day'." + stop 1 end select end subroutine setCalendarString @@ -154,12 +154,12 @@ end subroutine setCalendarString ! HISTORY !> \author Written, David Schaefer !> \date Jan 2015 - subroutine setCalendarInteger(selector) + subroutine setCalendarInteger(selector) integer(i4), intent(in) :: selector if ((selector .lt. 1) .or. (selector .gt. 3)) then - print*, "Unknown selector! Select on of 1, 2, 3." - stop 1 + print*, "Unknown selector! Select on of 1, 2, 3." + stop 1 end if calendar = selector @@ -203,15 +203,15 @@ end subroutine setCalendarInteger !> \date Jan 2015 pure function selectCalendar(selector) integer(i4), intent(in), optional :: selector - integer(i4) :: selectCalendar + integer(i4) :: selectCalendar selectCalendar = calendar if (present(selector)) then - if ((selector .gt. 0) .and. (selector .lt. 4)) then - selectCalendar = selector - end if + if ((selector .gt. 0) .and. (selector .lt. 4)) then + selectCalendar = selector + end if end if - + end function selectCalendar ! ------------------------------------------------------------------ @@ -263,17 +263,17 @@ elemental subroutine caldat(julian, dd, mm, yy, calendar) implicit none - integer(i4), intent(in) :: julian - integer(i4), intent(out) :: dd, mm, yy + integer(i4), intent(in) :: julian + integer(i4), intent(out) :: dd, mm, yy integer(i4), intent(in), optional :: calendar - + select case(selectCalendar(calendar)) case(1) - call caldatJulian(julian,dd,mm,yy) + call caldatJulian(julian, dd, mm, yy) case(2) - call caldat365(julian,dd,mm,yy) + call caldat365(julian, dd, mm, yy) case(3) - call caldat360(julian,dd,mm,yy) + call caldat360(julian, dd, mm, yy) end select end subroutine caldat @@ -330,19 +330,19 @@ elemental subroutine dec2date(julian, dd, mm, yy, hh, nn, ss, calendar) implicit none - real(dp), intent(in) :: julian + real(dp), intent(in) :: julian integer(i4), intent(out), optional :: dd, mm, yy, hh, nn, ss - integer(i4), intent(in), optional :: calendar - + integer(i4), intent(in), optional :: calendar + select case(selectCalendar(calendar)) case(1) - call dec2dateJulian(julian, dd, mm, yy, hh, nn, ss) + call dec2dateJulian(julian, dd, mm, yy, hh, nn, ss) case(2) - call dec2date365(julian, dd, mm, yy, hh, nn, ss) + call dec2date365(julian, dd, mm, yy, hh, nn, ss) case(3) - call dec2date360(julian, dd, mm, yy, hh, nn, ss) + call dec2date360(julian, dd, mm, yy, hh, nn, ss) end select - + end subroutine dec2date ! ------------------------------------------------------------------ @@ -403,15 +403,15 @@ elemental function date2dec(dd, mm, yy, hh, nn, ss, calendar) integer(i4), intent(in), optional :: dd, mm, yy integer(i4), intent(in), optional :: hh, nn, ss integer(i4), intent(in), optional :: calendar - real(dp) :: date2dec + real(dp) :: date2dec select case(selectCalendar(calendar)) case(1) - date2dec = date2decJulian(dd, mm, yy, hh, nn, ss) + date2dec = date2decJulian(dd, mm, yy, hh, nn, ss) case(2) - date2dec = date2dec365(dd, mm, yy, hh, nn, ss) + date2dec = date2dec365(dd, mm, yy, hh, nn, ss) case(3) - date2dec = date2dec360(dd, mm, yy, hh, nn, ss) + date2dec = date2dec360(dd, mm, yy, hh, nn, ss) end select end function date2dec @@ -467,17 +467,17 @@ elemental function julday(dd, mm, yy, calendar) implicit none - integer(i4), intent(in) :: dd, mm, yy + integer(i4), intent(in) :: dd, mm, yy integer(i4), intent(in), optional :: calendar - integer(i4) :: julday - + integer(i4) :: julday + select case(selectCalendar(calendar)) case(1) - julday = juldayJulian(dd, mm, yy) + julday = juldayJulian(dd, mm, yy) case(2) - julday = julday365(dd, mm, yy) + julday = julday365(dd, mm, yy) case(3) - julday = julday360(dd, mm, yy) + julday = julday360(dd, mm, yy) end select end function julday @@ -552,40 +552,40 @@ end function julday !> Modified Matthias Cuntz, May 2014 - changed to new algorithm with astronomical units !> removed numerical recipes !> David Schaefer, Jan 2016 - renamed procodure - ELEMENTAL SUBROUTINE caldatJulian(julian,dd,mm,yy) + ELEMENTAL SUBROUTINE caldatJulian(julian, dd, mm, yy) IMPLICIT NONE - INTEGER(i4), INTENT(IN) :: julian + INTEGER(i4), INTENT(IN) :: julian INTEGER(i4), INTENT(OUT) :: dd, mm, yy INTEGER(i8) :: A, B, C, D, E, g INTEGER(i4), PARAMETER :: IGREG = 2299161_i4 if (julian < IGREG) then - A = int(julian, i8) ! julian + A = int(julian, i8) ! julian else - g = int((real(julian,dp)-1867216.25_dp)/36524.25_dp, i8) ! gregorian - A = julian + 1_i8 + g - g/4_i8 + g = int((real(julian, dp) - 1867216.25_dp) / 36524.25_dp, i8) ! gregorian + A = julian + 1_i8 + g - g / 4_i8 end if B = A + 1524_i8 - C = int((real(B,dp)-122.1_dp) / 365.25_dp, i8) - D = int(365.25_dp * real(C,dp), i8) - E = int(real(B-D,dp) / 30.6001_dp, i8) + C = int((real(B, dp) - 122.1_dp) / 365.25_dp, i8) + D = int(365.25_dp * real(C, dp), i8) + E = int(real(B - D, dp) / 30.6001_dp, i8) - dd = int(B - D - int(30.6001_dp*real(E,dp), i8), i4) + dd = int(B - D - int(30.6001_dp * real(E, dp), i8), i4) if (E<14_i8) then - mm = int(E-1_i8, i4) + mm = int(E - 1_i8, i4) else - mm = int(E-13_i8, i4) + mm = int(E - 13_i8, i4) end if if (mm > 2) then - yy = int(C - 4716_i8, i4) + yy = int(C - 4716_i8, i4) else - yy = int(C - 4715_i8, i4) + yy = int(C - 4715_i8, i4) end if END SUBROUTINE caldatJulian @@ -670,20 +670,20 @@ END SUBROUTINE caldatJulian !> Modified Matthias Cuntz, May 2014 - changed to new algorithm with astronomical units !> removed numerical recipes !> David Schaefer, Jan 2016 - renamed procodure - ELEMENTAL FUNCTION date2decJulian(dd,mm,yy,hh,nn,ss) + ELEMENTAL FUNCTION date2decJulian(dd, mm, yy, hh, nn, ss) IMPLICIT NONE INTEGER(i4), INTENT(IN), OPTIONAL :: dd, mm, yy INTEGER(i4), INTENT(IN), OPTIONAL :: hh, nn, ss - REAL(dp) :: date2decJulian + REAL(dp) :: date2decJulian - INTEGER(i4), PARAMETER :: IGREG2 = 15 + 31*(10+12*1582) - INTEGER(i4), PARAMETER :: IGREG1 = 4 + 31*(10+12*1582) + INTEGER(i4), PARAMETER :: IGREG2 = 15 + 31 * (10 + 12 * 1582) + INTEGER(i4), PARAMETER :: IGREG1 = 4 + 31 * (10 + 12 * 1582) INTEGER(i4) :: idd, imm, iyy - REAL(dp) :: ihh, inn, iss + REAL(dp) :: ihh, inn, iss INTEGER(i8) :: jm, jy - REAL(dp) :: jd, H, eps + REAL(dp) :: jd, H, eps INTEGER(i8) :: A, B ! Presets @@ -694,35 +694,36 @@ ELEMENTAL FUNCTION date2decJulian(dd,mm,yy,hh,nn,ss) iyy = 1 if (present(yy)) iyy = yy ihh = 0.0_dp - if (present(hh)) ihh = real(hh,dp) + if (present(hh)) ihh = real(hh, dp) inn = 0.0_dp - if (present(nn)) inn = real(nn,dp) + if (present(nn)) inn = real(nn, dp) iss = 0.0_dp - if (present(ss)) iss = real(ss,dp) + if (present(ss)) iss = real(ss, dp) if (imm > 2) then - jm = int(imm, i8) - jy = int(iyy, i8) + jm = int(imm, i8) + jy = int(iyy, i8) else - jm = int(imm+12, i8) - jy = int(iyy-1, i8) + jm = int(imm + 12, i8) + jy = int(iyy - 1, i8) end if jd = real(idd, dp) - - H = ihh/24._dp + inn/1440._dp + iss/86400._dp - - if (dd+31*(mm+12*yy) >= IGREG2) then ! gregorian - A = jy/100_i8 - B = 2_i8 - A + A/4_i8 - else if (dd+31*(mm+12*yy) <= IGREG1) then ! julian - B = 0_i8 - ! else - ! stop 'No Gregorian dates between 04.10.1582 and 15.10.1582' + + H = ihh / 24._dp + inn / 1440._dp + iss / 86400._dp + + if (dd + 31 * (mm + 12 * yy) >= IGREG2) then ! gregorian + A = jy / 100_i8 + B = 2_i8 - A + A / 4_i8 + else if (dd + 31 * (mm + 12 * yy) <= IGREG1) then ! julian + B = 0_i8 + ! else + ! stop 'No Gregorian dates between 04.10.1582 and 15.10.1582' end if - + ! Fractional Julian day starts at noon - date2decJulian = floor(365.25_dp*real(jy+4716_i8,dp)) + floor(30.6001_dp*real(jm+1_i8,dp)) + jd + H + real(B,dp) - 1524.5_dp + date2decJulian = floor(365.25_dp * real(jy + 4716_i8, dp)) + & + floor(30.6001_dp * real(jm + 1_i8, dp)) + jd + H + real(B, dp) - 1524.5_dp ! Add a small offset (proportional to julian date) for correct re-conversion. eps = epsilon(1.0_dp) @@ -808,16 +809,16 @@ END FUNCTION date2decJulian !> Modified Matthias Cuntz, May 2014 - changed to new algorithm with astronomical units !> removed numerical recipes !> David Schaefer, Jan 2016 - renamed procodure - ELEMENTAL SUBROUTINE dec2dateJulian(julian,dd,mm,yy,hh,nn,ss) + ELEMENTAL SUBROUTINE dec2dateJulian(julian, dd, mm, yy, hh, nn, ss) IMPLICIT NONE - REAL(dp), INTENT(IN) :: julian + REAL(dp), INTENT(IN) :: julian INTEGER(i4), INTENT(OUT), OPTIONAL :: dd, mm, yy INTEGER(i4), INTENT(OUT), OPTIONAL :: hh, nn, ss INTEGER(i4) :: day, month, year, hour, minute, second - REAL(dp) :: fraction + REAL(dp) :: fraction ! REAL(dp) :: eps INTEGER(i8) :: A, B, C, D, E, g, Z @@ -826,29 +827,29 @@ ELEMENTAL SUBROUTINE dec2dateJulian(julian,dd,mm,yy,hh,nn,ss) Z = int(julian + 0.5, i8) if (Z < IGREG) then - A = Z ! julian + A = Z ! julian else - g = int((real(Z,dp)-1867216.25_dp)/36524.25_dp, i8) ! gregorian - A = Z + 1_i8 + g - g/4_i8 + g = int((real(Z, dp) - 1867216.25_dp) / 36524.25_dp, i8) ! gregorian + A = Z + 1_i8 + g - g / 4_i8 end if B = A + 1524_i8 - C = int((real(B,dp)-122.1_dp) / 365.25_dp, i8) - D = int(365.25_dp * real(C,dp), i8) - E = int(real(B-D,dp) / 30.6001_dp, i8) + C = int((real(B, dp) - 122.1_dp) / 365.25_dp, i8) + D = int(365.25_dp * real(C, dp), i8) + E = int(real(B - D, dp) / 30.6001_dp, i8) - day = int(B - D - int(30.6001_dp*real(E,dp), i8), i4) + day = int(B - D - int(30.6001_dp * real(E, dp), i8), i4) if (E<14_i8) then - month = int(E-1_i8, i4) + month = int(E - 1_i8, i4) else - month = int(E-13_i8, i4) + month = int(E - 13_i8, i4) end if if (month > 2) then - year = int(C - 4716_i8, i4) + year = int(C - 4716_i8, i4) else - year = int(C - 4715_i8, i4) + year = int(C - 4715_i8, i4) end if ! ! Fractional part @@ -861,24 +862,24 @@ ELEMENTAL SUBROUTINE dec2dateJulian(julian,dd,mm,yy,hh,nn,ss) ! second = max(nint((fraction - real(minute,dp)/1440.0_dp)*86400.0_dp), 0) ! Fractional part - fraction = julian + 0.5_dp - real(Z,dp) - hour = min(max(floor(fraction * 24.0_dp), 0), 23) - fraction = fraction - real(hour,dp)/24.0_dp - minute = min(max(floor(fraction*1440.0_dp), 0), 59) - second = max(nint((fraction - real(minute,dp)/1440.0_dp)*86400.0_dp), 0) + fraction = julian + 0.5_dp - real(Z, dp) + hour = min(max(floor(fraction * 24.0_dp), 0), 23) + fraction = fraction - real(hour, dp) / 24.0_dp + minute = min(max(floor(fraction * 1440.0_dp), 0), 59) + second = max(nint((fraction - real(minute, dp) / 1440.0_dp) * 86400.0_dp), 0) ! If seconds==60 if (second==60) then - second = 0 - minute = minute + 1 - if (minute==60) then - minute = 0 - hour = hour + 1 - if (hour==24) then - hour = 0 - call caldat(julday(day, month, year) + 1, day, month, year) - end if - end if + second = 0 + minute = minute + 1 + if (minute==60) then + minute = 0 + hour = hour + 1 + if (hour==24) then + hour = 0 + call caldat(julday(day, month, year) + 1, day, month, year) + end if + end if end if if (present(dd)) dd = day @@ -963,41 +964,41 @@ END SUBROUTINE dec2dateJulian !> Modified Matthias Cuntz, May 2014 - changed to new algorithm with astronomical units !> removed numerical recipes !> David Schaefer, Jan 2016 - renamed procodure - ELEMENTAL FUNCTION juldayJulian(dd,mm,yy) + ELEMENTAL FUNCTION juldayJulian(dd, mm, yy) IMPLICIT NONE INTEGER(i4), INTENT(IN) :: dd, mm, yy INTEGER(i4) :: juldayJulian - INTEGER(i4), PARAMETER :: IGREG2 = 15 + 31*(10+12*1582) - INTEGER(i4), PARAMETER :: IGREG1 = 4 + 31*(10+12*1582) + INTEGER(i4), PARAMETER :: IGREG2 = 15 + 31 * (10 + 12 * 1582) + INTEGER(i4), PARAMETER :: IGREG1 = 4 + 31 * (10 + 12 * 1582) INTEGER(i8) :: jd, jm, jy INTEGER(i8) :: A, B if (mm > 2) then - jm = int(mm, i8) - jy = int(yy, i8) + jm = int(mm, i8) + jy = int(yy, i8) else - jm = int(mm+12, i8) - jy = int(yy-1, i8) + jm = int(mm + 12, i8) + jy = int(yy - 1, i8) end if jd = int(dd, i8) - if (dd+31*(mm+12*yy) >= IGREG2) then ! gregorian - A = jy/100_i8 - B = 2_i8 - A + A/4_i8 - else if (dd+31*(mm+12*yy) <= IGREG1) then ! julian - B = 0_i8 - ! else - ! stop 'No Gregorian dates between 04.10.1582 and 15.10.1582' + if (dd + 31 * (mm + 12 * yy) >= IGREG2) then ! gregorian + A = jy / 100_i8 + B = 2_i8 - A + A / 4_i8 + else if (dd + 31 * (mm + 12 * yy) <= IGREG1) then ! julian + B = 0_i8 + ! else + ! stop 'No Gregorian dates between 04.10.1582 and 15.10.1582' end if - + ! add 0.5 to Wiki formula because formula was for fractional day ! juldayJulian = int(365.25_dp*real(jy+4716_i8,dp) + real(int(30.6001*real(jm+1_i8,dp),i8),dp) + real(jd+B,dp) - 1524.5_dp, i4) - juldayJulian = int(365.25_dp*real(jy+4716_i8,dp) + real(int(30.6001*real(jm+1_i8,dp),i8),dp) & - + real(jd+B,dp) - 1524.5_dp + 0.5_dp, i4) + juldayJulian = int(365.25_dp * real(jy + 4716_i8, dp) + real(int(30.6001 * real(jm + 1_i8, dp), i8), dp) & + + real(jd + B, dp) - 1524.5_dp + 0.5_dp, i4) END FUNCTION juldayJulian @@ -1055,7 +1056,7 @@ END FUNCTION juldayJulian !> \author Written, Matthias Cuntz !> \date Dec 2011 - ELEMENTAL FUNCTION ndays(dd,mm,yy) + ELEMENTAL FUNCTION ndays(dd, mm, yy) IMPLICIT NONE @@ -1119,16 +1120,16 @@ END FUNCTION ndays !> \author Written, Matthias Cuntz !> \date Dec 2011 - ELEMENTAL SUBROUTINE ndyin(julian,dd,mm,yy) + ELEMENTAL SUBROUTINE ndyin(julian, dd, mm, yy) IMPLICIT NONE - INTEGER(i4), INTENT(IN) :: julian + INTEGER(i4), INTENT(IN) :: julian INTEGER(i4), INTENT(OUT) :: dd, mm, yy INTEGER(i4), PARAMETER :: IMSLday = 2415021_i4 - call caldat(julian+IMSLday, dd, mm, yy) + call caldat(julian + IMSLday, dd, mm, yy) END SUBROUTINE ndyin @@ -1175,18 +1176,18 @@ END SUBROUTINE ndyin ! HISTORY !> \author Written, David Schaefer !> \date Oct 2015 - elemental subroutine caldat360(julian,dd,mm,yy) + elemental subroutine caldat360(julian, dd, mm, yy) implicit none - integer(i4), intent(in) :: julian + integer(i4), intent(in) :: julian integer(i4), intent(out) :: dd, mm, yy - integer(i4), parameter :: year=360, month=30 - integer(i4) :: remainder + integer(i4), parameter :: year = 360, month = 30 + integer(i4) :: remainder - yy = julian/year - remainder = mod(abs(julian),year) - mm = remainder/month + 1 + yy = julian / year + remainder = mod(abs(julian), year) + mm = remainder / month + 1 dd = mod(abs(julian), month) + 1 end subroutine caldat360 @@ -1236,15 +1237,15 @@ end subroutine caldat360 ! HISTORY !> \author Written, David Schaefer !> \date Oct 2015 - elemental function julday360(dd,mm,yy) + elemental function julday360(dd, mm, yy) implicit none integer(i4), intent(in) :: dd, mm, yy - integer(i4) :: julday360 - integer(i4), parameter :: year=360, month=30 + integer(i4) :: julday360 + integer(i4), parameter :: year = 360, month = 30 - julday360 = abs(yy)*year + (mm-1)*month + (dd-1) + julday360 = abs(yy) * year + (mm - 1) * month + (dd - 1) if (yy < 0) julday360 = julday360 * (-1) end function julday360 @@ -1295,40 +1296,40 @@ end function julday360 ! HISTORY !> \author Written, David Schaefer !> \date Oct 2015 - elemental subroutine dec2date360(julian,dd,mm,yy,hh,nn,ss) + elemental subroutine dec2date360(julian, dd, mm, yy, hh, nn, ss) implicit none - real(dp), intent(in) :: julian + real(dp), intent(in) :: julian integer(i4), intent(out), optional :: dd, mm, yy integer(i4), intent(out), optional :: hh, nn, ss - integer(i4) :: day, month, year - real(dp) :: fraction, fJulian - integer(i4) :: hour, minute, second + integer(i4) :: day, month, year + real(dp) :: fraction, fJulian + integer(i4) :: hour, minute, second fJulian = julian + .5_dp - call caldat360(int(floor(fJulian),i4),day,month,year) - - fraction = fJulian - floor(fJulian) - hour = min(max(floor(fraction * 24.0_dp), 0), 23) - fraction = fraction - real(hour,dp)/24.0_dp - minute = min(max(floor(fraction*1440.0_dp), 0), 59) - second = max(nint((fraction - real(minute,dp)/1440.0_dp)*86400.0_dp), 0) + call caldat360(int(floor(fJulian), i4), day, month, year) + + fraction = fJulian - floor(fJulian) + hour = min(max(floor(fraction * 24.0_dp), 0), 23) + fraction = fraction - real(hour, dp) / 24.0_dp + minute = min(max(floor(fraction * 1440.0_dp), 0), 59) + second = max(nint((fraction - real(minute, dp) / 1440.0_dp) * 86400.0_dp), 0) ! If seconds==60 if (second==60) then - second = 0 - minute = minute + 1 - if (minute==60) then - minute = 0 - hour = hour + 1 - if (hour==24) then - hour = 0 - call caldat360(julday360(day, month, year) + 1, day, month, year) - end if - end if + second = 0 + minute = minute + 1 + if (minute==60) then + minute = 0 + hour = hour + 1 + if (hour==24) then + hour = 0 + call caldat360(julday360(day, month, year) + 1, day, month, year) + end if + end if end if - + if (present(dd)) dd = day if (present(mm)) mm = month if (present(yy)) yy = year @@ -1386,16 +1387,16 @@ end subroutine dec2date360 ! HISTORY !> \author Written, David Schaefer !> \date Oct 2015 - elemental function date2dec360(dd,mm,yy,hh,nn,ss) + elemental function date2dec360(dd, mm, yy, hh, nn, ss) implicit none integer(i4), intent(in), optional :: dd, mm, yy integer(i4), intent(in), optional :: hh, nn, ss - real(dp) :: date2dec360, eps - integer(i4) :: idd, imm, iyy - real(dp) :: ihh, inn, iss - real(dp) :: hour + real(dp) :: date2dec360, eps + integer(i4) :: idd, imm, iyy + real(dp) :: ihh, inn, iss + real(dp) :: hour ! Presets idd = 1 @@ -1405,16 +1406,16 @@ elemental function date2dec360(dd,mm,yy,hh,nn,ss) iyy = 1 if (present(yy)) iyy = yy ihh = 0.0_dp - if (present(hh)) ihh = real(hh,dp) + if (present(hh)) ihh = real(hh, dp) inn = 0.0_dp - if (present(nn)) inn = real(nn,dp) + if (present(nn)) inn = real(nn, dp) iss = 0.0_dp - if (present(ss)) iss = real(ss,dp) + if (present(ss)) iss = real(ss, dp) - hour = ihh/24._dp + inn/1440._dp + iss/86400._dp - .5_dp + hour = ihh / 24._dp + inn / 1440._dp + iss / 86400._dp - .5_dp ! Fractional Julian day starts at noon - date2dec360 = real(julday360(idd,imm,iyy),dp) + hour + date2dec360 = real(julday360(idd, imm, iyy), dp) + hour ! Add a small offset (proportional to julian date) for correct re-conversion. eps = epsilon(1.0_dp) @@ -1466,27 +1467,27 @@ end function date2dec360 ! HISTORY !> \author Written, David Schaefer !> \date Dec 2015 - elemental subroutine caldat365(julian,dd,mm,yy) + elemental subroutine caldat365(julian, dd, mm, yy) implicit none - integer(i4), intent(in) :: julian + integer(i4), intent(in) :: julian integer(i4), intent(out) :: dd, mm, yy - integer(i4), parameter :: year=365 - integer(i4), dimension(12), parameter :: months=(/31,28,31,30,31,30,31,31,30,31,30,31/) - integer(i4) :: remainder - - yy = julian/year - remainder = mod(abs(julian),year) + 1 - - do mm = 1,size(months) - if (remainder .le. months(mm)) then - exit - end if - remainder = remainder - months(mm) + integer(i4), parameter :: year = 365 + integer(i4), dimension(12), parameter :: months = (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/) + integer(i4) :: remainder + + yy = julian / year + remainder = mod(abs(julian), year) + 1 + + do mm = 1, size(months) + if (remainder .le. months(mm)) then + exit + end if + remainder = remainder - months(mm) end do - - dd = remainder + + dd = remainder end subroutine caldat365 @@ -1535,17 +1536,17 @@ end subroutine caldat365 ! HISTORY !> \author Written, David Schaefer !> \date Dec 2015 - elemental function julday365(dd,mm,yy) + elemental function julday365(dd, mm, yy) implicit none integer(i4), intent(in) :: dd, mm, yy - integer(i4) :: julday365 - integer(i4), parameter :: year=365 - integer(i4),dimension(12),parameter :: months=(/31,28,31,30,31,30,31,31,30,31,30,31/) + integer(i4) :: julday365 + integer(i4), parameter :: year = 365 + integer(i4), dimension(12), parameter :: months = (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/) + + julday365 = abs(yy) * year + sum(months(1 : mm - 1)) + (dd - 1) - julday365 = abs(yy)*year + sum(months(1:mm-1)) + (dd-1) - if (yy < 0) julday365 = julday365 * (-1) end function julday365 @@ -1596,40 +1597,40 @@ end function julday365 ! HISTORY !> \author Written, David Schaefer !> \date Dec 2015 - elemental subroutine dec2date365(julian,dd,mm,yy,hh,nn,ss) + elemental subroutine dec2date365(julian, dd, mm, yy, hh, nn, ss) implicit none - real(dp), intent(in) :: julian + real(dp), intent(in) :: julian integer(i4), intent(out), optional :: dd, mm, yy integer(i4), intent(out), optional :: hh, nn, ss - integer(i4) :: day, month, year - real(dp) :: fraction, fJulian - integer(i4) :: hour, minute, second + integer(i4) :: day, month, year + real(dp) :: fraction, fJulian + integer(i4) :: hour, minute, second fJulian = julian + .5_dp - call caldat365(int(floor(fJulian),i4),day,month,year) - - fraction = fJulian - floor(fJulian) - hour = min(max(floor(fraction * 24.0_dp), 0), 23) - fraction = fraction - real(hour,dp)/24.0_dp - minute = min(max(floor(fraction*1440.0_dp), 0), 59) - second = max(nint((fraction - real(minute,dp)/1440.0_dp)*86400.0_dp), 0) + call caldat365(int(floor(fJulian), i4), day, month, year) + + fraction = fJulian - floor(fJulian) + hour = min(max(floor(fraction * 24.0_dp), 0), 23) + fraction = fraction - real(hour, dp) / 24.0_dp + minute = min(max(floor(fraction * 1440.0_dp), 0), 59) + second = max(nint((fraction - real(minute, dp) / 1440.0_dp) * 86400.0_dp), 0) ! If seconds==60 if (second==60) then - second = 0 - minute = minute + 1 - if (minute==60) then - minute = 0 - hour = hour + 1 - if (hour==24) then - hour = 0 - call caldat365(julday365(day, month, year) + 1, day, month, year) - end if - end if + second = 0 + minute = minute + 1 + if (minute==60) then + minute = 0 + hour = hour + 1 + if (hour==24) then + hour = 0 + call caldat365(julday365(day, month, year) + 1, day, month, year) + end if + end if end if - + if (present(dd)) dd = day if (present(mm)) mm = month if (present(yy)) yy = year @@ -1687,16 +1688,16 @@ end subroutine dec2date365 ! HISTORY !> \author Written, David Schaefer !> \date Dec 2015 - elemental function date2dec365(dd,mm,yy,hh,nn,ss) + elemental function date2dec365(dd, mm, yy, hh, nn, ss) implicit none integer(i4), intent(in), optional :: dd, mm, yy integer(i4), intent(in), optional :: hh, nn, ss - real(dp) :: date2dec365, eps - integer(i4) :: idd, imm, iyy - real(dp) :: ihh, inn, iss - real(dp) :: hour + real(dp) :: date2dec365, eps + integer(i4) :: idd, imm, iyy + real(dp) :: ihh, inn, iss + real(dp) :: hour ! Presets idd = 1 @@ -1706,16 +1707,16 @@ elemental function date2dec365(dd,mm,yy,hh,nn,ss) iyy = 1 if (present(yy)) iyy = yy ihh = 0.0_dp - if (present(hh)) ihh = real(hh,dp) + if (present(hh)) ihh = real(hh, dp) inn = 0.0_dp - if (present(nn)) inn = real(nn,dp) + if (present(nn)) inn = real(nn, dp) iss = 0.0_dp - if (present(ss)) iss = real(ss,dp) + if (present(ss)) iss = real(ss, dp) - hour = ihh/24._dp + inn/1440._dp + iss/86400._dp - .5_dp + hour = ihh / 24._dp + inn / 1440._dp + iss / 86400._dp - .5_dp ! Fractional Julian day starts at noon - date2dec365 = real(julday365(idd,imm,iyy),dp) + hour + date2dec365 = real(julday365(idd, imm, iyy), dp) + hour ! Add a small offset (proportional to julian date) for correct re-conversion. eps = epsilon(1.0_dp) @@ -1725,6 +1726,6 @@ elemental function date2dec365(dd,mm,yy,hh,nn,ss) end function date2dec365 -! ------------------------------------------------------------------ + ! ------------------------------------------------------------------ END MODULE mo_julian diff --git a/src/lib/mo_kind.f90 b/src/lib/mo_kind.f90 index 98cf1c48..992cd69c 100644 --- a/src/lib/mo_kind.f90 +++ b/src/lib/mo_kind.f90 @@ -48,34 +48,34 @@ MODULE mo_kind ! Does not work with compilers intel v11 and sun v12.2 ! use, intrinsic :: iso_fortran_env, only: & ! int8!, int16, int32, int64, real32, real64 - use, intrinsic :: iso_c_binding, only: & - c_short, c_int, c_long_long, c_float, c_double, c_float_complex, c_double_complex, c_bool + use, intrinsic :: iso_c_binding, only : & + c_short, c_int, c_long_long, c_float, c_double, c_float_complex, c_double_complex, c_bool IMPLICIT NONE !> 1 Byte Integer Kind - INTEGER, PARAMETER :: i1 = SELECTED_INT_KIND(2) + INTEGER, PARAMETER :: i1 = SELECTED_INT_KIND(2) ! INTEGER, PARAMETER :: i1 = int8 ! c_word does not exist; should be c_bool, probably; but see above !> 2 Byte Integer Kind ! INTEGER, PARAMETER :: i2 = SELECTED_INT_KIND(4) ! INTEGER, PARAMETER :: i2 = int16 - INTEGER, PARAMETER :: i2 = c_short + INTEGER, PARAMETER :: i2 = c_short !> 4 Byte Integer Kind ! INTEGER, PARAMETER :: i4 = SELECTED_INT_KIND(9) ! INTEGER, PARAMETER :: i4 = int32 - INTEGER, PARAMETER :: i4 = c_int + INTEGER, PARAMETER :: i4 = c_int !> 8 Byte Integer Kind ! INTEGER, PARAMETER :: i8 = SELECTED_INT_KIND(18) ! INTEGER, PARAMETER :: i8 = int64 - INTEGER, PARAMETER :: i8 = c_long_long + INTEGER, PARAMETER :: i8 = c_long_long !> Single Precision Real Kind ! INTEGER, PARAMETER :: sp = SELECTED_REAL_KIND(6,37) ! INTEGER, PARAMETER :: sp = real32 - INTEGER, PARAMETER :: sp = c_float + INTEGER, PARAMETER :: sp = c_float !> Double Precision Real Kind ! INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15,307) ! INTEGER, PARAMETER :: dp = real64 - INTEGER, PARAMETER :: dp = c_double + INTEGER, PARAMETER :: dp = c_double !> Single Precision Complex Kind ! INTEGER, PARAMETER :: spc = KIND((1.0_sp,1.0_sp)) ! INTEGER, PARAMETER :: spc = sp @@ -91,17 +91,17 @@ MODULE mo_kind !> Single Precision Numerical Recipes types for sparse arrays TYPE sprs2_sp - INTEGER(I4) :: n, len - REAL(SP), DIMENSION(:), POINTER :: val - INTEGER(I4), DIMENSION(:), POINTER :: irow - INTEGER(I4), DIMENSION(:), POINTER :: jcol + INTEGER(I4) :: n, len + REAL(SP), DIMENSION(:), POINTER :: val + INTEGER(I4), DIMENSION(:), POINTER :: irow + INTEGER(I4), DIMENSION(:), POINTER :: jcol END TYPE sprs2_sp !> Double Precision Numerical Recipes types for sparse arrays TYPE sprs2_dp - INTEGER(I4) :: n, len - REAL(DP), DIMENSION(:), POINTER :: val - INTEGER(I4), DIMENSION(:), POINTER :: irow - INTEGER(I4), DIMENSION(:), POINTER :: jcol + INTEGER(I4) :: n, len + REAL(DP), DIMENSION(:), POINTER :: val + INTEGER(I4), DIMENSION(:), POINTER :: irow + INTEGER(I4), DIMENSION(:), POINTER :: jcol END TYPE sprs2_dp END MODULE mo_kind diff --git a/src/lib/mo_linfit.f90 b/src/lib/mo_linfit.f90 index ad1e84e1..20715de5 100644 --- a/src/lib/mo_linfit.f90 +++ b/src/lib/mo_linfit.f90 @@ -32,7 +32,7 @@ MODULE mo_linfit ! Copyright 2011 Matthias Cuntz - USE mo_kind, ONLY: sp, dp + USE mo_kind, ONLY : sp, dp Implicit NONE @@ -104,7 +104,7 @@ MODULE mo_linfit ! Modified Matthias Cuntz, Nov 2011 - sp, dp ! - documentation INTERFACE linfit - MODULE PROCEDURE linfit_sp, linfit_dp + MODULE PROCEDURE linfit_sp, linfit_dp END INTERFACE linfit ! ------------------------------------------------------------------ @@ -121,9 +121,9 @@ FUNCTION linfit_dp(x, y, a, b, siga, sigb, chi2, model2) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x, y - REAL(dp), OPTIONAL, INTENT(OUT) :: a, b, siga, sigb, chi2 - LOGICAL , OPTIONAL, INTENT(IN) :: model2 + REAL(dp), DIMENSION(:), INTENT(IN) :: x, y + REAL(dp), OPTIONAL, INTENT(OUT) :: a, b, siga, sigb, chi2 + LOGICAL, OPTIONAL, INTENT(IN) :: model2 REAL(dp), DIMENSION(:), allocatable :: linfit_dp REAL(dp) :: sigdat, nx, sx, sxoss, sy, st2 @@ -136,73 +136,73 @@ FUNCTION linfit_dp(x, y, a, b, siga, sigb, chi2, model2) if (size(x) /= size(y)) stop 'linfit_dp: size(x) /= size(y)' if (.not. allocated(linfit_dp)) allocate(linfit_dp(size(x))) if (present(model2)) then - mod2 = model2 + mod2 = model2 else - mod2 = .false. + mod2 = .false. end if if (mod2) then - nx = real(size(x),dp) - mx = sum(x)/nx - my = sum(y)/nx - sx2 = sum((x-mx)*(x-mx)) - sy2 = sum((y-my)*(y-my)) - sxy = sum((x-mx)*(y-my)) - !r = sxy / sqrt(sx2) / sqrt(sy2) - bb = sign(sqrt(sy2/sx2),sxy) - aa = my - bb*mx - linfit_dp(:) = aa + bb*x(:) - if (present(a)) a = aa - if (present(b)) b = bb - if (present(chi2)) then - t(:) = y(:)-linfit_dp(:) - chi2 = dot_product(t,t) - end if - if (present(siga) .or. present(sigb)) then - syx2 = (sy2 - sxy*sxy/sx2) / (nx-2.0_dp) - sxy2 = (sx2 - sxy*sxy/sy2) / (nx-2.0_dp) - ! syx2 should be >0 - ! ssigb = sqrt(syx2/sx2) - ssigb = sqrt(abs(syx2)/sx2) - if (present(sigb)) sigb = ssigb + nx = real(size(x), dp) + mx = sum(x) / nx + my = sum(y) / nx + sx2 = sum((x - mx) * (x - mx)) + sy2 = sum((y - my) * (y - my)) + sxy = sum((x - mx) * (y - my)) + !r = sxy / sqrt(sx2) / sqrt(sy2) + bb = sign(sqrt(sy2 / sx2), sxy) + aa = my - bb * mx + linfit_dp(:) = aa + bb * x(:) + if (present(a)) a = aa + if (present(b)) b = bb + if (present(chi2)) then + t(:) = y(:) - linfit_dp(:) + chi2 = dot_product(t, t) + end if + if (present(siga) .or. present(sigb)) then + syx2 = (sy2 - sxy * sxy / sx2) / (nx - 2.0_dp) + sxy2 = (sx2 - sxy * sxy / sy2) / (nx - 2.0_dp) + ! syx2 should be >0 + ! ssigb = sqrt(syx2/sx2) + ssigb = sqrt(abs(syx2) / sx2) + if (present(sigb)) sigb = ssigb + if (present(siga)) then + ! siga = sqrt(syx2*(1.0_dp/nX+mx*mx/sx2)) + siga = sqrt(abs(syx2) * (1.0_dp / nX + mx * mx / sx2)) + ! Add Extra Term for Error in xmean which is not in Sokal & Rohlf. + ! They take the error estimate of the chi-squared error for a. + ! siga = sqrt(siga*siga + bb*bb*sxy2/nx) + siga = sqrt(siga * siga + bb * bb * abs(sxy2) / nx) + end if + end if + else + nx = real(size(x), dp) + sx = sum(x) + sy = sum(y) + sxoss = sx / nx + t(:) = x(:) - sxoss + bb = dot_product(t, y) + st2 = dot_product(t, t) + bb = bb / st2 + aa = (sy - sx * bb) / nx + linfit_dp(:) = aa + bb * x(:) + if (present(a)) a = aa + if (present(b)) b = bb + if (present(chi2) .or. present(siga) .or. present(sigb)) then + t(:) = y(:) - linfit_dp(:) + cchi2 = dot_product(t, t) + if (present(chi2)) chi2 = cchi2 + if (present(siga) .or. present(sigb)) then + sigdat = sqrt(cchi2 / (size(x) - 2)) if (present(siga)) then - ! siga = sqrt(syx2*(1.0_dp/nX+mx*mx/sx2)) - siga = sqrt(abs(syx2)*(1.0_dp/nX+mx*mx/sx2)) - ! Add Extra Term for Error in xmean which is not in Sokal & Rohlf. - ! They take the error estimate of the chi-squared error for a. - ! siga = sqrt(siga*siga + bb*bb*sxy2/nx) - siga = sqrt(siga*siga + bb*bb*abs(sxy2)/nx) + siga = sqrt((1.0_dp + sx * sx / (nx * st2)) / nx) + siga = siga * sigdat end if - end if - else - nx = real(size(x),dp) - sx = sum(x) - sy = sum(y) - sxoss = sx/nx - t(:) = x(:)-sxoss - bb = dot_product(t,y) - st2 = dot_product(t,t) - bb = bb/st2 - aa = (sy-sx*bb)/nx - linfit_dp(:) = aa + bb*x(:) - if (present(a)) a = aa - if (present(b)) b = bb - if (present(chi2) .or. present(siga) .or. present(sigb)) then - t(:) = y(:)-linfit_dp(:) - cchi2 = dot_product(t,t) - if (present(chi2)) chi2 = cchi2 - if (present(siga) .or. present(sigb)) then - sigdat = sqrt(cchi2/(size(x)-2)) - if (present(siga)) then - siga = sqrt((1.0_dp+sx*sx/(nx*st2))/nx) - siga = siga*sigdat - end if - if (present(sigb)) then - sigb = sqrt(1.0_dp/st2) - sigb = sigb*sigdat - end if + if (present(sigb)) then + sigb = sqrt(1.0_dp / st2) + sigb = sigb * sigdat end if - end if + end if + end if end if END FUNCTION linfit_dp @@ -212,9 +212,9 @@ FUNCTION linfit_sp(x, y, a, b, siga, sigb, chi2, model2) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x, y - REAL(sp), OPTIONAL, INTENT(OUT) :: a, b, siga, sigb, chi2 - LOGICAL , OPTIONAL, INTENT(IN) :: model2 + REAL(sp), DIMENSION(:), INTENT(IN) :: x, y + REAL(sp), OPTIONAL, INTENT(OUT) :: a, b, siga, sigb, chi2 + LOGICAL, OPTIONAL, INTENT(IN) :: model2 REAL(sp), DIMENSION(:), allocatable :: linfit_sp REAL(sp) :: sigdat, nx, sx, sxoss, sy, st2 @@ -227,73 +227,73 @@ FUNCTION linfit_sp(x, y, a, b, siga, sigb, chi2, model2) if (size(x) /= size(y)) stop 'linfit_sp: size(x) /= size(y)' if (.not. allocated(linfit_sp)) allocate(linfit_sp(size(x))) if (present(model2)) then - mod2 = model2 + mod2 = model2 else - mod2 = .false. + mod2 = .false. end if if (mod2) then - nx = real(size(x),sp) - mx = sum(x)/nx - my = sum(y)/nx - sx2 = sum((x-mx)*(x-mx)) - sy2 = sum((y-my)*(y-my)) - sxy = sum((x-mx)*(y-my)) - !r = sxy / sqrt(sx2) / sqrt(sy2) - bb = sign(sqrt(sy2/sx2),sxy) - aa = my - bb*mx - linfit_sp(:) = aa + bb*x(:) - if (present(a)) a = aa - if (present(b)) b = bb - if (present(chi2)) then - t(:) = y(:)-linfit_sp(:) - chi2 = dot_product(t,t) - end if - if (present(siga) .or. present(sigb)) then - syx2 = (sy2 - sxy*sxy/sx2) / (nx-2.0_sp) - sxy2 = (sx2 - sxy*sxy/sy2) / (nx-2.0_sp) - ! syx2 should be >0 - ! ssigb = sqrt(syx2/sx2) - ssigb = sqrt(abs(syx2)/sx2) - if (present(sigb)) sigb = ssigb + nx = real(size(x), sp) + mx = sum(x) / nx + my = sum(y) / nx + sx2 = sum((x - mx) * (x - mx)) + sy2 = sum((y - my) * (y - my)) + sxy = sum((x - mx) * (y - my)) + !r = sxy / sqrt(sx2) / sqrt(sy2) + bb = sign(sqrt(sy2 / sx2), sxy) + aa = my - bb * mx + linfit_sp(:) = aa + bb * x(:) + if (present(a)) a = aa + if (present(b)) b = bb + if (present(chi2)) then + t(:) = y(:) - linfit_sp(:) + chi2 = dot_product(t, t) + end if + if (present(siga) .or. present(sigb)) then + syx2 = (sy2 - sxy * sxy / sx2) / (nx - 2.0_sp) + sxy2 = (sx2 - sxy * sxy / sy2) / (nx - 2.0_sp) + ! syx2 should be >0 + ! ssigb = sqrt(syx2/sx2) + ssigb = sqrt(abs(syx2) / sx2) + if (present(sigb)) sigb = ssigb + if (present(siga)) then + ! siga = sqrt(syx2*(1.0_sp/nX+mx*mx/sx2)) + siga = sqrt(abs(syx2) * (1.0_sp / nX + mx * mx / sx2)) + ! Add Extra Term for Error in xmean which is not in Sokal & Rohlf. + ! They take the error estimate of the chi-squared error for a. + ! siga = sqrt(siga*siga + bb*bb*sxy2/nx) + siga = sqrt(siga * siga + bb * bb * abs(sxy2) / nx) + end if + end if + else + nx = real(size(x), sp) + sx = sum(x) + sy = sum(y) + sxoss = sx / nx + t(:) = x(:) - sxoss + bb = dot_product(t, y) + st2 = dot_product(t, t) + bb = bb / st2 + aa = (sy - sx * bb) / nx + linfit_sp(:) = aa + bb * x(:) + if (present(a)) a = aa + if (present(b)) b = bb + if (present(chi2) .or. present(siga) .or. present(sigb)) then + t(:) = y(:) - linfit_sp(:) + cchi2 = dot_product(t, t) + if (present(chi2)) chi2 = cchi2 + if (present(siga) .or. present(sigb)) then + sigdat = sqrt(cchi2 / (size(x) - 2)) if (present(siga)) then - ! siga = sqrt(syx2*(1.0_sp/nX+mx*mx/sx2)) - siga = sqrt(abs(syx2)*(1.0_sp/nX+mx*mx/sx2)) - ! Add Extra Term for Error in xmean which is not in Sokal & Rohlf. - ! They take the error estimate of the chi-squared error for a. - ! siga = sqrt(siga*siga + bb*bb*sxy2/nx) - siga = sqrt(siga*siga + bb*bb*abs(sxy2)/nx) + siga = sqrt((1.0_sp + sx * sx / (nx * st2)) / nx) + siga = siga * sigdat end if - end if - else - nx = real(size(x),sp) - sx = sum(x) - sy = sum(y) - sxoss = sx/nx - t(:) = x(:)-sxoss - bb = dot_product(t,y) - st2 = dot_product(t,t) - bb = bb/st2 - aa = (sy-sx*bb)/nx - linfit_sp(:) = aa + bb*x(:) - if (present(a)) a = aa - if (present(b)) b = bb - if (present(chi2) .or. present(siga) .or. present(sigb)) then - t(:) = y(:)-linfit_sp(:) - cchi2 = dot_product(t,t) - if (present(chi2)) chi2 = cchi2 - if (present(siga) .or. present(sigb)) then - sigdat = sqrt(cchi2/(size(x)-2)) - if (present(siga)) then - siga = sqrt((1.0_sp+sx*sx/(nx*st2))/nx) - siga = siga*sigdat - end if - if (present(sigb)) then - sigb = sqrt(1.0_sp/st2) - sigb = sigb*sigdat - end if + if (present(sigb)) then + sigb = sqrt(1.0_sp / st2) + sigb = sigb * sigdat end if - end if + end if + end if end if END FUNCTION linfit_sp diff --git a/src/lib/mo_mcmc.f90 b/src/lib/mo_mcmc.f90 index f9cb5b0d..05a099c8 100644 --- a/src/lib/mo_mcmc.f90 +++ b/src/lib/mo_mcmc.f90 @@ -19,12 +19,13 @@ MODULE mo_mcmc ! Copyright 2012-14 Juliane Mai, Maren Goehler - USE mo_kind, only: i4, i8, dp - USE mo_xor4096, only: xor4096, xor4096g, get_timeseed, n_save_state - USE mo_append, only: append - USE mo_moment, only: stddev + USE mo_kind, only : i4, i8, dp + USE mo_xor4096, only : xor4096, xor4096g, get_timeseed, n_save_state + USE mo_append, only : append + USE mo_moment, only : stddev !$ USE omp_lib, only: OMP_GET_NUM_THREADS - use mo_ncwrite, only: dump_netcdf + use mo_ncwrite, only : dump_netcdf + use mo_optimization_utils, only : eval_interface, objective_interface IMPLICIT NONE @@ -234,7 +235,7 @@ MODULE mo_mcmc ! mcmc, i.e. mcmc with "real" likelihood (sigma is given by e.g. error model) ! INTERFACE mcmc - MODULE PROCEDURE mcmc_dp + MODULE PROCEDURE mcmc_dp END INTERFACE mcmc !----------------------------------------------------------------------------------------------- @@ -456,7 +457,7 @@ MODULE mo_mcmc ! Mai, Apr. 2015 : handling of array-like variables in restart-namelists ! INTERFACE mcmc_stddev - MODULE PROCEDURE mcmc_stddev_dp + MODULE PROCEDURE mcmc_stddev_dp END INTERFACE mcmc_stddev !----------------------------------------------------------------------------------------------- @@ -469,574 +470,568 @@ MODULE mo_mcmc !----------------------------------------------------------------------------------------------- - SUBROUTINE mcmc_dp(likelihood, para, rangePar, & ! obligatory IN - mcmc_paras, burnin_paras, & ! obligatory OUT - seed_in, printflag_in, maskpara_in, & ! optional IN - restart, restart_file, & ! optional IN: if mcmc is restarted and file which contains restart variables - tmp_file, & ! optional IN: filename for temporal output of - ! ! MCMC parasets - loglike_in, & ! optional IN: true if loglikelihood is given - ParaSelectMode_in, & ! optional IN: (=1) half, (=2) one, (=3) all - iter_burnin_in, & ! optional IN: markov length of (1) burn-in - iter_mcmc_in, & ! optional IN: markov length of (2) mcmc - chains_in, & ! optional IN: number of parallel chains of MCMC - stepsize_in) ! optional IN: stepsize for each param. (no burn-in) + SUBROUTINE mcmc_dp(eval, likelihood, para, rangePar, & ! obligatory IN + mcmc_paras, burnin_paras, & ! obligatory OUT + seed_in, printflag_in, maskpara_in, & ! optional IN + restart, restart_file, & ! optional IN: if mcmc is restarted and file which contains restart variables + tmp_file, & ! optional IN: filename for temporal output of + ! ! MCMC parasets + loglike_in, & ! optional IN: true if loglikelihood is given + ParaSelectMode_in, & ! optional IN: (=1) half, (=2) one, (=3) all + iter_burnin_in, & ! optional IN: markov length of (1) burn-in + iter_mcmc_in, & ! optional IN: markov length of (2) mcmc + chains_in, & ! optional IN: number of parallel chains of MCMC + stepsize_in) ! optional IN: stepsize for each param. (no burn-in) IMPLICIT NONE - INTERFACE - FUNCTION likelihood(paraset) - ! calculates the likelihood function at a certain parameter set paraset - use mo_kind - REAL(DP), DIMENSION(:), INTENT(IN) :: paraset - REAL(DP) :: likelihood - END FUNCTION likelihood - END INTERFACE - - REAL(DP), DIMENSION(:,:), INTENT(IN) :: rangePar ! range for each parameter - REAL(DP), DIMENSION(:), INTENT(IN) :: para ! initial parameter i - INTEGER(I8), OPTIONAL, INTENT(IN) :: seed_in ! Seeds of random numbers: dim1=chains, dim2=3 + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: likelihood + + REAL(DP), DIMENSION(:, :), INTENT(IN) :: rangePar ! range for each parameter + REAL(DP), DIMENSION(:), INTENT(IN) :: para ! initial parameter i + INTEGER(I8), OPTIONAL, INTENT(IN) :: seed_in ! Seeds of random numbers: dim1=chains, dim2=3 ! ! (DEFAULT: Get_timeseed) - LOGICAL, OPTIONAL, INTENT(IN) :: printflag_in ! If command line output is written (.true.) + LOGICAL, OPTIONAL, INTENT(IN) :: printflag_in ! If command line output is written (.true.) ! ! (DEFAULT: .false.) - LOGICAL, OPTIONAL, DIMENSION(size(para,1)), & - INTENT(IN) :: maskpara_in ! true if parameter will be optimized + LOGICAL, OPTIONAL, DIMENSION(size(para, 1)), & + INTENT(IN) :: maskpara_in ! true if parameter will be optimized ! ! false if parameter is discarded in optimization ! ! (DEFAULT = .true.) - logical, OPTIONAL, INTENT(in) :: restart ! if .true., start from restart file + logical, OPTIONAL, INTENT(in) :: restart ! if .true., start from restart file ! ! (DEFAULT: .false.) - character(len=*), OPTIONAL, INTENT(in) :: restart_file ! restart file name + character(len = *), OPTIONAL, INTENT(in) :: restart_file ! restart file name ! ! (DEFAULT: mo_mcmc.restart) - LOGICAL, OPTIONAL, INTENT(IN) :: loglike_in ! true if loglikelihood is given instead of likelihood + LOGICAL, OPTIONAL, INTENT(IN) :: loglike_in ! true if loglikelihood is given instead of likelihood ! ! (DEFAULT: .false.) - INTEGER(I4), OPTIONAL, INTENT(IN) :: ParaSelectMode_in ! how many parameters changed per iteration: + INTEGER(I4), OPTIONAL, INTENT(IN) :: ParaSelectMode_in ! how many parameters changed per iteration: ! ! 1: half of the parameters ! ! 2: only one (DEFAULT) ! ! 3: all - INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_burnin_in ! # iterations before checking ac_ratio + INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_burnin_in ! # iterations before checking ac_ratio ! ! DEFAULT= MIN(250, 20_i4*n) - INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_mcmc_in ! # iterations per chain for posterior sampling + INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_mcmc_in ! # iterations per chain for posterior sampling ! ! DEFAULT= 1000_i4*n - INTEGER(I4), OPTIONAL, INTENT(IN) :: chains_in ! number of parallel mcmc chains + INTEGER(I4), OPTIONAL, INTENT(IN) :: chains_in ! number of parallel mcmc chains ! ! DEFAULT= 5_i4 - REAL(DP), OPTIONAL, DIMENSION(size(para,1)), & - INTENT(IN) :: stepsize_in ! stepsize for each parameter + REAL(DP), OPTIONAL, DIMENSION(size(para, 1)), & + INTENT(IN) :: stepsize_in ! stepsize for each parameter ! ! if given burn-in is discarded - CHARACTER(len=*), OPTIONAL, INTENT(IN) :: tmp_file ! filename for temporal data saving: every iter_mcmc_in + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: tmp_file ! filename for temporal data saving: every iter_mcmc_in ! ! iterations parameter sets are appended to this file ! ! the number of the chain will be prepended to filename ! ! DEFAULT= no file writing - REAL(DP), DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: mcmc_paras + REAL(DP), DIMENSION(:, :), ALLOCATABLE, INTENT(OUT) :: mcmc_paras ! ! array to save para values of MCMC runs, ! ! dim1=sets of all chains, dim2=paras - REAL(DP), DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: burnin_paras + REAL(DP), DIMENSION(:, :), ALLOCATABLE, INTENT(OUT) :: burnin_paras ! ! array to save para values of Burn in run ! local variables - INTEGER(I4) :: n ! Number of parameters - LOGICAL :: printflag ! If command line output is written - LOGICAL, DIMENSION(size(para,1)) :: maskpara ! true if parameter will be optimized - LOGICAL, DIMENSION(1000) :: dummy_maskpara ! dummy mask_para (only for namelist) - INTEGER(I4), DIMENSION(:), ALLOCATABLE :: truepara ! indexes of parameters to be optimized - LOGICAL :: loglike ! if loglikelihood is given - LOGICAL :: skip_burnin ! if stepsize is given --> burnin is skipped - logical :: itmp_file ! if temporal results wanted + INTEGER(I4) :: n ! Number of parameters + LOGICAL :: printflag ! If command line output is written + LOGICAL, DIMENSION(size(para, 1)) :: maskpara ! true if parameter will be optimized + LOGICAL, DIMENSION(1000) :: dummy_maskpara ! dummy mask_para (only for namelist) + INTEGER(I4), DIMENSION(:), ALLOCATABLE :: truepara ! indexes of parameters to be optimized + LOGICAL :: loglike ! if loglikelihood is given + LOGICAL :: skip_burnin ! if stepsize is given --> burnin is skipped + logical :: itmp_file ! if temporal results wanted #ifdef pgiFortran - character(len=299) :: istmp_file ! local copy of file for temporal results output + character(len = 299) :: istmp_file ! local copy of file for temporal results output #else - character(len=1024) :: istmp_file ! local copy of file for temporal results output + character(len = 1024) :: istmp_file ! local copy of file for temporal results output #endif - logical :: irestart ! if restart wanted - character(len=1024) :: isrestart_file ! local copy of restart file name + logical :: irestart ! if restart wanted + character(len = 1024) :: isrestart_file ! local copy of restart file name ! for random numbers - INTEGER(I8), dimension(:,:), allocatable :: seeds ! Seeds of random numbers: dim1=chains, dim2=3 - REAL(DP) :: RN1, RN2, RN3 ! Random numbers - integer(I8), dimension(:,:), allocatable :: save_state_1 ! optional argument for restarting RN stream 1: - integer(I8), dimension(:,:), allocatable :: save_state_2 ! optional argument for restarting RN stream 2: - integer(I8), dimension(:,:), allocatable :: save_state_3 ! optional argument for restarting RN stream 3: + INTEGER(I8), dimension(:, :), allocatable :: seeds ! Seeds of random numbers: dim1=chains, dim2=3 + REAL(DP) :: RN1, RN2, RN3 ! Random numbers + integer(I8), dimension(:, :), allocatable :: save_state_1 ! optional argument for restarting RN stream 1: + integer(I8), dimension(:, :), allocatable :: save_state_2 ! optional argument for restarting RN stream 2: + integer(I8), dimension(:, :), allocatable :: save_state_3 ! optional argument for restarting RN stream 3: ! ! dim1=chains, dim2=n_save_state ! Dummies - REAL(DP), DIMENSION(:,:,:), ALLOCATABLE :: tmp - integer(I4) :: idummy - logical :: oddsSwitch1, oddsSwitch2 - character(100) :: str - character(200) :: outputfile - integer(i4) :: slash_pos - integer(i4) :: len_filename - character(200) :: filename - character(200) :: path + REAL(DP), DIMENSION(:, :, :), ALLOCATABLE :: tmp + integer(I4) :: idummy + logical :: oddsSwitch1, oddsSwitch2 + character(100) :: str + character(200) :: outputfile + integer(i4) :: slash_pos + integer(i4) :: len_filename + character(200) :: filename + character(200) :: path ! FOR BURN-IN AND MCMC - REAL(DP), DIMENSION(:,:,:), ALLOCATABLE :: mcmc_paras_3d ! array to save para values of MCMC runs, + REAL(DP), DIMENSION(:, :, :), ALLOCATABLE :: mcmc_paras_3d ! array to save para values of MCMC runs, ! ! dim1=sets, dim2=paras, dim3=chain - integer(I4) :: i - integer(I4), dimension(:), allocatable :: Ipos, Ineg - logical :: iStop - INTEGER(I4) :: ParaSelectMode ! how many parameters are changed per jump - INTEGER(I4) :: iter_burnin ! number fo iterations before checking ac_ratio - INTEGER(I4) :: iter_mcmc ! number fo iterations for posterior sampling - INTEGER(I4) :: chains ! number of parallel mcmc chains - INTEGER(I4) :: chain ! counter for chains, 1...chains - REAL(DP) :: accMult ! acceptance multiplier for stepsize - REAL(DP) :: rejMult ! rejection multiplier for stepsize - LOGICAL,DIMENSION(size(para,1)) :: ChangePara ! logical array to switch if parameter is changed - INTEGER(I4) :: trial ! number of trials for burn-in - REAL(DP),DIMENSION(size(para,1)) :: stepsize ! stepsize adjusted by burn-in and used by mcmc - REAL(DP),DIMENSION(1000) :: dummy_stepsize ! dummy stepsize (only for namelist) - REAL(DP),DIMENSION(size(para,1)) :: paraold ! old parameter set - REAL(DP),DIMENSION(size(para,1)) :: paranew ! new parameter set - REAL(DP),DIMENSION(size(para,1)) :: parabest ! best parameter set overall - REAL(DP),DIMENSION(1000) :: dummy_parabest ! dummy parabest (only for namelist) - REAL(DP),DIMENSION(size(para,1)) :: initial_paraset_mcmc ! best parameterset found in burn-in - REAL(DP),DIMENSION(1000) :: dummy_initial_paraset_mcmc ! dummy initial_paraset_mcmc (only for namelist) - REAL(DP) :: likeliold ! likelihood of old parameter set - REAL(DP) :: likelinew ! likelihood of new parameter set - REAL(DP) :: likelibest ! likelihood of best parameter set overall - INTEGER(I4) :: markov ! counter for markov chain - REAL(DP), DIMENSION(:,:), ALLOCATABLE :: burnin_paras_part ! accepted parameter sets of one MC in burn-in - REAL(DP) :: oddsRatio ! ratio of likelihoods = likelinew/likeliold - REAL(DP), dimension(:), allocatable :: accRatio ! acceptance ratio = (pos/neg) accepted/iter_burnin - REAL(DP) :: accratio_stddev ! stddev of accRatios in history - REAL(DP), DIMENSION(:), ALLOCATABLE :: history_accratio ! history of 'good' acceptance ratios - INTEGER(I4) :: accratio_n ! number of 'good' acceptance ratios + integer(I4) :: i + integer(I4), dimension(:), allocatable :: Ipos, Ineg + logical :: iStop + INTEGER(I4) :: ParaSelectMode ! how many parameters are changed per jump + INTEGER(I4) :: iter_burnin ! number fo iterations before checking ac_ratio + INTEGER(I4) :: iter_mcmc ! number fo iterations for posterior sampling + INTEGER(I4) :: chains ! number of parallel mcmc chains + INTEGER(I4) :: chain ! counter for chains, 1...chains + REAL(DP) :: accMult ! acceptance multiplier for stepsize + REAL(DP) :: rejMult ! rejection multiplier for stepsize + LOGICAL, DIMENSION(size(para, 1)) :: ChangePara ! logical array to switch if parameter is changed + INTEGER(I4) :: trial ! number of trials for burn-in + REAL(DP), DIMENSION(size(para, 1)) :: stepsize ! stepsize adjusted by burn-in and used by mcmc + REAL(DP), DIMENSION(1000) :: dummy_stepsize ! dummy stepsize (only for namelist) + REAL(DP), DIMENSION(size(para, 1)) :: paraold ! old parameter set + REAL(DP), DIMENSION(size(para, 1)) :: paranew ! new parameter set + REAL(DP), DIMENSION(size(para, 1)) :: parabest ! best parameter set overall + REAL(DP), DIMENSION(1000) :: dummy_parabest ! dummy parabest (only for namelist) + REAL(DP), DIMENSION(size(para, 1)) :: initial_paraset_mcmc ! best parameterset found in burn-in + REAL(DP), DIMENSION(1000) :: dummy_initial_paraset_mcmc ! dummy initial_paraset_mcmc (only for namelist) + REAL(DP) :: likeliold ! likelihood of old parameter set + REAL(DP) :: likelinew ! likelihood of new parameter set + REAL(DP) :: likelibest ! likelihood of best parameter set overall + INTEGER(I4) :: markov ! counter for markov chain + REAL(DP), DIMENSION(:, :), ALLOCATABLE :: burnin_paras_part ! accepted parameter sets of one MC in burn-in + REAL(DP) :: oddsRatio ! ratio of likelihoods = likelinew/likeliold + REAL(DP), dimension(:), allocatable :: accRatio ! acceptance ratio = (pos/neg) accepted/iter_burnin + REAL(DP) :: accratio_stddev ! stddev of accRatios in history + REAL(DP), DIMENSION(:), ALLOCATABLE :: history_accratio ! history of 'good' acceptance ratios + INTEGER(I4) :: accratio_n ! number of 'good' acceptance ratios ! for checking convergence of MCMC - real(dp), allocatable, dimension(:) :: sqrtR - real(dp), allocatable, dimension(:) :: vDotJ - real(dp), allocatable, dimension(:) :: s2 - real(dp) :: vDotDot - real(dp) :: B - real(dp) :: W - integer(i4) :: n_start, n_end, iPar - LOGICAL :: converged ! if MCMC already converged + real(dp), allocatable, dimension(:) :: sqrtR + real(dp), allocatable, dimension(:) :: vDotJ + real(dp), allocatable, dimension(:) :: s2 + real(dp) :: vDotDot + real(dp) :: B + real(dp) :: W + integer(i4) :: n_start, n_end, iPar + LOGICAL :: converged ! if MCMC already converged ! for OMP - integer(i4) :: n_threads + integer(i4) :: n_threads namelist /restartnml1/ & - n, printflag, dummy_maskpara, loglike, skip_burnin, & - iStop, ParaSelectMode, iter_burnin, & - iter_mcmc, chains, accMult, rejMult, trial, dummy_stepsize, & - dummy_parabest, likelibest, dummy_initial_paraset_mcmc, & - accratio_stddev, & - accratio_n, vDotDot, B, W, converged, & - n_threads, & - itmp_file, istmp_file - - namelist /restartnml2/ & - truepara, seeds, save_state_1, save_state_2, save_state_3, & - iPos, iNeg, mcmc_paras_3d, & - accRatio, & - sqrtR, vDotJ, s2 + n, printflag, dummy_maskpara, loglike, skip_burnin, & + iStop, ParaSelectMode, iter_burnin, & + iter_mcmc, chains, accMult, rejMult, trial, dummy_stepsize, & + dummy_parabest, likelibest, dummy_initial_paraset_mcmc, & + accratio_stddev, & + accratio_n, vDotDot, B, W, converged, & + n_threads, & + itmp_file, istmp_file + + namelist /restartnml2/ & + truepara, seeds, save_state_1, save_state_2, save_state_3, & + iPos, iNeg, mcmc_paras_3d, & + accRatio, & + sqrtR, vDotJ, s2 ! CHECKING OPTIONALS if (present(restart)) then - irestart = restart + irestart = restart else - irestart = .false. + irestart = .false. end if if (present(restart_file)) then - isrestart_file = restart_file + isrestart_file = restart_file else - isrestart_file = 'mo_mcmc.restart' + isrestart_file = 'mo_mcmc.restart' end if if (.not. irestart) then - if (present(tmp_file)) then - itmp_file = .true. - istmp_file = tmp_file - else - itmp_file = .false. - istmp_file = '' - end if - - if (present(loglike_in)) then - loglike = loglike_in - else - loglike = .false. - end if - - if (present(maskpara_in)) then - if (count(maskpara_in) .eq. 0_i4) then - stop 'Input argument maskpara: At least one element has to be true' - else - maskpara = maskpara_in - end if - else - maskpara = .true. - end if - - allocate ( truepara(count(maskpara)) ) - idummy = 0_i4 - do i=1,size(para,1) - if ( maskpara(i) ) then - idummy = idummy+1_i4 - truepara(idummy) = i - end if - end do + if (present(tmp_file)) then + itmp_file = .true. + istmp_file = tmp_file + else + itmp_file = .false. + istmp_file = '' + end if + + if (present(loglike_in)) then + loglike = loglike_in + else + loglike = .false. + end if + + if (present(maskpara_in)) then + if (count(maskpara_in) .eq. 0_i4) then + stop 'Input argument maskpara: At least one element has to be true' + else + maskpara = maskpara_in + end if + else + maskpara = .true. + end if + + allocate (truepara(count(maskpara))) + idummy = 0_i4 + do i = 1, size(para, 1) + if (maskpara(i)) then + idummy = idummy + 1_i4 + truepara(idummy) = i + end if + end do - n = size(truepara,1) + n = size(truepara, 1) - if (present(ParaSelectMode_in)) then - ParaSelectMode = ParaSelectMode_in - else - ! change only one parameter per jump - ParaSelectMode = 2_i4 - end if + if (present(ParaSelectMode_in)) then + ParaSelectMode = ParaSelectMode_in + else + ! change only one parameter per jump + ParaSelectMode = 2_i4 + end if - ! after how many iterations do we compute ac_ratio??? - if (present(iter_burnin_in)) then - if (iter_burnin_in .le. 0_i4) then - stop 'Input argument iter_burn_in must be greater than 0!' - else - iter_burnin = iter_burnin_in - end if - else - iter_burnin = Max(250_i4, 1000_i4*n) - end if - - ! how many iterations ('jumps') are performed in MCMC - ! iter_mcmc_in is handled later properly (after acceptance ratio of burn_in is known) - if (present(iter_mcmc_in)) then - if (iter_mcmc_in .le. 0_i4) then - stop 'Input argument iter_mcmc must be greater than 0!' - else - iter_mcmc = iter_mcmc_in - end if - else - iter_mcmc = 1000_i4 * n - end if - - if (present(chains_in)) then - if (chains_in .lt. 2_i4) then - stop 'Input argument chains must be at least 2!' - end if - chains = chains_in - else - chains = 5_i4 - end if - - if (present(stepsize_in)) then - stepsize = stepsize_in - skip_burnin = .true. - else - skip_burnin = .false. - end if - - if (present(printflag_in)) then - printflag = printflag_in - else - printflag = .false. - end if - - n_threads = 1 - !$ write(*,*) '--------------------------------------------------' - !$ write(*,*) ' This program is parallel.' - !$OMP parallel - !$ n_threads = OMP_GET_NUM_THREADS() - !$OMP end parallel - !$ write(*,*) ' ',chains,' MCMC chains will run in ',n_threads,' threads' - !$ write(*,*) '--------------------------------------------------' - - if (printflag) then - write(*,*) 'Following parameters will be sampled with MCMC: ',truepara - end if - - allocate(seeds(chains,3)) - allocate(save_state_1(chains,n_save_state)) - allocate(save_state_2(chains,n_save_state)) - allocate(save_state_3(chains,n_save_state)) - allocate(Ipos(chains), Ineg(chains), accRatio(chains)) - allocate(vDotJ(chains), s2(chains)) - allocate(sqrtR(size(para))) - - Ipos = -9999 - Ineg = -9999 - accRatio = -9999.0_dp - vDotJ = -9999.0_dp - s2 = -9999.0_dp - sqrtR = -9999.0_dp - - if (present(seed_in)) then - seeds(1,:) = (/ seed_in, seed_in + 1000_i8, seed_in + 2000_i8 /) - else - ! Seeds depend on actual time - call get_timeseed(seeds(1,:)) - end if - do chain=2,chains - seeds(chain,:) = seeds(chain-1_i4,:) + 3000_i8 - end do - - do chain=1,chains - call xor4096(seeds(chain,1), RN1, save_state=save_state_1(chain,:)) - call xor4096(seeds(chain,2), RN2, save_state=save_state_2(chain,:)) - call xor4096g(seeds(chain,3), RN3, save_state=save_state_3(chain,:)) - end do - seeds = 0_i8 - - parabest = para - - ! initialize likelihood - likelibest = likelihood(parabest) - - !---------------------------------------------------------------------- - ! (1) BURN IN - !---------------------------------------------------------------------- - - if (.not. skip_burnin) then + ! after how many iterations do we compute ac_ratio??? + if (present(iter_burnin_in)) then + if (iter_burnin_in .le. 0_i4) then + stop 'Input argument iter_burn_in must be greater than 0!' + else + iter_burnin = iter_burnin_in + end if + else + iter_burnin = Max(250_i4, 1000_i4 * n) + end if + + ! how many iterations ('jumps') are performed in MCMC + ! iter_mcmc_in is handled later properly (after acceptance ratio of burn_in is known) + if (present(iter_mcmc_in)) then + if (iter_mcmc_in .le. 0_i4) then + stop 'Input argument iter_mcmc must be greater than 0!' + else + iter_mcmc = iter_mcmc_in + end if + else + iter_mcmc = 1000_i4 * n + end if + if (present(chains_in)) then + if (chains_in .lt. 2_i4) then + stop 'Input argument chains must be at least 2!' + end if + chains = chains_in + else + chains = 5_i4 + end if + + if (present(stepsize_in)) then + stepsize = stepsize_in + skip_burnin = .true. + else + skip_burnin = .false. + end if + + if (present(printflag_in)) then + printflag = printflag_in + else + printflag = .false. + end if + + n_threads = 1 + !$ write(*,*) '--------------------------------------------------' + !$ write(*,*) ' This program is parallel.' + !$OMP parallel + !$ n_threads = OMP_GET_NUM_THREADS() + !$OMP end parallel + !$ write(*,*) ' ',chains,' MCMC chains will run in ',n_threads,' threads' + !$ write(*,*) '--------------------------------------------------' + + if (printflag) then + write(*, *) 'Following parameters will be sampled with MCMC: ', truepara + end if + + allocate(seeds(chains, 3)) + allocate(save_state_1(chains, n_save_state)) + allocate(save_state_2(chains, n_save_state)) + allocate(save_state_3(chains, n_save_state)) + allocate(Ipos(chains), Ineg(chains), accRatio(chains)) + allocate(vDotJ(chains), s2(chains)) + allocate(sqrtR(size(para))) + + Ipos = -9999 + Ineg = -9999 + accRatio = -9999.0_dp + vDotJ = -9999.0_dp + s2 = -9999.0_dp + sqrtR = -9999.0_dp + + if (present(seed_in)) then + seeds(1, :) = (/ seed_in, seed_in + 1000_i8, seed_in + 2000_i8 /) + else + ! Seeds depend on actual time + call get_timeseed(seeds(1, :)) + end if + do chain = 2, chains + seeds(chain, :) = seeds(chain - 1_i4, :) + 3000_i8 + end do + + do chain = 1, chains + call xor4096(seeds(chain, 1), RN1, save_state = save_state_1(chain, :)) + call xor4096(seeds(chain, 2), RN2, save_state = save_state_2(chain, :)) + call xor4096g(seeds(chain, 3), RN3, save_state = save_state_3(chain, :)) + end do + seeds = 0_i8 + + parabest = para + + ! initialize likelihood + likelibest = likelihood(parabest, eval) + + !---------------------------------------------------------------------- + ! (1) BURN IN + !---------------------------------------------------------------------- + + if (.not. skip_burnin) then + + if (printflag) then + write(*, *) '' + write(*, *) '--------------------------------------------------' + write(*, *) 'Starting Burn-In (iter_burnin = ', iter_burnin, ')' + write(*, *) '--------------------------------------------------' + write(*, *) '' + end if + + ! INITIALIZATION + + ! probably too large, but large enough to store values of one markovchain + allocate(burnin_paras_part(iter_burnin, size(para))) + + if (allocated(burnin_paras)) deallocate(burnin_paras) + if (allocated(history_accRatio)) deallocate(history_accRatio) + + ! parabestChanged = .false. + stepsize = 1.0_dp + trial = 1_i4 + iStop = .false. + accMult = 1.01_dp + rejMult = 0.99_dp + + if (printflag) then + write(*, *) ' ' + write(*, *) 'Start Burn-In with: ' + write(*, *) ' parabest = ', parabest + write(*, *) ' likelihood = ', likelibest + write(*, *) ' ' + end if + + ! ---------------------------------------------------------------------------------- + ! repeats until convergence of acceptance ratio or better parameter set was found + ! ---------------------------------------------------------------------------------- + convergedBURNIN : do while (.not. iStop) + + Ipos = 0_i4 ! positive accepted + Ineg = 0_i4 ! negative accepted + paraold = parabest + likeliold = likelibest + + ! ------------------------------------------------------------------------------- + ! do a short-cut MCMC + ! ------------------------------------------------------------------------------- + markovchain : do markov = 1, iter_burnin + + ! (A) Generate new parameter set + ChangePara = .false. + paranew = paraold + ! using RN from chain #1 + call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & + save_state_2(1, :), & + save_state_3(1, :), & + paranew, ChangePara) + + ! (B) new likelihood + likelinew = likelihood(paranew, eval) + + oddsSwitch1 = .false. + if (loglike) then + oddsRatio = likelinew - likeliold + if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. + else + oddsRatio = likelinew / likeliold + if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. + end if + + ! (C) Accept or Reject? + If (oddsSwitch1) then + + ! positive accept + Ipos(1) = Ipos(1) + 1_i4 + paraold = paranew + likeliold = likelinew + where (changePara) + stepsize = stepsize * accMult + end where + if (likelinew .gt. likelibest) then + parabest = paranew + likeliold = likelinew + likelibest = likelinew + ! + write(*, *) '' + write(*, *) 'best para changed: ', paranew + write(*, *) 'likelihood new: ', likelinew + write(*, *) '' + end if + burnin_paras_part(Ipos(1) + Ineg(1), :) = paranew(:) + + else + + call xor4096(seeds(1, 1), RN1, save_state = save_state_1(1, :)) + oddsSwitch2 = .false. + if (loglike) then + if (oddsRatio .lt. -700.0_dp) oddsRatio = -700.0_dp ! to avoid underflow + if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. + else + if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. + end if + + If (oddsSwitch2) then + + ! negative accept + Ineg(1) = Ineg(1) + 1_i4 + paraold = paranew + likeliold = likelinew + where (changePara) + stepsize = stepsize * accMult + end where + burnin_paras_part(Ipos(1) + Ineg(1), :) = paranew(:) + + else + + ! reject + where (changePara) + stepsize = stepsize * rejMult + end where + + end if + + end if + + end do markovchain + + accRatio(1) = real(Ipos(1) + Ineg(1), dp) / real(iter_burnin, dp) if (printflag) then - write(*,*) '' - write(*,*) '--------------------------------------------------' - write(*,*) 'Starting Burn-In (iter_burnin = ',iter_burnin,')' - write(*,*) '--------------------------------------------------' - write(*,*) '' + write(str, '(A,I03,A)') '(A7,I4,A15,F5.3,A17,', size(para, 1), '(E9.2,1X),A1)' + write(*, str) 'trial #', trial, ' acc_ratio = ', accRatio(1), ' (stepsize = ', stepsize, ')' end if - ! INITIALIZATION - - ! probably too large, but large enough to store values of one markovchain - allocate(burnin_paras_part(iter_burnin,size(para))) - - if (allocated(burnin_paras)) deallocate(burnin_paras) - if (allocated(history_accRatio)) deallocate(history_accRatio) - - ! parabestChanged = .false. - stepsize = 1.0_dp - trial = 1_i4 - iStop = .false. - accMult = 1.01_dp - rejMult = 0.99_dp - - if (printflag) then - write(*,*) ' ' - write(*,*) 'Start Burn-In with: ' - write(*,*) ' parabest = ', parabest - write(*,*) ' likelihood = ', likelibest - write(*,*) ' ' + if (Ipos(1) + Ineg(1) .gt. 0_i4) then + call append(burnin_paras, burnin_paras_part(1 : Ipos(1) + Ineg(1), :)) end if - ! ---------------------------------------------------------------------------------- - ! repeats until convergence of acceptance ratio or better parameter set was found - ! ---------------------------------------------------------------------------------- - convergedBURNIN: do while ( .not. iStop ) - - Ipos = 0_i4 ! positive accepted - Ineg = 0_i4 ! negative accepted - paraold = parabest - likeliold = likelibest - - ! ------------------------------------------------------------------------------- - ! do a short-cut MCMC - ! ------------------------------------------------------------------------------- - markovchain: do markov=1, iter_burnin - - ! (A) Generate new parameter set - ChangePara = .false. - paranew = paraold - ! using RN from chain #1 - call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & - save_state_2(1,:),& - save_state_3(1,:),& - paranew,ChangePara) - - ! (B) new likelihood - likelinew = likelihood(paranew) - - oddsSwitch1 = .false. - if (loglike) then - oddsRatio = likelinew-likeliold - if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. - else - oddsRatio = likelinew/likeliold - if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. - end if + ! adjust acceptance multiplier + if (accRatio(1) .lt. 0.234_dp) accMult = accMult * 0.99_dp + if (accRatio(1) .gt. 0.441_dp) accMult = accMult * 1.01_dp - ! (C) Accept or Reject? - If (oddsSwitch1) then - - ! positive accept - Ipos(1) = Ipos(1) + 1_i4 - paraold = paranew - likeliold = likelinew - where (changePara) - stepsize = stepsize * accMult - end where - if (likelinew .gt. likelibest) then - parabest = paranew - likeliold = likelinew - likelibest = likelinew - ! - write(*,*) '' - write(*,*) 'best para changed: ',paranew - write(*,*) 'likelihood new: ',likelinew - write(*,*) '' - end if - burnin_paras_part(Ipos(1)+Ineg(1),:) = paranew(:) - - else - - call xor4096(seeds(1,1), RN1, save_state=save_state_1(1,:)) - oddsSwitch2 = .false. - if (loglike) then - if (oddsRatio .lt. -700.0_dp) oddsRatio = -700.0_dp ! to avoid underflow - if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. - else - if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. - end if - - If ( oddsSwitch2 ) then - - ! negative accept - Ineg(1) = Ineg(1) + 1_i4 - paraold = paranew - likeliold = likelinew - where (changePara) - stepsize = stepsize * accMult - end where - burnin_paras_part(Ipos(1)+Ineg(1),:) = paranew(:) - - else - - ! reject - where (changePara) - stepsize = stepsize * rejMult - end where - - end if + ! store good accRatios in history and delete complete history if bad one appears + if (accRatio(1) .lt. 0.234_dp .or. accRatio(1) .gt. 0.441_dp) then + if(allocated(history_accRatio)) deallocate(history_accRatio) + else + call append(history_accRatio, accRatio(1)) + end if + ! if in history more than 10 values, check for mean and variance + if (allocated(history_accRatio)) then + accRatio_n = size(history_accRatio, 1) + if (accRatio_n .ge. 10_i4) then + idummy = accRatio_n - 9_i4 + accRatio_stddev = stddev(history_accRatio(idummy : accRatio_n)) + + ! Check of Convergence + if ((accRatio_stddev .lt. Sqrt(1._dp / 12._dp * 0.05_dp**2))) then + iStop = .true. + if (printflag) then + write(*, *) '' + write(*, *) 'STOP BURN-IN with accaptence ratio of ', history_accRatio(accRatio_n) + write(*, *) 'final stepsize: ', stepsize + write(*, *) 'best parameter set found: ', parabest + write(*, *) 'with likelihood: ', likelibest end if + end if - end do markovchain - - accRatio(1) = real(Ipos(1) + Ineg(1),dp) / real(iter_burnin,dp) - if (printflag) then - write(str,'(A,I03,A)') '(A7,I4,A15,F5.3,A17,',size(para,1),'(E9.2,1X),A1)' - write(*,str) 'trial #',trial,' acc_ratio = ',accRatio(1),' (stepsize = ',stepsize,')' - end if - - if (Ipos(1)+Ineg(1) .gt. 0_i4) then - call append(burnin_paras, burnin_paras_part(1:Ipos(1)+Ineg(1),:)) - end if - - ! adjust acceptance multiplier - if (accRatio(1) .lt. 0.234_dp) accMult = accMult * 0.99_dp - if (accRatio(1) .gt. 0.441_dp) accMult = accMult * 1.01_dp - - ! store good accRatios in history and delete complete history if bad one appears - if (accRatio(1) .lt. 0.234_dp .or. accRatio(1) .gt. 0.441_dp) then - if( allocated(history_accRatio) ) deallocate(history_accRatio) - else - call append(history_accRatio, accRatio(1)) - end if - - ! if in history more than 10 values, check for mean and variance - if ( allocated(history_accRatio) ) then - accRatio_n = size(history_accRatio,1) - if ( accRatio_n .ge. 10_i4 ) then - idummy = accRatio_n-9_i4 - accRatio_stddev = stddev( history_accRatio(idummy:accRatio_n) ) - - ! Check of Convergence - if ( (accRatio_stddev .lt. Sqrt( 1._dp/12._dp * 0.05_dp**2 )) ) then - iStop = .true. - if (printflag) then - write(*,*) '' - write(*,*) 'STOP BURN-IN with accaptence ratio of ', history_accRatio(accRatio_n) - write(*,*) 'final stepsize: ',stepsize - write(*,*) 'best parameter set found: ',parabest - write(*,*) 'with likelihood: ',likelibest - end if - end if - - end if - end if + end if + end if - trial = trial + 1_i4 + trial = trial + 1_i4 - end do convergedBURNIN + end do convergedBURNIN - ! end do betterParaFound + ! end do betterParaFound - end if ! no burn-in skip - ! - ! ------------------------------------ - ! start initializing things for MCMC, i.e. initialization and allocation - ! necessary for MCMC restart file - ! ------------------------------------ + end if ! no burn-in skip + ! + ! ------------------------------------ + ! start initializing things for MCMC, i.e. initialization and allocation + ! necessary for MCMC restart file + ! ------------------------------------ - ! allocate arrays which will be used later - allocate(mcmc_paras_3d(iter_mcmc,size(para),chains)) - mcmc_paras_3d = -9999.0_dp + ! allocate arrays which will be used later + allocate(mcmc_paras_3d(iter_mcmc, size(para), chains)) + mcmc_paras_3d = -9999.0_dp - vDotDot = -9999.0_dp - B = -9999.0_dp - W = -9999.0_dp + vDotDot = -9999.0_dp + B = -9999.0_dp + W = -9999.0_dp - ! just to be sure that all chains start with same initial parameter set - ! in both parallel and sequential mode - ! (although in between a new parabest will be found in chains) - initial_paraset_mcmc = parabest + ! just to be sure that all chains start with same initial parameter set + ! in both parallel and sequential mode + ! (although in between a new parabest will be found in chains) + initial_paraset_mcmc = parabest - Ipos(:) = 0_i4 ! positive accepted - Ineg(:) = 0_i4 ! negative accepted + Ipos(:) = 0_i4 ! positive accepted + Ineg(:) = 0_i4 ! negative accepted - ! if all parameters converged: Sqrt(R_i) < 1.1 (see Gelman et. al: Baysian Data Analysis, p. 331ff) - converged = .False. + ! if all parameters converged: Sqrt(R_i) < 1.1 (see Gelman et. al: Baysian Data Analysis, p. 331ff) + converged = .False. - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - dummy_maskpara = .false. - dummy_maskpara(1:size(para,1)) = maskpara - dummy_stepsize = -9999.0_dp - dummy_stepsize(1:size(para,1)) = stepsize - dummy_parabest = -9999.0_dp - dummy_parabest(1:size(para,1)) = parabest - dummy_initial_paraset_mcmc = -9999.0_dp - dummy_initial_paraset_mcmc(1:size(para,1)) = initial_paraset_mcmc + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + dummy_maskpara = .false. + dummy_maskpara(1 : size(para, 1)) = maskpara + dummy_stepsize = -9999.0_dp + dummy_stepsize(1 : size(para, 1)) = stepsize + dummy_parabest = -9999.0_dp + dummy_parabest(1 : size(para, 1)) = parabest + dummy_initial_paraset_mcmc = -9999.0_dp + dummy_initial_paraset_mcmc(1 : size(para, 1)) = initial_paraset_mcmc - ! write restart - open(999, file=isrestart_file, status='unknown', action='write', delim='QUOTE') - write(999, restartnml1) - write(999, restartnml2) - close(999) + ! write restart + open(999, file = isrestart_file, status = 'unknown', action = 'write', delim = 'QUOTE') + write(999, restartnml1) + write(999, restartnml2) + close(999) else ! --> here starts the restart case - ! read 1st namelist with allocated/scalar variables - open(999, file=isrestart_file, status='old', action='read', delim='QUOTE') - read(999, nml=restartnml1) - close(999) - - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - maskpara = dummy_maskpara(1:size(para,1)) - stepsize = dummy_stepsize(1:size(para,1)) - parabest = dummy_parabest(1:size(para,1)) - initial_paraset_mcmc = dummy_initial_paraset_mcmc(1:size(para,1)) - - ! allocate global arrays - allocate(truepara(count(maskpara)) ) - allocate(seeds(chains,3)) - allocate(save_state_1(chains,n_save_state)) - allocate(save_state_2(chains,n_save_state)) - allocate(save_state_3(chains,n_save_state)) - allocate(Ipos(chains), Ineg(chains), accRatio(chains)) - allocate(vDotJ(chains), s2(chains)) - allocate(sqrtR(size(para))) - if (.not. converged) then - if (present(iter_mcmc_in)) then - allocate(mcmc_paras_3d(iter_mcmc-iter_mcmc_in,size(para),chains)) - else - allocate(mcmc_paras_3d(iter_mcmc-1000_i4*n,size(para),chains)) - end if - else - allocate(mcmc_paras_3d(iter_mcmc,size(para),chains)) - end if + ! read 1st namelist with allocated/scalar variables + open(999, file = isrestart_file, status = 'old', action = 'read', delim = 'QUOTE') + read(999, nml = restartnml1) + close(999) + + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + maskpara = dummy_maskpara(1 : size(para, 1)) + stepsize = dummy_stepsize(1 : size(para, 1)) + parabest = dummy_parabest(1 : size(para, 1)) + initial_paraset_mcmc = dummy_initial_paraset_mcmc(1 : size(para, 1)) + + ! allocate global arrays + allocate(truepara(count(maskpara))) + allocate(seeds(chains, 3)) + allocate(save_state_1(chains, n_save_state)) + allocate(save_state_2(chains, n_save_state)) + allocate(save_state_3(chains, n_save_state)) + allocate(Ipos(chains), Ineg(chains), accRatio(chains)) + allocate(vDotJ(chains), s2(chains)) + allocate(sqrtR(size(para))) + if (.not. converged) then + if (present(iter_mcmc_in)) then + allocate(mcmc_paras_3d(iter_mcmc - iter_mcmc_in, size(para), chains)) + else + allocate(mcmc_paras_3d(iter_mcmc - 1000_i4 * n, size(para), chains)) + end if + else + allocate(mcmc_paras_3d(iter_mcmc, size(para), chains)) + end if end if @@ -1045,425 +1040,415 @@ END FUNCTION likelihood !---------------------------------------------------------------------- if (printflag) then - write(*,*) '' - write(*,*) '--------------------------------------------------' - write(*,*) 'Starting MCMC (chains = ',chains,', iter_mcmc = ',iter_mcmc,')' - write(*,*) '--------------------------------------------------' - write(*,*) '' + write(*, *) '' + write(*, *) '--------------------------------------------------' + write(*, *) 'Starting MCMC (chains = ', chains, ', iter_mcmc = ', iter_mcmc, ')' + write(*, *) '--------------------------------------------------' + write(*, *) '' end if - convergedMCMC: do while (.not. converged) - ! read restart - open(999, file=isrestart_file, status='unknown', action='read', delim='QUOTE') - read(999, restartnml1) - read(999, restartnml2) - close(999) - - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - maskpara = dummy_maskpara(1:size(para,1)) - stepsize = dummy_stepsize(1:size(para,1)) - parabest = dummy_parabest(1:size(para,1)) - initial_paraset_mcmc = dummy_initial_paraset_mcmc(1:size(para,1)) - - ! resize mcmc_paras_3d - ! iter_mcmc was increased --> indicates new length of mcmc_paras_3d - ! Minval(Ipos+Ineg) --> indicates old length of mcmc_paras_3d - idummy = minval(Ipos+Ineg) - if ((iter_mcmc-idummy) > 0) then - allocate(tmp(idummy,size(para),chains)) - tmp(:,:,:) = mcmc_paras_3d(1:idummy,:,:) - deallocate(mcmc_paras_3d) - allocate(mcmc_paras_3d(iter_mcmc,size(para),chains)) - mcmc_paras_3d(1:idummy,:,:) = tmp(:,:,:) - deallocate(tmp) - end if - - !$OMP parallel default(shared) & - !$OMP private(chain, paraold, paranew, likeliold, likelinew, oddsSwitch1, oddsSwitch2, RN1, oddsRatio, ChangePara) - !$OMP do - parallelchain: do chain=1, chains - - if (Ipos(chain)+Ineg(chain) .eq. 0_i4) then - paraold = initial_paraset_mcmc ! = parabest of burn-in + convergedMCMC : do while (.not. converged) + ! read restart + open(999, file = isrestart_file, status = 'unknown', action = 'read', delim = 'QUOTE') + read(999, restartnml1) + read(999, restartnml2) + close(999) + + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + maskpara = dummy_maskpara(1 : size(para, 1)) + stepsize = dummy_stepsize(1 : size(para, 1)) + parabest = dummy_parabest(1 : size(para, 1)) + initial_paraset_mcmc = dummy_initial_paraset_mcmc(1 : size(para, 1)) + + ! resize mcmc_paras_3d + ! iter_mcmc was increased --> indicates new length of mcmc_paras_3d + ! Minval(Ipos+Ineg) --> indicates old length of mcmc_paras_3d + idummy = minval(Ipos + Ineg) + if ((iter_mcmc - idummy) > 0) then + allocate(tmp(idummy, size(para), chains)) + tmp(:, :, :) = mcmc_paras_3d(1 : idummy, :, :) + deallocate(mcmc_paras_3d) + allocate(mcmc_paras_3d(iter_mcmc, size(para), chains)) + mcmc_paras_3d(1 : idummy, :, :) = tmp(:, :, :) + deallocate(tmp) + end if + + !$OMP parallel default(shared) & + !$OMP private(chain, paraold, paranew, likeliold, likelinew, oddsSwitch1, oddsSwitch2, RN1, oddsRatio, ChangePara) + !$OMP do + parallelchain : do chain = 1, chains + + if (Ipos(chain) + Ineg(chain) .eq. 0_i4) then + paraold = initial_paraset_mcmc ! = parabest of burn-in + else + paraold = mcmc_paras_3d(Ipos(chain) + Ineg(chain), :, chain) + end if + likeliold = likelihood(paraold, eval) + + markovchainMCMC : do + + ! (A) Generate new parameter set + ChangePara = .false. + paranew = paraold + + call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & + save_state_2(chain, :), & + save_state_3(chain, :), & + paranew, ChangePara) + + ! (B) new likelihood + likelinew = likelihood(paranew, eval) + oddsSwitch1 = .false. + if (loglike) then + oddsRatio = likelinew - likeliold + if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. else - paraold = mcmc_paras_3d(Ipos(chain)+Ineg(chain),:,chain) + oddsRatio = likelinew / likeliold + if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. end if - likeliold = likelihood(paraold) - - markovchainMCMC: do - - ! (A) Generate new parameter set - ChangePara = .false. - paranew = paraold - - call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & - save_state_2(chain,:),& - save_state_3(chain,:),& - paranew,ChangePara) - - ! (B) new likelihood - likelinew = likelihood(paranew) - oddsSwitch1 = .false. - if (loglike) then - oddsRatio = likelinew-likeliold - if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. - else - oddsRatio = likelinew/likeliold - if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. - end if - - ! (C) Accept or Reject? - If (oddsSwitch1) then - - ! positive accept - Ipos(chain) = Ipos(chain) + 1_i4 - paraold = paranew - likeliold = likelinew - mcmc_paras_3d(Ipos(chain)+Ineg(chain),:,chain) = paranew(:) - - if ( printflag ) then - if ( (Ipos(chain)+Ineg(chain) .gt. 0_i4 ) .and. & - (mod(Ipos(chain)+Ineg(chain),10000_i4)) .eq. 0 ) then - write(*,*) 'Chain ',chain,': Done ',Ipos(chain)+Ineg(chain),' samples ...' - end if - end if - - ! If the following code block is not commented - ! then mcmc can be used as an optimiser as well - ! and not 'only' for determination of parameter uncertainties. - ! However, then the serial and the parallel versions give different results. - ! if (likelinew .gt. likelibest) then - ! parabest = paranew - ! likelibest = likelinew - ! if (printflag) then - ! write(*,*) '' - ! write(*,*) 'best para changed: ',paranew - ! write(*,*) 'likelihood new: ',likelinew - ! write(*,*) '' - ! end if - ! end if - - else - - call xor4096(seeds(chain,1), RN1, save_state=save_state_1(chain,:)) - oddsSwitch2 = .false. - if (loglike) then - if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. - else - if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. - end if - If ( oddsSwitch2 ) then + ! (C) Accept or Reject? + If (oddsSwitch1) then + + ! positive accept + Ipos(chain) = Ipos(chain) + 1_i4 + paraold = paranew + likeliold = likelinew + mcmc_paras_3d(Ipos(chain) + Ineg(chain), :, chain) = paranew(:) + + if (printflag) then + if ((Ipos(chain) + Ineg(chain) .gt. 0_i4) .and. & + (mod(Ipos(chain) + Ineg(chain), 10000_i4)) .eq. 0) then + write(*, *) 'Chain ', chain, ': Done ', Ipos(chain) + Ineg(chain), ' samples ...' + end if + end if + + ! If the following code block is not commented + ! then mcmc can be used as an optimiser as well + ! and not 'only' for determination of parameter uncertainties. + ! However, then the serial and the parallel versions give different results. + ! if (likelinew .gt. likelibest) then + ! parabest = paranew + ! likelibest = likelinew + ! if (printflag) then + ! write(*,*) '' + ! write(*,*) 'best para changed: ',paranew + ! write(*,*) 'likelihood new: ',likelinew + ! write(*,*) '' + ! end if + ! end if - ! negative accept - Ineg(chain) = Ineg(chain) + 1_i4 - paraold = paranew - likeliold = likelinew - mcmc_paras_3d(Ipos(chain)+Ineg(chain),:,chain) = paranew(:) - - if ( printflag ) then - if ( (Ipos(chain)+Ineg(chain) .gt. 0_i4 ) .and. & - (mod(Ipos(chain)+Ineg(chain),10000_i4)) .eq. 0 ) then - write(*,*) 'Chain ',chain,': Done ',Ipos(chain)+Ineg(chain),' samples ...' - end if - end if + else + call xor4096(seeds(chain, 1), RN1, save_state = save_state_1(chain, :)) + oddsSwitch2 = .false. + if (loglike) then + if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. + else + if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. + end if + + If (oddsSwitch2) then + + ! negative accept + Ineg(chain) = Ineg(chain) + 1_i4 + paraold = paranew + likeliold = likelinew + mcmc_paras_3d(Ipos(chain) + Ineg(chain), :, chain) = paranew(:) + + if (printflag) then + if ((Ipos(chain) + Ineg(chain) .gt. 0_i4) .and. & + (mod(Ipos(chain) + Ineg(chain), 10000_i4)) .eq. 0) then + write(*, *) 'Chain ', chain, ': Done ', Ipos(chain) + Ineg(chain), ' samples ...' end if + end if + + end if - end if - - ! enough samples were found - if ( (Ipos(chain)+Ineg(chain) .gt. 0_i4 ) .and. & - (mod(Ipos(chain)+Ineg(chain),iter_mcmc) .eq. 0_i4 ) ) exit - - end do markovchainMCMC - - end do parallelchain - !$OMP end do - !$OMP end parallel - - ! write parameter sets to temporal file - if (itmp_file) then - ! splitting into path and filename - slash_pos = index(istmp_file, '/', .true.) - len_filename = len_trim(istmp_file) - path = istmp_file(1:slash_pos) - filename = istmp_file(slash_pos+1:len_filename) - ! - do chain=1,chains - write(str,*) chain - write(outputfile,*) trim(adjustl(path)), trim(adjustl(str)), '_' , trim(adjustl(filename)) - if (present(iter_mcmc_in)) then - allocate(tmp(iter_mcmc_in,size(para,1),1)) - tmp(:,:,1) = mcmc_paras_3d(iter_mcmc-iter_mcmc_in+1_i4:iter_mcmc,:,chain) - if (iter_mcmc .ne. iter_mcmc_in) then - ! append - call dump_netcdf(trim(adjustl(outputfile)), tmp, append=.true.) - else - ! first time of writing - call dump_netcdf(trim(adjustl(outputfile)), tmp) - end if - deallocate(tmp) - else - allocate(tmp(1000_i4*n,size(para,1),1)) - tmp(:,:,1) = mcmc_paras_3d(iter_mcmc-(1000_i4*n)+1_i4:iter_mcmc,:,chain) - if (iter_mcmc .ne. 1000_i4*n) then - ! append - call dump_netcdf(trim(adjustl(outputfile)), tmp, append=.true.) - else - ! first time of writing - call dump_netcdf(trim(adjustl(outputfile)), tmp) - end if - deallocate(tmp) - end if - end do - end if - - ! test for convergence: Gelman et. al: Baysian Data Analysis, p. 331ff - ! sqrt(R) = sqrt( ( (n-1)/n * W + 1/n * B ) / W ) < 1.1 for each parameter - ! n ... last half of the sequence - ! W ... within sequence variance - ! B ... between chain variance - - if ( printflag ) then - write(*,*) ' ' - write(*,*) 'Checking for convergence ....' - end if - sqrtR = 0.0_dp - n_end = minval(Ipos+Ineg) - n_start = n_end / 2_i4 + 1_i4 - - do iPar=1, size(truepara) - - ! Between chain variances - do chain=1, chains - vDotJ(chain) = 1.0_dp / real(n_end-n_start+1_i4,dp) * & - sum(mcmc_paras_3d(n_start:n_end,truepara(iPar),chain)) - end do - vDotDot = 1.0_dp / real(chains,dp) * sum(vDotJ) - B = real(n_end -n_start + 1_i4,dp) / real(chains-1_i4,dp) * & - sum((vDotJ - vDotDot)*(vDotJ - vDotDot)) - - ! Within chain variances - do chain=1, chains - s2(chain) = 1.0_dp / real(n_end-n_start,dp) * & - sum((mcmc_paras_3d(n_start:n_end,truepara(iPar),chain)-vDotJ(chain))**2) - end do - W = 1.0_dp / real(chains,dp) * Sum(s2) - - ! ratio sqrtR - if ( (w .lt. tiny(1.0_dp)) .and. (b .lt. tiny(1.0_dp))) then - ! Mathematica says that this is the limit, if w and b both go to zero - sqrtR(truepara(iPar)) = sqrt(real(n_end-n_start,dp) / real(n_end-n_start+1_i4,dp)) - else - sqrtR(truepara(iPar)) = real(n_end-n_start,dp) / real(n_end-n_start+1_i4,dp) * W + & - 1.0_dp / real(n_end-n_start+1_i4,dp) * B - sqrtR(truepara(iPar)) = sqrt( sqrtR(truepara(iPar)) / W ) - end if - end do - if (printflag) then - do i=1, size(para) - if ( sqrtR(i) .gt. 1.1_dp ) then - write(*,*) ' sqrtR para #',i,' : ', sqrtR(i),' <-- FAILED' - else - write(*,*) ' sqrtR para #',i,' : ', sqrtR(i) - end if - end do - end if - if ( all(sqrtR .lt. 1.1_dp) ) then - converged = .true. - if ( printflag ) then - write(*,*) ' --> converged (all less than 1.1)' - write(*,*) ' ' end if - else - ! increase number of iterations + + ! enough samples were found + if ((Ipos(chain) + Ineg(chain) .gt. 0_i4) .and. & + (mod(Ipos(chain) + Ineg(chain), iter_mcmc) .eq. 0_i4)) exit + + end do markovchainMCMC + + end do parallelchain + !$OMP end do + !$OMP end parallel + + ! write parameter sets to temporal file + if (itmp_file) then + ! splitting into path and filename + slash_pos = index(istmp_file, '/', .true.) + len_filename = len_trim(istmp_file) + path = istmp_file(1 : slash_pos) + filename = istmp_file(slash_pos + 1 : len_filename) + ! + do chain = 1, chains + write(str, *) chain + write(outputfile, *) trim(adjustl(path)), trim(adjustl(str)), '_', trim(adjustl(filename)) if (present(iter_mcmc_in)) then - iter_mcmc = iter_mcmc + iter_mcmc_in + allocate(tmp(iter_mcmc_in, size(para, 1), 1)) + tmp(:, :, 1) = mcmc_paras_3d(iter_mcmc - iter_mcmc_in + 1_i4 : iter_mcmc, :, chain) + if (iter_mcmc .ne. iter_mcmc_in) then + ! append + call dump_netcdf(trim(adjustl(outputfile)), tmp, append = .true.) + else + ! first time of writing + call dump_netcdf(trim(adjustl(outputfile)), tmp) + end if + deallocate(tmp) else - iter_mcmc = iter_mcmc + 1000_i4 * n + allocate(tmp(1000_i4 * n, size(para, 1), 1)) + tmp(:, :, 1) = mcmc_paras_3d(iter_mcmc - (1000_i4 * n) + 1_i4 : iter_mcmc, :, chain) + if (iter_mcmc .ne. 1000_i4 * n) then + ! append + call dump_netcdf(trim(adjustl(outputfile)), tmp, append = .true.) + else + ! first time of writing + call dump_netcdf(trim(adjustl(outputfile)), tmp) + end if + deallocate(tmp) end if - - if ( printflag ) then - write(*,*) ' --> not converged (not all less than 1.1)' - write(*,*) ' increasing iterations to ',iter_mcmc - write(*,*) ' ' + end do + end if + + ! test for convergence: Gelman et. al: Baysian Data Analysis, p. 331ff + ! sqrt(R) = sqrt( ( (n-1)/n * W + 1/n * B ) / W ) < 1.1 for each parameter + ! n ... last half of the sequence + ! W ... within sequence variance + ! B ... between chain variance + + if (printflag) then + write(*, *) ' ' + write(*, *) 'Checking for convergence ....' + end if + sqrtR = 0.0_dp + n_end = minval(Ipos + Ineg) + n_start = n_end / 2_i4 + 1_i4 + + do iPar = 1, size(truepara) + + ! Between chain variances + do chain = 1, chains + vDotJ(chain) = 1.0_dp / real(n_end - n_start + 1_i4, dp) * & + sum(mcmc_paras_3d(n_start : n_end, truepara(iPar), chain)) + end do + vDotDot = 1.0_dp / real(chains, dp) * sum(vDotJ) + B = real(n_end - n_start + 1_i4, dp) / real(chains - 1_i4, dp) * & + sum((vDotJ - vDotDot) * (vDotJ - vDotDot)) + + ! Within chain variances + do chain = 1, chains + s2(chain) = 1.0_dp / real(n_end - n_start, dp) * & + sum((mcmc_paras_3d(n_start : n_end, truepara(iPar), chain) - vDotJ(chain))**2) + end do + W = 1.0_dp / real(chains, dp) * Sum(s2) + + ! ratio sqrtR + if ((w .lt. tiny(1.0_dp)) .and. (b .lt. tiny(1.0_dp))) then + ! Mathematica says that this is the limit, if w and b both go to zero + sqrtR(truepara(iPar)) = sqrt(real(n_end - n_start, dp) / real(n_end - n_start + 1_i4, dp)) + else + sqrtR(truepara(iPar)) = real(n_end - n_start, dp) / real(n_end - n_start + 1_i4, dp) * W + & + 1.0_dp / real(n_end - n_start + 1_i4, dp) * B + sqrtR(truepara(iPar)) = sqrt(sqrtR(truepara(iPar)) / W) + end if + end do + if (printflag) then + do i = 1, size(para) + if (sqrtR(i) .gt. 1.1_dp) then + write(*, *) ' sqrtR para #', i, ' : ', sqrtR(i), ' <-- FAILED' + else + write(*, *) ' sqrtR para #', i, ' : ', sqrtR(i) end if - end if - - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - dummy_maskpara = .false. - dummy_maskpara(1:size(para,1)) = maskpara - dummy_stepsize = -9999.0_dp - dummy_stepsize(1:size(para,1)) = stepsize - dummy_parabest = -9999.0_dp - dummy_parabest(1:size(para,1)) = parabest - dummy_initial_paraset_mcmc = -9999.0_dp - dummy_initial_paraset_mcmc(1:size(para,1)) = initial_paraset_mcmc - - ! write restart - open(999, file=isrestart_file, status='unknown', action='write', delim='QUOTE') - write(999, restartnml1) - write(999, restartnml2) - close(999) + end do + end if + if (all(sqrtR .lt. 1.1_dp)) then + converged = .true. + if (printflag) then + write(*, *) ' --> converged (all less than 1.1)' + write(*, *) ' ' + end if + else + ! increase number of iterations + if (present(iter_mcmc_in)) then + iter_mcmc = iter_mcmc + iter_mcmc_in + else + iter_mcmc = iter_mcmc + 1000_i4 * n + end if + + if (printflag) then + write(*, *) ' --> not converged (not all less than 1.1)' + write(*, *) ' increasing iterations to ', iter_mcmc + write(*, *) ' ' + end if + end if + + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + dummy_maskpara = .false. + dummy_maskpara(1 : size(para, 1)) = maskpara + dummy_stepsize = -9999.0_dp + dummy_stepsize(1 : size(para, 1)) = stepsize + dummy_parabest = -9999.0_dp + dummy_parabest(1 : size(para, 1)) = parabest + dummy_initial_paraset_mcmc = -9999.0_dp + dummy_initial_paraset_mcmc(1 : size(para, 1)) = initial_paraset_mcmc + + ! write restart + open(999, file = isrestart_file, status = 'unknown', action = 'write', delim = 'QUOTE') + write(999, restartnml1) + write(999, restartnml2) + close(999) end do convergedMCMC - + ! read restart - open(999, file=isrestart_file, status='unknown', action='read', delim='QUOTE') - read(999, restartnml1) + open(999, file = isrestart_file, status = 'unknown', action = 'read', delim = 'QUOTE') + read(999, restartnml1) read(999, restartnml2) close(999) ! transfer all array-like variables in namelist to fixed-size dummy-arrays - maskpara = dummy_maskpara(1:size(para,1)) - stepsize = dummy_stepsize(1:size(para,1)) - parabest = dummy_parabest(1:size(para,1)) - initial_paraset_mcmc = dummy_initial_paraset_mcmc(1:size(para,1)) + maskpara = dummy_maskpara(1 : size(para, 1)) + stepsize = dummy_stepsize(1 : size(para, 1)) + parabest = dummy_parabest(1 : size(para, 1)) + initial_paraset_mcmc = dummy_initial_paraset_mcmc(1 : size(para, 1)) ! reshape of mcmc_paras_3d: return only 2d matrix mcmc_paras - allocate(mcmc_paras(size(mcmc_paras_3d,1)*size(mcmc_paras_3d,3),size(mcmc_paras_3d,2))) - do chain=1, chains - mcmc_paras( (chain-1_i4)*size(mcmc_paras_3d,1)+1_i4 : chain*size(mcmc_paras_3d,1),:) = mcmc_paras_3d(:,:,chain) + allocate(mcmc_paras(size(mcmc_paras_3d, 1) * size(mcmc_paras_3d, 3), size(mcmc_paras_3d, 2))) + do chain = 1, chains + mcmc_paras((chain - 1_i4) * size(mcmc_paras_3d, 1) + 1_i4 : chain * size(mcmc_paras_3d, 1), :) = mcmc_paras_3d(:, :, chain) end do RETURN END SUBROUTINE mcmc_dp - SUBROUTINE mcmc_stddev_dp(likelihood, para, rangePar, & ! obligatory IN - mcmc_paras, burnin_paras, & ! obligatory OUT - seed_in, printflag_in, maskpara_in, & ! optional IN - tmp_file, & ! optional IN : filename for temporal output of - ! ! MCMC parasets - loglike_in, & ! optional IN : true if loglikelihood is given - ParaSelectMode_in, & ! optional IN : (=1) half, (=2) one, (=3) all - iter_burnin_in, & ! optional IN : markov length of (1) burn-in - iter_mcmc_in, & ! optional IN : markov length of (2) mcmc - chains_in, & ! optional IN : number of parallel chains of MCMC - stepsize_in) ! optional_IN : stepsize for each param. (no burn-in) + SUBROUTINE mcmc_stddev_dp(eval, likelihood, para, rangePar, & ! obligatory IN + mcmc_paras, burnin_paras, & ! obligatory OUT + seed_in, printflag_in, maskpara_in, & ! optional IN + tmp_file, & ! optional IN : filename for temporal output of + ! ! MCMC parasets + loglike_in, & ! optional IN : true if loglikelihood is given + ParaSelectMode_in, & ! optional IN : (=1) half, (=2) one, (=3) all + iter_burnin_in, & ! optional IN : markov length of (1) burn-in + iter_mcmc_in, & ! optional IN : markov length of (2) mcmc + chains_in, & ! optional IN : number of parallel chains of MCMC + stepsize_in) ! optional_IN : stepsize for each param. (no burn-in) IMPLICIT NONE - INTERFACE - FUNCTION likelihood(paraset,sigma,stddev_new,likeli_new) - ! calculates the likelihood function at a certain parameter set paraset - use mo_kind - REAL(DP), DIMENSION(:), INTENT(IN) :: paraset - REAL(DP), INTENT(IN) :: sigma - REAL(DP), INTENT(OUT), OPTIONAL :: stddev_new ! standard deviation of errors using paraset - REAL(DP), INTENT(OUT), OPTIONAL :: likeli_new ! likelihood using stddev_new, - ! ! i.e. using new parameter set - REAL(DP) :: likelihood - END FUNCTION likelihood - END INTERFACE - - REAL(DP), DIMENSION(:,:), INTENT(IN) :: rangePar ! range for each parameter - REAL(DP), DIMENSION(:), INTENT(IN) :: para ! initial parameter i - INTEGER(I8), OPTIONAL, INTENT(IN) :: seed_in ! Seeds of random numbers: dim1=chains, dim2=3 + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: likelihood + + REAL(DP), DIMENSION(:, :), INTENT(IN) :: rangePar ! range for each parameter + REAL(DP), DIMENSION(:), INTENT(IN) :: para ! initial parameter i + INTEGER(I8), OPTIONAL, INTENT(IN) :: seed_in ! Seeds of random numbers: dim1=chains, dim2=3 ! ! (DEFAULT: Get_timeseed) - LOGICAL, OPTIONAL, INTENT(IN) :: printflag_in ! If command line output is written (.true.) + LOGICAL, OPTIONAL, INTENT(IN) :: printflag_in ! If command line output is written (.true.) ! ! (DEFAULT: .false.) - LOGICAL, OPTIONAL, DIMENSION(size(para,1)), & - INTENT(IN) :: maskpara_in ! true if parameter will be optimized + LOGICAL, OPTIONAL, DIMENSION(size(para, 1)), & + INTENT(IN) :: maskpara_in ! true if parameter will be optimized ! ! false if parameter is discarded in optimization ! ! DEFAULT = .true. - LOGICAL, OPTIONAL, INTENT(IN) :: loglike_in ! true if loglikelihood is given instead of likelihood + LOGICAL, OPTIONAL, INTENT(IN) :: loglike_in ! true if loglikelihood is given instead of likelihood ! ! DEFAULT: .false. - INTEGER(I4), OPTIONAL, INTENT(IN) :: ParaSelectMode_in ! how many parameters changed per iteration: + INTEGER(I4), OPTIONAL, INTENT(IN) :: ParaSelectMode_in ! how many parameters changed per iteration: ! ! 1: half of the parameters ! ! 2: only one (DEFAULT) ! ! 3: all - INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_burnin_in ! # iterations before checking ac_ratio + INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_burnin_in ! # iterations before checking ac_ratio ! ! DEFAULT= MIN(250, 20_i4*n) - INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_mcmc_in ! # iterations per chain for posterior sampling + INTEGER(I4), OPTIONAL, INTENT(IN) :: iter_mcmc_in ! # iterations per chain for posterior sampling ! ! DEFAULT= 1000_i4*n - INTEGER(I4), OPTIONAL, INTENT(IN) :: chains_in ! number of parallel mcmc chains + INTEGER(I4), OPTIONAL, INTENT(IN) :: chains_in ! number of parallel mcmc chains ! ! DEFAULT= 5_i4 - REAL(DP), OPTIONAL, DIMENSION(size(para,1)), & - INTENT(IN) :: stepsize_in ! stepsize for each parameter + REAL(DP), OPTIONAL, DIMENSION(size(para, 1)), & + INTENT(IN) :: stepsize_in ! stepsize for each parameter ! ! if given burn-in is discarded - CHARACTER(len=*), OPTIONAL, INTENT(IN) :: tmp_file ! filename for temporal data saving: every iter_mcmc_in + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: tmp_file ! filename for temporal data saving: every iter_mcmc_in ! ! iterations parameter sets are appended to this file ! ! the number of the chain will be prepended to filename ! ! DEFAULT= no file writing - REAL(DP), DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: mcmc_paras + REAL(DP), DIMENSION(:, :), ALLOCATABLE, INTENT(OUT) :: mcmc_paras ! ! array to save para values of MCMC runs, ! ! dim1=sets of all chains, dim2=paras - REAL(DP), DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: burnin_paras + REAL(DP), DIMENSION(:, :), ALLOCATABLE, INTENT(OUT) :: burnin_paras ! ! array to save para values of Burn in run ! local variables - INTEGER(I4) :: n ! Number of parameters - LOGICAL :: printflag ! If command line output is written - LOGICAL, DIMENSION(size(para,1)) :: maskpara ! true if parameter will be optimized + INTEGER(I4) :: n ! Number of parameters + LOGICAL :: printflag ! If command line output is written + LOGICAL, DIMENSION(size(para, 1)) :: maskpara ! true if parameter will be optimized INTEGER(I4), DIMENSION(:), ALLOCATABLE :: truepara ! indexes of parameters to be optimized - LOGICAL :: loglike ! if loglikelihood is given + LOGICAL :: loglike ! if loglikelihood is given ! for random numbers - INTEGER(I8), dimension(:,:), allocatable :: seeds ! Seeds of random numbers: dim1=chains, dim2=3 - REAL(DP) :: RN1, RN2, RN3 ! Random numbers - integer(I8), dimension(:,:), allocatable :: save_state_1 ! optional argument for restarting RN stream 1: - integer(I8), dimension(:,:), allocatable :: save_state_2 ! optional argument for restarting RN stream 2: - integer(I8), dimension(:,:), allocatable :: save_state_3 ! optional argument for restarting RN stream 3: + INTEGER(I8), dimension(:, :), allocatable :: seeds ! Seeds of random numbers: dim1=chains, dim2=3 + REAL(DP) :: RN1, RN2, RN3 ! Random numbers + integer(I8), dimension(:, :), allocatable :: save_state_1 ! optional argument for restarting RN stream 1: + integer(I8), dimension(:, :), allocatable :: save_state_2 ! optional argument for restarting RN stream 2: + integer(I8), dimension(:, :), allocatable :: save_state_3 ! optional argument for restarting RN stream 3: ! ! dim1=chains, dim2=n_save_state ! Dummies - REAL(DP), DIMENSION(:,:,:), ALLOCATABLE :: tmp - integer(I4) :: idummy - logical :: oddsSwitch1, oddsSwitch2 - character(100) :: str - character(200) :: outputfile - integer(i4) :: slash_pos - integer(i4) :: len_filename - character(200) :: filename - character(200) :: path + REAL(DP), DIMENSION(:, :, :), ALLOCATABLE :: tmp + integer(I4) :: idummy + logical :: oddsSwitch1, oddsSwitch2 + character(100) :: str + character(200) :: outputfile + integer(i4) :: slash_pos + integer(i4) :: len_filename + character(200) :: filename + character(200) :: path ! FOR BURN-IN AND MCMC - REAL(DP), DIMENSION(:,:,:), ALLOCATABLE :: mcmc_paras_3d ! array to save para values of MCMC runs, + REAL(DP), DIMENSION(:, :, :), ALLOCATABLE :: mcmc_paras_3d ! array to save para values of MCMC runs, ! ! dim1=sets, dim2=paras, dim3=chain - integer(I4) :: i - integer(I4), dimension(:), allocatable :: Ipos, Ineg - logical :: iStop - INTEGER(I4) :: ParaSelectMode ! how many parameters are changed per jump - INTEGER(I4) :: iter_burnin ! number fo iterations before checking ac_ratio - INTEGER(I4) :: iter_mcmc ! number fo iterations for posterior sampling - INTEGER(I4) :: chains ! number of parallel mcmc chains - INTEGER(I4) :: chain ! counter for chains, 1...chains - REAL(DP) :: accMult ! acceptance multiplier for stepsize - REAL(DP) :: rejMult ! rejection multiplier for stepsize - LOGICAL,DIMENSION(size(para,1)) :: ChangePara ! logical array to switch if parameter is changed - INTEGER(I4) :: trial ! number of trials for burn-in - REAL(DP),DIMENSION(size(para,1)) :: stepsize ! stepsize adjusted by burn-in and used by mcmc - REAL(DP),DIMENSION(size(para,1)) :: paraold ! old parameter set - REAL(DP),DIMENSION(size(para,1)) :: paranew ! new parameter set - REAL(DP),DIMENSION(size(para,1)) :: parabest ! best parameter set overall - REAL(DP),DIMENSION(size(para,1)) :: initial_paraset_mcmc ! best parameterset found in burn-in - REAL(DP) :: stddev_data ! approximated stddev of data for best paraset found - LOGICAL :: parabestChanged ! if better parameter set was found during burn-in - REAL(DP) :: likeliold ! likelihood of old parameter set - REAL(DP) :: likelinew ! likelihood of new parameter set - REAL(DP) :: likelibest ! likelihood of best parameter set overall - REAL(DP) :: stddev_new ! standard deviation of errors with current parameter set - REAL(DP) :: likeli_new ! likelihood using stddev_new instead of stddev_data - INTEGER(I4) :: markov ! counter for markov chain - REAL(DP), DIMENSION(:,:), ALLOCATABLE :: burnin_paras_part ! accepted parameter sets of one MC in burn-in - REAL(DP) :: oddsRatio ! ratio of likelihoods = likelinew/likeliold - REAL(DP), dimension(:), allocatable :: accRatio ! acceptance ratio = (pos/neg) accepted/iter_burnin - REAL(DP) :: accratio_stddev ! stddev of accRatios in history - REAL(DP), DIMENSION(:), ALLOCATABLE :: history_accratio ! history of 'good' acceptance ratios - INTEGER(I4) :: accratio_n ! number of 'good' acceptance ratios + integer(I4) :: i + integer(I4), dimension(:), allocatable :: Ipos, Ineg + logical :: iStop + INTEGER(I4) :: ParaSelectMode ! how many parameters are changed per jump + INTEGER(I4) :: iter_burnin ! number fo iterations before checking ac_ratio + INTEGER(I4) :: iter_mcmc ! number fo iterations for posterior sampling + INTEGER(I4) :: chains ! number of parallel mcmc chains + INTEGER(I4) :: chain ! counter for chains, 1...chains + REAL(DP) :: accMult ! acceptance multiplier for stepsize + REAL(DP) :: rejMult ! rejection multiplier for stepsize + LOGICAL, DIMENSION(size(para, 1)) :: ChangePara ! logical array to switch if parameter is changed + INTEGER(I4) :: trial ! number of trials for burn-in + REAL(DP), DIMENSION(size(para, 1)) :: stepsize ! stepsize adjusted by burn-in and used by mcmc + REAL(DP), DIMENSION(size(para, 1)) :: paraold ! old parameter set + REAL(DP), DIMENSION(size(para, 1)) :: paranew ! new parameter set + REAL(DP), DIMENSION(size(para, 1)) :: parabest ! best parameter set overall + REAL(DP), DIMENSION(size(para, 1)) :: initial_paraset_mcmc ! best parameterset found in burn-in + REAL(DP) :: stddev_data ! approximated stddev of data for best paraset found + LOGICAL :: parabestChanged ! if better parameter set was found during burn-in + REAL(DP) :: likeliold ! likelihood of old parameter set + REAL(DP) :: likelinew ! likelihood of new parameter set + REAL(DP) :: likelibest ! likelihood of best parameter set overall + REAL(DP) :: stddev_new ! standard deviation of errors with current parameter set + REAL(DP) :: likeli_new ! likelihood using stddev_new instead of stddev_data + INTEGER(I4) :: markov ! counter for markov chain + REAL(DP), DIMENSION(:, :), ALLOCATABLE :: burnin_paras_part ! accepted parameter sets of one MC in burn-in + REAL(DP) :: oddsRatio ! ratio of likelihoods = likelinew/likeliold + REAL(DP), dimension(:), allocatable :: accRatio ! acceptance ratio = (pos/neg) accepted/iter_burnin + REAL(DP) :: accratio_stddev ! stddev of accRatios in history + REAL(DP), DIMENSION(:), ALLOCATABLE :: history_accratio ! history of 'good' acceptance ratios + INTEGER(I4) :: accratio_n ! number of 'good' acceptance ratios !REAL(DP), DIMENSION(:,:), ALLOCATABLE :: history_stepsize ! history of 'good' stepsizes ! for checking convergence of MCMC - real(dp), allocatable, dimension(:) :: sqrtR - real(dp), allocatable, dimension(:) :: vDotJ - real(dp), allocatable, dimension(:) :: s2 - real(dp) :: vDotDot - real(dp) :: B - real(dp) :: W - integer(i4) :: n_start, n_end, iPar - LOGICAL :: converged ! if MCMC already converged + real(dp), allocatable, dimension(:) :: sqrtR + real(dp), allocatable, dimension(:) :: vDotJ + real(dp), allocatable, dimension(:) :: s2 + real(dp) :: vDotDot + real(dp) :: B + real(dp) :: W + integer(i4) :: n_start, n_end, iPar + LOGICAL :: converged ! if MCMC already converged ! for OMP !$ integer(i4) :: n_threads @@ -1471,79 +1456,79 @@ END FUNCTION likelihood ! CHECKING OPTIONALS if (present(loglike_in)) then - loglike = loglike_in + loglike = loglike_in else - loglike = .false. + loglike = .false. end if if (present(maskpara_in)) then - if (count(maskpara_in) .eq. 0_i4) then - stop 'Input argument maskpara: At least one element has to be true' - else - maskpara = maskpara_in - end if + if (count(maskpara_in) .eq. 0_i4) then + stop 'Input argument maskpara: At least one element has to be true' + else + maskpara = maskpara_in + end if else - maskpara = .true. + maskpara = .true. end if - allocate ( truepara(count(maskpara)) ) + allocate (truepara(count(maskpara))) idummy = 0_i4 - do i=1,size(para,1) - if ( maskpara(i) ) then - idummy = idummy+1_i4 - truepara(idummy) = i - end if + do i = 1, size(para, 1) + if (maskpara(i)) then + idummy = idummy + 1_i4 + truepara(idummy) = i + end if end do - n = size(truepara,1) + n = size(truepara, 1) if (present(ParaSelectMode_in)) then - ParaSelectMode = ParaSelectMode_in + ParaSelectMode = ParaSelectMode_in else - ! change only one parameter per jump - ParaSelectMode = 2_i4 + ! change only one parameter per jump + ParaSelectMode = 2_i4 end if ! after how many iterations do we compute ac_ratio??? if (present(iter_burnin_in)) then - if (iter_burnin_in .le. 0_i4) then - stop 'Input argument iter_burn_in must be greater than 0!' - else - iter_burnin = iter_burnin_in - end if + if (iter_burnin_in .le. 0_i4) then + stop 'Input argument iter_burn_in must be greater than 0!' + else + iter_burnin = iter_burnin_in + end if else - iter_burnin = Max(250_i4, 1000_i4*n) + iter_burnin = Max(250_i4, 1000_i4 * n) end if ! how many iterations ('jumps') are performed in MCMC ! iter_mcmc_in is handled later properly (after acceptance ratio of burn_in is known) if (present(iter_mcmc_in)) then - if (iter_mcmc_in .le. 0_i4) then - stop 'Input argument iter_mcmc must be greater than 0!' - else - iter_mcmc = iter_mcmc_in - end if + if (iter_mcmc_in .le. 0_i4) then + stop 'Input argument iter_mcmc must be greater than 0!' + else + iter_mcmc = iter_mcmc_in + end if else - iter_mcmc = 1000_i4 * n + iter_mcmc = 1000_i4 * n end if if (present(chains_in)) then - if (chains_in .lt. 2_i4) then - stop 'Input argument chains must be at least 2!' - end if - chains = chains_in + if (chains_in .lt. 2_i4) then + stop 'Input argument chains must be at least 2!' + end if + chains = chains_in else - chains = 5_i4 + chains = 5_i4 end if if (present(stepsize_in)) then - stepsize = stepsize_in + stepsize = stepsize_in end if if (present(printflag_in)) then - printflag = printflag_in + printflag = printflag_in else - printflag = .false. + printflag = .false. end if !$ write(*,*) '--------------------------------------------------' @@ -1555,40 +1540,40 @@ END FUNCTION likelihood !$ write(*,*) '--------------------------------------------------' if (printflag) then - write(*,*) 'Following parameters will be sampled with MCMC: ',truepara + write(*, *) 'Following parameters will be sampled with MCMC: ', truepara end if - allocate(seeds(chains,3)) - allocate(save_state_1(chains,n_save_state)) - allocate(save_state_2(chains,n_save_state)) - allocate(save_state_3(chains,n_save_state)) + allocate(seeds(chains, 3)) + allocate(save_state_1(chains, n_save_state)) + allocate(save_state_2(chains, n_save_state)) + allocate(save_state_3(chains, n_save_state)) allocate(Ipos(chains), Ineg(chains), accRatio(chains)) allocate(vDotJ(chains), s2(chains)) allocate(sqrtR(size(para))) if (present(seed_in)) then - seeds(1,:) = (/ seed_in, seed_in + 1000_i8, seed_in + 2000_i8 /) + seeds(1, :) = (/ seed_in, seed_in + 1000_i8, seed_in + 2000_i8 /) else - ! Seeds depend on actual time - call get_timeseed(seeds(1,:)) + ! Seeds depend on actual time + call get_timeseed(seeds(1, :)) end if - do chain=2,chains - seeds(chain,:) = seeds(chain-1_i4,:) + 3000_i8 + do chain = 2, chains + seeds(chain, :) = seeds(chain - 1_i4, :) + 3000_i8 end do - do chain=1,chains - call xor4096(seeds(chain,1), RN1, save_state=save_state_1(chain,:)) - call xor4096(seeds(chain,2), RN2, save_state=save_state_2(chain,:)) - call xor4096g(seeds(chain,3), RN3, save_state=save_state_3(chain,:)) + do chain = 1, chains + call xor4096(seeds(chain, 1), RN1, save_state = save_state_1(chain, :)) + call xor4096(seeds(chain, 2), RN2, save_state = save_state_2(chain, :)) + call xor4096g(seeds(chain, 3), RN3, save_state = save_state_3(chain, :)) end do seeds = 0_i8 - parabest = para + parabest = para ! write(*,*) parabest ! initialize likelihood and sigma - likelibest = likelihood(parabest,1.0_dp,stddev_new=stddev_new,likeli_new=likeli_new) - likelibest = likeli_new + likelibest = likelihood(parabest, eval, 1.0_dp, stddev_new, likeli_new) + likelibest = likeli_new stddev_data = stddev_new !---------------------------------------------------------------------- @@ -1596,204 +1581,204 @@ END FUNCTION likelihood !---------------------------------------------------------------------- if (.not. present(stepsize_in)) then - if (printflag) then - write(*,*) '' - write(*,*) '--------------------------------------------------' - write(*,*) 'Starting Burn-In (iter_burnin = ',iter_burnin,')' - write(*,*) '--------------------------------------------------' - write(*,*) '' - end if - - ! INITIALIZATION - - ! probably too large, but large enough to store values of one markovchain - allocate(burnin_paras_part(iter_burnin,size(para))) - - parabestChanged = .true. - - ! ------------------------------------------------------------------------------------- - ! restarts if a better parameter set was found in between - ! ------------------------------------------------------------------------------------- - betterParaFound: do while (parabestChanged) - - if (allocated(burnin_paras)) deallocate(burnin_paras) - if (allocated(history_accRatio)) deallocate(history_accRatio) - - parabestChanged = .false. - stepsize = 1.0_dp - trial = 1_i4 - iStop = .false. - accMult = 1.01_dp - rejMult = 0.99_dp - !stddev_data = stddev_function(parabest) - !likelibest = likelihood(parabest,stddev_data,stddev_new=stddev_new,likeli_new=likeli_new) - !likelibest = likeli_new - !stddev_data = stddev_new - + if (printflag) then + write(*, *) '' + write(*, *) '--------------------------------------------------' + write(*, *) 'Starting Burn-In (iter_burnin = ', iter_burnin, ')' + write(*, *) '--------------------------------------------------' + write(*, *) '' + end if + + ! INITIALIZATION + + ! probably too large, but large enough to store values of one markovchain + allocate(burnin_paras_part(iter_burnin, size(para))) + + parabestChanged = .true. + + ! ------------------------------------------------------------------------------------- + ! restarts if a better parameter set was found in between + ! ------------------------------------------------------------------------------------- + betterParaFound : do while (parabestChanged) + + if (allocated(burnin_paras)) deallocate(burnin_paras) + if (allocated(history_accRatio)) deallocate(history_accRatio) + + parabestChanged = .false. + stepsize = 1.0_dp + trial = 1_i4 + iStop = .false. + accMult = 1.01_dp + rejMult = 0.99_dp + !stddev_data = stddev_function(parabest) + !likelibest = likelihood(parabest,stddev_data,stddev_new=stddev_new,likeli_new=likeli_new) + !likelibest = likeli_new + !stddev_data = stddev_new + + if (printflag) then + write(*, *) ' ' + write(*, *) 'Restart Burn-In with new approximation of std.dev. of data: ' + write(*, *) ' parabest = ', parabest + write(*, *) ' stddev = ', stddev_data + write(*, *) ' likelihood = ', likelibest + write(*, *) ' ssq = ', -2.0_dp * stddev_data**2 * likelibest + write(*, *) ' ' + end if + + + ! ---------------------------------------------------------------------------------- + ! repeats until convergence of acceptance ratio or better parameter set was found + ! ---------------------------------------------------------------------------------- + convergedBURNIN : do while ((.not. iStop) .and. (.not. parabestChanged)) + + Ipos = 0_i4 ! positive accepted + Ineg = 0_i4 ! negative accepted + paraold = parabest + likeliold = likelibest !likelihood(paraold,stddev_data) + + ! ------------------------------------------------------------------------------- + ! do a short-cut MCMC + ! ------------------------------------------------------------------------------- + markovchain : do markov = 1, iter_burnin + + ! (A) Generate new parameter set + ChangePara = .false. + paranew = paraold + ! using RN from chain #1 + call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & + save_state_2(1, :), & + save_state_3(1, :), & + paranew, ChangePara) + + ! (B) new likelihood + likelinew = likelihood(paranew, eval, stddev_data, stddev_new, likeli_new) + + oddsSwitch1 = .false. + if (loglike) then + oddsRatio = likelinew - likeliold + if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. + else + oddsRatio = likelinew / likeliold + if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. + end if + ! write(*,*) 'oddsRatio = ',oddsRatio + + ! (C) Accept or Reject? + If (oddsSwitch1) then + + ! positive accept + Ipos(1) = Ipos(1) + 1_i4 + paraold = paranew + likeliold = likelinew + where (changePara) + stepsize = stepsize * accMult + end where + if (likelinew .gt. likelibest) then + parabest = paranew + likeliold = likeli_new !JM + ! Here the sigma is reset! + likelibest = likeli_new + stddev_data = stddev_new + ! + parabestChanged = .true. + write(*, *) '' + write(*, *) 'best para changed: ', paranew + write(*, *) 'likelihood new: ', likelinew + write(*, *) '' + end if + burnin_paras_part(Ipos(1) + Ineg(1), :) = paranew(:) + ! write(*,*) 'positive accept' + + else + + call xor4096(seeds(1, 1), RN1, save_state = save_state_1(1, :)) + oddsSwitch2 = .false. + if (loglike) then + if (oddsRatio .lt. -700.0_dp) oddsRatio = -700.0_dp ! to avoid underflow + if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. + else + if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. + end if + + If (oddsSwitch2) then + + ! negative accept + Ineg(1) = Ineg(1) + 1_i4 + paraold = paranew + likeliold = likelinew + ! stddev_data = stddev_new !JM + where (changePara) + stepsize = stepsize * accMult + end where + burnin_paras_part(Ipos(1) + Ineg(1), :) = paranew(:) + ! write(*,*) 'negative accept' + + else + + ! reject + where (changePara) + stepsize = stepsize * rejMult + end where + ! write(*,*) 'reject' + + end if + + end if + + ! write(*,*) '' + + end do markovchain + + accRatio(1) = real(Ipos(1) + Ineg(1), dp) / real(iter_burnin, dp) if (printflag) then - write(*,*) ' ' - write(*,*) 'Restart Burn-In with new approximation of std.dev. of data: ' - write(*,*) ' parabest = ', parabest - write(*,*) ' stddev = ', stddev_data - write(*,*) ' likelihood = ', likelibest - write(*,*) ' ssq = ', -2.0_dp * stddev_data**2 * likelibest - write(*,*) ' ' + write(str, '(A,I03,A)') '(A7,I4,A15,F5.3,A17,', size(para, 1), '(E9.2,1X),A1)' + write(*, str) 'trial #', trial, ' acc_ratio = ', accRatio(1), ' (stepsize = ', stepsize, ')' end if + if (Ipos(1) + Ineg(1) .gt. 0_i4) then + call append(burnin_paras, burnin_paras_part(1 : Ipos(1) + Ineg(1), :)) + end if - ! ---------------------------------------------------------------------------------- - ! repeats until convergence of acceptance ratio or better parameter set was found - ! ---------------------------------------------------------------------------------- - convergedBURNIN: do while ( (.not. iStop) .and. (.not. parabestChanged) ) - - Ipos = 0_i4 ! positive accepted - Ineg = 0_i4 ! negative accepted - paraold = parabest - likeliold = likelibest !likelihood(paraold,stddev_data) - - ! ------------------------------------------------------------------------------- - ! do a short-cut MCMC - ! ------------------------------------------------------------------------------- - markovchain: do markov=1, iter_burnin - - ! (A) Generate new parameter set - ChangePara = .false. - paranew = paraold - ! using RN from chain #1 - call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & - save_state_2(1,:),& - save_state_3(1,:),& - paranew,ChangePara) - - ! (B) new likelihood - likelinew = likelihood(paranew,stddev_data,stddev_new=stddev_new,likeli_new=likeli_new) - - oddsSwitch1 = .false. - if (loglike) then - oddsRatio = likelinew-likeliold - if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. - else - oddsRatio = likelinew/likeliold - if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. - end if - ! write(*,*) 'oddsRatio = ',oddsRatio - - ! (C) Accept or Reject? - If (oddsSwitch1) then - - ! positive accept - Ipos(1) = Ipos(1) + 1_i4 - paraold = paranew - likeliold = likelinew - where (changePara) - stepsize = stepsize * accMult - end where - if (likelinew .gt. likelibest) then - parabest = paranew - likeliold = likeli_new !JM - ! Here the sigma is reset! - likelibest = likeli_new - stddev_data = stddev_new - ! - parabestChanged = .true. - write(*,*) '' - write(*,*) 'best para changed: ',paranew - write(*,*) 'likelihood new: ',likelinew - write(*,*) '' - end if - burnin_paras_part(Ipos(1)+Ineg(1),:) = paranew(:) - ! write(*,*) 'positive accept' - - else - - call xor4096(seeds(1,1), RN1, save_state=save_state_1(1,:)) - oddsSwitch2 = .false. - if (loglike) then - if (oddsRatio .lt. -700.0_dp) oddsRatio = -700.0_dp ! to avoid underflow - if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. - else - if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. - end if - - If ( oddsSwitch2 ) then - - ! negative accept - Ineg(1) = Ineg(1) + 1_i4 - paraold = paranew - likeliold = likelinew - ! stddev_data = stddev_new !JM - where (changePara) - stepsize = stepsize * accMult - end where - burnin_paras_part(Ipos(1)+Ineg(1),:) = paranew(:) - ! write(*,*) 'negative accept' - - else - - ! reject - where (changePara) - stepsize = stepsize * rejMult - end where - ! write(*,*) 'reject' - - end if - - end if + ! adjust acceptance multiplier + if (accRatio(1) .lt. 0.234_dp) accMult = accMult * 0.99_dp + if (accRatio(1) .gt. 0.441_dp) accMult = accMult * 1.01_dp - ! write(*,*) '' - - end do markovchain - - accRatio(1) = real(Ipos(1) + Ineg(1),dp) / real(iter_burnin,dp) - if (printflag) then - write(str,'(A,I03,A)') '(A7,I4,A15,F5.3,A17,',size(para,1),'(E9.2,1X),A1)' - write(*,str) 'trial #',trial,' acc_ratio = ',accRatio(1),' (stepsize = ',stepsize,')' - end if - - if (Ipos(1)+Ineg(1) .gt. 0_i4) then - call append(burnin_paras, burnin_paras_part(1:Ipos(1)+Ineg(1),:)) - end if - - ! adjust acceptance multiplier - if (accRatio(1) .lt. 0.234_dp) accMult = accMult * 0.99_dp - if (accRatio(1) .gt. 0.441_dp) accMult = accMult * 1.01_dp - - ! store good accRatios in history and delete complete history if bad one appears - if (accRatio(1) .lt. 0.234_dp .or. accRatio(1) .gt. 0.441_dp) then - if( allocated(history_accRatio) ) deallocate(history_accRatio) - else - call append(history_accRatio, accRatio(1)) - end if - - ! if in history more than 10 values, check for mean and variance - if ( allocated(history_accRatio) ) then - accRatio_n = size(history_accRatio,1) - if ( accRatio_n .ge. 10_i4 ) then - idummy = accRatio_n-9_i4 - accRatio_stddev = stddev( history_accRatio(idummy:accRatio_n) ) - - ! Check of Convergence - if ( (accRatio_stddev .lt. Sqrt( 1._dp/12._dp * 0.05_dp**2 )) ) then - iStop = .true. - if (printflag) then - write(*,*) '' - write(*,*) 'STOP BURN-IN with accaptence ratio of ', history_accRatio(accRatio_n) - write(*,*) 'final stepsize: ',stepsize - if (parabestChanged) then - write(*,*) 'better parameter set was found: ',parabest - write(*,*) 'with likelihood: ',likelibest - end if - end if - end if + ! store good accRatios in history and delete complete history if bad one appears + if (accRatio(1) .lt. 0.234_dp .or. accRatio(1) .gt. 0.441_dp) then + if(allocated(history_accRatio)) deallocate(history_accRatio) + else + call append(history_accRatio, accRatio(1)) + end if + ! if in history more than 10 values, check for mean and variance + if (allocated(history_accRatio)) then + accRatio_n = size(history_accRatio, 1) + if (accRatio_n .ge. 10_i4) then + idummy = accRatio_n - 9_i4 + accRatio_stddev = stddev(history_accRatio(idummy : accRatio_n)) + + ! Check of Convergence + if ((accRatio_stddev .lt. Sqrt(1._dp / 12._dp * 0.05_dp**2))) then + iStop = .true. + if (printflag) then + write(*, *) '' + write(*, *) 'STOP BURN-IN with accaptence ratio of ', history_accRatio(accRatio_n) + write(*, *) 'final stepsize: ', stepsize + if (parabestChanged) then + write(*, *) 'better parameter set was found: ', parabest + write(*, *) 'with likelihood: ', likelibest + end if end if - end if + end if + + end if + end if - trial = trial + 1_i4 + trial = trial + 1_i4 - end do convergedBURNIN + end do convergedBURNIN - end do betterParaFound + end do betterParaFound end if @@ -1807,11 +1792,11 @@ END FUNCTION likelihood initial_paraset_mcmc = parabest if (printflag) then - write(*,*) '' - write(*,*) '--------------------------------------------------' - write(*,*) 'Starting MCMC (chains = ',chains,', iter_mcmc = ',iter_mcmc,')' - write(*,*) '--------------------------------------------------' - write(*,*) '' + write(*, *) '' + write(*, *) '--------------------------------------------------' + write(*, *) 'Starting MCMC (chains = ', chains, ', iter_mcmc = ', iter_mcmc, ')' + write(*, *) '--------------------------------------------------' + write(*, *) '' end if Ipos(:) = 0_i4 ! positive accepted Ineg(:) = 0_i4 ! negative accepted @@ -1819,240 +1804,240 @@ END FUNCTION likelihood ! if all parameters converged: Sqrt(R_i) < 1.1 (see Gelman et. al: Baysian Data Analysis, p. 331ff converged = .False. - convergedMCMC: do while (.not. converged) - - if (.not. allocated(mcmc_paras_3d)) then - ! first mcmc iterations for all chains - ! probably too large, but will be resized at the end - allocate(mcmc_paras_3d(iter_mcmc,size(para),chains)) - else - ! later mcmc iterations for all chains: iter_mcmc was increased - idummy = Minval(Ipos+Ineg) - - ! resize mcmc_paras_3d - allocate(tmp(idummy,size(para),chains)) - tmp(:,:,:) = mcmc_paras_3d(1:idummy,:,:) - deallocate(mcmc_paras_3d) - allocate(mcmc_paras_3d(iter_mcmc,size(para),chains)) - mcmc_paras_3d(1:idummy,:,:) = tmp(:,:,:) - deallocate(tmp) - end if - - !$OMP parallel default(shared) & - !$OMP private(chain, paraold, paranew, likeliold, likelinew, oddsSwitch1, oddsSwitch2, RN1, oddsRatio, ChangePara) - !$OMP do - parallelchain: do chain=1, chains - - if (Ipos(chain)+Ineg(chain) .eq. 0_i4) then - paraold = initial_paraset_mcmc ! = parabest of burn-in + convergedMCMC : do while (.not. converged) + + if (.not. allocated(mcmc_paras_3d)) then + ! first mcmc iterations for all chains + ! probably too large, but will be resized at the end + allocate(mcmc_paras_3d(iter_mcmc, size(para), chains)) + else + ! later mcmc iterations for all chains: iter_mcmc was increased + idummy = Minval(Ipos + Ineg) + + ! resize mcmc_paras_3d + allocate(tmp(idummy, size(para), chains)) + tmp(:, :, :) = mcmc_paras_3d(1 : idummy, :, :) + deallocate(mcmc_paras_3d) + allocate(mcmc_paras_3d(iter_mcmc, size(para), chains)) + mcmc_paras_3d(1 : idummy, :, :) = tmp(:, :, :) + deallocate(tmp) + end if + + !$OMP parallel default(shared) & + !$OMP private(chain, paraold, paranew, likeliold, likelinew, oddsSwitch1, oddsSwitch2, RN1, oddsRatio, ChangePara) + !$OMP do + parallelchain : do chain = 1, chains + + if (Ipos(chain) + Ineg(chain) .eq. 0_i4) then + paraold = initial_paraset_mcmc ! = parabest of burn-in + else + paraold = mcmc_paras_3d(Ipos(chain) + Ineg(chain), :, chain) + end if + likeliold = likelihood(paraold, eval, stddev_data) + + markovchainMCMC : do + + ! (A) Generate new parameter set + ChangePara = .false. + paranew = paraold + + call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & + save_state_2(chain, :), & + save_state_3(chain, :), & + paranew, ChangePara) + + ! (B) new likelihood + likelinew = likelihood(paranew, eval, stddev_data) + oddsSwitch1 = .false. + if (loglike) then + oddsRatio = likelinew - likeliold + if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. else - paraold = mcmc_paras_3d(Ipos(chain)+Ineg(chain),:,chain) + oddsRatio = likelinew / likeliold + if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. end if - likeliold = likelihood(paraold,stddev_data) - - markovchainMCMC: do - - ! (A) Generate new parameter set - ChangePara = .false. - paranew = paraold - - call GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & - save_state_2(chain,:),& - save_state_3(chain,:),& - paranew,ChangePara) - - ! (B) new likelihood - likelinew = likelihood(paranew,stddev_data) - oddsSwitch1 = .false. - if (loglike) then - oddsRatio = likelinew-likeliold - if (oddsRatio .gt. 0.0_dp) oddsSwitch1 = .true. - else - oddsRatio = likelinew/likeliold - if (oddsRatio .gt. 1.0_dp) oddsSwitch1 = .true. - end if - - ! (C) Accept or Reject? - If (oddsSwitch1) then - - ! positive accept - Ipos(chain) = Ipos(chain) + 1_i4 - paraold = paranew - likeliold = likelinew - mcmc_paras_3d(Ipos(chain)+Ineg(chain),:,chain) = paranew(:) - - if ( printflag ) then - if ( (Ipos(chain)+Ineg(chain) .gt. 0_i4 ) .and. & - (mod(Ipos(chain)+Ineg(chain),10000_i4)) .eq. 0 ) then - write(*,*) 'Chain ',chain,': Done ',Ipos(chain)+Ineg(chain),' samples ...' - end if - end if - if (likelinew .gt. likelibest) then - parabest = paranew - likelibest = likelinew - if (printflag) then - write(*,*) '' - write(*,*) 'best para changed: ',paranew - write(*,*) 'likelihood new: ',likelinew - write(*,*) '' - end if - end if + ! (C) Accept or Reject? + If (oddsSwitch1) then + + ! positive accept + Ipos(chain) = Ipos(chain) + 1_i4 + paraold = paranew + likeliold = likelinew + mcmc_paras_3d(Ipos(chain) + Ineg(chain), :, chain) = paranew(:) + + if (printflag) then + if ((Ipos(chain) + Ineg(chain) .gt. 0_i4) .and. & + (mod(Ipos(chain) + Ineg(chain), 10000_i4)) .eq. 0) then + write(*, *) 'Chain ', chain, ': Done ', Ipos(chain) + Ineg(chain), ' samples ...' + end if + end if + + if (likelinew .gt. likelibest) then + parabest = paranew + likelibest = likelinew + if (printflag) then + write(*, *) '' + write(*, *) 'best para changed: ', paranew + write(*, *) 'likelihood new: ', likelinew + write(*, *) '' + end if + end if - else + else - call xor4096(seeds(chain,1), RN1, save_state=save_state_1(chain,:)) - oddsSwitch2 = .false. - if (loglike) then - if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. - else - if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. + call xor4096(seeds(chain, 1), RN1, save_state = save_state_1(chain, :)) + oddsSwitch2 = .false. + if (loglike) then + if (rn1 .lt. exp(oddsRatio)) oddsSwitch2 = .true. + else + if (rn1 .lt. oddsRatio) oddsSwitch2 = .true. + end if + + If (oddsSwitch2) then + + ! negative accept + Ineg(chain) = Ineg(chain) + 1_i4 + paraold = paranew + likeliold = likelinew + mcmc_paras_3d(Ipos(chain) + Ineg(chain), :, chain) = paranew(:) + + if (printflag) then + if ((Ipos(chain) + Ineg(chain) .gt. 0_i4) .and. & + (mod(Ipos(chain) + Ineg(chain), 10000_i4)) .eq. 0) then + write(*, *) 'Chain ', chain, ': Done ', Ipos(chain) + Ineg(chain), ' samples ...' end if + end if - If ( oddsSwitch2 ) then - - ! negative accept - Ineg(chain) = Ineg(chain) + 1_i4 - paraold = paranew - likeliold = likelinew - mcmc_paras_3d(Ipos(chain)+Ineg(chain),:,chain) = paranew(:) - - if ( printflag ) then - if ( (Ipos(chain)+Ineg(chain) .gt. 0_i4 ) .and. & - (mod(Ipos(chain)+Ineg(chain),10000_i4)) .eq. 0 ) then - write(*,*) 'Chain ',chain,': Done ',Ipos(chain)+Ineg(chain),' samples ...' - end if - end if + end if - end if - - end if - - ! enough samples were found - if ( (Ipos(chain)+Ineg(chain) .gt. 0_i4 ) .and. & - (mod(Ipos(chain)+Ineg(chain),iter_mcmc) .eq. 0_i4 ) ) exit - - end do markovchainMCMC - - end do parallelchain - !$OMP end do - !$OMP end parallel - - ! write parameter sets to temporal file - if (present(tmp_file)) then - ! splitting into path and filename - slash_pos = index(tmp_file, '/', .true.) - len_filename = len_trim(tmp_file) - path = tmp_file(1:slash_pos) - filename = tmp_file(slash_pos+1:len_filename) - ! - do chain=1,chains - write(str,*) chain - write(outputfile,*) trim(adjustl(path)), trim(adjustl(str)), '_' , trim(adjustl(filename)) - if (present(iter_mcmc_in)) then - allocate(tmp(iter_mcmc_in,size(para,1),1)) - tmp(:,:,1) = mcmc_paras_3d(iter_mcmc-iter_mcmc_in+1_i4:iter_mcmc,:,chain) - if (iter_mcmc .ne. iter_mcmc_in) then - ! append - call dump_netcdf(trim(adjustl(outputfile)), tmp, append=.true.) - else - ! first time of writing - call dump_netcdf(trim(adjustl(outputfile)), tmp) - end if - deallocate(tmp) - else - allocate(tmp(1000_i4*n,size(para,1),1)) - tmp(:,:,1) = mcmc_paras_3d(iter_mcmc-(1000_i4*n)+1_i4:iter_mcmc,:,chain) - if (iter_mcmc .ne. 1000_i4*n) then - ! append - call dump_netcdf(trim(adjustl(outputfile)), tmp, append=.true.) - else - ! first time of writing - call dump_netcdf(trim(adjustl(outputfile)), tmp) - end if - deallocate(tmp) - end if - end do - end if - - ! test for convergence: Gelman et. al: Baysian Data Analysis, p. 331ff - ! sqrt(R) = sqrt( ( (n-1)/n * W + 1/n * B ) / W ) < 1.1 for each parameter - ! n ... last half of the sequence - ! W ... within sequence variance - ! B ... between chain variance - - if ( printflag ) then - write(*,*) ' ' - write(*,*) 'Checking for convergence ....' - end if - sqrtR = 0.0_dp - n_end = minval(Ipos+Ineg) - n_start = n_end / 2_i4 + 1_i4 - - do iPar=1, size(truepara) - - ! Between chain variances - do chain=1, chains - vDotJ(chain) = 1.0_dp / real(n_end-n_start+1_i4,dp) * & - sum(mcmc_paras_3d(n_start:n_end,truepara(iPar),chain)) - end do - vDotDot = 1.0_dp / real(chains,dp) * sum(vDotJ) - B = real(n_end -n_start + 1_i4,dp) / real(chains-1_i4,dp) * & - sum((vDotJ - vDotDot)*(vDotJ - vDotDot)) - - ! Within chain variances - do chain=1, chains - s2(chain) = 1.0_dp / real(n_end-n_start,dp) * & - sum((mcmc_paras_3d(n_start:n_end,truepara(iPar),chain)-vDotJ(chain))**2) - end do - W = 1.0_dp / real(chains,dp) * Sum(s2) - - ! ratio sqrtR - if ( (w .lt. tiny(1.0_dp)) .and. (b .lt. tiny(1.0_dp))) then - ! Mathematica says that this is the limit, if w and b both go to zero - sqrtR(truepara(iPar)) = sqrt(real(n_end-n_start,dp) / real(n_end-n_start+1_i4,dp)) - else - sqrtR(truepara(iPar)) = real(n_end-n_start,dp) / real(n_end-n_start+1_i4,dp) * W + & - 1.0_dp / real(n_end-n_start+1_i4,dp) * B - sqrtR(truepara(iPar)) = sqrt( sqrtR(truepara(iPar)) / W ) end if - end do - if (printflag) then - do i=1, size(para) - if ( sqrtR(i) .gt. 1.1_dp ) then - write(*,*) ' sqrtR para #',i,' : ', sqrtR(i),' <-- FAILED' - else - write(*,*) ' sqrtR para #',i,' : ', sqrtR(i) - end if - end do - end if - if ( all(sqrtR .lt. 1.1_dp) ) then - converged = .true. - if ( printflag ) then - write(*,*) ' --> converged (all less than 1.1)' - write(*,*) ' ' - end if - else - ! increase number of iterations + + ! enough samples were found + if ((Ipos(chain) + Ineg(chain) .gt. 0_i4) .and. & + (mod(Ipos(chain) + Ineg(chain), iter_mcmc) .eq. 0_i4)) exit + + end do markovchainMCMC + + end do parallelchain + !$OMP end do + !$OMP end parallel + + ! write parameter sets to temporal file + if (present(tmp_file)) then + ! splitting into path and filename + slash_pos = index(tmp_file, '/', .true.) + len_filename = len_trim(tmp_file) + path = tmp_file(1 : slash_pos) + filename = tmp_file(slash_pos + 1 : len_filename) + ! + do chain = 1, chains + write(str, *) chain + write(outputfile, *) trim(adjustl(path)), trim(adjustl(str)), '_', trim(adjustl(filename)) if (present(iter_mcmc_in)) then - iter_mcmc = iter_mcmc + iter_mcmc_in + allocate(tmp(iter_mcmc_in, size(para, 1), 1)) + tmp(:, :, 1) = mcmc_paras_3d(iter_mcmc - iter_mcmc_in + 1_i4 : iter_mcmc, :, chain) + if (iter_mcmc .ne. iter_mcmc_in) then + ! append + call dump_netcdf(trim(adjustl(outputfile)), tmp, append = .true.) + else + ! first time of writing + call dump_netcdf(trim(adjustl(outputfile)), tmp) + end if + deallocate(tmp) else - iter_mcmc = iter_mcmc + 1000_i4 * n + allocate(tmp(1000_i4 * n, size(para, 1), 1)) + tmp(:, :, 1) = mcmc_paras_3d(iter_mcmc - (1000_i4 * n) + 1_i4 : iter_mcmc, :, chain) + if (iter_mcmc .ne. 1000_i4 * n) then + ! append + call dump_netcdf(trim(adjustl(outputfile)), tmp, append = .true.) + else + ! first time of writing + call dump_netcdf(trim(adjustl(outputfile)), tmp) + end if + deallocate(tmp) end if - - if ( printflag ) then - write(*,*) ' --> not converged (not all less than 1.1)' - write(*,*) ' increasing iterations to ',iter_mcmc - write(*,*) ' ' + end do + end if + + ! test for convergence: Gelman et. al: Baysian Data Analysis, p. 331ff + ! sqrt(R) = sqrt( ( (n-1)/n * W + 1/n * B ) / W ) < 1.1 for each parameter + ! n ... last half of the sequence + ! W ... within sequence variance + ! B ... between chain variance + + if (printflag) then + write(*, *) ' ' + write(*, *) 'Checking for convergence ....' + end if + sqrtR = 0.0_dp + n_end = minval(Ipos + Ineg) + n_start = n_end / 2_i4 + 1_i4 + + do iPar = 1, size(truepara) + + ! Between chain variances + do chain = 1, chains + vDotJ(chain) = 1.0_dp / real(n_end - n_start + 1_i4, dp) * & + sum(mcmc_paras_3d(n_start : n_end, truepara(iPar), chain)) + end do + vDotDot = 1.0_dp / real(chains, dp) * sum(vDotJ) + B = real(n_end - n_start + 1_i4, dp) / real(chains - 1_i4, dp) * & + sum((vDotJ - vDotDot) * (vDotJ - vDotDot)) + + ! Within chain variances + do chain = 1, chains + s2(chain) = 1.0_dp / real(n_end - n_start, dp) * & + sum((mcmc_paras_3d(n_start : n_end, truepara(iPar), chain) - vDotJ(chain))**2) + end do + W = 1.0_dp / real(chains, dp) * Sum(s2) + + ! ratio sqrtR + if ((w .lt. tiny(1.0_dp)) .and. (b .lt. tiny(1.0_dp))) then + ! Mathematica says that this is the limit, if w and b both go to zero + sqrtR(truepara(iPar)) = sqrt(real(n_end - n_start, dp) / real(n_end - n_start + 1_i4, dp)) + else + sqrtR(truepara(iPar)) = real(n_end - n_start, dp) / real(n_end - n_start + 1_i4, dp) * W + & + 1.0_dp / real(n_end - n_start + 1_i4, dp) * B + sqrtR(truepara(iPar)) = sqrt(sqrtR(truepara(iPar)) / W) + end if + end do + if (printflag) then + do i = 1, size(para) + if (sqrtR(i) .gt. 1.1_dp) then + write(*, *) ' sqrtR para #', i, ' : ', sqrtR(i), ' <-- FAILED' + else + write(*, *) ' sqrtR para #', i, ' : ', sqrtR(i) end if - end if + end do + end if + if (all(sqrtR .lt. 1.1_dp)) then + converged = .true. + if (printflag) then + write(*, *) ' --> converged (all less than 1.1)' + write(*, *) ' ' + end if + else + ! increase number of iterations + if (present(iter_mcmc_in)) then + iter_mcmc = iter_mcmc + iter_mcmc_in + else + iter_mcmc = iter_mcmc + 1000_i4 * n + end if + + if (printflag) then + write(*, *) ' --> not converged (not all less than 1.1)' + write(*, *) ' increasing iterations to ', iter_mcmc + write(*, *) ' ' + end if + end if end do convergedMCMC ! reshape of mcmc_paras_3d: return only 2d matrix mcmc_paras - allocate(mcmc_paras(size(mcmc_paras_3d,1)*size(mcmc_paras_3d,3),size(mcmc_paras_3d,2))) - do chain=1, chains - mcmc_paras( (chain-1_i4)*size(mcmc_paras_3d,1)+1_i4 : chain*size(mcmc_paras_3d,1),:) = mcmc_paras_3d(:,:,chain) + allocate(mcmc_paras(size(mcmc_paras_3d, 1) * size(mcmc_paras_3d, 3), size(mcmc_paras_3d, 2))) + do chain = 1, chains + mcmc_paras((chain - 1_i4) * size(mcmc_paras_3d, 1) + 1_i4 : chain * size(mcmc_paras_3d, 1), :) = mcmc_paras_3d(:, :, chain) end do RETURN @@ -2063,26 +2048,26 @@ END SUBROUTINE mcmc_stddev_dp !*************************************************** ! - real(DP) function parGen_dp(old, dMax, oMin, oMax,RN,inbound) - use mo_kind, only: dp + real(DP) function parGen_dp(old, dMax, oMin, oMax, RN, inbound) + use mo_kind, only : dp implicit none ! - REAL(DP), intent(IN) :: old, dMax, oMin,oMax - REAL(DP), intent(IN) :: RN - LOGICAL,OPTIONAL,INTENT(OUT) :: inbound + REAL(DP), intent(IN) :: old, dMax, oMin, oMax + REAL(DP), intent(IN) :: RN + LOGICAL, OPTIONAL, INTENT(OUT) :: inbound ! local - LOGICAL :: inbound2 + LOGICAL :: inbound2 ! inbound2 = .true. - parGen_dp = old + (rn*2.0_dp*dMax - dMax) + parGen_dp = old + (rn * 2.0_dp * dMax - dMax) if (parGen_dp < oMin) then - parGen_dp = oMin - inbound2 = .false. + parGen_dp = oMin + inbound2 = .false. elseif(parGen_dp > oMax)then - parGen_dp = oMax - inbound2 = .false. + parGen_dp = oMax + inbound2 = .false. end if if (present(inbound)) inbound = inbound2 @@ -2093,23 +2078,23 @@ end function parGen_dp ! normalized Parameter Change ! ************************************************************************ - real(DP) function parGenNorm_dp(old, dMax, oMin, oMax,RN,inbound) - use mo_kind, only: dp + real(DP) function parGenNorm_dp(old, dMax, oMin, oMax, RN, inbound) + use mo_kind, only : dp implicit none ! - REAL(DP), intent(IN) :: old, dMax, oMin,oMax - REAL(DP), intent(IN) :: RN - LOGICAL,OPTIONAL,INTENT(OUT) :: inbound + REAL(DP), intent(IN) :: old, dMax, oMin, oMax + REAL(DP), intent(IN) :: RN + LOGICAL, OPTIONAL, INTENT(OUT) :: inbound ! LOCAL VARIABLES - REAL(DP) :: RN_scale ! scaled RN - REAL(DP) :: old_scaled ! for normalization - LOGICAL :: inbound2 + REAL(DP) :: RN_scale ! scaled RN + REAL(DP) :: old_scaled ! for normalization + LOGICAL :: inbound2 - inbound2 =.true. + inbound2 = .true. !(1) normalize - old_scaled = ( old - oMin) / ( oMax - oMin) + old_scaled = (old - oMin) / (oMax - oMin) !(2) scale RN = [-dMax, dMax] !RN_scale = (RN * 2.0_dp * dMax) - dMax @@ -2130,73 +2115,73 @@ real(DP) function parGenNorm_dp(old, dMax, oMin, oMax,RN,inbound) if (present(inbound)) inbound = inbound2 !(4) convert back to original range - parGenNorm_dp = parGenNorm_dp * ( oMax - oMin) + oMin + parGenNorm_dp = parGenNorm_dp * (oMax - oMin) + oMin end function parGenNorm_dp recursive subroutine GenerateNewParameterset_dp(ParaSelectMode, paraold, truepara, rangePar, stepsize, & - save_state_2,save_state_3,paranew,ChangePara) - - integer(i4), intent(in) :: ParaSelectMode - real(dp), dimension(:), intent(in) :: paraold - integer(i4), dimension(:), intent(in) :: truepara - real(dp), dimension(:,:), intent(in) :: rangePar - real(dp), dimension(:), intent(in) :: stepsize - integer(I8), dimension(n_save_state), intent(inout) :: save_state_2 ! optional argument for restarting RN stream 2 - integer(I8), dimension(n_save_state), intent(inout) :: save_state_3 ! optional argument for restarting RN stream 3 - real(dp), dimension(size(paraold)), intent(out) :: paranew - logical, dimension(size(paraold)), intent(out) :: ChangePara + save_state_2, save_state_3, paranew, ChangePara) + + integer(i4), intent(in) :: ParaSelectMode + real(dp), dimension(:), intent(in) :: paraold + integer(i4), dimension(:), intent(in) :: truepara + real(dp), dimension(:, :), intent(in) :: rangePar + real(dp), dimension(:), intent(in) :: stepsize + integer(I8), dimension(n_save_state), intent(inout) :: save_state_2 ! optional argument for restarting RN stream 2 + integer(I8), dimension(n_save_state), intent(inout) :: save_state_3 ! optional argument for restarting RN stream 3 + real(dp), dimension(size(paraold)), intent(out) :: paranew + logical, dimension(size(paraold)), intent(out) :: ChangePara ! local variables - REAL(DP) :: RN2, RN3 - logical :: inbound - integer(i4) :: i, iPar + REAL(DP) :: RN2, RN3 + logical :: inbound + integer(i4) :: i, iPar paranew = paraold ChangePara = .False. select case(ParaSelectMode) case(1_i4) ! change half of the parameters - do i=1,size(truepara) - call xor4096(0_i8,RN2, save_state=save_state_2) - if ( RN2 > 0.5_dp ) then - iPar = truepara(i) - inbound = .false. - call xor4096(0_i8,RN3, save_state=save_state_3) - paranew(iPar) = parGenNorm_dp( paraold(iPar), stepsize(iPar), rangePar(iPar,1), rangePar(iPar,2),RN3,inbound) - ChangePara(iPar) = .True. - end if - end do - ! if no parameter was selected, recall and change one - if (count(ChangePara) .eq. 0_i4) then - call xor4096(0_i8,RN2, save_state=save_state_2) - iPar = truepara(int(( RN2 * real(size(truepara),dp)) + 1.0_dp, i4 )) + do i = 1, size(truepara) + call xor4096(0_i8, RN2, save_state = save_state_2) + if (RN2 > 0.5_dp) then + iPar = truepara(i) inbound = .false. - call xor4096(0_i8,RN3, save_state=save_state_3) - paranew(iPar) = parGenNorm_dp( paraold(iPar), stepsize(iPar), rangePar(iPar,1), rangePar(iPar,2),RN3,inbound) + call xor4096(0_i8, RN3, save_state = save_state_3) + paranew(iPar) = parGenNorm_dp(paraold(iPar), stepsize(iPar), rangePar(iPar, 1), rangePar(iPar, 2), RN3, inbound) ChangePara(iPar) = .True. - end if + end if + end do + ! if no parameter was selected, recall and change one + if (count(ChangePara) .eq. 0_i4) then + call xor4096(0_i8, RN2, save_state = save_state_2) + iPar = truepara(int((RN2 * real(size(truepara), dp)) + 1.0_dp, i4)) + inbound = .false. + call xor4096(0_i8, RN3, save_state = save_state_3) + paranew(iPar) = parGenNorm_dp(paraold(iPar), stepsize(iPar), rangePar(iPar, 1), rangePar(iPar, 2), RN3, inbound) + ChangePara(iPar) = .True. + end if case(2_i4) ! change only one - call xor4096(0_i8,RN2, save_state=save_state_2) - iPar = truepara(int(( RN2 * real(size(truepara),dp)) + 1.0_dp, i4 )) - inbound = .false. - call xor4096g(0_i8,RN3, save_state=save_state_3) - paranew(iPar) = parGenNorm_dp( paraold(iPar), stepsize(iPar), rangePar(iPar,1), rangePar(iPar,2),RN3,inbound) - ! write(*,*) 'p_old(',iPar,') = ',paraold(iPar) - ! write(*,*) 'p_new(',iPar,') = ',paranew(iPar) - ChangePara(iPar) = .True. + call xor4096(0_i8, RN2, save_state = save_state_2) + iPar = truepara(int((RN2 * real(size(truepara), dp)) + 1.0_dp, i4)) + inbound = .false. + call xor4096g(0_i8, RN3, save_state = save_state_3) + paranew(iPar) = parGenNorm_dp(paraold(iPar), stepsize(iPar), rangePar(iPar, 1), rangePar(iPar, 2), RN3, inbound) + ! write(*,*) 'p_old(',iPar,') = ',paraold(iPar) + ! write(*,*) 'p_new(',iPar,') = ',paranew(iPar) + ChangePara(iPar) = .True. case(3_i4) ! change all - do i=1,size(truepara) - iPar = truepara(i) - inbound = .false. - do while( .not. inbound) - call xor4096g(0_i8,RN2, save_state=save_state_3) - paranew(iPar) = parGenNorm_dp( paraold(iPar), stepsize(iPar), rangePar(iPar,1), rangePar(iPar,2),RN3,inbound) - end do - ChangePara(iPar) = .True. - end do + do i = 1, size(truepara) + iPar = truepara(i) + inbound = .false. + do while(.not. inbound) + call xor4096g(0_i8, RN2, save_state = save_state_3) + paranew(iPar) = parGenNorm_dp(paraold(iPar), stepsize(iPar), rangePar(iPar, 1), rangePar(iPar, 2), RN3, inbound) + end do + ChangePara(iPar) = .True. + end do end select diff --git a/src/lib/mo_message.f90 b/src/lib/mo_message.f90 index 34510345..00cd2207 100644 --- a/src/lib/mo_message.f90 +++ b/src/lib/mo_message.f90 @@ -33,7 +33,7 @@ MODULE mo_message ! Copyright 2011 Matthias Cuntz - USE mo_constants, ONLY: nout + USE mo_constants, ONLY : nout IMPLICIT NONE @@ -42,7 +42,7 @@ MODULE mo_message PUBLIC :: message_text ! dummy string to use in subroutines PUBLIC :: message ! versatile routine to write out strings in file or on screen - CHARACTER(len=1024) :: message_text = '' + CHARACTER(len = 1024) :: message_text = '' ! ------------------------------------------------------------------ @@ -110,36 +110,36 @@ SUBROUTINE message(t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, uni, advanc IMPLICIT NONE - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t01 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t02 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t03 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t04 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t05 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t06 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t07 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t08 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t09 - CHARACTER(len=*), INTENT(IN), OPTIONAL :: t10 - INTEGER, INTENT(IN), OPTIONAL :: uni - CHARACTER(len=*), INTENT(IN), OPTIONAL :: advance - - INTEGER :: iout - CHARACTER(len=32000) :: out - CHARACTER(len=3) :: iadv + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t01 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t02 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t03 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t04 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t05 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t06 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t07 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t08 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t09 + CHARACTER(len = *), INTENT(IN), OPTIONAL :: t10 + INTEGER, INTENT(IN), OPTIONAL :: uni + CHARACTER(len = *), INTENT(IN), OPTIONAL :: advance + + INTEGER :: iout + CHARACTER(len = 32000) :: out + CHARACTER(len = 3) :: iadv #ifdef GFORTRAN - CHARACTER(len=32000) :: nold + CHARACTER(len = 32000) :: nold #endif if (present(uni)) then - iout = uni + iout = uni else - iout = nout + iout = nout end if if (present(advance)) then - iadv = '' - iadv(1:min(len(advance),3)) = advance(1:min(len(advance),3)) + iadv = '' + iadv(1 : min(len(advance), 3)) = advance(1 : min(len(advance), 3)) else - iadv = 'yes' + iadv = 'yes' end if out = '' @@ -150,47 +150,47 @@ SUBROUTINE message(t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, uni, advanc ! write(out,'(A,A)') t10, trim(out) ! writes t10 twice into out. nold = out - if (present(t10)) write(out,'(A,A)') t10, trim(nold) + if (present(t10)) write(out, '(A,A)') t10, trim(nold) nold = out - if (present(t09)) write(out,'(A,A)') t09, trim(nold) + if (present(t09)) write(out, '(A,A)') t09, trim(nold) nold = out - if (present(t08)) write(out,'(A,A)') t08, trim(nold) + if (present(t08)) write(out, '(A,A)') t08, trim(nold) nold = out - if (present(t07)) write(out,'(A,A)') t07, trim(nold) + if (present(t07)) write(out, '(A,A)') t07, trim(nold) nold = out - if (present(t06)) write(out,'(A,A)') t06, trim(nold) + if (present(t06)) write(out, '(A,A)') t06, trim(nold) nold = out - if (present(t05)) write(out,'(A,A)') t05, trim(nold) + if (present(t05)) write(out, '(A,A)') t05, trim(nold) nold = out - if (present(t04)) write(out,'(A,A)') t04, trim(nold) + if (present(t04)) write(out, '(A,A)') t04, trim(nold) nold = out - if (present(t03)) write(out,'(A,A)') t03, trim(nold) + if (present(t03)) write(out, '(A,A)') t03, trim(nold) nold = out - if (present(t02)) write(out,'(A,A)') t02, trim(nold) + if (present(t02)) write(out, '(A,A)') t02, trim(nold) nold = out - if (present(t01)) write(out,'(A,A)') t01, trim(nold) + if (present(t01)) write(out, '(A,A)') t01, trim(nold) ! output at least one space otherwise some compilers get confused on Mac (empty assembler statement) - if ((lle(trim(out),'') .and. lge(trim(out),''))) then - nold = out - write(out,'(A,A)') trim(nold), ' ' + if ((lle(trim(out), '') .and. lge(trim(out), ''))) then + nold = out + write(out, '(A,A)') trim(nold), ' ' end if - write(iout,'(a)',advance=iadv) trim(out) + write(iout, '(a)', advance = iadv) trim(out) #else - if (present(t10)) out = t10//trim(out) - if (present(t09)) out = t09//trim(out) - if (present(t08)) out = t08//trim(out) - if (present(t07)) out = t07//trim(out) - if (present(t06)) out = t06//trim(out) - if (present(t05)) out = t05//trim(out) - if (present(t04)) out = t04//trim(out) - if (present(t03)) out = t03//trim(out) - if (present(t02)) out = t02//trim(out) - if (present(t01)) out = t01//trim(out) + if (present(t10)) out = t10 // trim(out) + if (present(t09)) out = t09 // trim(out) + if (present(t08)) out = t08 // trim(out) + if (present(t07)) out = t07 // trim(out) + if (present(t06)) out = t06 // trim(out) + if (present(t05)) out = t05 // trim(out) + if (present(t04)) out = t04 // trim(out) + if (present(t03)) out = t03 // trim(out) + if (present(t02)) out = t02 // trim(out) + if (present(t01)) out = t01 // trim(out) ! output at least one space otherwise some compilers get confused on Mac (empty assembler statement) - if ((lle(trim(out),'') .and. lge(trim(out),''))) then - write(iout,'(a)',advance=iadv) trim(out)//' ' + if ((lle(trim(out), '') .and. lge(trim(out), ''))) then + write(iout, '(a)', advance = iadv) trim(out) // ' ' else - write(iout,'(a)',advance=iadv) trim(out) + write(iout, '(a)', advance = iadv) trim(out) end if #endif diff --git a/src/lib/mo_moment.f90 b/src/lib/mo_moment.f90 index fbd8d102..729dd590 100644 --- a/src/lib/mo_moment.f90 +++ b/src/lib/mo_moment.f90 @@ -39,7 +39,7 @@ MODULE mo_moment ! Copyright 2011-2012 Matthias Cuntz - USE mo_kind, ONLY: i4, sp, dp + USE mo_kind, ONLY : i4, sp, dp IMPLICIT NONE @@ -108,7 +108,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE absdev - MODULE PROCEDURE absdev_sp, absdev_dp + MODULE PROCEDURE absdev_sp, absdev_dp END INTERFACE absdev ! ------------------------------------------------------------------ @@ -161,7 +161,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE average - MODULE PROCEDURE average_sp, average_dp + MODULE PROCEDURE average_sp, average_dp END INTERFACE average ! ------------------------------------------------------------------ @@ -215,7 +215,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE central_moment - MODULE PROCEDURE central_moment_sp, central_moment_dp + MODULE PROCEDURE central_moment_sp, central_moment_dp END INTERFACE central_moment ! ------------------------------------------------------------------ @@ -269,7 +269,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE central_moment_var - MODULE PROCEDURE central_moment_var_sp, central_moment_var_dp + MODULE PROCEDURE central_moment_var_sp, central_moment_var_dp END INTERFACE central_moment_var ! ------------------------------------------------------------------ @@ -325,7 +325,7 @@ MODULE mo_moment ! Written, Matthias Cuntz, Nov 2011 ! Modified, MC, Dec 2011 - covariance as <(x-)(y-)> instead of - INTERFACE correlation - MODULE PROCEDURE correlation_sp, correlation_dp + MODULE PROCEDURE correlation_sp, correlation_dp END INTERFACE correlation ! ------------------------------------------------------------------ @@ -381,7 +381,7 @@ MODULE mo_moment ! Written, Matthias Cuntz, Nov 2011 ! Modified, MC, Dec 2011 - covariance as <(x-)(y-)> instead of - INTERFACE covariance - MODULE PROCEDURE covariance_sp, covariance_dp + MODULE PROCEDURE covariance_sp, covariance_dp END INTERFACE covariance ! ------------------------------------------------------------------ @@ -435,7 +435,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE kurtosis - MODULE PROCEDURE kurtosis_sp, kurtosis_dp + MODULE PROCEDURE kurtosis_sp, kurtosis_dp END INTERFACE kurtosis ! ------------------------------------------------------------------ @@ -488,7 +488,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE mean - MODULE PROCEDURE mean_sp, mean_dp + MODULE PROCEDURE mean_sp, mean_dp END INTERFACE mean ! ------------------------------------------------------------------ @@ -545,7 +545,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE mixed_central_moment - MODULE PROCEDURE mixed_central_moment_sp, mixed_central_moment_dp + MODULE PROCEDURE mixed_central_moment_sp, mixed_central_moment_dp END INTERFACE mixed_central_moment ! ------------------------------------------------------------------ @@ -603,7 +603,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE mixed_central_moment_var - MODULE PROCEDURE mixed_central_moment_var_sp, mixed_central_moment_var_dp + MODULE PROCEDURE mixed_central_moment_var_sp, mixed_central_moment_var_dp END INTERFACE mixed_central_moment_var ! ------------------------------------------------------------------ @@ -670,7 +670,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE moment - MODULE PROCEDURE moment_sp, moment_dp + MODULE PROCEDURE moment_sp, moment_dp END INTERFACE moment ! ------------------------------------------------------------------ @@ -723,7 +723,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE skewness - MODULE PROCEDURE skewness_sp, skewness_dp + MODULE PROCEDURE skewness_sp, skewness_dp END INTERFACE skewness ! ------------------------------------------------------------------ @@ -778,7 +778,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE stddev - MODULE PROCEDURE stddev_sp, stddev_dp + MODULE PROCEDURE stddev_sp, stddev_dp END INTERFACE stddev ! ------------------------------------------------------------------ @@ -833,7 +833,7 @@ MODULE mo_moment ! HISTORY ! Written, Matthias Cuntz, Nov 2011 INTERFACE variance - MODULE PROCEDURE variance_sp, variance_dp + MODULE PROCEDURE variance_sp, variance_dp END INTERFACE variance ! ------------------------------------------------------------------ @@ -850,9 +850,9 @@ FUNCTION absdev_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: absdev_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: absdev_dp REAL(dp) :: n @@ -860,19 +860,19 @@ FUNCTION absdev_dp(dat, mask) LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error absdev_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error absdev_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'absdev_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'absdev_dp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n + ave = sum(dat(:), mask = maske) / n ! Sum of absolute deviation - absdev_dp = sum(abs(dat(:)-ave), mask=maske)/n + absdev_dp = sum(abs(dat(:) - ave), mask = maske) / n END FUNCTION absdev_dp @@ -881,9 +881,9 @@ FUNCTION absdev_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: absdev_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: absdev_sp REAL(sp) :: n @@ -891,19 +891,19 @@ FUNCTION absdev_sp(dat, mask) LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error absdev_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error absdev_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'absdev_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'absdev_sp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n + ave = sum(dat(:), mask = maske) / n ! Sum of absolute deviation - absdev_sp = sum(abs(dat(:)-ave), mask=maske)/n + absdev_sp = sum(abs(dat(:) - ave), mask = maske) / n END FUNCTION absdev_sp @@ -913,24 +913,24 @@ FUNCTION average_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: average_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: average_dp REAL(dp) :: n LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error average_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error average_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if ! Average - average_dp = sum(dat(:), mask=maske)/n + average_dp = sum(dat(:), mask = maske) / n END FUNCTION average_dp @@ -939,24 +939,24 @@ FUNCTION average_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: average_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: average_sp REAL(sp) :: n LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error average_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error average_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if ! Average - average_sp = sum(dat(:), mask=maske)/n + average_sp = sum(dat(:), mask = maske) / n END FUNCTION average_sp @@ -966,37 +966,37 @@ FUNCTION central_moment_dp(x, r, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: r - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: central_moment_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: r + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: central_moment_dp - REAL(dp) :: n, mx + REAL(dp) :: n, mx LOGICAL, DIMENSION(size(x)) :: maske if (r .lt. 0) then - central_moment_dp = 0.0_dp - return + central_moment_dp = 0.0_dp + return end if if (r .eq. 0) then - central_moment_dp = 1.0_dp - return + central_moment_dp = 1.0_dp + return end if if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error central_moment_dp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(x)) stop 'Error central_moment_dp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(x),dp) + maske(:) = .true. + n = real(size(x), dp) end if - if (n .le. (2.0_dp+tiny(2.0_dp))) stop 'central_moment_dp: n must be at least 3' + if (n .le. (2.0_dp + tiny(2.0_dp))) stop 'central_moment_dp: n must be at least 3' ! average - mx = sum(x, mask=maske) / n + mx = sum(x, mask = maske) / n ! central moment - central_moment_dp = sum((x-mx)**r, mask=maske) / n + central_moment_dp = sum((x - mx)**r, mask = maske) / n END FUNCTION central_moment_dp @@ -1005,37 +1005,37 @@ FUNCTION central_moment_sp(x, r, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: r - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: central_moment_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: r + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: central_moment_sp REAL(sp) :: n, mx LOGICAL, DIMENSION(size(x)) :: maske if (r .lt. 0) then - central_moment_sp = 0.0_sp - return + central_moment_sp = 0.0_sp + return end if if (r .eq. 0) then - central_moment_sp = 1.0_sp - return + central_moment_sp = 1.0_sp + return end if if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error central_moment_sp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(x)) stop 'Error central_moment_sp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(x),sp) + maske(:) = .true. + n = real(size(x), sp) end if - if (n .le. (2.0_sp+tiny(2.0_sp))) stop 'central_moment_sp: n must be at least 3' + if (n .le. (2.0_sp + tiny(2.0_sp))) stop 'central_moment_sp: n must be at least 3' ! average - mx = sum(x, mask=maske) / n + mx = sum(x, mask = maske) / n ! central moment - central_moment_sp = sum((x-mx)**r, mask=maske) / n + central_moment_sp = sum((x - mx)**r, mask = maske) / n END FUNCTION central_moment_sp @@ -1045,36 +1045,36 @@ FUNCTION central_moment_var_dp(x, r, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: r - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: central_moment_var_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: r + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: central_moment_var_dp REAL(dp) :: n, rr, u2r, ur, urm1, urp1, u2 LOGICAL, DIMENSION(size(x)) :: maske if (r.le.1) then - central_moment_var_dp = 0.0_dp - return + central_moment_var_dp = 0.0_dp + return end if if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error central_moment_var_dp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(x)) stop 'Error central_moment_var_dp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(x),dp) + maske(:) = .true. + n = real(size(x), dp) end if - if (n .le. (2.0_dp+tiny(2.0_dp))) stop 'central_moment_var_dp: n must be at least 3' + if (n .le. (2.0_dp + tiny(2.0_dp))) stop 'central_moment_var_dp: n must be at least 3' - u2r = central_moment(x, 2*r, mask=maske) - ur = central_moment(x, r, mask=maske) - urm1 = central_moment(x, r-1, mask=maske) - u2 = central_moment(x, 2, mask=maske) - urp1 = central_moment(x, r+1, mask=maske) - rr = real(r,dp) - central_moment_var_dp = (u2r - ur*ur + rr*rr*urm1*urm1*u2 - 2.0_dp*rr*urp1*urm1) / n + u2r = central_moment(x, 2 * r, mask = maske) + ur = central_moment(x, r, mask = maske) + urm1 = central_moment(x, r - 1, mask = maske) + u2 = central_moment(x, 2, mask = maske) + urp1 = central_moment(x, r + 1, mask = maske) + rr = real(r, dp) + central_moment_var_dp = (u2r - ur * ur + rr * rr * urm1 * urm1 * u2 - 2.0_dp * rr * urp1 * urm1) / n END FUNCTION central_moment_var_dp @@ -1083,36 +1083,36 @@ FUNCTION central_moment_var_sp(x, r, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - INTEGER(i4), INTENT(IN) :: r - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: central_moment_var_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + INTEGER(i4), INTENT(IN) :: r + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: central_moment_var_sp REAL(sp) :: n, rr, u2r, ur, urm1, urp1, u2 LOGICAL, DIMENSION(size(x)) :: maske if (r.le.1) then - central_moment_var_sp = 0.0_sp - return + central_moment_var_sp = 0.0_sp + return end if if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error central_moment_var_sp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(x)) stop 'Error central_moment_var_sp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(x),sp) + maske(:) = .true. + n = real(size(x), sp) end if - if (n .le. (2.0_sp+tiny(2.0_sp))) stop 'central_moment_var_sp: n must be at least 3' + if (n .le. (2.0_sp + tiny(2.0_sp))) stop 'central_moment_var_sp: n must be at least 3' - u2r = central_moment(x, 2*r, mask=maske) - ur = central_moment(x, r, mask=maske) - urm1 = central_moment(x, r-1, mask=maske) - u2 = central_moment(x, 2, mask=maske) - urp1 = central_moment(x, r+1, mask=maske) - rr = real(r,sp) - central_moment_var_sp = (u2r - ur*ur + rr*rr*urm1*urm1*u2 - 2.0_sp*rr*urp1*urm1) / n + u2r = central_moment(x, 2 * r, mask = maske) + ur = central_moment(x, r, mask = maske) + urm1 = central_moment(x, r - 1, mask = maske) + u2 = central_moment(x, 2, mask = maske) + urp1 = central_moment(x, r + 1, mask = maske) + rr = real(r, sp) + central_moment_var_sp = (u2r - ur * ur + rr * rr * urm1 * urm1 * u2 - 2.0_sp * rr * urp1 * urm1) / n END FUNCTION central_moment_var_sp @@ -1122,33 +1122,33 @@ FUNCTION correlation_dp(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - REAL(dp), DIMENSION(:), INTENT(IN) :: y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: correlation_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + REAL(dp), DIMENSION(:), INTENT(IN) :: y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: correlation_dp - REAL(dp) :: n - REAL(dp) :: mx, my - REAL(dp) :: sx, sy, covar + REAL(dp) :: n + REAL(dp) :: mx, my + REAL(dp) :: sx, sy, covar LOGICAL, DIMENSION(size(x)) :: maske if (size(x) .ne. size(y)) stop 'Error correlation_dp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error correlation_dp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(x)) stop 'Error correlation_dp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(x),dp) + maske(:) = .true. + n = real(size(x), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'correlation_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'correlation_dp: n must be at least 2' ! Mean and Stddev of x and y - call moment(x, mx, stddev=sx, mask=maske) - call moment(y, my, stddev=sy, mask=maske) - covar = sum((x-mx)*(y-my), mask=maske) / n + call moment(x, mx, stddev = sx, mask = maske) + call moment(y, my, stddev = sy, mask = maske) + covar = sum((x - mx) * (y - my), mask = maske) / n ! correlation - correlation_dp = covar / (sx*sy) + correlation_dp = covar / (sx * sy) END FUNCTION correlation_dp @@ -1157,33 +1157,33 @@ FUNCTION correlation_sp(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - REAL(sp), DIMENSION(:), INTENT(IN) :: y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: correlation_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + REAL(sp), DIMENSION(:), INTENT(IN) :: y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: correlation_sp - REAL(sp) :: n - REAL(sp) :: mx, my - REAL(sp) :: sx, sy, covar + REAL(sp) :: n + REAL(sp) :: mx, my + REAL(sp) :: sx, sy, covar LOGICAL, DIMENSION(size(x)) :: maske if (size(x) .ne. size(y)) stop 'Error correlation_sp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error correlation_sp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(x)) stop 'Error correlation_sp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(x),sp) + maske(:) = .true. + n = real(size(x), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'correlation_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'correlation_sp: n must be at least 2' ! Mean and Stddev of x and y - call moment(x, mx, stddev=sx, mask=maske) - call moment(y, my, stddev=sy, mask=maske) - covar = sum((x-mx)*(y-my), mask=maske) / n + call moment(x, mx, stddev = sx, mask = maske) + call moment(y, my, stddev = sy, mask = maske) + covar = sum((x - mx) * (y - my), mask = maske) / n ! correlation - correlation_sp = covar / (sx*sy) + correlation_sp = covar / (sx * sy) END FUNCTION correlation_sp @@ -1193,30 +1193,30 @@ FUNCTION covariance_dp(x, y, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - REAL(dp), DIMENSION(:), INTENT(IN) :: y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: covariance_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + REAL(dp), DIMENSION(:), INTENT(IN) :: y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: covariance_dp - REAL(dp) :: n - REAL(dp) :: mx, my + REAL(dp) :: n + REAL(dp) :: mx, my LOGICAL, DIMENSION(size(x)) :: maske if (size(x) .ne. size(y)) stop 'Error covariance_dp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error covariance_dp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(x)) stop 'Error covariance_dp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(x),dp) + maske(:) = .true. + n = real(size(x), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'covariance_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'covariance_dp: n must be at least 2' ! Mean of x and y - mx = mean(x, mask=maske) - my = mean(y, mask=maske) - covariance_dp = sum((x-mx)*(y-my), mask=maske) / n + mx = mean(x, mask = maske) + my = mean(y, mask = maske) + covariance_dp = sum((x - mx) * (y - my), mask = maske) / n END FUNCTION covariance_dp @@ -1225,30 +1225,30 @@ FUNCTION covariance_sp(x, y, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - REAL(sp), DIMENSION(:), INTENT(IN) :: y - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: covariance_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + REAL(sp), DIMENSION(:), INTENT(IN) :: y + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: covariance_sp - REAL(sp) :: n - REAL(sp) :: mx, my + REAL(sp) :: n + REAL(sp) :: mx, my LOGICAL, DIMENSION(size(x)) :: maske if (size(x) .ne. size(y)) stop 'Error covariance_sp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error covariance_sp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(x)) stop 'Error covariance_sp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(x),sp) + maske(:) = .true. + n = real(size(x), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'covariance_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'covariance_sp: n must be at least 2' ! Mean of x and y - mx = mean(x, mask=maske) - my = mean(y, mask=maske) - covariance_sp = sum((x-mx)*(y-my), mask=maske) / n + mx = mean(x, mask = maske) + my = mean(y, mask = maske) + covariance_sp = sum((x - mx) * (y - my), mask = maske) / n END FUNCTION covariance_sp @@ -1258,39 +1258,39 @@ FUNCTION kurtosis_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: kurtosis_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: kurtosis_dp REAL(dp) :: n REAL(dp) :: ep, ave, var REAL(dp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error kurtosis_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error kurtosis_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'kurtosis_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'kurtosis_dp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_dp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_dp) if (abs(var) .lt. tiny(0.0_dp)) stop 'kurtosis_dp: no kurtosis when zero variance' ! Kurtosis - p(:) = p(:)*s(:)*s(:) - kurtosis_dp = sum(p(:), mask=maske) - kurtosis_dp = kurtosis_dp/(n*var*var) - 3.0_dp + p(:) = p(:) * s(:) * s(:) + kurtosis_dp = sum(p(:), mask = maske) + kurtosis_dp = kurtosis_dp / (n * var * var) - 3.0_dp END FUNCTION kurtosis_dp @@ -1299,39 +1299,39 @@ FUNCTION kurtosis_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: kurtosis_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: kurtosis_sp REAL(sp) :: n REAL(sp) :: ep, ave, var REAL(sp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error kurtosis_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error kurtosis_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'kurtosis_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'kurtosis_sp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_sp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_sp) if (abs(var) .lt. tiny(0.0_sp)) stop 'kurtosis_sp: no kurtosis when zero variance' ! Kurtosis - p(:) = p(:)*s(:)*s(:) - kurtosis_sp = sum(p(:), mask=maske) - kurtosis_sp = kurtosis_sp/(n*var*var) - 3.0_sp + p(:) = p(:) * s(:) * s(:) + kurtosis_sp = sum(p(:), mask = maske) + kurtosis_sp = kurtosis_sp / (n * var * var) - 3.0_sp END FUNCTION kurtosis_sp @@ -1341,25 +1341,25 @@ FUNCTION mean_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: mean_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: mean_dp REAL(dp) :: n LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error mean_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error mean_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if ! Mean - mean_dp = sum(dat(:), mask=maske)/n + mean_dp = sum(dat(:), mask = maske) / n END FUNCTION mean_dp @@ -1368,25 +1368,25 @@ FUNCTION mean_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: mean_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: mean_sp REAL(sp) :: n LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error mean_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error mean_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if ! Mean - mean_sp = sum(dat(:), mask=maske)/n + mean_sp = sum(dat(:), mask = maske) / n END FUNCTION mean_sp @@ -1396,48 +1396,48 @@ FUNCTION mixed_central_moment_dp(x, y, r, s, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - REAL(dp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: r - INTEGER(i4), INTENT(IN) :: s - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: mixed_central_moment_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + REAL(dp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: r + INTEGER(i4), INTENT(IN) :: s + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: mixed_central_moment_dp - REAL(dp) :: n, mx, my + REAL(dp) :: n, mx, my REAL(dp), DIMENSION(size(x)) :: xx, yy - LOGICAL, DIMENSION(size(x)) :: maske + LOGICAL, DIMENSION(size(x)) :: maske if (r.lt.0 .or. s.lt.0) then - mixed_central_moment_dp = 0.0_dp - return + mixed_central_moment_dp = 0.0_dp + return end if if (size(x) .ne. size(y)) stop 'Error mixed_central_moment_dp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_dp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_dp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(x),dp) + maske(:) = .true. + n = real(size(x), dp) end if - if (n .le. (2.0_dp+tiny(2.0_dp))) stop 'mixed_central_moment_dp: n must be at least 3' + if (n .le. (2.0_dp + tiny(2.0_dp))) stop 'mixed_central_moment_dp: n must be at least 3' ! Averages of x and y - mx = sum(x, mask=maske) / n - my = sum(y, mask=maske) / n + mx = sum(x, mask = maske) / n + my = sum(y, mask = maske) / n ! Mixed central moment if (r>0) then - xx = (x-mx)**r + xx = (x - mx)**r else - xx = 1._dp + xx = 1._dp end if if (s>0) then - yy = (y-my)**s + yy = (y - my)**s else - yy = 1._dp + yy = 1._dp end if - mixed_central_moment_dp = sum(xx*yy, mask=maske) / n + mixed_central_moment_dp = sum(xx * yy, mask = maske) / n END FUNCTION mixed_central_moment_dp @@ -1446,48 +1446,48 @@ FUNCTION mixed_central_moment_sp(x, y, r, s, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - REAL(sp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: r - INTEGER(i4), INTENT(IN) :: s - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: mixed_central_moment_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + REAL(sp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: r + INTEGER(i4), INTENT(IN) :: s + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: mixed_central_moment_sp - REAL(sp) :: n, mx, my + REAL(sp) :: n, mx, my REAL(sp), DIMENSION(size(x)) :: xx, yy - LOGICAL, DIMENSION(size(x)) :: maske + LOGICAL, DIMENSION(size(x)) :: maske if (r.lt.0 .or. s.lt.0) then - mixed_central_moment_sp = 0.0_sp - return + mixed_central_moment_sp = 0.0_sp + return end if if (size(x) .ne. size(y)) stop 'Error mixed_central_moment_sp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_sp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_sp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(x),sp) + maske(:) = .true. + n = real(size(x), sp) end if - if (n .le. (2.0_sp+tiny(2.0_sp))) stop 'mixed_central_moment_sp: n must be at least 3' + if (n .le. (2.0_sp + tiny(2.0_sp))) stop 'mixed_central_moment_sp: n must be at least 3' ! Averages of x and y - mx = sum(x, mask=maske) / n - my = sum(y, mask=maske) / n + mx = sum(x, mask = maske) / n + my = sum(y, mask = maske) / n ! Mixed central moment if (r>0) then - xx = (x-mx)**r + xx = (x - mx)**r else - xx = 1._sp + xx = 1._sp end if if (s>0) then - yy = (y-my)**s + yy = (y - my)**s else - yy = 1._sp + yy = 1._sp end if - mixed_central_moment_sp = sum(xx*yy, mask=maske) / n + mixed_central_moment_sp = sum(xx * yy, mask = maske) / n END FUNCTION mixed_central_moment_sp @@ -1497,12 +1497,12 @@ FUNCTION mixed_central_moment_var_dp(x, y, r, s, mask) ! Error variance of mixed central moment (Benedict & Gould 1996) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: x - REAL(dp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: r - INTEGER(i4), INTENT(IN) :: s - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: mixed_central_moment_var_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: x + REAL(dp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: r + INTEGER(i4), INTENT(IN) :: s + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: mixed_central_moment_var_dp REAL(dp) :: u2r2s, urs, urm1s, u20, urp1s, ursm1, u02, ursp1, u11 REAL(dp) :: n, rr, ss @@ -1510,31 +1510,31 @@ FUNCTION mixed_central_moment_var_dp(x, y, r, s, mask) if (size(x) .ne. size(y)) stop 'Error mixed_central_moment_var_dp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_var_dp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_var_dp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(x),dp) + maske(:) = .true. + n = real(size(x), dp) end if - if (n .le. (2.0_dp+tiny(2.0_dp))) stop 'mixed_central_moment_var_dp: n must be at least 3' - - u2r2s = mixed_central_moment(x, y, 2*r, 2*s, mask=maske) - urs = mixed_central_moment(x, y, r, s, mask=maske) - urm1s = mixed_central_moment(x, y, r-1, s, mask=maske) - u20 = mixed_central_moment(x, y, 2, 0, mask=maske) - urp1s = mixed_central_moment(x, y, r+1, s, mask=maske) - ursm1 = mixed_central_moment(x, y, r, s-1, mask=maske) - u02 = mixed_central_moment(x, y, 0, 2, mask=maske) - ursp1 = mixed_central_moment(x, y, r, s+1, mask=maske) - u11 = mixed_central_moment(x, y, 1, 1, mask=maske) - rr = real(r,dp) - ss = real(s,dp) - - mixed_central_moment_var_dp = (u2r2s - urs*urs & - + rr*rr**u20*urm1s*urm1s + ss*ss*u02*ursm1*ursm1 & - + 2.0_dp*rr*ss*u11*urm1s*ursm1 & - - 2.0_dp*rr*urp1s*urm1s - 2.0_dp*ss*ursp1*ursm1) / n + if (n .le. (2.0_dp + tiny(2.0_dp))) stop 'mixed_central_moment_var_dp: n must be at least 3' + + u2r2s = mixed_central_moment(x, y, 2 * r, 2 * s, mask = maske) + urs = mixed_central_moment(x, y, r, s, mask = maske) + urm1s = mixed_central_moment(x, y, r - 1, s, mask = maske) + u20 = mixed_central_moment(x, y, 2, 0, mask = maske) + urp1s = mixed_central_moment(x, y, r + 1, s, mask = maske) + ursm1 = mixed_central_moment(x, y, r, s - 1, mask = maske) + u02 = mixed_central_moment(x, y, 0, 2, mask = maske) + ursp1 = mixed_central_moment(x, y, r, s + 1, mask = maske) + u11 = mixed_central_moment(x, y, 1, 1, mask = maske) + rr = real(r, dp) + ss = real(s, dp) + + mixed_central_moment_var_dp = (u2r2s - urs * urs & + + rr * rr**u20 * urm1s * urm1s + ss * ss * u02 * ursm1 * ursm1 & + + 2.0_dp * rr * ss * u11 * urm1s * ursm1 & + - 2.0_dp * rr * urp1s * urm1s - 2.0_dp * ss * ursp1 * ursm1) / n END FUNCTION mixed_central_moment_var_dp @@ -1543,12 +1543,12 @@ FUNCTION mixed_central_moment_var_sp(x, y, r, s, mask) ! Error variance of mixed central moment (Benedict & Gould 1996) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: x - REAL(sp), DIMENSION(:), INTENT(IN) :: y - INTEGER(i4), INTENT(IN) :: r - INTEGER(i4), INTENT(IN) :: s - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: mixed_central_moment_var_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: x + REAL(sp), DIMENSION(:), INTENT(IN) :: y + INTEGER(i4), INTENT(IN) :: r + INTEGER(i4), INTENT(IN) :: s + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: mixed_central_moment_var_sp REAL(sp) :: u2r2s, urs, urm1s, u20, urp1s, ursm1, u02, ursp1, u11 REAL(sp) :: n, rr, ss @@ -1556,31 +1556,31 @@ FUNCTION mixed_central_moment_var_sp(x, y, r, s, mask) if (size(x) .ne. size(y)) stop 'Error mixed_central_moment_var_sp: size(x) .ne. size(y)' if (present(mask)) then - if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_var_sp: size(mask) .ne. size(x)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(x)) stop 'Error mixed_central_moment_var_sp: size(mask) .ne. size(x)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(x),sp) + maske(:) = .true. + n = real(size(x), sp) end if - if (n .le. (2.0_sp+tiny(2.0_sp))) stop 'mixed_central_moment_var_sp: n must be at least 3' - - u2r2s = mixed_central_moment(x, y, 2*r, 2*s, mask=maske) - urs = mixed_central_moment(x, y, r, s, mask=maske) - urm1s = mixed_central_moment(x, y, r-1, s, mask=maske) - u20 = mixed_central_moment(x, y, 2, 0, mask=maske) - urp1s = mixed_central_moment(x, y, r+1, s, mask=maske) - ursm1 = mixed_central_moment(x, y, r, s-1, mask=maske) - u02 = mixed_central_moment(x, y, 0, 2, mask=maske) - ursp1 = mixed_central_moment(x, y, r, s+1, mask=maske) - u11 = mixed_central_moment(x, y, 1, 1, mask=maske) - rr = real(r,sp) - ss = real(s,sp) - - mixed_central_moment_var_sp = (u2r2s - urs*urs & - + rr*rr**u20*urm1s*urm1s + ss*ss*u02*ursm1*ursm1 & - + 2.0_sp*rr*ss*u11*urm1s*ursm1 & - - 2.0_sp*rr*urp1s*urm1s - 2.0_sp*ss*ursp1*ursm1) / n + if (n .le. (2.0_sp + tiny(2.0_sp))) stop 'mixed_central_moment_var_sp: n must be at least 3' + + u2r2s = mixed_central_moment(x, y, 2 * r, 2 * s, mask = maske) + urs = mixed_central_moment(x, y, r, s, mask = maske) + urm1s = mixed_central_moment(x, y, r - 1, s, mask = maske) + u20 = mixed_central_moment(x, y, 2, 0, mask = maske) + urp1s = mixed_central_moment(x, y, r + 1, s, mask = maske) + ursm1 = mixed_central_moment(x, y, r, s - 1, mask = maske) + u02 = mixed_central_moment(x, y, 0, 2, mask = maske) + ursp1 = mixed_central_moment(x, y, r, s + 1, mask = maske) + u11 = mixed_central_moment(x, y, 1, 1, mask = maske) + rr = real(r, sp) + ss = real(s, sp) + + mixed_central_moment_var_sp = (u2r2s - urs * urs & + + rr * rr**u20 * urm1s * urm1s + ss * ss * u02 * ursm1 * ursm1 & + + 2.0_sp * rr * ss * u11 * urm1s * ursm1 & + - 2.0_sp * rr * urp1s * urm1s - 2.0_sp * ss * ursp1 * ursm1) / n END FUNCTION mixed_central_moment_var_sp @@ -1590,67 +1590,67 @@ SUBROUTINE moment_dp(dat, average, variance, skewness, kurtosis, mean, stddev, a IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - REAL(dp), OPTIONAL, INTENT(OUT) :: average - REAL(dp), OPTIONAL, INTENT(OUT) :: variance - REAL(dp), OPTIONAL, INTENT(OUT) :: skewness - REAL(dp), OPTIONAL, INTENT(OUT) :: kurtosis - REAL(dp), OPTIONAL, INTENT(OUT) :: mean - REAL(dp), OPTIONAL, INTENT(OUT) :: stddev - REAL(dp), OPTIONAL, INTENT(OUT) :: absdev - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + REAL(dp), OPTIONAL, INTENT(OUT) :: average + REAL(dp), OPTIONAL, INTENT(OUT) :: variance + REAL(dp), OPTIONAL, INTENT(OUT) :: skewness + REAL(dp), OPTIONAL, INTENT(OUT) :: kurtosis + REAL(dp), OPTIONAL, INTENT(OUT) :: mean + REAL(dp), OPTIONAL, INTENT(OUT) :: stddev + REAL(dp), OPTIONAL, INTENT(OUT) :: absdev + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask REAL(dp) :: n REAL(dp) :: ep, ave, var REAL(dp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error moment_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error moment_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'moment_dp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'moment_dp: n must be at least 2' ! Any optional argument if (.not. (present(average) .or. present(variance) .or. present(skewness) .or. & - present(kurtosis) .or. present(mean) .or. present(stddev) .or. present(absdev))) return + present(kurtosis) .or. present(mean) .or. present(stddev) .or. present(absdev))) return ! Average - ave = sum(dat(:), mask=maske)/n + ave = sum(dat(:), mask = maske) / n if (present(average)) average = ave - if (present(mean)) mean = ave + if (present(mean)) mean = ave if (.not. (present(variance) .or. present(skewness) .or. & - present(kurtosis) .or. present(stddev) .or. present(absdev))) return + present(kurtosis) .or. present(stddev) .or. present(absdev))) return ! Absolute deviation - s(:) = dat(:)-ave - if (present(absdev)) absdev = sum(abs(s(:)), mask=maske)/n + s(:) = dat(:) - ave + if (present(absdev)) absdev = sum(abs(s(:)), mask = maske) / n ! Variance / Standard deviation if (.not. (present(variance) .or. present(skewness) .or. & - present(kurtosis) .or. present(stddev))) return - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_dp) + present(kurtosis) .or. present(stddev))) return + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_dp) if (present(variance)) variance = var ! Standard deviation - if (present(stddev)) stddev = sqrt(var) + if (present(stddev)) stddev = sqrt(var) if (.not. (present(skewness) .or. present(kurtosis))) return ! Skewness if (abs(var) .lt. tiny(0.0_dp)) stop 'moment_dp: no skewness or kurtosis when zero variance' - p(:) = p(:)*s(:) + p(:) = p(:) * s(:) if (present(skewness)) then - skewness = sum(p(:), mask=maske) - skewness = skewness/(n*stddev*stddev*stddev) + skewness = sum(p(:), mask = maske) + skewness = skewness / (n * stddev * stddev * stddev) end if ! Kurtosis if (present(kurtosis)) then - p(:) = p(:)*s(:) - kurtosis = sum(p(:), mask=maske) - kurtosis = kurtosis/(n*variance*variance) - 3.0_dp + p(:) = p(:) * s(:) + kurtosis = sum(p(:), mask = maske) + kurtosis = kurtosis / (n * variance * variance) - 3.0_dp end if END SUBROUTINE moment_dp @@ -1660,67 +1660,67 @@ SUBROUTINE moment_sp(dat, average, variance, skewness, kurtosis, mean, stddev, a IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - REAL(sp), OPTIONAL, INTENT(OUT) :: average - REAL(sp), OPTIONAL, INTENT(OUT) :: variance - REAL(sp), OPTIONAL, INTENT(OUT) :: skewness - REAL(sp), OPTIONAL, INTENT(OUT) :: kurtosis - REAL(sp), OPTIONAL, INTENT(OUT) :: mean - REAL(sp), OPTIONAL, INTENT(OUT) :: stddev - REAL(sp), OPTIONAL, INTENT(OUT) :: absdev - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + REAL(sp), OPTIONAL, INTENT(OUT) :: average + REAL(sp), OPTIONAL, INTENT(OUT) :: variance + REAL(sp), OPTIONAL, INTENT(OUT) :: skewness + REAL(sp), OPTIONAL, INTENT(OUT) :: kurtosis + REAL(sp), OPTIONAL, INTENT(OUT) :: mean + REAL(sp), OPTIONAL, INTENT(OUT) :: stddev + REAL(sp), OPTIONAL, INTENT(OUT) :: absdev + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask REAL(sp) :: n REAL(sp) :: ep, ave, var REAL(sp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error moment_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error moment_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'moment_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'moment_sp: n must be at least 2' ! Any optional argument if (.not. (present(average) .or. present(variance) .or. present(skewness) .or. & - present(kurtosis) .or. present(mean) .or. present(stddev) .or. present(absdev))) return + present(kurtosis) .or. present(mean) .or. present(stddev) .or. present(absdev))) return ! Average - ave = sum(dat(:), mask=maske)/n + ave = sum(dat(:), mask = maske) / n if (present(average)) average = ave - if (present(mean)) mean = ave + if (present(mean)) mean = ave if (.not. (present(variance) .or. present(skewness) .or. & - present(kurtosis) .or. present(stddev) .or. present(absdev))) return + present(kurtosis) .or. present(stddev) .or. present(absdev))) return ! Absolute deviation - s(:) = dat(:)-ave - if (present(absdev)) absdev = sum(abs(s(:)), mask=maske)/n + s(:) = dat(:) - ave + if (present(absdev)) absdev = sum(abs(s(:)), mask = maske) / n ! Variance / Standard deviation if (.not. (present(variance) .or. present(skewness) .or. & - present(kurtosis) .or. present(stddev))) return - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_sp) + present(kurtosis) .or. present(stddev))) return + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_sp) if (present(variance)) variance = var ! Standard deviation - if (present(stddev)) stddev = sqrt(var) + if (present(stddev)) stddev = sqrt(var) if (.not. (present(skewness) .or. present(kurtosis))) return ! Skewness if (abs(var) .lt. tiny(0.0_sp)) stop 'moment_sp: no skewness or kurtosis when zero variance' - p(:) = p(:)*s(:) + p(:) = p(:) * s(:) if (present(skewness)) then - skewness = sum(p(:), mask=maske) - skewness = skewness/(n*stddev*stddev*stddev) + skewness = sum(p(:), mask = maske) + skewness = skewness / (n * stddev * stddev * stddev) end if ! Kurtosis if (present(kurtosis)) then - p(:) = p(:)*s(:) - kurtosis = sum(p(:), mask=maske) - kurtosis = kurtosis/(n*variance*variance) - 3.0_sp + p(:) = p(:) * s(:) + kurtosis = sum(p(:), mask = maske) + kurtosis = kurtosis / (n * variance * variance) - 3.0_sp end if END SUBROUTINE moment_sp @@ -1731,34 +1731,34 @@ FUNCTION stddev_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: stddev_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: stddev_dp REAL(dp) :: n REAL(dp) :: ep, ave, var REAL(dp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error stddev_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error stddev_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'stddev_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'stddev_dp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_dp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_dp) stddev_dp = sqrt(var) END FUNCTION stddev_dp @@ -1768,34 +1768,34 @@ FUNCTION stddev_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: stddev_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: stddev_sp REAL(sp) :: n REAL(sp) :: ep, ave, var REAL(sp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error stddev_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error stddev_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'stddev_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'stddev_sp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_sp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_sp) stddev_sp = sqrt(var) END FUNCTION stddev_sp @@ -1806,40 +1806,40 @@ FUNCTION skewness_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: skewness_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: skewness_dp REAL(dp) :: n REAL(dp) :: ep, ave, var, stddev REAL(dp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error skewness_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error skewness_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'skewness_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'skewness_dp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_dp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_dp) stddev = sqrt(var) ! Skewness if (abs(var) .lt. tiny(0.0_dp)) stop 'skewness_dp: no skewness when zero variance' - p(:) = p(:)*s(:) - skewness_dp = sum(p(:), mask=maske) - skewness_dp = skewness_dp/(n*stddev*stddev*stddev) + p(:) = p(:) * s(:) + skewness_dp = sum(p(:), mask = maske) + skewness_dp = skewness_dp / (n * stddev * stddev * stddev) END FUNCTION skewness_dp @@ -1848,40 +1848,40 @@ FUNCTION skewness_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: skewness_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: skewness_sp REAL(sp) :: n REAL(sp) :: ep, ave, var, stddev REAL(sp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error skewness_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error skewness_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'skewness_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'skewness_sp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - var = (var-ep*ep/n)/(n-1.0_sp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + var = (var - ep * ep / n) / (n - 1.0_sp) stddev = sqrt(var) ! Skewness if (abs(var) .lt. tiny(0.0_sp)) stop 'skewness_sp: no skewness when zero variance' - p(:) = p(:)*s(:) - skewness_sp = sum(p(:), mask=maske) - skewness_sp = skewness_sp/(n*stddev*stddev*stddev) + p(:) = p(:) * s(:) + skewness_sp = sum(p(:), mask = maske) + skewness_sp = skewness_sp / (n * stddev * stddev * stddev) END FUNCTION skewness_sp @@ -1891,34 +1891,34 @@ FUNCTION variance_dp(dat, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: variance_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: variance_dp REAL(dp) :: n REAL(dp) :: ep, ave, var REAL(dp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error variance_dp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),dp) + if (size(mask) .ne. size(dat)) stop 'Error variance_dp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), dp) else - maske(:) = .true. - n = real(size(dat),dp) + maske(:) = .true. + n = real(size(dat), dp) end if - if (n .le. (1.0_dp+tiny(1.0_dp))) stop 'variance_dp: n must be at least 2' + if (n .le. (1.0_dp + tiny(1.0_dp))) stop 'variance_dp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - variance_dp = (var-ep*ep/n)/(n-1.0_dp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + variance_dp = (var - ep * ep / n) / (n - 1.0_dp) END FUNCTION variance_dp @@ -1927,34 +1927,34 @@ FUNCTION variance_sp(dat, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: dat - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: variance_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: dat + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: variance_sp REAL(sp) :: n REAL(sp) :: ep, ave, var REAL(sp), DIMENSION(size(dat)) :: p, s - LOGICAL, DIMENSION(size(dat)) :: maske + LOGICAL, DIMENSION(size(dat)) :: maske if (present(mask)) then - if (size(mask) .ne. size(dat)) stop 'Error variance_sp: size(mask) .ne. size(dat)' - maske = mask - n = real(count(maske),sp) + if (size(mask) .ne. size(dat)) stop 'Error variance_sp: size(mask) .ne. size(dat)' + maske = mask + n = real(count(maske), sp) else - maske(:) = .true. - n = real(size(dat),sp) + maske(:) = .true. + n = real(size(dat), sp) end if - if (n .le. (1.0_sp+tiny(1.0_sp))) stop 'variance_sp: n must be at least 2' + if (n .le. (1.0_sp + tiny(1.0_sp))) stop 'variance_sp: n must be at least 2' ! Average - ave = sum(dat(:), mask=maske)/n - s(:) = dat(:)-ave + ave = sum(dat(:), mask = maske) / n + s(:) = dat(:) - ave ! Variance / Standard deviation - ep = sum(s(:), mask=maske) - p(:) = s(:)*s(:) - var = sum(p(:), mask=maske) - variance_sp = (var-ep*ep/n)/(n-1.0_sp) + ep = sum(s(:), mask = maske) + p(:) = s(:) * s(:) + var = sum(p(:), mask = maske) + variance_sp = (var - ep * ep / n) / (n - 1.0_sp) END FUNCTION variance_sp diff --git a/src/lib/mo_ncread.f90 b/src/lib/mo_ncread.f90 index 2bccec79..b284f9cb 100644 --- a/src/lib/mo_ncread.f90 +++ b/src/lib/mo_ncread.f90 @@ -22,13 +22,13 @@ module mo_NcRead ! Copyright 2011-2014 Stephan Thober, Matthias Cuntz - use mo_kind, only: i4, i8, sp, dp + use mo_kind, only : i4, i8, sp, dp ! functions and constants of netcdf4 library - use netcdf, only: nf90_open, nf90_get_var, nf90_close, NF90_MAX_NAME , & - nf90_get_att, nf90_inq_varid, nf90_inquire_variable, & - nf90_inquire_dimension, NF90_NOWRITE, & - nf90_noerr, nf90_strerror, nf90_inquire_attribute + use netcdf, only : nf90_open, nf90_get_var, nf90_close, NF90_MAX_NAME, & + nf90_get_att, nf90_inq_varid, nf90_inquire_variable, & + nf90_inquire_dimension, NF90_NOWRITE, & + nf90_noerr, nf90_strerror, nf90_inquire_attribute implicit none @@ -98,14 +98,14 @@ module mo_NcRead ! Modified, Stephan Thober, Mar 2014 - added subroutines for allocatable arrays interface Get_NcVar - module procedure Get_NcVar_0d_sp, Get_NcVar_0d_dp, Get_NcVar_1d_sp, & - Get_NcVar_1d_dp, Get_NcVar_2d_sp, Get_NcVar_2d_dp, & - Get_NcVar_3d_sp, Get_NcVar_3d_dp, Get_NcVar_4d_sp, & - Get_NcVar_4d_dp, Get_NcVar_5d_sp, Get_NcVar_5d_dp, & - Get_NcVar_0d_i4, Get_NcVar_1d_i4, Get_NcVar_2d_i4, & - Get_NcVar_3d_i4, Get_NcVar_4d_i4, Get_NcVar_5d_i4, & - Get_NcVar_0d_i1, Get_NcVar_1d_i1, Get_NcVar_2d_i1, & - Get_NcVar_3d_i1, Get_NcVar_4d_i1, Get_NcVar_5d_i1 + module procedure Get_NcVar_0d_sp, Get_NcVar_0d_dp, Get_NcVar_1d_sp, & + Get_NcVar_1d_dp, Get_NcVar_2d_sp, Get_NcVar_2d_dp, & + Get_NcVar_3d_sp, Get_NcVar_3d_dp, Get_NcVar_4d_sp, & + Get_NcVar_4d_dp, Get_NcVar_5d_sp, Get_NcVar_5d_dp, & + Get_NcVar_0d_i4, Get_NcVar_1d_i4, Get_NcVar_2d_i4, & + Get_NcVar_3d_i4, Get_NcVar_4d_i4, Get_NcVar_5d_i4, & + Get_NcVar_0d_i1, Get_NcVar_1d_i1, Get_NcVar_2d_i1, & + Get_NcVar_3d_i1, Get_NcVar_4d_i1, Get_NcVar_5d_i1 end interface Get_NcVar ! ------------------------------------------------------------------------------ @@ -154,13 +154,13 @@ function Get_NcDim(Filename, Variable, PrintInfo, ndims) ! implicit none ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: Variable - logical, optional, intent(in) :: PrintInfo + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: Variable + logical, optional, intent(in) :: PrintInfo integer(i4), optional, intent(out) :: ndims - integer(i4), dimension(5) :: Get_NcDim + integer(i4), dimension(5) :: Get_NcDim ! - logical :: PrintFlag + logical :: PrintFlag integer(i4) :: ncid ! id of input stream integer(i4) :: varid ! id of variable to be read integer(i4) :: vartype ! type of variable @@ -175,8 +175,8 @@ function Get_NcDim(Filename, Variable, PrintInfo, ndims) ! Inquire file and check if VarName exists in the dataset, ! get number of dimensions and ! get the length of the dimensions - call Get_Info(Variable, ncid, varid, vartype, Get_NcDim, Info=PrintFlag, ndims=NumDims) - if (present(ndims)) ndims=NumDims + call Get_Info(Variable, ncid, varid, vartype, Get_NcDim, Info = PrintFlag, ndims = NumDims) + if (present(ndims)) ndims = NumDims ! ! close File call check(nf90_close(ncid)) @@ -236,21 +236,21 @@ subroutine Get_NcDimAtt(Filename, Variable, DimName, DimLen) ! implicit none ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: Variable - character(len=*), dimension(:), allocatable, & - intent(out) :: DimName - integer(i4) , dimension(:), allocatable, & - optional, intent(out) :: DimLen + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: Variable + character(len = *), dimension(:), allocatable, & + intent(out) :: DimName + integer(i4), dimension(:), allocatable, & + optional, intent(out) :: DimLen ! - integer(i4), dimension(5) :: Get_NcDim + integer(i4), dimension(5) :: Get_NcDim ! - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: NumDims ! # of dimensions - integer(i4) :: dimid - integer(i4) :: len + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: NumDims ! # of dimensions + integer(i4) :: dimid + integer(i4) :: len ! ! Open NetCDF filename call check(nf90_open(Filename, NF90_NOWRITE, ncid)) @@ -258,14 +258,14 @@ subroutine Get_NcDimAtt(Filename, Variable, DimName, DimLen) ! Inquire file and check if VarName exists in the dataset, ! get number of dimensions and ! get the length of the dimensions - call Get_Info(Variable, ncid, varid, vartype, Get_NcDim, Info=.FALSE., ndims=NumDims) + call Get_Info(Variable, ncid, varid, vartype, Get_NcDim, Info = .FALSE., ndims = NumDims) ! allocate(DimName(NumDims)) if (present(DimLen)) allocate(DimLen(NumDims)) ! do dimid = 1, NumDims - call check(nf90_inquire_dimension(ncid, dimid, DimName(dimid), len)) - if (present(DimLen)) DimLen(dimid) = len + call check(nf90_inquire_dimension(ncid, dimid, DimName(dimid), len)) + if (present(DimLen)) DimLen(dimid) = len end do ! close File call check(nf90_close(ncid)) @@ -327,25 +327,25 @@ subroutine Get_NcVarAtt(FileName, VarName, AttName, AttValues, fid, dtype) ! implicit none ! - character(len=*), intent(in) :: FileName - character(len=*), intent(in) :: VarName - character(len=*), intent(in) :: AttName - character(len=*), intent(out) :: AttValues - integer(i4), optional, intent(in) :: fid - integer(i4), optional, intent(out) :: dtype + character(len = *), intent(in) :: FileName + character(len = *), intent(in) :: VarName + character(len = *), intent(in) :: AttName + character(len = *), intent(out) :: AttValues + integer(i4), optional, intent(in) :: fid + integer(i4), optional, intent(out) :: dtype ! - integer(i4) :: ncid - integer(i4) :: varid + integer(i4) :: ncid + integer(i4) :: varid ! - integer(i4) :: type - integer(i8) :: avint - real(dp) :: avfloat - character(256) :: avchar + integer(i4) :: type + integer(i8) :: avint + real(dp) :: avfloat + character(256) :: avchar ! if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id @@ -356,36 +356,36 @@ subroutine Get_NcVarAtt(FileName, VarName, AttName, AttValues, fid, dtype) ! read attribute by type select case (type) case (1) ! 1 = NF90_BYTE - call check(nf90_get_att(ncid, varid, trim(AttName), avint)) - write(AttValues,'(i4)') avint - AttValues = adjustl(trim(AttValues)) - if (present(dtype)) dtype=type + call check(nf90_get_att(ncid, varid, trim(AttName), avint)) + write(AttValues, '(i4)') avint + AttValues = adjustl(trim(AttValues)) + if (present(dtype)) dtype = type case (2) ! NF90_CHAR - call check(nf90_get_att(ncid, varid, trim(AttName), avchar)) - AttValues = adjustl(trim(avchar)) - if (present(dtype)) dtype=type + call check(nf90_get_att(ncid, varid, trim(AttName), avchar)) + AttValues = adjustl(trim(avchar)) + if (present(dtype)) dtype = type case (3) ! NF90_SHORT - call check(nf90_get_att(ncid, varid, trim(AttName), avint)) - write(AttValues,'(i6)') avint - AttValues = adjustl(trim(AttValues)) - if (present(dtype)) dtype=type + call check(nf90_get_att(ncid, varid, trim(AttName), avint)) + write(AttValues, '(i6)') avint + AttValues = adjustl(trim(AttValues)) + if (present(dtype)) dtype = type case (4) ! NF90_INT - call check(nf90_get_att(ncid, varid, trim(AttName), avint)) - write(AttValues,'(i11)') avint - AttValues = adjustl(trim(AttValues)) - if (present(dtype)) dtype=type + call check(nf90_get_att(ncid, varid, trim(AttName), avint)) + write(AttValues, '(i11)') avint + AttValues = adjustl(trim(AttValues)) + if (present(dtype)) dtype = type case (5) ! NF90_FLOAT - call check(nf90_get_att(ncid, varid, trim(AttName), avfloat)) - write(AttValues,'(E15.7)') avfloat - AttValues = adjustl(trim(AttValues)) - if (present(dtype)) dtype=type + call check(nf90_get_att(ncid, varid, trim(AttName), avfloat)) + write(AttValues, '(E15.7)') avfloat + AttValues = adjustl(trim(AttValues)) + if (present(dtype)) dtype = type case (6) ! NF90_DOUBLE - call check(nf90_get_att(ncid, varid, trim(AttName), avfloat)) - write(AttValues,'(E24.15)') avfloat - AttValues = adjustl(trim(AttValues)) - if (present(dtype)) dtype=type + call check(nf90_get_att(ncid, varid, trim(AttName), avfloat)) + write(AttValues, '(E24.15)') avfloat + AttValues = adjustl(trim(AttValues)) + if (present(dtype)) dtype = type case DEFAULT - print*, '***ERROR: mo_ncread: Mismatch in attribute datatype!' + print*, '***ERROR: mo_ncread: Mismatch in attribute datatype!' end select ! if (.not. present(fid)) call check(nf90_close(ncid)) @@ -401,29 +401,29 @@ subroutine Get_NcVar_0d_sp(Filename, VarName, Dat, fid) ! integer, parameter :: itype = 5 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(sp), intent(inout) :: Dat ! array where values should be stored - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(sp), intent(inout) :: Dat ! array where values should be stored + integer(i4), optional, intent(in) :: fid ! - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -440,29 +440,29 @@ subroutine Get_NcVar_0d_dp(Filename, VarName, Dat, fid) ! integer, parameter :: itype = 6 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(dp), intent(inout) :: Dat ! array where values should be stored - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(dp), intent(inout) :: Dat ! array where values should be stored + integer(i4), optional, intent(in) :: fid ! - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -480,66 +480,66 @@ subroutine Get_NcVar_1d_sp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 1 integer, parameter :: itype = 5 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(sp), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(sp), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -558,66 +558,66 @@ subroutine Get_NcVar_1d_dp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 1 integer, parameter :: itype = 6 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(dp), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(dp), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -636,67 +636,67 @@ subroutine Get_NcVar_2d_sp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 2 integer, parameter :: itype = 5 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name !real(sp), dimension(:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - real(sp), dimension(:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid - ! - integer(i4), dimension(5) :: Rstart - integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + real(sp), dimension(:, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid + ! + integer(i4), dimension(5) :: Rstart + integer(i4), dimension(5) :: Rcount + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -715,66 +715,66 @@ subroutine Get_NcVar_2d_dp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 2 integer, parameter :: itype = 6 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(dp), dimension(:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(dp), dimension(:, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -793,19 +793,19 @@ subroutine Get_NcVar_3d_sp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 3 integer, parameter :: itype = 5 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(sp), dimension(:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(sp), dimension(:, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count @@ -813,48 +813,48 @@ subroutine Get_NcVar_3d_sp(Filename, VarName, Dat, start, a_count, fid) Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if - + ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -873,66 +873,66 @@ subroutine Get_NcVar_3d_dp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 3 integer, parameter :: itype = 6 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(dp), dimension(:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(dp), dimension(:, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -951,66 +951,66 @@ subroutine Get_NcVar_4d_sp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 4 integer, parameter :: itype = 5 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(sp), dimension(:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(sp), dimension(:, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1029,66 +1029,66 @@ subroutine Get_NcVar_4d_dp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 4 integer, parameter :: itype = 6 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(dp), dimension(:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(dp), dimension(:, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1107,66 +1107,66 @@ subroutine Get_NcVar_5d_sp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 5 integer, parameter :: itype = 5 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(sp), dimension(:,:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(sp), dimension(:, :, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1185,66 +1185,66 @@ subroutine Get_NcVar_5d_dp(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 5 integer, parameter :: itype = 6 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - real(dp), dimension(:,:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + real(dp), dimension(:, :, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' - if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' - Rstart(1:size(start)) = start + if (size(start) < size(shape(dat))) stop 'ERROR*** start has less values than data has dimensions. GetNcVar' + if (size(start) > 5) stop 'ERROR*** start has dimension greater than 5. GetNcVar' + Rstart(1 : size(start)) = start end if ! if (present(a_count)) then - if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' - if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' - Rcount(1:size(a_count)) = a_count - do i=1, idims - if (size(Dat,i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' - end do + if (size(a_count) < size(shape(dat))) stop 'ERROR*** a_count has less values than data has dimensions. GetNcVar' + if (size(a_count) > 5) stop 'ERROR*** a_count has dimension greater than 5. GetNcVar' + Rcount(1 : size(a_count)) = a_count + do i = 1, idims + if (size(Dat, i) < Rcount(i)) stop 'ERROR*** try to read more data in dimension than there is. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1262,29 +1262,29 @@ subroutine Get_NcVar_0d_i4(Filename, VarName, Dat, fid) ! integer, parameter :: itype = 4 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(i4), intent(inout) :: Dat ! array where values should be stored - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(i4), intent(inout) :: Dat ! array where values should be stored + integer(i4), optional, intent(in) :: fid ! - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1303,64 +1303,64 @@ subroutine Get_NcVar_1d_i4(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 1 integer, parameter :: itype = 4 ! 3 = single 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(i4), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(i4), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1379,64 +1379,64 @@ subroutine Get_NcVar_2d_i4(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 2 integer, parameter :: itype = 4 ! 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(i4), dimension(:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(i4), dimension(:, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1455,64 +1455,64 @@ subroutine Get_NcVar_3d_i4(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 3 integer, parameter :: itype = 4 ! 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(i4), dimension(:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(i4), dimension(:, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1531,64 +1531,64 @@ subroutine Get_NcVar_4d_i4(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 4 integer, parameter :: itype = 4 ! 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(i4), dimension(:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(i4), dimension(:, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1607,64 +1607,64 @@ subroutine Get_NcVar_5d_i4(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 5 integer, parameter :: itype = 4 ! 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(i4), dimension(:,:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(i4), dimension(:, :, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1681,29 +1681,29 @@ subroutine Get_NcVar_0d_i1(Filename, VarName, Dat, fid) ! integer, parameter :: itype = 1 ! 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(1), intent(inout) :: Dat ! array where values should be stored - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(1), intent(inout) :: Dat ! array where values should be stored + integer(i4), optional, intent(in) :: fid ! - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1722,64 +1722,64 @@ subroutine Get_NcVar_1d_i1(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 1 integer, parameter :: itype = 1 ! 3 = single 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(1), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(1), dimension(:), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1798,64 +1798,64 @@ subroutine Get_NcVar_2d_i1(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 2 integer, parameter :: itype = 1 ! 1 = 1 byte, 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(1), dimension(:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(1), dimension(:, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1874,64 +1874,64 @@ subroutine Get_NcVar_3d_i1(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 3 integer, parameter :: itype = 1 ! 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(1), dimension(:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(1), dimension(:, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -1950,64 +1950,64 @@ subroutine Get_NcVar_4d_i1(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 4 integer, parameter :: itype = 1 ! 1 = 1 byte, 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(1), dimension(:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(1), dimension(:, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -2026,64 +2026,64 @@ subroutine Get_NcVar_5d_i1(Filename, VarName, Dat, start, a_count, fid) integer, parameter :: idims = 5 integer, parameter :: itype = 1 ! 1 = 1 byte, 3 = single, 5 = float, 6 = double ! - character(len=*), intent(in) :: Filename - character(len=*), intent(in) :: VarName ! Variable name - integer(1), dimension(:,:,:,:,:), allocatable, intent(inout) :: Dat ! array where values should be stored - integer(i4), dimension(:), optional, intent(in) :: start - integer(i4), dimension(:), optional, intent(in) :: a_count - integer(i4), optional, intent(in) :: fid + character(len = *), intent(in) :: Filename + character(len = *), intent(in) :: VarName ! Variable name + integer(1), dimension(:, :, :, :, :), allocatable, intent(inout) :: Dat ! array where values should be stored + integer(i4), dimension(:), optional, intent(in) :: start + integer(i4), dimension(:), optional, intent(in) :: a_count + integer(i4), optional, intent(in) :: fid ! integer(i4), dimension(5) :: Rstart integer(i4), dimension(5) :: Rcount - integer(i4) :: ncid ! id of input stream - integer(i4) :: varid ! id of variable to be read - integer(i4) :: vartype ! type of variable - integer(i4) :: i + integer(i4) :: ncid ! id of input stream + integer(i4) :: varid ! id of variable to be read + integer(i4) :: vartype ! type of variable + integer(i4) :: i ! ! Defaults for Options Start and Count Rstart = 1 Rcount = 1 ! ! allocate Dat - if ( .not. allocated( Dat ) ) then - if ( .not. present( a_count ) ) then - Rcount = Get_NcDim( Filename, Varname ) - else - Rcount(1:idims) = a_count(1:idims) - end if - allocate( Dat( Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5) ) ) + if (.not. allocated(Dat)) then + if (.not. present(a_count)) then + Rcount = Get_NcDim(Filename, Varname) + else + Rcount(1 : idims) = a_count(1 : idims) + end if + allocate(Dat(Rcount(1), Rcount(2), Rcount(3), Rcount(4), Rcount(5))) else - Rcount(1:idims) = shape(Dat) + Rcount(1 : idims) = shape(Dat) end if ! ! Assign options Start and Count if present if (present(start)) then - if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' - Rstart = start + if (size(start) /= idims) stop 'ERROR*** size of start does not equal dimensions of data. GetNcVar' + Rstart = start end if ! if (present(a_count)) then - if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' - Rcount = a_count - do i=1, idims - if (size(Dat,i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' - end do + if (size(a_count) /= idims) stop 'ERROR*** size of a_count does not equal dimensions of data. GetNcVar' + Rcount = a_count + do i = 1, idims + if (size(Dat, i) /= Rcount(i)) stop 'ERROR*** size mismatch. Get_NcVar' + end do end if ! ! Open NetCDF filename if (present(fid)) then - ncid = fid + ncid = fid else - call check(nf90_open(trim(Filename),NF90_NOWRITE, ncid)) + call check(nf90_open(trim(Filename), NF90_NOWRITE, ncid)) end if ! ! Inquire file, check if VarName exists and get the id - call Get_Info(Varname,ncid,varid,vartype) + call Get_Info(Varname, ncid, varid, vartype) ! check variable type ( 5 equals float type, 6 equals double ) if (vartype /= itype) then - print *, 'Variable name: ', trim(Varname) - print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' - stop + print *, 'Variable name: ', trim(Varname) + print *, 'ERROR*** type of variable does not match argument type. subroutine Get_NcVar' + stop end if ! ! get values by varid @@ -2120,10 +2120,10 @@ function NcOpen(Fname) ! implicit none ! - character(len=*), intent(in) :: Fname - integer(i4) :: NcOpen + character(len = *), intent(in) :: Fname + integer(i4) :: NcOpen ! - call check(nf90_open(trim(Fname),NF90_NOWRITE, NcOpen)) + call check(nf90_open(trim(Fname), NF90_NOWRITE, NcOpen)) ! end function NcOpen @@ -2176,47 +2176,47 @@ subroutine Get_Info(Varname, ncid, varid, xtype, dl, Info, ndims) ! implicit none ! - character(len=*), intent(in) :: Varname - integer(i4), intent(in) :: ncid - integer(i4), intent(out) :: varid ! variable id of data to be read - integer(i4), intent(out) :: xtype ! type of the variable - integer(i4), dimension(:), optional, intent(inout) :: dl - logical, optional, intent(in) :: Info - integer(i4), optional, intent(out) :: ndims ! Number of Dimensions for specific variable + character(len = *), intent(in) :: Varname + integer(i4), intent(in) :: ncid + integer(i4), intent(out) :: varid ! variable id of data to be read + integer(i4), intent(out) :: xtype ! type of the variable + integer(i4), dimension(:), optional, intent(inout) :: dl + logical, optional, intent(in) :: Info + integer(i4), optional, intent(out) :: ndims ! Number of Dimensions for specific variable ! integer(i4), dimension(:), allocatable :: DimID ! Id of dimension - character(NF90_MAX_NAME) :: name ! name of Variables in the file - integer(i4) :: NumDims ! Number of Dimensions for specific variable - integer(i4) :: n ! loop index - character(256) :: form ! output format - integer(i4) :: itmp + character(NF90_MAX_NAME) :: name ! name of Variables in the file + integer(i4) :: NumDims ! Number of Dimensions for specific variable + integer(i4) :: n ! loop index + character(256) :: form ! output format + integer(i4) :: itmp ! call check(nf90_inq_varid(ncid, Varname, varid)) - call check(nf90_inquire_variable(ncid, varid, ndims=NumDims)) - if (present(ndims)) ndims=NumDims + call check(nf90_inquire_variable(ncid, varid, ndims = NumDims)) + if (present(ndims)) ndims = NumDims ! ! get the dimension Ids and the data type of the variable allocate(DimId(NumDims)) - call check(nf90_inquire_variable(ncid, varid, xtype=xtype, dimids=DimId)) - ! - if ( present(dl) ) then - ! check consistency of dimensions - if ( NumDims > size(dl) ) & - stop 'ERROR*** Dimension size of Variable is greater than dims of array. subroutine Get_Info' - ! go through dimension ids and get its length - dl(:) = -1 ! initialise - dimloop: do n = 1, NumDims - call check(nf90_inquire_dimension(ncid, DimId(n), name, itmp)) - dl(n) = itmp - if (present(info)) then - if (info) then - write(form,'(a12,I03.3,a1)') "(a10,i1,a4,a", len(trim(name)), ")" - write(*,form) 'Dimension ', n, ' is ', trim(name) - write(*,'(a14,i5.5)') 'The Length is ', dl(n) - end if + call check(nf90_inquire_variable(ncid, varid, xtype = xtype, dimids = DimId)) + ! + if (present(dl)) then + ! check consistency of dimensions + if (NumDims > size(dl)) & + stop 'ERROR*** Dimension size of Variable is greater than dims of array. subroutine Get_Info' + ! go through dimension ids and get its length + dl(:) = -1 ! initialise + dimloop : do n = 1, NumDims + call check(nf90_inquire_dimension(ncid, DimId(n), name, itmp)) + dl(n) = itmp + if (present(info)) then + if (info) then + write(form, '(a12,I03.3,a1)') "(a10,i1,a4,a", len(trim(name)), ")" + write(*, form) 'Dimension ', n, ' is ', trim(name) + write(*, '(a14,i5.5)') 'The Length is ', dl(n) end if - end do dimloop - ! + end if + end do dimloop + ! end if ! end subroutine Get_Info @@ -2230,8 +2230,8 @@ subroutine check(status) integer(i4), intent(in) :: status ! if (status /= nf90_noerr) then - write(*,*) trim(nf90_strerror(status)) - stop + write(*, *) trim(nf90_strerror(status)) + stop end if ! end subroutine check diff --git a/src/lib/mo_ncwrite.f90 b/src/lib/mo_ncwrite.f90 index 3597b027..ca35005b 100644 --- a/src/lib/mo_ncwrite.f90 +++ b/src/lib/mo_ncwrite.f90 @@ -22,19 +22,19 @@ module mo_ncwrite ! Copyright 2011-2012 Luis Samaniego, Stephan Thober, Matthias Cuntz - use mo_kind, only: i1, i4, sp, dp - use mo_string_utils, only: nonull - use mo_utils, only: ne + use mo_kind, only : i1, i4, sp, dp + use mo_string_utils, only : nonull + use mo_utils, only : ne ! functions and constants of netcdf4 library - use netcdf, only: nf90_create, nf90_def_dim, NF90_UNLIMITED, nf90_def_var, & - NF90_CHAR, nf90_put_att, NF90_INT, NF90_INT, NF90_GLOBAL, & - nf90_enddef, nf90_put_var, NF90_FLOAT, NF90_DOUBLE, NF90_BYTE, & - NF90_close, nf90_noerr, nf90_strerror, NF90_CLOBBER, & - NF90_MAX_NAME, NF90_WRITE, nf90_inq_varid, nf90_inquire_variable, & - nf90_inquire_dimension, nf90_open, NF90_64BIT_OFFSET, NF90_NETCDF4, & - nf90_inq_varid, nf90_inq_dimid, nf90_inquire, nf90_get_var, nf90_fill_float, & - nf90_fill_double, nf90_fill_int + use netcdf, only : nf90_create, nf90_def_dim, NF90_UNLIMITED, nf90_def_var, & + NF90_CHAR, nf90_put_att, NF90_INT, NF90_INT, NF90_GLOBAL, & + nf90_enddef, nf90_put_var, NF90_FLOAT, NF90_DOUBLE, NF90_BYTE, & + NF90_close, nf90_noerr, nf90_strerror, NF90_CLOBBER, & + NF90_MAX_NAME, NF90_WRITE, nf90_inq_varid, nf90_inquire_variable, & + nf90_inquire_dimension, nf90_open, NF90_64BIT_OFFSET, NF90_NETCDF4, & + nf90_inq_varid, nf90_inq_dimid, nf90_inquire, nf90_get_var, nf90_fill_float, & + nf90_fill_double, nf90_fill_int ! public routines ------------------------------------------------------------------- public :: close_netcdf ! save and close the netcdf file @@ -51,67 +51,67 @@ module mo_ncwrite ! public parameters integer(i4), public, parameter :: nMaxDim = 5 ! nr. max dimensions integer(i4), public, parameter :: nMaxAtt = 20 ! nr. max attributes - integer(i4), public, parameter :: maxLen = 256 ! nr. string length - integer(i4), public, parameter :: nGAtt = 20 ! nr. global attributes + integer(i4), public, parameter :: maxLen = 256 ! nr. string length + integer(i4), public, parameter :: nGAtt = 20 ! nr. global attributes integer(i4), public, parameter :: nAttDim = 2 ! dim array of attribute values ! public types ----------------------------------------------------------------- type dims - character (len=maxLen) :: name ! dim. name - integer(i4) :: len ! dim. lenght, undefined time => NF90_UNLIMITED - integer(i4) :: dimId ! dim. Id + character (len = maxLen) :: name ! dim. name + integer(i4) :: len ! dim. lenght, undefined time => NF90_UNLIMITED + integer(i4) :: dimId ! dim. Id end type dims type attribute - character (len=maxLen) :: name ! attribute name - integer(i4) :: xType ! attribute of the values - integer(i4) :: nValues ! number of attributes - character (len=maxLen) :: values ! numbers or "characters" separed by spaces + character (len = maxLen) :: name ! attribute name + integer(i4) :: xType ! attribute of the values + integer(i4) :: nValues ! number of attributes + character (len = maxLen) :: values ! numbers or "characters" separed by spaces end type attribute type variable - character (len=maxLen) :: name ! short name - integer(i4) :: xType ! NF90 var. type - integer(i4) :: nLvls ! number of levels - integer(i4) :: nSubs ! number of subparts - logical :: unlimited ! time limited - integer(i4) :: variD ! Id - integer(i4) :: nDims ! field dimension - integer(i4), dimension(nMaxDim) :: dimIds ! passing var. dimensions - integer(i4), dimension(nMaxDim) :: dimTypes ! type of dimensions - integer(i4) :: nAtt ! nr. attributes - type(attribute), dimension(nMaxAtt) :: att ! var. attributes - integer(i4), dimension(nMaxDim) :: start ! starting indices for netcdf - integer(i4), dimension(nMaxDim) :: count ! counter for netcdf - logical :: wFlag ! write flag - integer(i1), pointer :: G0_b ! array pointing model variables - integer(i1), dimension(: ), pointer :: G1_b ! array pointing model variables - integer(i1), dimension(:,: ), pointer :: G2_b ! array pointing model variables - integer(i1), dimension(:,:,: ), pointer :: G3_b ! array pointing model variables - integer(i1), dimension(:,:,:,:), pointer :: G4_b ! array pointing model variables - integer(i4), pointer :: G0_i ! array pointing model variables - integer(i4), dimension(: ), pointer :: G1_i ! array pointing model variables - integer(i4), dimension(:,: ), pointer :: G2_i ! array pointing model variables - integer(i4), dimension(:,:,: ), pointer :: G3_i ! array pointing model variables - integer(i4), dimension(:,:,:,:), pointer :: G4_i ! array pointing model variables - real(sp), pointer :: G0_f ! array pointing model variables - real(sp), dimension(: ), pointer :: G1_f ! array pointing model variables - real(sp), dimension(:,: ), pointer :: G2_f ! array pointing model variables - real(sp), dimension(:,:,: ), pointer :: G3_f ! array pointing model variables - real(sp), dimension(:,:,:,:), pointer :: G4_f ! array pointing model variables - real(dp), pointer :: G0_d ! array pointing model variables - real(dp), dimension(: ), pointer :: G1_d ! array pointing model variables - real(dp), dimension(:,: ), pointer :: G2_d ! array pointing model variables - real(dp), dimension(:,:,: ), pointer :: G3_d ! array pointing model variables - real(dp), dimension(:,:,:,:), pointer :: G4_d ! array pointing model variables + character (len = maxLen) :: name ! short name + integer(i4) :: xType ! NF90 var. type + integer(i4) :: nLvls ! number of levels + integer(i4) :: nSubs ! number of subparts + logical :: unlimited ! time limited + integer(i4) :: variD ! Id + integer(i4) :: nDims ! field dimension + integer(i4), dimension(nMaxDim) :: dimIds ! passing var. dimensions + integer(i4), dimension(nMaxDim) :: dimTypes ! type of dimensions + integer(i4) :: nAtt ! nr. attributes + type(attribute), dimension(nMaxAtt) :: att ! var. attributes + integer(i4), dimension(nMaxDim) :: start ! starting indices for netcdf + integer(i4), dimension(nMaxDim) :: count ! counter for netcdf + logical :: wFlag ! write flag + integer(i1), pointer :: G0_b ! array pointing model variables + integer(i1), dimension(:), pointer :: G1_b ! array pointing model variables + integer(i1), dimension(:, :), pointer :: G2_b ! array pointing model variables + integer(i1), dimension(:, :, :), pointer :: G3_b ! array pointing model variables + integer(i1), dimension(:, :, :, :), pointer :: G4_b ! array pointing model variables + integer(i4), pointer :: G0_i ! array pointing model variables + integer(i4), dimension(:), pointer :: G1_i ! array pointing model variables + integer(i4), dimension(:, :), pointer :: G2_i ! array pointing model variables + integer(i4), dimension(:, :, :), pointer :: G3_i ! array pointing model variables + integer(i4), dimension(:, :, :, :), pointer :: G4_i ! array pointing model variables + real(sp), pointer :: G0_f ! array pointing model variables + real(sp), dimension(:), pointer :: G1_f ! array pointing model variables + real(sp), dimension(:, :), pointer :: G2_f ! array pointing model variables + real(sp), dimension(:, :, :), pointer :: G3_f ! array pointing model variables + real(sp), dimension(:, :, :, :), pointer :: G4_f ! array pointing model variables + real(dp), pointer :: G0_d ! array pointing model variables + real(dp), dimension(:), pointer :: G1_d ! array pointing model variables + real(dp), dimension(:, :), pointer :: G2_d ! array pointing model variables + real(dp), dimension(:, :, :), pointer :: G3_d ! array pointing model variables + real(dp), dimension(:, :, :, :), pointer :: G4_d ! array pointing model variables end type variable ! public variables ----------------------------------------------------------------- - integer(i4), public :: nVars ! nr. variables - integer(i4), public :: nDims ! nr. dimensions - type (dims), public, dimension(:), allocatable :: Dnc ! dimensions list - type(variable), public, dimension(:), allocatable :: V ! variable list, THIS STRUCTURE WILL BE WRITTEN IN THE FILE - type(attribute), public, dimension(nGAtt) :: gatt ! global attributes for netcdf + integer(i4), public :: nVars ! nr. variables + integer(i4), public :: nDims ! nr. dimensions + type (dims), public, dimension(:), allocatable :: Dnc ! dimensions list + type(variable), public, dimension(:), allocatable :: V ! variable list, THIS STRUCTURE WILL BE WRITTEN IN THE FILE + type(attribute), public, dimension(nGAtt) :: gatt ! global attributes for netcdf ! ------------------------------------------------------------------ @@ -160,12 +160,12 @@ module mo_ncwrite ! - make i4 behave exactly as sp and dp ! Mar 2013 - lfs, netcdf4, deflate_level interface dump_netcdf - module procedure dump_netcdf_1d_sp, dump_netcdf_2d_sp, dump_netcdf_3d_sp, & - dump_netcdf_4d_sp, dump_netcdf_5d_sp, & - dump_netcdf_1d_dp, dump_netcdf_2d_dp, dump_netcdf_3d_dp, & - dump_netcdf_4d_dp, dump_netcdf_5d_dp, & - dump_netcdf_1d_i4, dump_netcdf_2d_i4, dump_netcdf_3d_i4, & - dump_netcdf_4d_i4, dump_netcdf_5d_i4 + module procedure dump_netcdf_1d_sp, dump_netcdf_2d_sp, dump_netcdf_3d_sp, & + dump_netcdf_4d_sp, dump_netcdf_5d_sp, & + dump_netcdf_1d_dp, dump_netcdf_2d_dp, dump_netcdf_3d_dp, & + dump_netcdf_4d_dp, dump_netcdf_5d_dp, & + dump_netcdf_1d_i4, dump_netcdf_2d_i4, dump_netcdf_3d_i4, & + dump_netcdf_4d_i4, dump_netcdf_5d_i4 end interface dump_netcdf @@ -221,9 +221,9 @@ module mo_ncwrite !> -2.1474836E+09 | integer(i4)\n !> 9.9692100E+36 | real(sp)\n !> 9.9692099683868690E+36 | real(dp)\n - !> These numbers are netcdf fortran 90 constants! They are used to determine the + !> These numbers are netcdf fortran 90 constants! They are used to determine the !> chunksize of the already written variable. Hence, this routine cannot append - !> correctly to variables when these numbers are used. Only five dimensional + !> correctly to variables when these numbers are used. Only five dimensional !> variables can be written, only one unlimited dimension can be defined. ! ! EXAMPLE @@ -299,11 +299,11 @@ module mo_ncwrite ! nrec for writing a specific record interface var2nc - module procedure var2nc_1d_i4, var2nc_1d_sp, var2nc_1d_dp, & - var2nc_2d_i4, var2nc_2d_sp, var2nc_2d_dp, & - var2nc_3d_i4, var2nc_3d_sp, var2nc_3d_dp, & - var2nc_4d_i4, var2nc_4d_sp, var2nc_4d_dp, & - var2nc_5d_i4, var2nc_5d_sp, var2nc_5d_dp + module procedure var2nc_1d_i4, var2nc_1d_sp, var2nc_1d_dp, & + var2nc_2d_i4, var2nc_2d_sp, var2nc_2d_dp, & + var2nc_3d_i4, var2nc_3d_sp, var2nc_3d_dp, & + var2nc_4d_i4, var2nc_4d_sp, var2nc_4d_dp, & + var2nc_5d_i4, var2nc_5d_sp, var2nc_5d_dp end interface var2nc ! ---------------------------------------------------------------------------- @@ -347,7 +347,7 @@ subroutine close_netcdf(ncId) implicit none - integer(i4), intent(in) :: ncId + integer(i4), intent(in) :: ncId ! close: save new netcdf dataset call check(nf90_close(ncId)) @@ -403,22 +403,22 @@ subroutine create_netcdf(Filename, ncid, lfs, netcdf4, deflate_level) implicit none ! netcdf related variables - character(len=*), intent(in) :: Filename - integer(i4), intent(out) :: ncid - logical, intent(in), optional :: lfs ! netcdf3 Large File Support - logical, intent(in), optional :: netcdf4 ! netcdf4 - integer(i4), intent(in), optional :: deflate_level ! compression level in netcdf4 - - integer(i4) :: i, j, k - integer(i4), dimension(nAttDim) :: att_INT - real(sp), dimension(nAttDim) :: att_FLOAT - real(dp), dimension(nAttDim) :: att_DOUBLE - character(len=maxLen), dimension(nAttDim) :: att_CHAR - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize - integer(i4), dimension(:), allocatable :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: Filename + integer(i4), intent(out) :: ncid + logical, intent(in), optional :: lfs ! netcdf3 Large File Support + logical, intent(in), optional :: netcdf4 ! netcdf4 + integer(i4), intent(in), optional :: deflate_level ! compression level in netcdf4 + + integer(i4) :: i, j, k + integer(i4), dimension(nAttDim) :: att_INT + real(sp), dimension(nAttDim) :: att_FLOAT + real(dp), dimension(nAttDim) :: att_DOUBLE + character(len = maxLen), dimension(nAttDim) :: att_CHAR + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize + integer(i4), dimension(:), allocatable :: chunksizes ! Size of chunks in netcdf4 writing LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -428,77 +428,77 @@ subroutine create_netcdf(Filename, ncid, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! 1 Create netcdf dataset: enter define mode -> get ncId if (inetcdf4) then - call check(nf90_create(trim(Filename), NF90_NETCDF4, ncId)) + call check(nf90_create(trim(Filename), NF90_NETCDF4, ncId)) else - if (LargeFile) then - call check(nf90_create(trim(Filename), NF90_64BIT_OFFSET, ncId, chunksize=buffersize)) - else - ! let the netcdf library chose a buffersize, that results in lesser write system calls - call check(nf90_create(trim(Filename), NF90_CLOBBER, ncId, chunksize=buffersize)) - end if + if (LargeFile) then + call check(nf90_create(trim(Filename), NF90_64BIT_OFFSET, ncId, chunksize = buffersize)) + else + ! let the netcdf library chose a buffersize, that results in lesser write system calls + call check(nf90_create(trim(Filename), NF90_CLOBBER, ncId, chunksize = buffersize)) + end if end if ! 2 Define dimensions -> get dimId - do i=1, nDims - call check(nf90_def_dim(ncId, Dnc(i)%name , Dnc(i)%len, Dnc(i)%dimId)) + do i = 1, nDims + call check(nf90_def_dim(ncId, Dnc(i)%name, Dnc(i)%len, Dnc(i)%dimId)) end do ! 3 Define dimids array, which is used to pass the dimids of the dimensions of ! the netcdf variables do i = 1, nVars - V(i)%unlimited = .false. - V(i)%dimids = 0 - V(i)%start = 1 - V(i)%count = 1 - do k = 1, V(i)%nDims - if (Dnc(V(i)%dimTypes(k))%len == NF90_UNLIMITED) V(i)%unlimited = .true. - V(i)%dimids(k) = Dnc(V(i)%dimTypes(k))%dimId - end do - if (V(i)%unlimited) then - ! set counts for unlimited files (time is always the last dimension) - if (V(i)%nDims == 1) cycle - do k = 1, V(i)%nDims - 1 - V(i)%count(k) = Dnc(V(i)%dimTypes(k))%len - end do - end if + V(i)%unlimited = .false. + V(i)%dimids = 0 + V(i)%start = 1 + V(i)%count = 1 + do k = 1, V(i)%nDims + if (Dnc(V(i)%dimTypes(k))%len == NF90_UNLIMITED) V(i)%unlimited = .true. + V(i)%dimids(k) = Dnc(V(i)%dimTypes(k))%dimId + end do + if (V(i)%unlimited) then + ! set counts for unlimited files (time is always the last dimension) + if (V(i)%nDims == 1) cycle + do k = 1, V(i)%nDims - 1 + V(i)%count(k) = Dnc(V(i)%dimTypes(k))%len + end do + end if end do ! 4 Define the netcdf variables and attributes -> get varId - allocate(chunksizes(maxval(V(1:nVars)%nDims))) - do i=1, nVars - if (.not. V(i)%wFlag) cycle - if (inetcdf4) then - chunksizes(1:V(i)%nDims) = Dnc(V(i)%dimTypes(1:V(i)%nDims))%len - chunksizes(V(i)%nDims) = 1 - call check(nf90_def_var(ncId, V(i)%name, V(i)%xtype, V(i)%dimids(1:V(i)%nDims), V(i)%varId, & - chunksizes=chunksizes(1:V(i)%nDims), shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncId, V(i)%name, V(i)%xtype, V(i)%dimids(1:V(i)%nDims), V(i)%varId)) - end if - do k = 1, V(i)%nAtt - select case (V(i)%att(k)%xType) - case (NF90_CHAR) - ! read(V(i)%att(k)%values, *) (att_CHAR(j), j =1, V(i)%att(k)%nValues) - read(V(i)%att(k)%values, '(a)') att_CHAR(1) - call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_CHAR(1))) - case (NF90_INT) - read(V(i)%att(k)%values, *) (att_INT(j), j =1, V(i)%att(k)%nValues) - call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_INT(1:V(i)%att(k)%nValues))) - case (NF90_FLOAT) - read(V(i)%att(k)%values, *) (att_FLOAT(j), j =1, V(i)%att(k)%nValues) - call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_FLOAT(1:V(i)%att(k)%nValues))) - case (NF90_DOUBLE) - read(V(i)%att(k)%values, *) (att_DOUBLE(j), j =1, V(i)%att(k)%nValues) - call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_DOUBLE(1:V(i)%att(k)%nValues))) - end select - end do + allocate(chunksizes(maxval(V(1 : nVars)%nDims))) + do i = 1, nVars + if (.not. V(i)%wFlag) cycle + if (inetcdf4) then + chunksizes(1 : V(i)%nDims) = Dnc(V(i)%dimTypes(1 : V(i)%nDims))%len + chunksizes(V(i)%nDims) = 1 + call check(nf90_def_var(ncId, V(i)%name, V(i)%xtype, V(i)%dimids(1 : V(i)%nDims), V(i)%varId, & + chunksizes = chunksizes(1 : V(i)%nDims), shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncId, V(i)%name, V(i)%xtype, V(i)%dimids(1 : V(i)%nDims), V(i)%varId)) + end if + do k = 1, V(i)%nAtt + select case (V(i)%att(k)%xType) + case (NF90_CHAR) + ! read(V(i)%att(k)%values, *) (att_CHAR(j), j =1, V(i)%att(k)%nValues) + read(V(i)%att(k)%values, '(a)') att_CHAR(1) + call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_CHAR(1))) + case (NF90_INT) + read(V(i)%att(k)%values, *) (att_INT(j), j = 1, V(i)%att(k)%nValues) + call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_INT(1 : V(i)%att(k)%nValues))) + case (NF90_FLOAT) + read(V(i)%att(k)%values, *) (att_FLOAT(j), j = 1, V(i)%att(k)%nValues) + call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_FLOAT(1 : V(i)%att(k)%nValues))) + case (NF90_DOUBLE) + read(V(i)%att(k)%values, *) (att_DOUBLE(j), j = 1, V(i)%att(k)%nValues) + call check(nf90_put_att (ncId, V(i)%varId, V(i)%att(k)%name, att_DOUBLE(1 : V(i)%att(k)%nValues))) + end select + end do end do ! 5 Global attributes do k = 1, nGAtt - if (nonull(Gatt(k)%name)) then - call check(nf90_put_att(ncId, NF90_GLOBAL, Gatt(k)%name, Gatt(k)%values)) - end if + if (nonull(Gatt(k)%name)) then + call check(nf90_put_att(ncId, NF90_GLOBAL, Gatt(k)%name, Gatt(k)%values)) + end if end do ! 6 end definitions: leave define mode @@ -515,40 +515,40 @@ subroutine dump_netcdf_1d_sp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(sp), dimension(:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 1 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim+1) :: dims ! Size of each dimension - integer(i4), dimension(ndim+1) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+2) :: varid ! dimension variables and var id - integer(i4), dimension(ndim+1) :: start ! start array for write of each time step - integer(i4), dimension(ndim+1) :: counter ! length array for write of each time step - integer(i4), dimension(ndim+1) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(sp), dimension(:), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 1 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim + 1) :: dims ! Size of each dimension + integer(i4), dimension(ndim + 1) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 2) :: varid ! dimension variables and var id + integer(i4), dimension(ndim + 1) :: start ! start array for write of each time step + integer(i4), dimension(ndim + 1) :: counter ! length array for write of each time step + integer(i4), dimension(ndim + 1) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -558,101 +558,101 @@ subroutine dump_netcdf_1d_sp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim+1))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+2))) - call check(nf90_inquire_variable(ncid, varid(ndim+2), ndims=idim, dimids=dimid)) - if (idim /= ndim+1) stop "dump_netcdf_1d_sp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim+1 - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim+1) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_1d_sp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_1d_sp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_1d_sp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = dims(ndim+1) + i - call check(nf90_put_var(ncid, varid(ndim+1), (/dims(ndim+1)+i/), (/dims(ndim+1)+i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim + 1))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 2))) + call check(nf90_inquire_variable(ncid, varid(ndim + 2), ndims = idim, dimids = dimid)) + if (idim /= ndim + 1) stop "dump_netcdf_1d_sp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + 1 + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim + 1) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_1d_sp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_1d_sp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_1d_sp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = dims(ndim + 1) + i + call check(nf90_put_var(ncid, varid(ndim + 1), (/dims(ndim + 1) + i/), (/dims(ndim + 1) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims(1:ndim) = shape(arr) - do i=1, ndim - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - dims(ndim+1) = 1 - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim+1))) - - ! define dim variables - do i=1, ndim - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim) = dims(1:ndim) - chunksizes(ndim+1) = 1 - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+2), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+2))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = i - call check(nf90_put_var(ncid, varid(ndim+1), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims(1 : ndim) = shape(arr) + do i = 1, ndim + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + dims(ndim + 1) = 1 + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim + 1))) + + ! define dim variables + do i = 1, ndim + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim) = dims(1 : ndim) + chunksizes(ndim + 1) = 1 + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 2), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 2))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = i + call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do end if ! close netcdf file @@ -665,40 +665,40 @@ subroutine dump_netcdf_2d_sp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(sp), dimension(:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 2 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim+1) :: dims ! Size of each dimension - integer(i4), dimension(ndim+1) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+2) :: varid ! dimension variables and var id - integer(i4), dimension(ndim+1) :: start ! start array for write of each time step - integer(i4), dimension(ndim+1) :: counter ! length array for write of each time step - integer(i4), dimension(ndim+1) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(sp), dimension(:, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 2 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim + 1) :: dims ! Size of each dimension + integer(i4), dimension(ndim + 1) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 2) :: varid ! dimension variables and var id + integer(i4), dimension(ndim + 1) :: start ! start array for write of each time step + integer(i4), dimension(ndim + 1) :: counter ! length array for write of each time step + integer(i4), dimension(ndim + 1) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -708,101 +708,101 @@ subroutine dump_netcdf_2d_sp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim+1))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+2))) - call check(nf90_inquire_variable(ncid, varid(ndim+2), ndims=idim, dimids=dimid)) - if (idim /= ndim+1) stop "dump_netcdf_2d_sp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim+1 - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim+1) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_2d_sp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_2d_sp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_2d_sp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = dims(ndim+1) + i - call check(nf90_put_var(ncid, varid(ndim+1), (/dims(ndim+1)+i/), (/dims(ndim+1)+i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim + 1))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 2))) + call check(nf90_inquire_variable(ncid, varid(ndim + 2), ndims = idim, dimids = dimid)) + if (idim /= ndim + 1) stop "dump_netcdf_2d_sp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + 1 + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim + 1) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_2d_sp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_2d_sp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_2d_sp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = dims(ndim + 1) + i + call check(nf90_put_var(ncid, varid(ndim + 1), (/dims(ndim + 1) + i/), (/dims(ndim + 1) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims(1:ndim) = shape(arr) - do i=1, ndim - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - dims(ndim+1) = 1 - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim+1))) - - ! define dim variables - do i=1, ndim - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim) = dims(1:ndim) - chunksizes(ndim+1) = 1 - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+2), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+2))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = i - call check(nf90_put_var(ncid, varid(ndim+1), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims(1 : ndim) = shape(arr) + do i = 1, ndim + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + dims(ndim + 1) = 1 + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim + 1))) + + ! define dim variables + do i = 1, ndim + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim) = dims(1 : ndim) + chunksizes(ndim + 1) = 1 + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 2), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 2))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = i + call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do end if ! close netcdf file @@ -815,40 +815,40 @@ subroutine dump_netcdf_3d_sp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(sp), dimension(:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 3 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(sp), dimension(:, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 3 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -858,100 +858,100 @@ subroutine dump_netcdf_3d_sp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_3d_sp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_3d_sp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_3d_sp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_3d_sp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_3d_sp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_3d_sp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_3d_sp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_3d_sp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter)) + end do end if ! close netcdf file @@ -964,40 +964,40 @@ subroutine dump_netcdf_4d_sp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(sp), dimension(:,:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 4 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(sp), dimension(:, :, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 4 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1007,100 +1007,100 @@ subroutine dump_netcdf_4d_sp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_4d_sp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_4d_sp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_4d_sp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_4d_sp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_4d_sp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_4d_sp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_4d_sp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_4d_sp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter)) + end do end if ! close netcdf file @@ -1113,40 +1113,40 @@ subroutine dump_netcdf_5d_sp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(sp), dimension(:,:,:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 5 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(sp), dimension(:, :, :, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 5 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1156,100 +1156,100 @@ subroutine dump_netcdf_5d_sp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_5d_sp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_5d_sp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_5d_sp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_5d_sp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_5d_sp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_5d_sp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_5d_sp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_5d_sp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_FLOAT, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter)) + end do end if ! close netcdf file @@ -1262,40 +1262,40 @@ subroutine dump_netcdf_1d_dp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(dp), dimension(:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 1 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim+1) :: dims ! Size of each dimension - integer(i4), dimension(ndim+1) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+2) :: varid ! dimension variables and var id - integer(i4), dimension(ndim+1) :: start ! start array for write of each time step - integer(i4), dimension(ndim+1) :: counter ! length array for write of each time step - integer(i4), dimension(ndim+1) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(dp), dimension(:), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 1 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim + 1) :: dims ! Size of each dimension + integer(i4), dimension(ndim + 1) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 2) :: varid ! dimension variables and var id + integer(i4), dimension(ndim + 1) :: start ! start array for write of each time step + integer(i4), dimension(ndim + 1) :: counter ! length array for write of each time step + integer(i4), dimension(ndim + 1) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1305,101 +1305,101 @@ subroutine dump_netcdf_1d_dp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim+1))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+2))) - call check(nf90_inquire_variable(ncid, varid(ndim+2), ndims=idim, dimids=dimid)) - if (idim /= ndim+1) stop "dump_netcdf_1d_dp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim+1 - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim+1) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_1d_dp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_1d_dp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_1d_dp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = dims(ndim+1) + i - call check(nf90_put_var(ncid, varid(ndim+1), (/dims(ndim+1)+i/), (/dims(ndim+1)+i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim + 1))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 2))) + call check(nf90_inquire_variable(ncid, varid(ndim + 2), ndims = idim, dimids = dimid)) + if (idim /= ndim + 1) stop "dump_netcdf_1d_dp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + 1 + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim + 1) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_1d_dp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_1d_dp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_1d_dp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = dims(ndim + 1) + i + call check(nf90_put_var(ncid, varid(ndim + 1), (/dims(ndim + 1) + i/), (/dims(ndim + 1) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims(1:ndim) = shape(arr) - do i=1, ndim - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - dims(ndim+1) = 1 - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim+1))) - - ! define dim variables - do i=1, ndim - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim) = dims(1:ndim) - chunksizes(ndim+1) = 1 - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+2), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+2))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = i - call check(nf90_put_var(ncid, varid(ndim+1), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims(1 : ndim) = shape(arr) + do i = 1, ndim + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + dims(ndim + 1) = 1 + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim + 1))) + + ! define dim variables + do i = 1, ndim + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim) = dims(1 : ndim) + chunksizes(ndim + 1) = 1 + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 2), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 2))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = i + call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do end if ! close netcdf file @@ -1412,40 +1412,40 @@ subroutine dump_netcdf_2d_dp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(dp), dimension(:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 2 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim+1) :: dims ! Size of each dimension - integer(i4), dimension(ndim+1) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+2) :: varid ! dimension variables and var id - integer(i4), dimension(ndim+1) :: start ! start array for write of each time step - integer(i4), dimension(ndim+1) :: counter ! length array for write of each time step - integer(i4), dimension(ndim+1) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(dp), dimension(:, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 2 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim + 1) :: dims ! Size of each dimension + integer(i4), dimension(ndim + 1) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 2) :: varid ! dimension variables and var id + integer(i4), dimension(ndim + 1) :: start ! start array for write of each time step + integer(i4), dimension(ndim + 1) :: counter ! length array for write of each time step + integer(i4), dimension(ndim + 1) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1455,101 +1455,101 @@ subroutine dump_netcdf_2d_dp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim+1))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+2))) - call check(nf90_inquire_variable(ncid, varid(ndim+2), ndims=idim, dimids=dimid)) - if (idim /= ndim+1) stop "dump_netcdf_2d_dp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim+1 - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim+1) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_2d_dp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_2d_dp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_2d_dp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = dims(ndim+1) + i - call check(nf90_put_var(ncid, varid(ndim+1), (/dims(ndim+1)+i/), (/dims(ndim+1)+i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim + 1))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 2))) + call check(nf90_inquire_variable(ncid, varid(ndim + 2), ndims = idim, dimids = dimid)) + if (idim /= ndim + 1) stop "dump_netcdf_2d_dp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + 1 + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim + 1) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_2d_dp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_2d_dp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_2d_dp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = dims(ndim + 1) + i + call check(nf90_put_var(ncid, varid(ndim + 1), (/dims(ndim + 1) + i/), (/dims(ndim + 1) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims(1:ndim) = shape(arr) - do i=1, ndim - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - dims(ndim+1) = 1 - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim+1))) - - ! define dim variables - do i=1, ndim - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim) = dims(1:ndim) - chunksizes(ndim+1) = 1 - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+2), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+2))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = i - call check(nf90_put_var(ncid, varid(ndim+1), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims(1 : ndim) = shape(arr) + do i = 1, ndim + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + dims(ndim + 1) = 1 + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim + 1))) + + ! define dim variables + do i = 1, ndim + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim) = dims(1 : ndim) + chunksizes(ndim + 1) = 1 + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 2), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 2))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = i + call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do end if ! close netcdf file @@ -1562,40 +1562,40 @@ subroutine dump_netcdf_3d_dp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(dp), dimension(:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 3 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(dp), dimension(:, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 3 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1605,101 +1605,101 @@ subroutine dump_netcdf_3d_dp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_3d_dp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_3d_dp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_3d_dp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_3d_dp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_3d_dp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_3d_dp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_3d_dp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_3d_dp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - ! call check(nf90_set_fill(ncid, NF90_NOFILL, old_fill_mode)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(Filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + ! call check(nf90_set_fill(ncid, NF90_NOFILL, old_fill_mode)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(Filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter)) + end do end if ! close netcdf file @@ -1712,40 +1712,40 @@ subroutine dump_netcdf_4d_dp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(dp), dimension(:,:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 4 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(dp), dimension(:, :, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 4 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1755,100 +1755,100 @@ subroutine dump_netcdf_4d_dp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_4d_dp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_4d_dp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_4d_dp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_4d_dp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_4d_dp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_4d_dp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_4d_dp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_4d_dp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter)) + end do end if ! close netcdf file @@ -1861,40 +1861,40 @@ subroutine dump_netcdf_5d_dp(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - real(dp), dimension(:,:,:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 5 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + real(dp), dimension(:, :, :, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 5 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -1904,100 +1904,100 @@ subroutine dump_netcdf_5d_dp(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_5d_dp: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_5d_dp: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_5d_dp: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_5d_dp: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_5d_dp: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_5d_dp: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_5d_dp: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_5d_dp: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_DOUBLE, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter)) + end do end if ! close netcdf file @@ -2010,40 +2010,40 @@ subroutine dump_netcdf_1d_i4(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - integer(i4), dimension(:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 1 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim+1) :: dims ! Size of each dimension - integer(i4), dimension(ndim+1) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+2) :: varid ! dimension variables and var id - integer(i4), dimension(ndim+1) :: start ! start array for write of each time step - integer(i4), dimension(ndim+1) :: counter ! length array for write of each time step - integer(i4), dimension(ndim+1) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + integer(i4), dimension(:), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 1 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim + 1) :: dims ! Size of each dimension + integer(i4), dimension(ndim + 1) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 2) :: varid ! dimension variables and var id + integer(i4), dimension(ndim + 1) :: start ! start array for write of each time step + integer(i4), dimension(ndim + 1) :: counter ! length array for write of each time step + integer(i4), dimension(ndim + 1) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -2053,101 +2053,101 @@ subroutine dump_netcdf_1d_i4(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim+1))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+2))) - call check(nf90_inquire_variable(ncid, varid(ndim+2), ndims=idim, dimids=dimid)) - if (idim /= ndim+1) stop "dump_netcdf_1d_i4: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim+1 - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim+1) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_1d_i4: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_1d_i4: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_1d_i4: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = dims(ndim+1) + i - call check(nf90_put_var(ncid, varid(ndim+1), (/dims(ndim+1)+i/), (/dims(ndim+1)+i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim + 1))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 2))) + call check(nf90_inquire_variable(ncid, varid(ndim + 2), ndims = idim, dimids = dimid)) + if (idim /= ndim + 1) stop "dump_netcdf_1d_i4: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + 1 + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim + 1) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_1d_i4: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_1d_i4: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_1d_i4: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = dims(ndim + 1) + i + call check(nf90_put_var(ncid, varid(ndim + 1), (/dims(ndim + 1) + i/), (/dims(ndim + 1) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims(1:ndim) = shape(arr) - do i=1, ndim - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - dims(ndim+1) = 1 - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim+1))) - - ! define dim variables - do i=1, ndim - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim) = dims(1:ndim) - chunksizes(ndim+1) = 1 - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+2), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+2))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = i - call check(nf90_put_var(ncid, varid(ndim+1), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims(1 : ndim) = shape(arr) + do i = 1, ndim + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + dims(ndim + 1) = 1 + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim + 1))) + + ! define dim variables + do i = 1, ndim + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim) = dims(1 : ndim) + chunksizes(ndim + 1) = 1 + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 2), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 2))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = i + call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do end if ! close netcdf file @@ -2160,40 +2160,40 @@ subroutine dump_netcdf_2d_i4(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - integer(i4), dimension(:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 2 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim+1) :: dims ! Size of each dimension - integer(i4), dimension(ndim+1) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+2) :: varid ! dimension variables and var id - integer(i4), dimension(ndim+1) :: start ! start array for write of each time step - integer(i4), dimension(ndim+1) :: counter ! length array for write of each time step - integer(i4), dimension(ndim+1) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + integer(i4), dimension(:, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 2 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim + 1) :: dims ! Size of each dimension + integer(i4), dimension(ndim + 1) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 2) :: varid ! dimension variables and var id + integer(i4), dimension(ndim + 1) :: start ! start array for write of each time step + integer(i4), dimension(ndim + 1) :: counter ! length array for write of each time step + integer(i4), dimension(ndim + 1) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -2203,101 +2203,101 @@ subroutine dump_netcdf_2d_i4(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim+1))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+2))) - call check(nf90_inquire_variable(ncid, varid(ndim+2), ndims=idim, dimids=dimid)) - if (idim /= ndim+1) stop "dump_netcdf_2d_i4: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim+1 - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim+1) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_2d_i4: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_2d_i4: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_2d_i4: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = dims(ndim+1) + i - call check(nf90_put_var(ncid, varid(ndim+1), (/dims(ndim+1)+i/), (/dims(ndim+1)+i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim + 1))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 2))) + call check(nf90_inquire_variable(ncid, varid(ndim + 2), ndims = idim, dimids = dimid)) + if (idim /= ndim + 1) stop "dump_netcdf_2d_i4: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + 1 + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim + 1) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_2d_i4: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_2d_i4: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_2d_i4: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = dims(ndim + 1) + i + call check(nf90_put_var(ncid, varid(ndim + 1), (/dims(ndim + 1) + i/), (/dims(ndim + 1) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims(1:ndim) = shape(arr) - do i=1, ndim - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - dims(ndim+1) = 1 - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim+1))) - - ! define dim variables - do i=1, ndim - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim+1), varid(ndim+1))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim) = dims(1:ndim) - chunksizes(ndim+1) = 1 - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+2), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+2))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim+1) = 1 - do i=1, 1 - start(ndim+1) = i - call check(nf90_put_var(ncid, varid(ndim+1), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+2), arr, start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims(1 : ndim) = shape(arr) + do i = 1, ndim + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + dims(ndim + 1) = 1 + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim + 1))) + + ! define dim variables + do i = 1, ndim + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim + 1), varid(ndim + 1))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim) = dims(1 : ndim) + chunksizes(ndim + 1) = 1 + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 2), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 2))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim + 1) = 1 + do i = 1, 1 + start(ndim + 1) = i + call check(nf90_put_var(ncid, varid(ndim + 1), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 2), arr, start, counter)) + end do end if ! close netcdf file @@ -2310,40 +2310,40 @@ subroutine dump_netcdf_3d_i4(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - integer(i4), dimension(:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 3 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + integer(i4), dimension(:, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 3 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -2353,100 +2353,100 @@ subroutine dump_netcdf_3d_i4(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_3d_i4: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_3d_i4: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_3d_i4: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_3d_i4: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_3d_i4: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_3d_i4: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_3d_i4: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_3d_i4: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, i), start, counter)) + end do end if ! close netcdf file @@ -2459,40 +2459,40 @@ subroutine dump_netcdf_4d_i4(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - integer(i4), dimension(:,:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 4 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + integer(i4), dimension(:, :, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 4 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -2502,100 +2502,100 @@ subroutine dump_netcdf_4d_i4(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_4d_i4: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_4d_i4: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_4d_i4: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_4d_i4: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_4d_i4: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_4d_i4: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_4d_i4: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_4d_i4: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, i), start, counter)) + end do end if ! close netcdf file @@ -2608,40 +2608,40 @@ subroutine dump_netcdf_5d_i4(filename, arr, append, lfs, netcdf4, deflate_level) implicit none - character(len=*), intent(in) :: filename ! netcdf file name - integer(i4), dimension(:,:,:,:,:), intent(in) :: arr ! input array - logical, optional, intent(in) :: append ! append to existing file - logical, optional, intent(in) :: lfs ! netcdf3 Large File Support - logical, optional, intent(in) :: netcdf4 ! netcdf4 - integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 - - integer(i4), parameter :: ndim = 5 ! Routine for ndim dimensional array - character(len=1), dimension(4) :: dnames ! Common dimension names - integer(i4), dimension(ndim) :: dims ! Size of each dimension - integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension - integer(i4), dimension(ndim+1) :: varid ! dimension variables and var id - integer(i4), dimension(ndim) :: start ! start array for write of each time step - integer(i4), dimension(ndim) :: counter ! length array for write of each time step - integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing + character(len = *), intent(in) :: filename ! netcdf file name + integer(i4), dimension(:, :, :, :, :), intent(in) :: arr ! input array + logical, optional, intent(in) :: append ! append to existing file + logical, optional, intent(in) :: lfs ! netcdf3 Large File Support + logical, optional, intent(in) :: netcdf4 ! netcdf4 + integer(i4), optional, intent(in) :: deflate_level ! compression level in netcdf4 + + integer(i4), parameter :: ndim = 5 ! Routine for ndim dimensional array + character(len = 1), dimension(4) :: dnames ! Common dimension names + integer(i4), dimension(ndim) :: dims ! Size of each dimension + integer(i4), dimension(ndim) :: dimid ! netcdf IDs of each dimension + integer(i4), dimension(ndim + 1) :: varid ! dimension variables and var id + integer(i4), dimension(ndim) :: start ! start array for write of each time step + integer(i4), dimension(ndim) :: counter ! length array for write of each time step + integer(i4), dimension(ndim) :: chunksizes ! Size of chunks in netcdf4 writing integer(i4) :: ncid ! netcdf file id integer(i4) :: i, j - logical :: iappend - integer(i4) :: idim ! read dimension on append + logical :: iappend + integer(i4) :: idim ! read dimension on append character(NF90_MAX_NAME) :: name ! name of dimensions from nf90_inquire_dimension - logical :: LargeFile - logical :: inetcdf4 - integer(i4) :: deflate - integer(i4) :: buffersize + logical :: LargeFile + logical :: inetcdf4 + integer(i4) :: deflate + integer(i4) :: buffersize ! append or not if (present(append)) then - if (append) then - iappend = .true. - else - iappend = .false. - end if + if (append) then + iappend = .true. + else + iappend = .false. + end if else - iappend = .false. + iappend = .false. end if LargeFile = .false. if (present(lfs)) LargeFile = lfs @@ -2651,100 +2651,100 @@ subroutine dump_netcdf_5d_i4(filename, arr, append, lfs, netcdf4, deflate_level) if (present(deflate_level)) deflate = deflate_level ! dimension names - dnames(1:4) = (/ 'x', 'y', 'z', 'l' /) + dnames(1 : 4) = (/ 'x', 'y', 'z', 'l' /) if (iappend) then - ! open file - call check(nf90_open(trim(filename), NF90_WRITE, ncid)) - - ! inquire variables time and var - call check(nf90_inq_varid(ncid, 'time', varid(ndim))) - call check(nf90_inq_varid(ncid, 'var', varid(ndim+1))) - call check(nf90_inquire_variable(ncid, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim /= ndim) stop "dump_netcdf_5d_i4: number of variable dimensions /= number of file variable dimensions." - - ! inquire dimensions - do i=1, ndim - call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) - if (i < ndim) then - if (trim(name) /= dnames(i)) stop "dump_netcdf_5d_i4: dimension name problem." - if (dims(i) /= size(arr,i)) stop "dump_netcdf_5d_i4: variable dimension /= file variable dimension." - else - if (trim(name) /= 'time') stop "dump_netcdf_5d_i4: time name problem." - end if - enddo - - ! append - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, size(arr,ndim) - start(ndim) = dims(ndim) + i - call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim)+i/), (/dims(ndim)+i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,:,i), start, counter)) - end do + ! open file + call check(nf90_open(trim(filename), NF90_WRITE, ncid)) + + ! inquire variables time and var + call check(nf90_inq_varid(ncid, 'time', varid(ndim))) + call check(nf90_inq_varid(ncid, 'var', varid(ndim + 1))) + call check(nf90_inquire_variable(ncid, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim /= ndim) stop "dump_netcdf_5d_i4: number of variable dimensions /= number of file variable dimensions." + + ! inquire dimensions + do i = 1, ndim + call check(nf90_inquire_dimension(ncid, dimid(i), name, dims(i))) + if (i < ndim) then + if (trim(name) /= dnames(i)) stop "dump_netcdf_5d_i4: dimension name problem." + if (dims(i) /= size(arr, i)) stop "dump_netcdf_5d_i4: variable dimension /= file variable dimension." + else + if (trim(name) /= 'time') stop "dump_netcdf_5d_i4: time name problem." + end if + enddo + + ! append + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, size(arr, ndim) + start(ndim) = dims(ndim) + i + call check(nf90_put_var(ncid, varid(ndim), (/dims(ndim) + i/), (/dims(ndim) + i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter)) + end do else - ! open file - if (inetcdf4) then - call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) - else - if (LargeFile) then - call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize=buffersize)) - else - call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize=buffersize)) - end if - end if - - ! define dims - dims = shape(arr) - do i=1, ndim-1 - call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) - end do - ! define dim time - call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) - - ! define dim variables - do i=1, ndim-1 - if (inetcdf4) then - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - else - call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) - end if - end do - ! define time variable - if (inetcdf4) then - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - else - call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) - end if - - ! define variable - if (inetcdf4) then - chunksizes(1:ndim-1) = dims(1:ndim-1) - chunksizes(ndim) = 1 - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+1), & - chunksizes=chunksizes, shuffle=.true., deflate_level=deflate)) - else - call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim+1))) - end if - - ! end define mode - call check(nf90_enddef(ncid)) - - ! write dimensions - do i=1, ndim-1 - call check(nf90_put_var(ncid, varid(i), (/ (j, j=1,dims(i)) /))) - end do - - ! write time and variable - start(:) = 1 - counter(:) = dims - counter(ndim) = 1 - do i=1, dims(ndim) - start(ndim) = i - call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) - call check(nf90_put_var(ncid, varid(ndim+1), arr(:,:,:,:,i), start, counter)) - end do + ! open file + if (inetcdf4) then + call check(nf90_create(trim(filename), NF90_NETCDF4, ncid)) + else + if (LargeFile) then + call check(nf90_create(trim(filename), NF90_64BIT_OFFSET, ncid, chunksize = buffersize)) + else + call check(nf90_create(trim(filename), NF90_CLOBBER, ncid, chunksize = buffersize)) + end if + end if + + ! define dims + dims = shape(arr) + do i = 1, ndim - 1 + call check(nf90_def_dim(ncid, dnames(i), dims(i), dimid(i))) + end do + ! define dim time + call check(nf90_def_dim(ncid, 'time', NF90_UNLIMITED, dimid(ndim))) + + ! define dim variables + do i = 1, ndim - 1 + if (inetcdf4) then + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + else + call check(nf90_def_var(ncid, dnames(i), NF90_INT, dimid(i), varid(i))) + end if + end do + ! define time variable + if (inetcdf4) then + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + else + call check(nf90_def_var(ncid, 'time', NF90_INT, dimid(ndim), varid(ndim))) + end if + + ! define variable + if (inetcdf4) then + chunksizes(1 : ndim - 1) = dims(1 : ndim - 1) + chunksizes(ndim) = 1 + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes, shuffle = .true., deflate_level = deflate)) + else + call check(nf90_def_var(ncid, 'var', NF90_INT, dimid, varid(ndim + 1))) + end if + + ! end define mode + call check(nf90_enddef(ncid)) + + ! write dimensions + do i = 1, ndim - 1 + call check(nf90_put_var(ncid, varid(i), (/ (j, j = 1, dims(i)) /))) + end do + + ! write time and variable + start(:) = 1 + counter(:) = dims + counter(ndim) = 1 + do i = 1, dims(ndim) + start(ndim) = i + call check(nf90_put_var(ncid, varid(ndim), (/i/), (/i/))) + call check(nf90_put_var(ncid, varid(ndim + 1), arr(:, :, :, :, i), start, counter)) + end do end if ! close netcdf file @@ -2756,2656 +2756,2656 @@ end subroutine dump_netcdf_5d_i4 ! ------------------------------------------------------------------ - subroutine var2nc_1d_i4( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_1d_i4(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 1 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - integer(i4), dimension(:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + integer(i4), dimension(:), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! attributes - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - character(256), dimension(:,:), optional, intent(in) :: attributes - integer(i4), optional, intent(in) :: missing_value - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + character(256), dimension(:, :), optional, intent(in) :: attributes + integer(i4), optional, intent(in) :: missing_value + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid - integer(i4) :: u_len ! length of unlimited dimension - integer(i4) :: f_handle + integer(i4) :: idim ! read dimension on append + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid + integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: f_handle integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - integer(i4), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + integer(i4), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( size( dnames, 1) .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( size( dnames, 1) .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((size(dnames, 1) .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (size(dnames, 1) .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1) /) - dims(1:ndim_const) = shape( arr ) + chunksizes = (/ size(arr, 1) /) + dims(1 : ndim_const) = shape(arr) end if - start(:) = 1 - counter(:) = dims - dummy = nf90_fill_int - dummy_count = 1 + start(:) = 1 + counter(:) = dims + dummy = nf90_fill_int + dummy_count = 1 ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim .ne. ndim) stop "var2nc_1d_i4: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_1d_i4: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_1d_i4: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( dummy(1) /= nf90_fill_int ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim .ne. ndim) stop "var2nc_1d_i4: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_1d_i4: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_1d_i4: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (dummy(1) /= nf90_fill_int) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimension - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimension + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(I6)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim+1),& - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(I6)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! inquire dimensions - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_1d_i4: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_1d_i4: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_1d_i4: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_1d_i4: variable dimension /= file variable dimension." enddo ! write time and variable - call check(nf90_put_var(f_handle, varid(ndim+1), arr, start, counter ) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_1d_i4 - subroutine var2nc_1d_sp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_1d_sp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 1 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(sp), dimension(:), intent(in) :: arr - character(len=*), dimension(:), intent(in) :: dnames - character(len=*), intent(in) :: v_name + character(len = *), intent(in) :: f_name + real(sp), dimension(:), intent(in) :: arr + character(len = *), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: v_name ! attributes - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - character(256), dimension(:,:), optional, intent(in) :: attributes - real(sp), optional, intent(in) :: missing_value - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + character(256), dimension(:, :), optional, intent(in) :: attributes + real(sp), optional, intent(in) :: missing_value + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid - integer(i4) :: u_len ! length of unlimited dimension - integer(i4) :: f_handle + integer(i4) :: idim ! read dimension on append + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid + integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: f_handle integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(sp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(sp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( size( dnames, 1) .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( size( dnames, 1) .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((size(dnames, 1) .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (size(dnames, 1) .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1) /) - dims(1:ndim_const) = shape( arr ) + chunksizes = (/ size(arr, 1) /) + dims(1 : ndim_const) = shape(arr) end if - start(:) = 1 - counter(:) = dims - dummy_count = 1 - dummy = nf90_fill_float + start(:) = 1 + counter(:) = dims + dummy_count = 1 + dummy = nf90_fill_float ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim .ne. ndim) stop "var2nc_1d_sp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_1d_sp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_1d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_float) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim .ne. ndim) stop "var2nc_1d_sp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_1d_sp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_1d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_float)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimension - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimension + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim+1),& - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! inquire dimensions - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_1d_sp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_1d_sp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_1d_sp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_1d_sp: variable dimension /= file variable dimension." enddo ! write time and variable - call check(nf90_put_var(f_handle, varid(ndim+1), arr, start, counter ) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_1d_sp - subroutine var2nc_1d_dp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_1d_dp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 1 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(dp), dimension(:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(dp), dimension(:), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! attributes - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - character(256), dimension(:,:), optional, intent(in) :: attributes - real(dp), optional, intent(in) :: missing_value - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + character(256), dimension(:, :), optional, intent(in) :: attributes + real(dp), optional, intent(in) :: missing_value + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid - integer(i4) :: u_len ! length of unlimited dimension - integer(i4) :: f_handle + integer(i4) :: idim ! read dimension on append + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid + integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: f_handle integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(dp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(dp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( size( dnames, 1) .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( size( dnames, 1) .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((size(dnames, 1) .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (size(dnames, 1) .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1) /) - dims(1:ndim_const) = shape( arr ) + chunksizes = (/ size(arr, 1) /) + dims(1 : ndim_const) = shape(arr) end if - start(:) = 1 - counter(:) = dims - dummy_count = 1 - dummy = nf90_fill_double + start(:) = 1 + counter(:) = dims + dummy_count = 1 + dummy = nf90_fill_double ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - if (idim .ne. ndim) stop "var2nc_1d_dp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_1d_dp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_1d_dp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_double) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + if (idim .ne. ndim) stop "var2nc_1d_dp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_1d_dp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_1d_dp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_double)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimension - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimension + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim+1),& - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! inquire dimensions - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_1d_dp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_1d_dp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_1d_dp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_1d_dp: variable dimension /= file variable dimension." enddo ! write time and variable - call check(nf90_put_var(f_handle, varid(ndim+1), arr, start, counter ) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_1d_dp - subroutine var2nc_2d_i4( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_2d_i4(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 2 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - integer(i4), dimension(:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + integer(i4), dimension(:, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - integer(i4), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + integer(i4), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - integer(i4), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + integer(i4), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_int + chunksizes = (/ size(arr, 1), size(arr, 2) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_int ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_2d_i4: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_2d_i4: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_2d_i4: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( dummy(1) /= nf90_fill_int ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_2d_i4: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_2d_i4: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_2d_i4: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (dummy(1) /= nf90_fill_int) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim+1),& - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(I6)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(I6)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_2d_i4: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_2d_i4: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_2d_i4: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_2d_i4: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_2d_i4 - subroutine var2nc_2d_sp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_2d_sp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 2 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(sp), dimension(:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(sp), dimension(:, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(sp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(sp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(sp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(sp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_float + chunksizes = (/ size(arr, 1), size(arr, 2) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_float ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_2d_sp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_2d_sp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_2d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_float) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_2d_sp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_2d_sp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_2d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_float)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim+1),& - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_2d_sp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_2d_sp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_2d_sp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_2d_sp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_2d_sp - subroutine var2nc_2d_dp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_2d_dp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 2 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(dp), dimension(:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(dp), dimension(:, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(dp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(dp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(dp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(dp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1 - dummy = nf90_fill_double + chunksizes = (/ size(arr, 1), size(arr, 2) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1 + dummy = nf90_fill_double ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_2d_dp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_2d_dp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_2d_dp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_double) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_2d_dp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_2d_dp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_2d_dp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_double)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att(f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att(f_handle, varid(ndim+1), 'missing_value',missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_2d_dp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_2d_dp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_2d_dp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_2d_dp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_2d_dp - subroutine var2nc_3d_i4( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_3d_i4(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 3 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - integer(i4), dimension(:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + integer(i4), dimension(:, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - integer(i4), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + integer(i4), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - integer(i4), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + integer(i4), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_int + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_int ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_3d_i4: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_3d_i4: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_3d_i4: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( dummy(1) /= nf90_fill_int ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_3d_i4: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_3d_i4: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_3d_i4: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (dummy(1) /= nf90_fill_int) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(I6)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(I6)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_3d_i4: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_3d_i4: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_3d_i4: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_3d_i4: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_3d_i4 - subroutine var2nc_3d_sp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_3d_sp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 3 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(sp), dimension(:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(sp), dimension(:, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(sp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(sp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(sp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(sp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 + deflate = 1 ! set chunk sizes and dimension names - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_float + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_float ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_3d_sp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_3d_sp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_3d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_float) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_3d_sp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_3d_sp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_3d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_float)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_3d_sp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_3d_sp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_3d_sp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_3d_sp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_3d_sp - subroutine var2nc_3d_dp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_3d_dp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 3 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(dp), dimension(:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(dp), dimension(:, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(dp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(dp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(dp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(dp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1 - dummy = nf90_fill_double + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1 + dummy = nf90_fill_double ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_3d_dp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_3d_dp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_3d_dp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_double) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_3d_dp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_3d_dp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_3d_dp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_double)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att(f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att(f_handle, varid(ndim+1), 'missing_value',missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_3d_dp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_3d_dp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_3d_dp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_3d_dp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_3d_dp - subroutine var2nc_4d_i4( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_4d_i4(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 4 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - integer(i4), dimension(:,:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + integer(i4), dimension(:, :, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - integer(i4), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + integer(i4), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - integer(i4), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + integer(i4), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), & - size( arr, 3), size( arr, 4 ), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), & + size(arr, 3), size(arr, 4), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2), & - size( arr, 3), size( arr, 4) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_int + chunksizes = (/ size(arr, 1), size(arr, 2), & + size(arr, 3), size(arr, 4) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_int ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_4d_i4: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_4d_i4: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_4d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( dummy(1) /= nf90_fill_int ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_4d_i4: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_4d_i4: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_4d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (dummy(1) /= nf90_fill_int) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(I6)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(I6)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_4d_i4: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_4d_i4: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_4d_i4: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_4d_i4: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_4d_i4 - subroutine var2nc_4d_sp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_4d_sp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 4 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(sp), dimension(:,:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(sp), dimension(:, :, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(sp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(sp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(sp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(sp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), & - size( arr, 3), size( arr, 4 ), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), & + size(arr, 3), size(arr, 4), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2), & - size( arr, 3), size( arr, 4) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_float + chunksizes = (/ size(arr, 1), size(arr, 2), & + size(arr, 3), size(arr, 4) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_float ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_4d_sp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_4d_sp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_4d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_float) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_4d_sp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_4d_sp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_4d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_float)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_4d_sp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_4d_sp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_4d_sp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_4d_sp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_4d_sp - subroutine var2nc_4d_dp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_4d_dp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 4 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(dp), dimension(:,:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(dp), dimension(:, :, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(dp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(dp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(dp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(dp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) ! consistency checks - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited - if ( ( ndim .eq. ndim_const + 1 ) .and. ( d_unlimit .ne. ndim_const+1 ) ) then - print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' - stop '***ERROR see StdOut' - end if - if ( ndim .gt. ndim_const + 1 ) then - print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' - stop '***ERROR see StdOut' - end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited + if ((ndim .eq. ndim_const + 1) .and. (d_unlimit .ne. ndim_const + 1)) then + print *, '***ERROR one more dimension name specified than dimension of array, but the last one is not unlimited' + stop '***ERROR see StdOut' + end if + if (ndim .gt. ndim_const + 1) then + print *, '***ERROR too many dimension name specified, should be atmost ndim_const + 1' + stop '***ERROR see StdOut' + end if + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! Initialize - deflate = 1 - if ( ndim .gt. ndim_const ) then - chunksizes = (/ size( arr, 1), size( arr, 2), & - size( arr, 3), size( arr, 4 ), 1 /) - dims(1:ndim-1) = shape( arr ) - dims(ndim) = 1 + deflate = 1 + if (ndim .gt. ndim_const) then + chunksizes = (/ size(arr, 1), size(arr, 2), & + size(arr, 3), size(arr, 4), 1 /) + dims(1 : ndim - 1) = shape(arr) + dims(ndim) = 1 else - chunksizes = (/ size( arr, 1), size( arr, 2), & - size( arr, 3), size( arr, 4) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim_const) = shape( arr ) - end if - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1 - dummy = nf90_fill_double + chunksizes = (/ size(arr, 1), size(arr, 2), & + size(arr, 3), size(arr, 4) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim_const) = shape(arr) + end if + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1 + dummy = nf90_fill_double ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_4d_dp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_4d_dp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_4d_dp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_double) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_4d_dp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_4d_dp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_4d_dp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_double)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att(f_handle, varid(ndim+1), 'missing_value',missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att(f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_4d_dp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_4d_dp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_4d_dp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_4d_dp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_4d_dp - subroutine var2nc_5d_i4( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_5d_i4(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 5 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - integer(i4), dimension(:,:,:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + integer(i4), dimension(:, :, :, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - integer(i4), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + integer(i4), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - integer(i4), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + integer(i4), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) d_unlimit = 0_i4 if (present(dim_unlimited)) d_unlimit = dim_unlimited ! consistency checks - if ( ndim .gt. ndim_const ) then - print *, '***ERROR more than five dimension names given' - stop '***ERROR see StdOut' + if (ndim .gt. ndim_const) then + print *, '***ERROR more than five dimension names given' + stop '***ERROR see StdOut' end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3), size( arr, 4), size( arr, 5) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim) = shape( arr ) - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_int - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited + deflate = 1 + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3), size(arr, 4), size(arr, 5) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim) = shape(arr) + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_int + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_5d_i4: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_5d_i4: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_5d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( dummy(1) /= nf90_fill_int ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_5d_i4: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_5d_i4: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_5d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (dummy(1) /= nf90_fill_int) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(I6)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_INT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(I6)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_5d_i4: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_5d_i4: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_5d_i4: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_5d_i4: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_5d_i4 - subroutine var2nc_5d_sp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_5d_sp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 5 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(sp), dimension(:,:,:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(sp), dimension(:, :, :, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(sp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(sp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(sp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(sp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) d_unlimit = 0_i4 if (present(dim_unlimited)) d_unlimit = dim_unlimited ! consistency checks - if ( ndim .gt. ndim_const ) then - print *, '***ERROR more than five dimension names given' - stop '***ERROR see StdOut' + if (ndim .gt. ndim_const) then + print *, '***ERROR more than five dimension names given' + stop '***ERROR see StdOut' end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3), size( arr, 4), size( arr, 5) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim) = shape( arr ) - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1_i4 - dummy = nf90_fill_float - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited + deflate = 1 + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3), size(arr, 4), size(arr, 5) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim) = shape(arr) + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1_i4 + dummy = nf90_fill_float + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_5d_sp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_5d_sp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_5d_sp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_float) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_5d_sp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_5d_sp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_5d_sp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_float)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'missing_value', missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_FLOAT, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) + end if + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_5d_sp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_5d_sp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_5d_sp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_5d_sp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_5d_sp - subroutine var2nc_5d_dp( f_name, arr, dnames, v_name, dim_unlimited, & - long_name, units, missing_value, attributes, create, ncid, nrec ) + subroutine var2nc_5d_dp(f_name, arr, dnames, v_name, dim_unlimited, & + long_name, units, missing_value, attributes, create, ncid, nrec) ! implicit none ! integer(i4), parameter :: ndim_const = 5 - integer(i4) :: ndim + integer(i4) :: ndim ! input variables - character(len=*), intent(in) :: f_name - real(dp), dimension(:,:,:,:,:), intent(in) :: arr - character(len=*), intent(in) :: v_name - character(len=*), dimension(:), intent(in) :: dnames + character(len = *), intent(in) :: f_name + real(dp), dimension(:, :, :, :, :), intent(in) :: arr + character(len = *), intent(in) :: v_name + character(len = *), dimension(:), intent(in) :: dnames ! optional - integer(i4), optional, intent(in) :: dim_unlimited - character(len=*), optional, intent(in) :: long_name - character(len=*), optional, intent(in) :: units - real(dp), optional, intent(in) :: missing_value - character(256), dimension(:,:), optional, intent(in) :: attributes - logical, optional, intent(in) :: create - integer(i4), optional, intent(inout) :: ncid - integer(i4), optional, intent(in) :: nrec + integer(i4), optional, intent(in) :: dim_unlimited + character(len = *), optional, intent(in) :: long_name + character(len = *), optional, intent(in) :: units + real(dp), optional, intent(in) :: missing_value + character(256), dimension(:, :), optional, intent(in) :: attributes + logical, optional, intent(in) :: create + integer(i4), optional, intent(inout) :: ncid + integer(i4), optional, intent(in) :: nrec ! local variables - logical :: create_loc - character(256) :: dummy_name - integer(i4) :: deflate + logical :: create_loc + character(256) :: dummy_name + integer(i4) :: deflate integer(i4), dimension(:), allocatable :: chunksizes integer(i4), dimension(:), allocatable :: start ! start array for write integer(i4), dimension(:), allocatable :: counter ! length array for write - integer(i4) :: idim ! read dimension on append - integer(i4) :: f_handle - integer(i4) :: d_unlimit ! index of unlimited dimension - integer(i4) :: u_dimid ! dimid of unlimited dimension - integer(i4) :: u_len ! length of unlimited dimension + integer(i4) :: idim ! read dimension on append + integer(i4) :: f_handle + integer(i4) :: d_unlimit ! index of unlimited dimension + integer(i4) :: u_dimid ! dimid of unlimited dimension + integer(i4) :: u_len ! length of unlimited dimension integer(i4), dimension(:), allocatable :: dims integer(i4), dimension(:), allocatable :: dimid ! netcdf IDs of each dimension integer(i4), dimension(:), allocatable :: varid ! dimension variables and var id - integer(i4) :: i ! loop indices + integer(i4) :: i ! loop indices integer(i4), dimension(:), allocatable :: dummy_count - real(dp), dimension(1) :: dummy ! dummy read - logical :: openfile ! tmp logical + real(dp), dimension(1) :: dummy ! dummy read + logical :: openfile ! tmp logical ! - ndim = size( dnames, 1 ) + ndim = size(dnames, 1) d_unlimit = 0_i4 if (present(dim_unlimited)) d_unlimit = dim_unlimited ! consistency checks - if ( ndim .gt. ndim_const ) then - print *, '***ERROR more than five dimension names given' - stop '***ERROR see StdOut' + if (ndim .gt. ndim_const) then + print *, '***ERROR more than five dimension names given' + stop '***ERROR see StdOut' end if - if ( ( ( ndim .eq. ndim_const ) .and. ( d_unlimit .gt. ndim_const ) ) .or. & - ( d_unlimit .lt. 0_i4 ) ) then - print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' - print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit - stop '***ERROR see StdOut' + if (((ndim .eq. ndim_const) .and. (d_unlimit .gt. ndim_const)) .or. & + (d_unlimit .lt. 0_i4)) then + print*, '***ERROR unlimited dimension out of bounds, must be positive but not greater than number of given dimensions' + print*, '***Dims: ', ndim, ndim_const, d_unlimit, ndim_const, d_unlimit + stop '***ERROR see StdOut' end if ! - allocate( chunksizes( ndim ) ) - allocate( start( ndim ) ) - allocate( counter( ndim ) ) - allocate( dims( ndim ) ) - allocate( dimid( ndim ) ) - allocate( varid( 1 + ndim ) ) - allocate( dummy_count( ndim ) ) + allocate(chunksizes(ndim)) + allocate(start(ndim)) + allocate(counter(ndim)) + allocate(dims(ndim)) + allocate(dimid(ndim)) + allocate(varid(1 + ndim)) + allocate(dummy_count(ndim)) ! initialize - deflate = 1 - chunksizes = (/ size( arr, 1), size( arr, 2), size( arr, 3), size( arr, 4), size( arr, 5) /) - if ( d_unlimit .gt. 0 ) chunksizes( d_unlimit ) = 1 - dims(1:ndim) = shape( arr ) - start(:) = 1_i4 - counter(:) = dims - dummy_count = 1 - dummy = nf90_fill_double - d_unlimit = 0_i4 - if ( present( dim_unlimited ) ) d_unlimit = dim_unlimited + deflate = 1 + chunksizes = (/ size(arr, 1), size(arr, 2), size(arr, 3), size(arr, 4), size(arr, 5) /) + if (d_unlimit .gt. 0) chunksizes(d_unlimit) = 1 + dims(1 : ndim) = shape(arr) + start(:) = 1_i4 + counter(:) = dims + dummy_count = 1 + dummy = nf90_fill_double + d_unlimit = 0_i4 + if (present(dim_unlimited)) d_unlimit = dim_unlimited ! open the netcdf file if (present(ncid)) then - if (ncid < 0_i4) then - openfile = .true. - else - openfile = .false. - f_handle = ncid - end if + if (ncid < 0_i4) then + openfile = .true. + else + openfile = .false. + f_handle = ncid + end if else - openfile = .true. + openfile = .true. end if if (openfile) then - create_loc = .false. - if (present(create)) create_loc = create - f_handle = open_netcdf(f_name, create=create_loc) + create_loc = .false. + if (present(create)) create_loc = create + f_handle = open_netcdf(f_name, create = create_loc) end if ! check whether variable exists - if ( nf90_noerr .eq. nf90_inq_varid( f_handle, v_name, varid(ndim+1)) ) then - ! append - call check(nf90_inquire_variable(f_handle, varid(ndim+1), ndims=idim, dimids=dimid)) - ! consistency checks - if (idim .ne. ndim) stop "var2nc_5d_dp: number of variable dimensions /= number of file variable dimensions." - ! check unlimited dimension - call check(nf90_inquire( f_handle, unlimitedDimId = u_dimid )) - if ( u_dimid .eq. -1 ) stop 'var2nc_5d_dp: cannot append, no unlimited dimension defined' - ! check for unlimited dimension - if ( dimid( d_unlimit ) .ne. u_dimid ) stop 'var2nc_5d_dp: unlimited dimension not specified correctly' - if (present(nrec)) then - start(d_unlimit) = nrec - else - ! get length of unlimited dimension - call check(nf90_inquire_dimension( f_handle, u_dimid, len = u_len ) ) - ! adapt start, that is find last written chunk - do i = u_len, 1, -1 - if ( ne(dummy(1),nf90_fill_double) ) exit - start(d_unlimit) = i - call check( nf90_get_var( f_handle, varid(ndim+1), dummy, start, dummy_count ) ) - end do - start(d_unlimit) = start(d_unlimit) + 1 - end if + if (nf90_noerr .eq. nf90_inq_varid(f_handle, v_name, varid(ndim + 1))) then + ! append + call check(nf90_inquire_variable(f_handle, varid(ndim + 1), ndims = idim, dimids = dimid)) + ! consistency checks + if (idim .ne. ndim) stop "var2nc_5d_dp: number of variable dimensions /= number of file variable dimensions." + ! check unlimited dimension + call check(nf90_inquire(f_handle, unlimitedDimId = u_dimid)) + if (u_dimid .eq. -1) stop 'var2nc_5d_dp: cannot append, no unlimited dimension defined' + ! check for unlimited dimension + if (dimid(d_unlimit) .ne. u_dimid) stop 'var2nc_5d_dp: unlimited dimension not specified correctly' + if (present(nrec)) then + start(d_unlimit) = nrec + else + ! get length of unlimited dimension + call check(nf90_inquire_dimension(f_handle, u_dimid, len = u_len)) + ! adapt start, that is find last written chunk + do i = u_len, 1, -1 + if (ne(dummy(1), nf90_fill_double)) exit + start(d_unlimit) = i + call check(nf90_get_var(f_handle, varid(ndim + 1), dummy, start, dummy_count)) + end do + start(d_unlimit) = start(d_unlimit) + 1 + end if else - ! define dimensions - do i = 1, ndim - ! check whether dimension exists - if ( nf90_noerr .ne. nf90_inq_dimid( f_handle, dnames(i), dimid(i)) ) then - ! create dimension - if ( i .eq. d_unlimit ) then - ! define unlimited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i) )) - else - ! define limited dimension - call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i) )) - end if + ! define dimensions + do i = 1, ndim + ! check whether dimension exists + if (nf90_noerr .ne. nf90_inq_dimid(f_handle, dnames(i), dimid(i))) then + ! create dimension + if (i .eq. d_unlimit) then + ! define unlimited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), NF90_UNLIMITED, dimid(i))) + else + ! define limited dimension + call check(nf90_def_dim(f_handle, trim(dnames(i)), dims(i), dimid(i))) + end if + end if + end do + ! define variable + call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim + 1), & + chunksizes = chunksizes(:), shuffle = .true., deflate_level = deflate)) + ! add attributes + if (present(long_name)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'long_name', long_name)) + if (present(units)) call check(nf90_put_att (f_handle, varid(ndim + 1), 'units', units)) + if (present(missing_value)) call check(nf90_put_att(f_handle, varid(ndim + 1), 'missing_value', missing_value)) + if (present(attributes)) then + do i = 1, size(attributes, dim = 1) + if (trim(attributes(i, 1)) .eq. 'missing_value') then + ! write number + read(attributes(i, 2), '(F10.2)') dummy(1) + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), dummy(1))) + else + ! write string + call check(nf90_put_att(f_handle, varid(ndim + 1), & + trim(attributes(i, 1)), trim(attributes(i, 2)))) end if - end do - ! define variable - call check(nf90_def_var(f_handle, v_name, NF90_DOUBLE, dimid, varid(ndim+1), & - chunksizes=chunksizes(:), shuffle=.true., deflate_level=deflate)) - ! add attributes - if ( present( long_name ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'long_name', long_name ) ) - if ( present( units ) ) call check(nf90_put_att (f_handle, varid(ndim+1), 'units', units ) ) - if ( present( missing_value ) ) call check(nf90_put_att(f_handle, varid(ndim+1), 'missing_value',missing_value ) ) - if ( present( attributes ) ) then - do i = 1, size( attributes, dim = 1 ) - if ( trim( attributes(i,1)) .eq. 'missing_value' ) then - ! write number - read(attributes(i,2),'(F10.2)') dummy(1) - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), dummy(1) ) ) - else - ! write string - call check( nf90_put_att( f_handle, varid(ndim+1), & - trim(attributes(i,1)), trim(attributes(i,2)) ) ) - end if - end do - end if - ! end definition - call check(nf90_enddef(f_handle)) + end do + end if + ! end definition + call check(nf90_enddef(f_handle)) end if ! check dimensions before writing - do i=1, ndim_const - call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) - if (trim(dummy_name) .ne. dnames(i)) & - stop "var2nc_5d_dp: dimension name problem." - if ( (dims(i) .ne. size(arr,i)) .and. ( d_unlimit .ne. i ) ) & - stop "var2nc_5d_dp: variable dimension /= file variable dimension." + do i = 1, ndim_const + call check(nf90_inquire_dimension(f_handle, dimid(i), dummy_name, dims(i))) + if (trim(dummy_name) .ne. dnames(i)) & + stop "var2nc_5d_dp: dimension name problem." + if ((dims(i) .ne. size(arr, i)) .and. (d_unlimit .ne. i)) & + stop "var2nc_5d_dp: variable dimension /= file variable dimension." end do ! write variable - call check( nf90_put_var(f_handle, varid(ndim+1), arr, start, counter) ) + call check(nf90_put_var(f_handle, varid(ndim + 1), arr, start, counter)) ! close netcdf_dataset if (present(ncid)) then - if (ncid < 0_i4) ncid = f_handle + if (ncid < 0_i4) ncid = f_handle else - call close_netcdf( f_handle ) + call close_netcdf(f_handle) end if ! end subroutine var2nc_5d_dp @@ -5454,10 +5454,10 @@ subroutine write_dynamic_netcdf(ncId, irec) implicit none ! netcdf related variables - integer(i4), intent(in) :: ncId - integer(i4), intent(in) :: iRec + integer(i4), intent(in) :: ncId + integer(i4), intent(in) :: iRec - integer(i4) :: i + integer(i4) :: i ! NOTES: 1) netcdf file must be on *** data mode *** ! 2) start and end of the data chuck is controled by ! V(:)%start and V(:)%count @@ -5465,63 +5465,63 @@ subroutine write_dynamic_netcdf(ncId, irec) ! set values for variables (one scalar or grid at a time) do i = 1, nVars - if (.not. V(i)%unlimited) cycle - if (.not. V(i)%wFlag) cycle - V(i)%start (V(i)%nDims) = iRec - select case (V(i)%xtype) - case(NF90_BYTE) - select case (V(i)%nDims) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_b, V(i)%start)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_b, V(i)%start, V(i)%count)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_b, V(i)%start, V(i)%count)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_b, V(i)%start, V(i)%count)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_b, V(i)%start, V(i)%count)) - end select - case (NF90_INT) - select case (V(i)%nDims-1) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_i, V(i)%start)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_i, V(i)%start, V(i)%count)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_i, V(i)%start, V(i)%count)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_i, V(i)%start, V(i)%count)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_i, V(i)%start, V(i)%count)) - end select - case (NF90_FLOAT) - select case (V(i)%nDims-1) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_f, V(i)%start)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_f, V(i)%start, V(i)%count)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_f, V(i)%start, V(i)%count)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_f, V(i)%start, V(i)%count)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_f, V(i)%start, V(i)%count)) - end select - case (NF90_DOUBLE) - select case (V(i)%nDims-1) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_d, V(i)%start)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_d, V(i)%start, V(i)%count)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_d, V(i)%start, V(i)%count)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_d, V(i)%start, V(i)%count)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_d, V(i)%start, V(i)%count)) - end select - end select + if (.not. V(i)%unlimited) cycle + if (.not. V(i)%wFlag) cycle + V(i)%start (V(i)%nDims) = iRec + select case (V(i)%xtype) + case(NF90_BYTE) + select case (V(i)%nDims) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_b, V(i)%start)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_b, V(i)%start, V(i)%count)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_b, V(i)%start, V(i)%count)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_b, V(i)%start, V(i)%count)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_b, V(i)%start, V(i)%count)) + end select + case (NF90_INT) + select case (V(i)%nDims - 1) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_i, V(i)%start)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_i, V(i)%start, V(i)%count)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_i, V(i)%start, V(i)%count)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_i, V(i)%start, V(i)%count)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_i, V(i)%start, V(i)%count)) + end select + case (NF90_FLOAT) + select case (V(i)%nDims - 1) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_f, V(i)%start)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_f, V(i)%start, V(i)%count)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_f, V(i)%start, V(i)%count)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_f, V(i)%start, V(i)%count)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_f, V(i)%start, V(i)%count)) + end select + case (NF90_DOUBLE) + select case (V(i)%nDims - 1) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_d, V(i)%start)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_d, V(i)%start, V(i)%count)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_d, V(i)%start, V(i)%count)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_d, V(i)%start, V(i)%count)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_d, V(i)%start, V(i)%count)) + end select + end select end do end subroutine write_dynamic_netcdf @@ -5563,68 +5563,68 @@ subroutine write_static_netcdf(ncId) implicit none ! netcdf related variables - integer(i4), intent(in) :: ncId + integer(i4), intent(in) :: ncId - integer(i4) :: i + integer(i4) :: i ! write all static variables do i = 1, nVars - if (V(i)%unlimited) cycle - if (.not. V(i)%wFlag) cycle - select case (V(i)%xtype) - case(NF90_BYTE) - select case (V(i)%nDims) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_b)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_b)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_b)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_b)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_b)) - end select - case (NF90_INT) - select case (V(i)%nDims) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_i)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_i)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_i)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_i)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_i)) - end select - case (NF90_FLOAT) - select case (V(i)%nDims) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_f)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_f)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_f)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_f)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_f)) - end select - case (NF90_DOUBLE) - select case (V(i)%nDims) - case (0) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_d)) - case (1) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_d)) - case (2) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_d)) - case (3) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_d)) - case (4) - call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_d)) - end select - end select + if (V(i)%unlimited) cycle + if (.not. V(i)%wFlag) cycle + select case (V(i)%xtype) + case(NF90_BYTE) + select case (V(i)%nDims) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_b)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_b)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_b)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_b)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_b)) + end select + case (NF90_INT) + select case (V(i)%nDims) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_i)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_i)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_i)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_i)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_i)) + end select + case (NF90_FLOAT) + select case (V(i)%nDims) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_f)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_f)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_f)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_f)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_f)) + end select + case (NF90_DOUBLE) + select case (V(i)%nDims) + case (0) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G0_d)) + case (1) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G1_d)) + case (2) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G2_d)) + case (3) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G3_d)) + case (4) + call check(nf90_put_var(ncId, V(i)%varId, V(i)%G4_d)) + end select + end select end do end subroutine write_static_netcdf @@ -5636,20 +5636,20 @@ end subroutine write_static_netcdf ! ----------------------------------------------------------------------------- ! private open netcdf function - returns file handle - function open_netcdf( f_name, create ) + function open_netcdf(f_name, create) implicit none ! input variables - character(len=*), intent(in) :: f_name - logical, intent(in) :: create ! flag indicates that file exists + character(len = *), intent(in) :: f_name + logical, intent(in) :: create ! flag indicates that file exists ! output variables - integer(i4) :: open_netcdf + integer(i4) :: open_netcdf ! - if ( create ) then - ! create file - call check( nf90_create( trim(f_name), NF90_NETCDF4, open_netcdf ) ) + if (create) then + ! create file + call check(nf90_create(trim(f_name), NF90_NETCDF4, open_netcdf)) else - ! open file - call check( nf90_open( trim(f_name), NF90_WRITE, open_netcdf ) ) + ! open file + call check(nf90_open(trim(f_name), NF90_WRITE, open_netcdf)) end if end function open_netcdf @@ -5664,8 +5664,8 @@ subroutine check(status) integer(i4), intent(in) :: status if (status /= nf90_noerr) then - write(*,*) 'mo_ncwrite.check error: ', trim(nf90_strerror(status)) - stop + write(*, *) 'mo_ncwrite.check error: ', trim(nf90_strerror(status)) + stop end if end subroutine check diff --git a/src/lib/mo_netcdf.f90 b/src/lib/mo_netcdf.f90 index 83a4174c..54044864 100644 --- a/src/lib/mo_netcdf.f90 +++ b/src/lib/mo_netcdf.f90 @@ -19,7 +19,7 @@ module mo_netcdf ! Written David Schaefer, Jun 2015 ! Modified Matthias Cuntz, Jan 2016 - compiled with PGI Fortran rev 15.9 - no automatic allocation of left-hand-side - + ! License ! ------- ! This file is part of the UFZ Fortran library. @@ -40,17 +40,16 @@ module mo_netcdf ! Copyright 2011-2015 David Schaefer - use mo_kind, only: i1, i2, i4, i8, sp, dp - use netcdf, only: & - nf90_open, nf90_close, nf90_strerror, nf90_def_dim, nf90_def_var, & - nf90_put_var, nf90_get_var, nf90_put_att, nf90_get_att, & - nf90_inquire, nf90_inq_dimid, nf90_inquire_dimension, & - nf90_inq_varid, nf90_inq_varids, nf90_inquire_variable, nf90_inquire_attribute, & - NF90_OPEN, NF90_NETCDF4, NF90_CREATE, NF90_WRITE, NF90_NOWRITE, & - NF90_BYTE, NF90_SHORT, NF90_INT, NF90_INT64, NF90_FLOAT, NF90_DOUBLE, & - NF90_FILL_BYTE, NF90_FILL_SHORT, NF90_FILL_INT, NF90_FILL_FLOAT , NF90_FILL_DOUBLE, & - NF90_NOERR, NF90_UNLIMITED, NF90_GLOBAL - + use mo_kind, only : i1, i2, i4, i8,sp, dp + use netcdf, only : & + nf90_open, nf90_close, nf90_strerror, nf90_def_dim, nf90_def_var, & + nf90_put_var, nf90_get_var, nf90_put_att, nf90_get_att, & + nf90_inquire, nf90_inq_dimid, nf90_inquire_dimension, & + nf90_inq_varid, nf90_inq_varids, nf90_inquire_variable, nf90_inquire_attribute, & + NF90_OPEN, NF90_NETCDF4, NF90_CREATE, NF90_WRITE, NF90_NOWRITE, & + NF90_BYTE, NF90_SHORT, NF90_INT, NF90_INT64, NF90_FLOAT, NF90_DOUBLE, & + NF90_FILL_BYTE, NF90_FILL_SHORT, NF90_FILL_INT, NF90_FILL_FLOAT, NF90_FILL_DOUBLE, & + NF90_NOERR, NF90_UNLIMITED, NF90_GLOBAL implicit none @@ -94,448 +93,448 @@ module mo_netcdf ! -------------------------------------------------------------------------------------- type NcDataset - character(256) :: fname !> Filename of the opened dataset - character(1) :: mode !> File open mode - integer(i4) :: id !> NetCDF id - - contains - - procedure, public :: initNcDataset - - procedure, public :: getNoVariables - procedure, public :: getVariableIds - procedure, public :: getVariables - - procedure, private :: setGlobalAttributeChar - procedure, private :: setGlobalAttributeI8 - procedure, private :: setGlobalAttributeI16 - procedure, private :: setGlobalAttributeI32 - procedure, private :: setGlobalAttributeI64 - procedure, private :: setGlobalAttributeF32 - procedure, private :: setGlobalAttributeF64 - - procedure, private :: getGlobalAttributeChar - procedure, private :: getGlobalAttributeI8 - procedure, private :: getGlobalAttributeI16 - procedure, private :: getGlobalAttributeI32 - procedure, private :: getGlobalAttributeI64 - procedure, private :: getGlobalAttributeF32 - procedure, private :: getGlobalAttributeF64 - - procedure, private :: getDimensionByName - procedure, private :: getDimensionById - - procedure, private :: setVariableWithTypes - procedure, private :: setVariableWithNames - procedure, private :: setVariableWithIds - - procedure, private :: getVariableByName - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! hasVariable - ! - ! PURPOSE - !> \brief Check if variable exists - !> \details Returns true if a variable with the given name exists, false - !> otherwise. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: hasVariable - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! hasDimension - ! - ! PURPOSE - !> \brief Check if dimension exists - !> \details Returns true if a dimension with the given name exists, false - !> otherwise. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: hasDimension - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getUnlimitedDimension - ! - ! PURPOSE - !> \brief Return the unlimited dimension of the dataset - !> \details Returns the NcDimension derived type of the unlimited dimension. - !> The program will teminate abruptly if no such dimension exists. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: getUnlimitedDimension - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! isUnlimited - ! - ! PURPOSE - !> \brief Check if the dataset is unlimited - !> \details Returns true if the dataset contains an unlimited dimension, - !> false otherwise. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: isUnlimited => isDatasetUnlimited - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! close - ! - ! PURPOSE - !> \brief Close the datset - !> \details Close the NetCDF datset. The program will teminate abruptly if - !> the file cannot be closed correctly. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: close - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! setDimension - ! - ! PURPOSE - !> \brief Create a new dimension - !> \details Create a new dimension of given length. A length < 0 indicates an - !> unlimited dimension. The program will teminate abruptly if the - !> dimension cannot be created. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - !> \param[in] "integer(i4) :: length" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return NcDimension - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: setDimension - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! setAttribute - ! - ! PURPOSE - !> \brief Create a new global Attribute - !> \details Create a new global attribute from given name and value. - !> The program will teminate abruptly if the attribute cannot be - !> created. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - !> \param[in] "character(*)/integer(i4)/real(sp)/real(dp) :: value" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: setAttribute => & - setGlobalAttributeChar, & - setGlobalAttributeI8, & - setGlobalAttributeI16, & - setGlobalAttributeI32, & - setGlobalAttributeI64, & - setGlobalAttributeF32, & - setGlobalAttributeF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getAttribute - ! - ! PURPOSE - !> \brief Retrieve global attribute value - !> \details Retrieve the value for a global attribute specified by its name. - !> The program will teminate abruptly if the attribute does not - !> exist. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "character(*)/integer(i4)/real(sp)/real(dp) :: value" - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: getAttribute => & - getGlobalAttributeChar, & - getGlobalAttributeI8, & - getGlobalAttributeI16, & - getGlobalAttributeI32, & - getGlobalAttributeI64, & - getGlobalAttributeF32, & - getGlobalAttributeF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getDimension - ! - ! PURPOSE - !> \brief Retrieve NcDimension - !> \details Retrieve the NcDimension derived type for the dimension specified by - !> its name or id. The program will teminate abruptly if no such - !> dimension exists. - ! - ! INTENT(IN) - !> \param[in] "character(*)/integer(i4) :: name/id" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return NcDimension - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: getDimension => & - getDimensionById, & - getDimensionByName - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! setVariable - ! - ! PURPOSE - !> \brief Create a NetCDF variable - !> \details Create a NetCDF Variable with given name, data type and dimensions. - !> All optional arguments to the nf90_def_var function are supported. - !> The program will teminate abruptly if the variable cannot be - !> created. - !> Supported data types and their string encodings: - !> NF90_BYTE -> "i8" - !> NF90_SHORT -> "i16" - !> NF90_INT -> "i32" - !> NF90_INT64 -> "i64" - !> NF90_FLOAT -> "f32" - !> NF90_DOUBLE -> "f64" - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - !> \param[in] "character(3) :: dtype" - !> \param[in] "integer(i4)/character(*)/type(NcDataset) :: dimensions(:)" - ! - ! INTENT(IN), OPTIONAL - !> \param[in] "logical :: contiguous" - !> \param[in] "integer(i4) :: chunksizes(:)" - !> \param[in] "integer(i4) :: deflate_level" - !> \param[in] "logical :: shuffle" - !> \param[in] "logical :: fletcher32" - !> \param[in] "integer(i4) :: endianess" - !> \param[in] "integer(i4) :: cache_size" - !> \param[in] "integer(i4) :: cache_nelems" - !> \param[in] "integer(i4) :: cache_preemption" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return NcVariable - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: setVariable => & - setVariableWithNames, & - setVariableWithTypes, & - setVariableWithIds - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getVariable - ! - ! PURPOSE - !> \brief Retrieve NcVariable - !> \details Retrieve the NcVariable derived type for the variable specified by its - !> name. The program will teminate abruptly if no such dimension - !> exists. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return NcVariable - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: getVariable => & - getVariableByName + character(256) :: fname !> Filename of the opened dataset + character(1) :: mode !> File open mode + integer(i4) :: id !> NetCDF id + + contains + + procedure, public :: initNcDataset + + procedure, public :: getNoVariables + procedure, public :: getVariableIds + procedure, public :: getVariables + + procedure, private :: setGlobalAttributeChar + procedure, private :: setGlobalAttributeI8 + procedure, private :: setGlobalAttributeI16 + procedure, private :: setGlobalAttributeI32 + procedure, private :: setGlobalAttributeI64 + procedure, private :: setGlobalAttributeF32 + procedure, private :: setGlobalAttributeF64 + + procedure, private :: getGlobalAttributeChar + procedure, private :: getGlobalAttributeI8 + procedure, private :: getGlobalAttributeI16 + procedure, private :: getGlobalAttributeI32 + procedure, private :: getGlobalAttributeI64 + procedure, private :: getGlobalAttributeF32 + procedure, private :: getGlobalAttributeF64 + + procedure, private :: getDimensionByName + procedure, private :: getDimensionById + + procedure, private :: setVariableWithTypes + procedure, private :: setVariableWithNames + procedure, private :: setVariableWithIds + + procedure, private :: getVariableByName + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! hasVariable + ! + ! PURPOSE + !> \brief Check if variable exists + !> \details Returns true if a variable with the given name exists, false + !> otherwise. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: hasVariable + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! hasDimension + ! + ! PURPOSE + !> \brief Check if dimension exists + !> \details Returns true if a dimension with the given name exists, false + !> otherwise. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: hasDimension + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getUnlimitedDimension + ! + ! PURPOSE + !> \brief Return the unlimited dimension of the dataset + !> \details Returns the NcDimension derived type of the unlimited dimension. + !> The program will teminate abruptly if no such dimension exists. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getUnlimitedDimension + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! isUnlimited + ! + ! PURPOSE + !> \brief Check if the dataset is unlimited + !> \details Returns true if the dataset contains an unlimited dimension, + !> false otherwise. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: isUnlimited => isDatasetUnlimited + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! close + ! + ! PURPOSE + !> \brief Close the datset + !> \details Close the NetCDF datset. The program will teminate abruptly if + !> the file cannot be closed correctly. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: close + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! setDimension + ! + ! PURPOSE + !> \brief Create a new dimension + !> \details Create a new dimension of given length. A length < 0 indicates an + !> unlimited dimension. The program will teminate abruptly if the + !> dimension cannot be created. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + !> \param[in] "integer(i4) :: length" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return NcDimension + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: setDimension + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! setAttribute + ! + ! PURPOSE + !> \brief Create a new global Attribute + !> \details Create a new global attribute from given name and value. + !> The program will teminate abruptly if the attribute cannot be + !> created. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + !> \param[in] "character(*)/integer(i4)/real(sp)/real(dp) :: value" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: setAttribute => & + setGlobalAttributeChar, & + setGlobalAttributeI8, & + setGlobalAttributeI16, & + setGlobalAttributeI32, & + setGlobalAttributeI64, & + setGlobalAttributeF32, & + setGlobalAttributeF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getAttribute + ! + ! PURPOSE + !> \brief Retrieve global attribute value + !> \details Retrieve the value for a global attribute specified by its name. + !> The program will teminate abruptly if the attribute does not + !> exist. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "character(*)/integer(i4)/real(sp)/real(dp) :: value" + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: getAttribute => & + getGlobalAttributeChar, & + getGlobalAttributeI8, & + getGlobalAttributeI16, & + getGlobalAttributeI32, & + getGlobalAttributeI64, & + getGlobalAttributeF32, & + getGlobalAttributeF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getDimension + ! + ! PURPOSE + !> \brief Retrieve NcDimension + !> \details Retrieve the NcDimension derived type for the dimension specified by + !> its name or id. The program will teminate abruptly if no such + !> dimension exists. + ! + ! INTENT(IN) + !> \param[in] "character(*)/integer(i4) :: name/id" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return NcDimension + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: getDimension => & + getDimensionById, & + getDimensionByName + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! setVariable + ! + ! PURPOSE + !> \brief Create a NetCDF variable + !> \details Create a NetCDF Variable with given name, data type and dimensions. + !> All optional arguments to the nf90_def_var function are supported. + !> The program will teminate abruptly if the variable cannot be + !> created. + !> Supported data types and their string encodings: + !> NF90_BYTE -> "i8" + !> NF90_SHORT -> "i16" + !> NF90_INT -> "i32" + !> NF90_INT64 -> "i64" + !> NF90_FLOAT -> "f32" + !> NF90_DOUBLE -> "f64" + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + !> \param[in] "character(3) :: dtype" + !> \param[in] "integer(i4)/character(*)/type(NcDataset) :: dimensions(:)" + ! + ! INTENT(IN), OPTIONAL + !> \param[in] "logical :: contiguous" + !> \param[in] "integer(i4) :: chunksizes(:)" + !> \param[in] "integer(i4) :: deflate_level" + !> \param[in] "logical :: shuffle" + !> \param[in] "logical :: fletcher32" + !> \param[in] "integer(i4) :: endianess" + !> \param[in] "integer(i4) :: cache_size" + !> \param[in] "integer(i4) :: cache_nelems" + !> \param[in] "integer(i4) :: cache_preemption" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return NcVariable + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: setVariable => & + setVariableWithNames, & + setVariableWithTypes, & + setVariableWithIds + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getVariable + ! + ! PURPOSE + !> \brief Retrieve NcVariable + !> \details Retrieve the NcVariable derived type for the variable specified by its + !> name. The program will teminate abruptly if no such dimension + !> exists. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return NcVariable + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: getVariable => & + getVariableByName end type NcDataset interface NcDataset - procedure newNcDataset + procedure newNcDataset end interface NcDataset ! -------------------------------------------------------------------------------------- @@ -572,84 +571,113 @@ module mo_netcdf ! -------------------------------------------------------------------------------------- type NcDimension - integer(i4) :: id !> The NetCDF dimension id - type(NcDataset) :: parent !> The dimension's parent - - contains - - procedure, public :: initNcDimension - - procedure, public :: getName => getDimensionName - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getLength - ! - ! PURPOSE - !> \brief Retrieve the dimension length - !> \details Return the length of the dimension - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! \return "integer(i4)" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - ! \author David Schaefer - ! \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: getLength => getDimensionLength - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! isUnlimited - ! - ! PURPOSE - !> \brief Check if the dimension is unlimited - !> \details Returns true if the dimension is unlimited, false otherwise. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: isUnlimited => isUnlimitedDimension + integer(i4) :: id !> The NetCDF dimension id + type(NcDataset) :: parent !> The dimension's parent + + contains + + procedure, public :: initNcDimension + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getName + ! + ! PURPOSE + !> \brief Returns the name of the dimension + !> \details Returns the name of the dimension. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "character(256)" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getName => getDimensionName + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getLength + ! + ! PURPOSE + !> \brief Retrieve the dimension length + !> \details Return the length of the dimension + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! \return "integer(i4)" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + ! \author David Schaefer + ! \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getLength => getDimensionLength + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! isUnlimited + ! + ! PURPOSE + !> \brief Check if the dimension is unlimited + !> \details Returns true if the dimension is unlimited, false otherwise. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: isUnlimited => isUnlimitedDimension end type NcDimension interface NcDimension - procedure newNcDimension + procedure newNcDimension end interface NcDimension interface operator (==) - procedure equalNcDimensions + procedure equalNcDimensions end interface operator (==) ! -------------------------------------------------------------------------------------- @@ -688,681 +716,681 @@ module mo_netcdf ! -------------------------------------------------------------------------------------- type NcVariable - integer(i4) :: id !> Variable id - type(NcDataset) :: parent !> The variables's parent - ! character(256) :: name !> Variable name - - contains - - procedure, public :: initNcVariable - - procedure, public :: getName => getVariableName - - procedure, private :: setVariableAttributeChar - procedure, private :: setVariableAttributeI8 - procedure, private :: setVariableAttributeI16 - procedure, private :: setVariableAttributeI32 - procedure, private :: setVariableAttributeI64 - procedure, private :: setVariableAttributeF32 - procedure, private :: setVariableAttributeF64 - - procedure, private :: getVariableAttributeChar - procedure, private :: getVariableAttributeI8 - procedure, private :: getVariableAttributeI16 - procedure, private :: getVariableAttributeI32 - procedure, private :: getVariableAttributeI64 - procedure, private :: getVariableAttributeF32 - procedure, private :: getVariableAttributeF64 - - procedure, private :: setDataScalarI8 - procedure, private :: setData1dI8 - procedure, private :: setData2dI8 - procedure, private :: setData3dI8 - procedure, private :: setData4dI8 - procedure, private :: setData5dI8 - procedure, private :: setDataScalarI16 - procedure, private :: setData1dI16 - procedure, private :: setData2dI16 - procedure, private :: setData3dI16 - procedure, private :: setData4dI16 - procedure, private :: setData5dI16 - procedure, private :: setDataScalarI32 - procedure, private :: setData1dI32 - procedure, private :: setData2dI32 - procedure, private :: setData3dI32 - procedure, private :: setData4dI32 - procedure, private :: setData5dI32 - procedure, private :: setDataScalarI64 - procedure, private :: setData1dI64 - procedure, private :: setData2dI64 - procedure, private :: setData3dI64 - procedure, private :: setData4dI64 - procedure, private :: setData5dI64 - procedure, private :: setDataScalarF32 - procedure, private :: setData1dF32 - procedure, private :: setData2dF32 - procedure, private :: setData3dF32 - procedure, private :: setData4dF32 - procedure, private :: setData5dF32 - procedure, private :: setDataScalarF64 - procedure, private :: setData1dF64 - procedure, private :: setData2dF64 - procedure, private :: setData3dF64 - procedure, private :: setData4dF64 - procedure, private :: setData5dF64 - - procedure, private :: getDataScalarI8 - procedure, private :: getData1dI8 - procedure, private :: getData2dI8 - procedure, private :: getData3dI8 - procedure, private :: getData4dI8 - procedure, private :: getData5dI8 - procedure, private :: getDataScalarI16 - procedure, private :: getData1dI16 - procedure, private :: getData2dI16 - procedure, private :: getData3dI16 - procedure, private :: getData4dI16 - procedure, private :: getData5dI16 - procedure, private :: getDataScalarI32 - procedure, private :: getData1dI32 - procedure, private :: getData2dI32 - procedure, private :: getData3dI32 - procedure, private :: getData4dI32 - procedure, private :: getData5dI32 - procedure, private :: getDataScalarI64 - procedure, private :: getData1dI64 - procedure, private :: getData2dI64 - procedure, private :: getData3dI64 - procedure, private :: getData4dI64 - procedure, private :: getData5dI64 - procedure, private :: getDataScalarF32 - procedure, private :: getData1dF32 - procedure, private :: getData2dF32 - procedure, private :: getData3dF32 - procedure, private :: getData4dF32 - procedure, private :: getData5dF32 - procedure, private :: getDataScalarF64 - procedure, private :: getData1dF64 - procedure, private :: getData2dF64 - procedure, private :: getData3dF64 - procedure, private :: getData4dF64 - procedure, private :: getData5dF64 - - procedure, private :: setVariableFillValueI8 - procedure, private :: setVariableFillValueI16 - procedure, private :: setVariableFillValueI32 - procedure, private :: setVariableFillValueI64 - procedure, private :: setVariableFillValueF32 - procedure, private :: setVariableFillValueF64 - - procedure, private :: getVariableFillValueI8 - procedure, private :: getVariableFillValueI16 - procedure, private :: getVariableFillValueI32 - procedure, private :: getVariableFillValueI64 - procedure, private :: getVariableFillValueF32 - procedure, private :: getVariableFillValueF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getNoDimensions - ! - ! PURPOSE - !> \brief Retrieve the number of dimensions - !> \details Return the number of dimensions associated with variable - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! \return "integer(i4)" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - ! \author David Schaefer - ! \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: getNoDimensions - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getDimensions - ! - ! PURPOSE - !> \brief Retrieve the variable dimensions - !> \details Return the ids of the dimensions associated with variable. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! \return "integer(i4), alloctable, dimension(:)" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - ! \author David Schaefer - ! \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: getDimensions => getVariableDimensions - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getShape - ! - ! PURPOSE - !> \brief Retrieve the shape of the variable - !> \details Return the shape of the variable. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! \return "integer(i4), alloctable, dimension(:)" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - ! \author David Schaefer - ! \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: getShape => getVariableShape - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getDtype - ! - ! PURPOSE - !> \brief Retrieve the variable data type - !> \details Return the encoded data type of the variable. - !> Data type encodeings - !> "f32" -> NF90_FLOAT - !> "f64" -> NF90_DOUBLE - !> "i8" -> NF90_BYTE - !> "i16" -> NF90_SHORT - !> "i32" -> NF90_INT - !> "i64" -> NF90_INT64 - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! \return "character(3)" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - ! \author David Schaefer - ! \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: getDtype => getVariableDtype - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! hasAttribute - ! - ! PURPOSE - !> \brief Check if attribute exists - !> \details Returns true if an attribute with the given name exists, false - !> otherwise. - ! - ! INTENT(IN) - ! \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - ! \author David Schaefer - ! \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: hasAttribute - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! isUnlimited - ! - ! PURPOSE - !> \brief Check if the variable is unlimited - !> \details Returns true if the variable has an unlimited dimension, - !> false otherwise. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - !> \return "logical" - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - procedure, public :: isUnlimited => isUnlimitedVariable - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! setData - ! - ! PURPOSE - !> \brief Write data to variable - !> \details Write the given data into the variable at an optionally given - !> position. - !> All optional arguments to the nf90_put_var function are supported. - !> A write error will result in abrupt program termination. - ! - ! INTENT(IN) - !> \param[in] "integer(i4)/real(sp)/real(dp) :: & - !> values/(:)/(:,:)/(:,:,:)/(:,:,:,:)/(:,:,:,:,:)" - ! - ! INTENT(IN), OPTIONAL - !> \param[in] "integer(i4) :: start(:), cnt(:), stride(:), map(:)" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: setData => & - setDataScalarI8, & - setData1dI8, & - setData2dI8, & - setData3dI8, & - setData4dI8, & - setData5dI8, & - setDataScalarI16, & - setData1dI16, & - setData2dI16, & - setData3dI16, & - setData4dI16, & - setData5dI16, & - setDataScalarI32, & - setData1dI32, & - setData2dI32, & - setData3dI32, & - setData4dI32, & - setData5dI32, & - setDataScalarI64, & - setData1dI64, & - setData2dI64, & - setData3dI64, & - setData4dI64, & - setData5dI64, & - setDataScalarF32, & - setData1dF32, & - setData2dF32, & - setData3dF32, & - setData4dF32, & - setData5dF32, & - setDataScalarF64, & - setData1dF64, & - setData2dF64, & - setData3dF64, & - setData4dF64, & - setData5dF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getData - ! - ! PURPOSE - !> \brief Retrieve data - !> \details Read the data from an optionally given position. - !> All optional arguments to the nf90_get_var function are supported. - !> A read error will result in abrupt program termination. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(IN), OPTIONAL - !> \param[in] "integer(i4) :: start(:), cnt(:), stride(:), map(:)" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "integer(i4)/real(sp)/real(dp), allocatable :: & - !> values/(:)/(:,:)/(:,:,:)/(:,:,:,:)/(:,:,:,:,:)" - ! - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: getData => & - getDataScalarI8, & - getData1dI8, & - getData2dI8, & - getData3dI8, & - getData4dI8, & - getData5dI8, & - getDataScalarI16, & - getData1dI16, & - getData2dI16, & - getData3dI16, & - getData4dI16, & - getData5dI16, & - getDataScalarI32, & - getData1dI32, & - getData2dI32, & - getData3dI32, & - getData4dI32, & - getData5dI32, & - getDataScalarI64, & - getData1dI64, & - getData2dI64, & - getData3dI64, & - getData4dI64, & - getData5dI64, & - getDataScalarF32, & - getData1dF32, & - getData2dF32, & - getData3dF32, & - getData4dF32, & - getData5dF32, & - getDataScalarF64, & - getData1dF64, & - getData2dF64, & - getData3dF64, & - getData4dF64, & - getData5dF64 - - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! setFillValue - ! - ! PURPOSE - !> \brief Set the variable fill value - !> \details Define the variable fill value. - !> A write error results in abrupt program temination. - !> \note This procedure must be called AFTER the variable was created but - !> BEFORE data is first written. - ! - ! INTENT(IN) - !> \param[in] "integer(i4)/real(sp)/real(dp) :: fvalue" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: setFillValue => & - setVariableFillValueI8, & - setVariableFillValueI16, & - setVariableFillValueI32, & - setVariableFillValueI64, & - setVariableFillValueF32, & - setVariableFillValueF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getFillValue - ! - ! PURPOSE - !> \brief Retrieve the variable fill value - !> \details Retrieve the variable fill value or a default value if fill value - !> was not explicitly set. - !> A read error results in abrupt program temination. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "integer(i4)/real(sp)/real(dp) :: fvalue" - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: getFillValue => & - getVariableFillValueI8, & - getVariableFillValueI16, & - getVariableFillValueI32, & - getVariableFillValueI64, & - getVariableFillValueF32, & - getVariableFillValueF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! setAttribute - ! - ! PURPOSE - !> \brief Create a new variable attribute - !> \details Create a new variable attribute from given name and value. - !> A write error results in abrupt program temination. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - !> \param[in] "character(*)/integer(i4)/real(sp)/real(dp) :: value" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: setAttribute => & - setVariableAttributeChar, & - setVariableAttributeI8, & - setVariableAttributeI16, & - setVariableAttributeI32, & - setVariableAttributeI64, & - setVariableAttributeF32, & - setVariableAttributeF64 - - ! ----------------------------------------------------------------------------------- - ! - ! NAME - ! getAttribute - ! - ! PURPOSE - !> \brief Retrieve variable attribute value - !> \details Retrieve the value for a variable attribute specified by its name. - !> The program will teminate abruptly if the attribute does not - !> exist. - ! - ! INTENT(IN) - !> \param[in] "character(*) :: name" - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "character(*)/integer(i4)/real(sp)/real(dp) :: value" - ! - ! RETURN - ! None - ! - ! EXAMPLE - ! See test file - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - ! - ! ----------------------------------------------------------------------------------- - generic, public :: getAttribute => & - getVariableAttributeChar, & - getVariableAttributeI8, & - getVariableAttributeI16, & - getVariableAttributeI32, & - getVariableAttributeI64, & - getVariableAttributeF32, & - getVariableAttributeF64 + integer(i4) :: id !> Variable id + type(NcDataset) :: parent !> The variables's parent + ! character(256) :: name !> Variable name + + contains + + procedure, public :: initNcVariable + + procedure, public :: getName => getVariableName + + procedure, private :: setVariableAttributeChar + procedure, private :: setVariableAttributeI8 + procedure, private :: setVariableAttributeI16 + procedure, private :: setVariableAttributeI32 + procedure, private :: setVariableAttributeI64 + procedure, private :: setVariableAttributeF32 + procedure, private :: setVariableAttributeF64 + + procedure, private :: getVariableAttributeChar + procedure, private :: getVariableAttributeI8 + procedure, private :: getVariableAttributeI16 + procedure, private :: getVariableAttributeI32 + procedure, private :: getVariableAttributeI64 + procedure, private :: getVariableAttributeF32 + procedure, private :: getVariableAttributeF64 + + procedure, private :: setDataScalarI8 + procedure, private :: setData1dI8 + procedure, private :: setData2dI8 + procedure, private :: setData3dI8 + procedure, private :: setData4dI8 + procedure, private :: setData5dI8 + procedure, private :: setDataScalarI16 + procedure, private :: setData1dI16 + procedure, private :: setData2dI16 + procedure, private :: setData3dI16 + procedure, private :: setData4dI16 + procedure, private :: setData5dI16 + procedure, private :: setDataScalarI32 + procedure, private :: setData1dI32 + procedure, private :: setData2dI32 + procedure, private :: setData3dI32 + procedure, private :: setData4dI32 + procedure, private :: setData5dI32 + procedure, private :: setDataScalarI64 + procedure, private :: setData1dI64 + procedure, private :: setData2dI64 + procedure, private :: setData3dI64 + procedure, private :: setData4dI64 + procedure, private :: setData5dI64 + procedure, private :: setDataScalarF32 + procedure, private :: setData1dF32 + procedure, private :: setData2dF32 + procedure, private :: setData3dF32 + procedure, private :: setData4dF32 + procedure, private :: setData5dF32 + procedure, private :: setDataScalarF64 + procedure, private :: setData1dF64 + procedure, private :: setData2dF64 + procedure, private :: setData3dF64 + procedure, private :: setData4dF64 + procedure, private :: setData5dF64 + + procedure, private :: getDataScalarI8 + procedure, private :: getData1dI8 + procedure, private :: getData2dI8 + procedure, private :: getData3dI8 + procedure, private :: getData4dI8 + procedure, private :: getData5dI8 + procedure, private :: getDataScalarI16 + procedure, private :: getData1dI16 + procedure, private :: getData2dI16 + procedure, private :: getData3dI16 + procedure, private :: getData4dI16 + procedure, private :: getData5dI16 + procedure, private :: getDataScalarI32 + procedure, private :: getData1dI32 + procedure, private :: getData2dI32 + procedure, private :: getData3dI32 + procedure, private :: getData4dI32 + procedure, private :: getData5dI32 + procedure, private :: getDataScalarI64 + procedure, private :: getData1dI64 + procedure, private :: getData2dI64 + procedure, private :: getData3dI64 + procedure, private :: getData4dI64 + procedure, private :: getData5dI64 + procedure, private :: getDataScalarF32 + procedure, private :: getData1dF32 + procedure, private :: getData2dF32 + procedure, private :: getData3dF32 + procedure, private :: getData4dF32 + procedure, private :: getData5dF32 + procedure, private :: getDataScalarF64 + procedure, private :: getData1dF64 + procedure, private :: getData2dF64 + procedure, private :: getData3dF64 + procedure, private :: getData4dF64 + procedure, private :: getData5dF64 + + procedure, private :: setVariableFillValueI8 + procedure, private :: setVariableFillValueI16 + procedure, private :: setVariableFillValueI32 + procedure, private :: setVariableFillValueI64 + procedure, private :: setVariableFillValueF32 + procedure, private :: setVariableFillValueF64 + + procedure, private :: getVariableFillValueI8 + procedure, private :: getVariableFillValueI16 + procedure, private :: getVariableFillValueI32 + procedure, private :: getVariableFillValueI64 + procedure, private :: getVariableFillValueF32 + procedure, private :: getVariableFillValueF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getNoDimensions + ! + ! PURPOSE + !> \brief Retrieve the number of dimensions + !> \details Return the number of dimensions associated with variable + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! \return "integer(i4)" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + ! \author David Schaefer + ! \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getNoDimensions + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getDimensions + ! + ! PURPOSE + !> \brief Retrieve the variable dimensions + !> \details Return the ids of the dimensions associated with variable. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! \return "integer(i4), alloctable, dimension(:)" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + ! \author David Schaefer + ! \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getDimensions => getVariableDimensions + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getShape + ! + ! PURPOSE + !> \brief Retrieve the shape of the variable + !> \details Return the shape of the variable. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! \return "integer(i4), alloctable, dimension(:)" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + ! \author David Schaefer + ! \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getShape => getVariableShape + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getDtype + ! + ! PURPOSE + !> \brief Retrieve the variable data type + !> \details Return the encoded data type of the variable. + !> Data type encodeings + !> "f32" -> NF90_FLOAT + !> "f64" -> NF90_DOUBLE + !> "i8" -> NF90_BYTE + !> "i16" -> NF90_SHORT + !> "i32" -> NF90_INT + !> "i64" -> NF90_INT64 + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! \return "character(3)" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + ! \author David Schaefer + ! \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: getDtype => getVariableDtype + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! hasAttribute + ! + ! PURPOSE + !> \brief Check if attribute exists + !> \details Returns true if an attribute with the given name exists, false + !> otherwise. + ! + ! INTENT(IN) + ! \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + ! \author David Schaefer + ! \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: hasAttribute + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! isUnlimited + ! + ! PURPOSE + !> \brief Check if the variable is unlimited + !> \details Returns true if the variable has an unlimited dimension, + !> false otherwise. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + !> \return "logical" + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + procedure, public :: isUnlimited => isUnlimitedVariable + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! setData + ! + ! PURPOSE + !> \brief Write data to variable + !> \details Write the given data into the variable at an optionally given + !> position. + !> All optional arguments to the nf90_put_var function are supported. + !> A write error will result in abrupt program termination. + ! + ! INTENT(IN) + !> \param[in] "integer(i4)/real(sp)/real(dp) :: & + !> values/(:)/(:,:)/(:,:,:)/(:,:,:,:)/(:,:,:,:,:)" + ! + ! INTENT(IN), OPTIONAL + !> \param[in] "integer(i4) :: start(:), cnt(:), stride(:), map(:)" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: setData => & + setDataScalarI8, & + setData1dI8, & + setData2dI8, & + setData3dI8, & + setData4dI8, & + setData5dI8, & + setDataScalarI16, & + setData1dI16, & + setData2dI16, & + setData3dI16, & + setData4dI16, & + setData5dI16, & + setDataScalarI32, & + setData1dI32, & + setData2dI32, & + setData3dI32, & + setData4dI32, & + setData5dI32, & + setDataScalarI64, & + setData1dI64, & + setData2dI64, & + setData3dI64, & + setData4dI64, & + setData5dI64, & + setDataScalarF32, & + setData1dF32, & + setData2dF32, & + setData3dF32, & + setData4dF32, & + setData5dF32, & + setDataScalarF64, & + setData1dF64, & + setData2dF64, & + setData3dF64, & + setData4dF64, & + setData5dF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getData + ! + ! PURPOSE + !> \brief Retrieve data + !> \details Read the data from an optionally given position. + !> All optional arguments to the nf90_get_var function are supported. + !> A read error will result in abrupt program termination. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(IN), OPTIONAL + !> \param[in] "integer(i4) :: start(:), cnt(:), stride(:), map(:)" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "integer(i4)/real(sp)/real(dp), allocatable :: & + !> values/(:)/(:,:)/(:,:,:)/(:,:,:,:)/(:,:,:,:,:)" + ! + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: getData => & + getDataScalarI8, & + getData1dI8, & + getData2dI8, & + getData3dI8, & + getData4dI8, & + getData5dI8, & + getDataScalarI16, & + getData1dI16, & + getData2dI16, & + getData3dI16, & + getData4dI16, & + getData5dI16, & + getDataScalarI32, & + getData1dI32, & + getData2dI32, & + getData3dI32, & + getData4dI32, & + getData5dI32, & + getDataScalarI64, & + getData1dI64, & + getData2dI64, & + getData3dI64, & + getData4dI64, & + getData5dI64, & + getDataScalarF32, & + getData1dF32, & + getData2dF32, & + getData3dF32, & + getData4dF32, & + getData5dF32, & + getDataScalarF64, & + getData1dF64, & + getData2dF64, & + getData3dF64, & + getData4dF64, & + getData5dF64 + + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! setFillValue + ! + ! PURPOSE + !> \brief Set the variable fill value + !> \details Define the variable fill value. + !> A write error results in abrupt program temination. + !> \note This procedure must be called AFTER the variable was created but + !> BEFORE data is first written. + ! + ! INTENT(IN) + !> \param[in] "integer(i4)/real(sp)/real(dp) :: fvalue" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: setFillValue => & + setVariableFillValueI8, & + setVariableFillValueI16, & + setVariableFillValueI32, & + setVariableFillValueI64, & + setVariableFillValueF32, & + setVariableFillValueF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getFillValue + ! + ! PURPOSE + !> \brief Retrieve the variable fill value + !> \details Retrieve the variable fill value or a default value if fill value + !> was not explicitly set. + !> A read error results in abrupt program temination. + ! + ! INTENT(IN) + ! None + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "integer(i4)/real(sp)/real(dp) :: fvalue" + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: getFillValue => & + getVariableFillValueI8, & + getVariableFillValueI16, & + getVariableFillValueI32, & + getVariableFillValueI64, & + getVariableFillValueF32, & + getVariableFillValueF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! setAttribute + ! + ! PURPOSE + !> \brief Create a new variable attribute + !> \details Create a new variable attribute from given name and value. + !> A write error results in abrupt program temination. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + !> \param[in] "character(*)/integer(i4)/real(sp)/real(dp) :: value" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + ! None + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: setAttribute => & + setVariableAttributeChar, & + setVariableAttributeI8, & + setVariableAttributeI16, & + setVariableAttributeI32, & + setVariableAttributeI64, & + setVariableAttributeF32, & + setVariableAttributeF64 + + ! ----------------------------------------------------------------------------------- + ! + ! NAME + ! getAttribute + ! + ! PURPOSE + !> \brief Retrieve variable attribute value + !> \details Retrieve the value for a variable attribute specified by its name. + !> The program will teminate abruptly if the attribute does not + !> exist. + ! + ! INTENT(IN) + !> \param[in] "character(*) :: name" + ! + ! INTENT(INOUT) + ! None + ! + ! INTENT(OUT) + !> \param[out] "character(*)/integer(i4)/real(sp)/real(dp) :: value" + ! + ! RETURN + ! None + ! + ! EXAMPLE + ! See test file + ! + ! HISTORY + !> \author David Schaefer + !> \date June 2015 + ! + ! ----------------------------------------------------------------------------------- + generic, public :: getAttribute => & + getVariableAttributeChar, & + getVariableAttributeI8, & + getVariableAttributeI16, & + getVariableAttributeI32, & + getVariableAttributeI64, & + getVariableAttributeF32, & + getVariableAttributeF64 end type NcVariable interface NcVariable - procedure newNcVariable + procedure newNcVariable end interface NcVariable contains subroutine initNcVariable(self, id, parent) class(NcVariable), intent(inout) :: self - integer(i4) , intent(in) :: id - type(NcDataset) , intent(in) :: parent + integer(i4), intent(in) :: id + type(NcDataset), intent(in) :: parent - self%id = id + self%id = id self%parent = parent end subroutine initNcVariable subroutine initNcDimension(self, id, parent) class(NcDimension), intent(inout) :: self - integer(i4) , intent(in) :: id - type(NcDataset) , intent(in) :: parent + integer(i4), intent(in) :: id + type(NcDataset), intent(in) :: parent - self%id = id + self%id = id self%parent = parent end subroutine initNcDimension subroutine initNcDataset(self, fname, mode) class(NcDataset), intent(inout) :: self - character(*) , intent(in) :: fname - character(1) , intent(in) :: mode - integer(i4) :: status + character(*), intent(in) :: fname + character(1), intent(in) :: mode + integer(i4) :: status select case(mode) case("w") - status = nf90_create(trim(fname), NF90_NETCDF4, self%id) + status = nf90_create(trim(fname), NF90_NETCDF4, self%id) case("r") - status = nf90_open(trim(fname), NF90_NOWRITE, self%id) + status = nf90_open(trim(fname), NF90_NOWRITE, self%id) case("a") - status = nf90_open(trim(fname), NF90_WRITE, self%id) + status = nf90_open(trim(fname), NF90_WRITE, self%id) case default - write(*,*) "Mode argument must be in 'w','r','a' ! " - stop 1 + write(*, *) "Mode argument must be in 'w','r','a' ! " + stop 1 end select - call check(status,"Failed to open file: " // fname) + call check(status, "Failed to open file: " // fname) self%fname = fname - self%mode = mode + self%mode = mode end subroutine initNcDataset type(NcVariable) function newNcVariable(id, parent) - integer(i4) , intent(in) :: id + integer(i4), intent(in) :: id type(NcDataset), intent(in) :: parent call newNcVariable%initNcVariable(id, parent) end function newNcVariable type(NcDimension) function newNcDimension(id, parent) - integer(i4) , intent(in) :: id + integer(i4), intent(in) :: id type(NcDataset), intent(in) :: parent call newNcDimension%initNcDimension(id, parent) @@ -1372,84 +1400,84 @@ type(NcDataset) function newNcDataset(fname, mode) character(*), intent(in) :: fname character(1), intent(in) :: mode - call newNcDataset%initNcDataset(fname,mode) + call newNcDataset%initNcDataset(fname, mode) end function newNcDataset subroutine close(self) class(NcDataset) :: self - call check(nf90_close(self%id), "Failed to close file: "//self%fname) + call check(nf90_close(self%id), "Failed to close file: " // self%fname) end subroutine close function getNoVariables(self) class(NcDataset), intent(in) :: self - integer(i4) :: getNoVariables + integer(i4) :: getNoVariables - call check(nf90_inquire(self%id, nvariables=getNoVariables), "Failed inquire number of variables") + call check(nf90_inquire(self%id, nvariables = getNoVariables), "Failed inquire number of variables") end function getNoVariables function getVariableIds(self) - class(NcDataset), intent(in) :: self + class(NcDataset), intent(in) :: self integer(i4), dimension(:), allocatable :: getVariableIds - integer(i4) :: tmp - + integer(i4) :: tmp + allocate(getVariableIds(self%getNoVariables())) call check(nf90_inq_varids(self%id, tmp, getVariableIds), "Failed to inquire variable ids") end function getVariableIds - + function getVariables(self) - class(NcDataset), intent(in) :: self + class(NcDataset), intent(in) :: self type(NcVariable), dimension(:), allocatable :: getVariables - integer(i4), dimension(:), allocatable :: varids - integer(i4) :: i, nvars + integer(i4), dimension(:), allocatable :: varids + integer(i4) :: i, nvars nvars = self%getNoVariables() allocate(getVariables(nvars), varids(nvars)) varids = self%getVariableIds() - do i=1,size(varids) - getVariables(i) = NcVariable(varids(i), self) + do i = 1, size(varids) + getVariables(i) = NcVariable(varids(i), self) end do - + end function getVariables - + function getDimensionName(self) class(NcDimension), intent(in) :: self - character(len=256) :: getDimensionName + character(len = 256) :: getDimensionName - call check(nf90_inquire_dimension(self%parent%id, self%id, name=getDimensionName), & - "Failed to inquire dimension name") + call check(nf90_inquire_dimension(self%parent%id, self%id, name = getDimensionName), & + "Failed to inquire dimension name") end function getDimensionName function getDimensionLength(self) class(NcDimension), intent(in) :: self - integer(i4) :: getDimensionLength + integer(i4) :: getDimensionLength - call check(nf90_inquire_dimension(self%parent%id,self%id,len=getDimensionLength),& - "Failed to inquire dimension: "//self%getName()) + call check(nf90_inquire_dimension(self%parent%id, self%id, len = getDimensionLength), & + "Failed to inquire dimension: " // self%getName()) end function getDimensionLength function isDatasetUnlimited(self) class(NcDataset), intent(in) :: self - logical :: isDatasetUnlimited - integer(i4) :: dimid + logical :: isDatasetUnlimited + integer(i4) :: dimid - call check(nf90_inquire(self%id,unlimitedDimId=dimid), & - "Failed to inquire file "//self%fname) + call check(nf90_inquire(self%id, unlimitedDimId = dimid), & + "Failed to inquire file " // self%fname) isDatasetUnlimited = (dimid .ne. -1) end function isDatasetUnlimited function getUnlimitedDimension(self) class(NcDataset), intent(in) :: self - type(NcDimension) :: getUnlimitedDimension - integer(i4) :: dimid + type(NcDimension) :: getUnlimitedDimension + integer(i4) :: dimid - call check(nf90_inquire(self%id,unlimitedDimId=dimid), & - "Failed to inquire file "//self%fname) + call check(nf90_inquire(self%id, unlimitedDimId = dimid), & + "Failed to inquire file " // self%fname) if (dimid .eq. -1) then - write(*,*) "Dataset has no unlimited dimension" - stop 1 + write(*, *) "Dataset has no unlimited dimension" + stop 1 end if getUnlimitedDimension = self%getDimension(dimid) @@ -1463,238 +1491,238 @@ end function equalNcDimensions function isUnlimitedDimension(self) class(NcDimension), intent(in) :: self - logical :: isUnlimitedDimension + logical :: isUnlimitedDimension isUnlimitedDimension = .false. if (self%parent%isUnlimited()) then - isUnlimitedDimension = (self == self%parent%getUnlimitedDimension()) + isUnlimitedDimension = (self == self%parent%getUnlimitedDimension()) end if end function isUnlimitedDimension function setDimension(self, name, length) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i4) , intent(in) :: length - type(NcDimension) :: setDimension - integer(i4) :: id, dimlength + character(*), intent(in) :: name + integer(i4), intent(in) :: length + type(NcDimension) :: setDimension + integer(i4) :: id, dimlength if (length .le. 0) then - dimlength = NF90_UNLIMITED + dimlength = NF90_UNLIMITED else - dimlength = length + dimlength = length end if call check(nf90_def_dim(self%id, name, dimlength, id), & - "Failed to create dimension: " // name) + "Failed to create dimension: " // name) - setDimension = NcDimension(id,self) + setDimension = NcDimension(id, self) end function setDimension function hasVariable(self, name) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - logical :: hasVariable - integer(i4) :: tmpid + character(*), intent(in) :: name + logical :: hasVariable + integer(i4) :: tmpid - hasVariable = (nf90_inq_varid(self%id,name,tmpid) .eq. NF90_NOERR) + hasVariable = (nf90_inq_varid(self%id, name, tmpid) .eq. NF90_NOERR) end function hasVariable function hasDimension(self, name) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - logical :: hasDimension - integer(i4) :: tmpid + character(*), intent(in) :: name + logical :: hasDimension + integer(i4) :: tmpid - hasDimension = (nf90_inq_dimid(self%id,name,tmpid) .eq. NF90_NOERR) + hasDimension = (nf90_inq_dimid(self%id, name, tmpid) .eq. NF90_NOERR) end function hasDimension function setVariableWithIds(self, name, dtype, dimensions, contiguous, & - chunksizes, deflate_level, shuffle, fletcher32, endianness, & - cache_size, cache_nelems, cache_preemption) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - character(3) , intent(in) :: dtype - integer(i4) , intent(in) :: dimensions(:) - logical , intent(in), optional :: contiguous,shuffle, fletcher32 - integer(i4) , intent(in), optional :: endianness,deflate_level,cache_size, & - cache_nelems, cache_preemption, chunksizes(:) - type(NcVariable) :: setVariableWithIds - integer(i4) :: varid, status + chunksizes, deflate_level, shuffle, fletcher32, endianness, & + cache_size, cache_nelems, cache_preemption) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + character(3), intent(in) :: dtype + integer(i4), intent(in) :: dimensions(:) + logical, intent(in), optional :: contiguous, shuffle, fletcher32 + integer(i4), intent(in), optional :: endianness, deflate_level, cache_size, & + cache_nelems, cache_preemption, chunksizes(:) + type(NcVariable) :: setVariableWithIds + integer(i4) :: varid, status status = nf90_def_var(self%id, name, getDtypeFromString(dtype), dimensions, varid, contiguous, & - chunksizes, deflate_level, shuffle, fletcher32, endianness, & - cache_size, cache_nelems, cache_preemption) + chunksizes, deflate_level, shuffle, fletcher32, endianness, & + cache_size, cache_nelems, cache_preemption) call check(status, "Failed to create variable: " // name) setVariableWithIds = NcVariable(varid, self) end function setVariableWithIds function setVariableWithNames(self, name, dtype, dimensions, contiguous, & - chunksizes, deflate_level, shuffle, fletcher32, endianness, & - cache_size, cache_nelems, cache_preemption) - - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - character(3) , intent(in) :: dtype - character(*) , intent(in) :: dimensions(:) - logical , intent(in), optional :: contiguous,shuffle, fletcher32 - integer(i4) , intent(in), optional :: endianness,deflate_level,cache_size, & - cache_nelems, cache_preemption, chunksizes(:) - type(NcVariable) :: setVariableWithNames - type(NcDimension) :: dim - integer(i4) :: i, dimids(size(dimensions)) - - do i = 1,size(dimensions) - dim = self%getDimension(dimensions(i)) - dimids(i) = dim%id + chunksizes, deflate_level, shuffle, fletcher32, endianness, & + cache_size, cache_nelems, cache_preemption) + + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + character(3), intent(in) :: dtype + character(*), intent(in) :: dimensions(:) + logical, intent(in), optional :: contiguous, shuffle, fletcher32 + integer(i4), intent(in), optional :: endianness, deflate_level, cache_size, & + cache_nelems, cache_preemption, chunksizes(:) + type(NcVariable) :: setVariableWithNames + type(NcDimension) :: dim + integer(i4) :: i, dimids(size(dimensions)) + + do i = 1, size(dimensions) + dim = self%getDimension(dimensions(i)) + dimids(i) = dim%id end do setVariableWithNames = setVariableWithIds(self, name, dtype, dimids, contiguous, & - chunksizes, deflate_level, shuffle, fletcher32, endianness, & - cache_size, cache_nelems, cache_preemption) + chunksizes, deflate_level, shuffle, fletcher32, endianness, & + cache_size, cache_nelems, cache_preemption) end function setVariableWithNames function setVariableWithTypes(self, name, dtype, dimensions, contiguous, & - chunksizes, deflate_level, shuffle, fletcher32, endianness, & - cache_size, cache_nelems, cache_preemption) - class(NcDataset) , intent(in) :: self - character(*) , intent(in) :: name - character(3) , intent(in) :: dtype - type(NcDimension), intent(in) :: dimensions(:) - logical , intent(in), optional :: contiguous,shuffle, fletcher32 - integer(i4) , intent(in), optional :: endianness,deflate_level,cache_size, & - cache_nelems, cache_preemption, chunksizes(:) - type(NcVariable) :: setVariableWithTypes - type(NcDimension) :: dim - integer(i4) :: i, dimids(size(dimensions)) - - do i = 1,size(dimensions) - dim = dimensions(i) - dimids(i) = dim%id + chunksizes, deflate_level, shuffle, fletcher32, endianness, & + cache_size, cache_nelems, cache_preemption) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + character(3), intent(in) :: dtype + type(NcDimension), intent(in) :: dimensions(:) + logical, intent(in), optional :: contiguous, shuffle, fletcher32 + integer(i4), intent(in), optional :: endianness, deflate_level, cache_size, & + cache_nelems, cache_preemption, chunksizes(:) + type(NcVariable) :: setVariableWithTypes + type(NcDimension) :: dim + integer(i4) :: i, dimids(size(dimensions)) + + do i = 1, size(dimensions) + dim = dimensions(i) + dimids(i) = dim%id end do setVariableWithTypes = setVariableWithIds(self, name, dtype, dimids, contiguous, & - chunksizes, deflate_level, shuffle, fletcher32, endianness, & - cache_size, cache_nelems, cache_preemption) + chunksizes, deflate_level, shuffle, fletcher32, endianness, & + cache_size, cache_nelems, cache_preemption) end function setVariableWithTypes function getDimensionById(self, id) class(NcDataset), intent(in) :: self - integer(i4) :: id - type(NcDimension) :: getDimensionById - character(32) :: msg, name - - write(msg,*) id - call check(nf90_inquire_dimension(self%id,id,name), & - "Could not inquire dimension: " // msg) - getDimensionById = NcDimension(id,self) + integer(i4) :: id + type(NcDimension) :: getDimensionById + character(32) :: msg, name + + write(msg, *) id + call check(nf90_inquire_dimension(self%id, id, name), & + "Could not inquire dimension: " // msg) + getDimensionById = NcDimension(id, self) end function getDimensionById function getDimensionByName(self, name) class(NcDataset), intent(in) :: self - character(*) :: name - type(NcDimension) :: getDimensionByName - integer(i4) :: id + character(*) :: name + type(NcDimension) :: getDimensionByName + integer(i4) :: id - call check(nf90_inq_dimid(self%id,name,id), & - "Could not inquire dimension: " // name) + call check(nf90_inq_dimid(self%id, name, id), & + "Could not inquire dimension: " // name) getDimensionByName = self%getDimensionById(id) end function getDimensionByName function getVariableByName(self, name) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - type(NcVariable) :: getVariableByName - integer(i4) :: id + character(*), intent(in) :: name + type(NcVariable) :: getVariableByName + integer(i4) :: id call check(nf90_inq_varid(self%id, name, id), & - "Could not inquire variable: " // name) + "Could not inquire variable: " // name) getVariableByName = NcVariable(id, self) end function getVariableByName function getVariableName(self) class(NcVariable), intent(in) :: self - character(len=256) :: getVariableName + character(len = 256) :: getVariableName - call check(nf90_inquire_variable(self%parent%id, self%id, name=getVariableName), & - "Could not inquire variable name") + call check(nf90_inquire_variable(self%parent%id, self%id, name = getVariableName), & + "Could not inquire variable name") end function getVariableName function getNoDimensions(self) class(NcVariable), intent(in) :: self - integer(i4) :: getNoDimensions + integer(i4) :: getNoDimensions - call check(nf90_inquire_variable(self%parent%id,self%id,ndims=getNoDimensions), & - "Could not inquire variable: " // self%getName()) + call check(nf90_inquire_variable(self%parent%id, self%id, ndims = getNoDimensions), & + "Could not inquire variable: " // self%getName()) end function getNoDimensions function getVariableDimensions(self) - class(NcVariable), intent(in) :: self + class(NcVariable), intent(in) :: self type(NcDimension), allocatable :: getVariableDimensions(:) - integer(i4) , allocatable :: dimids(:) - integer(i4) :: ii , ndims + integer(i4), allocatable :: dimids(:) + integer(i4) :: ii, ndims ndims = self%getNoDimensions() allocate(dimids(ndims), getVariableDimensions(ndims)) - call check(nf90_inquire_variable(self%parent%id,self%id,dimids=dimids), & - "Could not inquire variable: " // self%getName()) + call check(nf90_inquire_variable(self%parent%id, self%id, dimids = dimids), & + "Could not inquire variable: " // self%getName()) - do ii=1,ndims - getVariableDimensions (ii) = self%parent%getDimension(dimids(ii)) + do ii = 1, ndims + getVariableDimensions (ii) = self%parent%getDimension(dimids(ii)) end do end function getVariableDimensions function getVariableShape(self) - class(NcVariable), intent(in) :: self - integer(i4) , allocatable :: getVariableShape(:) + class(NcVariable), intent(in) :: self + integer(i4), allocatable :: getVariableShape(:) type(NcDimension), allocatable :: dims(:) - integer(i4) :: ii, ndims + integer(i4) :: ii, ndims ndims = self%getNoDimensions() allocate(getVariableShape(ndims), dims(ndims)) dims = self%getDimensions() - do ii = 1,size(dims) - getVariableShape(ii) = dims(ii)%getLength() + do ii = 1, size(dims) + getVariableShape(ii) = dims(ii)%getLength() end do end function getVariableShape function getVariableDtype(self) class(NcVariable), intent(in) :: self - integer(i4) :: dtype - character(3) :: getVariableDtype + integer(i4) :: dtype + character(3) :: getVariableDtype - call check(nf90_inquire_variable(self%parent%id,self%id,xtype=dtype),& - "Could not inquire variable: " // self%getName()) + call check(nf90_inquire_variable(self%parent%id, self%id, xtype = dtype), & + "Could not inquire variable: " // self%getName()) getVariableDtype = getDtypeFromInteger(dtype) end function getVariableDtype function isUnlimitedVariable(self) - class(NcVariable), intent(in) :: self - logical :: isUnlimitedVariable + class(NcVariable), intent(in) :: self + logical :: isUnlimitedVariable type(NcDimension), allocatable :: dims(:) - type(NcDimension) :: dim - integer(i4) :: ii + type(NcDimension) :: dim + integer(i4) :: ii allocate(dims(self%getNoDimensions())) isUnlimitedVariable = .false. dims = self%getDimensions() - do ii = 1,size(dims) - dim = dims(ii) - if (dim%isUnlimited()) then - isUnlimitedVariable = .true. - end if + do ii = 1, size(dims) + dim = dims(ii) + if (dim%isUnlimited()) then + isUnlimitedVariable = .true. + end if end do end function isUnlimitedVariable - function hasAttribute(self,name) + function hasAttribute(self, name) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - logical :: hasAttribute - integer(i4) :: status + character(*), intent(in) :: name + logical :: hasAttribute + integer(i4) :: status status = nf90_inquire_attribute(self%parent%id, self%id, name) hasAttribute = (status .eq. NF90_NOERR) @@ -1702,1322 +1730,1324 @@ end function hasAttribute subroutine setGlobalAttributeChar(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - character(*) , intent(in) :: data + character(*), intent(in) :: name + character(*), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeChar subroutine setGlobalAttributeI8(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i1) , intent(in) :: data + character(*), intent(in) :: name + integer(i1), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeI8 subroutine setGlobalAttributeI16(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i2) , intent(in) :: data + character(*), intent(in) :: name + integer(i2), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeI16 subroutine setGlobalAttributeI32(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i4) , intent(in) :: data + character(*), intent(in) :: name + integer(i4), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeI32 subroutine setGlobalAttributeI64(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i8) , intent(in) :: data + character(*), intent(in) :: name + integer(i8), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeI64 subroutine setGlobalAttributeF32(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - real(sp) , intent(in) :: data + character(*), intent(in) :: name + real(sp), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeF32 subroutine setGlobalAttributeF64(self, name, data) class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - real(dp) , intent(in) :: data + character(*), intent(in) :: name + real(dp), intent(in) :: data - call check(nf90_put_att(self%id,NF90_GLOBAL,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%id, NF90_GLOBAL, name, data), & + "Failed to write attribute: " // name) end subroutine setGlobalAttributeF64 subroutine getGlobalAttributeChar(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - character(*) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + character(*), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeChar subroutine getGlobalAttributeI8(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i1) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + integer(i1), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeI8 subroutine getGlobalAttributeI16(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i2) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + integer(i2), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeI16 subroutine getGlobalAttributeI32(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i4) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + integer(i4), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeI32 subroutine getGlobalAttributeI64(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - integer(i8) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + integer(i8), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeI64 subroutine getGlobalAttributeF32(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - real(sp) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + real(sp), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeF32 subroutine getGlobalAttributeF64(self, name, avalue) - class(NcDataset), intent(in) :: self - character(*) , intent(in) :: name - real(dp) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%id,NF90_GLOBAL,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%id,NF90_GLOBAL,name,avalue), & - "Could not read attribute "//name) + class(NcDataset), intent(in) :: self + character(*), intent(in) :: name + real(dp), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%id, NF90_GLOBAL, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%id, NF90_GLOBAL, name, avalue), & + "Could not read attribute " // name) end subroutine getGlobalAttributeF64 subroutine setVariableAttributeChar(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - character(*) , intent(in) :: data + character(*), intent(in) :: name + character(*), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeChar subroutine setVariableAttributeI8(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i1) , intent(in) :: data + character(*), intent(in) :: name + integer(i1), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeI8 - + subroutine setVariableAttributeI16(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i2) , intent(in) :: data + character(*), intent(in) :: name + integer(i2), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeI16 subroutine setVariableAttributeI32(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i4) , intent(in) :: data + character(*), intent(in) :: name + integer(i4), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeI32 subroutine setVariableAttributeI64(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i8) , intent(in) :: data + character(*), intent(in) :: name + integer(i8), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeI64 subroutine setVariableAttributeF32(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - real(sp) , intent(in) :: data + character(*), intent(in) :: name + real(sp), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeF32 subroutine setVariableAttributeF64(self, name, data) class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - real(dp) , intent(in) :: data + character(*), intent(in) :: name + real(dp), intent(in) :: data - call check(nf90_put_att(self%parent%id,self%id,name,data), & - "Failed to write attribute: " // name ) + call check(nf90_put_att(self%parent%id, self%id, name, data), & + "Failed to write attribute: " // name) end subroutine setVariableAttributeF64 subroutine getVariableAttributeChar(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - character(*) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + character(*), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeChar subroutine getVariableAttributeI8(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i1) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + integer(i1), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeI8 subroutine getVariableAttributeI16(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i2) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + integer(i2), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeI16 subroutine getVariableAttributeI32(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i4) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + integer(i4), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeI32 subroutine getVariableAttributeI64(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - integer(i8) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + integer(i8), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeI64 subroutine getVariableAttributeF32(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - real(sp) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + real(sp), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeF32 subroutine getVariableAttributeF64(self, name, avalue) - class(NcVariable), intent(in) :: self - character(*) , intent(in) :: name - real(dp) , intent(out) :: avalue - integer(i4) :: length - - call check(nf90_inquire_attribute(self%parent%id,self%id,name,len=length),& - "Could not inquire attribute "//name) - call check(nf90_get_att(self%parent%id,self%id,name,avalue), & - "Could not read attribute "//name) + class(NcVariable), intent(in) :: self + character(*), intent(in) :: name + real(dp), intent(out) :: avalue + integer(i4) :: length + + call check(nf90_inquire_attribute(self%parent%id, self%id, name, len = length), & + "Could not inquire attribute " // name) + call check(nf90_get_att(self%parent%id, self%id, name, avalue), & + "Could not read attribute " // name) end subroutine getVariableAttributeF64 subroutine setVariableFillValueI8(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: fvalue + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: fvalue if (.not. self%hasAttribute("_FillValue")) then - call self%setAttribute("_FillValue",fvalue) + call self%setAttribute("_FillValue", fvalue) end if end subroutine setVariableFillValueI8 - + subroutine setVariableFillValueI16(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: fvalue + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: fvalue if (.not. self%hasAttribute("_FillValue")) then - call self%setAttribute("_FillValue",fvalue) + call self%setAttribute("_FillValue", fvalue) end if end subroutine setVariableFillValueI16 subroutine setVariableFillValueI32(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: fvalue + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: fvalue if (.not. self%hasAttribute("_FillValue")) then - call self%setAttribute("_FillValue",fvalue) + call self%setAttribute("_FillValue", fvalue) end if end subroutine setVariableFillValueI32 subroutine setVariableFillValueI64(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: fvalue + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: fvalue if (.not. self%hasAttribute("_FillValue")) then - call self%setAttribute("_FillValue",fvalue) + call self%setAttribute("_FillValue", fvalue) end if end subroutine setVariableFillValueI64 subroutine setVariableFillValueF32(self, fvalue) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: fvalue + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: fvalue if (.not. self%hasAttribute("_FillValue")) then - call self%setAttribute("_FillValue",fvalue) + call self%setAttribute("_FillValue", fvalue) end if end subroutine setVariableFillValueF32 subroutine setVariableFillValueF64(self, fvalue) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: fvalue + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: fvalue if (.not. self%hasAttribute("_FillValue")) then - call self%setAttribute("_FillValue",fvalue) + call self%setAttribute("_FillValue", fvalue) end if end subroutine setVariableFillValueF64 subroutine getVariableFillValueI8(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i1) , intent(out) :: fvalue + class(NcVariable), intent(in) :: self + integer(i1), intent(out) :: fvalue if (self%hasAttribute("_FillValue")) then - call self%getAttribute("_FillValue", fvalue) + call self%getAttribute("_FillValue", fvalue) else - fvalue = NF90_FILL_BYTE + fvalue = NF90_FILL_BYTE end if end subroutine getVariableFillValueI8 subroutine getVariableFillValueI16(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i2) , intent(out) :: fvalue + class(NcVariable), intent(in) :: self + integer(i2), intent(out) :: fvalue if (self%hasAttribute("_FillValue")) then - call self%getAttribute("_FillValue", fvalue) + call self%getAttribute("_FillValue", fvalue) else - fvalue = NF90_FILL_SHORT + fvalue = NF90_FILL_SHORT end if end subroutine getVariableFillValueI16 subroutine getVariableFillValueI32(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i4) , intent(out) :: fvalue + class(NcVariable), intent(in) :: self + integer(i4), intent(out) :: fvalue if (self%hasAttribute("_FillValue")) then - call self%getAttribute("_FillValue", fvalue) + call self%getAttribute("_FillValue", fvalue) else - fvalue = NF90_FILL_INT + fvalue = NF90_FILL_INT end if end subroutine getVariableFillValueI32 subroutine getVariableFillValueI64(self, fvalue) - class(NcVariable), intent(in) :: self - integer(i8) , intent(out) :: fvalue + class(NcVariable), intent(in) :: self + integer(i8), intent(out) :: fvalue if (self%hasAttribute("_FillValue")) then - call self%getAttribute("_FillValue", fvalue) + call self%getAttribute("_FillValue", fvalue) else - fvalue = NF90_FILL_INT + fvalue = NF90_FILL_INT end if end subroutine getVariableFillValueI64 subroutine getVariableFillValueF32(self, fvalue) - class(NcVariable), intent(in) :: self - real(sp) , intent(out) :: fvalue + class(NcVariable), intent(in) :: self + real(sp), intent(out) :: fvalue if (self%hasAttribute("_FillValue")) then - call self%getAttribute("_FillValue", fvalue) + call self%getAttribute("_FillValue", fvalue) else - fvalue = NF90_FILL_FLOAT + fvalue = NF90_FILL_FLOAT end if end subroutine getVariableFillValueF32 subroutine getVariableFillValueF64(self, fvalue) - class(NcVariable), intent(in) :: self - real(dp) , intent(out) :: fvalue + class(NcVariable), intent(in) :: self + real(dp), intent(out) :: fvalue if (self%hasAttribute("_FillValue")) then - call self%getAttribute("_FillValue", fvalue) + call self%getAttribute("_FillValue", fvalue) else - fvalue = NF90_FILL_DOUBLE + fvalue = NF90_FILL_DOUBLE end if end subroutine getVariableFillValueF64 subroutine setDataScalarI8(self, values, start) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: values - integer(i4) , intent(in), optional :: start(:) + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: values + integer(i4), intent(in), optional :: start(:) - call check( nf90_put_var(self%parent%id, self%id, values, start), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setDataScalarI8 subroutine setData1dI8(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: values(:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: values(:) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData1dI8 subroutine setData2dI8(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: values(:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: values(:, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData2dI8 subroutine setData3dI8(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: values(:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: values(:, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData3dI8 subroutine setData4dI8(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: values(:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: values(:, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData4dI8 subroutine setData5dI8(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i1) , intent(in) :: values(:,:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i1), intent(in) :: values(:, :, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData5dI8 subroutine setDataScalarI16(self, values, start) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: values - integer(i4) , intent(in), optional :: start(:) + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: values + integer(i4), intent(in), optional :: start(:) - call check( nf90_put_var(self%parent%id, self%id, values, start), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setDataScalarI16 subroutine setData1dI16(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: values(:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: values(:) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData1dI16 subroutine setData2dI16(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: values(:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: values(:, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData2dI16 subroutine setData3dI16(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: values(:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: values(:, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData3dI16 subroutine setData4dI16(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: values(:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: values(:, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData4dI16 subroutine setData5dI16(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i2) , intent(in) :: values(:,:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i2), intent(in) :: values(:, :, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData5dI16 - + subroutine setDataScalarI32(self, values, start) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: values - integer(i4) , intent(in), optional :: start(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: values + integer(i4), intent(in), optional :: start(:) - call check( nf90_put_var(self%parent%id, self%id, values, start), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setDataScalarI32 subroutine setData1dI32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: values(:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: values(:) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData1dI32 subroutine setData2dI32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: values(:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: values(:, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData2dI32 subroutine setData3dI32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: values(:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: values(:, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData3dI32 subroutine setData4dI32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: values(:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: values(:, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData4dI32 subroutine setData5dI32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) :: values(:,:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in) :: values(:, :, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData5dI32 - subroutine setDataScalarI64(self, values, start) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: values - integer(i4) , intent(in), optional :: start(:) + subroutine setDataScalarI64(self, values, start) + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: values + integer(i4), intent(in), optional :: start(:) - call check( nf90_put_var(self%parent%id, self%id, values, start), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setDataScalarI64 subroutine setData1dI64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: values(:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: values(:) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData1dI64 subroutine setData2dI64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: values(:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: values(:, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData2dI64 subroutine setData3dI64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: values(:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: values(:, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData3dI64 subroutine setData4dI64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: values(:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: values(:, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData4dI64 subroutine setData5dI64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i8) , intent(in) :: values(:,:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + integer(i8), intent(in) :: values(:, :, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData5dI64 subroutine setDataScalarF32(self, values, start) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: values - integer(i4) , intent(in), optional :: start(:) + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: values + integer(i4), intent(in), optional :: start(:) - call check( nf90_put_var(self%parent%id, self%id, values, start), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setDataScalarF32 subroutine setData1dF32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: values(:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: values(:) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData1dF32 subroutine setData2dF32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: values(:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: values(:, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData2dF32 subroutine setData3dF32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: values(:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: values(:, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData3dF32 subroutine setData4dF32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: values(:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: values(:, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData4dF32 subroutine setData5dF32(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(sp) , intent(in) :: values(:,:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(sp), intent(in) :: values(:, :, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData5dF32 subroutine setDataScalarF64(self, values, start) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: values - integer(i4) , intent(in), optional :: start(:) + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: values + integer(i4), intent(in), optional :: start(:) - call check( nf90_put_var(self%parent%id, self%id, values, start), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setDataScalarF64 subroutine setData1dF64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: values(:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: values(:) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData1dF64 subroutine setData2dF64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: values(:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: values(:, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData2dF64 subroutine setData3dF64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: values(:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: values(:, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData3dF64 subroutine setData4dF64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: values(:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: values(:, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData4dF64 subroutine setData5dF64(self, values, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - real(dp) , intent(in) :: values(:,:,:,:,:) - integer(i4) , intent(in), optional :: start(:), cnt(:), stride(:), map(:) + class(NcVariable), intent(in) :: self + real(dp), intent(in) :: values(:, :, :, :, :) + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) - call check( nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & - "Failed to write data into variable: " // trim(self%getName())) + call check(nf90_put_var(self%parent%id, self%id, values, start, cnt, stride, map), & + "Failed to write data into variable: " // trim(self%getName())) end subroutine setData5dF64 subroutine getDataScalarI8(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i1) , intent(out) :: data - integer(i1) :: tmp(1) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i1), intent(out) :: data + integer(i1) :: tmp(1) call check (nf90_get_var(self%parent%id, self%id, tmp, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) data = tmp(1) end subroutine getDataScalarI8 subroutine getData1dI8(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i1) , intent(out), allocatable :: data(:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i1), intent(out), allocatable :: data(:) + integer(i4), allocatable :: datashape(:) allocate(datashape(1)) datashape = getReadDataShape(self, 1, start, cnt, stride) allocate(data(datashape(1))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData1dI8 subroutine getData2dI8(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i1) , intent(out), allocatable :: data(:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i1), intent(out), allocatable :: data(:, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(2)) datashape = getReadDataShape(self, 2, start, cnt, stride) allocate(data(datashape(1), datashape(2))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData2dI8 subroutine getData3dI8(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i1) , intent(out), allocatable :: data(:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i1), intent(out), allocatable :: data(:, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(3)) datashape = getReadDataShape(self, 3, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData3dI8 subroutine getData4dI8(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i1) , intent(out), allocatable :: data(:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i1), intent(out), allocatable :: data(:, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(4)) datashape = getReadDataShape(self, 4, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData4dI8 subroutine getData5dI8(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i1) , intent(out), allocatable :: data(:,:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i1), intent(out), allocatable :: data(:, :, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(5)) datashape = getReadDataShape(self, 5, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4), datashape(5))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData5dI8 subroutine getDataScalarI16(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i2) , intent(out) :: data - integer(i2) :: tmp(1) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i2), intent(out) :: data + integer(i2) :: tmp(1) call check (nf90_get_var(self%parent%id, self%id, tmp, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) data = tmp(1) end subroutine getDataScalarI16 subroutine getData1dI16(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i2) , intent(out), allocatable :: data(:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i2), intent(out), allocatable :: data(:) + integer(i4), allocatable :: datashape(:) allocate(datashape(1)) datashape = getReadDataShape(self, 1, start, cnt, stride) allocate(data(datashape(1))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData1dI16 subroutine getData2dI16(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i2) , intent(out), allocatable :: data(:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i2), intent(out), allocatable :: data(:, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(2)) datashape = getReadDataShape(self, 2, start, cnt, stride) allocate(data(datashape(1), datashape(2))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData2dI16 subroutine getData3dI16(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i2) , intent(out), allocatable :: data(:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i2), intent(out), allocatable :: data(:, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(3)) datashape = getReadDataShape(self, 3, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData3dI16 subroutine getData4dI16(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i2) , intent(out), allocatable :: data(:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i2), intent(out), allocatable :: data(:, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(4)) datashape = getReadDataShape(self, 4, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData4dI16 subroutine getData5dI16(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i2) , intent(out), allocatable :: data(:,:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i2), intent(out), allocatable :: data(:, :, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(5)) datashape = getReadDataShape(self, 5, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4), datashape(5))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData5dI16 subroutine getDataScalarI32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i4) , intent(out) :: data - integer(i4) :: tmp(1) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i4), intent(out) :: data + integer(i4) :: tmp(1) call check (nf90_get_var(self%parent%id, self%id, tmp, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) data = tmp(1) end subroutine getDataScalarI32 subroutine getData1dI32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i4) , intent(out), allocatable :: data(:) - integer(i4) , allocatable :: datashape(:) - + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i4), intent(out), allocatable :: data(:) + integer(i4), allocatable :: datashape(:) + allocate(datashape(1)) datashape = getReadDataShape(self, 1, start, cnt, stride) - + allocate(data(datashape(1))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData1dI32 subroutine getData2dI32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i4) , intent(out), allocatable :: data(:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i4), intent(out), allocatable :: data(:, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(2)) datashape = getReadDataShape(self, 2, start, cnt, stride) allocate(data(datashape(1), datashape(2))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData2dI32 subroutine getData3dI32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i4) , intent(out), allocatable :: data(:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i4), intent(out), allocatable :: data(:, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(3)) datashape = getReadDataShape(self, 3, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData3dI32 subroutine getData4dI32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i4) , intent(out), allocatable :: data(:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i4), intent(out), allocatable :: data(:, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(4)) datashape = getReadDataShape(self, 4, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData4dI32 subroutine getData5dI32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i4) , intent(out), allocatable :: data(:,:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i4), intent(out), allocatable :: data(:, :, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(5)) datashape = getReadDataShape(self, 5, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4), datashape(5))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData5dI32 subroutine getDataScalarI64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i8) , intent(out) :: data - integer(i4) :: tmp(1) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i8), intent(out) :: data + integer(i4) :: tmp(1) call check (nf90_get_var(self%parent%id, self%id, tmp, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) data = tmp(1) end subroutine getDataScalarI64 subroutine getData1dI64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i8) , intent(out), allocatable :: data(:) - integer(i4) , allocatable :: datashape(:) - + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i8), intent(out), allocatable :: data(:) + integer(i4), allocatable :: datashape(:) + allocate(datashape(1)) datashape = getReadDataShape(self, 1, start, cnt, stride) - + allocate(data(datashape(1))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData1dI64 subroutine getData2dI64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i8) , intent(out), allocatable :: data(:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i8), intent(out), allocatable :: data(:, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(2)) datashape = getReadDataShape(self, 2, start, cnt, stride) allocate(data(datashape(1), datashape(2))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData2dI64 subroutine getData3dI64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i8) , intent(out), allocatable :: data(:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i8), intent(out), allocatable :: data(:, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(3)) datashape = getReadDataShape(self, 3, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData3dI64 subroutine getData4dI64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i8) , intent(out), allocatable :: data(:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i8), intent(out), allocatable :: data(:, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(4)) datashape = getReadDataShape(self, 4, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData4dI64 subroutine getData5dI64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - integer(i8) , intent(out), allocatable :: data(:,:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + integer(i8), intent(out), allocatable :: data(:, :, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(5)) datashape = getReadDataShape(self, 5, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4), datashape(5))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData5dI64 subroutine getDataScalarF32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(sp) , intent(out) :: data - real(sp) :: tmp(1) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(sp), intent(out) :: data + real(sp) :: tmp(1) call check (nf90_get_var(self%parent%id, self%id, tmp, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) data = tmp(1) end subroutine getDataScalarF32 subroutine getData1dF32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(sp) , intent(out), allocatable :: data(:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(sp), intent(out), allocatable :: data(:) + integer(i4), allocatable :: datashape(:) allocate(datashape(1)) datashape = getReadDataShape(self, 1, start, cnt, stride) allocate(data(datashape(1))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData1dF32 subroutine getData2dF32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(sp) , intent(out), allocatable :: data(:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(sp), intent(out), allocatable :: data(:, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(2)) datashape = getReadDataShape(self, 2, start, cnt, stride) allocate(data(datashape(1), datashape(2))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData2dF32 subroutine getData3dF32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(sp) , intent(out), allocatable :: data(:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(sp), intent(out), allocatable :: data(:, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(3)) datashape = getReadDataShape(self, 3, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData3dF32 subroutine getData4dF32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(sp) , intent(out), allocatable :: data(:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(sp), intent(out), allocatable :: data(:, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(4)) datashape = getReadDataShape(self, 4, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData4dF32 subroutine getData5dF32(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(sp) , intent(out), allocatable :: data(:,:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(sp), intent(out), allocatable :: data(:, :, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(5)) datashape = getReadDataShape(self, 5, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4), datashape(5))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData5dF32 subroutine getDataScalarF64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(dp) , intent(out) :: data - real(dp) :: tmp(1) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(dp), intent(out) :: data + real(dp) :: tmp(1) call check (nf90_get_var(self%parent%id, self%id, tmp, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) data = tmp(1) end subroutine getDataScalarF64 subroutine getData1dF64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(dp) , intent(out), allocatable :: data(:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(dp), intent(out), allocatable :: data(:) + integer(i4), allocatable :: datashape(:) allocate(datashape(1)) datashape = getReadDataShape(self, 1, start, cnt, stride) - + allocate(data(datashape(1))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData1dF64 subroutine getData2dF64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(dp) , intent(out), allocatable :: data(:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(dp), intent(out), allocatable :: data(:, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(2)) datashape = getReadDataShape(self, 2, start, cnt, stride) allocate(data(datashape(1), datashape(2))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData2dF64 subroutine getData3dF64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(dp) , intent(out), allocatable :: data(:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(dp), intent(out), allocatable :: data(:, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(3)) datashape = getReadDataShape(self, 3, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData3dF64 subroutine getData4dF64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(dp) , intent(out), allocatable :: data(:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(dp), intent(out), allocatable :: data(:, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(4)) datashape = getReadDataShape(self, 4, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData4dF64 subroutine getData5dF64(self, data, start, cnt, stride, map) - class(NcVariable), intent(in) :: self - integer(i4) , intent(in) , optional :: start(:), cnt(:), stride(:), map(:) - real(dp) , intent(out), allocatable :: data(:,:,:,:,:) - integer(i4) , allocatable :: datashape(:) + class(NcVariable), intent(in) :: self + integer(i4), intent(in), optional :: start(:), cnt(:), stride(:), map(:) + real(dp), intent(out), allocatable :: data(:, :, :, :, :) + integer(i4), allocatable :: datashape(:) allocate(datashape(5)) datashape = getReadDataShape(self, 5, start, cnt, stride) allocate(data(datashape(1), datashape(2), datashape(3), datashape(4), datashape(5))) call check (nf90_get_var(self%parent%id, self%id, data, start, cnt, stride, map), & - "Could not read data from variable: "//trim(self%getName())) + "Could not read data from variable: " // trim(self%getName())) end subroutine getData5dF64 function getReadDataShape(var, datarank, instart, incnt, instride) - type(NcVariable), intent(in) :: var - integer(i4) , intent(in) :: datarank - integer(i4) , intent(in), optional :: instart(:), incnt(:), instride(:) - integer(i4) , allocatable :: readshape(:) - integer(i4) :: naxis - integer(i4) :: getReadDataShape(datarank) + type(NcVariable), intent(in) :: var + integer(i4), intent(in) :: datarank + integer(i4), intent(in), optional :: instart(:), incnt(:), instride(:) + integer(i4), allocatable :: readshape(:) + integer(i4) :: naxis + integer(i4) :: getReadDataShape(datarank) readshape = var%getShape() - + if (present(incnt)) then - readshape = incnt + readshape = incnt else - if (present(instart)) then - readshape(:size(instart)) = readshape(:size(instart)) - (instart - 1) - end if - if (present(instride)) then - readshape(:size(instride)) = readshape(:size(instride)) / instride - end if + if (present(instart)) then + readshape(: size(instart)) = readshape(: size(instart)) - (instart - 1) + end if + if (present(instride)) then + readshape(: size(instride)) = readshape(: size(instride)) / instride + end if end if - + naxis = count(readshape .gt. 1) - + if (all(readshape .eq. 1)) then - ! return 1-element array - getReadDataShape(:) = 1 !readshape(1:datarank+1) + ! return 1-element array + getReadDataShape(:) = 1 !readshape(1:datarank+1) else if (size(readshape) .eq. datarank) then - ! sizes fit - getReadDataShape = readshape + ! sizes fit + getReadDataShape = readshape else if (naxis .eq. datarank) then - getReadDataShape = pack(readshape, readshape .gt. 1) - ! else if (naxis .lt. datarank) then - ! would be nice... + getReadDataShape = pack(readshape, readshape .gt. 1) + ! else if (naxis .lt. datarank) then + ! would be nice... else - write(*,*) "Given data reading parameters do not match output variable rank!" - stop 1 + write(*, *) "Given data reading parameters (",datarank,& + ") do not match variable rank (",& + naxis, ") of variable "//trim(var%getName())//"!" + stop 1 end if - + end function getReadDataShape function getDtypeFromString(dtype) - integer(i4) :: getDtypeFromString - character(*) :: dtype + integer(i4) :: getDtypeFromString + character(*) :: dtype select case(dtype) case("f32") - getDtypeFromString = NF90_FLOAT + getDtypeFromString = NF90_FLOAT case("f64") - getDtypeFromString = NF90_DOUBLE + getDtypeFromString = NF90_DOUBLE case("i8") - getDtypeFromString = NF90_BYTE + getDtypeFromString = NF90_BYTE case("i16") - getDtypeFromString = NF90_SHORT + getDtypeFromString = NF90_SHORT case("i32") - getDtypeFromString = NF90_INT + getDtypeFromString = NF90_INT case("i64") - getDtypeFromString = NF90_INT64 + getDtypeFromString = NF90_INT64 case default - write(*,*) "Datatype not understood: ", dtype - stop 1 + write(*, *) "Datatype not understood: ", dtype + stop 1 end select end function getDtypeFromString function getDtypeFromInteger(dtype) character(3) :: getDtypeFromInteger - integer(i4) :: dtype + integer(i4) :: dtype select case(dtype) case(NF90_FLOAT) - getDtypeFromInteger = "f32" + getDtypeFromInteger = "f32" case(NF90_DOUBLE) - getDtypeFromInteger = "f64" + getDtypeFromInteger = "f64" case(NF90_BYTE) - getDtypeFromInteger = "i8" + getDtypeFromInteger = "i8" case(NF90_SHORT) - getDtypeFromInteger = "i16" + getDtypeFromInteger = "i16" case(NF90_INT) - getDtypeFromInteger = "i32" + getDtypeFromInteger = "i32" case(NF90_INT64) - getDtypeFromInteger = "i64" + getDtypeFromInteger = "i64" case default - write(*,*) "Datatype not understood: ", dtype - stop 1 + write(*, *) "Datatype not understood: ", dtype + stop 1 end select end function getDtypeFromInteger subroutine check(status, msg) - integer(i4) , intent(in) :: status + integer(i4), intent(in) :: status character(*), intent(in) :: msg if (status .ne. NF90_NOERR) then - write(*,*) msg - write(*,*) nf90_strerror(status) - stop 1 + write(*, *) msg + write(*, *) nf90_strerror(status) + stop 1 end if end subroutine check diff --git a/src/lib/mo_nml.f90 b/src/lib/mo_nml.f90 index 42696b8d..0e0043e0 100644 --- a/src/lib/mo_nml.f90 +++ b/src/lib/mo_nml.f90 @@ -41,10 +41,10 @@ MODULE mo_nml ! Copyright 2001-2011 Luis Kornblueh, Matthias Cuntz - USE mo_kind, ONLY: i4 - USE mo_string_utils, ONLY: tolower - USE mo_message, ONLY: message, message_text - USE mo_finish, ONLY: finish + USE mo_kind, ONLY : i4 + USE mo_string_utils, ONLY : tolower + USE mo_message, ONLY : message, message_text + USE mo_finish, ONLY : finish IMPLICIT NONE @@ -58,16 +58,16 @@ MODULE mo_nml ! return values in optinal status of function 'position_nml' !> Information: file pointer set to namelist group - INTEGER(i4), PARAMETER :: POSITIONED = 0 + INTEGER(i4), PARAMETER :: POSITIONED = 0 !> Error: namelist group is missing - INTEGER(i4), PARAMETER :: MISSING = 1 + INTEGER(i4), PARAMETER :: MISSING = 1 !> Error: namelist group name too long - INTEGER(i4), PARAMETER :: LENGTH_ERROR = 2 + INTEGER(i4), PARAMETER :: LENGTH_ERROR = 2 !> Error occured during read of namelist file - INTEGER(i4), PARAMETER :: READ_ERROR = 3 + INTEGER(i4), PARAMETER :: READ_ERROR = 3 ! default namelist unit - INTEGER, SAVE :: nunitnml = -1 + INTEGER, SAVE :: nunitnml = -1 ! ------------------------------------------------------------------ @@ -83,7 +83,7 @@ MODULE mo_nml ! CALLING SEQUENCE ! call open_nml(file, unit, quiet=quiet) - + ! INTENT(IN) !> \param[in] "character(len=*) :: file" namelist filename !> \param[in] "integer :: unit" namelist unit @@ -119,28 +119,28 @@ MODULE mo_nml !> \author Matthias Cuntz - modified from Echam5, (C) MPI-MET, Hamburg, Germany !> \date Dec 2011 ! Modified, Matthias Cuntz, Jan 2013 - quiet=.true. default - ! Modified, Luis Samaniegi, Nov 2013 comparison statements == -> .eq., etc + ! Modified, Luis Samaniego, Nov 2013 comparison statements == -> .eq., etc SUBROUTINE open_nml(file, unit, quiet) IMPLICIT NONE - CHARACTER(len=*), INTENT(IN) :: file - INTEGER , INTENT(IN) :: unit - LOGICAL , INTENT(IN), OPTIONAL :: quiet + CHARACTER(len = *), INTENT(IN) :: file + INTEGER, INTENT(IN) :: unit + LOGICAL, INTENT(IN), OPTIONAL :: quiet INTEGER :: istat LOGICAL :: iquiet iquiet = .false. - if (present(quiet)) iquiet=quiet + if (present(quiet)) iquiet = quiet nunitnml = unit if (.not. iquiet) CALL message(' This is namelist ', trim(file)) - OPEN (nunitnml, file=file, iostat=istat, status='old', action='read', delim='apostrophe') + OPEN (nunitnml, file = file, iostat = istat, status = 'old', action = 'read', delim = 'apostrophe') IF (istat .ne. 0) THEN - write(message_text,'(A,A)') 'Could not open namelist file ', trim(file) - CALL finish('OPEN_NML',trim(message_text)) + write(message_text, '(A,A)') 'Could not open namelist file ', trim(file) + CALL finish('OPEN_NML', trim(message_text)) END IF END SUBROUTINE open_nml @@ -155,7 +155,7 @@ END SUBROUTINE open_nml ! CALLING SEQUENCE ! call close_nml(unit=unit) - + ! INTENT(IN) ! None @@ -202,12 +202,12 @@ SUBROUTINE close_nml(unit) nnml = nunitnml if (present(unit)) nnml = unit - - IF (nnml .lt. 0) CALL finish('CLOSE_NML','No namelist file opened.') - CLOSE(nnml, IOSTAT=istat) + IF (nnml .lt. 0) CALL finish('CLOSE_NML', 'No namelist file opened.') - IF (istat .ne. 0) CALL finish('CLOSE_NML','Could not close namelist file.') + CLOSE(nnml, IOSTAT = istat) + + IF (istat .ne. 0) CALL finish('CLOSE_NML', 'Could not close namelist file.') if (.not. present(unit)) nunitnml = -1 @@ -227,7 +227,7 @@ END SUBROUTINE close_nml ! CALLING SEQUENCE ! call position_nml(name, unit=unit, status=status, first=first) - + ! INTENT(IN) !> \param[in] "character(len=*) :: name" namelist name (case independent) @@ -273,95 +273,95 @@ SUBROUTINE position_nml(name, unit, status, first) IMPLICIT NONE - CHARACTER(len=*), INTENT(in) :: name ! namelist group name - INTEGER, INTENT(in), OPTIONAL :: unit ! file unit number - INTEGER(i4), INTENT(out), OPTIONAL :: status ! error return value - LOGICAL, INTENT(in), OPTIONAL :: first ! default: true - - CHARACTER(len=256) :: yline ! line read - CHARACTER(len=256) :: test ! uppercase namelist group name - INTEGER(i4) :: stat ! local copy of status variable - INTEGER :: ios ! status variable from read operation - LOGICAL :: lrew ! local copy of rewind flag - INTEGER(i4) :: iunit ! local copy of unit number - INTEGER(i4) :: len_name ! length of requested namelist group name - CHARACTER :: ytest ! character to test for delimiter - CHARACTER(len=12) :: code ! error code printed - INTEGER(i4) :: ind ! index from index routine - INTEGER(i4) :: indc ! index of comment character (!) - - lrew = .TRUE. - IF (PRESENT(first)) lrew = first - iunit = nunitnml - IF (PRESENT(unit)) iunit = unit - stat = MISSING - code = 'MISSING' + CHARACTER(len = *), INTENT(in) :: name ! namelist group name + INTEGER, INTENT(in), OPTIONAL :: unit ! file unit number + INTEGER(i4), INTENT(out), OPTIONAL :: status ! error return value + LOGICAL, INTENT(in), OPTIONAL :: first ! default: true + + CHARACTER(len = 256) :: yline ! line read + CHARACTER(len = 256) :: test ! uppercase namelist group name + INTEGER(i4) :: stat ! local copy of status variable + INTEGER :: ios ! status variable from read operation + LOGICAL :: lrew ! local copy of rewind flag + INTEGER(i4) :: iunit ! local copy of unit number + INTEGER(i4) :: len_name ! length of requested namelist group name + CHARACTER :: ytest ! character to test for delimiter + CHARACTER(len = 12) :: code ! error code printed + INTEGER(i4) :: ind ! index from index routine + INTEGER(i4) :: indc ! index of comment character (!) + + lrew = .TRUE. + IF (PRESENT(first)) lrew = first + iunit = nunitnml + IF (PRESENT(unit)) iunit = unit + stat = MISSING + code = 'MISSING' len_name = LEN_TRIM(name) - IF ( len_name .gt. LEN(test) ) THEN - stat = LENGTH_ERROR - code = 'LENGTH_ERROR' + IF (len_name .gt. LEN(test)) THEN + stat = LENGTH_ERROR + code = 'LENGTH_ERROR' END IF !test = '&'//tolower(name) - write(test,'(A,A)') '&', tolower(name) + write(test, '(A,A)') '&', tolower(name) ! Reposition file at beginning: IF (lrew) REWIND(iunit) ! Search start of namelist DO - IF (stat .ne. MISSING) EXIT + IF (stat .ne. MISSING) EXIT - yline = ' ' + yline = ' ' - READ (iunit,'(a)', IOSTAT=ios ) yline - IF (ios .lt. 0) THEN - EXIT ! MISSING - ELSE IF (ios .gt. 0) THEN - stat = READ_ERROR - code = 'READ_ERROR' - EXIT - END IF + READ (iunit, *, IOSTAT = ios) yline + IF (ios .lt. 0) THEN + EXIT ! MISSING + ELSE IF (ios .gt. 0) THEN + stat = READ_ERROR + code = 'READ_ERROR' + EXIT + END IF - yline = tolower(yline) + yline = tolower(yline) - ind = INDEX(yline,TRIM(test)) + ind = INDEX(yline, TRIM(test)) - IF (ind .eq. 0) CYCLE + IF (ind .eq. 0) CYCLE - indc = INDEX(yline,'!') + indc = INDEX(yline, '!') - IF (indc .gt. 0 .AND. indc .lt. ind) CYCLE + IF (indc .gt. 0 .AND. indc .lt. ind) CYCLE - ! test for delimiter - ytest = yline(ind+len_name+1:ind+len_name+1) + ! test for delimiter + ytest = yline(ind + len_name + 1 : ind + len_name + 1) - IF ( (LGE(ytest,'0') .AND. LLE(ytest,'9')) .OR. & - (LGE(ytest,'a') .AND. LLE(ytest,'z')) .OR. & - ytest .eq. '_' .OR. & - (LGE(ytest,'A') .AND. LLE(ytest,'Z'))) THEN - CYCLE - ELSE - stat = POSITIONED - BACKSPACE(iunit) - EXIT - END IF + IF ((LGE(ytest, '0') .AND. LLE(ytest, '9')) .OR. & + (LGE(ytest, 'a') .AND. LLE(ytest, 'z')) .OR. & + ytest .eq. '_' .OR. & + (LGE(ytest, 'A') .AND. LLE(ytest, 'Z'))) THEN + CYCLE + ELSE + stat = POSITIONED + BACKSPACE(iunit) + EXIT + END IF END DO IF (PRESENT(status)) status = stat SELECT CASE (stat) CASE (POSITIONED) - RETURN + RETURN CASE (MISSING) - IF (PRESENT(status)) RETURN + IF (PRESENT(status)) RETURN END SELECT ! Error if it reaches here !message_text = 'namelist /'//TRIM(name)//'/ '//code - write(message_text,'(A,A,A,A)') 'namelist /', trim(name), '/ ', trim(code) - CALL finish('POSITION_NML',message_text) + write(message_text, '(A,A,A,A)') 'namelist /', trim(name), '/ ', trim(code) + CALL finish('POSITION_NML', message_text) END SUBROUTINE position_nml diff --git a/src/lib/mo_optimization_utils.f90 b/src/lib/mo_optimization_utils.f90 new file mode 100644 index 00000000..fbd88b88 --- /dev/null +++ b/src/lib/mo_optimization_utils.f90 @@ -0,0 +1,35 @@ +module mo_optimization_utils + + use mo_kind, only : dp + + implicit none + + abstract interface + subroutine eval_interface(parameterset, runoff, sm_opti, basin_avg_tws, neutrons_opti, et_opti) + use mo_kind, only : dp + real(dp), dimension(:), intent(in) :: parameterset + real(dp), dimension(:, :), allocatable, optional, intent(out) :: runoff ! dim1=time dim2=gauge + real(dp), dimension(:, :), allocatable, optional, intent(out) :: sm_opti ! dim1=ncells, dim2=time + real(dp), dimension(:, :), allocatable, optional, intent(out) :: basin_avg_tws ! dim1=time dim2=nBasins + real(dp), dimension(:, :), allocatable, optional, intent(out) :: neutrons_opti ! dim1=ncells, dim2=time + real(dp), dimension(:, :), allocatable, optional, intent(out) :: et_opti ! dim1=ncells, dim2=time + end subroutine + end interface + + interface + function objective_interface (parameterset, eval, arg1, arg2, arg3) + use mo_kind, only : dp + import eval_interface + real(dp), intent (in) :: parameterset(:) + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), optional, intent(in) :: arg1 + real(dp), optional, intent(out) :: arg2 + real(dp), optional, intent(out) :: arg3 + + real(dp) :: objective_interface + end function objective_interface + end interface + +end module mo_optimization_utils + + diff --git a/src/lib/mo_orderpack.f90 b/src/lib/mo_orderpack.f90 index 01d359c8..a79388e4 100644 --- a/src/lib/mo_orderpack.f90 +++ b/src/lib/mo_orderpack.f90 @@ -4,7 +4,7 @@ !> \details This module is the Orderpack 2.0 from Michel Olagnon. !> It provides order and unconditional, unique, and partial - !> ranking, sorting, and permutation. +!> ranking, sorting, and permutation. !> \authors Michel Olagnon !> \date 2000-2012 @@ -36,8 +36,8 @@ MODULE mo_orderpack ! Copyright 2014 Matthias Cuntz - USE mo_kind, ONLY: i4, sp, dp - USE mo_utils, ONLY: ne, eq, le + USE mo_kind, ONLY : i4, sp, dp + USE mo_utils, ONLY : ne, eq, le IMPLICIT NONE @@ -68,18 +68,18 @@ MODULE mo_orderpack public :: valnth !> Unconditional ranking - !> + !> !> Subroutine MRGRNK (XVALT, IMULT) !> Ranks array XVALT into index array IRNGT, using merge-sort !> For performance reasons, the first 2 passes are taken out of the !> standard loop, and use dedicated coding. - !> + !> !> Subroutine MRGREF (XVALT, IRNGT) Ranks array XVALT into index array !> IRNGT, using merge-sort This version is not optimized for performance, !> and is thus not as difficult to read as the previous one. - !> + !> !> Partial ranking - !> + !> !> Subroutine RNKPAR (XVALT, IRNGT, NORD) Ranks partially XVALT by IRNGT, !> up to order NORD (refined for speed) This routine uses a pivoting !> strategy such as the one of finding the median based on the quicksort @@ -90,10 +90,10 @@ MODULE mo_orderpack !> on. It iterates until it can bring the number of values in ILOWT to !> exactly NORD, and then uses an insertion sort to rank this set, since !> it is supposedly small. - !> + !> !> Subroutine RAPKNR (XVALT, IRNGT, NORD) Same as RNKPAR, but in !> decreasing order (RAPKNR = RNKPAR spelt backwards). - !> + !> !> Subroutine REFPAR (XVALT, IRNGT, NORD) Ranks partially XVALT by IRNGT, !> up to order NORD This version is not optimized for performance, and is !> thus not as difficult to read as some other ones. It uses a pivoting @@ -102,7 +102,7 @@ MODULE mo_orderpack !> ranked indices of the values. It iterates until it can bring the !> number of values lower than the pivot to exactly NORD, and then uses !> an insertion sort to rank this set, since it is supposedly small. - !> + !> !> Subroutine RINPAR (XVALT, IRNGT, NORD) Ranks partially XVALT by IRNGT, !> up to order NORD This version is not optimized for performance, and is !> thus not as difficult to read as some other ones. It uses insertion @@ -110,7 +110,7 @@ MODULE mo_orderpack !> work array and is faster when NORD is very small (2-5), but worst case !> behavior (intially inverse sorted) can easily happen. In many cases, !> the refined quicksort method is faster. - !> + !> !> Integer Function INDNTH (XVALT, NORD) Returns the index of the NORDth !> value of XVALT (in increasing order) This routine uses a pivoting !> strategy such as the one of finding the median based on the quicksort @@ -121,7 +121,7 @@ MODULE mo_orderpack !> on. It iterates until it can bring the number of values in ILOWT to !> exactly NORD, and then takes out the original index of the maximum !> value in this set. - !> + !> !> Subroutine INDMED (XVALT, INDM) Returns the index of the median !> (((Size(XVALT)+1))/2th value) of XVALT This routine uses the recursive !> procedure described in Knuth, The Art of Computer Programming, vol. 3, @@ -129,18 +129,18 @@ MODULE mo_orderpack !> able to interpolate in the set as the one used in INDNTH. It also has !> better worst case behavior than INDNTH, but is about 10% slower in !> average for random uniformly distributed values. - !> + !> !> Note that in Orderpack 1.0, this routine was a Function procedure, and !> is now changed to a Subroutine. - !> + !> !> Unique ranking - !> + !> !> Subroutine UNIRNK (XVALT, IRNGT, NUNI) Ranks an array, removing !> duplicate entries (uses merge sort). The routine is similar to pure !> merge-sort ranking, but on the last pass, it discards indices that !> correspond to duplicate entries. For performance reasons, the first 2 !> passes are taken out of the standard loop, and use dedicated coding. - !> + !> !> Subroutine UNIPAR (XVALT, IRNGT, NORD) Ranks partially XVALT by IRNGT, !> up to order NORD at most, removing duplicate entries This routine uses !> a pivoting strategy such as the one of finding the median based on the @@ -153,22 +153,22 @@ MODULE mo_orderpack !> rank this set, since it is supposedly small. At all times, the NORD !> first values in ILOWT correspond to distinct values of the input !> array. - !> + !> !> Subroutine UNIINV (XVALT, IGOEST) Inverse ranking of an array, with !> removal of duplicate entries The routine is similar to pure merge-sort !> ranking, but on the last pass, it sets indices in IGOEST to the rank !> of the original value in an ordered set with duplicates removed. For !> performance reasons, the first 2 passes are taken out of the standard !> loop, and use dedicated coding. - !> + !> !> Subroutine MULCNT (XVALT, IMULT) Gives, for each array value, its !> multiplicity The number of times that a value appears in the array is !> computed by using inverse ranking, counting for each rank the number !> of values that ``collide'' to this rank, and returning this sum to the !> locations in the original set. Uses subroutine UNIINV. - !> + !> !> Random permutation: an interesting use of ranking - !> + !> !> A variation of the following problem was raised on the internet !> sci.math.num-analysis news group: Given an array, I would like to find !> a random permutation of this array that I could control with a @@ -176,7 +176,7 @@ MODULE mo_orderpack !> locations. The ``nearbyness'' parameter ranges from 0 to 1, with 0 !> such that no element moves from its initial location, and 1 such that !> the permutation is fully random. - !> + !> !> Subroutine CTRPER (XVALT, PCLS) Permute array XVALT randomly, but !> leaving elements close to their initial locations The routine takes !> the 1...size(XVALT) index array as real values, takes a combination of @@ -186,7 +186,7 @@ MODULE mo_orderpack !> random order is 1-PCLS / PCLS, thus when PCLS = 0, there is no change !> in the order whereas the new order is fully random when PCLS = 1. Uses !> subroutine MRGRNK. - !> + !> !> The above solution found another application when I was asked the !> following question: I am given two arrays, representing parents' !> incomes and their children's incomes, but I do not know which parents @@ -196,7 +196,7 @@ MODULE mo_orderpack !> these arrays so that the given correlation coefficient is attained, !> i.e. to reconstruct a realistic dataset, though very likely not to be !> the true one. - !> + !> !> Program GIVCOR Given two arrays of equal length of unordered values, !> find a "matching value" in the second array for each value in the !> first so that the global correlation coefficient reaches exactly a @@ -220,34 +220,34 @@ MODULE mo_orderpack !> correlation be desired, the program should be modified to start with !> one array in reverse order with respect to the other, i.e. coorelation !> as close to -1 as possible. - !> - !> + !> + !> !> Sorting - !> + !> !> Full sorting - !> + !> !> Subroutine INSSOR (XVALT) Sorts XVALT into increasing order (Insertion !> sort) This subroutine uses insertion sort. It does not use any work !> array and is faster when XVALT is of very small size (< 20), or !> already almost sorted, but worst case behavior (intially inverse !> sorted) can easily happen. In most cases, the quicksort or merge sort !> method is faster. - !> + !> !> Subroutine REFSOR (XVALT) Sorts XVALT into increasing order (Quick !> sort) This version is not optimized for performance, and is thus not !> as difficult to read as some other ones. This subroutine uses !> quicksort in a recursive implementation, and insertion sort for the !> last steps with small subsets. It does not use any work array - !> + !> !> Partial sorting - !> + !> !> Subroutine INSPAR (XVALT, NORD) Sorts partially XVALT, bringing the !> NORD lowest values at the begining of the array. This subroutine uses !> insertion sort, limiting insertion to the first NORD values. It does !> not use any work array and is faster when NORD is very small (2-5), !> but worst case behavior can happen fairly probably (initially inverse !> sorted). In many cases, the refined quicksort method is faster. - !> + !> !> Function FNDNTH (XVALT, NORD) Finds out and returns the NORDth value !> in XVALT (ascending order) This subroutine uses insertion sort, !> limiting insertion to the first NORD values, and even less when one @@ -257,10 +257,10 @@ MODULE mo_orderpack !> (initially inverse sorted). In many cases, the refined quicksort !> method implemented by VALNTH / INDNTH is faster, though much more !> difficult to read and understand. - !> + !> !> Function VALNTH (XVALT, NORD) Finds out and returns the NORDth value !> in XVALT (ascending order) This subroutine simply calls INDNTH. - !> + !> !> Function VALMED (XVALT) Finds out and returns the median !> (((Size(XVALT)+1))/2th value) of XVALT This routine uses the recursive !> procedure described in Knuth, The Art of Computer Programming, vol. 3, @@ -268,13 +268,13 @@ MODULE mo_orderpack !> able to interpolate in the set as the one used in VALNTH/INDNTH. It !> also has better worst case behavior than VALNTH/INDNTH, and is about !> 20% faster in average for random uniformly distributed values. - !> + !> !> Function OMEDIAN (XVALT) It is a modified version of VALMED that !> provides the average between the two middle values in the case !> Size(XVALT) is even. - !> + !> !> Unique sorting - !> + !> !> Subroutine UNISTA (XVALT, NUNI) Removes duplicates from an array This !> subroutine uses merge sort unique inverse ranking. It leaves in the !> initial set only those entries that are unique, packing the array, and @@ -282,77 +282,77 @@ MODULE mo_orderpack ! aliases/wrapper interface sort - module procedure d_refsor, r_refsor, i_refsor + module procedure d_refsor, r_refsor, i_refsor end interface sort interface sort_index - module procedure sort_index_dp, sort_index_sp, sort_index_i4 + module procedure sort_index_dp, sort_index_sp, sort_index_i4 end interface sort_index - + interface ctrper - module procedure d_ctrper, r_ctrper, i_ctrper + module procedure d_ctrper, r_ctrper, i_ctrper end interface ctrper interface fndnth - module procedure d_fndnth, r_fndnth, i_fndnth + module procedure d_fndnth, r_fndnth, i_fndnth end interface fndnth interface indmed - module procedure d_indmed, r_indmed, i_indmed + module procedure d_indmed, r_indmed, i_indmed end interface indmed interface indnth - module procedure d_indnth, r_indnth, i_indnth + module procedure d_indnth, r_indnth, i_indnth end interface indnth interface inspar - module procedure d_inspar, r_inspar, i_inspar + module procedure d_inspar, r_inspar, i_inspar end interface inspar interface inssor - module procedure d_inssor, r_inssor, i_inssor + module procedure d_inssor, r_inssor, i_inssor end interface inssor interface omedian - module procedure d_median, r_median, i_median + module procedure d_median, r_median, i_median end interface omedian interface mrgref - module procedure d_mrgref, r_mrgref, i_mrgref + module procedure d_mrgref, r_mrgref, i_mrgref end interface mrgref interface mrgrnk - module procedure D_mrgrnk, R_mrgrnk, I_mrgrnk + module procedure D_mrgrnk, R_mrgrnk, I_mrgrnk end interface mrgrnk interface mulcnt - module procedure d_mulcnt, r_mulcnt, i_mulcnt + module procedure d_mulcnt, r_mulcnt, i_mulcnt end interface mulcnt interface rapknr - module procedure d_rapknr, r_rapknr, i_rapknr + module procedure d_rapknr, r_rapknr, i_rapknr end interface rapknr interface refpar - module procedure d_refpar, r_refpar, i_refpar + module procedure d_refpar, r_refpar, i_refpar end interface refpar interface refsor - module procedure d_refsor, r_refsor, i_refsor + module procedure d_refsor, r_refsor, i_refsor end interface refsor interface rinpar - module procedure d_rinpar, r_rinpar, i_rinpar + module procedure d_rinpar, r_rinpar, i_rinpar end interface rinpar interface rnkpar - module procedure d_rnkpar, r_rnkpar, i_rnkpar + module procedure d_rnkpar, r_rnkpar, i_rnkpar end interface rnkpar interface uniinv - module procedure d_uniinv, r_uniinv, i_uniinv + module procedure d_uniinv, r_uniinv, i_uniinv end interface uniinv interface nearless - module procedure D_nearless, R_nearless, I_nearless + module procedure D_nearless, R_nearless, I_nearless end interface nearless interface unipar - module procedure d_unipar, r_unipar, i_unipar + module procedure d_unipar, r_unipar, i_unipar end interface unipar interface unirnk - module procedure D_unirnk, R_unirnk, I_unirnk + module procedure D_unirnk, R_unirnk, I_unirnk end interface unirnk interface unista - module procedure d_unista, r_unista, i_unista + module procedure d_unista, r_unista, i_unista end interface unista interface valmed - module procedure d_valmed, r_valmed, i_valmed + module procedure d_valmed, r_valmed, i_valmed end interface valmed interface valnth - module procedure d_valnth, r_valnth, i_valnth + module procedure d_valnth, r_valnth, i_valnth end interface valnth private :: R_ctrper, I_ctrper, D_ctrper @@ -382,7 +382,7 @@ MODULE mo_orderpack PRIVATE - Integer(kind=i4), Allocatable, Dimension(:), Save :: IDONT + Integer(kind = i4), Allocatable, Dimension(:), Save :: IDONT CONTAINS @@ -392,8 +392,8 @@ FUNCTION sort_index_dp(arr) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: arr - INTEGER(i4), DIMENSION(size(arr)) :: sort_index_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: arr + INTEGER(i4), DIMENSION(size(arr)) :: sort_index_dp call mrgrnk(arr, sort_index_dp) @@ -403,8 +403,8 @@ FUNCTION sort_index_sp(arr) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: arr - INTEGER(i4), DIMENSION(size(arr)) :: sort_index_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: arr + INTEGER(i4), DIMENSION(size(arr)) :: sort_index_sp call mrgrnk(arr, sort_index_sp) @@ -415,7 +415,7 @@ FUNCTION sort_index_i4(arr) IMPLICIT NONE integer(i4), DIMENSION(:), INTENT(IN) :: arr - INTEGER(i4), DIMENSION(size(arr)) :: sort_index_i4 + INTEGER(i4), DIMENSION(size(arr)) :: sort_index_i4 call mrgrnk(arr, sort_index_i4) @@ -438,21 +438,21 @@ Subroutine D_ctrper (XDONT, PCLS) ! Michel Olagnon - May 2000. ! _________________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (InOut) :: XDONT - Real(kind=dp), Intent (In) :: PCLS + real(kind = dp), Dimension (:), Intent (InOut) :: XDONT + Real(kind = dp), Intent (In) :: PCLS ! __________________________________________________________ ! - Real(kind=dp), Dimension (Size(XDONT)) :: XINDT - Integer(kind=i4), Dimension (Size(XDONT)) :: JWRKT - Real(kind=dp) :: PWRK - Integer(kind=i4) :: I - Real(kind=dp), Dimension (Size(XDONT)) :: II + Real(kind = dp), Dimension (Size(XDONT)) :: XINDT + Integer(kind = i4), Dimension (Size(XDONT)) :: JWRKT + Real(kind = dp) :: PWRK + Integer(kind = i4) :: I + Real(kind = dp), Dimension (Size(XDONT)) :: II ! Call Random_number (XINDT(:)) PWRK = Min (Max (0.0_dp, PCLS), 1.0_dp) - XINDT = Real(Size(XDONT),dp) * XINDT - forall(I=1:size(XDONT)) II(I) = real(I,dp) ! for gnu compiler to be initialised - XINDT = PWRK*XINDT + (1.0_dp-PWRK)*II + XINDT = Real(Size(XDONT), dp) * XINDT + forall(I = 1 : size(XDONT)) II(I) = real(I, dp) ! for gnu compiler to be initialised + XINDT = PWRK * XINDT + (1.0_dp - PWRK) * II Call MRGRNK (XINDT, JWRKT) XDONT = XDONT (JWRKT) ! @@ -472,21 +472,21 @@ Subroutine R_ctrper (XDONT, PCLS) ! Michel Olagnon - May 2000. ! _________________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (InOut) :: XDONT - Real(kind=sp), Intent (In) :: PCLS + Real(kind = sp), Dimension (:), Intent (InOut) :: XDONT + Real(kind = sp), Intent (In) :: PCLS ! __________________________________________________________ ! - Real(kind=sp), Dimension (Size(XDONT)) :: XINDT - Integer(kind=i4), Dimension (Size(XDONT)) :: JWRKT - Real(kind=sp) :: PWRK - Integer(kind=i4) :: I - Real(kind=sp), Dimension (Size(XDONT)) :: II + Real(kind = sp), Dimension (Size(XDONT)) :: XINDT + Integer(kind = i4), Dimension (Size(XDONT)) :: JWRKT + Real(kind = sp) :: PWRK + Integer(kind = i4) :: I + Real(kind = sp), Dimension (Size(XDONT)) :: II ! Call Random_number (XINDT(:)) PWRK = Min (Max (0.0, PCLS), 1.0) - XINDT = Real(Size(XDONT),sp) * XINDT - forall(I=1:size(XDONT)) II(I) = real(I,sp) ! for gnu compiler to be initialised - XINDT = PWRK*XINDT + (1.0-PWRK)*II + XINDT = Real(Size(XDONT), sp) * XINDT + forall(I = 1 : size(XDONT)) II(I) = real(I, sp) ! for gnu compiler to be initialised + XINDT = PWRK * XINDT + (1.0 - PWRK) * II Call MRGRNK (XINDT, JWRKT) XDONT = XDONT (JWRKT) ! @@ -506,21 +506,21 @@ Subroutine I_ctrper (XDONT, PCLS) ! Michel Olagnon - May 2000. ! _________________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (InOut) :: XDONT - Real(kind=sp), Intent (In) :: PCLS + Integer(kind = i4), Dimension (:), Intent (InOut) :: XDONT + Real(kind = sp), Intent (In) :: PCLS ! __________________________________________________________ ! - Real(kind=sp), Dimension (Size(XDONT)) :: XINDT - Integer(kind=i4), Dimension (Size(XDONT)) :: JWRKT - Real(kind=sp) :: PWRK - Integer(kind=i4) :: I - Real(kind=sp), Dimension (Size(XDONT)) :: II + Real(kind = sp), Dimension (Size(XDONT)) :: XINDT + Integer(kind = i4), Dimension (Size(XDONT)) :: JWRKT + Real(kind = sp) :: PWRK + Integer(kind = i4) :: I + Real(kind = sp), Dimension (Size(XDONT)) :: II ! Call Random_number (XINDT(:)) PWRK = Min (Max (0.0, PCLS), 1.0) - XINDT = Real(Size(XDONT),sp) * XINDT - forall(I=1:size(XDONT)) II(I) = real(I,sp) ! for gnu compiler to be initialised - XINDT = PWRK*XINDT + (1.0-PWRK)*II + XINDT = Real(Size(XDONT), sp) * XINDT + forall(I = 1 : size(XDONT)) II(I) = real(I, sp) ! for gnu compiler to be initialised + XINDT = PWRK * XINDT + (1.0 - PWRK) * II Call MRGRNK(XINDT, JWRKT) XDONT = XDONT(JWRKT) ! @@ -537,40 +537,40 @@ Function D_fndnth (XDONT, NORD) Result (FNDNTH) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(Kind=dp), Dimension (:), Intent (In) :: XDONT - real(Kind=dp) :: FNDNTH - Integer(kind=i4), Intent (In) :: NORD + real(Kind = dp), Dimension (:), Intent (In) :: XDONT + real(Kind = dp) :: FNDNTH + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(Kind=dp), Dimension (NORD) :: XWRKT - real(Kind=dp) :: XWRK, XWRK1 + real(Kind = dp), Dimension (NORD) :: XWRKT + real(Kind = dp) :: XWRK, XWRK1 ! ! - Integer(kind=i4) :: ICRS, IDCR, ILOW, NDON + Integer(kind = i4) :: ICRS, IDCR, ILOW, NDON ! XWRKT (1) = XDONT (1) Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK End Do ! NDON = SIZE (XDONT) XWRK1 = XWRKT (NORD) - ILOW = 2*NORD - NDON + ILOW = 2 * NORD - NDON Do ICRS = NORD + 1, NDON - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - Do IDCR = NORD - 1, MAX (1, ILOW) , - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(NORD) - End If - ILOW = ILOW + 1 + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + Do IDCR = NORD - 1, MAX (1, ILOW), - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(NORD) + End If + ILOW = ILOW + 1 End Do FNDNTH = XWRK1 @@ -588,40 +588,40 @@ Function R_fndnth (XDONT, NORD) Result (FNDNTH) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Real(kind=sp) :: FNDNTH - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Real(kind = sp) :: FNDNTH + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp), Dimension (NORD) :: XWRKT - Real(kind=sp) :: XWRK, XWRK1 + Real(kind = sp), Dimension (NORD) :: XWRKT + Real(kind = sp) :: XWRK, XWRK1 ! ! - Integer(kind=i4) :: ICRS, IDCR, ILOW, NDON + Integer(kind = i4) :: ICRS, IDCR, ILOW, NDON ! XWRKT (1) = XDONT (1) Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK End Do ! NDON = SIZE (XDONT) XWRK1 = XWRKT (NORD) - ILOW = 2*NORD - NDON + ILOW = 2 * NORD - NDON Do ICRS = NORD + 1, NDON - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - Do IDCR = NORD - 1, MAX (1, ILOW) , - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(NORD) - End If - ILOW = ILOW + 1 + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + Do IDCR = NORD - 1, MAX (1, ILOW), - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(NORD) + End If + ILOW = ILOW + 1 End Do FNDNTH = XWRK1 @@ -639,40 +639,40 @@ Function I_fndnth (XDONT, NORD) Result (FNDNTH) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: fndnth - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: fndnth + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4), Dimension (NORD) :: XWRKT - Integer(kind=i4) :: XWRK, XWRK1 + Integer(kind = i4), Dimension (NORD) :: XWRKT + Integer(kind = i4) :: XWRK, XWRK1 ! ! - Integer(kind=i4) :: ICRS, IDCR, ILOW, NDON + Integer(kind = i4) :: ICRS, IDCR, ILOW, NDON ! XWRKT (1) = XDONT (1) Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK End Do ! NDON = SIZE (XDONT) XWRK1 = XWRKT (NORD) - ILOW = 2*NORD - NDON + ILOW = 2 * NORD - NDON Do ICRS = NORD + 1, NDON - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - Do IDCR = NORD - 1, MAX (1, ILOW) , - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(NORD) - End If - ILOW = ILOW + 1 + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + Do IDCR = NORD - 1, MAX (1, ILOW), - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(NORD) + End If + ILOW = ILOW + 1 End Do FNDNTH = XWRK1 @@ -682,14 +682,14 @@ End Function I_fndnth Subroutine D_indmed (XDONT, INDM) ! Returns index of median value of XDONT. ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Intent (Out) :: INDM + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Intent (Out) :: INDM ! __________________________________________________________ - Integer(kind=i4) :: IDON + Integer(kind = i4) :: IDON ! Allocate (IDONT (SIZE(XDONT))) Do IDON = 1, SIZE(XDONT) - IDONT (IDON) = IDON + IDONT (IDON) = IDON End Do ! Call d_med (XDONT, IDONT, INDM) @@ -706,83 +706,83 @@ Recursive Subroutine d_med (XDATT, IDATT, ires_med) ! case behavior than INDNTH, but is about 30% slower in ! average for random uniformly distributed values. ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDATT - Integer(kind=i4), Dimension (:), Intent (In) :: IDATT - Integer(kind=i4), Intent (Out):: ires_med + real(kind = dp), Dimension (:), Intent (In) :: XDATT + Integer(kind = i4), Dimension (:), Intent (In) :: IDATT + Integer(kind = i4), Intent (Out) :: ires_med ! __________________________________________________________ ! - real(kind=dp), Parameter :: XHUGE = HUGE (XDATT) - real(kind=dp) :: XWRK, XWRK1, XMED7, XMAX, XMIN + real(kind = dp), Parameter :: XHUGE = HUGE (XDATT) + real(kind = dp) :: XWRK, XWRK1, XMED7, XMAX, XMIN ! - Integer(kind=i4), Dimension (7*(((Size (IDATT)+6)/7+6)/7)) :: ISTRT, IENDT, IMEDT - Integer(kind=i4), Dimension (7*((Size(IDATT)+6)/7)) :: IWRKT - Integer(kind=i4) :: NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 - Integer(kind=i4) :: IDEB, ITMP, IDCR, ICRS, ICRS1, ICRS2, IMAX, IMIN - Integer(kind=i4) :: IWRK, IWRK1, IMED1, IMED7, NDAT + Integer(kind = i4), Dimension (7 * (((Size (IDATT) + 6) / 7 + 6) / 7)) :: ISTRT, IENDT, IMEDT + Integer(kind = i4), Dimension (7 * ((Size(IDATT) + 6) / 7)) :: IWRKT + Integer(kind = i4) :: NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 + Integer(kind = i4) :: IDEB, ITMP, IDCR, ICRS, ICRS1, ICRS2, IMAX, IMIN + Integer(kind = i4) :: IWRK, IWRK1, IMED1, IMED7, NDAT ! NDAT = Size (IDATT) - NMED = (NDAT+1) / 2 + NMED = (NDAT + 1) / 2 IWRKT = IDATT ! ! If the number of values is small, then use insertion sort ! If (NDAT < 35) Then - ! - ! Bring minimum to first location to save test in decreasing loop - ! - IDCR = NDAT - If (XDATT (IWRKT (1)) < XDATT (IWRKT (IDCR))) Then - IWRK = IWRKT (1) - Else - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT (1) - end if - XWRK = XDATT (IWRK) - Do ITMP = 1, NDAT - 2 + ! + ! Bring minimum to first location to save test in decreasing loop + ! + IDCR = NDAT + If (XDATT (IWRKT (1)) < XDATT (IWRKT (IDCR))) Then + IWRK = IWRKT (1) + Else + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT (1) + end if + XWRK = XDATT (IWRK) + Do ITMP = 1, NDAT - 2 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR) + XWRK1 = XDATT (IWRK1) + If (XWRK1 < XWRK) Then + IWRKT (IDCR) = IWRK + XWRK = XWRK1 + IWRK = IWRK1 + end if + End Do + IWRKT (1) = IWRK + ! + ! Sort the first half, until we have NMED sorted values + ! + Do ICRS = 3, NMED + XWRK = XDATT (IWRKT (ICRS)) + IWRK = IWRKT (ICRS) + IDCR = ICRS - 1 + Do + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR) - XWRK1 = XDATT (IWRK1) - If (XWRK1 < XWRK) Then - IWRKT (IDCR) = IWRK - XWRK = XWRK1 - IWRK = IWRK1 - end if - End Do - IWRKT (1) = IWRK - ! - ! Sort the first half, until we have NMED sorted values - ! - Do ICRS = 3, NMED - XWRK = XDATT (IWRKT (ICRS)) - IWRK = IWRKT (ICRS) - IDCR = ICRS - 1 + End Do + IWRKT (IDCR + 1) = IWRK + End Do + ! + ! Insert any value less than the current median in the first half + ! + XWRK1 = XDATT (IWRKT (NMED)) + Do ICRS = NMED + 1, NDAT + XWRK = XDATT (IWRKT (ICRS)) + IWRK = IWRKT (ICRS) + If (XWRK < XWRK1) Then + IDCR = NMED - 1 Do - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - IDCR = IDCR - 1 - End Do - IWRKT (IDCR+1) = IWRK - End Do - ! - ! Insert any value less than the current median in the first half - ! - XWRK1 = XDATT (IWRKT (NMED)) - Do ICRS = NMED+1, NDAT - XWRK = XDATT (IWRKT (ICRS)) - IWRK = IWRKT (ICRS) - If (XWRK < XWRK1) Then - IDCR = NMED - 1 - Do - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - IDCR = IDCR - 1 - End Do - IWRKT (IDCR+1) = IWRK - XWRK1 = XDATT (IWRKT (NMED)) - End If - End Do - ires_med = IWRKT (NMED) - Return + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + IDCR = IDCR - 1 + End Do + IWRKT (IDCR + 1) = IWRK + XWRK1 = XDATT (IWRKT (NMED)) + End If + End Do + ires_med = IWRKT (NMED) + Return End If ! ! Make sorted subsets of 7 elements @@ -795,108 +795,108 @@ Recursive Subroutine d_med (XDATT, IDATT, ires_med) IMIN = 1 XMAX = XDATT (IWRKT(IMAX)) XMIN = XDATT (IWRKT(IMIN)) - DO IDEB = 1, NDAT-6, 7 - IDCR = IDEB + 6 - If (XDATT (IWRKT(IDEB)) < XDATT (IWRKT(IDCR))) Then - IWRK = IWRKT(IDEB) - Else - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT(IDEB) - end if - XWRK = XDATT (IWRK) - Do ITMP = 1, 5 - IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR) + DO IDEB = 1, NDAT - 6, 7 + IDCR = IDEB + 6 + If (XDATT (IWRKT(IDEB)) < XDATT (IWRKT(IDCR))) Then + IWRK = IWRKT(IDEB) + Else + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT(IDEB) + end if + XWRK = XDATT (IWRK) + Do ITMP = 1, 5 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR) + XWRK1 = XDATT (IWRK1) + If (XWRK1 < XWRK) Then + IWRKT (IDCR) = IWRK + IWRK = IWRK1 + XWRK = XWRK1 + end if + End Do + IWRKT (IDEB) = IWRK + If (XWRK < XMIN) Then + IMIN = IWRK + XMIN = XWRK + End If + Do ICRS = IDEB + 1, IDEB + 5 + IWRK = IWRKT (ICRS + 1) + XWRK = XDATT (IWRK) + IDON = IWRKT(ICRS) + If (XWRK < XDATT(IDON)) Then + IWRKT (ICRS + 1) = IDON + IDCR = ICRS + IWRK1 = IWRKT (IDCR - 1) XWRK1 = XDATT (IWRK1) - If (XWRK1 < XWRK) Then - IWRKT (IDCR) = IWRK - IWRK = IWRK1 - XWRK = XWRK1 - end if - End Do - IWRKT (IDEB) = IWRK - If (XWRK < XMIN) Then - IMIN = IWRK - XMIN = XWRK - End If - Do ICRS = IDEB+1, IDEB+5 - IWRK = IWRKT (ICRS+1) - XWRK = XDATT (IWRK) - IDON = IWRKT(ICRS) - If (XWRK < XDATT(IDON)) Then - IWRKT (ICRS+1) = IDON - IDCR = ICRS - IWRK1 = IWRKT (IDCR-1) - XWRK1 = XDATT (IWRK1) - Do - If (XWRK >= XWRK1) Exit - IWRKT (IDCR) = IWRK1 - IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR-1) - XWRK1 = XDATT (IWRK1) - End Do - IWRKT (IDCR) = IWRK - end if - End Do - If (XWRK > XMAX) Then - IMAX = IWRK - XMAX = XWRK - End If + Do + If (XWRK >= XWRK1) Exit + IWRKT (IDCR) = IWRK1 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR - 1) + XWRK1 = XDATT (IWRK1) + End Do + IWRKT (IDCR) = IWRK + end if + End Do + If (XWRK > XMAX) Then + IMAX = IWRK + XMAX = XWRK + End If End Do ! ! Add-up alternatively MAX and MIN values to make the number of data ! an exact multiple of 7. ! - IDEB = 7 * (NDAT/7) + IDEB = 7 * (NDAT / 7) NTRI = NDAT If (IDEB < NDAT) Then - ! - Do ICRS = IDEB+1, NDAT - XWRK1 = XDATT (IWRKT (ICRS)) - IF (XWRK1 > XMAX) Then - IMAX = IWRKT (ICRS) - XMAX = XWRK1 - End If - IF (XWRK1 < XMIN) Then - IMIN = IWRKT (ICRS) - XMIN = XWRK1 - End If - End Do - IWRK1 = IMAX - Do ICRS = NDAT+1, IDEB+7 - IWRKT (ICRS) = IWRK1 - If (IWRK1 == IMAX) Then - IWRK1 = IMIN - Else - NMED = NMED + 1 - IWRK1 = IMAX - End If - End Do - ! - Do ICRS = IDEB+2, IDEB+7 - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS - 1, IDEB+1, - 1 - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - End Do - ! - NTRI = IDEB+7 + ! + Do ICRS = IDEB + 1, NDAT + XWRK1 = XDATT (IWRKT (ICRS)) + IF (XWRK1 > XMAX) Then + IMAX = IWRKT (ICRS) + XMAX = XWRK1 + End If + IF (XWRK1 < XMIN) Then + IMIN = IWRKT (ICRS) + XMIN = XWRK1 + End If + End Do + IWRK1 = IMAX + Do ICRS = NDAT + 1, IDEB + 7 + IWRKT (ICRS) = IWRK1 + If (IWRK1 == IMAX) Then + IWRK1 = IMIN + Else + NMED = NMED + 1 + IWRK1 = IMAX + End If + End Do + ! + Do ICRS = IDEB + 2, IDEB + 7 + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + Do IDCR = ICRS - 1, IDEB + 1, - 1 + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + End Do + ! + NTRI = IDEB + 7 End If ! ! Make the set of the indices of median values of each sorted subset ! IDON1 = 0 Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - IMEDT (IDON1) = IWRKT (IDON + 3) + IDON1 = IDON1 + 1 + IMEDT (IDON1) = IWRKT (IDON + 3) End Do ! ! Find XMED7, the median of the medians ! - Call d_med (XDATT, IMEDT(1:IDON1), IMED7) + Call d_med (XDATT, IMEDT(1 : IDON1), IMED7) XMED7 = XDATT (IMED7) ! ! Count how many values are not higher than (and how many equal to) XMED7 @@ -912,54 +912,54 @@ Recursive Subroutine d_med (XDATT, IDATT, ires_med) NLEQ = 0 NEQU = 0 Do IDON = 1, NTRI, 7 - IMED = IDON+3 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 2 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 1 - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 1 - end if - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 2 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 1 - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 1 - end if - end if - If (XDATT (IWRKT (IMED)) > XMED7) Then - NLEQ = NLEQ + IMED - IDON - IENDT (IDON1) = IMED - 1 - ISTRT (IDON1) = IMED - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - NLEQ = NLEQ + IMED - IDON + 1 - IENDT (IDON1) = IMED - ISTRT (IDON1) = IMED + 1 - Else ! If (XDATT (IWRKT (IMED)) == XMED7) - NLEQ = NLEQ + IMED - IDON + 1 - NEQU = NEQU + 1 - IENDT (IDON1) = IMED - 1 - Do IMED1 = IMED - 1, IDON, -1 - If (eq(XDATT (IWRKT (IMED1)) , XMED7)) Then - NEQU = NEQU + 1 - IENDT (IDON1) = IMED1 - 1 - Else - Exit - End If - End Do - ISTRT (IDON1) = IMED + 1 - Do IMED1 = IMED + 1, IDON + 6 - If (eq(XDATT (IWRKT (IMED1)) , XMED7)) Then - NEQU = NEQU + 1 - NLEQ = NLEQ + 1 - ISTRT (IDON1) = IMED1 + 1 - Else - Exit - End If - End Do - end if - IDON1 = IDON1 + 1 + IMED = IDON + 3 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 2 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 1 + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 1 + end if + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 2 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 1 + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 1 + end if + end if + If (XDATT (IWRKT (IMED)) > XMED7) Then + NLEQ = NLEQ + IMED - IDON + IENDT (IDON1) = IMED - 1 + ISTRT (IDON1) = IMED + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + NLEQ = NLEQ + IMED - IDON + 1 + IENDT (IDON1) = IMED + ISTRT (IDON1) = IMED + 1 + Else ! If (XDATT (IWRKT (IMED)) == XMED7) + NLEQ = NLEQ + IMED - IDON + 1 + NEQU = NEQU + 1 + IENDT (IDON1) = IMED - 1 + Do IMED1 = IMED - 1, IDON, -1 + If (eq(XDATT (IWRKT (IMED1)), XMED7)) Then + NEQU = NEQU + 1 + IENDT (IDON1) = IMED1 - 1 + Else + Exit + End If + End Do + ISTRT (IDON1) = IMED + 1 + Do IMED1 = IMED + 1, IDON + 6 + If (eq(XDATT (IWRKT (IMED1)), XMED7)) Then + NEQU = NEQU + 1 + NLEQ = NLEQ + 1 + ISTRT (IDON1) = IMED1 + 1 + Else + Exit + End If + End Do + end if + IDON1 = IDON1 + 1 End Do ! ! Carry out a partial insertion sort to find the Kth smallest of the @@ -968,111 +968,111 @@ Recursive Subroutine d_med (XDATT, IDATT, ires_med) ! ! If (NLEQ - NEQU + 1 <= NMED) Then - If (NLEQ < NMED) Then ! Not enough low values - IWRK1 = IMAX - XWRK1 = XDATT (IWRK1) - NORD = NMED - NLEQ - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - IDCR = 0 - Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - If (ICRS2 < NORD) Then - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XDATT (IWRKT (ICRS)) < XWRK1) Then - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XDATT (IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - Else - If (ICRS2 < NORD) Then - IWRKT (ICRS1) = IWRKT (ICRS) - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - end if - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XDATT (IWRKT (ICRS)) >= XWRK1) Exit - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XDATT (IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - End Do - End If - End Do - ires_med = IWRK1 - Return - Else - ires_med = IMED7 - Return - End If - Else ! If (NLEQ > NMED) - ! Not enough high values - XWRK1 = -XHUGE - NORD = NLEQ - NEQU - NMED + 1 - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - Do IDON = 1, NTRI, 7 + If (NLEQ < NMED) Then ! Not enough low values + IWRK1 = IMAX + XWRK1 = XDATT (IWRK1) + NORD = NMED - NLEQ + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + IDCR = 0 + Do IDON = 1, NTRI, 7 IDON1 = IDON1 + 1 If (ICRS2 < NORD) Then - ! - Do ICRS = IDON, IENDT (IDON1) - If (XDATT(IWRKT (ICRS)) > XWRK1) Then - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XDATT(IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT(ICRS1) - XWRK1 = XDATT(IWRK1) - Else - If (ICRS2 < NORD) Then - IWRKT (ICRS1) = IWRKT (ICRS) - IWRK1 = IWRKT(ICRS1) - XWRK1 = XDATT(IWRK1) - End If - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = IENDT (IDON1), IDON, -1 - If (XDATT(IWRKT (ICRS)) <= XWRK1) Exit + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XDATT (IWRKT (ICRS)) < XWRK1) Then IWRK = IWRKT (ICRS) XWRK = XDATT (IWRK) - IDCR = ICRS1 - 1 Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XDATT(IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) + If (XWRK >= XDATT (IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) End Do - IWRKT (IDCR+1) = IWRK + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + Else + If (ICRS2 < NORD) Then + IWRKT (ICRS1) = IWRKT (ICRS) + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + end if + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XDATT (IWRKT (ICRS)) >= XWRK1) Exit + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XDATT (IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + End Do + End If + End Do + ires_med = IWRK1 + Return + Else + ires_med = IMED7 + Return + End If + Else ! If (NLEQ > NMED) + ! Not enough high values + XWRK1 = -XHUGE + NORD = NLEQ - NEQU - NMED + 1 + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + Do IDON = 1, NTRI, 7 + IDON1 = IDON1 + 1 + If (ICRS2 < NORD) Then + ! + Do ICRS = IDON, IENDT (IDON1) + If (XDATT(IWRKT (ICRS)) > XWRK1) Then + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XDATT(IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT(ICRS1) + XWRK1 = XDATT(IWRK1) + Else + If (ICRS2 < NORD) Then + IWRKT (ICRS1) = IWRKT (ICRS) IWRK1 = IWRKT(ICRS1) XWRK1 = XDATT(IWRK1) - End Do - end if - End Do - ! - ires_med = IWRK1 - Return + End If + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = IENDT (IDON1), IDON, -1 + If (XDATT(IWRKT (ICRS)) <= XWRK1) Exit + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XDATT(IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT(ICRS1) + XWRK1 = XDATT(IWRK1) + End Do + end if + End Do + ! + ires_med = IWRK1 + Return End If ! END Subroutine d_med @@ -1080,14 +1080,14 @@ END Subroutine d_med Subroutine R_indmed (XDONT, INDM) ! Returns index of median value of XDONT. ! __________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Intent (Out) :: INDM + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Intent (Out) :: INDM ! __________________________________________________________ - Integer(kind=i4) :: IDON + Integer(kind = i4) :: IDON ! Allocate (IDONT (SIZE(XDONT))) Do IDON = 1, SIZE(XDONT) - IDONT (IDON) = IDON + IDONT (IDON) = IDON End Do ! Call r_med (XDONT, IDONT, INDM) @@ -1104,83 +1104,83 @@ Recursive Subroutine r_med (XDATT, IDATT, ires_med) ! case behavior than INDNTH, but is about 30% slower in ! average for random uniformly distributed values. ! __________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDATT - Integer(kind=i4), Dimension (:), Intent (In) :: IDATT - Integer(kind=i4), Intent (Out) :: ires_med + Real(kind = sp), Dimension (:), Intent (In) :: XDATT + Integer(kind = i4), Dimension (:), Intent (In) :: IDATT + Integer(kind = i4), Intent (Out) :: ires_med ! __________________________________________________________ ! - Real(kind=sp), Parameter :: XHUGE = HUGE (XDATT) - Real(kind=sp) :: XWRK, XWRK1, XMED7, XMAX, XMIN + Real(kind = sp), Parameter :: XHUGE = HUGE (XDATT) + Real(kind = sp) :: XWRK, XWRK1, XMED7, XMAX, XMIN ! - Integer(kind=i4), Dimension (7*(((Size (IDATT)+6)/7+6)/7)) :: ISTRT, IENDT, IMEDT - Integer(kind=i4), Dimension (7*((Size(IDATT)+6)/7)) :: IWRKT - Integer(kind=i4) :: NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 - Integer(kind=i4) :: IDEB, ITMP, IDCR, ICRS, ICRS1, ICRS2, IMAX, IMIN - Integer(kind=i4) :: IWRK, IWRK1, IMED1, IMED7, NDAT + Integer(kind = i4), Dimension (7 * (((Size (IDATT) + 6) / 7 + 6) / 7)) :: ISTRT, IENDT, IMEDT + Integer(kind = i4), Dimension (7 * ((Size(IDATT) + 6) / 7)) :: IWRKT + Integer(kind = i4) :: NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 + Integer(kind = i4) :: IDEB, ITMP, IDCR, ICRS, ICRS1, ICRS2, IMAX, IMIN + Integer(kind = i4) :: IWRK, IWRK1, IMED1, IMED7, NDAT ! NDAT = Size (IDATT) - NMED = (NDAT+1) / 2 + NMED = (NDAT + 1) / 2 IWRKT = IDATT ! ! If the number of values is small, then use insertion sort ! If (NDAT < 35) Then - ! - ! Bring minimum to first location to save test in decreasing loop - ! - IDCR = NDAT - If (XDATT (IWRKT (1)) < XDATT (IWRKT (IDCR))) Then - IWRK = IWRKT (1) - Else - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT (1) - end if - XWRK = XDATT (IWRK) - Do ITMP = 1, NDAT - 2 + ! + ! Bring minimum to first location to save test in decreasing loop + ! + IDCR = NDAT + If (XDATT (IWRKT (1)) < XDATT (IWRKT (IDCR))) Then + IWRK = IWRKT (1) + Else + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT (1) + end if + XWRK = XDATT (IWRK) + Do ITMP = 1, NDAT - 2 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR) + XWRK1 = XDATT (IWRK1) + If (XWRK1 < XWRK) Then + IWRKT (IDCR) = IWRK + XWRK = XWRK1 + IWRK = IWRK1 + end if + End Do + IWRKT (1) = IWRK + ! + ! Sort the first half, until we have NMED sorted values + ! + Do ICRS = 3, NMED + XWRK = XDATT (IWRKT (ICRS)) + IWRK = IWRKT (ICRS) + IDCR = ICRS - 1 + Do + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR) - XWRK1 = XDATT (IWRK1) - If (XWRK1 < XWRK) Then - IWRKT (IDCR) = IWRK - XWRK = XWRK1 - IWRK = IWRK1 - end if - End Do - IWRKT (1) = IWRK - ! - ! Sort the first half, until we have NMED sorted values - ! - Do ICRS = 3, NMED - XWRK = XDATT (IWRKT (ICRS)) - IWRK = IWRKT (ICRS) - IDCR = ICRS - 1 + End Do + IWRKT (IDCR + 1) = IWRK + End Do + ! + ! Insert any value less than the current median in the first half + ! + XWRK1 = XDATT (IWRKT (NMED)) + Do ICRS = NMED + 1, NDAT + XWRK = XDATT (IWRKT (ICRS)) + IWRK = IWRKT (ICRS) + If (XWRK < XWRK1) Then + IDCR = NMED - 1 Do - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - IDCR = IDCR - 1 - End Do - IWRKT (IDCR+1) = IWRK - End Do - ! - ! Insert any value less than the current median in the first half - ! - XWRK1 = XDATT (IWRKT (NMED)) - Do ICRS = NMED+1, NDAT - XWRK = XDATT (IWRKT (ICRS)) - IWRK = IWRKT (ICRS) - If (XWRK < XWRK1) Then - IDCR = NMED - 1 - Do - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - IDCR = IDCR - 1 - End Do - IWRKT (IDCR+1) = IWRK - XWRK1 = XDATT (IWRKT (NMED)) - End If - End Do - ires_med = IWRKT (NMED) - Return + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + IDCR = IDCR - 1 + End Do + IWRKT (IDCR + 1) = IWRK + XWRK1 = XDATT (IWRKT (NMED)) + End If + End Do + ires_med = IWRKT (NMED) + Return End If ! ! Make sorted subsets of 7 elements @@ -1193,108 +1193,108 @@ Recursive Subroutine r_med (XDATT, IDATT, ires_med) IMIN = 1 XMAX = XDATT (IWRKT(IMAX)) XMIN = XDATT (IWRKT(IMIN)) - DO IDEB = 1, NDAT-6, 7 - IDCR = IDEB + 6 - If (XDATT (IWRKT(IDEB)) < XDATT (IWRKT(IDCR))) Then - IWRK = IWRKT(IDEB) - Else - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT(IDEB) - end if - XWRK = XDATT (IWRK) - Do ITMP = 1, 5 - IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR) + DO IDEB = 1, NDAT - 6, 7 + IDCR = IDEB + 6 + If (XDATT (IWRKT(IDEB)) < XDATT (IWRKT(IDCR))) Then + IWRK = IWRKT(IDEB) + Else + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT(IDEB) + end if + XWRK = XDATT (IWRK) + Do ITMP = 1, 5 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR) + XWRK1 = XDATT (IWRK1) + If (XWRK1 < XWRK) Then + IWRKT (IDCR) = IWRK + IWRK = IWRK1 + XWRK = XWRK1 + end if + End Do + IWRKT (IDEB) = IWRK + If (XWRK < XMIN) Then + IMIN = IWRK + XMIN = XWRK + End If + Do ICRS = IDEB + 1, IDEB + 5 + IWRK = IWRKT (ICRS + 1) + XWRK = XDATT (IWRK) + IDON = IWRKT(ICRS) + If (XWRK < XDATT(IDON)) Then + IWRKT (ICRS + 1) = IDON + IDCR = ICRS + IWRK1 = IWRKT (IDCR - 1) XWRK1 = XDATT (IWRK1) - If (XWRK1 < XWRK) Then - IWRKT (IDCR) = IWRK - IWRK = IWRK1 - XWRK = XWRK1 - end if - End Do - IWRKT (IDEB) = IWRK - If (XWRK < XMIN) Then - IMIN = IWRK - XMIN = XWRK - End If - Do ICRS = IDEB+1, IDEB+5 - IWRK = IWRKT (ICRS+1) - XWRK = XDATT (IWRK) - IDON = IWRKT(ICRS) - If (XWRK < XDATT(IDON)) Then - IWRKT (ICRS+1) = IDON - IDCR = ICRS - IWRK1 = IWRKT (IDCR-1) - XWRK1 = XDATT (IWRK1) - Do - If (XWRK >= XWRK1) Exit - IWRKT (IDCR) = IWRK1 - IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR-1) - XWRK1 = XDATT (IWRK1) - End Do - IWRKT (IDCR) = IWRK - end if - End Do - If (XWRK > XMAX) Then - IMAX = IWRK - XMAX = XWRK - End If + Do + If (XWRK >= XWRK1) Exit + IWRKT (IDCR) = IWRK1 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR - 1) + XWRK1 = XDATT (IWRK1) + End Do + IWRKT (IDCR) = IWRK + end if + End Do + If (XWRK > XMAX) Then + IMAX = IWRK + XMAX = XWRK + End If End Do ! ! Add-up alternatively MAX and MIN values to make the number of data ! an exact multiple of 7. ! - IDEB = 7 * (NDAT/7) + IDEB = 7 * (NDAT / 7) NTRI = NDAT If (IDEB < NDAT) Then - ! - Do ICRS = IDEB+1, NDAT - XWRK1 = XDATT (IWRKT (ICRS)) - IF (XWRK1 > XMAX) Then - IMAX = IWRKT (ICRS) - XMAX = XWRK1 - End If - IF (XWRK1 < XMIN) Then - IMIN = IWRKT (ICRS) - XMIN = XWRK1 - End If - End Do - IWRK1 = IMAX - Do ICRS = NDAT+1, IDEB+7 - IWRKT (ICRS) = IWRK1 - If (IWRK1 == IMAX) Then - IWRK1 = IMIN - Else - NMED = NMED + 1 - IWRK1 = IMAX - End If - End Do - ! - Do ICRS = IDEB+2, IDEB+7 - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS - 1, IDEB+1, - 1 - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - End Do - ! - NTRI = IDEB+7 + ! + Do ICRS = IDEB + 1, NDAT + XWRK1 = XDATT (IWRKT (ICRS)) + IF (XWRK1 > XMAX) Then + IMAX = IWRKT (ICRS) + XMAX = XWRK1 + End If + IF (XWRK1 < XMIN) Then + IMIN = IWRKT (ICRS) + XMIN = XWRK1 + End If + End Do + IWRK1 = IMAX + Do ICRS = NDAT + 1, IDEB + 7 + IWRKT (ICRS) = IWRK1 + If (IWRK1 == IMAX) Then + IWRK1 = IMIN + Else + NMED = NMED + 1 + IWRK1 = IMAX + End If + End Do + ! + Do ICRS = IDEB + 2, IDEB + 7 + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + Do IDCR = ICRS - 1, IDEB + 1, - 1 + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + End Do + ! + NTRI = IDEB + 7 End If ! ! Make the set of the indices of median values of each sorted subset ! IDON1 = 0 Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - IMEDT (IDON1) = IWRKT (IDON + 3) + IDON1 = IDON1 + 1 + IMEDT (IDON1) = IWRKT (IDON + 3) End Do ! ! Find XMED7, the median of the medians ! - Call r_med (XDATT, IMEDT(1:IDON1), IMED7) + Call r_med (XDATT, IMEDT(1 : IDON1), IMED7) XMED7 = XDATT (IMED7) ! ! Count how many values are not higher than (and how many equal to) XMED7 @@ -1310,54 +1310,54 @@ Recursive Subroutine r_med (XDATT, IDATT, ires_med) NLEQ = 0 NEQU = 0 Do IDON = 1, NTRI, 7 - IMED = IDON+3 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 2 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 1 - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 1 - end if - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 2 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 1 - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 1 - end if - end if - If (XDATT (IWRKT (IMED)) > XMED7) Then - NLEQ = NLEQ + IMED - IDON - IENDT (IDON1) = IMED - 1 - ISTRT (IDON1) = IMED - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - NLEQ = NLEQ + IMED - IDON + 1 - IENDT (IDON1) = IMED - ISTRT (IDON1) = IMED + 1 - Else ! If (XDATT (IWRKT (IMED)) == XMED7) - NLEQ = NLEQ + IMED - IDON + 1 - NEQU = NEQU + 1 - IENDT (IDON1) = IMED - 1 - Do IMED1 = IMED - 1, IDON, -1 - If (eq(XDATT (IWRKT (IMED1)) , XMED7)) Then - NEQU = NEQU + 1 - IENDT (IDON1) = IMED1 - 1 - Else - Exit - End If - End Do - ISTRT (IDON1) = IMED + 1 - Do IMED1 = IMED + 1, IDON + 6 - If (eq(XDATT (IWRKT (IMED1)) , XMED7)) Then - NEQU = NEQU + 1 - NLEQ = NLEQ + 1 - ISTRT (IDON1) = IMED1 + 1 - Else - Exit - End If - End Do - end if - IDON1 = IDON1 + 1 + IMED = IDON + 3 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 2 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 1 + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 1 + end if + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 2 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 1 + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 1 + end if + end if + If (XDATT (IWRKT (IMED)) > XMED7) Then + NLEQ = NLEQ + IMED - IDON + IENDT (IDON1) = IMED - 1 + ISTRT (IDON1) = IMED + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + NLEQ = NLEQ + IMED - IDON + 1 + IENDT (IDON1) = IMED + ISTRT (IDON1) = IMED + 1 + Else ! If (XDATT (IWRKT (IMED)) == XMED7) + NLEQ = NLEQ + IMED - IDON + 1 + NEQU = NEQU + 1 + IENDT (IDON1) = IMED - 1 + Do IMED1 = IMED - 1, IDON, -1 + If (eq(XDATT (IWRKT (IMED1)), XMED7)) Then + NEQU = NEQU + 1 + IENDT (IDON1) = IMED1 - 1 + Else + Exit + End If + End Do + ISTRT (IDON1) = IMED + 1 + Do IMED1 = IMED + 1, IDON + 6 + If (eq(XDATT (IWRKT (IMED1)), XMED7)) Then + NEQU = NEQU + 1 + NLEQ = NLEQ + 1 + ISTRT (IDON1) = IMED1 + 1 + Else + Exit + End If + End Do + end if + IDON1 = IDON1 + 1 End Do ! ! Carry out a partial insertion sort to find the Kth smallest of the @@ -1366,111 +1366,111 @@ Recursive Subroutine r_med (XDATT, IDATT, ires_med) ! ! If (NLEQ - NEQU + 1 <= NMED) Then - If (NLEQ < NMED) Then ! Not enough low values - IWRK1 = IMAX - XWRK1 = XDATT (IWRK1) - NORD = NMED - NLEQ - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - IDCR = 0 - Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - If (ICRS2 < NORD) Then - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XDATT (IWRKT (ICRS)) < XWRK1) Then - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XDATT (IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - Else - If (ICRS2 < NORD) Then - IWRKT (ICRS1) = IWRKT (ICRS) - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - end if - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XDATT (IWRKT (ICRS)) >= XWRK1) Exit - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XDATT (IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - End Do - End If - End Do - ires_med = IWRK1 - Return - Else - ires_med = IMED7 - Return - End If - Else ! If (NLEQ > NMED) - ! Not enough high values - XWRK1 = -XHUGE - NORD = NLEQ - NEQU - NMED + 1 - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - Do IDON = 1, NTRI, 7 + If (NLEQ < NMED) Then ! Not enough low values + IWRK1 = IMAX + XWRK1 = XDATT (IWRK1) + NORD = NMED - NLEQ + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + IDCR = 0 + Do IDON = 1, NTRI, 7 IDON1 = IDON1 + 1 If (ICRS2 < NORD) Then - ! - Do ICRS = IDON, IENDT (IDON1) - If (XDATT(IWRKT (ICRS)) > XWRK1) Then - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XDATT(IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT(ICRS1) - XWRK1 = XDATT(IWRK1) - Else - If (ICRS2 < NORD) Then - IWRKT (ICRS1) = IWRKT (ICRS) - IWRK1 = IWRKT(ICRS1) - XWRK1 = XDATT(IWRK1) - End If - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = IENDT (IDON1), IDON, -1 - If (XDATT(IWRKT (ICRS)) <= XWRK1) Exit + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XDATT (IWRKT (ICRS)) < XWRK1) Then IWRK = IWRKT (ICRS) XWRK = XDATT (IWRK) - IDCR = ICRS1 - 1 Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XDATT(IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) + If (XWRK >= XDATT (IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) End Do - IWRKT (IDCR+1) = IWRK + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + Else + If (ICRS2 < NORD) Then + IWRKT (ICRS1) = IWRKT (ICRS) + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + end if + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XDATT (IWRKT (ICRS)) >= XWRK1) Exit + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XDATT (IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + End Do + End If + End Do + ires_med = IWRK1 + Return + Else + ires_med = IMED7 + Return + End If + Else ! If (NLEQ > NMED) + ! Not enough high values + XWRK1 = -XHUGE + NORD = NLEQ - NEQU - NMED + 1 + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + Do IDON = 1, NTRI, 7 + IDON1 = IDON1 + 1 + If (ICRS2 < NORD) Then + ! + Do ICRS = IDON, IENDT (IDON1) + If (XDATT(IWRKT (ICRS)) > XWRK1) Then + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XDATT(IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT(ICRS1) + XWRK1 = XDATT(IWRK1) + Else + If (ICRS2 < NORD) Then + IWRKT (ICRS1) = IWRKT (ICRS) IWRK1 = IWRKT(ICRS1) XWRK1 = XDATT(IWRK1) - End Do - end if - End Do - ! - ires_med = IWRK1 - Return + End If + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = IENDT (IDON1), IDON, -1 + If (XDATT(IWRKT (ICRS)) <= XWRK1) Exit + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XDATT(IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT(ICRS1) + XWRK1 = XDATT(IWRK1) + End Do + end if + End Do + ! + ires_med = IWRK1 + Return End If ! END Subroutine r_med @@ -1478,14 +1478,14 @@ END Subroutine r_med Subroutine I_indmed (XDONT, INDM) ! Returns index of median value of XDONT. ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Intent (Out) :: INDM + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Intent (Out) :: INDM ! __________________________________________________________ - Integer(kind=i4) :: IDON + Integer(kind = i4) :: IDON ! Allocate (IDONT (SIZE(XDONT))) Do IDON = 1, SIZE(XDONT) - IDONT (IDON) = IDON + IDONT (IDON) = IDON End Do ! Call i_med(XDONT, IDONT, INDM) @@ -1502,83 +1502,83 @@ Recursive Subroutine i_med (XDATT, IDATT, ires_med) ! case behavior than INDNTH, but is about 30% slower in ! average for random uniformly distributed values. ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDATT - Integer(kind=i4), Dimension (:), Intent (In) :: IDATT - Integer(kind=i4), Intent (Out) :: ires_med + Integer(kind = i4), Dimension (:), Intent (In) :: XDATT + Integer(kind = i4), Dimension (:), Intent (In) :: IDATT + Integer(kind = i4), Intent (Out) :: ires_med ! __________________________________________________________ ! - Integer(kind=i4), Parameter :: XHUGE = HUGE (XDATT) - Integer(kind=i4) :: XWRK, XWRK1, XMED7, XMAX, XMIN + Integer(kind = i4), Parameter :: XHUGE = HUGE (XDATT) + Integer(kind = i4) :: XWRK, XWRK1, XMED7, XMAX, XMIN ! - Integer(kind=i4), Dimension (7*(((Size (IDATT)+6)/7+6)/7)) :: ISTRT, IENDT, IMEDT - Integer(kind=i4), Dimension (7*((Size(IDATT)+6)/7)) :: IWRKT - Integer(kind=i4) :: NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 - Integer(kind=i4) :: IDEB, ITMP, IDCR, ICRS, ICRS1, ICRS2, IMAX, IMIN - Integer(kind=i4) :: IWRK, IWRK1, IMED1, IMED7, NDAT + Integer(kind = i4), Dimension (7 * (((Size (IDATT) + 6) / 7 + 6) / 7)) :: ISTRT, IENDT, IMEDT + Integer(kind = i4), Dimension (7 * ((Size(IDATT) + 6) / 7)) :: IWRKT + Integer(kind = i4) :: NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 + Integer(kind = i4) :: IDEB, ITMP, IDCR, ICRS, ICRS1, ICRS2, IMAX, IMIN + Integer(kind = i4) :: IWRK, IWRK1, IMED1, IMED7, NDAT ! NDAT = Size (IDATT) - NMED = (NDAT+1) / 2 + NMED = (NDAT + 1) / 2 IWRKT = IDATT ! ! If the number of values is small, then use insertion sort ! If (NDAT < 35) Then - ! - ! Bring minimum to first location to save test in decreasing loop - ! - IDCR = NDAT - If (XDATT (IWRKT (1)) < XDATT (IWRKT (IDCR))) Then - IWRK = IWRKT (1) - Else - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT (1) - end if - XWRK = XDATT (IWRK) - Do ITMP = 1, NDAT - 2 + ! + ! Bring minimum to first location to save test in decreasing loop + ! + IDCR = NDAT + If (XDATT (IWRKT (1)) < XDATT (IWRKT (IDCR))) Then + IWRK = IWRKT (1) + Else + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT (1) + end if + XWRK = XDATT (IWRK) + Do ITMP = 1, NDAT - 2 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR) + XWRK1 = XDATT (IWRK1) + If (XWRK1 < XWRK) Then + IWRKT (IDCR) = IWRK + XWRK = XWRK1 + IWRK = IWRK1 + end if + End Do + IWRKT (1) = IWRK + ! + ! Sort the first half, until we have NMED sorted values + ! + Do ICRS = 3, NMED + XWRK = XDATT (IWRKT (ICRS)) + IWRK = IWRKT (ICRS) + IDCR = ICRS - 1 + Do + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR) - XWRK1 = XDATT (IWRK1) - If (XWRK1 < XWRK) Then - IWRKT (IDCR) = IWRK - XWRK = XWRK1 - IWRK = IWRK1 - end if - End Do - IWRKT (1) = IWRK - ! - ! Sort the first half, until we have NMED sorted values - ! - Do ICRS = 3, NMED - XWRK = XDATT (IWRKT (ICRS)) - IWRK = IWRKT (ICRS) - IDCR = ICRS - 1 + End Do + IWRKT (IDCR + 1) = IWRK + End Do + ! + ! Insert any value less than the current median in the first half + ! + XWRK1 = XDATT (IWRKT (NMED)) + Do ICRS = NMED + 1, NDAT + XWRK = XDATT (IWRKT (ICRS)) + IWRK = IWRKT (ICRS) + If (XWRK < XWRK1) Then + IDCR = NMED - 1 Do - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - IDCR = IDCR - 1 - End Do - IWRKT (IDCR+1) = IWRK - End Do - ! - ! Insert any value less than the current median in the first half - ! - XWRK1 = XDATT (IWRKT (NMED)) - Do ICRS = NMED+1, NDAT - XWRK = XDATT (IWRKT (ICRS)) - IWRK = IWRKT (ICRS) - If (XWRK < XWRK1) Then - IDCR = NMED - 1 - Do - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - IDCR = IDCR - 1 - End Do - IWRKT (IDCR+1) = IWRK - XWRK1 = XDATT (IWRKT (NMED)) - End If - End Do - ires_med = IWRKT (NMED) - Return + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + IDCR = IDCR - 1 + End Do + IWRKT (IDCR + 1) = IWRK + XWRK1 = XDATT (IWRKT (NMED)) + End If + End Do + ires_med = IWRKT (NMED) + Return End If ! ! Make sorted subsets of 7 elements @@ -1591,108 +1591,108 @@ Recursive Subroutine i_med (XDATT, IDATT, ires_med) IMIN = 1 XMAX = XDATT (IWRKT(IMAX)) XMIN = XDATT (IWRKT(IMIN)) - DO IDEB = 1, NDAT-6, 7 - IDCR = IDEB + 6 - If (XDATT (IWRKT(IDEB)) < XDATT (IWRKT(IDCR))) Then - IWRK = IWRKT(IDEB) - Else - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT(IDEB) - end if - XWRK = XDATT (IWRK) - Do ITMP = 1, 5 - IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR) + DO IDEB = 1, NDAT - 6, 7 + IDCR = IDEB + 6 + If (XDATT (IWRKT(IDEB)) < XDATT (IWRKT(IDCR))) Then + IWRK = IWRKT(IDEB) + Else + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT(IDEB) + end if + XWRK = XDATT (IWRK) + Do ITMP = 1, 5 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR) + XWRK1 = XDATT (IWRK1) + If (XWRK1 < XWRK) Then + IWRKT (IDCR) = IWRK + IWRK = IWRK1 + XWRK = XWRK1 + end if + End Do + IWRKT (IDEB) = IWRK + If (XWRK < XMIN) Then + IMIN = IWRK + XMIN = XWRK + End If + Do ICRS = IDEB + 1, IDEB + 5 + IWRK = IWRKT (ICRS + 1) + XWRK = XDATT (IWRK) + IDON = IWRKT(ICRS) + If (XWRK < XDATT(IDON)) Then + IWRKT (ICRS + 1) = IDON + IDCR = ICRS + IWRK1 = IWRKT (IDCR - 1) XWRK1 = XDATT (IWRK1) - If (XWRK1 < XWRK) Then - IWRKT (IDCR) = IWRK - IWRK = IWRK1 - XWRK = XWRK1 - end if - End Do - IWRKT (IDEB) = IWRK - If (XWRK < XMIN) Then - IMIN = IWRK - XMIN = XWRK - End If - Do ICRS = IDEB+1, IDEB+5 - IWRK = IWRKT (ICRS+1) - XWRK = XDATT (IWRK) - IDON = IWRKT(ICRS) - If (XWRK < XDATT(IDON)) Then - IWRKT (ICRS+1) = IDON - IDCR = ICRS - IWRK1 = IWRKT (IDCR-1) - XWRK1 = XDATT (IWRK1) - Do - If (XWRK >= XWRK1) Exit - IWRKT (IDCR) = IWRK1 - IDCR = IDCR - 1 - IWRK1 = IWRKT (IDCR-1) - XWRK1 = XDATT (IWRK1) - End Do - IWRKT (IDCR) = IWRK - end if - End Do - If (XWRK > XMAX) Then - IMAX = IWRK - XMAX = XWRK - End If + Do + If (XWRK >= XWRK1) Exit + IWRKT (IDCR) = IWRK1 + IDCR = IDCR - 1 + IWRK1 = IWRKT (IDCR - 1) + XWRK1 = XDATT (IWRK1) + End Do + IWRKT (IDCR) = IWRK + end if + End Do + If (XWRK > XMAX) Then + IMAX = IWRK + XMAX = XWRK + End If End Do ! ! Add-up alternatively MAX and MIN values to make the number of data ! an exact multiple of 7. ! - IDEB = 7 * (NDAT/7) + IDEB = 7 * (NDAT / 7) NTRI = NDAT If (IDEB < NDAT) Then - ! - Do ICRS = IDEB+1, NDAT - XWRK1 = XDATT (IWRKT (ICRS)) - IF (XWRK1 > XMAX) Then - IMAX = IWRKT (ICRS) - XMAX = XWRK1 - End If - IF (XWRK1 < XMIN) Then - IMIN = IWRKT (ICRS) - XMIN = XWRK1 - End If - End Do - IWRK1 = IMAX - Do ICRS = NDAT+1, IDEB+7 - IWRKT (ICRS) = IWRK1 - If (IWRK1 == IMAX) Then - IWRK1 = IMIN - Else - NMED = NMED + 1 - IWRK1 = IMAX - End If - End Do - ! - Do ICRS = IDEB+2, IDEB+7 - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS - 1, IDEB+1, - 1 - If (XWRK >= XDATT (IWRKT(IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - End Do - ! - NTRI = IDEB+7 + ! + Do ICRS = IDEB + 1, NDAT + XWRK1 = XDATT (IWRKT (ICRS)) + IF (XWRK1 > XMAX) Then + IMAX = IWRKT (ICRS) + XMAX = XWRK1 + End If + IF (XWRK1 < XMIN) Then + IMIN = IWRKT (ICRS) + XMIN = XWRK1 + End If + End Do + IWRK1 = IMAX + Do ICRS = NDAT + 1, IDEB + 7 + IWRKT (ICRS) = IWRK1 + If (IWRK1 == IMAX) Then + IWRK1 = IMIN + Else + NMED = NMED + 1 + IWRK1 = IMAX + End If + End Do + ! + Do ICRS = IDEB + 2, IDEB + 7 + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + Do IDCR = ICRS - 1, IDEB + 1, - 1 + If (XWRK >= XDATT (IWRKT(IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + End Do + ! + NTRI = IDEB + 7 End If ! ! Make the set of the indices of median values of each sorted subset ! IDON1 = 0 Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - IMEDT (IDON1) = IWRKT (IDON + 3) + IDON1 = IDON1 + 1 + IMEDT (IDON1) = IWRKT (IDON + 3) End Do ! ! Find XMED7, the median of the medians ! - Call i_med (XDATT, IMEDT(1:IDON1), IMED7) + Call i_med (XDATT, IMEDT(1 : IDON1), IMED7) XMED7 = XDATT (IMED7) ! ! Count how many values are not higher than (and how many equal to) XMED7 @@ -1708,54 +1708,54 @@ Recursive Subroutine i_med (XDATT, IDATT, ires_med) NLEQ = 0 NEQU = 0 Do IDON = 1, NTRI, 7 - IMED = IDON+3 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 2 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 1 - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 1 - end if - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 2 - If (XDATT (IWRKT (IMED)) > XMED7) Then - IMED = IMED - 1 - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - IMED = IMED + 1 - end if - end if - If (XDATT (IWRKT (IMED)) > XMED7) Then - NLEQ = NLEQ + IMED - IDON - IENDT (IDON1) = IMED - 1 - ISTRT (IDON1) = IMED - Else If (XDATT (IWRKT (IMED)) < XMED7) Then - NLEQ = NLEQ + IMED - IDON + 1 - IENDT (IDON1) = IMED - ISTRT (IDON1) = IMED + 1 - Else ! If (XDATT (IWRKT (IMED)) == XMED7) - NLEQ = NLEQ + IMED - IDON + 1 - NEQU = NEQU + 1 - IENDT (IDON1) = IMED - 1 - Do IMED1 = IMED - 1, IDON, -1 - If (XDATT (IWRKT (IMED1)) == XMED7) Then - NEQU = NEQU + 1 - IENDT (IDON1) = IMED1 - 1 - Else - Exit - End If - End Do - ISTRT (IDON1) = IMED + 1 - Do IMED1 = IMED + 1, IDON + 6 - If (XDATT (IWRKT (IMED1)) == XMED7) Then - NEQU = NEQU + 1 - NLEQ = NLEQ + 1 - ISTRT (IDON1) = IMED1 + 1 - Else - Exit - End If - End Do - end if - IDON1 = IDON1 + 1 + IMED = IDON + 3 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 2 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 1 + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 1 + end if + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 2 + If (XDATT (IWRKT (IMED)) > XMED7) Then + IMED = IMED - 1 + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + IMED = IMED + 1 + end if + end if + If (XDATT (IWRKT (IMED)) > XMED7) Then + NLEQ = NLEQ + IMED - IDON + IENDT (IDON1) = IMED - 1 + ISTRT (IDON1) = IMED + Else If (XDATT (IWRKT (IMED)) < XMED7) Then + NLEQ = NLEQ + IMED - IDON + 1 + IENDT (IDON1) = IMED + ISTRT (IDON1) = IMED + 1 + Else ! If (XDATT (IWRKT (IMED)) == XMED7) + NLEQ = NLEQ + IMED - IDON + 1 + NEQU = NEQU + 1 + IENDT (IDON1) = IMED - 1 + Do IMED1 = IMED - 1, IDON, -1 + If (XDATT (IWRKT (IMED1)) == XMED7) Then + NEQU = NEQU + 1 + IENDT (IDON1) = IMED1 - 1 + Else + Exit + End If + End Do + ISTRT (IDON1) = IMED + 1 + Do IMED1 = IMED + 1, IDON + 6 + If (XDATT (IWRKT (IMED1)) == XMED7) Then + NEQU = NEQU + 1 + NLEQ = NLEQ + 1 + ISTRT (IDON1) = IMED1 + 1 + Else + Exit + End If + End Do + end if + IDON1 = IDON1 + 1 End Do ! ! Carry out a partial insertion sort to find the Kth smallest of the @@ -1764,111 +1764,111 @@ Recursive Subroutine i_med (XDATT, IDATT, ires_med) ! ! If (NLEQ - NEQU + 1 <= NMED) Then - If (NLEQ < NMED) Then ! Not enough low values - IWRK1 = IMAX - XWRK1 = XDATT (IWRK1) - NORD = NMED - NLEQ - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - IDCR = 0 - Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - If (ICRS2 < NORD) Then - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XDATT (IWRKT (ICRS)) < XWRK1) Then - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XDATT (IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - Else - If (ICRS2 < NORD) Then - IWRKT (ICRS1) = IWRKT (ICRS) - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - end if - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XDATT (IWRKT (ICRS)) >= XWRK1) Exit - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XDATT (IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT (ICRS1) - XWRK1 = XDATT (IWRK1) - End Do - End If - End Do - ires_med = IWRK1 - Return - Else - ires_med = IMED7 - Return - End If - Else ! If (NLEQ > NMED) - ! Not enough high values - XWRK1 = -XHUGE - NORD = NLEQ - NEQU - NMED + 1 - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - Do IDON = 1, NTRI, 7 + If (NLEQ < NMED) Then ! Not enough low values + IWRK1 = IMAX + XWRK1 = XDATT (IWRK1) + NORD = NMED - NLEQ + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + IDCR = 0 + Do IDON = 1, NTRI, 7 IDON1 = IDON1 + 1 If (ICRS2 < NORD) Then - ! - Do ICRS = IDON, IENDT (IDON1) - If (XDATT(IWRKT (ICRS)) > XWRK1) Then - IWRK = IWRKT (ICRS) - XWRK = XDATT (IWRK) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XDATT(IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) - End Do - IWRKT (IDCR+1) = IWRK - IWRK1 = IWRKT(ICRS1) - XWRK1 = XDATT(IWRK1) - Else - If (ICRS2 < NORD) Then - IWRKT (ICRS1) = IWRKT (ICRS) - IWRK1 = IWRKT(ICRS1) - XWRK1 = XDATT(IWRK1) - End If - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = IENDT (IDON1), IDON, -1 - If (XDATT(IWRKT (ICRS)) <= XWRK1) Exit + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XDATT (IWRKT (ICRS)) < XWRK1) Then IWRK = IWRKT (ICRS) XWRK = XDATT (IWRK) - IDCR = ICRS1 - 1 Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XDATT(IWRKT (IDCR))) Exit - IWRKT (IDCR+1) = IWRKT (IDCR) + If (XWRK >= XDATT (IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) End Do - IWRKT (IDCR+1) = IWRK + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + Else + If (ICRS2 < NORD) Then + IWRKT (ICRS1) = IWRKT (ICRS) + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + end if + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XDATT (IWRKT (ICRS)) >= XWRK1) Exit + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XDATT (IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT (ICRS1) + XWRK1 = XDATT (IWRK1) + End Do + End If + End Do + ires_med = IWRK1 + Return + Else + ires_med = IMED7 + Return + End If + Else ! If (NLEQ > NMED) + ! Not enough high values + XWRK1 = -XHUGE + NORD = NLEQ - NEQU - NMED + 1 + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + Do IDON = 1, NTRI, 7 + IDON1 = IDON1 + 1 + If (ICRS2 < NORD) Then + ! + Do ICRS = IDON, IENDT (IDON1) + If (XDATT(IWRKT (ICRS)) > XWRK1) Then + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XDATT(IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT(ICRS1) + XWRK1 = XDATT(IWRK1) + Else + If (ICRS2 < NORD) Then + IWRKT (ICRS1) = IWRKT (ICRS) IWRK1 = IWRKT(ICRS1) XWRK1 = XDATT(IWRK1) - End Do - end if - End Do - ! - ires_med = IWRK1 - Return + End If + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = IENDT (IDON1), IDON, -1 + If (XDATT(IWRKT (ICRS)) <= XWRK1) Exit + IWRK = IWRKT (ICRS) + XWRK = XDATT (IWRK) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XDATT(IWRKT (IDCR))) Exit + IWRKT (IDCR + 1) = IWRKT (IDCR) + End Do + IWRKT (IDCR + 1) = IWRK + IWRK1 = IWRKT(ICRS1) + XWRK1 = XDATT(IWRK1) + End Do + end if + End Do + ! + ires_med = IWRK1 + Return End If ! END Subroutine i_med @@ -1888,17 +1888,17 @@ Function D_indnth (XDONT, NORD) Result (INDNTH) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: INDNTH - Integer(kind=i4), Intent (In) :: NORD + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: INDNTH + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(kind=dp) :: XPIV, XWRK, XWRK1, XMIN, XMAX + real(kind = dp) :: XPIV, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (NORD) :: IRNGT - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4), Dimension (NORD) :: IRNGT + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) INTH = NORD @@ -1906,78 +1906,78 @@ Function D_indnth (XDONT, NORD) Result (INDNTH) ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (INTH == 1) INDNTH = 1 - Return + If (INTH == 1) INDNTH = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + Return End If ! If (XDONT(3) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - If (XDONT(3) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = 3 - Else - IHIGT (1) = 3 - End If + IHIGT (2) = IHIGT (1) + If (XDONT(3) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = 3 + Else + IHIGT (1) = 3 + End If Else - IHIGT (2) = 3 + IHIGT (2) = 3 End If ! If (NDON < 4) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - If (INTH == 3) INDNTH = IHIGT (2) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + If (INTH == 3) INDNTH = IHIGT (2) + Return End If ! If (XDONT(NDON) < XDONT(IHIGT(1))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = IHIGT (1) - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - Else - IHIGT (1) = NDON - End If + IHIGT (3) = IHIGT (2) + IHIGT (2) = IHIGT (1) + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + Else + IHIGT (1) = NDON + End If Else - IHIGT (3) = NDON + IHIGT (3) = NDON End If ! If (NDON < 5) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - If (INTH == 3) INDNTH = IHIGT (2) - If (INTH == 4) INDNTH = IHIGT (3) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + If (INTH == 3) INDNTH = IHIGT (2) + If (INTH == 4) INDNTH = IHIGT (3) + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XDONT (ILOWT(1)) + REAL(2*INTH,dp)/REAL(NDON+INTH,dp) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(1))) + XPIV = XDONT (ILOWT(1)) + REAL(2 * INTH, dp) / REAL(NDON + INTH, dp) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(1))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(1)) + REAL(2*INTH,dp)/REAL(NDON+INTH,dp) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(1))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(1)) + REAL(2*INTH,dp) / REAL(NDON+INTH,dp) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(1))) + XPIV = XDONT (ILOWT(1)) + REAL(2 * INTH, dp) / REAL(NDON + INTH, dp) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(1))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(1)) + REAL(2 * INTH, dp) / REAL(NDON + INTH, dp) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(1))) End If ! ! One puts values > pivot in the end and those <= pivot @@ -1989,62 +1989,62 @@ Function D_indnth (XDONT, NORD) Result (INDNTH) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -2052,326 +2052,326 @@ Function D_indnth (XDONT, NORD) Result (INDNTH) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIGT (IHIG) = IHIGT (JHIG) - JHIG = JHIG - 1 - Else - - ILOW = ILOWT (1) - XMAX = XDONT (ILOW) - Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - ILOWT (ICRS) = IHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - IWRK1 = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IWRK1 - XPIV = XDONT (IWRK1) + 0.5 * (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! - INDNTH = IHIGT (IHIG) - Return - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + IHIGT (IHIG) = IHIGT (JHIG) + JHIG = JHIG - 1 + Else + + ILOW = ILOWT (1) + XMAX = XDONT (ILOW) + Do ICRS = 2, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! - ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - IRNGT (1) = ILOWT (1) - ILOW = 1 + INTH - JLOW - Do ICRS = 2, INTH - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - ILOW = ILOW + 1 - End Do - ! - XWRK1 = XDONT (IRNGT(INTH)) - ILOW = 2*INTH - JLOW - Do ICRS = INTH + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do IDCR = INTH - 1, MAX (1, ILOW), - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(INTH)) - End If - ILOW = ILOW + 1 - End Do - ! - INDNTH = IRNGT(INTH) - Return + Case (3) ! ! - Case (:-6) - ! - ! last case: too many values in low part + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + ILOWT (ICRS) = IHIGT (JHIG) + End Do + JLOW = INTH + Exit ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then - IWRK = ILOWT (1) - ILOWT (1) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then - IWRK = ILOWT (1) - ILOWT (1) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XDONT (ILOWT(1)) + REAL(INTH,dp)/REAL(JLOW+INTH,dp) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + IWRK1 = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IWRK1 + XPIV = XDONT (IWRK1) + 0.5 * (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) ! - ! One takes values > XPIV to IHIGT + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + INDNTH = IHIGT (IHIG) + Return + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + ILOW = 1 + INTH - JLOW + Do ICRS = 2, INTH + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + ILOW = ILOW + 1 + End Do + ! + XWRK1 = XDONT (IRNGT(INTH)) + ILOW = 2 * INTH - JLOW + Do ICRS = INTH + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do IDCR = INTH - 1, MAX (1, ILOW), - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(INTH)) + End If + ILOW = ILOW + 1 + End Do + ! + INDNTH = IRNGT(INTH) + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then + IWRK = ILOWT (1) + ILOWT (1) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then + IWRK = ILOWT (1) + ILOWT (1) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(1)) + REAL(INTH, dp) / REAL(JLOW + INTH, dp) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + + ! + ! One takes values > XPIV to IHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! IWRK1 = ILOWT (1) - XWRK1 = XDONT (IWRK1) - Do ICRS = 1+1, INTH - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - If (XWRK > XWRK1) Then - XWRK1 = XWRK - IWRK1 = IWRK - End If + XWRK1 = XDONT (IWRK1) + Do ICRS = 1 + 1, INTH + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + If (XWRK > XWRK1) Then + XWRK1 = XWRK + IWRK1 = IWRK + End If End Do INDNTH = IWRK1 Return @@ -2394,17 +2394,17 @@ Function R_indnth (XDONT, NORD) Result (INDNTH) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: INDNTH - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: INDNTH + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XPIV, XWRK, XWRK1, XMIN, XMAX + Real(kind = sp) :: XPIV, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (NORD) :: IRNGT - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4), Dimension (NORD) :: IRNGT + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) INTH = NORD @@ -2412,78 +2412,78 @@ Function R_indnth (XDONT, NORD) Result (INDNTH) ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (INTH == 1) INDNTH = 1 - Return + If (INTH == 1) INDNTH = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + Return End If ! If (XDONT(3) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - If (XDONT(3) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = 3 - Else - IHIGT (1) = 3 - End If + IHIGT (2) = IHIGT (1) + If (XDONT(3) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = 3 + Else + IHIGT (1) = 3 + End If Else - IHIGT (2) = 3 + IHIGT (2) = 3 End If ! If (NDON < 4) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - If (INTH == 3) INDNTH = IHIGT (2) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + If (INTH == 3) INDNTH = IHIGT (2) + Return End If ! If (XDONT(NDON) < XDONT(IHIGT(1))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = IHIGT (1) - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - Else - IHIGT (1) = NDON - End If + IHIGT (3) = IHIGT (2) + IHIGT (2) = IHIGT (1) + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + Else + IHIGT (1) = NDON + End If Else - IHIGT (3) = NDON + IHIGT (3) = NDON End If ! If (NDON < 5) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - If (INTH == 3) INDNTH = IHIGT (2) - If (INTH == 4) INDNTH = IHIGT (3) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + If (INTH == 3) INDNTH = IHIGT (2) + If (INTH == 4) INDNTH = IHIGT (3) + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XDONT (ILOWT(1)) + REAL(2*INTH,sp)/REAL(NDON+INTH,sp) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(1))) + XPIV = XDONT (ILOWT(1)) + REAL(2 * INTH, sp) / REAL(NDON + INTH, sp) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(1))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(1)) + REAL(2*INTH,sp)/REAL(NDON+INTH,sp) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(1))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(1)) + REAL(2*INTH,sp) / REAL(NDON+INTH,sp) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(1))) + XPIV = XDONT (ILOWT(1)) + REAL(2 * INTH, sp) / REAL(NDON + INTH, sp) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(1))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(1)) + REAL(2 * INTH, sp) / REAL(NDON + INTH, sp) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(1))) End If ! ! One puts values > pivot in the end and those <= pivot @@ -2495,62 +2495,62 @@ Function R_indnth (XDONT, NORD) Result (INDNTH) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -2558,326 +2558,326 @@ Function R_indnth (XDONT, NORD) Result (INDNTH) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIGT (IHIG) = IHIGT (JHIG) - JHIG = JHIG - 1 - Else - - ILOW = ILOWT (1) - XMAX = XDONT (ILOW) - Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - ILOWT (ICRS) = IHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - IWRK1 = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IWRK1 - XPIV = XDONT (IWRK1) + 0.5 * (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! - INDNTH = IHIGT (IHIG) - Return - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + IHIGT (IHIG) = IHIGT (JHIG) + JHIG = JHIG - 1 + Else + + ILOW = ILOWT (1) + XMAX = XDONT (ILOW) + Do ICRS = 2, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - IRNGT (1) = ILOWT (1) - ILOW = 1 + INTH - JLOW - Do ICRS = 2, INTH - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - ILOW = ILOW + 1 - End Do - ! - XWRK1 = XDONT (IRNGT(INTH)) - ILOW = 2*INTH - JLOW - Do ICRS = INTH + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do IDCR = INTH - 1, MAX (1, ILOW), - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(INTH)) - End If - ILOW = ILOW + 1 - End Do - ! - INDNTH = IRNGT(INTH) - Return - ! - ! - Case (:-6) ! - ! last case: too many values in low part + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + ILOWT (ICRS) = IHIGT (JHIG) + End Do + JLOW = INTH + Exit ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then - IWRK = ILOWT (1) - ILOWT (1) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then - IWRK = ILOWT (1) - ILOWT (1) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XDONT (ILOWT(1)) + REAL(INTH,sp)/REAL(JLOW+INTH,sp) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + IWRK1 = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IWRK1 + XPIV = XDONT (IWRK1) + 0.5 * (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) ! - ! One takes values > XPIV to IHIGT + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + INDNTH = IHIGT (IHIG) + Return + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + ILOW = 1 + INTH - JLOW + Do ICRS = 2, INTH + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + ILOW = ILOW + 1 + End Do + ! + XWRK1 = XDONT (IRNGT(INTH)) + ILOW = 2 * INTH - JLOW + Do ICRS = INTH + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do IDCR = INTH - 1, MAX (1, ILOW), - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(INTH)) + End If + ILOW = ILOW + 1 + End Do + ! + INDNTH = IRNGT(INTH) + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then + IWRK = ILOWT (1) + ILOWT (1) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then + IWRK = ILOWT (1) + ILOWT (1) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(1)) + REAL(INTH, sp) / REAL(JLOW + INTH, sp) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + + ! + ! One takes values > XPIV to IHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! IWRK1 = ILOWT (1) - XWRK1 = XDONT (IWRK1) - Do ICRS = 1+1, INTH - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - If (XWRK > XWRK1) Then - XWRK1 = XWRK - IWRK1 = IWRK - End If + XWRK1 = XDONT (IWRK1) + Do ICRS = 1 + 1, INTH + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + If (XWRK > XWRK1) Then + XWRK1 = XWRK + IWRK1 = IWRK + End If End Do INDNTH = IWRK1 Return @@ -2900,17 +2900,17 @@ Function I_indnth (XDONT, NORD) Result (INDNTH) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: INDNTH - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: INDNTH + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XPIV, XWRK, XWRK1, XMIN, XMAX + Integer(kind = i4) :: XPIV, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (NORD) :: IRNGT - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4), Dimension (NORD) :: IRNGT + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) INTH = NORD @@ -2918,78 +2918,78 @@ Function I_indnth (XDONT, NORD) Result (INDNTH) ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (INTH == 1) INDNTH = 1 - Return + If (INTH == 1) INDNTH = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + Return End If ! If (XDONT(3) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - If (XDONT(3) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = 3 - Else - IHIGT (1) = 3 - End If + IHIGT (2) = IHIGT (1) + If (XDONT(3) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = 3 + Else + IHIGT (1) = 3 + End If Else - IHIGT (2) = 3 + IHIGT (2) = 3 End If ! If (NDON < 4) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - If (INTH == 3) INDNTH = IHIGT (2) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + If (INTH == 3) INDNTH = IHIGT (2) + Return End If ! If (XDONT(NDON) < XDONT(IHIGT(1))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = IHIGT (1) - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - Else - IHIGT (1) = NDON - End If + IHIGT (3) = IHIGT (2) + IHIGT (2) = IHIGT (1) + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + Else + IHIGT (1) = NDON + End If Else - IHIGT (3) = NDON + IHIGT (3) = NDON End If ! If (NDON < 5) Then - If (INTH == 1) INDNTH = ILOWT (1) - If (INTH == 2) INDNTH = IHIGT (1) - If (INTH == 3) INDNTH = IHIGT (2) - If (INTH == 4) INDNTH = IHIGT (3) - Return + If (INTH == 1) INDNTH = ILOWT (1) + If (INTH == 2) INDNTH = IHIGT (1) + If (INTH == 3) INDNTH = IHIGT (2) + If (INTH == 4) INDNTH = IHIGT (3) + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XDONT (ILOWT(1)) + INT(REAL(2*INTH,sp)/REAL(NDON+INTH,sp),i4) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(1))) + XPIV = XDONT (ILOWT(1)) + INT(REAL(2 * INTH, sp) / REAL(NDON + INTH, sp), i4) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(1))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(1)) + INT(REAL(2*INTH,sp)/REAL(NDON+INTH,sp),i4) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(1))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(1)) + INT(REAL(2*INTH,sp) / REAL(NDON+INTH,sp),i4) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(1))) + XPIV = XDONT (ILOWT(1)) + INT(REAL(2 * INTH, sp) / REAL(NDON + INTH, sp), i4) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(1))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(1)) + INT(REAL(2 * INTH, sp) / REAL(NDON + INTH, sp), i4) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(1))) End If ! ! One puts values > pivot in the end and those <= pivot @@ -3001,62 +3001,62 @@ Function I_indnth (XDONT, NORD) Result (INDNTH) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -3064,326 +3064,326 @@ Function I_indnth (XDONT, NORD) Result (INDNTH) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIGT (IHIG) = IHIGT (JHIG) - JHIG = JHIG - 1 - Else - - ILOW = ILOWT (1) - XMAX = XDONT (ILOW) - Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - ILOWT (ICRS) = IHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - IWRK1 = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IWRK1 - XPIV = XDONT (IWRK1) + (XDONT(IHIGT(IFIN))-XDONT(IWRK1))/2 - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! - INDNTH = IHIGT (IHIG) - Return - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + IHIGT (IHIG) = IHIGT (JHIG) + JHIG = JHIG - 1 + Else + + ILOW = ILOWT (1) + XMAX = XDONT (ILOW) + Do ICRS = 2, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - IRNGT (1) = ILOWT (1) - ILOW = 1 + INTH - JLOW - Do ICRS = 2, INTH - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - ILOW = ILOW + 1 - End Do - ! - XWRK1 = XDONT (IRNGT(INTH)) - ILOW = 2*INTH - JLOW - Do ICRS = INTH + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do IDCR = INTH - 1, MAX (1, ILOW), - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(INTH)) - End If - ILOW = ILOW + 1 - End Do ! - INDNTH = IRNGT(INTH) - Return + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + ILOWT (ICRS) = IHIGT (JHIG) + End Do + JLOW = INTH + Exit ! + Case (4 :) ! - Case (:-6) ! - ! last case: too many values in low part + IFIN = JHIG ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + IWRK1 = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IWRK1 + XPIV = XDONT (IWRK1) + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) / 2 ! - ! One chooses a pivot from 1st, last, and middle values + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! + JHIG = 0 + Do ICRS = 2, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + INDNTH = IHIGT (IHIG) + Return + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + ILOW = 1 + INTH - JLOW + Do ICRS = 2, INTH + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + ILOW = ILOW + 1 + End Do + ! + XWRK1 = XDONT (IRNGT(INTH)) + ILOW = 2 * INTH - JLOW + Do ICRS = INTH + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do IDCR = INTH - 1, MAX (1, ILOW), - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(INTH)) + End If + ILOW = ILOW + 1 + End Do + ! + INDNTH = IRNGT(INTH) + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then + IWRK = ILOWT (1) + ILOWT (1) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then - IWRK = ILOWT (1) - ILOWT (1) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(1))) Then - IWRK = ILOWT (1) - ILOWT (1) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(1)) + INT(REAL(INTH,sp)/REAL(JLOW+INTH,sp),i4) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - - ! - ! One takes values > XPIV to IHIGT - ! - JHIG = 0 - JLOW = 0 - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + IWRK = ILOWT (1) + ILOWT (1) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(1)) + INT(REAL(INTH, sp) / REAL(JLOW + INTH, sp), i4) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + + ! + ! One takes values > XPIV to IHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! IWRK1 = ILOWT (1) - XWRK1 = XDONT (IWRK1) - Do ICRS = 1+1, INTH - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - If (XWRK > XWRK1) Then - XWRK1 = XWRK - IWRK1 = IWRK - End If + XWRK1 = XDONT (IWRK1) + Do ICRS = 1 + 1, INTH + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + If (XWRK > XWRK1) Then + XWRK1 = XWRK + IWRK1 = IWRK + End If End Do INDNTH = IWRK1 Return @@ -3403,34 +3403,34 @@ Subroutine D_inspar (XDONT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (In) :: NORD + real(kind = dp), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(kind=dp) :: XWRK, XWRK1 + real(kind = dp) :: XWRK, XWRK1 ! - Integer(kind=i4) :: ICRS, IDCR + Integer(kind = i4) :: ICRS, IDCR ! Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - End Do - XDONT (IDCR+1) = XWRK + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) + End Do + XDONT (IDCR + 1) = XWRK End Do ! XWRK1 = XDONT (NORD) Do ICRS = NORD + 1, SIZE (XDONT) - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - XDONT (ICRS) = XWRK1 - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - End Do - XDONT (IDCR+1) = XWRK - XWRK1 = XDONT (NORD) - End If + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + XDONT (ICRS) = XWRK1 + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) + End Do + XDONT (IDCR + 1) = XWRK + XWRK1 = XDONT (NORD) + End If End Do ! ! @@ -3448,34 +3448,34 @@ Subroutine R_inspar (XDONT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XWRK, XWRK1 + Real(kind = sp) :: XWRK, XWRK1 ! - Integer(kind=i4) :: ICRS, IDCR + Integer(kind = i4) :: ICRS, IDCR ! Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - End Do - XDONT (IDCR+1) = XWRK + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) + End Do + XDONT (IDCR + 1) = XWRK End Do ! XWRK1 = XDONT (NORD) Do ICRS = NORD + 1, SIZE (XDONT) - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - XDONT (ICRS) = XWRK1 - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - End Do - XDONT (IDCR+1) = XWRK - XWRK1 = XDONT (NORD) - End If + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + XDONT (ICRS) = XWRK1 + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) + End Do + XDONT (IDCR + 1) = XWRK + XWRK1 = XDONT (NORD) + End If End Do ! ! @@ -3493,34 +3493,34 @@ Subroutine I_inspar (XDONT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XWRK, XWRK1 + Integer(kind = i4) :: XWRK, XWRK1 ! - Integer(kind=i4) :: ICRS, IDCR + Integer(kind = i4) :: ICRS, IDCR ! Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - End Do - XDONT (IDCR+1) = XWRK + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) + End Do + XDONT (IDCR + 1) = XWRK End Do ! XWRK1 = XDONT (NORD) Do ICRS = NORD + 1, SIZE (XDONT) - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - XDONT (ICRS) = XWRK1 - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - End Do - XDONT (IDCR+1) = XWRK - XWRK1 = XDONT (NORD) - End If + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + XDONT (ICRS) = XWRK1 + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) + End Do + XDONT (IDCR + 1) = XWRK + XWRK1 = XDONT (NORD) + End If End Do ! ! @@ -3538,13 +3538,13 @@ Subroutine D_inssor (XDONT) ! __________________________________________________________ ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (InOut) :: XDONT + real(kind = dp), Dimension (:), Intent (InOut) :: XDONT ! __________________________________________________________ - real(Kind=dp) :: XWRK, XMIN + real(Kind = dp) :: XWRK, XMIN ! ! __________________________________________________________ ! - Integer(kind=i4) :: ICRS, IDCR, NDON + Integer(kind = i4) :: ICRS, IDCR, NDON ! NDON = Size (XDONT) ! @@ -3553,17 +3553,17 @@ Subroutine D_inssor (XDONT) ! right place to insert a value, no loop test is necessary. ! If (XDONT (1) < XDONT (NDON)) Then - XMIN = XDONT (1) + XMIN = XDONT (1) Else - XMIN = XDONT (NDON) - XDONT (NDON) = XDONT (1) + XMIN = XDONT (NDON) + XDONT (NDON) = XDONT (1) end if - Do IDCR = NDON-1, 2, -1 - XWRK = XDONT(IDCR) - IF (XWRK < XMIN) Then - XDONT (IDCR) = XMIN - XMIN = XWRK - End If + Do IDCR = NDON - 1, 2, -1 + XWRK = XDONT(IDCR) + IF (XWRK < XMIN) Then + XDONT (IDCR) = XMIN + XMIN = XWRK + End If End Do XDONT (1) = XMIN ! @@ -3572,18 +3572,18 @@ Subroutine D_inssor (XDONT) ! the previous one, loop down to insert it at its right place. ! Do ICRS = 3, NDON - XWRK = XDONT (ICRS) - IDCR = ICRS - 1 - If (XWRK < XDONT(IDCR)) Then - XDONT (ICRS) = XDONT (IDCR) + XWRK = XDONT (ICRS) + IDCR = ICRS - 1 + If (XWRK < XDONT(IDCR)) Then + XDONT (ICRS) = XDONT (IDCR) + IDCR = IDCR - 1 + Do + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) IDCR = IDCR - 1 - Do - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - IDCR = IDCR - 1 - End Do - XDONT (IDCR+1) = XWRK - End If + End Do + XDONT (IDCR + 1) = XWRK + End If End Do ! Return @@ -3602,13 +3602,13 @@ Subroutine R_inssor (XDONT) ! __________________________________________________________ ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (InOut) :: XDONT + Real(kind = sp), Dimension (:), Intent (InOut) :: XDONT ! __________________________________________________________ - Real(kind=sp) :: XWRK, XMIN + Real(kind = sp) :: XWRK, XMIN ! ! __________________________________________________________ ! - Integer(kind=i4) :: ICRS, IDCR, NDON + Integer(kind = i4) :: ICRS, IDCR, NDON ! NDON = Size (XDONT) ! @@ -3617,17 +3617,17 @@ Subroutine R_inssor (XDONT) ! right place to insert a value, no loop test is necessary. ! If (XDONT (1) < XDONT (NDON)) Then - XMIN = XDONT (1) + XMIN = XDONT (1) Else - XMIN = XDONT (NDON) - XDONT (NDON) = XDONT (1) + XMIN = XDONT (NDON) + XDONT (NDON) = XDONT (1) end if - Do IDCR = NDON-1, 2, -1 - XWRK = XDONT(IDCR) - IF (XWRK < XMIN) Then - XDONT (IDCR) = XMIN - XMIN = XWRK - End If + Do IDCR = NDON - 1, 2, -1 + XWRK = XDONT(IDCR) + IF (XWRK < XMIN) Then + XDONT (IDCR) = XMIN + XMIN = XWRK + End If End Do XDONT (1) = XMIN ! @@ -3636,18 +3636,18 @@ Subroutine R_inssor (XDONT) ! the previous one, loop down to insert it at its right place. ! Do ICRS = 3, NDON - XWRK = XDONT (ICRS) - IDCR = ICRS - 1 - If (XWRK < XDONT(IDCR)) Then - XDONT (ICRS) = XDONT (IDCR) + XWRK = XDONT (ICRS) + IDCR = ICRS - 1 + If (XWRK < XDONT(IDCR)) Then + XDONT (ICRS) = XDONT (IDCR) + IDCR = IDCR - 1 + Do + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) IDCR = IDCR - 1 - Do - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - IDCR = IDCR - 1 - End Do - XDONT (IDCR+1) = XWRK - End If + End Do + XDONT (IDCR + 1) = XWRK + End If End Do ! Return @@ -3666,13 +3666,13 @@ Subroutine I_inssor (XDONT) ! __________________________________________________________ ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Dimension (:), Intent (InOut) :: XDONT ! __________________________________________________________ - Integer(kind=i4) :: XWRK, XMIN + Integer(kind = i4) :: XWRK, XMIN ! ! __________________________________________________________ ! - Integer(kind=i4) :: ICRS, IDCR, NDON + Integer(kind = i4) :: ICRS, IDCR, NDON ! NDON = Size (XDONT) ! @@ -3681,17 +3681,17 @@ Subroutine I_inssor (XDONT) ! right place to insert a value, no loop test is necessary. ! If (XDONT (1) < XDONT (NDON)) Then - XMIN = XDONT (1) + XMIN = XDONT (1) Else - XMIN = XDONT (NDON) - XDONT (NDON) = XDONT (1) + XMIN = XDONT (NDON) + XDONT (NDON) = XDONT (1) end if - Do IDCR = NDON-1, 2, -1 - XWRK = XDONT(IDCR) - IF (XWRK < XMIN) Then - XDONT (IDCR) = XMIN - XMIN = XWRK - End If + Do IDCR = NDON - 1, 2, -1 + XWRK = XDONT(IDCR) + IF (XWRK < XMIN) Then + XDONT (IDCR) = XMIN + XMIN = XWRK + End If End Do XDONT (1) = XMIN ! @@ -3700,18 +3700,18 @@ Subroutine I_inssor (XDONT) ! the previous one, loop down to insert it at its right place. ! Do ICRS = 3, NDON - XWRK = XDONT (ICRS) - IDCR = ICRS - 1 - If (XWRK < XDONT(IDCR)) Then - XDONT (ICRS) = XDONT (IDCR) + XWRK = XDONT (ICRS) + IDCR = ICRS - 1 + If (XWRK < XDONT(IDCR)) Then + XDONT (ICRS) = XDONT (IDCR) + IDCR = IDCR - 1 + Do + If (XWRK >= XDONT(IDCR)) Exit + XDONT (IDCR + 1) = XDONT (IDCR) IDCR = IDCR - 1 - Do - If (XWRK >= XDONT(IDCR)) Exit - XDONT (IDCR+1) = XDONT (IDCR) - IDCR = IDCR - 1 - End Do - XDONT (IDCR+1) = XWRK - End If + End Do + XDONT (IDCR + 1) = XWRK + End If End Do ! Return @@ -3734,86 +3734,86 @@ Function D_median (XDONT) Result (median) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(Kind=dp), Dimension (:), Intent (In) :: XDONT - real(Kind=dp) :: median + real(Kind = dp), Dimension (:), Intent (In) :: XDONT + real(Kind = dp) :: median ! __________________________________________________________ - real(Kind=dp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT - real(Kind=dp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX + real(Kind = dp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT + real(Kind = dp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX !! Logical :: IFODD - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG!, NORD - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR!, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG!, NORD + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR!, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) - INTH = NDON/2 + 1 - IFODD = (2*INTH == NDON + 1) + INTH = NDON / 2 + 1 + IFODD = (2 * INTH == NDON + 1) ! ! First loop is used to fill-in XLOWT, XHIGT at the same time ! If (NDON < 3) Then - If (NDON > 0) median = 0.5 * (XDONT (1) + XDONT (NDON)) - Return + If (NDON > 0) median = 0.5 * (XDONT (1) + XDONT (NDON)) + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - XLOWT (1) = XDONT(2) - XHIGT (1) = XDONT(1) + XLOWT (1) = XDONT(2) + XHIGT (1) = XDONT(1) Else - XLOWT (1) = XDONT(1) - XHIGT (1) = XDONT(2) + XLOWT (1) = XDONT(1) + XHIGT (1) = XDONT(2) End If ! ! If (XDONT(3) < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - If (XDONT(3) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(3) - Else - XHIGT (1) = XDONT(3) - End If + XHIGT (2) = XHIGT (1) + If (XDONT(3) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(3) + Else + XHIGT (1) = XDONT(3) + End If Else - XHIGT (2) = XDONT(3) + XHIGT (2) = XDONT(3) End If ! If (NDON < 4) Then ! 3 values - median = XHIGT (1) - Return + median = XHIGT (1) + Return End If ! If (XDONT(NDON) < XHIGT(1)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XHIGT (1) - If (XDONT(NDON) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(NDON) - Else - XHIGT (1) = XDONT(NDON) - End If + XHIGT (3) = XHIGT (2) + XHIGT (2) = XHIGT (1) + If (XDONT(NDON) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(NDON) + Else + XHIGT (1) = XDONT(NDON) + End If Else - If (XDONT(NDON) < XHIGT(2)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XDONT(NDON) - Else - XHIGT (3) = XDONT(NDON) - End If + If (XDONT(NDON) < XHIGT(2)) Then + XHIGT (3) = XHIGT (2) + XHIGT (2) = XDONT(NDON) + Else + XHIGT (3) = XDONT(NDON) + End If End If ! If (NDON < 5) Then ! 4 values - median = 0.5*(XHIGT (1) + XHIGT (2)) - Return + median = 0.5 * (XHIGT (1) + XHIGT (2)) + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XLOWT(1) + 2.0 * (XHIGT(3)-XLOWT(1)) / 3.0 + XPIV = XLOWT(1) + 2.0 * (XHIGT(3) - XLOWT(1)) / 3.0 If (XPIV >= XHIGT(1)) Then - XPIV = XLOWT(1) + 2.0 * (XHIGT(2)-XLOWT(1)) / 3.0 - If (XPIV >= XHIGT(1)) XPIV = XLOWT(1) + 2.0 * (XHIGT(1)-XLOWT(1)) / 3.0 + XPIV = XLOWT(1) + 2.0 * (XHIGT(2) - XLOWT(1)) / 3.0 + If (XPIV >= XHIGT(1)) XPIV = XLOWT(1) + 2.0 * (XHIGT(1) - XLOWT(1)) / 3.0 End If ! ! One puts values > pivot in the end and those <= pivot @@ -3825,62 +3825,62 @@ Function D_median (XDONT) Result (median) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -3888,334 +3888,334 @@ Function D_median (XDONT) Result (median) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XHIGT(1) - IHIG = 1 - Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (IHIG) - XHIGT (IHIG) = XHIGT (JHIG) - JHIG = JHIG - 1 - Else - - XMAX = XLOWT (JLOW) - JLOW = JLOW - 1 - Do ICRS = 1, JLOW - If (XLOWT(ICRS) > XMAX) Then - XWRK = XMAX - XMAX = XLOWT(ICRS) - XLOWT (ICRS) = XWRK - End If - End Do - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XHIGT(1) <= XHIGT(2)) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (3) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (3) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - XLOWT (ICRS) = XHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (IFIN) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (IFIN) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - ! - XWRK1 = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XWRK1 - XPIV = XWRK1 + 0.5 * (XHIGT(IFIN)-XWRK1) - ! - ! One takes values <= pivot to XLOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - XHIGT (JHIG) = XHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XHIGT(1) + IHIG = 1 Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - End If + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 - XLOWT (JLOW) = XMIN - Exit - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + XLOWT (JLOW) = XHIGT (IHIG) + XHIGT (IHIG) = XHIGT (JHIG) + JHIG = JHIG - 1 + Else + + XMAX = XLOWT (JLOW) + JLOW = JLOW - 1 + Do ICRS = 1, JLOW + If (XLOWT(ICRS) > XMAX) Then + XWRK = XMAX + XMAX = XLOWT(ICRS) + XLOWT (ICRS) = XWRK + End If + End Do + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XHIGT(1) <= XHIGT(2)) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part ! - IF (IFODD) THEN - JHIG = JLOW - INTH + 1 - Else - JHIG = JLOW - INTH + 2 - end if - XHIGT (1) = XLOWT (1) - Do ICRS = 2, JHIG - XWRK = XLOWT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XHIGT(IDCR)) Then - XHIGT (IDCR+1) = XHIGT (IDCR) - Else - Exit - End If - End Do - XHIGT (IDCR+1) = XWRK - End Do - ! - Do ICRS = JHIG + 1, JLOW - If (XLOWT (ICRS) > XHIGT(1)) Then - XWRK = XLOWT (ICRS) - Do IDCR = 2, JHIG - If (XWRK >= XHIGT(IDCR)) Then - XHIGT (IDCR-1) = XHIGT (IDCR) - else - exit - end if - End Do - XHIGT (IDCR-1) = XWRK - End If + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (3) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (3) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + XLOWT (ICRS) = XHIGT (JHIG) End Do + JLOW = INTH + Exit ! - IF (IFODD) THEN - median = XHIGT(1) - Else - median = 0.5*(XHIGT(1)+XHIGT(2)) - end if - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in low part - ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - If (XLOWT(IMIL) > XLOWT(IFIN)) Then - XWRK = XLOWT (IFIN) - XLOWT (IFIN) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XLOWT(1) + REAL(INTH,dp)/REAL(JLOW+INTH,dp) * & - (XLOWT(IFIN)-XLOWT(1)) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (IFIN) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (IFIN) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + ! + XWRK1 = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XWRK1 + XPIV = XWRK1 + 0.5 * (XHIGT(IFIN) - XWRK1) ! - ! One takes values > XPIV to XHIGT + ! One takes values <= pivot to XLOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XLOWT(IFIN) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + XHIGT (JHIG) = XHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XHIGT(1) + Do ICRS = 2, JHIG + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + End If + End Do + ! + JLOW = JLOW + 1 + XLOWT (JLOW) = XMIN + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IF (IFODD) THEN + JHIG = JLOW - INTH + 1 + Else + JHIG = JLOW - INTH + 2 + end if + XHIGT (1) = XLOWT (1) + Do ICRS = 2, JHIG + XWRK = XLOWT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XHIGT(IDCR)) Then + XHIGT (IDCR + 1) = XHIGT (IDCR) + Else + Exit + End If + End Do + XHIGT (IDCR + 1) = XWRK + End Do + ! + Do ICRS = JHIG + 1, JLOW + If (XLOWT (ICRS) > XHIGT(1)) Then + XWRK = XLOWT (ICRS) + Do IDCR = 2, JHIG + If (XWRK >= XHIGT(IDCR)) Then + XHIGT (IDCR - 1) = XHIGT (IDCR) + else + exit + end if + End Do + XHIGT (IDCR - 1) = XWRK + End If + End Do + ! + IF (IFODD) THEN + median = XHIGT(1) + Else + median = 0.5 * (XHIGT(1) + XHIGT(2)) + end if + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + If (XLOWT(IMIL) > XLOWT(IFIN)) Then + XWRK = XLOWT (IFIN) + XLOWT (IFIN) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XLOWT(1) + REAL(INTH, dp) / REAL(JLOW + INTH, dp) * & + (XLOWT(IFIN) - XLOWT(1)) + + ! + ! One takes values > XPIV to XHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XLOWT(IFIN) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! if (IFODD) then - median = MAXVAL (XLOWT (1:INTH)) + median = MAXVAL (XLOWT (1 : INTH)) else - XWRK = MAX (XLOWT (1), XLOWT (2)) - XWRK1 = MIN (XLOWT (1), XLOWT (2)) - DO ICRS = 3, INTH - IF (XLOWT (ICRS) > XWRK1) THEN - IF (XLOWT (ICRS) > XWRK) THEN - XWRK1 = XWRK - XWRK = XLOWT (ICRS) - Else - XWRK1 = XLOWT (ICRS) - end if + XWRK = MAX (XLOWT (1), XLOWT (2)) + XWRK1 = MIN (XLOWT (1), XLOWT (2)) + DO ICRS = 3, INTH + IF (XLOWT (ICRS) > XWRK1) THEN + IF (XLOWT (ICRS) > XWRK) THEN + XWRK1 = XWRK + XWRK = XLOWT (ICRS) + Else + XWRK1 = XLOWT (ICRS) end if - ENDDO - median = 0.5*(XWRK+XWRK1) + end if + ENDDO + median = 0.5 * (XWRK + XWRK1) end if Return ! @@ -4236,86 +4236,86 @@ Function R_median (XDONT) Result (median) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Real(kind=sp) :: median + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Real(kind = sp) :: median ! __________________________________________________________ - Real(kind=sp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT - Real(kind=sp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX + Real(kind = sp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT + Real(kind = sp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX !! Logical :: IFODD - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG!, NORD - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR!, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG!, NORD + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR!, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) - INTH = NDON/2 + 1 - IFODD = (2*INTH == NDON + 1) + INTH = NDON / 2 + 1 + IFODD = (2 * INTH == NDON + 1) ! ! First loop is used to fill-in XLOWT, XHIGT at the same time ! If (NDON < 3) Then - If (NDON > 0) median = 0.5 * (XDONT (1) + XDONT (NDON)) - Return + If (NDON > 0) median = 0.5 * (XDONT (1) + XDONT (NDON)) + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - XLOWT (1) = XDONT(2) - XHIGT (1) = XDONT(1) + XLOWT (1) = XDONT(2) + XHIGT (1) = XDONT(1) Else - XLOWT (1) = XDONT(1) - XHIGT (1) = XDONT(2) + XLOWT (1) = XDONT(1) + XHIGT (1) = XDONT(2) End If ! ! If (XDONT(3) < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - If (XDONT(3) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(3) - Else - XHIGT (1) = XDONT(3) - End If + XHIGT (2) = XHIGT (1) + If (XDONT(3) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(3) + Else + XHIGT (1) = XDONT(3) + End If Else - XHIGT (2) = XDONT(3) + XHIGT (2) = XDONT(3) End If ! If (NDON < 4) Then ! 3 values - median = XHIGT (1) - Return + median = XHIGT (1) + Return End If ! If (XDONT(NDON) < XHIGT(1)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XHIGT (1) - If (XDONT(NDON) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(NDON) - Else - XHIGT (1) = XDONT(NDON) - End If + XHIGT (3) = XHIGT (2) + XHIGT (2) = XHIGT (1) + If (XDONT(NDON) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(NDON) + Else + XHIGT (1) = XDONT(NDON) + End If Else - If (XDONT(NDON) < XHIGT(2)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XDONT(NDON) - Else - XHIGT (3) = XDONT(NDON) - End If + If (XDONT(NDON) < XHIGT(2)) Then + XHIGT (3) = XHIGT (2) + XHIGT (2) = XDONT(NDON) + Else + XHIGT (3) = XDONT(NDON) + End If End If ! If (NDON < 5) Then ! 4 values - median = 0.5*(XHIGT (1) + XHIGT (2)) - Return + median = 0.5 * (XHIGT (1) + XHIGT (2)) + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XLOWT(1) + 2.0 * (XHIGT(3)-XLOWT(1)) / 3.0 + XPIV = XLOWT(1) + 2.0 * (XHIGT(3) - XLOWT(1)) / 3.0 If (XPIV >= XHIGT(1)) Then - XPIV = XLOWT(1) + 2.0 * (XHIGT(2)-XLOWT(1)) / 3.0 - If (XPIV >= XHIGT(1)) XPIV = XLOWT(1) + 2.0 * (XHIGT(1)-XLOWT(1)) / 3.0 + XPIV = XLOWT(1) + 2.0 * (XHIGT(2) - XLOWT(1)) / 3.0 + If (XPIV >= XHIGT(1)) XPIV = XLOWT(1) + 2.0 * (XHIGT(1) - XLOWT(1)) / 3.0 End If ! ! One puts values > pivot in the end and those <= pivot @@ -4327,62 +4327,62 @@ Function R_median (XDONT) Result (median) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -4390,334 +4390,334 @@ Function R_median (XDONT) Result (median) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XHIGT(1) - IHIG = 1 - Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (IHIG) - XHIGT (IHIG) = XHIGT (JHIG) - JHIG = JHIG - 1 - Else - - XMAX = XLOWT (JLOW) - JLOW = JLOW - 1 - Do ICRS = 1, JLOW - If (XLOWT(ICRS) > XMAX) Then - XWRK = XMAX - XMAX = XLOWT(ICRS) - XLOWT (ICRS) = XWRK - End If - End Do - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XHIGT(1) <= XHIGT(2)) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (3) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (3) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - XLOWT (ICRS) = XHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (IFIN) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (IFIN) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - ! - XWRK1 = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XWRK1 - XPIV = XWRK1 + 0.5 * (XHIGT(IFIN)-XWRK1) - ! - ! One takes values <= pivot to XLOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - XHIGT (JHIG) = XHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XHIGT(1) + IHIG = 1 Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - End If + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 - XLOWT (JLOW) = XMIN - Exit - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + XLOWT (JLOW) = XHIGT (IHIG) + XHIGT (IHIG) = XHIGT (JHIG) + JHIG = JHIG - 1 + Else + + XMAX = XLOWT (JLOW) + JLOW = JLOW - 1 + Do ICRS = 1, JLOW + If (XLOWT(ICRS) > XMAX) Then + XWRK = XMAX + XMAX = XLOWT(ICRS) + XLOWT (ICRS) = XWRK + End If + End Do + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XHIGT(1) <= XHIGT(2)) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part ! - IF (IFODD) THEN - JHIG = JLOW - INTH + 1 - Else - JHIG = JLOW - INTH + 2 - end if - XHIGT (1) = XLOWT (1) - Do ICRS = 2, JHIG - XWRK = XLOWT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XHIGT(IDCR)) Then - XHIGT (IDCR+1) = XHIGT (IDCR) - Else - Exit - End If - End Do - XHIGT (IDCR+1) = XWRK - End Do - ! - Do ICRS = JHIG + 1, JLOW - If (XLOWT (ICRS) > XHIGT(1)) Then - XWRK = XLOWT (ICRS) - Do IDCR = 2, JHIG - If (XWRK >= XHIGT(IDCR)) Then - XHIGT (IDCR-1) = XHIGT (IDCR) - else - exit - end if - End Do - XHIGT (IDCR-1) = XWRK - End If + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (3) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (3) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + XLOWT (ICRS) = XHIGT (JHIG) End Do + JLOW = INTH + Exit ! - IF (IFODD) THEN - median = XHIGT(1) - Else - median = 0.5*(XHIGT(1)+XHIGT(2)) - end if - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in low part - ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - If (XLOWT(IMIL) > XLOWT(IFIN)) Then - XWRK = XLOWT (IFIN) - XLOWT (IFIN) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XLOWT(1) + REAL(INTH,sp)/REAL(JLOW+INTH,sp) * & - (XLOWT(IFIN)-XLOWT(1)) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (IFIN) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (IFIN) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + ! + XWRK1 = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XWRK1 + XPIV = XWRK1 + 0.5 * (XHIGT(IFIN) - XWRK1) ! - ! One takes values > XPIV to XHIGT + ! One takes values <= pivot to XLOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XLOWT(IFIN) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + XHIGT (JHIG) = XHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XHIGT(1) + Do ICRS = 2, JHIG + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + End If + End Do + ! + JLOW = JLOW + 1 + XLOWT (JLOW) = XMIN + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IF (IFODD) THEN + JHIG = JLOW - INTH + 1 + Else + JHIG = JLOW - INTH + 2 + end if + XHIGT (1) = XLOWT (1) + Do ICRS = 2, JHIG + XWRK = XLOWT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XHIGT(IDCR)) Then + XHIGT (IDCR + 1) = XHIGT (IDCR) + Else + Exit + End If + End Do + XHIGT (IDCR + 1) = XWRK + End Do + ! + Do ICRS = JHIG + 1, JLOW + If (XLOWT (ICRS) > XHIGT(1)) Then + XWRK = XLOWT (ICRS) + Do IDCR = 2, JHIG + If (XWRK >= XHIGT(IDCR)) Then + XHIGT (IDCR - 1) = XHIGT (IDCR) + else + exit + end if + End Do + XHIGT (IDCR - 1) = XWRK + End If + End Do + ! + IF (IFODD) THEN + median = XHIGT(1) + Else + median = 0.5 * (XHIGT(1) + XHIGT(2)) + end if + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + If (XLOWT(IMIL) > XLOWT(IFIN)) Then + XWRK = XLOWT (IFIN) + XLOWT (IFIN) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XLOWT(1) + REAL(INTH, sp) / REAL(JLOW + INTH, sp) * & + (XLOWT(IFIN) - XLOWT(1)) + + ! + ! One takes values > XPIV to XHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XLOWT(IFIN) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! if (IFODD) then - median = MAXVAL (XLOWT (1:INTH)) + median = MAXVAL (XLOWT (1 : INTH)) else - XWRK = MAX (XLOWT (1), XLOWT (2)) - XWRK1 = MIN (XLOWT (1), XLOWT (2)) - DO ICRS = 3, INTH - IF (XLOWT (ICRS) > XWRK1) THEN - IF (XLOWT (ICRS) > XWRK) THEN - XWRK1 = XWRK - XWRK = XLOWT (ICRS) - Else - XWRK1 = XLOWT (ICRS) - end if + XWRK = MAX (XLOWT (1), XLOWT (2)) + XWRK1 = MIN (XLOWT (1), XLOWT (2)) + DO ICRS = 3, INTH + IF (XLOWT (ICRS) > XWRK1) THEN + IF (XLOWT (ICRS) > XWRK) THEN + XWRK1 = XWRK + XWRK = XLOWT (ICRS) + Else + XWRK1 = XLOWT (ICRS) end if - ENDDO - median = 0.5*(XWRK+XWRK1) + end if + ENDDO + median = 0.5 * (XWRK + XWRK1) end if Return ! @@ -4738,86 +4738,86 @@ Function I_median (XDONT) Result (median) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: median + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: median ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT - Integer(kind=i4) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX + Integer(kind = i4), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT + Integer(kind = i4) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX !! Logical :: IFODD - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG!, NORD - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR!, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG!, NORD + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR!, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) - INTH = NDON/2 + 1 - IFODD = (2*INTH == NDON + 1) + INTH = NDON / 2 + 1 + IFODD = (2 * INTH == NDON + 1) ! ! First loop is used to fill-in XLOWT, XHIGT at the same time ! If (NDON < 3) Then - If (NDON > 0) median = (XDONT (1) + XDONT (NDON))/2 - Return + If (NDON > 0) median = (XDONT (1) + XDONT (NDON)) / 2 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - XLOWT (1) = XDONT(2) - XHIGT (1) = XDONT(1) + XLOWT (1) = XDONT(2) + XHIGT (1) = XDONT(1) Else - XLOWT (1) = XDONT(1) - XHIGT (1) = XDONT(2) + XLOWT (1) = XDONT(1) + XHIGT (1) = XDONT(2) End If ! ! If (XDONT(3) < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - If (XDONT(3) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(3) - Else - XHIGT (1) = XDONT(3) - End If + XHIGT (2) = XHIGT (1) + If (XDONT(3) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(3) + Else + XHIGT (1) = XDONT(3) + End If Else - XHIGT (2) = XDONT(3) + XHIGT (2) = XDONT(3) End If ! If (NDON < 4) Then ! 3 values - median = XHIGT (1) - Return + median = XHIGT (1) + Return End If ! If (XDONT(NDON) < XHIGT(1)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XHIGT (1) - If (XDONT(NDON) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(NDON) - Else - XHIGT (1) = XDONT(NDON) - End If + XHIGT (3) = XHIGT (2) + XHIGT (2) = XHIGT (1) + If (XDONT(NDON) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(NDON) + Else + XHIGT (1) = XDONT(NDON) + End If Else - If (XDONT(NDON) < XHIGT(2)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XDONT(NDON) - Else - XHIGT (3) = XDONT(NDON) - End If + If (XDONT(NDON) < XHIGT(2)) Then + XHIGT (3) = XHIGT (2) + XHIGT (2) = XDONT(NDON) + Else + XHIGT (3) = XDONT(NDON) + End If End If ! If (NDON < 5) Then ! 4 values - median = (XHIGT (1) + XHIGT (2))/2 - Return + median = (XHIGT (1) + XHIGT (2)) / 2 + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XLOWT(1) + 2 * (XHIGT(3)-XLOWT(1)) / 3 + XPIV = XLOWT(1) + 2 * (XHIGT(3) - XLOWT(1)) / 3 If (XPIV >= XHIGT(1)) Then - XPIV = XLOWT(1) + 2 * (XHIGT(2)-XLOWT(1)) / 3 - If (XPIV >= XHIGT(1)) XPIV = XLOWT(1) + 2 * (XHIGT(1)-XLOWT(1)) / 3 + XPIV = XLOWT(1) + 2 * (XHIGT(2) - XLOWT(1)) / 3 + If (XPIV >= XHIGT(1)) XPIV = XLOWT(1) + 2 * (XHIGT(1) - XLOWT(1)) / 3 End If ! ! One puts values > pivot in the end and those <= pivot @@ -4829,62 +4829,62 @@ Function I_median (XDONT) Result (median) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -4892,334 +4892,334 @@ Function I_median (XDONT) Result (median) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XHIGT(1) - IHIG = 1 - Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (IHIG) - XHIGT (IHIG) = XHIGT (JHIG) - JHIG = JHIG - 1 - Else - - XMAX = XLOWT (JLOW) - JLOW = JLOW - 1 - Do ICRS = 1, JLOW - If (XLOWT(ICRS) > XMAX) Then - XWRK = XMAX - XMAX = XLOWT(ICRS) - XLOWT (ICRS) = XWRK - End If - End Do - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XHIGT(1) <= XHIGT(2)) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (3) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (3) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - XLOWT (ICRS) = XHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (IFIN) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (IFIN) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - ! - XWRK1 = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XWRK1 - XPIV = XWRK1 + (XHIGT(IFIN)-XWRK1)/2 - ! - ! One takes values <= pivot to XLOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - XHIGT (JHIG) = XHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XHIGT(1) + IHIG = 1 Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - End If + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 - XLOWT (JLOW) = XMIN - Exit - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + XLOWT (JLOW) = XHIGT (IHIG) + XHIGT (IHIG) = XHIGT (JHIG) + JHIG = JHIG - 1 + Else + + XMAX = XLOWT (JLOW) + JLOW = JLOW - 1 + Do ICRS = 1, JLOW + If (XLOWT(ICRS) > XMAX) Then + XWRK = XMAX + XMAX = XLOWT(ICRS) + XLOWT (ICRS) = XWRK + End If + End Do + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XHIGT(1) <= XHIGT(2)) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part ! - IF (IFODD) THEN - JHIG = JLOW - INTH + 1 - Else - JHIG = JLOW - INTH + 2 - end if - XHIGT (1) = XLOWT (1) - Do ICRS = 2, JHIG - XWRK = XLOWT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XHIGT(IDCR)) Then - XHIGT (IDCR+1) = XHIGT (IDCR) - Else - Exit - End If - End Do - XHIGT (IDCR+1) = XWRK - End Do - ! - Do ICRS = JHIG + 1, JLOW - If (XLOWT (ICRS) > XHIGT(1)) Then - XWRK = XLOWT (ICRS) - Do IDCR = 2, JHIG - If (XWRK >= XHIGT(IDCR)) Then - XHIGT (IDCR-1) = XHIGT (IDCR) - else - exit - end if - End Do - XHIGT (IDCR-1) = XWRK - End If + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (3) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (3) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + XLOWT (ICRS) = XHIGT (JHIG) End Do + JLOW = INTH + Exit ! - IF (IFODD) THEN - median = XHIGT(1) - Else - median = (XHIGT(1)+XHIGT(2))/2 - end if - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in low part - ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - If (XLOWT(IMIL) > XLOWT(IFIN)) Then - XWRK = XLOWT (IFIN) - XLOWT (IFIN) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XLOWT(1) + INT(REAL(INTH,sp)/REAL(JLOW+INTH,sp),i4) * & - (XLOWT(IFIN)-XLOWT(1)) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (IFIN) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (IFIN) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + ! + XWRK1 = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XWRK1 + XPIV = XWRK1 + (XHIGT(IFIN) - XWRK1) / 2 ! - ! One takes values > XPIV to XHIGT + ! One takes values <= pivot to XLOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XLOWT(IFIN) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + XHIGT (JHIG) = XHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XHIGT(1) + Do ICRS = 2, JHIG + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + End If + End Do + ! + JLOW = JLOW + 1 + XLOWT (JLOW) = XMIN + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IF (IFODD) THEN + JHIG = JLOW - INTH + 1 + Else + JHIG = JLOW - INTH + 2 + end if + XHIGT (1) = XLOWT (1) + Do ICRS = 2, JHIG + XWRK = XLOWT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XHIGT(IDCR)) Then + XHIGT (IDCR + 1) = XHIGT (IDCR) + Else + Exit + End If + End Do + XHIGT (IDCR + 1) = XWRK + End Do + ! + Do ICRS = JHIG + 1, JLOW + If (XLOWT (ICRS) > XHIGT(1)) Then + XWRK = XLOWT (ICRS) + Do IDCR = 2, JHIG + If (XWRK >= XHIGT(IDCR)) Then + XHIGT (IDCR - 1) = XHIGT (IDCR) + else + exit + end if + End Do + XHIGT (IDCR - 1) = XWRK + End If + End Do + ! + IF (IFODD) THEN + median = XHIGT(1) + Else + median = (XHIGT(1) + XHIGT(2)) / 2 + end if + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + If (XLOWT(IMIL) > XLOWT(IFIN)) Then + XWRK = XLOWT (IFIN) + XLOWT (IFIN) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XLOWT(1) + INT(REAL(INTH, sp) / REAL(JLOW + INTH, sp), i4) * & + (XLOWT(IFIN) - XLOWT(1)) + + ! + ! One takes values > XPIV to XHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XLOWT(IFIN) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! if (IFODD) then - median = MAXVAL (XLOWT (1:INTH)) + median = MAXVAL (XLOWT (1 : INTH)) else - XWRK = MAX (XLOWT (1), XLOWT (2)) - XWRK1 = MIN (XLOWT (1), XLOWT (2)) - DO ICRS = 3, INTH - IF (XLOWT (ICRS) > XWRK1) THEN - IF (XLOWT (ICRS) > XWRK) THEN - XWRK1 = XWRK - XWRK = XLOWT (ICRS) - Else - XWRK1 = XLOWT (ICRS) - end if + XWRK = MAX (XLOWT (1), XLOWT (2)) + XWRK1 = MIN (XLOWT (1), XLOWT (2)) + DO ICRS = 3, INTH + IF (XLOWT (ICRS) > XWRK1) THEN + IF (XLOWT (ICRS) > XWRK) THEN + XWRK1 = XWRK + XWRK = XLOWT (ICRS) + Else + XWRK1 = XLOWT (ICRS) end if - ENDDO - median = (XWRK+XWRK1)/2 + end if + ENDDO + median = (XWRK + XWRK1) / 2 end if Return ! @@ -5233,38 +5233,38 @@ Subroutine D_mrgref (XVALT, IRNGT) ! Michel Olagnon - April 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XVALT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT + real(kind = dp), Dimension (:), Intent (In) :: XVALT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT ! __________________________________________________________ ! - Integer(kind=i4), Dimension (:), Allocatable :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (:), Allocatable :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XVALT), SIZE(IRNGT)) If (NVAL <= 0) Then - Return + Return End If ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XVALT(IIND-1) <= XVALT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XVALT(IIND - 1) <= XVALT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo (NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... ! and merge A and B couples into C - C - ... ! - Allocate (JWRKT(1:NVAL)) + Allocate (JWRKT(1 : NVAL)) LMTNC = 2 LMTNA = 2 ! @@ -5272,79 +5272,79 @@ Subroutine D_mrgref (XVALT, IRNGT) ! is doubled. ! Do - If (LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - IWRK = 0 - ! - ! Loop on merges of A and B into C - ! - Do - IINDA = IWRKF - IWRKD = IWRKF + 1 - IWRKF = IINDA + LMTNC - JINDA = IINDA + LMTNA - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDB = JINDA - ! - ! Shortcut for the case when the max of A is smaller - ! than the min of B (no need to do anything) - ! - If (XVALT(IRNGT(JINDA)) <= XVALT(IRNGT(JINDA+1))) Then - IWRK = IWRKF - Cycle - End If - ! - ! One steps in the C subset, that we create in the final rank array - ! - Do - If (IWRK >= IWRKF) Then - ! - ! Make a copy of the rank array for next iteration - ! - IRNGT (IWRKD:IWRKF) = JWRKT (IWRKD:IWRKF) - Exit - End If - ! - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA < JINDA) Then - If (IINDB < IWRKF) Then - If (XVALT(IRNGT(IINDA+1)) > XVALT(IRNGT(IINDB+1))) & - & Then - IINDB = IINDB + 1 - JWRKT (IWRK) = IRNGT (IINDB) - Else - IINDA = IINDA + 1 - JWRKT (IWRK) = IRNGT (IINDA) - End If - Else - ! - ! Only A still with unprocessed values - ! - IINDA = IINDA + 1 - JWRKT (IWRK) = IRNGT (IINDA) - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNGT (IWRKD:IINDB) = JWRKT (IWRKD:IINDB) - IWRK = IWRKF - Exit - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + IWRK = 0 + ! + ! Loop on merges of A and B into C + ! + Do + IINDA = IWRKF + IWRKD = IWRKF + 1 + IWRKF = IINDA + LMTNC + JINDA = IINDA + LMTNA + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDB = JINDA + ! + ! Shortcut for the case when the max of A is smaller + ! than the min of B (no need to do anything) + ! + If (XVALT(IRNGT(JINDA)) <= XVALT(IRNGT(JINDA + 1))) Then + IWRK = IWRKF + Cycle + End If + ! + ! One steps in the C subset, that we create in the final rank array + ! + Do + If (IWRK >= IWRKF) Then + ! + ! Make a copy of the rank array for next iteration + ! + IRNGT (IWRKD : IWRKF) = JWRKT (IWRKD : IWRKF) + Exit + End If + ! + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA < JINDA) Then + If (IINDB < IWRKF) Then + If (XVALT(IRNGT(IINDA + 1)) > XVALT(IRNGT(IINDB + 1))) & + & Then + IINDB = IINDB + 1 + JWRKT (IWRK) = IRNGT (IINDB) + Else + IINDA = IINDA + 1 + JWRKT (IWRK) = IRNGT (IINDA) + End If + Else + ! + ! Only A still with unprocessed values + ! + IINDA = IINDA + 1 + JWRKT (IWRK) = IRNGT (IINDA) + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNGT (IWRKD : IINDB) = JWRKT (IWRKD : IINDB) + IWRK = IWRKF + Exit + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Clean up @@ -5362,38 +5362,38 @@ Subroutine R_mrgref (XVALT, IRNGT) ! Michel Olagnon - April 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XVALT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT + Real(kind = sp), Dimension (:), Intent (In) :: XVALT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT ! __________________________________________________________ ! - Integer(kind=i4), Dimension (:), Allocatable :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (:), Allocatable :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XVALT), SIZE(IRNGT)) If (NVAL <= 0) Then - Return + Return End If ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XVALT(IIND-1) <= XVALT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XVALT(IIND - 1) <= XVALT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo (NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... ! and merge A and B couples into C - C - ... ! - Allocate (JWRKT(1:NVAL)) + Allocate (JWRKT(1 : NVAL)) LMTNC = 2 LMTNA = 2 ! @@ -5401,79 +5401,79 @@ Subroutine R_mrgref (XVALT, IRNGT) ! is doubled. ! Do - If (LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - IWRK = 0 - ! - ! Loop on merges of A and B into C - ! - Do - IINDA = IWRKF - IWRKD = IWRKF + 1 - IWRKF = IINDA + LMTNC - JINDA = IINDA + LMTNA - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDB = JINDA - ! - ! Shortcut for the case when the max of A is smaller - ! than the min of B (no need to do anything) - ! - If (XVALT(IRNGT(JINDA)) <= XVALT(IRNGT(JINDA+1))) Then - IWRK = IWRKF - Cycle - End If - ! - ! One steps in the C subset, that we create in the final rank array - ! - Do - If (IWRK >= IWRKF) Then - ! - ! Make a copy of the rank array for next iteration - ! - IRNGT (IWRKD:IWRKF) = JWRKT (IWRKD:IWRKF) - Exit - End If - ! - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA < JINDA) Then - If (IINDB < IWRKF) Then - If (XVALT(IRNGT(IINDA+1)) > XVALT(IRNGT(IINDB+1))) & - & Then - IINDB = IINDB + 1 - JWRKT (IWRK) = IRNGT (IINDB) - Else - IINDA = IINDA + 1 - JWRKT (IWRK) = IRNGT (IINDA) - End If - Else - ! - ! Only A still with unprocessed values - ! - IINDA = IINDA + 1 - JWRKT (IWRK) = IRNGT (IINDA) - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNGT (IWRKD:IINDB) = JWRKT (IWRKD:IINDB) - IWRK = IWRKF - Exit - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + IWRK = 0 + ! + ! Loop on merges of A and B into C + ! + Do + IINDA = IWRKF + IWRKD = IWRKF + 1 + IWRKF = IINDA + LMTNC + JINDA = IINDA + LMTNA + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDB = JINDA + ! + ! Shortcut for the case when the max of A is smaller + ! than the min of B (no need to do anything) + ! + If (XVALT(IRNGT(JINDA)) <= XVALT(IRNGT(JINDA + 1))) Then + IWRK = IWRKF + Cycle + End If + ! + ! One steps in the C subset, that we create in the final rank array + ! + Do + If (IWRK >= IWRKF) Then + ! + ! Make a copy of the rank array for next iteration + ! + IRNGT (IWRKD : IWRKF) = JWRKT (IWRKD : IWRKF) + Exit + End If + ! + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA < JINDA) Then + If (IINDB < IWRKF) Then + If (XVALT(IRNGT(IINDA + 1)) > XVALT(IRNGT(IINDB + 1))) & + & Then + IINDB = IINDB + 1 + JWRKT (IWRK) = IRNGT (IINDB) + Else + IINDA = IINDA + 1 + JWRKT (IWRK) = IRNGT (IINDA) + End If + Else + ! + ! Only A still with unprocessed values + ! + IINDA = IINDA + 1 + JWRKT (IWRK) = IRNGT (IINDA) + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNGT (IWRKD : IINDB) = JWRKT (IWRKD : IINDB) + IWRK = IWRKF + Exit + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Clean up @@ -5491,38 +5491,38 @@ Subroutine I_mrgref (XVALT, IRNGT) ! Michel Olagnon - April 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XVALT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Dimension (:), Intent (In) :: XVALT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT ! __________________________________________________________ ! - Integer(kind=i4), Dimension (:), Allocatable :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (:), Allocatable :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XVALT), SIZE(IRNGT)) If (NVAL <= 0) Then - Return + Return End If ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XVALT(IIND-1) <= XVALT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XVALT(IIND - 1) <= XVALT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo (NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... ! and merge A and B couples into C - C - ... ! - Allocate (JWRKT(1:NVAL)) + Allocate (JWRKT(1 : NVAL)) LMTNC = 2 LMTNA = 2 ! @@ -5530,79 +5530,79 @@ Subroutine I_mrgref (XVALT, IRNGT) ! is doubled. ! Do - If (LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - IWRK = 0 - ! - ! Loop on merges of A and B into C - ! - Do - IINDA = IWRKF - IWRKD = IWRKF + 1 - IWRKF = IINDA + LMTNC - JINDA = IINDA + LMTNA - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDB = JINDA - ! - ! Shortcut for the case when the max of A is smaller - ! than the min of B (no need to do anything) - ! - If (XVALT(IRNGT(JINDA)) <= XVALT(IRNGT(JINDA+1))) Then - IWRK = IWRKF - Cycle - End If - ! - ! One steps in the C subset, that we create in the final rank array - ! - Do - If (IWRK >= IWRKF) Then - ! - ! Make a copy of the rank array for next iteration - ! - IRNGT (IWRKD:IWRKF) = JWRKT (IWRKD:IWRKF) - Exit - End If - ! - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA < JINDA) Then - If (IINDB < IWRKF) Then - If (XVALT(IRNGT(IINDA+1)) > XVALT(IRNGT(IINDB+1))) & - & Then - IINDB = IINDB + 1 - JWRKT (IWRK) = IRNGT (IINDB) - Else - IINDA = IINDA + 1 - JWRKT (IWRK) = IRNGT (IINDA) - End If - Else - ! - ! Only A still with unprocessed values - ! - IINDA = IINDA + 1 - JWRKT (IWRK) = IRNGT (IINDA) - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNGT (IWRKD:IINDB) = JWRKT (IWRKD:IINDB) - IWRK = IWRKF - Exit - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + IWRK = 0 + ! + ! Loop on merges of A and B into C + ! + Do + IINDA = IWRKF + IWRKD = IWRKF + 1 + IWRKF = IINDA + LMTNC + JINDA = IINDA + LMTNA + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDB = JINDA + ! + ! Shortcut for the case when the max of A is smaller + ! than the min of B (no need to do anything) + ! + If (XVALT(IRNGT(JINDA)) <= XVALT(IRNGT(JINDA + 1))) Then + IWRK = IWRKF + Cycle + End If + ! + ! One steps in the C subset, that we create in the final rank array + ! + Do + If (IWRK >= IWRKF) Then + ! + ! Make a copy of the rank array for next iteration + ! + IRNGT (IWRKD : IWRKF) = JWRKT (IWRKD : IWRKF) + Exit + End If + ! + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA < JINDA) Then + If (IINDB < IWRKF) Then + If (XVALT(IRNGT(IINDA + 1)) > XVALT(IRNGT(IINDB + 1))) & + & Then + IINDB = IINDB + 1 + JWRKT (IWRK) = IRNGT (IINDB) + Else + IINDA = IINDA + 1 + JWRKT (IWRK) = IRNGT (IINDA) + End If + Else + ! + ! Only A still with unprocessed values + ! + IINDA = IINDA + 1 + JWRKT (IWRK) = IRNGT (IINDA) + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNGT (IWRKD : IINDB) = JWRKT (IWRKD : IINDB) + IWRK = IWRKF + Exit + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Clean up @@ -5619,39 +5619,39 @@ Subroutine D_mrgrnk (XDONT, IRNGT) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT ! __________________________________________________________ - real(kind=dp) :: XVALA, XVALB + real(kind = dp) :: XVALA, XVALB ! - Integer(kind=i4), Dimension (SIZE(IRNGT)) :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG1, IRNG2 - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (SIZE(IRNGT)) :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG1, IRNG2 + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XDONT), SIZE(IRNGT)) Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IRNGT (1) = 1 - Return + IRNGT (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XDONT(IIND-1) <= XDONT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XDONT(IIND - 1) <= XDONT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo(NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -5663,149 +5663,149 @@ Subroutine D_mrgrnk (XDONT, IRNGT) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 2) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 2) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! Shortcut for the case when the max of A is smaller - ! than the min of B. This line may be activated when the - ! initial set is already close to sorted. - ! - ! IF (XDONT(IRNGT(JINDA)) <= XDONT(IRNGT(IINDB))) CYCLE - ! - ! One steps in the C subset, that we build in the final rank array - ! - ! Make a copy of the rank array for the merge iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - ! - XVALA = XDONT (JWRKT(IINDA)) - XVALB = XDONT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XVALA > XVALB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XVALB = XDONT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XVALA = XDONT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! Shortcut for the case when the max of A is smaller + ! than the min of B. This line may be activated when the + ! initial set is already close to sorted. + ! + ! IF (XDONT(IRNGT(JINDA)) <= XDONT(IRNGT(IINDB))) CYCLE + ! + ! One steps in the C subset, that we build in the final rank array + ! + ! Make a copy of the rank array for the merge iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + ! + XVALA = XDONT (JWRKT(IINDA)) + XVALB = XDONT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XVALA > XVALB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XVALB = XDONT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XVALA = XDONT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! Return @@ -5819,39 +5819,39 @@ Subroutine R_mrgrnk (XDONT, IRNGT) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT ! __________________________________________________________ - Real(kind=sp) :: XVALA, XVALB + Real(kind = sp) :: XVALA, XVALB ! - Integer(kind=i4), Dimension (SIZE(IRNGT)) :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG1, IRNG2 - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (SIZE(IRNGT)) :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG1, IRNG2 + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XDONT), SIZE(IRNGT)) Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IRNGT (1) = 1 - Return + IRNGT (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XDONT(IIND-1) <= XDONT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XDONT(IIND - 1) <= XDONT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo(NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -5863,149 +5863,149 @@ Subroutine R_mrgrnk (XDONT, IRNGT) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 2) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 2) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! Shortcut for the case when the max of A is smaller - ! than the min of B. This line may be activated when the - ! initial set is already close to sorted. - ! - ! IF (XDONT(IRNGT(JINDA)) <= XDONT(IRNGT(IINDB))) CYCLE - ! - ! One steps in the C subset, that we build in the final rank array - ! - ! Make a copy of the rank array for the merge iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - ! - XVALA = XDONT (JWRKT(IINDA)) - XVALB = XDONT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XVALA > XVALB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XVALB = XDONT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XVALA = XDONT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! Shortcut for the case when the max of A is smaller + ! than the min of B. This line may be activated when the + ! initial set is already close to sorted. + ! + ! IF (XDONT(IRNGT(JINDA)) <= XDONT(IRNGT(IINDB))) CYCLE + ! + ! One steps in the C subset, that we build in the final rank array + ! + ! Make a copy of the rank array for the merge iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + ! + XVALA = XDONT (JWRKT(IINDA)) + XVALB = XDONT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XVALA > XVALB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XVALB = XDONT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XVALA = XDONT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! Return @@ -6019,39 +6019,39 @@ Subroutine I_mrgrnk (XDONT, IRNGT) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT ! __________________________________________________________ - Integer(kind=i4) :: XVALA, XVALB + Integer(kind = i4) :: XVALA, XVALB ! - Integer(kind=i4), Dimension (SIZE(IRNGT)) :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG1, IRNG2 - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (SIZE(IRNGT)) :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG1, IRNG2 + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XDONT), SIZE(IRNGT)) Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IRNGT (1) = 1 - Return + IRNGT (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XDONT(IIND-1) <= XDONT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XDONT(IIND - 1) <= XDONT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo(NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -6063,149 +6063,149 @@ Subroutine I_mrgrnk (XDONT, IRNGT) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 2) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 2) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! Shortcut for the case when the max of A is smaller - ! than the min of B. This line may be activated when the - ! initial set is already close to sorted. - ! - ! IF (XDONT(IRNGT(JINDA)) <= XDONT(IRNGT(IINDB))) CYCLE - ! - ! One steps in the C subset, that we build in the final rank array - ! - ! Make a copy of the rank array for the merge iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - ! - XVALA = XDONT (JWRKT(IINDA)) - XVALB = XDONT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XVALA > XVALB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XVALB = XDONT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XVALA = XDONT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! Shortcut for the case when the max of A is smaller + ! than the min of B. This line may be activated when the + ! initial set is already close to sorted. + ! + ! IF (XDONT(IRNGT(JINDA)) <= XDONT(IRNGT(IINDB))) CYCLE + ! + ! One steps in the C subset, that we build in the final rank array + ! + ! Make a copy of the rank array for the merge iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + ! + XVALA = XDONT (JWRKT(IINDA)) + XVALB = XDONT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XVALA > XVALB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XVALB = XDONT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XVALA = XDONT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! Return @@ -6219,21 +6219,21 @@ Subroutine D_mulcnt (XDONT, IMULT) ! Michel Olagnon - Mar. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IMULT + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IMULT ! __________________________________________________________ ! - Integer(kind=i4), Dimension (Size(XDONT)) :: IWRKT - Integer(kind=i4), Dimension (Size(XDONT)) :: ICNTT - Integer(kind=i4) :: ICRS + Integer(kind = i4), Dimension (Size(XDONT)) :: IWRKT + Integer(kind = i4), Dimension (Size(XDONT)) :: ICNTT + Integer(kind = i4) :: ICRS ! __________________________________________________________ Call UNIINV (XDONT, IWRKT) ICNTT = 0 Do ICRS = 1, Size(XDONT) - ICNTT(IWRKT(ICRS)) = ICNTT(IWRKT(ICRS)) + 1 + ICNTT(IWRKT(ICRS)) = ICNTT(IWRKT(ICRS)) + 1 End Do Do ICRS = 1, Size(XDONT) - IMULT(ICRS) = ICNTT(IWRKT(ICRS)) + IMULT(ICRS) = ICNTT(IWRKT(ICRS)) End Do ! @@ -6246,21 +6246,21 @@ Subroutine R_mulcnt (XDONT, IMULT) ! Michel Olagnon - Mar. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IMULT + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IMULT ! __________________________________________________________ ! - Integer(kind=i4), Dimension (Size(XDONT)) :: IWRKT - Integer(kind=i4), Dimension (Size(XDONT)) :: ICNTT - Integer(kind=i4) :: ICRS + Integer(kind = i4), Dimension (Size(XDONT)) :: IWRKT + Integer(kind = i4), Dimension (Size(XDONT)) :: ICNTT + Integer(kind = i4) :: ICRS ! __________________________________________________________ Call UNIINV (XDONT, IWRKT) ICNTT = 0 Do ICRS = 1, Size(XDONT) - ICNTT(IWRKT(ICRS)) = ICNTT(IWRKT(ICRS)) + 1 + ICNTT(IWRKT(ICRS)) = ICNTT(IWRKT(ICRS)) + 1 End Do Do ICRS = 1, Size(XDONT) - IMULT(ICRS) = ICNTT(IWRKT(ICRS)) + IMULT(ICRS) = ICNTT(IWRKT(ICRS)) End Do ! @@ -6273,21 +6273,21 @@ Subroutine I_mulcnt (XDONT, IMULT) ! Michel Olagnon - Mar. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IMULT + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IMULT ! __________________________________________________________ ! - Integer(kind=i4), Dimension (Size(XDONT)) :: IWRKT - Integer(kind=i4), Dimension (Size(XDONT)) :: ICNTT - Integer(kind=i4) :: ICRS + Integer(kind = i4), Dimension (Size(XDONT)) :: IWRKT + Integer(kind = i4), Dimension (Size(XDONT)) :: ICNTT + Integer(kind = i4) :: ICRS ! __________________________________________________________ Call UNIINV (XDONT, IWRKT) ICNTT = 0 Do ICRS = 1, Size(XDONT) - ICNTT(IWRKT(ICRS)) = ICNTT(IWRKT(ICRS)) + 1 + ICNTT(IWRKT(ICRS)) = ICNTT(IWRKT(ICRS)) + 1 End Do Do ICRS = 1, Size(XDONT) - IMULT(ICRS) = ICNTT(IWRKT(ICRS)) + IMULT(ICRS) = ICNTT(IWRKT(ICRS)) End Do ! @@ -6310,100 +6310,100 @@ Subroutine D_rapknr (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2011 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(kind=dp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX + real(kind = dp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) IRNGT (1) = 1 - Return + If (NORD >= 1) IRNGT (1) = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of high values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + Return End If ! --- If (XDONT(3) > XDONT(ILOWT(1))) Then - ILOWT (2) = ILOWT (1) - If (XDONT(3) > XDONT(IHIGT(1))) Then - ILOWT (1) = IHIGT (1) - IHIGT (1) = 3 - Else - ILOWT (1) = 3 - End If + ILOWT (2) = ILOWT (1) + If (XDONT(3) > XDONT(IHIGT(1))) Then + ILOWT (1) = IHIGT (1) + IHIGT (1) = 3 + Else + ILOWT (1) = 3 + End If Else - ILOWT (2) = 3 + ILOWT (2) = 3 End If ! --- If (NDON < 4) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - If (NORD >= 3) IRNGT (3) = ILOWT (2) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + If (NORD >= 3) IRNGT (3) = ILOWT (2) + Return End If ! If (XDONT(NDON) > XDONT(ILOWT(1))) Then - ILOWT (3) = ILOWT (2) - ILOWT (2) = ILOWT (1) - If (XDONT(NDON) > XDONT(IHIGT(1))) Then - ILOWT (1) = IHIGT (1) - IHIGT (1) = NDON - Else - ILOWT (1) = NDON - End If + ILOWT (3) = ILOWT (2) + ILOWT (2) = ILOWT (1) + If (XDONT(NDON) > XDONT(IHIGT(1))) Then + ILOWT (1) = IHIGT (1) + IHIGT (1) = NDON + Else + ILOWT (1) = NDON + End If Else - if (XDONT (NDON) > XDONT (ILOWT(2))) Then - ILOWT (3) = ILOWT (2) - ILOWT (2) = NDON - else - ILOWT (3) = NDON - end if + if (XDONT (NDON) > XDONT (ILOWT(2))) Then + ILOWT (3) = ILOWT (2) + ILOWT (2) = NDON + else + ILOWT (3) = NDON + end if End If ! If (NDON < 5) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - If (NORD >= 3) IRNGT (3) = ILOWT (2) - If (NORD >= 4) IRNGT (4) = ILOWT (3) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + If (NORD >= 3) IRNGT (3) = ILOWT (2) + If (NORD >= 4) IRNGT (4) = ILOWT (3) + Return End If ! --- JDEB = 0 IDEB = JDEB + 1 JHIG = IDEB JLOW = 3 - XPIV = XDONT (IHIGT(IDEB)) + REAL(2*NORD,dp)/REAL(NDON+NORD,dp) * & - (XDONT(ILOWT(3))-XDONT(IHIGT(IDEB))) + XPIV = XDONT (IHIGT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(ILOWT(3)) - XDONT(IHIGT(IDEB))) If (XPIV >= XDONT(ILOWT(1))) Then - XPIV = XDONT (IHIGT(IDEB)) + REAL(2*NORD,dp)/REAL(NDON+NORD,dp) * & - (XDONT(ILOWT(2))-XDONT(IHIGT(IDEB))) - If (XPIV >= XDONT(ILOWT(1))) & - XPIV = XDONT (IHIGT(IDEB)) + REAL(2*NORD,dp) / REAL(NDON+NORD,dp) * & - (XDONT(ILOWT(1))-XDONT(IHIGT(IDEB))) + XPIV = XDONT (IHIGT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(ILOWT(2)) - XDONT(IHIGT(IDEB))) + If (XPIV >= XDONT(ILOWT(1))) & + XPIV = XDONT (IHIGT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(ILOWT(1)) - XDONT(IHIGT(IDEB))) End If XPIV0 = XPIV ! --- @@ -6416,62 +6416,62 @@ Subroutine D_rapknr (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) < XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) < XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + If (JHIG >= NORD) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more low values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) < XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - If (JHIG >= NORD) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more low values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! --- + If (XDONT(ICRS) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! --- Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - If (JHIG >= NORD) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + If (JHIG >= NORD) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) >= XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) >= XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - End If - End Do - End If + End Do + End If End If ! --- JLM2 = 0 @@ -6479,318 +6479,318 @@ Subroutine D_rapknr (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JHIG == NORD) Exit - If (JHM2 == JHIG .And. JLM2 == JLOW) Then - ! - ! We are oscillating. Perturbate by bringing JHIG closer by one - ! to NORD - ! - If (NORD > JHIG) Then - XMAX = XDONT (ILOWT(1)) - ILOW = 1 - Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - XMAX = XDONT (ILOWT(ICRS)) - ILOW = ICRS - End If - End Do - ! - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ILOW) - ILOWT (ILOW) = ILOWT (JLOW) - JLOW = JLOW - 1 - Else - IHIG = IHIGT (JHIG) - XMIN = XDONT (IHIG) - Do ICRS = 1, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - IWRK = IHIGT (ICRS) - XMIN = XDONT (IWRK) - IHIGT (ICRS) = IHIG - IHIG = IWRK - End If - End Do - JHIG = JHIG - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! --- - ! We try to bring the number of values in the high values set - ! closer to NORD. - ! - Select Case (NORD-JHIG) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JLOW) -!!!!! CASE DEFAULT -!!!!! write (*,*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the low values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(ILOWT(1)) >= XDONT(ILOWT(2))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (1) - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (2) - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (2) - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (1) - End If - Exit - ! --- - Case (3) - ! - ! - IWRK1 = ILOWT (1) - IWRK2 = ILOWT (2) - IWRK3 = ILOWT (3) - If (XDONT(IWRK2) > XDONT(IWRK1)) Then - ILOWT (1) = IWRK2 - ILOWT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) < XDONT(IWRK3)) Then - ILOWT (3) = IWRK2 - ILOWT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) > XDONT(ILOWT(1))) Then - ILOWT (2) = ILOWT (1) - ILOWT (1) = IWRK2 - End If - End If - JLOW = 0 - Do ICRS = JHIG + 1, NORD - JLOW = JLOW + 1 - IHIGT (ICRS) = ILOWT (JLOW) - End Do - JHIG = NORD - Exit - ! --- - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JLOW - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = ILOWT (1) - IWRK2 = ILOWT (2) - IWRK3 = ILOWT (IFIN) - If (XDONT(IWRK2) > XDONT(IWRK1)) Then - ILOWT (1) = IWRK2 - ILOWT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) < XDONT(IWRK3)) Then - ILOWT (IFIN) = IWRK2 - ILOWT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) > XDONT(IHIGT(1))) Then - ILOWT (2) = ILOWT (1) - ILOWT (1) = IWRK2 - End If - End If - ! - JDEB = JHIG - NWRK = NORD - JHIG - IWRK1 = ILOWT (1) - JHIG = JHIG + 1 - IHIGT (JHIG) = IWRK1 - XPIV = XDONT (IWRK1) + REAL(NWRK,dp) / REAL(NORD+NWRK,dp) * & - (XDONT(ILOWT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values >= pivot to IHIGT - ! Again, 2 parts, one where we take care of the remaining - ! low values because we might still need them, and the - ! other when we know that we will have more than enough - ! high values in the end. - ! --- - JLOW = 0 - Do ICRS = 2, IFIN - If (XDONT(ILOWT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (JHIG >= NORD) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - End If - End Do - End Select - ! --- - ! - Case (1) - ! - ! Only 1 value is missing in high part - ! + if (JHIG == NORD) Exit + If (JHM2 == JHIG .And. JLM2 == JLOW) Then + ! + ! We are oscillating. Perturbate by bringing JHIG closer by one + ! to NORD + ! + If (NORD > JHIG) Then XMAX = XDONT (ILOWT(1)) ILOW = 1 Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - XMAX = XDONT (ILOWT(ICRS)) - ILOW = ICRS - End If + If (XDONT(ILOWT(ICRS)) > XMAX) Then + XMAX = XDONT (ILOWT(ICRS)) + ILOW = ICRS + End If End Do ! JHIG = JHIG + 1 IHIGT (JHIG) = ILOWT (ILOW) - Exit - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + ILOWT (ILOW) = ILOWT (JLOW) + JLOW = JLOW - 1 + Else + IHIG = IHIGT (JHIG) + XMIN = XDONT (IHIG) + Do ICRS = 1, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + IWRK = IHIGT (ICRS) + XMIN = XDONT (IWRK) + IHIGT (ICRS) = IHIG + IHIG = IWRK + End If + End Do + JHIG = JHIG - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! --- + ! We try to bring the number of values in the high values set + ! closer to NORD. + ! + Select Case (NORD - JHIG) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JLOW) + !!!!! CASE DEFAULT + !!!!! write (*,*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the low values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(ILOWT(1)) >= XDONT(ILOWT(2))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (1) + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (2) + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (2) + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (1) + End If Exit ! --- - ! - Case (-5:-1) - ! - ! Only few values too many in high part - ! - IRNGT (1) = IHIGT (1) - Do ICRS = 2, NORD - IWRK = IHIGT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK > XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - Do ICRS = NORD + 1, JHIG - If (XDONT(IHIGT (ICRS)) > XWRK1) Then - XWRK = XDONT (IHIGT (ICRS)) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK <= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = IHIGT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If + Case (3) + ! + ! + IWRK1 = ILOWT (1) + IWRK2 = ILOWT (2) + IWRK3 = ILOWT (3) + If (XDONT(IWRK2) > XDONT(IWRK1)) Then + ILOWT (1) = IWRK2 + ILOWT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) < XDONT(IWRK3)) Then + ILOWT (3) = IWRK2 + ILOWT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) > XDONT(ILOWT(1))) Then + ILOWT (2) = ILOWT (1) + ILOWT (1) = IWRK2 + End If + End If + JLOW = 0 + Do ICRS = JHIG + 1, NORD + JLOW = JLOW + 1 + IHIGT (ICRS) = ILOWT (JLOW) End Do - ! - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in high part - ! --- - IDEB = JDEB + 1 - IMIL = (JHIG+IDEB) / 2 - IFIN = JHIG + JHIG = NORD + Exit ! --- - ! One chooses a pivot from 1st, last, and middle values + Case (4 :) ! - If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then - IWRK = IHIGT (IDEB) - IHIGT (IDEB) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - End If - If (XDONT(IHIGT(IMIL)) < XDONT(IHIGT(IFIN))) Then - IWRK = IHIGT (IFIN) - IHIGT (IFIN) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then - IWRK = IHIGT (IDEB) - IHIGT (IDEB) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! --- - XPIV = XDONT (IHIGT(1)) + REAL(NORD,sp)/REAL(JHIG+NORD,sp) * & - (XDONT(IHIGT(IFIN))-XDONT(IHIGT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + REAL(2*NORD-JDEB,dp)/REAL(JHIG+NORD,dp) * & - (XDONT(IHIGT(IFIN))-XPIV0) - Else - IDEB = 1 - End If ! - ! One takes values < XPIV to ILOWT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough high values + XPIV0 = XPIV + IFIN = JLOW + ! + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = ILOWT (1) + IWRK2 = ILOWT (2) + IWRK3 = ILOWT (IFIN) + If (XDONT(IWRK2) > XDONT(IWRK1)) Then + ILOWT (1) = IWRK2 + ILOWT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) < XDONT(IWRK3)) Then + ILOWT (IFIN) = IWRK2 + ILOWT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) > XDONT(IHIGT(1))) Then + ILOWT (2) = ILOWT (1) + ILOWT (1) = IWRK2 + End If + End If + ! + JDEB = JHIG + NWRK = NORD - JHIG + IWRK1 = ILOWT (1) + JHIG = JHIG + 1 + IHIGT (JHIG) = IWRK1 + XPIV = XDONT (IWRK1) + REAL(NWRK, dp) / REAL(NORD + NWRK, dp) * & + (XDONT(ILOWT(IFIN)) - XDONT(IWRK1)) + ! + ! One takes values >= pivot to IHIGT + ! Again, 2 parts, one where we take care of the remaining + ! low values because we might still need them, and the + ! other when we know that we will have more than enough + ! high values in the end. ! --- JLOW = 0 - JHIG = JDEB + Do ICRS = 2, IFIN + If (XDONT(ILOWT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (JHIG >= NORD) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + End If + End Do + End Select + ! --- + ! + Case (1) + ! + ! Only 1 value is missing in high part + ! + XMAX = XDONT (ILOWT(1)) + ILOW = 1 + Do ICRS = 2, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + XMAX = XDONT (ILOWT(ICRS)) + ILOW = ICRS + End If + End Do + ! + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ILOW) + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! --- + ! + Case (-5 : -1) + ! + ! Only few values too many in high part + ! + IRNGT (1) = IHIGT (1) + Do ICRS = 2, NORD + IWRK = IHIGT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK > XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + Do ICRS = NORD + 1, JHIG + If (XDONT(IHIGT (ICRS)) > XWRK1) Then + XWRK = XDONT (IHIGT (ICRS)) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK <= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = IHIGT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do + ! + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in high part + ! --- + IDEB = JDEB + 1 + IMIL = (JHIG + IDEB) / 2 + IFIN = JHIG + ! --- + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then + IWRK = IHIGT (IDEB) + IHIGT (IDEB) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + End If + If (XDONT(IHIGT(IMIL)) < XDONT(IHIGT(IFIN))) Then + IWRK = IHIGT (IFIN) + IHIGT (IFIN) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then + IWRK = IHIGT (IDEB) + IHIGT (IDEB) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! --- + XPIV = XDONT (IHIGT(1)) + REAL(NORD, sp) / REAL(JHIG + NORD, sp) * & + (XDONT(IHIGT(IFIN)) - XDONT(IHIGT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + REAL(2 * NORD - JDEB, dp) / REAL(JHIG + NORD, dp) * & + (XDONT(IHIGT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values < XPIV to ILOWT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough high values + ! --- + JLOW = 0 + JHIG = JDEB + ! --- + If (XDONT(IHIGT(IFIN)) < XPIV) Then + ICRS = JDEB + Do + ICRS = ICRS + 1 + If (XDONT(IHIGT(ICRS)) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (ICRS >= IFIN) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + If (JHIG >= NORD) Exit + End If + End Do ! --- - If (XDONT(IHIGT(IFIN)) < XPIV) Then - ICRS = JDEB - Do - ICRS = ICRS + 1 - If (XDONT(IHIGT(ICRS)) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (ICRS >= IFIN) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - If (JHIG >= NORD) Exit - End If - End Do - ! --- - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(IHIGT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = IDEB, IFIN - If (XDONT(IHIGT(ICRS)) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - If (JHIG >= NORD) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - End If - ! - End Select - ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(IHIGT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = IDEB, IFIN + If (XDONT(IHIGT(ICRS)) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + If (JHIG >= NORD) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! --- ! Now, we only need to complete ranking of the 1:NORD set @@ -6798,16 +6798,16 @@ Subroutine D_rapknr (XDONT, IRNGT, NORD) ! IRNGT (1) = IHIGT (1) Do ICRS = 2, NORD - IWRK = IHIGT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK > XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = IHIGT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK > XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -6832,100 +6832,100 @@ Subroutine R_rapknr (XDONT, IRNGT, NORD) ! __________________________________________________________ ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX + Real(kind = sp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) IRNGT (1) = 1 - Return + If (NORD >= 1) IRNGT (1) = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of high values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + Return End If ! --- If (XDONT(3) > XDONT(ILOWT(1))) Then - ILOWT (2) = ILOWT (1) - If (XDONT(3) > XDONT(IHIGT(1))) Then - ILOWT (1) = IHIGT (1) - IHIGT (1) = 3 - Else - ILOWT (1) = 3 - End If + ILOWT (2) = ILOWT (1) + If (XDONT(3) > XDONT(IHIGT(1))) Then + ILOWT (1) = IHIGT (1) + IHIGT (1) = 3 + Else + ILOWT (1) = 3 + End If Else - ILOWT (2) = 3 + ILOWT (2) = 3 End If ! --- If (NDON < 4) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - If (NORD >= 3) IRNGT (3) = ILOWT (2) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + If (NORD >= 3) IRNGT (3) = ILOWT (2) + Return End If ! If (XDONT(NDON) > XDONT(ILOWT(1))) Then - ILOWT (3) = ILOWT (2) - ILOWT (2) = ILOWT (1) - If (XDONT(NDON) > XDONT(IHIGT(1))) Then - ILOWT (1) = IHIGT (1) - IHIGT (1) = NDON - Else - ILOWT (1) = NDON - End If + ILOWT (3) = ILOWT (2) + ILOWT (2) = ILOWT (1) + If (XDONT(NDON) > XDONT(IHIGT(1))) Then + ILOWT (1) = IHIGT (1) + IHIGT (1) = NDON + Else + ILOWT (1) = NDON + End If Else - if (XDONT (NDON) > XDONT (ILOWT(2))) Then - ILOWT (3) = ILOWT (2) - ILOWT (2) = NDON - else - ILOWT (3) = NDON - end if + if (XDONT (NDON) > XDONT (ILOWT(2))) Then + ILOWT (3) = ILOWT (2) + ILOWT (2) = NDON + else + ILOWT (3) = NDON + end if End If ! If (NDON < 5) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - If (NORD >= 3) IRNGT (3) = ILOWT (2) - If (NORD >= 4) IRNGT (4) = ILOWT (3) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + If (NORD >= 3) IRNGT (3) = ILOWT (2) + If (NORD >= 4) IRNGT (4) = ILOWT (3) + Return End If ! --- JDEB = 0 IDEB = JDEB + 1 JHIG = IDEB JLOW = 3 - XPIV = XDONT (IHIGT(IDEB)) + REAL(2*NORD,sp)/REAL(NDON+NORD,sp) * & - (XDONT(ILOWT(3))-XDONT(IHIGT(IDEB))) + XPIV = XDONT (IHIGT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(ILOWT(3)) - XDONT(IHIGT(IDEB))) If (XPIV >= XDONT(ILOWT(1))) Then - XPIV = XDONT (IHIGT(IDEB)) + REAL(2*NORD,sp)/REAL(NDON+NORD,sp) * & - (XDONT(ILOWT(2))-XDONT(IHIGT(IDEB))) - If (XPIV >= XDONT(ILOWT(1))) & - XPIV = XDONT (IHIGT(IDEB)) + REAL(2*NORD,sp) / REAL(NDON+NORD,sp) * & - (XDONT(ILOWT(1))-XDONT(IHIGT(IDEB))) + XPIV = XDONT (IHIGT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(ILOWT(2)) - XDONT(IHIGT(IDEB))) + If (XPIV >= XDONT(ILOWT(1))) & + XPIV = XDONT (IHIGT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(ILOWT(1)) - XDONT(IHIGT(IDEB))) End If XPIV0 = XPIV ! --- @@ -6938,62 +6938,62 @@ Subroutine R_rapknr (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) < XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) < XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + If (JHIG >= NORD) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more low values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) < XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - If (JHIG >= NORD) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more low values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! --- + If (XDONT(ICRS) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! --- Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - If (JHIG >= NORD) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + If (JHIG >= NORD) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) >= XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) >= XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - End If - End Do - End If + End Do + End If End If ! --- JLM2 = 0 @@ -7001,318 +7001,318 @@ Subroutine R_rapknr (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JHIG == NORD) Exit - If (JHM2 == JHIG .And. JLM2 == JLOW) Then - ! - ! We are oscillating. Perturbate by bringing JHIG closer by one - ! to NORD - ! - If (NORD > JHIG) Then - XMAX = XDONT (ILOWT(1)) - ILOW = 1 - Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - XMAX = XDONT (ILOWT(ICRS)) - ILOW = ICRS - End If - End Do - ! - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ILOW) - ILOWT (ILOW) = ILOWT (JLOW) - JLOW = JLOW - 1 - Else - IHIG = IHIGT (JHIG) - XMIN = XDONT (IHIG) - Do ICRS = 1, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - IWRK = IHIGT (ICRS) - XMIN = XDONT (IWRK) - IHIGT (ICRS) = IHIG - IHIG = IWRK - End If - End Do - JHIG = JHIG - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! --- - ! We try to bring the number of values in the high values set - ! closer to NORD. - ! - Select Case (NORD-JHIG) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JLOW) -!!!!! CASE DEFAULT -!!!!! write (*,*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the low values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(ILOWT(1)) >= XDONT(ILOWT(2))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (1) - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (2) - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (2) - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (1) - End If - Exit - ! --- - Case (3) - ! - ! - IWRK1 = ILOWT (1) - IWRK2 = ILOWT (2) - IWRK3 = ILOWT (3) - If (XDONT(IWRK2) > XDONT(IWRK1)) Then - ILOWT (1) = IWRK2 - ILOWT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) < XDONT(IWRK3)) Then - ILOWT (3) = IWRK2 - ILOWT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) > XDONT(ILOWT(1))) Then - ILOWT (2) = ILOWT (1) - ILOWT (1) = IWRK2 - End If - End If - JLOW = 0 - Do ICRS = JHIG + 1, NORD - JLOW = JLOW + 1 - IHIGT (ICRS) = ILOWT (JLOW) - End Do - JHIG = NORD - Exit - ! --- - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JLOW - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = ILOWT (1) - IWRK2 = ILOWT (2) - IWRK3 = ILOWT (IFIN) - If (XDONT(IWRK2) > XDONT(IWRK1)) Then - ILOWT (1) = IWRK2 - ILOWT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) < XDONT(IWRK3)) Then - ILOWT (IFIN) = IWRK2 - ILOWT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) > XDONT(IHIGT(1))) Then - ILOWT (2) = ILOWT (1) - ILOWT (1) = IWRK2 - End If - End If - ! - JDEB = JHIG - NWRK = NORD - JHIG - IWRK1 = ILOWT (1) - JHIG = JHIG + 1 - IHIGT (JHIG) = IWRK1 - XPIV = XDONT (IWRK1) + REAL(NWRK,sp) / REAL(NORD+NWRK,sp) * & - (XDONT(ILOWT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values >= pivot to IHIGT - ! Again, 2 parts, one where we take care of the remaining - ! low values because we might still need them, and the - ! other when we know that we will have more than enough - ! high values in the end. - ! --- - JLOW = 0 - Do ICRS = 2, IFIN - If (XDONT(ILOWT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (JHIG >= NORD) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - End If - End Do - End Select - ! --- - ! - Case (1) - ! - ! Only 1 value is missing in high part - ! + if (JHIG == NORD) Exit + If (JHM2 == JHIG .And. JLM2 == JLOW) Then + ! + ! We are oscillating. Perturbate by bringing JHIG closer by one + ! to NORD + ! + If (NORD > JHIG) Then XMAX = XDONT (ILOWT(1)) ILOW = 1 Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - XMAX = XDONT (ILOWT(ICRS)) - ILOW = ICRS - End If + If (XDONT(ILOWT(ICRS)) > XMAX) Then + XMAX = XDONT (ILOWT(ICRS)) + ILOW = ICRS + End If End Do ! JHIG = JHIG + 1 IHIGT (JHIG) = ILOWT (ILOW) - Exit - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + ILOWT (ILOW) = ILOWT (JLOW) + JLOW = JLOW - 1 + Else + IHIG = IHIGT (JHIG) + XMIN = XDONT (IHIG) + Do ICRS = 1, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + IWRK = IHIGT (ICRS) + XMIN = XDONT (IWRK) + IHIGT (ICRS) = IHIG + IHIG = IWRK + End If + End Do + JHIG = JHIG - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! --- + ! We try to bring the number of values in the high values set + ! closer to NORD. + ! + Select Case (NORD - JHIG) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JLOW) + !!!!! CASE DEFAULT + !!!!! write (*,*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the low values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(ILOWT(1)) >= XDONT(ILOWT(2))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (1) + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (2) + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (2) + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (1) + End If Exit ! --- - ! - Case (-5:-1) - ! - ! Only few values too many in high part - ! - IRNGT (1) = IHIGT (1) - Do ICRS = 2, NORD - IWRK = IHIGT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK > XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - Do ICRS = NORD + 1, JHIG - If (XDONT(IHIGT (ICRS)) > XWRK1) Then - XWRK = XDONT (IHIGT (ICRS)) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK <= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = IHIGT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If + Case (3) + ! + ! + IWRK1 = ILOWT (1) + IWRK2 = ILOWT (2) + IWRK3 = ILOWT (3) + If (XDONT(IWRK2) > XDONT(IWRK1)) Then + ILOWT (1) = IWRK2 + ILOWT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) < XDONT(IWRK3)) Then + ILOWT (3) = IWRK2 + ILOWT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) > XDONT(ILOWT(1))) Then + ILOWT (2) = ILOWT (1) + ILOWT (1) = IWRK2 + End If + End If + JLOW = 0 + Do ICRS = JHIG + 1, NORD + JLOW = JLOW + 1 + IHIGT (ICRS) = ILOWT (JLOW) End Do - ! - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in high part - ! --- - IDEB = JDEB + 1 - IMIL = (JHIG+IDEB) / 2 - IFIN = JHIG + JHIG = NORD + Exit ! --- - ! One chooses a pivot from 1st, last, and middle values + Case (4 :) ! - If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then - IWRK = IHIGT (IDEB) - IHIGT (IDEB) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - End If - If (XDONT(IHIGT(IMIL)) < XDONT(IHIGT(IFIN))) Then - IWRK = IHIGT (IFIN) - IHIGT (IFIN) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then - IWRK = IHIGT (IDEB) - IHIGT (IDEB) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! --- - XPIV = XDONT (IHIGT(1)) + REAL(NORD,sp)/REAL(JHIG+NORD,sp) * & - (XDONT(IHIGT(IFIN))-XDONT(IHIGT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + REAL(2*NORD-JDEB,sp)/REAL(JHIG+NORD,sp) * & - (XDONT(IHIGT(IFIN))-XPIV0) - Else - IDEB = 1 - End If ! - ! One takes values < XPIV to ILOWT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough high values + XPIV0 = XPIV + IFIN = JLOW + ! + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = ILOWT (1) + IWRK2 = ILOWT (2) + IWRK3 = ILOWT (IFIN) + If (XDONT(IWRK2) > XDONT(IWRK1)) Then + ILOWT (1) = IWRK2 + ILOWT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) < XDONT(IWRK3)) Then + ILOWT (IFIN) = IWRK2 + ILOWT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) > XDONT(IHIGT(1))) Then + ILOWT (2) = ILOWT (1) + ILOWT (1) = IWRK2 + End If + End If + ! + JDEB = JHIG + NWRK = NORD - JHIG + IWRK1 = ILOWT (1) + JHIG = JHIG + 1 + IHIGT (JHIG) = IWRK1 + XPIV = XDONT (IWRK1) + REAL(NWRK, sp) / REAL(NORD + NWRK, sp) * & + (XDONT(ILOWT(IFIN)) - XDONT(IWRK1)) + ! + ! One takes values >= pivot to IHIGT + ! Again, 2 parts, one where we take care of the remaining + ! low values because we might still need them, and the + ! other when we know that we will have more than enough + ! high values in the end. ! --- JLOW = 0 - JHIG = JDEB + Do ICRS = 2, IFIN + If (XDONT(ILOWT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (JHIG >= NORD) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + End If + End Do + End Select + ! --- + ! + Case (1) + ! + ! Only 1 value is missing in high part + ! + XMAX = XDONT (ILOWT(1)) + ILOW = 1 + Do ICRS = 2, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + XMAX = XDONT (ILOWT(ICRS)) + ILOW = ICRS + End If + End Do + ! + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ILOW) + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! --- + ! + Case (-5 : -1) + ! + ! Only few values too many in high part + ! + IRNGT (1) = IHIGT (1) + Do ICRS = 2, NORD + IWRK = IHIGT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK > XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + Do ICRS = NORD + 1, JHIG + If (XDONT(IHIGT (ICRS)) > XWRK1) Then + XWRK = XDONT (IHIGT (ICRS)) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK <= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = IHIGT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do + ! + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in high part + ! --- + IDEB = JDEB + 1 + IMIL = (JHIG + IDEB) / 2 + IFIN = JHIG + ! --- + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then + IWRK = IHIGT (IDEB) + IHIGT (IDEB) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + End If + If (XDONT(IHIGT(IMIL)) < XDONT(IHIGT(IFIN))) Then + IWRK = IHIGT (IFIN) + IHIGT (IFIN) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then + IWRK = IHIGT (IDEB) + IHIGT (IDEB) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! --- + XPIV = XDONT (IHIGT(1)) + REAL(NORD, sp) / REAL(JHIG + NORD, sp) * & + (XDONT(IHIGT(IFIN)) - XDONT(IHIGT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + REAL(2 * NORD - JDEB, sp) / REAL(JHIG + NORD, sp) * & + (XDONT(IHIGT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values < XPIV to ILOWT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough high values + ! --- + JLOW = 0 + JHIG = JDEB + ! --- + If (XDONT(IHIGT(IFIN)) < XPIV) Then + ICRS = JDEB + Do + ICRS = ICRS + 1 + If (XDONT(IHIGT(ICRS)) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (ICRS >= IFIN) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + If (JHIG >= NORD) Exit + End If + End Do ! --- - If (XDONT(IHIGT(IFIN)) < XPIV) Then - ICRS = JDEB - Do - ICRS = ICRS + 1 - If (XDONT(IHIGT(ICRS)) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (ICRS >= IFIN) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - If (JHIG >= NORD) Exit - End If - End Do - ! --- - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(IHIGT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = IDEB, IFIN - If (XDONT(IHIGT(ICRS)) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - If (JHIG >= NORD) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - End If - ! - End Select - ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(IHIGT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = IDEB, IFIN + If (XDONT(IHIGT(ICRS)) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + If (JHIG >= NORD) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! --- ! Now, we only need to complete ranking of the 1:NORD set @@ -7320,16 +7320,16 @@ Subroutine R_rapknr (XDONT, IRNGT, NORD) ! IRNGT (1) = IHIGT (1) Do ICRS = 2, NORD - IWRK = IHIGT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK > XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = IHIGT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK > XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -7354,100 +7354,100 @@ Subroutine I_rapknr (XDONT, IRNGT, NORD) ! __________________________________________________________ ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX + Integer(kind = i4) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) IRNGT (1) = 1 - Return + If (NORD >= 1) IRNGT (1) = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of high values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + Return End If ! --- If (XDONT(3) > XDONT(ILOWT(1))) Then - ILOWT (2) = ILOWT (1) - If (XDONT(3) > XDONT(IHIGT(1))) Then - ILOWT (1) = IHIGT (1) - IHIGT (1) = 3 - Else - ILOWT (1) = 3 - End If + ILOWT (2) = ILOWT (1) + If (XDONT(3) > XDONT(IHIGT(1))) Then + ILOWT (1) = IHIGT (1) + IHIGT (1) = 3 + Else + ILOWT (1) = 3 + End If Else - ILOWT (2) = 3 + ILOWT (2) = 3 End If ! --- If (NDON < 4) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - If (NORD >= 3) IRNGT (3) = ILOWT (2) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + If (NORD >= 3) IRNGT (3) = ILOWT (2) + Return End If ! If (XDONT(NDON) > XDONT(ILOWT(1))) Then - ILOWT (3) = ILOWT (2) - ILOWT (2) = ILOWT (1) - If (XDONT(NDON) > XDONT(IHIGT(1))) Then - ILOWT (1) = IHIGT (1) - IHIGT (1) = NDON - Else - ILOWT (1) = NDON - End If + ILOWT (3) = ILOWT (2) + ILOWT (2) = ILOWT (1) + If (XDONT(NDON) > XDONT(IHIGT(1))) Then + ILOWT (1) = IHIGT (1) + IHIGT (1) = NDON + Else + ILOWT (1) = NDON + End If Else - if (XDONT (NDON) > XDONT (ILOWT(2))) Then - ILOWT (3) = ILOWT (2) - ILOWT (2) = NDON - else - ILOWT (3) = NDON - end if + if (XDONT (NDON) > XDONT (ILOWT(2))) Then + ILOWT (3) = ILOWT (2) + ILOWT (2) = NDON + else + ILOWT (3) = NDON + end if End If ! If (NDON < 5) Then - If (NORD >= 1) IRNGT (1) = IHIGT (1) - If (NORD >= 2) IRNGT (2) = ILOWT (1) - If (NORD >= 3) IRNGT (3) = ILOWT (2) - If (NORD >= 4) IRNGT (4) = ILOWT (3) - Return + If (NORD >= 1) IRNGT (1) = IHIGT (1) + If (NORD >= 2) IRNGT (2) = ILOWT (1) + If (NORD >= 3) IRNGT (3) = ILOWT (2) + If (NORD >= 4) IRNGT (4) = ILOWT (3) + Return End If ! --- JDEB = 0 IDEB = JDEB + 1 JHIG = IDEB JLOW = 3 - XPIV = XDONT (IHIGT(IDEB)) + INT(REAL(2*NORD,sp)/REAL(NDON+NORD,sp),i4) * & - (XDONT(ILOWT(3))-XDONT(IHIGT(IDEB))) + XPIV = XDONT (IHIGT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(ILOWT(3)) - XDONT(IHIGT(IDEB))) If (XPIV >= XDONT(ILOWT(1))) Then - XPIV = XDONT (IHIGT(IDEB)) + INT(REAL(2*NORD,sp)/REAL(NDON+NORD,sp),i4) * & - (XDONT(ILOWT(2))-XDONT(IHIGT(IDEB))) - If (XPIV >= XDONT(ILOWT(1))) & - XPIV = XDONT (IHIGT(IDEB)) + INT(REAL(2*NORD,sp) / REAL(NDON+NORD,sp),i4) * & - (XDONT(ILOWT(1))-XDONT(IHIGT(IDEB))) + XPIV = XDONT (IHIGT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(ILOWT(2)) - XDONT(IHIGT(IDEB))) + If (XPIV >= XDONT(ILOWT(1))) & + XPIV = XDONT (IHIGT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(ILOWT(1)) - XDONT(IHIGT(IDEB))) End If XPIV0 = XPIV ! --- @@ -7460,62 +7460,62 @@ Subroutine I_rapknr (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) < XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) < XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + If (JHIG >= NORD) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more low values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) < XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - If (JHIG >= NORD) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more low values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! --- + If (XDONT(ICRS) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! --- Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - If (JHIG >= NORD) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + If (JHIG >= NORD) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) >= XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) >= XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - End If - End Do - End If + End Do + End If End If ! --- JLM2 = 0 @@ -7523,318 +7523,318 @@ Subroutine I_rapknr (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JHIG == NORD) Exit - If (JHM2 == JHIG .And. JLM2 == JLOW) Then - ! - ! We are oscillating. Perturbate by bringing JHIG closer by one - ! to NORD - ! - If (NORD > JHIG) Then - XMAX = XDONT (ILOWT(1)) - ILOW = 1 - Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - XMAX = XDONT (ILOWT(ICRS)) - ILOW = ICRS - End If - End Do - ! - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ILOW) - ILOWT (ILOW) = ILOWT (JLOW) - JLOW = JLOW - 1 - Else - IHIG = IHIGT (JHIG) - XMIN = XDONT (IHIG) - Do ICRS = 1, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - IWRK = IHIGT (ICRS) - XMIN = XDONT (IWRK) - IHIGT (ICRS) = IHIG - IHIG = IWRK - End If - End Do - JHIG = JHIG - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! --- - ! We try to bring the number of values in the high values set - ! closer to NORD. - ! - Select Case (NORD-JHIG) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JLOW) -!!!!! CASE DEFAULT -!!!!! write (*,*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the low values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(ILOWT(1)) >= XDONT(ILOWT(2))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (1) - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (2) - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (2) - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (1) - End If - Exit - ! --- - Case (3) - ! - ! - IWRK1 = ILOWT (1) - IWRK2 = ILOWT (2) - IWRK3 = ILOWT (3) - If (XDONT(IWRK2) > XDONT(IWRK1)) Then - ILOWT (1) = IWRK2 - ILOWT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) < XDONT(IWRK3)) Then - ILOWT (3) = IWRK2 - ILOWT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) > XDONT(ILOWT(1))) Then - ILOWT (2) = ILOWT (1) - ILOWT (1) = IWRK2 - End If - End If - JLOW = 0 - Do ICRS = JHIG + 1, NORD - JLOW = JLOW + 1 - IHIGT (ICRS) = ILOWT (JLOW) - End Do - JHIG = NORD - Exit - ! --- - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JLOW - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = ILOWT (1) - IWRK2 = ILOWT (2) - IWRK3 = ILOWT (IFIN) - If (XDONT(IWRK2) > XDONT(IWRK1)) Then - ILOWT (1) = IWRK2 - ILOWT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) < XDONT(IWRK3)) Then - ILOWT (IFIN) = IWRK2 - ILOWT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) > XDONT(IHIGT(1))) Then - ILOWT (2) = ILOWT (1) - ILOWT (1) = IWRK2 - End If - End If - ! - JDEB = JHIG - NWRK = NORD - JHIG - IWRK1 = ILOWT (1) - JHIG = JHIG + 1 - IHIGT (JHIG) = IWRK1 - XPIV = XDONT (IWRK1) + INT(REAL(NWRK,sp) / REAL(NORD+NWRK,sp),i4) * & - (XDONT(ILOWT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values >= pivot to IHIGT - ! Again, 2 parts, one where we take care of the remaining - ! low values because we might still need them, and the - ! other when we know that we will have more than enough - ! high values in the end. - ! --- - JLOW = 0 - Do ICRS = 2, IFIN - If (XDONT(ILOWT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (JHIG >= NORD) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - End If - End Do - End Select - ! --- - ! - Case (1) - ! - ! Only 1 value is missing in high part - ! + if (JHIG == NORD) Exit + If (JHM2 == JHIG .And. JLM2 == JLOW) Then + ! + ! We are oscillating. Perturbate by bringing JHIG closer by one + ! to NORD + ! + If (NORD > JHIG) Then XMAX = XDONT (ILOWT(1)) ILOW = 1 Do ICRS = 2, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - XMAX = XDONT (ILOWT(ICRS)) - ILOW = ICRS - End If + If (XDONT(ILOWT(ICRS)) > XMAX) Then + XMAX = XDONT (ILOWT(ICRS)) + ILOW = ICRS + End If End Do ! JHIG = JHIG + 1 IHIGT (JHIG) = ILOWT (ILOW) - Exit - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + ILOWT (ILOW) = ILOWT (JLOW) + JLOW = JLOW - 1 + Else + IHIG = IHIGT (JHIG) + XMIN = XDONT (IHIG) + Do ICRS = 1, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + IWRK = IHIGT (ICRS) + XMIN = XDONT (IWRK) + IHIGT (ICRS) = IHIG + IHIG = IWRK + End If + End Do + JHIG = JHIG - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! --- + ! We try to bring the number of values in the high values set + ! closer to NORD. + ! + Select Case (NORD - JHIG) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JLOW) + !!!!! CASE DEFAULT + !!!!! write (*,*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the low values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(ILOWT(1)) >= XDONT(ILOWT(2))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (1) + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (2) + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (2) + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (1) + End If Exit ! --- - ! - Case (-5:-1) - ! - ! Only few values too many in high part - ! - IRNGT (1) = IHIGT (1) - Do ICRS = 2, NORD - IWRK = IHIGT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK > XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - Do ICRS = NORD + 1, JHIG - If (XDONT(IHIGT (ICRS)) > XWRK1) Then - XWRK = XDONT (IHIGT (ICRS)) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK <= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = IHIGT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If + Case (3) + ! + ! + IWRK1 = ILOWT (1) + IWRK2 = ILOWT (2) + IWRK3 = ILOWT (3) + If (XDONT(IWRK2) > XDONT(IWRK1)) Then + ILOWT (1) = IWRK2 + ILOWT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) < XDONT(IWRK3)) Then + ILOWT (3) = IWRK2 + ILOWT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) > XDONT(ILOWT(1))) Then + ILOWT (2) = ILOWT (1) + ILOWT (1) = IWRK2 + End If + End If + JLOW = 0 + Do ICRS = JHIG + 1, NORD + JLOW = JLOW + 1 + IHIGT (ICRS) = ILOWT (JLOW) End Do - ! - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in high part - ! --- - IDEB = JDEB + 1 - IMIL = (JHIG+IDEB) / 2 - IFIN = JHIG + JHIG = NORD + Exit ! --- - ! One chooses a pivot from 1st, last, and middle values + Case (4 :) ! - If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then - IWRK = IHIGT (IDEB) - IHIGT (IDEB) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - End If - If (XDONT(IHIGT(IMIL)) < XDONT(IHIGT(IFIN))) Then - IWRK = IHIGT (IFIN) - IHIGT (IFIN) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then - IWRK = IHIGT (IDEB) - IHIGT (IDEB) = IHIGT (IMIL) - IHIGT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! --- - XPIV = XDONT (IHIGT(1)) + INT(REAL(NORD,sp)/REAL(JHIG+NORD,sp),i4) * & - (XDONT(IHIGT(IFIN))-XDONT(IHIGT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + INT(REAL(2*NORD-JDEB,sp)/REAL(JHIG+NORD,sp),i4) * & - (XDONT(IHIGT(IFIN))-XPIV0) - Else - IDEB = 1 - End If ! - ! One takes values < XPIV to ILOWT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough high values + XPIV0 = XPIV + IFIN = JLOW + ! + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = ILOWT (1) + IWRK2 = ILOWT (2) + IWRK3 = ILOWT (IFIN) + If (XDONT(IWRK2) > XDONT(IWRK1)) Then + ILOWT (1) = IWRK2 + ILOWT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) < XDONT(IWRK3)) Then + ILOWT (IFIN) = IWRK2 + ILOWT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) > XDONT(IHIGT(1))) Then + ILOWT (2) = ILOWT (1) + ILOWT (1) = IWRK2 + End If + End If + ! + JDEB = JHIG + NWRK = NORD - JHIG + IWRK1 = ILOWT (1) + JHIG = JHIG + 1 + IHIGT (JHIG) = IWRK1 + XPIV = XDONT (IWRK1) + INT(REAL(NWRK, sp) / REAL(NORD + NWRK, sp), i4) * & + (XDONT(ILOWT(IFIN)) - XDONT(IWRK1)) + ! + ! One takes values >= pivot to IHIGT + ! Again, 2 parts, one where we take care of the remaining + ! low values because we might still need them, and the + ! other when we know that we will have more than enough + ! high values in the end. ! --- JLOW = 0 - JHIG = JDEB + Do ICRS = 2, IFIN + If (XDONT(ILOWT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (JHIG >= NORD) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + End If + End Do + End Select + ! --- + ! + Case (1) + ! + ! Only 1 value is missing in high part + ! + XMAX = XDONT (ILOWT(1)) + ILOW = 1 + Do ICRS = 2, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + XMAX = XDONT (ILOWT(ICRS)) + ILOW = ICRS + End If + End Do + ! + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ILOW) + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! --- + ! + Case (-5 : -1) + ! + ! Only few values too many in high part + ! + IRNGT (1) = IHIGT (1) + Do ICRS = 2, NORD + IWRK = IHIGT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK > XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + Do ICRS = NORD + 1, JHIG + If (XDONT(IHIGT (ICRS)) > XWRK1) Then + XWRK = XDONT (IHIGT (ICRS)) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK <= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = IHIGT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do + ! + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in high part + ! --- + IDEB = JDEB + 1 + IMIL = (JHIG + IDEB) / 2 + IFIN = JHIG + ! --- + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then + IWRK = IHIGT (IDEB) + IHIGT (IDEB) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + End If + If (XDONT(IHIGT(IMIL)) < XDONT(IHIGT(IFIN))) Then + IWRK = IHIGT (IFIN) + IHIGT (IFIN) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + If (XDONT(IHIGT(IMIL)) > XDONT(IHIGT(IDEB))) Then + IWRK = IHIGT (IDEB) + IHIGT (IDEB) = IHIGT (IMIL) + IHIGT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! --- + XPIV = XDONT (IHIGT(1)) + INT(REAL(NORD, sp) / REAL(JHIG + NORD, sp), i4) * & + (XDONT(IHIGT(IFIN)) - XDONT(IHIGT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + INT(REAL(2 * NORD - JDEB, sp) / REAL(JHIG + NORD, sp), i4) * & + (XDONT(IHIGT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values < XPIV to ILOWT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough high values + ! --- + JLOW = 0 + JHIG = JDEB + ! --- + If (XDONT(IHIGT(IFIN)) < XPIV) Then + ICRS = JDEB + Do + ICRS = ICRS + 1 + If (XDONT(IHIGT(ICRS)) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (ICRS >= IFIN) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + If (JHIG >= NORD) Exit + End If + End Do ! --- - If (XDONT(IHIGT(IFIN)) < XPIV) Then - ICRS = JDEB - Do - ICRS = ICRS + 1 - If (XDONT(IHIGT(ICRS)) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (ICRS >= IFIN) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - If (JHIG >= NORD) Exit - End If - End Do - ! --- - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(IHIGT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = IDEB, IFIN - If (XDONT(IHIGT(ICRS)) < XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - If (JHIG >= NORD) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) >= XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - End If - ! - End Select - ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(IHIGT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = IDEB, IFIN + If (XDONT(IHIGT(ICRS)) < XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + If (JHIG >= NORD) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) >= XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! --- ! Now, we only need to complete ranking of the 1:NORD set @@ -7842,16 +7842,16 @@ Subroutine I_rapknr (XDONT, IRNGT, NORD) ! IRNGT (1) = IHIGT (1) Do ICRS = 2, NORD - IWRK = IHIGT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK > XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = IHIGT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK > XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -7870,107 +7870,107 @@ Subroutine D_refpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(kind=dp) :: XPIV, XWRK + real(kind = dp) :: XPIV, XWRK ! __________________________________________________________ ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: IWRKT - Integer(kind=i4) :: NDON, ICRS, IDEB, IDCR, IFIN, IMIL, IWRK + Integer(kind = i4), Dimension (SIZE(XDONT)) :: IWRKT + Integer(kind = i4) :: NDON, ICRS, IDEB, IDCR, IFIN, IMIL, IWRK ! NDON = SIZE (XDONT) ! Do ICRS = 1, NDON - IWRKT (ICRS) = ICRS + IWRKT (ICRS) = ICRS End Do IDEB = 1 IFIN = NDON Do - If (IDEB >= IFIN) Exit - IMIL = (IDEB+IFIN) / 2 - ! - ! One chooses a pivot, median of 1st, last, and middle values - ! - If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then + If (IDEB >= IFIN) Exit + IMIL = (IDEB + IFIN) / 2 + ! + ! One chooses a pivot, median of 1st, last, and middle values + ! + If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then + IWRK = IWRKT (IDEB) + IWRKT (IDEB) = IWRKT (IMIL) + IWRKT (IMIL) = IWRK + End If + If (XDONT(IWRKT(IMIL)) > XDONT(IWRKT(IFIN))) Then + IWRK = IWRKT (IFIN) + IWRKT (IFIN) = IWRKT (IMIL) + IWRKT (IMIL) = IWRK + If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then IWRK = IWRKT (IDEB) IWRKT (IDEB) = IWRKT (IMIL) IWRKT (IMIL) = IWRK - End If - If (XDONT(IWRKT(IMIL)) > XDONT(IWRKT(IFIN))) Then - IWRK = IWRKT (IFIN) - IWRKT (IFIN) = IWRKT (IMIL) - IWRKT (IMIL) = IWRK - If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then - IWRK = IWRKT (IDEB) - IWRKT (IDEB) = IWRKT (IMIL) - IWRKT (IMIL) = IWRK - End If - End If - If ((IFIN-IDEB) < 3) Exit - XPIV = XDONT (IWRKT(IMIL)) - ! - ! One exchanges values to put those > pivot in the end and - ! those <= pivot at the beginning - ! - ICRS = IDEB - IDCR = IFIN - ECH2: Do - Do - ICRS = ICRS + 1 - If (ICRS >= IDCR) Then - ! - ! the first > pivot is IWRKT(IDCR) - ! the last <= pivot is IWRKT(ICRS-1) - ! Note: If one arrives here on the first iteration, then - ! the pivot is the maximum of the set, the last value is equal - ! to it, and one can reduce by one the size of the set to process, - ! as if XDONT (IWRKT(IFIN)) > XPIV - ! - Exit ECH2 - ! - End If - If (XDONT(IWRKT(ICRS)) > XPIV) Exit - End Do - Do - If (XDONT(IWRKT(IDCR)) <= XPIV) Exit - IDCR = IDCR - 1 - If (ICRS >= IDCR) Then - ! - ! The last value < pivot is always IWRKT(ICRS-1) - ! - Exit ECH2 - End If - End Do - ! - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT (ICRS) - IWRKT (ICRS) = IWRK - End Do ECH2 - ! - ! One restricts further processing to find the fractile value - ! - If (ICRS <= NORD) IDEB = ICRS - If (ICRS > NORD) IFIN = ICRS - 1 + End If + End If + If ((IFIN - IDEB) < 3) Exit + XPIV = XDONT (IWRKT(IMIL)) + ! + ! One exchanges values to put those > pivot in the end and + ! those <= pivot at the beginning + ! + ICRS = IDEB + IDCR = IFIN + ECH2 : Do + Do + ICRS = ICRS + 1 + If (ICRS >= IDCR) Then + ! + ! the first > pivot is IWRKT(IDCR) + ! the last <= pivot is IWRKT(ICRS-1) + ! Note: If one arrives here on the first iteration, then + ! the pivot is the maximum of the set, the last value is equal + ! to it, and one can reduce by one the size of the set to process, + ! as if XDONT (IWRKT(IFIN)) > XPIV + ! + Exit ECH2 + ! + End If + If (XDONT(IWRKT(ICRS)) > XPIV) Exit + End Do + Do + If (XDONT(IWRKT(IDCR)) <= XPIV) Exit + IDCR = IDCR - 1 + If (ICRS >= IDCR) Then + ! + ! The last value < pivot is always IWRKT(ICRS-1) + ! + Exit ECH2 + End If + End Do + ! + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT (ICRS) + IWRKT (ICRS) = IWRK + End Do ECH2 + ! + ! One restricts further processing to find the fractile value + ! + If (ICRS <= NORD) IDEB = ICRS + If (ICRS > NORD) IFIN = ICRS - 1 End Do ! ! Now, we only need to complete ranking of the 1:NORD set ! Assuming NORD is small, we use a simple insertion sort ! Do ICRS = 2, NORD - IWRK = IWRKT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK <= XDONT(IWRKT(IDCR))) Then - IWRKT (IDCR+1) = IWRKT (IDCR) - Else - Exit - End If - End Do - IWRKT (IDCR+1) = IWRK + IWRK = IWRKT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK <= XDONT(IWRKT(IDCR))) Then + IWRKT (IDCR + 1) = IWRKT (IDCR) + Else + Exit + End If + End Do + IWRKT (IDCR + 1) = IWRK End Do - IRNGT (1:NORD) = IWRKT (1:NORD) + IRNGT (1 : NORD) = IWRKT (1 : NORD) Return ! End Subroutine D_refpar @@ -7987,107 +7987,107 @@ Subroutine R_refpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XPIV, XWRK + Real(kind = sp) :: XPIV, XWRK ! __________________________________________________________ ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: IWRKT - Integer(kind=i4) :: NDON, ICRS, IDEB, IDCR, IFIN, IMIL, IWRK + Integer(kind = i4), Dimension (SIZE(XDONT)) :: IWRKT + Integer(kind = i4) :: NDON, ICRS, IDEB, IDCR, IFIN, IMIL, IWRK ! NDON = SIZE (XDONT) ! Do ICRS = 1, NDON - IWRKT (ICRS) = ICRS + IWRKT (ICRS) = ICRS End Do IDEB = 1 IFIN = NDON Do - If (IDEB >= IFIN) Exit - IMIL = (IDEB+IFIN) / 2 - ! - ! One chooses a pivot, median of 1st, last, and middle values - ! - If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then + If (IDEB >= IFIN) Exit + IMIL = (IDEB + IFIN) / 2 + ! + ! One chooses a pivot, median of 1st, last, and middle values + ! + If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then + IWRK = IWRKT (IDEB) + IWRKT (IDEB) = IWRKT (IMIL) + IWRKT (IMIL) = IWRK + End If + If (XDONT(IWRKT(IMIL)) > XDONT(IWRKT(IFIN))) Then + IWRK = IWRKT (IFIN) + IWRKT (IFIN) = IWRKT (IMIL) + IWRKT (IMIL) = IWRK + If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then IWRK = IWRKT (IDEB) IWRKT (IDEB) = IWRKT (IMIL) IWRKT (IMIL) = IWRK - End If - If (XDONT(IWRKT(IMIL)) > XDONT(IWRKT(IFIN))) Then - IWRK = IWRKT (IFIN) - IWRKT (IFIN) = IWRKT (IMIL) - IWRKT (IMIL) = IWRK - If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then - IWRK = IWRKT (IDEB) - IWRKT (IDEB) = IWRKT (IMIL) - IWRKT (IMIL) = IWRK - End If - End If - If ((IFIN-IDEB) < 3) Exit - XPIV = XDONT (IWRKT(IMIL)) - ! - ! One exchanges values to put those > pivot in the end and - ! those <= pivot at the beginning - ! - ICRS = IDEB - IDCR = IFIN - ECH2: Do - Do - ICRS = ICRS + 1 - If (ICRS >= IDCR) Then - ! - ! the first > pivot is IWRKT(IDCR) - ! the last <= pivot is IWRKT(ICRS-1) - ! Note: If one arrives here on the first iteration, then - ! the pivot is the maximum of the set, the last value is equal - ! to it, and one can reduce by one the size of the set to process, - ! as if XDONT (IWRKT(IFIN)) > XPIV - ! - Exit ECH2 - ! - End If - If (XDONT(IWRKT(ICRS)) > XPIV) Exit - End Do - Do - If (XDONT(IWRKT(IDCR)) <= XPIV) Exit - IDCR = IDCR - 1 - If (ICRS >= IDCR) Then - ! - ! The last value < pivot is always IWRKT(ICRS-1) - ! - Exit ECH2 - End If - End Do - ! - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT (ICRS) - IWRKT (ICRS) = IWRK - End Do ECH2 - ! - ! One restricts further processing to find the fractile value - ! - If (ICRS <= NORD) IDEB = ICRS - If (ICRS > NORD) IFIN = ICRS - 1 + End If + End If + If ((IFIN - IDEB) < 3) Exit + XPIV = XDONT (IWRKT(IMIL)) + ! + ! One exchanges values to put those > pivot in the end and + ! those <= pivot at the beginning + ! + ICRS = IDEB + IDCR = IFIN + ECH2 : Do + Do + ICRS = ICRS + 1 + If (ICRS >= IDCR) Then + ! + ! the first > pivot is IWRKT(IDCR) + ! the last <= pivot is IWRKT(ICRS-1) + ! Note: If one arrives here on the first iteration, then + ! the pivot is the maximum of the set, the last value is equal + ! to it, and one can reduce by one the size of the set to process, + ! as if XDONT (IWRKT(IFIN)) > XPIV + ! + Exit ECH2 + ! + End If + If (XDONT(IWRKT(ICRS)) > XPIV) Exit + End Do + Do + If (XDONT(IWRKT(IDCR)) <= XPIV) Exit + IDCR = IDCR - 1 + If (ICRS >= IDCR) Then + ! + ! The last value < pivot is always IWRKT(ICRS-1) + ! + Exit ECH2 + End If + End Do + ! + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT (ICRS) + IWRKT (ICRS) = IWRK + End Do ECH2 + ! + ! One restricts further processing to find the fractile value + ! + If (ICRS <= NORD) IDEB = ICRS + If (ICRS > NORD) IFIN = ICRS - 1 End Do ! ! Now, we only need to complete ranking of the 1:NORD set ! Assuming NORD is small, we use a simple insertion sort ! Do ICRS = 2, NORD - IWRK = IWRKT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK <= XDONT(IWRKT(IDCR))) Then - IWRKT (IDCR+1) = IWRKT (IDCR) - Else - Exit - End If - End Do - IWRKT (IDCR+1) = IWRK + IWRK = IWRKT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK <= XDONT(IWRKT(IDCR))) Then + IWRKT (IDCR + 1) = IWRKT (IDCR) + Else + Exit + End If + End Do + IWRKT (IDCR + 1) = IWRK End Do - IRNGT (1:NORD) = IWRKT (1:NORD) + IRNGT (1 : NORD) = IWRKT (1 : NORD) Return ! End Subroutine R_refpar @@ -8104,106 +8104,106 @@ Subroutine I_refpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XPIV, XWRK + Integer(kind = i4) :: XPIV, XWRK ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: IWRKT - Integer(kind=i4) :: NDON, ICRS, IDEB, IDCR, IFIN, IMIL, IWRK + Integer(kind = i4), Dimension (SIZE(XDONT)) :: IWRKT + Integer(kind = i4) :: NDON, ICRS, IDEB, IDCR, IFIN, IMIL, IWRK ! NDON = SIZE (XDONT) ! Do ICRS = 1, NDON - IWRKT (ICRS) = ICRS + IWRKT (ICRS) = ICRS End Do IDEB = 1 IFIN = NDON Do - If (IDEB >= IFIN) Exit - IMIL = (IDEB+IFIN) / 2 - ! - ! One chooses a pivot, median of 1st, last, and middle values - ! - If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then + If (IDEB >= IFIN) Exit + IMIL = (IDEB + IFIN) / 2 + ! + ! One chooses a pivot, median of 1st, last, and middle values + ! + If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then + IWRK = IWRKT (IDEB) + IWRKT (IDEB) = IWRKT (IMIL) + IWRKT (IMIL) = IWRK + End If + If (XDONT(IWRKT(IMIL)) > XDONT(IWRKT(IFIN))) Then + IWRK = IWRKT (IFIN) + IWRKT (IFIN) = IWRKT (IMIL) + IWRKT (IMIL) = IWRK + If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then IWRK = IWRKT (IDEB) IWRKT (IDEB) = IWRKT (IMIL) IWRKT (IMIL) = IWRK - End If - If (XDONT(IWRKT(IMIL)) > XDONT(IWRKT(IFIN))) Then - IWRK = IWRKT (IFIN) - IWRKT (IFIN) = IWRKT (IMIL) - IWRKT (IMIL) = IWRK - If (XDONT(IWRKT(IMIL)) < XDONT(IWRKT(IDEB))) Then - IWRK = IWRKT (IDEB) - IWRKT (IDEB) = IWRKT (IMIL) - IWRKT (IMIL) = IWRK - End If - End If - If ((IFIN-IDEB) < 3) Exit - XPIV = XDONT (IWRKT(IMIL)) - ! - ! One exchanges values to put those > pivot in the end and - ! those <= pivot at the beginning - ! - ICRS = IDEB - IDCR = IFIN - ECH2: Do - Do - ICRS = ICRS + 1 - If (ICRS >= IDCR) Then - ! - ! the first > pivot is IWRKT(IDCR) - ! the last <= pivot is IWRKT(ICRS-1) - ! Note: If one arrives here on the first iteration, then - ! the pivot is the maximum of the set, the last value is equal - ! to it, and one can reduce by one the size of the set to process, - ! as if XDONT (IWRKT(IFIN)) > XPIV - ! - Exit ECH2 - ! - End If - If (XDONT(IWRKT(ICRS)) > XPIV) Exit - End Do - Do - If (XDONT(IWRKT(IDCR)) <= XPIV) Exit - IDCR = IDCR - 1 - If (ICRS >= IDCR) Then - ! - ! The last value < pivot is always IWRKT(ICRS-1) - ! - Exit ECH2 - End If - End Do - ! - IWRK = IWRKT (IDCR) - IWRKT (IDCR) = IWRKT (ICRS) - IWRKT (ICRS) = IWRK - End Do ECH2 - ! - ! One restricts further processing to find the fractile value - ! - If (ICRS <= NORD) IDEB = ICRS - If (ICRS > NORD) IFIN = ICRS - 1 + End If + End If + If ((IFIN - IDEB) < 3) Exit + XPIV = XDONT (IWRKT(IMIL)) + ! + ! One exchanges values to put those > pivot in the end and + ! those <= pivot at the beginning + ! + ICRS = IDEB + IDCR = IFIN + ECH2 : Do + Do + ICRS = ICRS + 1 + If (ICRS >= IDCR) Then + ! + ! the first > pivot is IWRKT(IDCR) + ! the last <= pivot is IWRKT(ICRS-1) + ! Note: If one arrives here on the first iteration, then + ! the pivot is the maximum of the set, the last value is equal + ! to it, and one can reduce by one the size of the set to process, + ! as if XDONT (IWRKT(IFIN)) > XPIV + ! + Exit ECH2 + ! + End If + If (XDONT(IWRKT(ICRS)) > XPIV) Exit + End Do + Do + If (XDONT(IWRKT(IDCR)) <= XPIV) Exit + IDCR = IDCR - 1 + If (ICRS >= IDCR) Then + ! + ! The last value < pivot is always IWRKT(ICRS-1) + ! + Exit ECH2 + End If + End Do + ! + IWRK = IWRKT (IDCR) + IWRKT (IDCR) = IWRKT (ICRS) + IWRKT (ICRS) = IWRK + End Do ECH2 + ! + ! One restricts further processing to find the fractile value + ! + If (ICRS <= NORD) IDEB = ICRS + If (ICRS > NORD) IFIN = ICRS - 1 End Do ! ! Now, we only need to complete ranking of the 1:NORD set ! Assuming NORD is small, we use a simple insertion sort ! Do ICRS = 2, NORD - IWRK = IWRKT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK <= XDONT(IWRKT(IDCR))) Then - IWRKT (IDCR+1) = IWRKT (IDCR) - Else - Exit - End If - End Do - IWRKT (IDCR+1) = IWRK + IWRK = IWRKT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK <= XDONT(IWRKT(IDCR))) Then + IWRKT (IDCR + 1) = IWRKT (IDCR) + Else + Exit + End If + End Do + IWRKT (IDCR + 1) = IWRK End Do - IRNGT (1:NORD) = IWRKT (1:NORD) + IRNGT (1 : NORD) = IWRKT (1 : NORD) Return ! End Subroutine I_refpar @@ -8223,7 +8223,7 @@ Subroutine D_refsor (XDONT) ! Michel Olagnon - Apr. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (InOut) :: XDONT + real(kind = dp), Dimension (:), Intent (InOut) :: XDONT ! __________________________________________________________ ! ! @@ -8235,12 +8235,12 @@ End Subroutine D_refsor Recursive Subroutine D_subsor (XDONT, IDEB1, IFIN1) ! Sorts XDONT from IDEB1 to IFIN1 ! __________________________________________________________ - Real(kind=dp), dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (In) :: IDEB1, IFIN1 + Real(kind = dp), dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (In) :: IDEB1, IFIN1 ! __________________________________________________________ - Integer(kind=i4), Parameter :: NINS = 16 ! Max for insertion sort - Integer(kind=i4) :: ICRS, IDEB, IDCR, IFIN, IMIL - Real(kind=dp) :: XPIV, XWRK + Integer(kind = i4), Parameter :: NINS = 16 ! Max for insertion sort + Integer(kind = i4) :: ICRS, IDEB, IDCR, IFIN, IMIL + Real(kind = dp) :: XPIV, XWRK ! IDEB = IDEB1 IFIN = IFIN1 @@ -8249,69 +8249,69 @@ Recursive Subroutine D_subsor (XDONT, IDEB1, IFIN1) ! them unsorted, and the final insertion sort will take care of them ! If ((IFIN - IDEB) > NINS) Then - IMIL = (IDEB+IFIN) / 2 - ! - ! One chooses a pivot, median of 1st, last, and middle values - ! - If (XDONT(IMIL) < XDONT(IDEB)) Then + IMIL = (IDEB + IFIN) / 2 + ! + ! One chooses a pivot, median of 1st, last, and middle values + ! + If (XDONT(IMIL) < XDONT(IDEB)) Then + XWRK = XDONT (IDEB) + XDONT (IDEB) = XDONT (IMIL) + XDONT (IMIL) = XWRK + End If + If (XDONT(IMIL) > XDONT(IFIN)) Then + XWRK = XDONT (IFIN) + XDONT (IFIN) = XDONT (IMIL) + XDONT (IMIL) = XWRK + If (XDONT(IMIL) < XDONT(IDEB)) Then XWRK = XDONT (IDEB) XDONT (IDEB) = XDONT (IMIL) XDONT (IMIL) = XWRK - End If - If (XDONT(IMIL) > XDONT(IFIN)) Then - XWRK = XDONT (IFIN) - XDONT (IFIN) = XDONT (IMIL) - XDONT (IMIL) = XWRK - If (XDONT(IMIL) < XDONT(IDEB)) Then - XWRK = XDONT (IDEB) - XDONT (IDEB) = XDONT (IMIL) - XDONT (IMIL) = XWRK - End If - End If - XPIV = XDONT (IMIL) - ! - ! One exchanges values to put those > pivot in the end and - ! those <= pivot at the beginning - ! - ICRS = IDEB - IDCR = IFIN - ECH2: Do - Do - ICRS = ICRS + 1 - If (ICRS >= IDCR) Then - ! - ! the first > pivot is IDCR - ! the last <= pivot is ICRS-1 - ! Note: If one arrives here on the first iteration, then - ! the pivot is the maximum of the set, the last value is equal - ! to it, and one can reduce by one the size of the set to process, - ! as if XDONT (IFIN) > XPIV - ! - Exit ECH2 - ! - End If - If (XDONT(ICRS) > XPIV) Exit - End Do - Do - If (XDONT(IDCR) <= XPIV) Exit - IDCR = IDCR - 1 - If (ICRS >= IDCR) Then - ! - ! The last value < pivot is always ICRS-1 - ! - Exit ECH2 - End If - End Do - ! - XWRK = XDONT (IDCR) - XDONT (IDCR) = XDONT (ICRS) - XDONT (ICRS) = XWRK - End Do ECH2 - ! - ! One now sorts each of the two sub-intervals - ! - Call D_subsor (XDONT, IDEB1, ICRS-1) - Call D_subsor (XDONT, IDCR, IFIN1) + End If + End If + XPIV = XDONT (IMIL) + ! + ! One exchanges values to put those > pivot in the end and + ! those <= pivot at the beginning + ! + ICRS = IDEB + IDCR = IFIN + ECH2 : Do + Do + ICRS = ICRS + 1 + If (ICRS >= IDCR) Then + ! + ! the first > pivot is IDCR + ! the last <= pivot is ICRS-1 + ! Note: If one arrives here on the first iteration, then + ! the pivot is the maximum of the set, the last value is equal + ! to it, and one can reduce by one the size of the set to process, + ! as if XDONT (IFIN) > XPIV + ! + Exit ECH2 + ! + End If + If (XDONT(ICRS) > XPIV) Exit + End Do + Do + If (XDONT(IDCR) <= XPIV) Exit + IDCR = IDCR - 1 + If (ICRS >= IDCR) Then + ! + ! The last value < pivot is always ICRS-1 + ! + Exit ECH2 + End If + End Do + ! + XWRK = XDONT (IDCR) + XDONT (IDCR) = XDONT (ICRS) + XDONT (ICRS) = XWRK + End Do ECH2 + ! + ! One now sorts each of the two sub-intervals + ! + Call D_subsor (XDONT, IDEB1, ICRS - 1) + Call D_subsor (XDONT, IDCR, IFIN1) End If Return End Subroutine D_subsor @@ -8331,7 +8331,7 @@ Subroutine R_refsor (XDONT) ! Michel Olagnon - Apr. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (InOut) :: XDONT + Real(kind = sp), Dimension (:), Intent (InOut) :: XDONT ! __________________________________________________________ ! ! @@ -8343,12 +8343,12 @@ End Subroutine R_refsor Recursive Subroutine R_subsor (XDONT, IDEB1, IFIN1) ! Sorts XDONT from IDEB1 to IFIN1 ! __________________________________________________________ - Real(kind=sp), dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (In) :: IDEB1, IFIN1 + Real(kind = sp), dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (In) :: IDEB1, IFIN1 ! __________________________________________________________ - Integer(kind=i4), Parameter :: NINS = 16 ! Max for insertion sort - Integer(kind=i4) :: ICRS, IDEB, IDCR, IFIN, IMIL - Real(kind=sp) :: XPIV, XWRK + Integer(kind = i4), Parameter :: NINS = 16 ! Max for insertion sort + Integer(kind = i4) :: ICRS, IDEB, IDCR, IFIN, IMIL + Real(kind = sp) :: XPIV, XWRK ! IDEB = IDEB1 IFIN = IFIN1 @@ -8357,69 +8357,69 @@ Recursive Subroutine R_subsor (XDONT, IDEB1, IFIN1) ! them unsorted, and the final insertion sort will take care of them ! If ((IFIN - IDEB) > NINS) Then - IMIL = (IDEB+IFIN) / 2 - ! - ! One chooses a pivot, median of 1st, last, and middle values - ! - If (XDONT(IMIL) < XDONT(IDEB)) Then + IMIL = (IDEB + IFIN) / 2 + ! + ! One chooses a pivot, median of 1st, last, and middle values + ! + If (XDONT(IMIL) < XDONT(IDEB)) Then + XWRK = XDONT (IDEB) + XDONT (IDEB) = XDONT (IMIL) + XDONT (IMIL) = XWRK + End If + If (XDONT(IMIL) > XDONT(IFIN)) Then + XWRK = XDONT (IFIN) + XDONT (IFIN) = XDONT (IMIL) + XDONT (IMIL) = XWRK + If (XDONT(IMIL) < XDONT(IDEB)) Then XWRK = XDONT (IDEB) XDONT (IDEB) = XDONT (IMIL) XDONT (IMIL) = XWRK - End If - If (XDONT(IMIL) > XDONT(IFIN)) Then - XWRK = XDONT (IFIN) - XDONT (IFIN) = XDONT (IMIL) - XDONT (IMIL) = XWRK - If (XDONT(IMIL) < XDONT(IDEB)) Then - XWRK = XDONT (IDEB) - XDONT (IDEB) = XDONT (IMIL) - XDONT (IMIL) = XWRK - End If - End If - XPIV = XDONT (IMIL) - ! - ! One exchanges values to put those > pivot in the end and - ! those <= pivot at the beginning - ! - ICRS = IDEB - IDCR = IFIN - ECH2: Do - Do - ICRS = ICRS + 1 - If (ICRS >= IDCR) Then - ! - ! the first > pivot is IDCR - ! the last <= pivot is ICRS-1 - ! Note: If one arrives here on the first iteration, then - ! the pivot is the maximum of the set, the last value is equal - ! to it, and one can reduce by one the size of the set to process, - ! as if XDONT (IFIN) > XPIV - ! - Exit ECH2 - ! - End If - If (XDONT(ICRS) > XPIV) Exit - End Do - Do - If (XDONT(IDCR) <= XPIV) Exit - IDCR = IDCR - 1 - If (ICRS >= IDCR) Then - ! - ! The last value < pivot is always ICRS-1 - ! - Exit ECH2 - End If - End Do - ! - XWRK = XDONT (IDCR) - XDONT (IDCR) = XDONT (ICRS) - XDONT (ICRS) = XWRK - End Do ECH2 - ! - ! One now sorts each of the two sub-intervals - ! - Call R_subsor (XDONT, IDEB1, ICRS-1) - Call R_subsor (XDONT, IDCR, IFIN1) + End If + End If + XPIV = XDONT (IMIL) + ! + ! One exchanges values to put those > pivot in the end and + ! those <= pivot at the beginning + ! + ICRS = IDEB + IDCR = IFIN + ECH2 : Do + Do + ICRS = ICRS + 1 + If (ICRS >= IDCR) Then + ! + ! the first > pivot is IDCR + ! the last <= pivot is ICRS-1 + ! Note: If one arrives here on the first iteration, then + ! the pivot is the maximum of the set, the last value is equal + ! to it, and one can reduce by one the size of the set to process, + ! as if XDONT (IFIN) > XPIV + ! + Exit ECH2 + ! + End If + If (XDONT(ICRS) > XPIV) Exit + End Do + Do + If (XDONT(IDCR) <= XPIV) Exit + IDCR = IDCR - 1 + If (ICRS >= IDCR) Then + ! + ! The last value < pivot is always ICRS-1 + ! + Exit ECH2 + End If + End Do + ! + XWRK = XDONT (IDCR) + XDONT (IDCR) = XDONT (ICRS) + XDONT (ICRS) = XWRK + End Do ECH2 + ! + ! One now sorts each of the two sub-intervals + ! + Call R_subsor (XDONT, IDEB1, ICRS - 1) + Call R_subsor (XDONT, IDCR, IFIN1) End If Return End Subroutine R_subsor @@ -8439,7 +8439,7 @@ Subroutine I_refsor (XDONT) ! Michel Olagnon - Apr. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Dimension (:), Intent (InOut) :: XDONT ! __________________________________________________________ ! ! @@ -8451,12 +8451,12 @@ End Subroutine I_refsor Recursive Subroutine I_subsor (XDONT, IDEB1, IFIN1) ! Sorts XDONT from IDEB1 to IFIN1 ! __________________________________________________________ - Integer(kind=i4), dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (In) :: IDEB1, IFIN1 + Integer(kind = i4), dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (In) :: IDEB1, IFIN1 ! __________________________________________________________ - Integer(kind=i4), Parameter :: NINS = 16 ! Max for insertion sort - Integer(kind=i4) :: ICRS, IDEB, IDCR, IFIN, IMIL - Integer(kind=i4) :: XPIV, XWRK + Integer(kind = i4), Parameter :: NINS = 16 ! Max for insertion sort + Integer(kind = i4) :: ICRS, IDEB, IDCR, IFIN, IMIL + Integer(kind = i4) :: XPIV, XWRK ! IDEB = IDEB1 IFIN = IFIN1 @@ -8465,69 +8465,69 @@ Recursive Subroutine I_subsor (XDONT, IDEB1, IFIN1) ! them unsorted, and the final insertion sort will take care of them ! If ((IFIN - IDEB) > NINS) Then - IMIL = (IDEB+IFIN) / 2 - ! - ! One chooses a pivot, median of 1st, last, and middle values - ! - If (XDONT(IMIL) < XDONT(IDEB)) Then + IMIL = (IDEB + IFIN) / 2 + ! + ! One chooses a pivot, median of 1st, last, and middle values + ! + If (XDONT(IMIL) < XDONT(IDEB)) Then + XWRK = XDONT (IDEB) + XDONT (IDEB) = XDONT (IMIL) + XDONT (IMIL) = XWRK + End If + If (XDONT(IMIL) > XDONT(IFIN)) Then + XWRK = XDONT (IFIN) + XDONT (IFIN) = XDONT (IMIL) + XDONT (IMIL) = XWRK + If (XDONT(IMIL) < XDONT(IDEB)) Then XWRK = XDONT (IDEB) XDONT (IDEB) = XDONT (IMIL) XDONT (IMIL) = XWRK - End If - If (XDONT(IMIL) > XDONT(IFIN)) Then - XWRK = XDONT (IFIN) - XDONT (IFIN) = XDONT (IMIL) - XDONT (IMIL) = XWRK - If (XDONT(IMIL) < XDONT(IDEB)) Then - XWRK = XDONT (IDEB) - XDONT (IDEB) = XDONT (IMIL) - XDONT (IMIL) = XWRK - End If - End If - XPIV = XDONT (IMIL) - ! - ! One exchanges values to put those > pivot in the end and - ! those <= pivot at the beginning - ! - ICRS = IDEB - IDCR = IFIN - ECH2: Do - Do - ICRS = ICRS + 1 - If (ICRS >= IDCR) Then - ! - ! the first > pivot is IDCR - ! the last <= pivot is ICRS-1 - ! Note: If one arrives here on the first iteration, then - ! the pivot is the maximum of the set, the last value is equal - ! to it, and one can reduce by one the size of the set to process, - ! as if XDONT (IFIN) > XPIV - ! - Exit ECH2 - ! - End If - If (XDONT(ICRS) > XPIV) Exit - End Do - Do - If (XDONT(IDCR) <= XPIV) Exit - IDCR = IDCR - 1 - If (ICRS >= IDCR) Then - ! - ! The last value < pivot is always ICRS-1 - ! - Exit ECH2 - End If - End Do - ! - XWRK = XDONT (IDCR) - XDONT (IDCR) = XDONT (ICRS) - XDONT (ICRS) = XWRK - End Do ECH2 - ! - ! One now sorts each of the two sub-intervals - ! - Call I_subsor (XDONT, IDEB1, ICRS-1) - Call I_subsor (XDONT, IDCR, IFIN1) + End If + End If + XPIV = XDONT (IMIL) + ! + ! One exchanges values to put those > pivot in the end and + ! those <= pivot at the beginning + ! + ICRS = IDEB + IDCR = IFIN + ECH2 : Do + Do + ICRS = ICRS + 1 + If (ICRS >= IDCR) Then + ! + ! the first > pivot is IDCR + ! the last <= pivot is ICRS-1 + ! Note: If one arrives here on the first iteration, then + ! the pivot is the maximum of the set, the last value is equal + ! to it, and one can reduce by one the size of the set to process, + ! as if XDONT (IFIN) > XPIV + ! + Exit ECH2 + ! + End If + If (XDONT(ICRS) > XPIV) Exit + End Do + Do + If (XDONT(IDCR) <= XPIV) Exit + IDCR = IDCR - 1 + If (ICRS >= IDCR) Then + ! + ! The last value < pivot is always ICRS-1 + ! + Exit ECH2 + End If + End Do + ! + XWRK = XDONT (IDCR) + XDONT (IDCR) = XDONT (ICRS) + XDONT (ICRS) = XWRK + End Do ECH2 + ! + ! One now sorts each of the two sub-intervals + ! + Call I_subsor (XDONT, IDEB1, ICRS - 1) + Call I_subsor (XDONT, IDCR, IFIN1) End If Return End Subroutine I_subsor @@ -8543,35 +8543,35 @@ Subroutine D_rinpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(kind=dp) :: XWRK, XWRK1 + real(kind = dp) :: XWRK, XWRK1 ! - Integer(kind=i4) :: ICRS, IDCR + Integer(kind = i4) :: ICRS, IDCR ! IRNGT (1) = 1 Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ICRS + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ICRS End Do ! XWRK1 = XDONT (IRNGT(NORD)) Do ICRS = NORD + 1, SIZE (XDONT) - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ICRS - XWRK1 = XDONT (IRNGT(NORD)) - End If + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ICRS + XWRK1 = XDONT (IRNGT(NORD)) + End If End Do ! ! @@ -8588,35 +8588,35 @@ Subroutine R_rinpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XWRK, XWRK1 + Real(kind = sp) :: XWRK, XWRK1 ! - Integer(kind=i4) :: ICRS, IDCR + Integer(kind = i4) :: ICRS, IDCR ! IRNGT (1) = 1 Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ICRS + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ICRS End Do ! XWRK1 = XDONT (IRNGT(NORD)) Do ICRS = NORD + 1, SIZE (XDONT) - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ICRS - XWRK1 = XDONT (IRNGT(NORD)) - End If + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ICRS + XWRK1 = XDONT (IRNGT(NORD)) + End If End Do ! ! @@ -8633,35 +8633,35 @@ Subroutine I_rinpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XWRK, XWRK1 + Integer(kind = i4) :: XWRK, XWRK1 ! - Integer(kind=i4) :: ICRS, IDCR + Integer(kind = i4) :: ICRS, IDCR ! IRNGT (1) = 1 Do ICRS = 2, NORD - XWRK = XDONT (ICRS) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ICRS + XWRK = XDONT (ICRS) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ICRS End Do ! XWRK1 = XDONT (IRNGT(NORD)) Do ICRS = NORD + 1, SIZE (XDONT) - If (XDONT(ICRS) < XWRK1) Then - XWRK = XDONT (ICRS) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ICRS - XWRK1 = XDONT (IRNGT(NORD)) - End If + If (XDONT(ICRS) < XWRK1) Then + XWRK = XDONT (ICRS) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ICRS + XWRK1 = XDONT (IRNGT(NORD)) + End If End Do ! ! @@ -8683,100 +8683,100 @@ Subroutine D_rnkpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(kind=dp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX + real(kind = dp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) IRNGT (1) = 1 - Return + If (NORD >= 1) IRNGT (1) = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + Return End If ! If (XDONT(3) <= XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - If (XDONT(3) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = 3 - Else - IHIGT (1) = 3 - End If + IHIGT (2) = IHIGT (1) + If (XDONT(3) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = 3 + Else + IHIGT (1) = 3 + End If Else - IHIGT (2) = 3 + IHIGT (2) = 3 End If ! If (NDON < 4) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + Return End If ! If (XDONT(NDON) <= XDONT(IHIGT(1))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = IHIGT (1) - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - Else - IHIGT (1) = NDON - End If + IHIGT (3) = IHIGT (2) + IHIGT (2) = IHIGT (1) + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + Else + IHIGT (1) = NDON + End If Else - if (XDONT (NDON) < XDONT (IHIGT(2))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = NDON - else - IHIGT (3) = NDON - end if + if (XDONT (NDON) < XDONT (IHIGT(2))) Then + IHIGT (3) = IHIGT (2) + IHIGT (2) = NDON + else + IHIGT (3) = NDON + end if End If ! If (NDON < 5) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - If (NORD >= 4) IRNGT (4) = IHIGT (3) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + If (NORD >= 4) IRNGT (4) = IHIGT (3) + Return End If ! JDEB = 0 IDEB = JDEB + 1 JLOW = IDEB JHIG = 3 - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,dp)/REAL(NDON+NORD,dp) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(IDEB))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,dp)/REAL(NDON+NORD,dp) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(IDEB))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,dp) / REAL(NDON+NORD,dp) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(IDEB))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(IDEB))) End If XPIV0 = XPIV ! @@ -8789,62 +8789,62 @@ Subroutine D_rnkpar (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -8852,318 +8852,318 @@ Subroutine D_rnkpar (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JLOW == NORD) Exit - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to NORD - ! - If (NORD > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIGT (IHIG) = IHIGT (JHIG) - JHIG = JHIG - 1 - Else - ILOW = ILOWT (JLOW) - XMAX = XDONT (ILOW) - Do ICRS = 1, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to NORD. - ! - Select Case (NORD-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (*,*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, NORD - JHIG = JHIG + 1 - ILOWT (ICRS) = IHIGT (JHIG) - End Do - JLOW = NORD - Exit - ! - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - JDEB = JLOW - NWRK = NORD - JLOW - IWRK1 = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IWRK1 - XPIV = XDONT (IWRK1) + REAL(NWRK,dp) / REAL(NORD+NWRK,dp) * & - (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW >= NORD) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + if (JLOW == NORD) Exit + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to NORD + ! + If (NORD > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 ILOWT (JLOW) = IHIGT (IHIG) + IHIGT (IHIG) = IHIGT (JHIG) + JHIG = JHIG - 1 + Else + ILOW = ILOWT (JLOW) + XMAX = XDONT (ILOW) + Do ICRS = 1, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to NORD. + ! + Select Case (NORD - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (*,*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! + Case (3) ! - Case (0) - ! - ! Low part is exactly what we want - ! - Exit - ! - ! - Case (-5:-1) - ! - ! Only few values too many in low part ! - IRNGT (1) = ILOWT (1) - Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - Do ICRS = NORD + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, NORD + JHIG = JHIG + 1 + ILOWT (ICRS) = IHIGT (JHIG) End Do + JLOW = NORD + Exit ! - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in low part + Case (4 :) ! - IDEB = JDEB + 1 - IMIL = (JLOW+IDEB) / 2 - IFIN = JLOW ! - ! One chooses a pivot from 1st, last, and middle values + XPIV0 = XPIV + IFIN = JHIG ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(1)) + REAL(NORD,dp)/REAL(JLOW+NORD,dp) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + REAL(2*NORD-JDEB,dp)/REAL(JLOW+NORD,dp) * & - (XDONT(ILOWT(IFIN))-XPIV0) - Else - IDEB = 1 - End If + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + JDEB = JLOW + NWRK = NORD - JLOW + IWRK1 = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IWRK1 + XPIV = XDONT (IWRK1) + REAL(NWRK, dp) / REAL(NORD + NWRK, dp) * & + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) ! - ! One takes values > XPIV to IHIGT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough low values + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = JDEB - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = JDEB - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = IDEB, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW >= NORD) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + Do ICRS = 2, NORD + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + Do ICRS = NORD + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do + ! + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + IDEB = JDEB + 1 + IMIL = (JLOW + IDEB) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(1)) + REAL(NORD, dp) / REAL(JLOW + NORD, dp) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + REAL(2 * NORD - JDEB, dp) / REAL(JLOW + NORD, dp) * & + (XDONT(ILOWT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values > XPIV to IHIGT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough low values + ! + JHIG = 0 + JLOW = JDEB + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = JDEB + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = IDEB, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to complete ranking of the 1:NORD set @@ -9171,16 +9171,16 @@ Subroutine D_rnkpar (XDONT, IRNGT, NORD) ! IRNGT (1) = ILOWT (1) Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -9203,100 +9203,100 @@ Subroutine R_rnkpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX + Real(kind = sp) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) IRNGT (1) = 1 - Return + If (NORD >= 1) IRNGT (1) = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + Return End If ! If (XDONT(3) <= XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - If (XDONT(3) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = 3 - Else - IHIGT (1) = 3 - End If + IHIGT (2) = IHIGT (1) + If (XDONT(3) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = 3 + Else + IHIGT (1) = 3 + End If Else - IHIGT (2) = 3 + IHIGT (2) = 3 End If ! If (NDON < 4) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + Return End If ! If (XDONT(NDON) <= XDONT(IHIGT(1))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = IHIGT (1) - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - Else - IHIGT (1) = NDON - End If + IHIGT (3) = IHIGT (2) + IHIGT (2) = IHIGT (1) + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + Else + IHIGT (1) = NDON + End If Else - if (XDONT (NDON) < XDONT (IHIGT(2))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = NDON - else - IHIGT (3) = NDON - end if + if (XDONT (NDON) < XDONT (IHIGT(2))) Then + IHIGT (3) = IHIGT (2) + IHIGT (2) = NDON + else + IHIGT (3) = NDON + end if End If ! If (NDON < 5) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - If (NORD >= 4) IRNGT (4) = IHIGT (3) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + If (NORD >= 4) IRNGT (4) = IHIGT (3) + Return End If ! JDEB = 0 IDEB = JDEB + 1 JLOW = IDEB JHIG = 3 - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,sp)/REAL(NDON+NORD,sp) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(IDEB))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,sp)/REAL(NDON+NORD,sp) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(IDEB))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,sp) / REAL(NDON+NORD,sp) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(IDEB))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(IDEB))) End If XPIV0 = XPIV ! @@ -9309,62 +9309,62 @@ Subroutine R_rnkpar (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -9372,318 +9372,318 @@ Subroutine R_rnkpar (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JLOW == NORD) Exit - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to NORD - ! - If (NORD > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIGT (IHIG) = IHIGT (JHIG) - JHIG = JHIG - 1 - Else - ILOW = ILOWT (JLOW) - XMAX = XDONT (ILOW) - Do ICRS = 1, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to NORD. - ! - Select Case (NORD-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (*,*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, NORD - JHIG = JHIG + 1 - ILOWT (ICRS) = IHIGT (JHIG) - End Do - JLOW = NORD - Exit - ! - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - JDEB = JLOW - NWRK = NORD - JLOW - IWRK1 = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IWRK1 - XPIV = XDONT (IWRK1) + REAL(NWRK,sp) / REAL(NORD+NWRK,sp) * & - (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW >= NORD) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + if (JLOW == NORD) Exit + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to NORD + ! + If (NORD > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 ILOWT (JLOW) = IHIGT (IHIG) + IHIGT (IHIG) = IHIGT (JHIG) + JHIG = JHIG - 1 + Else + ILOW = ILOWT (JLOW) + XMAX = XDONT (ILOW) + Do ICRS = 1, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to NORD. + ! + Select Case (NORD - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (*,*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! + Case (3) ! - Case (0) - ! - ! Low part is exactly what we want - ! - Exit - ! - ! - Case (-5:-1) - ! - ! Only few values too many in low part ! - IRNGT (1) = ILOWT (1) - Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - Do ICRS = NORD + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, NORD + JHIG = JHIG + 1 + ILOWT (ICRS) = IHIGT (JHIG) End Do + JLOW = NORD + Exit ! - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in low part + Case (4 :) ! - IDEB = JDEB + 1 - IMIL = (JLOW+IDEB) / 2 - IFIN = JLOW ! - ! One chooses a pivot from 1st, last, and middle values + XPIV0 = XPIV + IFIN = JHIG ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(1)) + REAL(NORD,sp)/REAL(JLOW+NORD,sp) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + REAL(2*NORD-JDEB,sp)/REAL(JLOW+NORD,sp) * & - (XDONT(ILOWT(IFIN))-XPIV0) - Else - IDEB = 1 - End If + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + JDEB = JLOW + NWRK = NORD - JLOW + IWRK1 = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IWRK1 + XPIV = XDONT (IWRK1) + REAL(NWRK, sp) / REAL(NORD + NWRK, sp) * & + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) ! - ! One takes values > XPIV to IHIGT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough low values + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = JDEB - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = JDEB - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = IDEB, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW >= NORD) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + Do ICRS = 2, NORD + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + Do ICRS = NORD + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do + ! + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + IDEB = JDEB + 1 + IMIL = (JLOW + IDEB) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(1)) + REAL(NORD, sp) / REAL(JLOW + NORD, sp) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + REAL(2 * NORD - JDEB, sp) / REAL(JLOW + NORD, sp) * & + (XDONT(ILOWT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values > XPIV to IHIGT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough low values + ! + JHIG = 0 + JLOW = JDEB + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = JDEB + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = IDEB, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to complete ranking of the 1:NORD set @@ -9691,16 +9691,16 @@ Subroutine R_rnkpar (XDONT, IRNGT, NORD) ! IRNGT (1) = ILOWT (1) Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -9723,100 +9723,100 @@ Subroutine I_rnkpar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX + Integer(kind = i4) :: XPIV, XPIV0, XWRK, XWRK1, XMIN, XMAX ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) IRNGT (1) = 1 - Return + If (NORD >= 1) IRNGT (1) = 1 + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - ILOWT (1) = 2 - IHIGT (1) = 1 + ILOWT (1) = 2 + IHIGT (1) = 1 Else - ILOWT (1) = 1 - IHIGT (1) = 2 + ILOWT (1) = 1 + IHIGT (1) = 2 End If ! If (NDON < 3) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + Return End If ! If (XDONT(3) <= XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - If (XDONT(3) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = 3 - Else - IHIGT (1) = 3 - End If + IHIGT (2) = IHIGT (1) + If (XDONT(3) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = 3 + Else + IHIGT (1) = 3 + End If Else - IHIGT (2) = 3 + IHIGT (2) = 3 End If ! If (NDON < 4) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + Return End If ! If (XDONT(NDON) <= XDONT(IHIGT(1))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = IHIGT (1) - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - Else - IHIGT (1) = NDON - End If + IHIGT (3) = IHIGT (2) + IHIGT (2) = IHIGT (1) + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + Else + IHIGT (1) = NDON + End If Else - if (XDONT (NDON) < XDONT (IHIGT(2))) Then - IHIGT (3) = IHIGT (2) - IHIGT (2) = NDON - else - IHIGT (3) = NDON - end if + if (XDONT (NDON) < XDONT (IHIGT(2))) Then + IHIGT (3) = IHIGT (2) + IHIGT (2) = NDON + else + IHIGT (3) = NDON + end if End If ! If (NDON < 5) Then - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - If (NORD >= 4) IRNGT (4) = IHIGT (3) - Return + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + If (NORD >= 4) IRNGT (4) = IHIGT (3) + Return End If ! JDEB = 0 IDEB = JDEB + 1 JLOW = IDEB JHIG = 3 - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2*NORD,sp)/REAL(NDON+NORD,sp),i4) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(IDEB))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2*NORD,sp)/REAL(NDON+NORD,sp),i4) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(IDEB))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2*NORD,sp) / REAL(NDON+NORD,sp),i4) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(IDEB))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(IDEB))) End If XPIV0 = XPIV ! @@ -9829,62 +9829,62 @@ Subroutine I_rnkpar (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -9892,318 +9892,318 @@ Subroutine I_rnkpar (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JLOW == NORD) Exit - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to NORD - ! - If (NORD > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIGT (IHIG) = IHIGT (JHIG) - JHIG = JHIG - 1 - Else - ILOW = ILOWT (JLOW) - XMAX = XDONT (ILOW) - Do ICRS = 1, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to NORD. - ! - Select Case (NORD-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (*,*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, NORD - JHIG = JHIG + 1 - ILOWT (ICRS) = IHIGT (JHIG) - End Do - JLOW = NORD - Exit - ! - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - JDEB = JLOW - NWRK = NORD - JLOW - IWRK1 = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IWRK1 - XPIV = XDONT (IWRK1) + INT(REAL(NWRK,sp) / REAL(NORD+NWRK,sp),i4) * & - (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW >= NORD) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + if (JLOW == NORD) Exit + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to NORD + ! + If (NORD > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 ILOWT (JLOW) = IHIGT (IHIG) + IHIGT (IHIG) = IHIGT (JHIG) + JHIG = JHIG - 1 + Else + ILOW = ILOWT (JLOW) + XMAX = XDONT (ILOW) + Do ICRS = 1, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to NORD. + ! + Select Case (NORD - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (*,*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! + Case (3) ! - Case (0) - ! - ! Low part is exactly what we want - ! - Exit - ! - ! - Case (-5:-1) - ! - ! Only few values too many in low part ! - IRNGT (1) = ILOWT (1) - Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - Do ICRS = NORD + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do IDCR = NORD - 1, 1, - 1 - If (XWRK >= XDONT(IRNGT(IDCR))) Exit - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, NORD + JHIG = JHIG + 1 + ILOWT (ICRS) = IHIGT (JHIG) End Do + JLOW = NORD + Exit ! - Return - ! - ! - Case (:-6) - ! - ! last case: too many values in low part + Case (4 :) ! - IDEB = JDEB + 1 - IMIL = (JLOW+IDEB) / 2 - IFIN = JLOW ! - ! One chooses a pivot from 1st, last, and middle values + XPIV0 = XPIV + IFIN = JHIG ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(1)) + INT(REAL(NORD,sp)/REAL(JLOW+NORD,sp),i4) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + INT(REAL(2*NORD-JDEB,sp)/REAL(JLOW+NORD,sp),i4) * & - (XDONT(ILOWT(IFIN))-XPIV0) - Else - IDEB = 1 - End If + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + JDEB = JLOW + NWRK = NORD - JLOW + IWRK1 = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IWRK1 + XPIV = XDONT (IWRK1) + INT(REAL(NWRK, sp) / REAL(NORD + NWRK, sp), i4) * & + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) ! - ! One takes values > XPIV to IHIGT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough low values + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = JDEB - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = JDEB - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = IDEB, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW >= NORD) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + Exit + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + Do ICRS = 2, NORD + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + Do ICRS = NORD + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do IDCR = NORD - 1, 1, - 1 + If (XWRK >= XDONT(IRNGT(IDCR))) Exit + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do + ! + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + IDEB = JDEB + 1 + IMIL = (JLOW + IDEB) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(1)) + INT(REAL(NORD, sp) / REAL(JLOW + NORD, sp), i4) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + INT(REAL(2 * NORD - JDEB, sp) / REAL(JLOW + NORD, sp), i4) * & + (XDONT(ILOWT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values > XPIV to IHIGT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough low values + ! + JHIG = 0 + JLOW = JDEB + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = JDEB + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = IDEB, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to complete ranking of the 1:NORD set @@ -10211,16 +10211,16 @@ Subroutine I_rnkpar (XDONT, IRNGT, NORD) ! IRNGT (1) = ILOWT (1) Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -10238,41 +10238,41 @@ Subroutine D_uniinv (XDONT, IGOEST) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IGOEST + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IGOEST ! __________________________________________________________ - real(kind=dp) :: XTST, XDONA, XDONB + real(kind = dp) :: XTST, XDONA, XDONB ! ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(IGOEST)) :: JWRKT, IRNGT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2, NUNI - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (SIZE(IGOEST)) :: JWRKT, IRNGT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2, NUNI + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XDONT), SIZE(IGOEST)) ! Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IGOEST (1) = 1 - Return + IGOEST (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XDONT(IIND-1) < XDONT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XDONT(IIND - 1) < XDONT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo (NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -10284,142 +10284,142 @@ Subroutine D_uniinv (XDONT, IGOEST) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 4) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 4) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (2*LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! One steps in the C subset, that we create in the final rank array - ! - ! Make a copy of the rank array for the iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - XDONA = XDONT (JWRKT(IINDA)) - XDONB = XDONT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XDONA > XDONB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XDONB = XDONT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XDONA = XDONT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (2 * LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! One steps in the C subset, that we create in the final rank array + ! + ! Make a copy of the rank array for the iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + XDONA = XDONT (JWRKT(IINDA)) + XDONB = XDONT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XDONA > XDONB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XDONB = XDONT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XDONA = XDONT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Last merge of A and B into C, with removal of duplicates. @@ -10430,44 +10430,44 @@ Subroutine D_uniinv (XDONT, IGOEST) ! ! One steps in the C subset, that we create in the final rank array ! - JWRKT (1:LMTNA) = IRNGT (1:LMTNA) + JWRKT (1 : LMTNA) = IRNGT (1 : LMTNA) If (IINDB <= NVAL) Then - XTST = NEARLESS (Min(XDONT(JWRKT(1)), XDONT(IRNGT(IINDB)))) + XTST = NEARLESS (Min(XDONT(JWRKT(1)), XDONT(IRNGT(IINDB)))) Else - XTST = NEARLESS (XDONT(JWRKT(1))) + XTST = NEARLESS (XDONT(JWRKT(1))) end if Do IWRK = 1, NVAL - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA <= LMTNA) Then - If (IINDB <= NVAL) Then - If (XDONT(JWRKT(IINDA)) > XDONT(IRNGT(IINDB))) Then - IRNG = IRNGT (IINDB) - IINDB = IINDB + 1 - Else - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only A still with unprocessed values - ! - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNG = IRNGT (IWRK) - End If - If (XDONT(IRNG) > XTST) Then - XTST = XDONT (IRNG) - NUNI = NUNI + 1 - End If - IGOEST (IRNG) = NUNI - ! + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA <= LMTNA) Then + If (IINDB <= NVAL) Then + If (XDONT(JWRKT(IINDA)) > XDONT(IRNGT(IINDB))) Then + IRNG = IRNGT (IINDB) + IINDB = IINDB + 1 + Else + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only A still with unprocessed values + ! + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNG = IRNGT (IWRK) + End If + If (XDONT(IRNG) > XTST) Then + XTST = XDONT (IRNG) + NUNI = NUNI + 1 + End If + IGOEST (IRNG) = NUNI + ! End Do ! Return @@ -10485,41 +10485,41 @@ Subroutine R_uniinv (XDONT, IGOEST) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IGOEST + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IGOEST ! __________________________________________________________ - Real(kind=sp) :: XTST, XDONA, XDONB + Real(kind = sp) :: XTST, XDONA, XDONB ! ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(IGOEST)) :: JWRKT, IRNGT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2, NUNI - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (SIZE(IGOEST)) :: JWRKT, IRNGT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2, NUNI + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XDONT), SIZE(IGOEST)) ! Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IGOEST (1) = 1 - Return + IGOEST (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XDONT(IIND-1) < XDONT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XDONT(IIND - 1) < XDONT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo (NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -10531,142 +10531,142 @@ Subroutine R_uniinv (XDONT, IGOEST) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 4) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 4) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (2*LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! One steps in the C subset, that we create in the final rank array - ! - ! Make a copy of the rank array for the iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - XDONA = XDONT (JWRKT(IINDA)) - XDONB = XDONT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XDONA > XDONB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XDONB = XDONT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XDONA = XDONT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (2 * LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! One steps in the C subset, that we create in the final rank array + ! + ! Make a copy of the rank array for the iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + XDONA = XDONT (JWRKT(IINDA)) + XDONB = XDONT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XDONA > XDONB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XDONB = XDONT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XDONA = XDONT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Last merge of A and B into C, with removal of duplicates. @@ -10677,44 +10677,44 @@ Subroutine R_uniinv (XDONT, IGOEST) ! ! One steps in the C subset, that we create in the final rank array ! - JWRKT (1:LMTNA) = IRNGT (1:LMTNA) + JWRKT (1 : LMTNA) = IRNGT (1 : LMTNA) If (IINDB <= NVAL) Then - XTST = NEARLESS (Min(XDONT(JWRKT(1)), XDONT(IRNGT(IINDB)))) + XTST = NEARLESS (Min(XDONT(JWRKT(1)), XDONT(IRNGT(IINDB)))) Else - XTST = NEARLESS (XDONT(JWRKT(1))) + XTST = NEARLESS (XDONT(JWRKT(1))) end if Do IWRK = 1, NVAL - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA <= LMTNA) Then - If (IINDB <= NVAL) Then - If (XDONT(JWRKT(IINDA)) > XDONT(IRNGT(IINDB))) Then - IRNG = IRNGT (IINDB) - IINDB = IINDB + 1 - Else - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only A still with unprocessed values - ! - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNG = IRNGT (IWRK) - End If - If (XDONT(IRNG) > XTST) Then - XTST = XDONT (IRNG) - NUNI = NUNI + 1 - End If - IGOEST (IRNG) = NUNI - ! + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA <= LMTNA) Then + If (IINDB <= NVAL) Then + If (XDONT(JWRKT(IINDA)) > XDONT(IRNGT(IINDB))) Then + IRNG = IRNGT (IINDB) + IINDB = IINDB + 1 + Else + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only A still with unprocessed values + ! + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNG = IRNGT (IWRK) + End If + If (XDONT(IRNG) > XTST) Then + XTST = XDONT (IRNG) + NUNI = NUNI + 1 + End If + IGOEST (IRNG) = NUNI + ! End Do ! Return @@ -10732,41 +10732,41 @@ Subroutine I_uniinv (XDONT, IGOEST) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IGOEST + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IGOEST ! __________________________________________________________ - Integer(kind=i4) :: XTST, XDONA, XDONB + Integer(kind = i4) :: XTST, XDONA, XDONB ! ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(IGOEST)) :: JWRKT, IRNGT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2, NUNI - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4), Dimension (SIZE(IGOEST)) :: JWRKT, IRNGT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2, NUNI + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB ! NVAL = Min (SIZE(XDONT), SIZE(IGOEST)) ! Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IGOEST (1) = 1 - Return + IGOEST (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XDONT(IIND-1) < XDONT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XDONT(IIND - 1) < XDONT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo (NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -10778,142 +10778,142 @@ Subroutine I_uniinv (XDONT, IGOEST) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 4) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 4) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XDONT(IRNGT(IWRKD + 2)) <= XDONT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XDONT(IRNGT(IWRKD + 1)) <= XDONT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (2*LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! One steps in the C subset, that we create in the final rank array - ! - ! Make a copy of the rank array for the iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - XDONA = XDONT (JWRKT(IINDA)) - XDONB = XDONT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XDONA > XDONB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XDONB = XDONT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XDONA = XDONT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (2 * LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! One steps in the C subset, that we create in the final rank array + ! + ! Make a copy of the rank array for the iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + XDONA = XDONT (JWRKT(IINDA)) + XDONB = XDONT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XDONA > XDONB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XDONB = XDONT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XDONA = XDONT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Last merge of A and B into C, with removal of duplicates. @@ -10924,44 +10924,44 @@ Subroutine I_uniinv (XDONT, IGOEST) ! ! One steps in the C subset, that we create in the final rank array ! - JWRKT (1:LMTNA) = IRNGT (1:LMTNA) + JWRKT (1 : LMTNA) = IRNGT (1 : LMTNA) If (IINDB <= NVAL) Then - XTST = NEARLESS (Min(XDONT(JWRKT(1)), XDONT(IRNGT(IINDB)))) + XTST = NEARLESS (Min(XDONT(JWRKT(1)), XDONT(IRNGT(IINDB)))) Else - XTST = NEARLESS (XDONT(JWRKT(1))) + XTST = NEARLESS (XDONT(JWRKT(1))) end if Do IWRK = 1, NVAL - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA <= LMTNA) Then - If (IINDB <= NVAL) Then - If (XDONT(JWRKT(IINDA)) > XDONT(IRNGT(IINDB))) Then - IRNG = IRNGT (IINDB) - IINDB = IINDB + 1 - Else - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only A still with unprocessed values - ! - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNG = IRNGT (IWRK) - End If - If (XDONT(IRNG) > XTST) Then - XTST = XDONT (IRNG) - NUNI = NUNI + 1 - End If - IGOEST (IRNG) = NUNI - ! + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA <= LMTNA) Then + If (IINDB <= NVAL) Then + If (XDONT(JWRKT(IINDA)) > XDONT(IRNGT(IINDB))) Then + IRNG = IRNGT (IINDB) + IINDB = IINDB + 1 + Else + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only A still with unprocessed values + ! + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNG = IRNGT (IWRK) + End If + If (XDONT(IRNG) > XTST) Then + XTST = XDONT (IRNG) + NUNI = NUNI + 1 + End If + IGOEST (IRNG) = NUNI + ! End Do ! Return @@ -10971,8 +10971,8 @@ End Subroutine I_uniinv Function D_nearless (XVAL) result (D_nl) ! Nearest value less than given value ! __________________________________________________________ - real(kind=dp), Intent (In) :: XVAL - real(kind=dp) :: D_nl + real(kind = dp), Intent (In) :: XVAL + real(kind = dp) :: D_nl ! __________________________________________________________ D_nl = nearest (XVAL, -1.0_dp) return @@ -10982,8 +10982,8 @@ End Function D_nearless Function R_nearless (XVAL) result (R_nl) ! Nearest value less than given value ! __________________________________________________________ - Real(kind=sp), Intent (In) :: XVAL - Real(kind=sp) :: R_nl + Real(kind = sp), Intent (In) :: XVAL + Real(kind = sp) :: R_nl ! __________________________________________________________ R_nl = nearest (XVAL, -1.0) return @@ -10993,8 +10993,8 @@ End Function R_nearless Function I_nearless (XVAL) result (I_nl) ! Nearest value less than given value ! __________________________________________________________ - Integer(kind=i4), Intent (In) :: XVAL - Integer(kind=i4) :: I_nl + Integer(kind = i4), Intent (In) :: XVAL + Integer(kind = i4) :: I_nl ! __________________________________________________________ I_nl = XVAL - 1 return @@ -11021,118 +11021,118 @@ Subroutine D_unipar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (InOut) :: NORD + real(kind = dp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (InOut) :: NORD ! __________________________________________________________ - real(kind=dp) :: XPIV, XWRK, XWRK1, XMIN, XMAX, XPIV0 + real(kind = dp) :: XPIV, XWRK, XWRK1, XMIN, XMAX, XPIV0 ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) Then - NORD = 1 - IRNGT (1) = 1 - End If - Return + If (NORD >= 1) Then + NORD = 1 + IRNGT (1) = 1 + End If + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! Do ICRS = 2, NDON - If (eq(XDONT(ICRS) , XDONT(1))) Then - Cycle - Else If (XDONT(ICRS) < XDONT(1)) Then - ILOWT (1) = ICRS - IHIGT (1) = 1 - Else - ILOWT (1) = 1 - IHIGT (1) = ICRS - End If - If (.true.) Exit ! Exit ! JM + If (eq(XDONT(ICRS), XDONT(1))) Then + Cycle + Else If (XDONT(ICRS) < XDONT(1)) Then + ILOWT (1) = ICRS + IHIGT (1) = 1 + Else + ILOWT (1) = 1 + IHIGT (1) = ICRS + End If + If (.true.) Exit ! Exit ! JM End Do ! If (NDON <= ICRS) Then - NORD = Min (NORD, 2) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - Return + NORD = Min (NORD, 2) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + Return End If ! ICRS = ICRS + 1 JHIG = 1 If (XDONT(ICRS) < XDONT(IHIGT(1))) Then - If (XDONT(ICRS) < XDONT(ILOWT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (1) - IHIGT (1) = ILOWT (1) - ILOWT (1) = ICRS - Else If (XDONT(ICRS) > XDONT(ILOWT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (1) - IHIGT (1) = ICRS - End If + If (XDONT(ICRS) < XDONT(ILOWT(1))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (1) + IHIGT (1) = ILOWT (1) + ILOWT (1) = ICRS + Else If (XDONT(ICRS) > XDONT(ILOWT(1))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (1) + IHIGT (1) = ICRS + End If ElseIf (XDONT(ICRS) > XDONT(IHIGT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS End If ! If (NDON <= ICRS) Then - NORD = Min (NORD, JHIG+1) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - Return + NORD = Min (NORD, JHIG + 1) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + Return End If ! If (XDONT(NDON) < XDONT(IHIGT(1))) Then - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - Do IDCR = JHIG, 1, -1 - IHIGT (IDCR+1) = IHIGT (IDCR) - End Do - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - JHIG = JHIG + 1 - ElseIf (XDONT(NDON) > XDONT(ILOWT(1))) Then - Do IDCR = JHIG, 1, -1 - IHIGT (IDCR+1) = IHIGT (IDCR) - End Do - IHIGT (1) = NDON - JHIG = JHIG + 1 - End If + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + Do IDCR = JHIG, 1, -1 + IHIGT (IDCR + 1) = IHIGT (IDCR) + End Do + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + JHIG = JHIG + 1 + ElseIf (XDONT(NDON) > XDONT(ILOWT(1))) Then + Do IDCR = JHIG, 1, -1 + IHIGT (IDCR + 1) = IHIGT (IDCR) + End Do + IHIGT (1) = NDON + JHIG = JHIG + 1 + End If ElseIf (XDONT(NDON) > XDONT(IHIGT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = NDON + JHIG = JHIG + 1 + IHIGT (JHIG) = NDON End If ! - If (NDON <= ICRS+1) Then - NORD = Min (NORD, JHIG+1) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - If (NORD >= 4) IRNGT (4) = IHIGT (3) - Return + If (NDON <= ICRS + 1) Then + NORD = Min (NORD, JHIG + 1) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + If (NORD >= 4) IRNGT (4) = IHIGT (3) + Return End If ! JDEB = 0 IDEB = JDEB + 1 JLOW = IDEB - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,dp)/REAL(NDON+NORD,dp) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(IDEB))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,dp)/REAL(NDON+NORD,dp) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(IDEB))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,dp) / REAL(NDON+NORD,dp) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(IDEB))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, dp) / REAL(NDON + NORD, dp) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(IDEB))) End If XPIV0 = XPIV ! @@ -11148,67 +11148,67 @@ Subroutine D_unipar (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) > XPIV) Then - lowloop1: Do - ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - Do ILOW = 1, JLOW - If (eq(XDONT(ICRS) , XDONT(ILOWT(ILOW)))) Cycle lowloop1 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do lowloop1 - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If + lowloop1 : Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + Do ILOW = 1, JLOW + If (eq(XDONT(ICRS), XDONT(ILOWT(ILOW)))) Cycle lowloop1 End Do - End If - ! - ! + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do lowloop1 + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - lowloop2: Do ICRS = ICRS + 1, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - Do ILOW = 1, JLOW - If (eq(XDONT(ICRS) , XDONT (ILOWT(ILOW)))) Cycle lowloop2 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do lowloop2 - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + lowloop2 : Do ICRS = ICRS + 1, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + Do ILOW = 1, JLOW + If (eq(XDONT(ICRS), XDONT (ILOWT(ILOW)))) Cycle lowloop2 End Do - End If + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do lowloop2 + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + End If + End Do + End If End If ! JLM2 = 0 @@ -11216,370 +11216,370 @@ Subroutine D_unipar (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JLOW == NORD) Exit - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to NORD - ! - If (NORD > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIG = 0 - Do ICRS = 1, JHIG - If (ne(XDONT(IHIGT (ICRS)) , XMIN)) then - IHIG = IHIG + 1 - IHIGT (IHIG ) = IHIGT (ICRS) - End If - End Do - JHIG = IHIG - Else - ILOW = ILOWT (JLOW) - XMAX = XDONT (ILOW) - Do ICRS = 1, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to NORD. In order to make better pivot choices, we - ! decrease NORD if we already know that we don't have that - ! many distinct values as a whole. - ! - IF (JLOW+JHIG < NORD) NORD = JLOW+JHIG - Select Case (NORD-JLOW) - ! ______________________________ - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JHIG) - ! - ! Not enough values in high part either (too many duplicates) - ! - Case (0) - NORD = JLOW - ! - Case (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - NORD = JLOW - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (le(XDONT(IHIGT(1)) , XDONT(IHIGT(2)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - ElseIf (eq(XDONT(IHIGT(1)) , XDONT(IHIGT(2)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - NORD = JLOW - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 1 - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JHIG = JHIG + 1 - IF (ne(XDONT(IHIGT(JHIG)) , XDONT(ILOWT(JLOW)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (JHIG) - End If - JHIG = JHIG + 1 - IF (ne(XDONT(IHIGT(JHIG)) , XDONT(ILOWT(JLOW)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (JHIG) - End If - NORD = Min (JLOW, NORD) - Exit - ! - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - JDEB = JLOW - NWRK = NORD - JLOW - IWRK1 = IHIGT (1) - XPIV = XDONT (IWRK1) + REAL(NWRK,dp) / REAL(NORD+NWRK,dp) * & - (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - lowloop3: Do ICRS = 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - Do ILOW = 1, JLOW - If (eq(XDONT(IHIGT(ICRS)) , XDONT (ILOWT(ILOW)))) & - Cycle lowloop3 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW > NORD) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do lowloop3 - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! ______________________________ - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + if (JLOW == NORD) Exit + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to NORD + ! + If (NORD > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 ILOWT (JLOW) = IHIGT (IHIG) + IHIG = 0 + Do ICRS = 1, JHIG + If (ne(XDONT(IHIGT (ICRS)), XMIN)) then + IHIG = IHIG + 1 + IHIGT (IHIG) = IHIGT (ICRS) + End If + End Do + JHIG = IHIG + Else + ILOW = ILOWT (JLOW) + XMAX = XDONT (ILOW) + Do ICRS = 1, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to NORD. In order to make better pivot choices, we + ! decrease NORD if we already know that we don't have that + ! many distinct values as a whole. + ! + IF (JLOW + JHIG < NORD) NORD = JLOW + JHIG + Select Case (NORD - JLOW) + ! ______________________________ + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JHIG) + ! + ! Not enough values in high part either (too many duplicates) + ! + Case (0) + NORD = JLOW + ! + Case (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + NORD = JLOW + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (le(XDONT(IHIGT(1)), XDONT(IHIGT(2)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + ElseIf (eq(XDONT(IHIGT(1)), XDONT(IHIGT(2)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + NORD = JLOW + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! - ! ______________________________ - ! - Case (0) + Case (3) ! - ! Low part is exactly what we want ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 1 + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JHIG = JHIG + 1 + IF (ne(XDONT(IHIGT(JHIG)), XDONT(ILOWT(JLOW)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (JHIG) + End If + JHIG = JHIG + 1 + IF (ne(XDONT(IHIGT(JHIG)), XDONT(ILOWT(JLOW)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (JHIG) + End If + NORD = Min (JLOW, NORD) Exit ! - ! ______________________________ - ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - IRNGT (1) = ILOWT (1) - Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - insert1: Do ICRS = NORD + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do ILOW = 1, NORD - 1 - If (XWRK <= XDONT(IRNGT(ILOW))) Then - If (eq(XWRK , XDONT(IRNGT(ILOW)))) Cycle insert1 - Exit - End If - End Do - Do IDCR = NORD - 1, ILOW, - 1 - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If - End Do insert1 - ! - Return - ! - ! ______________________________ - ! - Case (:-6) + Case (4 :) ! - ! last case: too many values in low part ! - IDEB = JDEB + 1 - IMIL = MIN ((JLOW+IDEB) / 2, NORD) - IFIN = MIN (JLOW, NORD+1) - ! - ! One chooses a pivot from 1st, last, and middle values - ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(IDEB)) + REAL(NORD,dp)/REAL(JLOW+NORD,dp) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + REAL(2*NORD-JDEB,dp)/REAL(JLOW+NORD,dp) * & - (XDONT(ILOWT(IFIN))-XPIV0) - Else - IDEB = 1 - End If + XPIV0 = XPIV + IFIN = JHIG ! - ! One takes values > XPIV to IHIGT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough low values + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + JDEB = JLOW + NWRK = NORD - JLOW + IWRK1 = IHIGT (1) + XPIV = XDONT (IWRK1) + REAL(NWRK, dp) / REAL(NORD + NWRK, dp) * & + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) + ! + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - IFIN = JLOW - JLOW = JDEB - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = JDEB - lowloop4: Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - XWRK1 = XDONT(ILOWT(ICRS)) - Do ILOW = IDEB, JLOW - If (eq(XWRK1 , XDONT(ILOWT(ILOW)))) & - Cycle lowloop4 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do lowloop4 - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - lowloop5: Do ICRS = IDEB, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - XWRK1 = XDONT(ILOWT(ICRS)) - Do ILOW = IDEB, JLOW - If (eq(XWRK1 , XDONT(ILOWT(ILOW)))) & - Cycle lowloop5 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do lowloop5 - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! ______________________________ - ! + lowloop3 : Do ICRS = 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + Do ILOW = 1, JLOW + If (eq(XDONT(IHIGT(ICRS)), XDONT (ILOWT(ILOW)))) & + Cycle lowloop3 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW > NORD) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do lowloop3 + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! ______________________________ + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + Exit + ! + ! ______________________________ + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! ______________________________ + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + Do ICRS = 2, NORD + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + insert1 : Do ICRS = NORD + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do ILOW = 1, NORD - 1 + If (XWRK <= XDONT(IRNGT(ILOW))) Then + If (eq(XWRK, XDONT(IRNGT(ILOW)))) Cycle insert1 + Exit + End If + End Do + Do IDCR = NORD - 1, ILOW, - 1 + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do insert1 + ! + Return + ! + ! ______________________________ + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + IDEB = JDEB + 1 + IMIL = MIN ((JLOW + IDEB) / 2, NORD) + IFIN = MIN (JLOW, NORD + 1) + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(IDEB)) + REAL(NORD, dp) / REAL(JLOW + NORD, dp) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + REAL(2 * NORD - JDEB, dp) / REAL(JLOW + NORD, dp) * & + (XDONT(ILOWT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values > XPIV to IHIGT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough low values + ! + JHIG = 0 + IFIN = JLOW + JLOW = JDEB + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = JDEB + lowloop4 : Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + XWRK1 = XDONT(ILOWT(ICRS)) + Do ILOW = IDEB, JLOW + If (eq(XWRK1, XDONT(ILOWT(ILOW)))) & + Cycle lowloop4 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do lowloop4 + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + lowloop5 : Do ICRS = IDEB, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + XWRK1 = XDONT(ILOWT(ICRS)) + Do ILOW = IDEB, JLOW + If (eq(XWRK1, XDONT(ILOWT(ILOW)))) & + Cycle lowloop5 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do lowloop5 + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! ______________________________ + ! End Do ! ! Now, we only need to complete ranking of the 1:NORD set @@ -11587,16 +11587,16 @@ Subroutine D_unipar (XDONT, IRNGT, NORD) ! IRNGT (1) = ILOWT (1) Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -11622,118 +11622,118 @@ Subroutine R_unipar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (InOut) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (InOut) :: NORD ! __________________________________________________________ - Real(kind=sp) :: XPIV, XWRK, XWRK1, XMIN, XMAX, XPIV0 + Real(kind = sp) :: XPIV, XWRK, XWRK1, XMIN, XMAX, XPIV0 ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) Then - NORD = 1 - IRNGT (1) = 1 - End If - Return + If (NORD >= 1) Then + NORD = 1 + IRNGT (1) = 1 + End If + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! Do ICRS = 2, NDON - If (eq(XDONT(ICRS) , XDONT(1))) Then - Cycle - Else If (XDONT(ICRS) < XDONT(1)) Then - ILOWT (1) = ICRS - IHIGT (1) = 1 - Else - ILOWT (1) = 1 - IHIGT (1) = ICRS - End If - If (.true.) Exit ! Exit ! JM + If (eq(XDONT(ICRS), XDONT(1))) Then + Cycle + Else If (XDONT(ICRS) < XDONT(1)) Then + ILOWT (1) = ICRS + IHIGT (1) = 1 + Else + ILOWT (1) = 1 + IHIGT (1) = ICRS + End If + If (.true.) Exit ! Exit ! JM End Do ! If (NDON <= ICRS) Then - NORD = Min (NORD, 2) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - Return + NORD = Min (NORD, 2) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + Return End If ! ICRS = ICRS + 1 JHIG = 1 If (XDONT(ICRS) < XDONT(IHIGT(1))) Then - If (XDONT(ICRS) < XDONT(ILOWT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (1) - IHIGT (1) = ILOWT (1) - ILOWT (1) = ICRS - Else If (XDONT(ICRS) > XDONT(ILOWT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (1) - IHIGT (1) = ICRS - End If + If (XDONT(ICRS) < XDONT(ILOWT(1))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (1) + IHIGT (1) = ILOWT (1) + ILOWT (1) = ICRS + Else If (XDONT(ICRS) > XDONT(ILOWT(1))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (1) + IHIGT (1) = ICRS + End If ElseIf (XDONT(ICRS) > XDONT(IHIGT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS End If ! If (NDON <= ICRS) Then - NORD = Min (NORD, JHIG+1) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - Return + NORD = Min (NORD, JHIG + 1) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + Return End If ! If (XDONT(NDON) < XDONT(IHIGT(1))) Then - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - Do IDCR = JHIG, 1, -1 - IHIGT (IDCR+1) = IHIGT (IDCR) - End Do - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - JHIG = JHIG + 1 - ElseIf (XDONT(NDON) > XDONT(ILOWT(1))) Then - Do IDCR = JHIG, 1, -1 - IHIGT (IDCR+1) = IHIGT (IDCR) - End Do - IHIGT (1) = NDON - JHIG = JHIG + 1 - End If + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + Do IDCR = JHIG, 1, -1 + IHIGT (IDCR + 1) = IHIGT (IDCR) + End Do + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + JHIG = JHIG + 1 + ElseIf (XDONT(NDON) > XDONT(ILOWT(1))) Then + Do IDCR = JHIG, 1, -1 + IHIGT (IDCR + 1) = IHIGT (IDCR) + End Do + IHIGT (1) = NDON + JHIG = JHIG + 1 + End If ElseIf (XDONT(NDON) > XDONT(IHIGT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = NDON + JHIG = JHIG + 1 + IHIGT (JHIG) = NDON End If ! - If (NDON <= ICRS+1) Then - NORD = Min (NORD, JHIG+1) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - If (NORD >= 4) IRNGT (4) = IHIGT (3) - Return + If (NDON <= ICRS + 1) Then + NORD = Min (NORD, JHIG + 1) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + If (NORD >= 4) IRNGT (4) = IHIGT (3) + Return End If ! JDEB = 0 IDEB = JDEB + 1 JLOW = IDEB - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,sp)/REAL(NDON+NORD,sp) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(IDEB))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,sp)/REAL(NDON+NORD,sp) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(IDEB))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(IDEB)) + REAL(2*NORD,sp) / REAL(NDON+NORD,sp) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(IDEB))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(IDEB)) + REAL(2 * NORD, sp) / REAL(NDON + NORD, sp) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(IDEB))) End If XPIV0 = XPIV ! @@ -11749,67 +11749,67 @@ Subroutine R_unipar (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) > XPIV) Then - lowloop1: Do - ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - Do ILOW = 1, JLOW - If (eq(XDONT(ICRS) , XDONT(ILOWT(ILOW)))) Cycle lowloop1 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do lowloop1 - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If + lowloop1 : Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + Do ILOW = 1, JLOW + If (eq(XDONT(ICRS), XDONT(ILOWT(ILOW)))) Cycle lowloop1 End Do - End If - ! - ! + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do lowloop1 + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - lowloop2: Do ICRS = ICRS + 1, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - Do ILOW = 1, JLOW - If (eq(XDONT(ICRS) , XDONT (ILOWT(ILOW)))) Cycle lowloop2 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do lowloop2 - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + lowloop2 : Do ICRS = ICRS + 1, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + Do ILOW = 1, JLOW + If (eq(XDONT(ICRS), XDONT (ILOWT(ILOW)))) Cycle lowloop2 End Do - End If + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do lowloop2 + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + End If + End Do + End If End If ! JLM2 = 0 @@ -11817,370 +11817,370 @@ Subroutine R_unipar (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JLOW == NORD) Exit - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to NORD - ! - If (NORD > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIG = 0 - Do ICRS = 1, JHIG - If (ne(XDONT(IHIGT (ICRS)) , XMIN)) then - IHIG = IHIG + 1 - IHIGT (IHIG ) = IHIGT (ICRS) - End If - End Do - JHIG = IHIG - Else - ILOW = ILOWT (JLOW) - XMAX = XDONT (ILOW) - Do ICRS = 1, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to NORD. In order to make better pivot choices, we - ! decrease NORD if we already know that we don't have that - ! many distinct values as a whole. - ! - IF (JLOW+JHIG < NORD) NORD = JLOW+JHIG - Select Case (NORD-JLOW) - ! ______________________________ - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JHIG) - ! - ! Not enough values in high part either (too many duplicates) - ! - Case (0) - NORD = JLOW - ! - Case (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - NORD = JLOW - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (le(XDONT(IHIGT(1)) , XDONT(IHIGT(2)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - ElseIf (eq(XDONT(IHIGT(1)) , XDONT(IHIGT(2)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - NORD = JLOW - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 1 - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JHIG = JHIG + 1 - IF (ne(XDONT(IHIGT(JHIG)) , XDONT(ILOWT(JLOW)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (JHIG) - End If - JHIG = JHIG + 1 - IF (ne(XDONT(IHIGT(JHIG)) , XDONT(ILOWT(JLOW)))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (JHIG) - End If - NORD = Min (JLOW, NORD) - Exit - ! - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - JDEB = JLOW - NWRK = NORD - JLOW - IWRK1 = IHIGT (1) - XPIV = XDONT (IWRK1) + REAL(NWRK,sp) / REAL(NORD+NWRK,sp) * & - (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - lowloop3: Do ICRS = 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - Do ILOW = 1, JLOW - If (eq(XDONT(IHIGT(ICRS)) , XDONT (ILOWT(ILOW)))) & - Cycle lowloop3 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW > NORD) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do lowloop3 - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! ______________________________ - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + if (JLOW == NORD) Exit + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to NORD + ! + If (NORD > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 ILOWT (JLOW) = IHIGT (IHIG) + IHIG = 0 + Do ICRS = 1, JHIG + If (ne(XDONT(IHIGT (ICRS)), XMIN)) then + IHIG = IHIG + 1 + IHIGT (IHIG) = IHIGT (ICRS) + End If + End Do + JHIG = IHIG + Else + ILOW = ILOWT (JLOW) + XMAX = XDONT (ILOW) + Do ICRS = 1, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to NORD. In order to make better pivot choices, we + ! decrease NORD if we already know that we don't have that + ! many distinct values as a whole. + ! + IF (JLOW + JHIG < NORD) NORD = JLOW + JHIG + Select Case (NORD - JLOW) + ! ______________________________ + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JHIG) + ! + ! Not enough values in high part either (too many duplicates) + ! + Case (0) + NORD = JLOW + ! + Case (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + NORD = JLOW + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (le(XDONT(IHIGT(1)), XDONT(IHIGT(2)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + ElseIf (eq(XDONT(IHIGT(1)), XDONT(IHIGT(2)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + NORD = JLOW + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! - ! ______________________________ - ! - Case (0) + Case (3) ! - ! Low part is exactly what we want ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 1 + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JHIG = JHIG + 1 + IF (ne(XDONT(IHIGT(JHIG)), XDONT(ILOWT(JLOW)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (JHIG) + End If + JHIG = JHIG + 1 + IF (ne(XDONT(IHIGT(JHIG)), XDONT(ILOWT(JLOW)))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (JHIG) + End If + NORD = Min (JLOW, NORD) Exit ! - ! ______________________________ - ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - IRNGT (1) = ILOWT (1) - Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - insert1: Do ICRS = NORD + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do ILOW = 1, NORD - 1 - If (XWRK <= XDONT(IRNGT(ILOW))) Then - If (eq(XWRK , XDONT(IRNGT(ILOW)))) Cycle insert1 - Exit - End If - End Do - Do IDCR = NORD - 1, ILOW, - 1 - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If - End Do insert1 - ! - Return - ! - ! ______________________________ - ! - Case (:-6) + Case (4 :) ! - ! last case: too many values in low part ! - IDEB = JDEB + 1 - IMIL = MIN ((JLOW+IDEB) / 2, NORD) - IFIN = MIN (JLOW, NORD+1) - ! - ! One chooses a pivot from 1st, last, and middle values - ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(IDEB)) + REAL(NORD,sp)/REAL(JLOW+NORD,sp) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + REAL(2*NORD-JDEB,sp)/REAL(JLOW+NORD,sp) * & - (XDONT(ILOWT(IFIN))-XPIV0) - Else - IDEB = 1 - End If + XPIV0 = XPIV + IFIN = JHIG ! - ! One takes values > XPIV to IHIGT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough low values + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + JDEB = JLOW + NWRK = NORD - JLOW + IWRK1 = IHIGT (1) + XPIV = XDONT (IWRK1) + REAL(NWRK, sp) / REAL(NORD + NWRK, sp) * & + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) + ! + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - IFIN = JLOW - JLOW = JDEB - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = JDEB - lowloop4: Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - XWRK1 = XDONT(ILOWT(ICRS)) - Do ILOW = IDEB, JLOW - If (eq(XWRK1 , XDONT(ILOWT(ILOW)))) & - Cycle lowloop4 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do lowloop4 - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - lowloop5: Do ICRS = IDEB, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - XWRK1 = XDONT(ILOWT(ICRS)) - Do ILOW = IDEB, JLOW - If (eq(XWRK1 , XDONT(ILOWT(ILOW)))) & - Cycle lowloop5 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do lowloop5 - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! ______________________________ - ! + lowloop3 : Do ICRS = 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + Do ILOW = 1, JLOW + If (eq(XDONT(IHIGT(ICRS)), XDONT (ILOWT(ILOW)))) & + Cycle lowloop3 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW > NORD) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do lowloop3 + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! ______________________________ + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + Exit + ! + ! ______________________________ + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! ______________________________ + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + Do ICRS = 2, NORD + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + insert1 : Do ICRS = NORD + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do ILOW = 1, NORD - 1 + If (XWRK <= XDONT(IRNGT(ILOW))) Then + If (eq(XWRK, XDONT(IRNGT(ILOW)))) Cycle insert1 + Exit + End If + End Do + Do IDCR = NORD - 1, ILOW, - 1 + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do insert1 + ! + Return + ! + ! ______________________________ + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + IDEB = JDEB + 1 + IMIL = MIN ((JLOW + IDEB) / 2, NORD) + IFIN = MIN (JLOW, NORD + 1) + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(IDEB)) + REAL(NORD, sp) / REAL(JLOW + NORD, sp) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + REAL(2 * NORD - JDEB, sp) / REAL(JLOW + NORD, sp) * & + (XDONT(ILOWT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values > XPIV to IHIGT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough low values + ! + JHIG = 0 + IFIN = JLOW + JLOW = JDEB + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = JDEB + lowloop4 : Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + XWRK1 = XDONT(ILOWT(ICRS)) + Do ILOW = IDEB, JLOW + If (eq(XWRK1, XDONT(ILOWT(ILOW)))) & + Cycle lowloop4 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do lowloop4 + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + lowloop5 : Do ICRS = IDEB, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + XWRK1 = XDONT(ILOWT(ICRS)) + Do ILOW = IDEB, JLOW + If (eq(XWRK1, XDONT(ILOWT(ILOW)))) & + Cycle lowloop5 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do lowloop5 + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! ______________________________ + ! End Do ! ! Now, we only need to complete ranking of the 1:NORD set @@ -12188,16 +12188,16 @@ Subroutine R_unipar (XDONT, IRNGT, NORD) ! IRNGT (1) = ILOWT (1) Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -12223,118 +12223,118 @@ Subroutine I_unipar (XDONT, IRNGT, NORD) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (InOut) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (InOut) :: NORD ! __________________________________________________________ - Integer(kind=i4) :: XPIV, XWRK, XWRK1, XMIN, XMAX, XPIV0 + Integer(kind = i4) :: XPIV, XWRK, XWRK1, XMIN, XMAX, XPIV0 ! - Integer(kind=i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 - Integer(kind=i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1 + Integer(kind = i4), Dimension (SIZE(XDONT)) :: ILOWT, IHIGT + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG, IWRK, IWRK1, IWRK2, IWRK3 + Integer(kind = i4) :: IDEB, JDEB, IMIL, IFIN, NWRK, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1 ! NDON = SIZE (XDONT) ! ! First loop is used to fill-in ILOWT, IHIGT at the same time ! If (NDON < 2) Then - If (NORD >= 1) Then - NORD = 1 - IRNGT (1) = 1 - End If - Return + If (NORD >= 1) Then + NORD = 1 + IRNGT (1) = 1 + End If + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! Do ICRS = 2, NDON - If (XDONT(ICRS) == XDONT(1)) Then - Cycle - Else If (XDONT(ICRS) < XDONT(1)) Then - ILOWT (1) = ICRS - IHIGT (1) = 1 - Else - ILOWT (1) = 1 - IHIGT (1) = ICRS - End If - If (.true.) Exit ! Exit ! JM + If (XDONT(ICRS) == XDONT(1)) Then + Cycle + Else If (XDONT(ICRS) < XDONT(1)) Then + ILOWT (1) = ICRS + IHIGT (1) = 1 + Else + ILOWT (1) = 1 + IHIGT (1) = ICRS + End If + If (.true.) Exit ! Exit ! JM End Do ! If (NDON <= ICRS) Then - NORD = Min (NORD, 2) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - Return + NORD = Min (NORD, 2) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + Return End If ! ICRS = ICRS + 1 JHIG = 1 If (XDONT(ICRS) < XDONT(IHIGT(1))) Then - If (XDONT(ICRS) < XDONT(ILOWT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (1) - IHIGT (1) = ILOWT (1) - ILOWT (1) = ICRS - Else If (XDONT(ICRS) > XDONT(ILOWT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (1) - IHIGT (1) = ICRS - End If + If (XDONT(ICRS) < XDONT(ILOWT(1))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (1) + IHIGT (1) = ILOWT (1) + ILOWT (1) = ICRS + Else If (XDONT(ICRS) > XDONT(ILOWT(1))) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (1) + IHIGT (1) = ICRS + End If ElseIf (XDONT(ICRS) > XDONT(IHIGT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS End If ! If (NDON <= ICRS) Then - NORD = Min (NORD, JHIG+1) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - Return + NORD = Min (NORD, JHIG + 1) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + Return End If ! If (XDONT(NDON) < XDONT(IHIGT(1))) Then - If (XDONT(NDON) < XDONT(ILOWT(1))) Then - Do IDCR = JHIG, 1, -1 - IHIGT (IDCR+1) = IHIGT (IDCR) - End Do - IHIGT (1) = ILOWT (1) - ILOWT (1) = NDON - JHIG = JHIG + 1 - ElseIf (XDONT(NDON) > XDONT(ILOWT(1))) Then - Do IDCR = JHIG, 1, -1 - IHIGT (IDCR+1) = IHIGT (IDCR) - End Do - IHIGT (1) = NDON - JHIG = JHIG + 1 - End If + If (XDONT(NDON) < XDONT(ILOWT(1))) Then + Do IDCR = JHIG, 1, -1 + IHIGT (IDCR + 1) = IHIGT (IDCR) + End Do + IHIGT (1) = ILOWT (1) + ILOWT (1) = NDON + JHIG = JHIG + 1 + ElseIf (XDONT(NDON) > XDONT(ILOWT(1))) Then + Do IDCR = JHIG, 1, -1 + IHIGT (IDCR + 1) = IHIGT (IDCR) + End Do + IHIGT (1) = NDON + JHIG = JHIG + 1 + End If ElseIf (XDONT(NDON) > XDONT(IHIGT(1))) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = NDON + JHIG = JHIG + 1 + IHIGT (JHIG) = NDON End If ! - If (NDON <= ICRS+1) Then - NORD = Min (NORD, JHIG+1) - If (NORD >= 1) IRNGT (1) = ILOWT (1) - If (NORD >= 2) IRNGT (2) = IHIGT (1) - If (NORD >= 3) IRNGT (3) = IHIGT (2) - If (NORD >= 4) IRNGT (4) = IHIGT (3) - Return + If (NDON <= ICRS + 1) Then + NORD = Min (NORD, JHIG + 1) + If (NORD >= 1) IRNGT (1) = ILOWT (1) + If (NORD >= 2) IRNGT (2) = IHIGT (1) + If (NORD >= 3) IRNGT (3) = IHIGT (2) + If (NORD >= 4) IRNGT (4) = IHIGT (3) + Return End If ! JDEB = 0 IDEB = JDEB + 1 JLOW = IDEB - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2*NORD,sp)/REAL(NDON+NORD,sp),i4) * & - (XDONT(IHIGT(3))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(IHIGT(3)) - XDONT(ILOWT(IDEB))) If (XPIV >= XDONT(IHIGT(1))) Then - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2*NORD,sp)/REAL(NDON+NORD,sp),i4) * & - (XDONT(IHIGT(2))-XDONT(ILOWT(IDEB))) - If (XPIV >= XDONT(IHIGT(1))) & - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2*NORD,sp) / REAL(NDON+NORD,sp),i4) * & - (XDONT(IHIGT(1))-XDONT(ILOWT(IDEB))) + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(IHIGT(2)) - XDONT(ILOWT(IDEB))) + If (XPIV >= XDONT(IHIGT(1))) & + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(2 * NORD, sp) / REAL(NDON + NORD, sp), i4) * & + (XDONT(IHIGT(1)) - XDONT(ILOWT(IDEB))) End If XPIV0 = XPIV ! @@ -12350,67 +12350,67 @@ Subroutine I_unipar (XDONT, IRNGT, NORD) ! ! If (XDONT(NDON) > XPIV) Then - lowloop1: Do - ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - Do ILOW = 1, JLOW - If (XDONT(ICRS) == XDONT(ILOWT(ILOW))) Cycle lowloop1 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do lowloop1 - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - Else If (ICRS >= NDON) Then - Exit - End If + lowloop1 : Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + Do ILOW = 1, JLOW + If (XDONT(ICRS) == XDONT(ILOWT(ILOW))) Cycle lowloop1 End Do - End If - ! - ! + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do lowloop1 + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - lowloop2: Do ICRS = ICRS + 1, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ICRS - Else - Do ILOW = 1, JLOW - If (XDONT(ICRS) == XDONT (ILOWT(ILOW))) Cycle lowloop2 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - If (JLOW >= NORD) Exit - End If - End Do lowloop2 - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - ILOWT (JLOW) = ICRS - End If + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + lowloop2 : Do ICRS = ICRS + 1, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ICRS + Else + Do ILOW = 1, JLOW + If (XDONT(ICRS) == XDONT (ILOWT(ILOW))) Cycle lowloop2 End Do - End If + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + If (JLOW >= NORD) Exit + End If + End Do lowloop2 + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + ILOWT (JLOW) = ICRS + End If + End Do + End If End If ! JLM2 = 0 @@ -12418,370 +12418,370 @@ Subroutine I_unipar (XDONT, IRNGT, NORD) JHM2 = 0 JHM1 = 0 Do - if (JLOW == NORD) Exit - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to NORD - ! - If (NORD > JLOW) Then - XMIN = XDONT (IHIGT(1)) - IHIG = 1 - Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (IHIG) - IHIG = 0 - Do ICRS = 1, JHIG - If (XDONT(IHIGT (ICRS)) /= XMIN) then - IHIG = IHIG + 1 - IHIGT (IHIG ) = IHIGT (ICRS) - End If - End Do - JHIG = IHIG - Else - ILOW = ILOWT (JLOW) - XMAX = XDONT (ILOW) - Do ICRS = 1, JLOW - If (XDONT(ILOWT(ICRS)) > XMAX) Then - IWRK = ILOWT (ICRS) - XMAX = XDONT (IWRK) - ILOWT (ICRS) = ILOW - ILOW = IWRK - End If - End Do - JLOW = JLOW - 1 - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to NORD. In order to make better pivot choices, we - ! decrease NORD if we already know that we don't have that - ! many distinct values as a whole. - ! - IF (JLOW+JHIG < NORD) NORD = JLOW+JHIG - Select Case (NORD-JLOW) - ! ______________________________ - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - Select Case (JHIG) - ! - ! Not enough values in high part either (too many duplicates) - ! - Case (0) - NORD = JLOW - ! - Case (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - NORD = JLOW - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - ElseIf (XDONT(IHIGT(1)) == XDONT(IHIGT(2))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - NORD = JLOW - Else - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (2) - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (3) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (3) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - JHIG = 1 - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (1) - JHIG = JHIG + 1 - IF (XDONT(IHIGT(JHIG)) /= XDONT(ILOWT(JLOW))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (JHIG) - End If - JHIG = JHIG + 1 - IF (XDONT(IHIGT(JHIG)) /= XDONT(ILOWT(JLOW))) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (JHIG) - End If - NORD = Min (JLOW, NORD) - Exit - ! - Case (4:) - ! - ! - XPIV0 = XPIV - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - IWRK1 = IHIGT (1) - IWRK2 = IHIGT (2) - IWRK3 = IHIGT (IFIN) - If (XDONT(IWRK2) < XDONT(IWRK1)) Then - IHIGT (1) = IWRK2 - IHIGT (2) = IWRK1 - IWRK2 = IWRK1 - End If - If (XDONT(IWRK2) > XDONT(IWRK3)) Then - IHIGT (IFIN) = IWRK2 - IHIGT (2) = IWRK3 - IWRK2 = IWRK3 - If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then - IHIGT (2) = IHIGT (1) - IHIGT (1) = IWRK2 - End If - End If - ! - JDEB = JLOW - NWRK = NORD - JLOW - IWRK1 = IHIGT (1) - XPIV = XDONT (IWRK1) + INT(REAL(NWRK,sp) / REAL(NORD+NWRK,sp),i4) * & - (XDONT(IHIGT(IFIN))-XDONT(IWRK1)) - ! - ! One takes values <= pivot to ILOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - lowloop3: Do ICRS = 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - Do ILOW = 1, JLOW - If (XDONT(IHIGT(ICRS)) == XDONT (ILOWT(ILOW))) & - Cycle lowloop3 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - If (JLOW > NORD) Exit - Else - JHIG = JHIG + 1 - IHIGT (JHIG) = IHIGT (ICRS) - End If - End Do lowloop3 - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(IHIGT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = IHIGT (ICRS) - End If - End Do - End Select - ! - ! ______________________________ - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + if (JLOW == NORD) Exit + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to NORD + ! + If (NORD > JLOW) Then XMIN = XDONT (IHIGT(1)) IHIG = 1 Do ICRS = 2, JHIG - If (XDONT(IHIGT(ICRS)) < XMIN) Then - XMIN = XDONT (IHIGT(ICRS)) - IHIG = ICRS - End If + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If End Do ! JLOW = JLOW + 1 ILOWT (JLOW) = IHIGT (IHIG) + IHIG = 0 + Do ICRS = 1, JHIG + If (XDONT(IHIGT (ICRS)) /= XMIN) then + IHIG = IHIG + 1 + IHIGT (IHIG) = IHIGT (ICRS) + End If + End Do + JHIG = IHIG + Else + ILOW = ILOWT (JLOW) + XMAX = XDONT (ILOW) + Do ICRS = 1, JLOW + If (XDONT(ILOWT(ICRS)) > XMAX) Then + IWRK = ILOWT (ICRS) + XMAX = XDONT (IWRK) + ILOWT (ICRS) = ILOW + ILOW = IWRK + End If + End Do + JLOW = JLOW - 1 + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to NORD. In order to make better pivot choices, we + ! decrease NORD if we already know that we don't have that + ! many distinct values as a whole. + ! + IF (JLOW + JHIG < NORD) NORD = JLOW + JHIG + Select Case (NORD - JLOW) + ! ______________________________ + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + Select Case (JHIG) + ! + ! Not enough values in high part either (too many duplicates) + ! + Case (0) + NORD = JLOW + ! + Case (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + NORD = JLOW + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XDONT(IHIGT(1)) <= XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + ElseIf (XDONT(IHIGT(1)) == XDONT(IHIGT(2))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + NORD = JLOW + Else + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (2) + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + End If Exit ! - ! ______________________________ - ! - Case (0) + Case (3) ! - ! Low part is exactly what we want ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (3) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (3) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + JHIG = 1 + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (1) + JHIG = JHIG + 1 + IF (XDONT(IHIGT(JHIG)) /= XDONT(ILOWT(JLOW))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (JHIG) + End If + JHIG = JHIG + 1 + IF (XDONT(IHIGT(JHIG)) /= XDONT(ILOWT(JLOW))) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (JHIG) + End If + NORD = Min (JLOW, NORD) Exit ! - ! ______________________________ - ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - IRNGT (1) = ILOWT (1) - Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK - End Do - ! - XWRK1 = XDONT (IRNGT(NORD)) - insert1: Do ICRS = NORD + 1, JLOW - If (XDONT(ILOWT (ICRS)) < XWRK1) Then - XWRK = XDONT (ILOWT (ICRS)) - Do ILOW = 1, NORD - 1 - If (XWRK <= XDONT(IRNGT(ILOW))) Then - If (XWRK == XDONT(IRNGT(ILOW))) Cycle insert1 - Exit - End If - End Do - Do IDCR = NORD - 1, ILOW, - 1 - IRNGT (IDCR+1) = IRNGT (IDCR) - End Do - IRNGT (IDCR+1) = ILOWT (ICRS) - XWRK1 = XDONT (IRNGT(NORD)) - End If - End Do insert1 - ! - Return - ! - ! ______________________________ - ! - Case (:-6) - ! - ! last case: too many values in low part + Case (4 :) ! - IDEB = JDEB + 1 - IMIL = MIN ((JLOW+IDEB) / 2, NORD) - IFIN = MIN (JLOW, NORD+1) ! - ! One chooses a pivot from 1st, last, and middle values - ! - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then - IWRK = ILOWT (IFIN) - ILOWT (IFIN) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then - IWRK = ILOWT (IDEB) - ILOWT (IDEB) = ILOWT (IMIL) - ILOWT (IMIL) = IWRK - End If - End If - If (IFIN <= 3) Exit - ! - XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(NORD,sp)/REAL(JLOW+NORD,sp),i4) * & - (XDONT(ILOWT(IFIN))-XDONT(ILOWT(1))) - If (JDEB > 0) Then - If (XPIV <= XPIV0) & - XPIV = XPIV0 + INT(REAL(2*NORD-JDEB,sp)/REAL(JLOW+NORD,sp),i4) * & - (XDONT(ILOWT(IFIN))-XPIV0) - Else - IDEB = 1 - End If + XPIV0 = XPIV + IFIN = JHIG ! - ! One takes values > XPIV to IHIGT - ! However, we do not process the first values if we have been - ! through the case when we did not have enough low values + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + IWRK1 = IHIGT (1) + IWRK2 = IHIGT (2) + IWRK3 = IHIGT (IFIN) + If (XDONT(IWRK2) < XDONT(IWRK1)) Then + IHIGT (1) = IWRK2 + IHIGT (2) = IWRK1 + IWRK2 = IWRK1 + End If + If (XDONT(IWRK2) > XDONT(IWRK3)) Then + IHIGT (IFIN) = IWRK2 + IHIGT (2) = IWRK3 + IWRK2 = IWRK3 + If (XDONT(IWRK2) < XDONT(IHIGT(1))) Then + IHIGT (2) = IHIGT (1) + IHIGT (1) = IWRK2 + End If + End If + ! + JDEB = JLOW + NWRK = NORD - JLOW + IWRK1 = IHIGT (1) + XPIV = XDONT (IWRK1) + INT(REAL(NWRK, sp) / REAL(NORD + NWRK, sp), i4) * & + (XDONT(IHIGT(IFIN)) - XDONT(IWRK1)) + ! + ! One takes values <= pivot to ILOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - IFIN = JLOW - JLOW = JDEB - ! - If (XDONT(ILOWT(IFIN)) > XPIV) Then - ICRS = JDEB - lowloop4: Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - XWRK1 = XDONT(ILOWT(ICRS)) - Do ILOW = IDEB, JLOW - If (XWRK1 == XDONT(ILOWT(ILOW))) & - Cycle lowloop4 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do lowloop4 - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - lowloop5: Do ICRS = IDEB, IFIN - If (XDONT(ILOWT(ICRS)) > XPIV) Then - JHIG = JHIG + 1 - IHIGT (JHIG) = ILOWT (ICRS) - Else - XWRK1 = XDONT(ILOWT(ICRS)) - Do ILOW = IDEB, JLOW - If (XWRK1 == XDONT(ILOWT(ILOW))) & - Cycle lowloop5 - End Do - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - If (JLOW >= NORD) Exit - End If - End Do lowloop5 - ! - Do ICRS = ICRS + 1, IFIN - If (XDONT(ILOWT(ICRS)) <= XPIV) Then - JLOW = JLOW + 1 - ILOWT (JLOW) = ILOWT (ICRS) - End If - End Do - End If - ! - End Select - ! ______________________________ - ! + lowloop3 : Do ICRS = 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + Do ILOW = 1, JLOW + If (XDONT(IHIGT(ICRS)) == XDONT (ILOWT(ILOW))) & + Cycle lowloop3 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + If (JLOW > NORD) Exit + Else + JHIG = JHIG + 1 + IHIGT (JHIG) = IHIGT (ICRS) + End If + End Do lowloop3 + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(IHIGT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (ICRS) + End If + End Do + End Select + ! + ! ______________________________ + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XDONT (IHIGT(1)) + IHIG = 1 + Do ICRS = 2, JHIG + If (XDONT(IHIGT(ICRS)) < XMIN) Then + XMIN = XDONT (IHIGT(ICRS)) + IHIG = ICRS + End If + End Do + ! + JLOW = JLOW + 1 + ILOWT (JLOW) = IHIGT (IHIG) + Exit + ! + ! ______________________________ + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! ______________________________ + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + IRNGT (1) = ILOWT (1) + Do ICRS = 2, NORD + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK + End Do + ! + XWRK1 = XDONT (IRNGT(NORD)) + insert1 : Do ICRS = NORD + 1, JLOW + If (XDONT(ILOWT (ICRS)) < XWRK1) Then + XWRK = XDONT (ILOWT (ICRS)) + Do ILOW = 1, NORD - 1 + If (XWRK <= XDONT(IRNGT(ILOW))) Then + If (XWRK == XDONT(IRNGT(ILOW))) Cycle insert1 + Exit + End If + End Do + Do IDCR = NORD - 1, ILOW, - 1 + IRNGT (IDCR + 1) = IRNGT (IDCR) + End Do + IRNGT (IDCR + 1) = ILOWT (ICRS) + XWRK1 = XDONT (IRNGT(NORD)) + End If + End Do insert1 + ! + Return + ! + ! ______________________________ + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + IDEB = JDEB + 1 + IMIL = MIN ((JLOW + IDEB) / 2, NORD) + IFIN = MIN (JLOW, NORD + 1) + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + If (XDONT(ILOWT(IMIL)) > XDONT(ILOWT(IFIN))) Then + IWRK = ILOWT (IFIN) + ILOWT (IFIN) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + If (XDONT(ILOWT(IMIL)) < XDONT(ILOWT(IDEB))) Then + IWRK = ILOWT (IDEB) + ILOWT (IDEB) = ILOWT (IMIL) + ILOWT (IMIL) = IWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XDONT (ILOWT(IDEB)) + INT(REAL(NORD, sp) / REAL(JLOW + NORD, sp), i4) * & + (XDONT(ILOWT(IFIN)) - XDONT(ILOWT(1))) + If (JDEB > 0) Then + If (XPIV <= XPIV0) & + XPIV = XPIV0 + INT(REAL(2 * NORD - JDEB, sp) / REAL(JLOW + NORD, sp), i4) * & + (XDONT(ILOWT(IFIN)) - XPIV0) + Else + IDEB = 1 + End If + ! + ! One takes values > XPIV to IHIGT + ! However, we do not process the first values if we have been + ! through the case when we did not have enough low values + ! + JHIG = 0 + IFIN = JLOW + JLOW = JDEB + ! + If (XDONT(ILOWT(IFIN)) > XPIV) Then + ICRS = JDEB + lowloop4 : Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + XWRK1 = XDONT(ILOWT(ICRS)) + Do ILOW = IDEB, JLOW + If (XWRK1 == XDONT(ILOWT(ILOW))) & + Cycle lowloop4 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do lowloop4 + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + lowloop5 : Do ICRS = IDEB, IFIN + If (XDONT(ILOWT(ICRS)) > XPIV) Then + JHIG = JHIG + 1 + IHIGT (JHIG) = ILOWT (ICRS) + Else + XWRK1 = XDONT(ILOWT(ICRS)) + Do ILOW = IDEB, JLOW + If (XWRK1 == XDONT(ILOWT(ILOW))) & + Cycle lowloop5 + End Do + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + If (JLOW >= NORD) Exit + End If + End Do lowloop5 + ! + Do ICRS = ICRS + 1, IFIN + If (XDONT(ILOWT(ICRS)) <= XPIV) Then + JLOW = JLOW + 1 + ILOWT (JLOW) = ILOWT (ICRS) + End If + End Do + End If + ! + End Select + ! ______________________________ + ! End Do ! ! Now, we only need to complete ranking of the 1:NORD set @@ -12789,16 +12789,16 @@ Subroutine I_unipar (XDONT, IRNGT, NORD) ! IRNGT (1) = ILOWT (1) Do ICRS = 2, NORD - IWRK = ILOWT (ICRS) - XWRK = XDONT (IWRK) - Do IDCR = ICRS - 1, 1, - 1 - If (XWRK < XDONT(IRNGT(IDCR))) Then - IRNGT (IDCR+1) = IRNGT (IDCR) - Else - Exit - End If - End Do - IRNGT (IDCR+1) = IWRK + IWRK = ILOWT (ICRS) + XWRK = XDONT (IWRK) + Do IDCR = ICRS - 1, 1, - 1 + If (XWRK < XDONT(IRNGT(IDCR))) Then + IRNGT (IDCR + 1) = IRNGT (IDCR) + Else + Exit + End If + End Do + IRNGT (IDCR + 1) = IWRK End Do Return ! @@ -12816,42 +12816,42 @@ Subroutine D_unirnk (XVALT, IRNGT, NUNI) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - real(Kind=dp), Dimension (:), Intent (In) :: XVALT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (Out) :: NUNI + real(Kind = dp), Dimension (:), Intent (In) :: XVALT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (Out) :: NUNI ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(IRNGT)) :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2 - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB - real(Kind=dp) :: XTST, XVALA, XVALB + Integer(kind = i4), Dimension (SIZE(IRNGT)) :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2 + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + real(Kind = dp) :: XTST, XVALA, XVALB ! ! NVAL = Min (SIZE(XVALT), SIZE(IRNGT)) NUNI = NVAL ! Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IRNGT (1) = 1 - Return + IRNGT (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XVALT(IIND-1) < XVALT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XVALT(IIND - 1) < XVALT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo(NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -12863,142 +12863,142 @@ Subroutine D_unirnk (XVALT, IRNGT, NUNI) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 4) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XVALT(IRNGT(IWRKD+2)) <= XVALT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XVALT(IRNGT(IWRKD+1)) <= XVALT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XVALT(IRNGT(IWRKD+2)) <= XVALT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XVALT(IRNGT(IWRKD+1)) <= XVALT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XVALT(IRNG1) <= XVALT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 4) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XVALT(IRNGT(IWRKD + 2)) <= XVALT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XVALT(IRNGT(IWRKD + 1)) <= XVALT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XVALT(IRNGT(IWRKD + 2)) <= XVALT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XVALT(IRNGT(IWRKD + 1)) <= XVALT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XVALT(IRNG1) <= XVALT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (2*LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! One steps in the C subset, that we create in the final rank array - ! - ! Make a copy of the rank array for the iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - XVALA = XVALT (JWRKT(IINDA)) - XVALB = XVALT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XVALA > XVALB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XVALB = XVALT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XVALA = XVALT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (2 * LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! One steps in the C subset, that we create in the final rank array + ! + ! Make a copy of the rank array for the iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + XVALA = XVALT (JWRKT(IINDA)) + XVALB = XVALT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XVALA > XVALB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XVALB = XVALT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XVALA = XVALT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Last merge of A and B into C, with removal of duplicates. @@ -13009,44 +13009,44 @@ Subroutine D_unirnk (XVALT, IRNGT, NUNI) ! ! One steps in the C subset, that we create in the final rank array ! - JWRKT (1:LMTNA) = IRNGT (1:LMTNA) + JWRKT (1 : LMTNA) = IRNGT (1 : LMTNA) If (IINDB <= NVAL) Then - XTST = NEARLESS (Min(XVALT(JWRKT(1)), XVALT(IRNGT(IINDB)))) + XTST = NEARLESS (Min(XVALT(JWRKT(1)), XVALT(IRNGT(IINDB)))) Else - XTST = NEARLESS (XVALT(JWRKT(1))) + XTST = NEARLESS (XVALT(JWRKT(1))) end if Do IWRK = 1, NVAL - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA <= LMTNA) Then - If (IINDB <= NVAL) Then - If (XVALT(JWRKT(IINDA)) > XVALT(IRNGT(IINDB))) Then - IRNG = IRNGT (IINDB) - IINDB = IINDB + 1 - Else - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only A still with unprocessed values - ! - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNG = IRNGT (IWRK) - End If - If (XVALT(IRNG) > XTST) Then - XTST = XVALT (IRNG) - NUNI = NUNI + 1 - IRNGT (NUNI) = IRNG - End If - ! + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA <= LMTNA) Then + If (IINDB <= NVAL) Then + If (XVALT(JWRKT(IINDA)) > XVALT(IRNGT(IINDB))) Then + IRNG = IRNGT (IINDB) + IINDB = IINDB + 1 + Else + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only A still with unprocessed values + ! + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNG = IRNGT (IWRK) + End If + If (XVALT(IRNG) > XTST) Then + XTST = XVALT (IRNG) + NUNI = NUNI + 1 + IRNGT (NUNI) = IRNG + End If + ! End Do ! Return @@ -13064,42 +13064,42 @@ Subroutine R_unirnk (XVALT, IRNGT, NUNI) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XVALT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (Out) :: NUNI + Real(kind = sp), Dimension (:), Intent (In) :: XVALT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (Out) :: NUNI ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(IRNGT)) :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2 - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB - Real(kind=sp) :: XTST, XVALA, XVALB + Integer(kind = i4), Dimension (SIZE(IRNGT)) :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2 + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Real(kind = sp) :: XTST, XVALA, XVALB ! ! NVAL = Min (SIZE(XVALT), SIZE(IRNGT)) NUNI = NVAL ! Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IRNGT (1) = 1 - Return + IRNGT (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XVALT(IIND-1) < XVALT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XVALT(IIND - 1) < XVALT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo(NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -13111,142 +13111,142 @@ Subroutine R_unirnk (XVALT, IRNGT, NUNI) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 4) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XVALT(IRNGT(IWRKD+2)) <= XVALT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XVALT(IRNGT(IWRKD+1)) <= XVALT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XVALT(IRNGT(IWRKD+2)) <= XVALT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XVALT(IRNGT(IWRKD+1)) <= XVALT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XVALT(IRNG1) <= XVALT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 4) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XVALT(IRNGT(IWRKD + 2)) <= XVALT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XVALT(IRNGT(IWRKD + 1)) <= XVALT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XVALT(IRNGT(IWRKD + 2)) <= XVALT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XVALT(IRNGT(IWRKD + 1)) <= XVALT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XVALT(IRNG1) <= XVALT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (2*LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! One steps in the C subset, that we create in the final rank array - ! - ! Make a copy of the rank array for the iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - XVALA = XVALT (JWRKT(IINDA)) - XVALB = XVALT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XVALA > XVALB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XVALB = XVALT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XVALA = XVALT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (2 * LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! One steps in the C subset, that we create in the final rank array + ! + ! Make a copy of the rank array for the iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + XVALA = XVALT (JWRKT(IINDA)) + XVALB = XVALT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XVALA > XVALB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XVALB = XVALT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XVALA = XVALT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Last merge of A and B into C, with removal of duplicates. @@ -13257,44 +13257,44 @@ Subroutine R_unirnk (XVALT, IRNGT, NUNI) ! ! One steps in the C subset, that we create in the final rank array ! - JWRKT (1:LMTNA) = IRNGT (1:LMTNA) + JWRKT (1 : LMTNA) = IRNGT (1 : LMTNA) If (IINDB <= NVAL) Then - XTST = NEARLESS (Min(XVALT(JWRKT(1)), XVALT(IRNGT(IINDB)))) + XTST = NEARLESS (Min(XVALT(JWRKT(1)), XVALT(IRNGT(IINDB)))) Else - XTST = NEARLESS (XVALT(JWRKT(1))) + XTST = NEARLESS (XVALT(JWRKT(1))) end if Do IWRK = 1, NVAL - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA <= LMTNA) Then - If (IINDB <= NVAL) Then - If (XVALT(JWRKT(IINDA)) > XVALT(IRNGT(IINDB))) Then - IRNG = IRNGT (IINDB) - IINDB = IINDB + 1 - Else - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only A still with unprocessed values - ! - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNG = IRNGT (IWRK) - End If - If (XVALT(IRNG) > XTST) Then - XTST = XVALT (IRNG) - NUNI = NUNI + 1 - IRNGT (NUNI) = IRNG - End If - ! + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA <= LMTNA) Then + If (IINDB <= NVAL) Then + If (XVALT(JWRKT(IINDA)) > XVALT(IRNGT(IINDB))) Then + IRNG = IRNGT (IINDB) + IINDB = IINDB + 1 + Else + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only A still with unprocessed values + ! + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNG = IRNGT (IWRK) + End If + If (XVALT(IRNG) > XTST) Then + XTST = XVALT (IRNG) + NUNI = NUNI + 1 + IRNGT (NUNI) = IRNG + End If + ! End Do ! Return @@ -13312,42 +13312,42 @@ Subroutine I_unirnk (XVALT, IRNGT, NUNI) ! out of the standard loop, and use dedicated coding. ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XVALT - Integer(kind=i4), Dimension (:), Intent (Out) :: IRNGT - Integer(kind=i4), Intent (Out) :: NUNI + Integer(kind = i4), Dimension (:), Intent (In) :: XVALT + Integer(kind = i4), Dimension (:), Intent (Out) :: IRNGT + Integer(kind = i4), Intent (Out) :: NUNI ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(IRNGT)) :: JWRKT - Integer(kind=i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2 - Integer(kind=i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB - Integer(kind=i4) :: XTST, XVALA, XVALB + Integer(kind = i4), Dimension (SIZE(IRNGT)) :: JWRKT + Integer(kind = i4) :: LMTNA, LMTNC, IRNG, IRNG1, IRNG2 + Integer(kind = i4) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB + Integer(kind = i4) :: XTST, XVALA, XVALB ! ! NVAL = Min (SIZE(XVALT), SIZE(IRNGT)) NUNI = NVAL ! Select Case (NVAL) - Case (:0) - Return + Case (: 0) + Return Case (1) - IRNGT (1) = 1 - Return + IRNGT (1) = 1 + Return Case Default - Continue + End Select ! ! Fill-in the index array, creating ordered couples ! Do IIND = 2, NVAL, 2 - If (XVALT(IIND-1) < XVALT(IIND)) Then - IRNGT (IIND-1) = IIND - 1 - IRNGT (IIND) = IIND - Else - IRNGT (IIND-1) = IIND - IRNGT (IIND) = IIND - 1 - End If + If (XVALT(IIND - 1) < XVALT(IIND)) Then + IRNGT (IIND - 1) = IIND - 1 + IRNGT (IIND) = IIND + Else + IRNGT (IIND - 1) = IIND + IRNGT (IIND) = IIND - 1 + End If End Do If (Modulo(NVAL, 2) /= 0) Then - IRNGT (NVAL) = NVAL + IRNGT (NVAL) = NVAL End If ! ! We will now have ordered subsets A - B - A - B - ... @@ -13359,142 +13359,142 @@ Subroutine I_unirnk (XVALT, IRNGT, NUNI) ! First iteration. The length of the ordered subsets goes from 2 to 4 ! Do - If (NVAL <= 4) Exit - ! - ! Loop on merges of A and B into C - ! - Do IWRKD = 0, NVAL - 1, 4 - If ((IWRKD+4) > NVAL) Then - If ((IWRKD+2) >= NVAL) Exit - ! - ! 1 2 3 - ! - If (XVALT(IRNGT(IWRKD+2)) <= XVALT(IRNGT(IWRKD+3))) Exit - ! - ! 1 3 2 - ! - If (XVALT(IRNGT(IWRKD+1)) <= XVALT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNG2 - ! - ! 3 1 2 - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - IRNGT (IWRKD+3) = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNG1 - End If - If (.true.) Exit ! Exit ! JM - End If - ! - ! 1 2 3 4 - ! - If (XVALT(IRNGT(IWRKD+2)) <= XVALT(IRNGT(IWRKD+3))) Cycle - ! - ! 1 3 x x - ! - If (XVALT(IRNGT(IWRKD+1)) <= XVALT(IRNGT(IWRKD+3))) Then - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+2) = IRNGT (IWRKD+3) - If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD+4))) Then - ! 1 3 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 1 3 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - ! - ! 3 x x x - ! - Else - IRNG1 = IRNGT (IWRKD+1) - IRNG2 = IRNGT (IWRKD+2) - IRNGT (IWRKD+1) = IRNGT (IWRKD+3) - If (XVALT(IRNG1) <= XVALT(IRNGT(IWRKD+4))) Then - IRNGT (IWRKD+2) = IRNG1 - If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD+4))) Then - ! 3 1 2 4 - IRNGT (IWRKD+3) = IRNG2 - Else - ! 3 1 4 2 - IRNGT (IWRKD+3) = IRNGT (IWRKD+4) - IRNGT (IWRKD+4) = IRNG2 - End If - Else - ! 3 4 1 2 - IRNGT (IWRKD+2) = IRNGT (IWRKD+4) - IRNGT (IWRKD+3) = IRNG1 - IRNGT (IWRKD+4) = IRNG2 - End If - End If - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 4 - If (.true.) Exit ! Exit ! JM + If (NVAL <= 4) Exit + ! + ! Loop on merges of A and B into C + ! + Do IWRKD = 0, NVAL - 1, 4 + If ((IWRKD + 4) > NVAL) Then + If ((IWRKD + 2) >= NVAL) Exit + ! + ! 1 2 3 + ! + If (XVALT(IRNGT(IWRKD + 2)) <= XVALT(IRNGT(IWRKD + 3))) Exit + ! + ! 1 3 2 + ! + If (XVALT(IRNGT(IWRKD + 1)) <= XVALT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNG2 + ! + ! 3 1 2 + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNG1 + End If + If (.true.) Exit ! Exit ! JM + End If + ! + ! 1 2 3 4 + ! + If (XVALT(IRNGT(IWRKD + 2)) <= XVALT(IRNGT(IWRKD + 3))) Cycle + ! + ! 1 3 x x + ! + If (XVALT(IRNGT(IWRKD + 1)) <= XVALT(IRNGT(IWRKD + 3))) Then + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 3) + If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD + 4))) Then + ! 1 3 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 1 3 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + ! + ! 3 x x x + ! + Else + IRNG1 = IRNGT (IWRKD + 1) + IRNG2 = IRNGT (IWRKD + 2) + IRNGT (IWRKD + 1) = IRNGT (IWRKD + 3) + If (XVALT(IRNG1) <= XVALT(IRNGT(IWRKD + 4))) Then + IRNGT (IWRKD + 2) = IRNG1 + If (XVALT(IRNG2) <= XVALT(IRNGT(IWRKD + 4))) Then + ! 3 1 2 4 + IRNGT (IWRKD + 3) = IRNG2 + Else + ! 3 1 4 2 + IRNGT (IWRKD + 3) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 4) = IRNG2 + End If + Else + ! 3 4 1 2 + IRNGT (IWRKD + 2) = IRNGT (IWRKD + 4) + IRNGT (IWRKD + 3) = IRNG1 + IRNGT (IWRKD + 4) = IRNG2 + End If + End If + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 4 + If (.true.) Exit ! Exit ! JM End Do ! ! Iteration loop. Each time, the length of the ordered subsets ! is doubled. ! Do - If (2*LMTNA >= NVAL) Exit - IWRKF = 0 - LMTNC = 2 * LMTNC - ! - ! Loop on merges of A and B into C - ! - Do - IWRK = IWRKF - IWRKD = IWRKF + 1 - JINDA = IWRKF + LMTNA - IWRKF = IWRKF + LMTNC - If (IWRKF >= NVAL) Then - If (JINDA >= NVAL) Exit - IWRKF = NVAL - End If - IINDA = 1 - IINDB = JINDA + 1 - ! - ! One steps in the C subset, that we create in the final rank array - ! - ! Make a copy of the rank array for the iteration - ! - JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA) - XVALA = XVALT (JWRKT(IINDA)) - XVALB = XVALT (IRNGT(IINDB)) - ! - Do - IWRK = IWRK + 1 - ! - ! We still have unprocessed values in both A and B - ! - If (XVALA > XVALB) Then - IRNGT (IWRK) = IRNGT (IINDB) - IINDB = IINDB + 1 - If (IINDB > IWRKF) Then - ! Only A still with unprocessed values - IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA) - Exit - End If - XVALB = XVALT (IRNGT(IINDB)) - Else - IRNGT (IWRK) = JWRKT (IINDA) - IINDA = IINDA + 1 - If (IINDA > LMTNA) Exit! Only B still with unprocessed values - XVALA = XVALT (JWRKT(IINDA)) - End If - ! - End Do - End Do - ! - ! The Cs become As and Bs - ! - LMTNA = 2 * LMTNA + If (2 * LMTNA >= NVAL) Exit + IWRKF = 0 + LMTNC = 2 * LMTNC + ! + ! Loop on merges of A and B into C + ! + Do + IWRK = IWRKF + IWRKD = IWRKF + 1 + JINDA = IWRKF + LMTNA + IWRKF = IWRKF + LMTNC + If (IWRKF >= NVAL) Then + If (JINDA >= NVAL) Exit + IWRKF = NVAL + End If + IINDA = 1 + IINDB = JINDA + 1 + ! + ! One steps in the C subset, that we create in the final rank array + ! + ! Make a copy of the rank array for the iteration + ! + JWRKT (1 : LMTNA) = IRNGT (IWRKD : JINDA) + XVALA = XVALT (JWRKT(IINDA)) + XVALB = XVALT (IRNGT(IINDB)) + ! + Do + IWRK = IWRK + 1 + ! + ! We still have unprocessed values in both A and B + ! + If (XVALA > XVALB) Then + IRNGT (IWRK) = IRNGT (IINDB) + IINDB = IINDB + 1 + If (IINDB > IWRKF) Then + ! Only A still with unprocessed values + IRNGT (IWRK + 1 : IWRKF) = JWRKT (IINDA : LMTNA) + Exit + End If + XVALB = XVALT (IRNGT(IINDB)) + Else + IRNGT (IWRK) = JWRKT (IINDA) + IINDA = IINDA + 1 + If (IINDA > LMTNA) Exit! Only B still with unprocessed values + XVALA = XVALT (JWRKT(IINDA)) + End If + ! + End Do + End Do + ! + ! The Cs become As and Bs + ! + LMTNA = 2 * LMTNA End Do ! ! Last merge of A and B into C, with removal of duplicates. @@ -13505,44 +13505,44 @@ Subroutine I_unirnk (XVALT, IRNGT, NUNI) ! ! One steps in the C subset, that we create in the final rank array ! - JWRKT (1:LMTNA) = IRNGT (1:LMTNA) + JWRKT (1 : LMTNA) = IRNGT (1 : LMTNA) If (IINDB <= NVAL) Then - XTST = NEARLESS (Min(XVALT(JWRKT(1)), XVALT(IRNGT(IINDB)))) + XTST = NEARLESS (Min(XVALT(JWRKT(1)), XVALT(IRNGT(IINDB)))) Else - XTST = NEARLESS (XVALT(JWRKT(1))) + XTST = NEARLESS (XVALT(JWRKT(1))) end if Do IWRK = 1, NVAL - ! - ! We still have unprocessed values in both A and B - ! - If (IINDA <= LMTNA) Then - If (IINDB <= NVAL) Then - If (XVALT(JWRKT(IINDA)) > XVALT(IRNGT(IINDB))) Then - IRNG = IRNGT (IINDB) - IINDB = IINDB + 1 - Else - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only A still with unprocessed values - ! - IRNG = JWRKT (IINDA) - IINDA = IINDA + 1 - End If - Else - ! - ! Only B still with unprocessed values - ! - IRNG = IRNGT (IWRK) - End If - If (XVALT(IRNG) > XTST) Then - XTST = XVALT (IRNG) - NUNI = NUNI + 1 - IRNGT (NUNI) = IRNG - End If - ! + ! + ! We still have unprocessed values in both A and B + ! + If (IINDA <= LMTNA) Then + If (IINDB <= NVAL) Then + If (XVALT(JWRKT(IINDA)) > XVALT(IRNGT(IINDB))) Then + IRNG = IRNGT (IINDB) + IINDB = IINDB + 1 + Else + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only A still with unprocessed values + ! + IRNG = JWRKT (IINDA) + IINDA = IINDA + 1 + End If + Else + ! + ! Only B still with unprocessed values + ! + IRNG = IRNGT (IWRK) + End If + If (XVALT(IRNG) > XTST) Then + XTST = XVALT (IRNG) + NUNI = NUNI + 1 + IRNGT (NUNI) = IRNG + End If + ! End Do ! Return @@ -13557,23 +13557,23 @@ Subroutine D_unista (XDONT, NUNI) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (Out) :: NUNI + real(kind = dp), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (Out) :: NUNI ! __________________________________________________________ ! - Integer(kind=i4), Dimension (Size(XDONT)) :: IWRKT + Integer(kind = i4), Dimension (Size(XDONT)) :: IWRKT Logical, Dimension (Size(XDONT)) :: IFMPTYT - Integer(kind=i4) :: ICRS + Integer(kind = i4) :: ICRS ! __________________________________________________________ Call UNIINV (XDONT, IWRKT) IFMPTYT = .True. NUNI = 0 Do ICRS = 1, Size(XDONT) - If (IFMPTYT(IWRKT(ICRS))) Then - IFMPTYT(IWRKT(ICRS)) = .False. - NUNI = NUNI + 1 - XDONT (NUNI) = XDONT (ICRS) - End If + If (IFMPTYT(IWRKT(ICRS))) Then + IFMPTYT(IWRKT(ICRS)) = .False. + NUNI = NUNI + 1 + XDONT (NUNI) = XDONT (ICRS) + End If End Do Return ! @@ -13586,23 +13586,23 @@ Subroutine R_unista (XDONT, NUNI) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (Out) :: NUNI + Real(kind = sp), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (Out) :: NUNI ! __________________________________________________________ ! - Integer(kind=i4), Dimension (Size(XDONT)) :: IWRKT + Integer(kind = i4), Dimension (Size(XDONT)) :: IWRKT Logical, Dimension (Size(XDONT)) :: IFMPTYT - Integer(kind=i4) :: ICRS + Integer(kind = i4) :: ICRS ! __________________________________________________________ Call UNIINV (XDONT, IWRKT) IFMPTYT = .True. NUNI = 0 Do ICRS = 1, Size(XDONT) - If (IFMPTYT(IWRKT(ICRS))) Then - IFMPTYT(IWRKT(ICRS)) = .False. - NUNI = NUNI + 1 - XDONT (NUNI) = XDONT (ICRS) - End If + If (IFMPTYT(IWRKT(ICRS))) Then + IFMPTYT(IWRKT(ICRS)) = .False. + NUNI = NUNI + 1 + XDONT (NUNI) = XDONT (ICRS) + End If End Do Return ! @@ -13615,23 +13615,23 @@ Subroutine I_unista (XDONT, NUNI) ! Michel Olagnon - Feb. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (InOut) :: XDONT - Integer(kind=i4), Intent (Out) :: NUNI + Integer(kind = i4), Dimension (:), Intent (InOut) :: XDONT + Integer(kind = i4), Intent (Out) :: NUNI ! __________________________________________________________ ! - Integer(kind=i4), Dimension (Size(XDONT)) :: IWRKT + Integer(kind = i4), Dimension (Size(XDONT)) :: IWRKT Logical, Dimension (Size(XDONT)) :: IFMPTYT - Integer(kind=i4) :: ICRS + Integer(kind = i4) :: ICRS ! __________________________________________________________ Call UNIINV (XDONT, IWRKT) IFMPTYT = .True. NUNI = 0 Do ICRS = 1, Size(XDONT) - If (IFMPTYT(IWRKT(ICRS))) Then - IFMPTYT(IWRKT(ICRS)) = .False. - NUNI = NUNI + 1 - XDONT (NUNI) = XDONT (ICRS) - End If + If (IFMPTYT(IWRKT(ICRS))) Then + IFMPTYT(IWRKT(ICRS)) = .False. + NUNI = NUNI + 1 + XDONT (NUNI) = XDONT (ICRS) + End If End Do Return ! @@ -13647,76 +13647,76 @@ Recursive Function D_valmed (XDONT) Result (res_med) ! average for random uniformly distributed values. ! __________________________________________________________ ! __________________________________________________________ - real(kind=dp), Dimension (:), Intent (In) :: XDONT - real(kind=dp) :: res_med + real(kind = dp), Dimension (:), Intent (In) :: XDONT + real(kind = dp) :: res_med ! __________________________________________________________ - real(kind=dp), Parameter :: XHUGE = HUGE (XDONT) - real(kind=dp), Dimension (SIZE(XDONT)+6) :: XWRKT - real(kind=dp) :: XWRK, XWRK1, XMED7 + real(kind = dp), Parameter :: XHUGE = HUGE (XDONT) + real(kind = dp), Dimension (SIZE(XDONT) + 6) :: XWRKT + real(kind = dp) :: XWRK, XWRK1, XMED7 ! - Integer(kind=i4), Dimension ((SIZE(XDONT)+6)/7) :: ISTRT, IENDT, IMEDT - Integer(kind=i4) :: NDON, NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 - Integer(kind=i4) :: IDEB, IWRK, IDCR, ICRS, ICRS1, ICRS2, IMED1 + Integer(kind = i4), Dimension ((SIZE(XDONT) + 6) / 7) :: ISTRT, IENDT, IMEDT + Integer(kind = i4) :: NDON, NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 + Integer(kind = i4) :: IDEB, IWRK, IDCR, ICRS, ICRS1, ICRS2, IMED1 ! NDON = SIZE (XDONT) - NMED = (NDON+1) / 2 + NMED = (NDON + 1) / 2 ! write(unit=*,fmt=*) NMED, NDON ! ! If the number of values is small, then use insertion sort ! If (NDON < 35) Then - ! - ! Bring minimum to first location to save test in decreasing loop - ! - IDCR = NDON - If (XDONT (1) < XDONT (NDON)) Then - XWRK = XDONT (1) - XWRKT (IDCR) = XDONT (IDCR) - Else - XWRK = XDONT (IDCR) - XWRKT (IDCR) = XDONT (1) - end if - Do IWRK = 1, NDON - 2 + ! + ! Bring minimum to first location to save test in decreasing loop + ! + IDCR = NDON + If (XDONT (1) < XDONT (NDON)) Then + XWRK = XDONT (1) + XWRKT (IDCR) = XDONT (IDCR) + Else + XWRK = XDONT (IDCR) + XWRKT (IDCR) = XDONT (1) + end if + Do IWRK = 1, NDON - 2 + IDCR = IDCR - 1 + XWRK1 = XDONT (IDCR) + If (XWRK1 < XWRK) Then + XWRKT (IDCR) = XWRK + XWRK = XWRK1 + Else + XWRKT (IDCR) = XWRK1 + end if + End Do + XWRKT (1) = XWRK + ! + ! Sort the first half, until we have NMED sorted values + ! + Do ICRS = 3, NMED + XWRK = XWRKT (ICRS) + IDCR = ICRS - 1 + Do + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) IDCR = IDCR - 1 - XWRK1 = XDONT (IDCR) - If (XWRK1 < XWRK) Then - XWRKT (IDCR) = XWRK - XWRK = XWRK1 - Else - XWRKT (IDCR) = XWRK1 - end if - End Do - XWRKT (1) = XWRK - ! - ! Sort the first half, until we have NMED sorted values - ! - Do ICRS = 3, NMED - XWRK = XWRKT (ICRS) - IDCR = ICRS - 1 + End Do + XWRKT (IDCR + 1) = XWRK + End Do + ! + ! Insert any value less than the current median in the first half + ! + Do ICRS = NMED + 1, NDON + XWRK = XWRKT (ICRS) + If (XWRK < XWRKT (NMED)) Then + IDCR = NMED - 1 Do - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - IDCR = IDCR - 1 - End Do - XWRKT (IDCR+1) = XWRK - End Do - ! - ! Insert any value less than the current median in the first half - ! - Do ICRS = NMED+1, NDON - XWRK = XWRKT (ICRS) - If (XWRK < XWRKT (NMED)) Then - IDCR = NMED - 1 - Do - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - IDCR = IDCR - 1 - End Do - XWRKT (IDCR+1) = XWRK - End If - End Do - res_med = XWRKT (NMED) - Return + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + IDCR = IDCR - 1 + End Do + XWRKT (IDCR + 1) = XWRK + End If + End Do + res_med = XWRKT (NMED) + Return End If ! ! Make sorted subsets of 7 elements @@ -13725,79 +13725,79 @@ Recursive Function D_valmed (XDONT) Result (res_med) ! decreasing disorder at the same time, so that we may remove ! remove the loop test in the insertion loop. ! - DO IDEB = 1, NDON-6, 7 - IDCR = IDEB + 6 - If (XDONT (IDEB) < XDONT (IDCR)) Then - XWRK = XDONT (IDEB) - XWRKT (IDCR) = XDONT (IDCR) - Else - XWRK = XDONT (IDCR) - XWRKT (IDCR) = XDONT (IDEB) - end if - Do IWRK = 1, 5 - IDCR = IDCR - 1 - XWRK1 = XDONT (IDCR) - If (XWRK1 < XWRK) Then - XWRKT (IDCR) = XWRK - XWRK = XWRK1 - Else - XWRKT (IDCR) = XWRK1 - end if - End Do - XWRKT (IDEB) = XWRK - Do ICRS = IDEB+2, IDEB+6 - XWRK = XWRKT (ICRS) - If (XWRK < XWRKT(ICRS-1)) Then - XWRKT (ICRS) = XWRKT (ICRS-1) - IDCR = ICRS - 1 - XWRK1 = XWRKT (IDCR-1) - Do - If (XWRK >= XWRK1) Exit - XWRKT (IDCR) = XWRK1 - IDCR = IDCR - 1 - XWRK1 = XWRKT (IDCR-1) - End Do - XWRKT (IDCR) = XWRK - end if - End Do + DO IDEB = 1, NDON - 6, 7 + IDCR = IDEB + 6 + If (XDONT (IDEB) < XDONT (IDCR)) Then + XWRK = XDONT (IDEB) + XWRKT (IDCR) = XDONT (IDCR) + Else + XWRK = XDONT (IDCR) + XWRKT (IDCR) = XDONT (IDEB) + end if + Do IWRK = 1, 5 + IDCR = IDCR - 1 + XWRK1 = XDONT (IDCR) + If (XWRK1 < XWRK) Then + XWRKT (IDCR) = XWRK + XWRK = XWRK1 + Else + XWRKT (IDCR) = XWRK1 + end if + End Do + XWRKT (IDEB) = XWRK + Do ICRS = IDEB + 2, IDEB + 6 + XWRK = XWRKT (ICRS) + If (XWRK < XWRKT(ICRS - 1)) Then + XWRKT (ICRS) = XWRKT (ICRS - 1) + IDCR = ICRS - 1 + XWRK1 = XWRKT (IDCR - 1) + Do + If (XWRK >= XWRK1) Exit + XWRKT (IDCR) = XWRK1 + IDCR = IDCR - 1 + XWRK1 = XWRKT (IDCR - 1) + End Do + XWRKT (IDCR) = XWRK + end if + End Do End Do ! ! Add-up alternatively + and - HUGE values to make the number of data ! an exact multiple of 7. ! - IDEB = 7 * (NDON/7) + IDEB = 7 * (NDON / 7) NTRI = NDON If (IDEB < NDON) Then - ! - XWRK1 = XHUGE - Do ICRS = IDEB+1, IDEB+7 - If (ICRS <= NDON) Then - XWRKT (ICRS) = XDONT (ICRS) - Else - If (ne(XWRK1 , XHUGE)) NMED = NMED + 1 - XWRKT (ICRS) = XWRK1 - XWRK1 = - XWRK1 - end if - End Do - ! - Do ICRS = IDEB+2, IDEB+7 - XWRK = XWRKT (ICRS) - Do IDCR = ICRS - 1, IDEB+1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - End Do - ! - NTRI = IDEB+7 + ! + XWRK1 = XHUGE + Do ICRS = IDEB + 1, IDEB + 7 + If (ICRS <= NDON) Then + XWRKT (ICRS) = XDONT (ICRS) + Else + If (ne(XWRK1, XHUGE)) NMED = NMED + 1 + XWRKT (ICRS) = XWRK1 + XWRK1 = - XWRK1 + end if + End Do + ! + Do ICRS = IDEB + 2, IDEB + 7 + XWRK = XWRKT (ICRS) + Do IDCR = ICRS - 1, IDEB + 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + End Do + ! + NTRI = IDEB + 7 End If ! ! Make the set of the indices of median values of each sorted subset ! IDON1 = 0 Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - IMEDT (IDON1) = IDON + 3 + IDON1 = IDON1 + 1 + IMEDT (IDON1) = IDON + 3 End Do ! ! Find XMED7, the median of the medians @@ -13817,54 +13817,54 @@ Recursive Function D_valmed (XDONT) Result (res_med) NLEQ = 0 NEQU = 0 Do IDON = 1, NTRI, 7 - IMED = IDON+3 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 2 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 1 - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 1 - end if - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 2 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 1 - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 1 - end if - end if - If (XWRKT (IMED) > XMED7) Then - NLEQ = NLEQ + IMED - IDON - IENDT (IDON1) = IMED - 1 - ISTRT (IDON1) = IMED - Else If (XWRKT (IMED) < XMED7) Then - NLEQ = NLEQ + IMED - IDON + 1 - IENDT (IDON1) = IMED - ISTRT (IDON1) = IMED + 1 - Else ! If (XWRKT (IMED) == XMED7) - NLEQ = NLEQ + IMED - IDON + 1 - NEQU = NEQU + 1 - IENDT (IDON1) = IMED - 1 - Do IMED1 = IMED - 1, IDON, -1 - If (eq(XWRKT (IMED1) , XMED7)) Then - NEQU = NEQU + 1 - IENDT (IDON1) = IMED1 - 1 - Else - Exit - End If - End Do - ISTRT (IDON1) = IMED + 1 - Do IMED1 = IMED + 1, IDON + 6 - If (eq(XWRKT (IMED1) , XMED7)) Then - NEQU = NEQU + 1 - NLEQ = NLEQ + 1 - ISTRT (IDON1) = IMED1 + 1 - Else - Exit - End If - End Do - end if - IDON1 = IDON1 + 1 + IMED = IDON + 3 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 2 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 1 + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 1 + end if + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 2 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 1 + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 1 + end if + end if + If (XWRKT (IMED) > XMED7) Then + NLEQ = NLEQ + IMED - IDON + IENDT (IDON1) = IMED - 1 + ISTRT (IDON1) = IMED + Else If (XWRKT (IMED) < XMED7) Then + NLEQ = NLEQ + IMED - IDON + 1 + IENDT (IDON1) = IMED + ISTRT (IDON1) = IMED + 1 + Else ! If (XWRKT (IMED) == XMED7) + NLEQ = NLEQ + IMED - IDON + 1 + NEQU = NEQU + 1 + IENDT (IDON1) = IMED - 1 + Do IMED1 = IMED - 1, IDON, -1 + If (eq(XWRKT (IMED1), XMED7)) Then + NEQU = NEQU + 1 + IENDT (IDON1) = IMED1 - 1 + Else + Exit + End If + End Do + ISTRT (IDON1) = IMED + 1 + Do IMED1 = IMED + 1, IDON + 6 + If (eq(XWRKT (IMED1), XMED7)) Then + NEQU = NEQU + 1 + NLEQ = NLEQ + 1 + ISTRT (IDON1) = IMED1 + 1 + Else + Exit + End If + End Do + end if + IDON1 = IDON1 + 1 End Do ! ! Carry out a partial insertion sort to find the Kth smallest of the @@ -13872,103 +13872,103 @@ Recursive Function D_valmed (XDONT) Result (res_med) ! what is needed. ! If (NLEQ - NEQU + 1 <= NMED) Then - If (NLEQ < NMED) Then ! Not enough low values - XWRK1 = XHUGE - NORD = NMED - NLEQ - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - IDCR = 0 - Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - If (ICRS2 < NORD) Then - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XWRKT(ICRS) < XWRK1) Then - XWRK = XWRKT (ICRS) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - If (ICRS2 < NORD) Then - XWRKT (ICRS1) = XWRKT (ICRS) - XWRK1 = XWRKT(ICRS1) - end if - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XWRKT(ICRS) >= XWRK1) Exit - XWRK = XWRKT (ICRS) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - End Do - End If - End Do - res_med = XWRK1 - Return - Else - res_med = XMED7 - Return - End If - Else ! If (NLEQ > NMED) - ! Not enough high values - XWRK1 = -XHUGE - NORD = NLEQ - NEQU - NMED + 1 - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - Do IDON = 1, NTRI, 7 + If (NLEQ < NMED) Then ! Not enough low values + XWRK1 = XHUGE + NORD = NMED - NLEQ + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + IDCR = 0 + Do IDON = 1, NTRI, 7 IDON1 = IDON1 + 1 If (ICRS2 < NORD) Then - ! - Do ICRS = IDON, IENDT (IDON1) - If (XWRKT(ICRS) > XWRK1) Then - XWRK = XWRKT (ICRS) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - If (ICRS2 < NORD) Then - XWRKT (ICRS1) = XWRKT (ICRS) - XWRK1 = XWRKT (ICRS1) - End If - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = IENDT (IDON1), IDON, -1 - If (XWRKT(ICRS) > XWRK1) Then - XWRK = XWRKT (ICRS) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - Exit - End If - End Do - end if - End Do - ! - res_med = XWRK1 - Return + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XWRKT(ICRS) < XWRK1) Then + XWRK = XWRKT (ICRS) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + If (ICRS2 < NORD) Then + XWRKT (ICRS1) = XWRKT (ICRS) + XWRK1 = XWRKT(ICRS1) + end if + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XWRKT(ICRS) >= XWRK1) Exit + XWRK = XWRKT (ICRS) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + End Do + End If + End Do + res_med = XWRK1 + Return + Else + res_med = XMED7 + Return + End If + Else ! If (NLEQ > NMED) + ! Not enough high values + XWRK1 = -XHUGE + NORD = NLEQ - NEQU - NMED + 1 + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + Do IDON = 1, NTRI, 7 + IDON1 = IDON1 + 1 + If (ICRS2 < NORD) Then + ! + Do ICRS = IDON, IENDT (IDON1) + If (XWRKT(ICRS) > XWRK1) Then + XWRK = XWRKT (ICRS) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + If (ICRS2 < NORD) Then + XWRKT (ICRS1) = XWRKT (ICRS) + XWRK1 = XWRKT (ICRS1) + End If + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = IENDT (IDON1), IDON, -1 + If (XWRKT(ICRS) > XWRK1) Then + XWRK = XWRKT (ICRS) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + Exit + End If + End Do + end if + End Do + ! + res_med = XWRK1 + Return End If ! End Function D_valmed @@ -13983,76 +13983,76 @@ Recursive Function R_valmed (XDONT) Result (res_med) ! average for random uniformly distributed values. ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Real(kind=sp) :: res_med + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Real(kind = sp) :: res_med ! __________________________________________________________ - Real(kind=sp), Parameter :: XHUGE = HUGE (XDONT) - Real(kind=sp), Dimension (SIZE(XDONT)+6) :: XWRKT - Real(kind=sp) :: XWRK, XWRK1, XMED7 + Real(kind = sp), Parameter :: XHUGE = HUGE (XDONT) + Real(kind = sp), Dimension (SIZE(XDONT) + 6) :: XWRKT + Real(kind = sp) :: XWRK, XWRK1, XMED7 ! - Integer(kind=i4), Dimension ((SIZE(XDONT)+6)/7) :: ISTRT, IENDT, IMEDT - Integer(kind=i4) :: NDON, NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 - Integer(kind=i4) :: IDEB, IWRK, IDCR, ICRS, ICRS1, ICRS2, IMED1 + Integer(kind = i4), Dimension ((SIZE(XDONT) + 6) / 7) :: ISTRT, IENDT, IMEDT + Integer(kind = i4) :: NDON, NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 + Integer(kind = i4) :: IDEB, IWRK, IDCR, ICRS, ICRS1, ICRS2, IMED1 ! NDON = SIZE (XDONT) - NMED = (NDON+1) / 2 + NMED = (NDON + 1) / 2 ! write(unit=*,fmt=*) NMED, NDON ! ! If the number of values is small, then use insertion sort ! If (NDON < 35) Then - ! - ! Bring minimum to first location to save test in decreasing loop - ! - IDCR = NDON - If (XDONT (1) < XDONT (NDON)) Then - XWRK = XDONT (1) - XWRKT (IDCR) = XDONT (IDCR) - Else - XWRK = XDONT (IDCR) - XWRKT (IDCR) = XDONT (1) - end if - Do IWRK = 1, NDON - 2 + ! + ! Bring minimum to first location to save test in decreasing loop + ! + IDCR = NDON + If (XDONT (1) < XDONT (NDON)) Then + XWRK = XDONT (1) + XWRKT (IDCR) = XDONT (IDCR) + Else + XWRK = XDONT (IDCR) + XWRKT (IDCR) = XDONT (1) + end if + Do IWRK = 1, NDON - 2 + IDCR = IDCR - 1 + XWRK1 = XDONT (IDCR) + If (XWRK1 < XWRK) Then + XWRKT (IDCR) = XWRK + XWRK = XWRK1 + Else + XWRKT (IDCR) = XWRK1 + end if + End Do + XWRKT (1) = XWRK + ! + ! Sort the first half, until we have NMED sorted values + ! + Do ICRS = 3, NMED + XWRK = XWRKT (ICRS) + IDCR = ICRS - 1 + Do + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) IDCR = IDCR - 1 - XWRK1 = XDONT (IDCR) - If (XWRK1 < XWRK) Then - XWRKT (IDCR) = XWRK - XWRK = XWRK1 - Else - XWRKT (IDCR) = XWRK1 - end if - End Do - XWRKT (1) = XWRK - ! - ! Sort the first half, until we have NMED sorted values - ! - Do ICRS = 3, NMED - XWRK = XWRKT (ICRS) - IDCR = ICRS - 1 + End Do + XWRKT (IDCR + 1) = XWRK + End Do + ! + ! Insert any value less than the current median in the first half + ! + Do ICRS = NMED + 1, NDON + XWRK = XWRKT (ICRS) + If (XWRK < XWRKT (NMED)) Then + IDCR = NMED - 1 Do - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - IDCR = IDCR - 1 - End Do - XWRKT (IDCR+1) = XWRK - End Do - ! - ! Insert any value less than the current median in the first half - ! - Do ICRS = NMED+1, NDON - XWRK = XWRKT (ICRS) - If (XWRK < XWRKT (NMED)) Then - IDCR = NMED - 1 - Do - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - IDCR = IDCR - 1 - End Do - XWRKT (IDCR+1) = XWRK - End If - End Do - res_med = XWRKT (NMED) - Return + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + IDCR = IDCR - 1 + End Do + XWRKT (IDCR + 1) = XWRK + End If + End Do + res_med = XWRKT (NMED) + Return End If ! ! Make sorted subsets of 7 elements @@ -14061,79 +14061,79 @@ Recursive Function R_valmed (XDONT) Result (res_med) ! decreasing disorder at the same time, so that we may remove ! remove the loop test in the insertion loop. ! - DO IDEB = 1, NDON-6, 7 - IDCR = IDEB + 6 - If (XDONT (IDEB) < XDONT (IDCR)) Then - XWRK = XDONT (IDEB) - XWRKT (IDCR) = XDONT (IDCR) - Else - XWRK = XDONT (IDCR) - XWRKT (IDCR) = XDONT (IDEB) - end if - Do IWRK = 1, 5 - IDCR = IDCR - 1 - XWRK1 = XDONT (IDCR) - If (XWRK1 < XWRK) Then - XWRKT (IDCR) = XWRK - XWRK = XWRK1 - Else - XWRKT (IDCR) = XWRK1 - end if - End Do - XWRKT (IDEB) = XWRK - Do ICRS = IDEB+2, IDEB+6 - XWRK = XWRKT (ICRS) - If (XWRK < XWRKT(ICRS-1)) Then - XWRKT (ICRS) = XWRKT (ICRS-1) - IDCR = ICRS - 1 - XWRK1 = XWRKT (IDCR-1) - Do - If (XWRK >= XWRK1) Exit - XWRKT (IDCR) = XWRK1 - IDCR = IDCR - 1 - XWRK1 = XWRKT (IDCR-1) - End Do - XWRKT (IDCR) = XWRK - end if - End Do + DO IDEB = 1, NDON - 6, 7 + IDCR = IDEB + 6 + If (XDONT (IDEB) < XDONT (IDCR)) Then + XWRK = XDONT (IDEB) + XWRKT (IDCR) = XDONT (IDCR) + Else + XWRK = XDONT (IDCR) + XWRKT (IDCR) = XDONT (IDEB) + end if + Do IWRK = 1, 5 + IDCR = IDCR - 1 + XWRK1 = XDONT (IDCR) + If (XWRK1 < XWRK) Then + XWRKT (IDCR) = XWRK + XWRK = XWRK1 + Else + XWRKT (IDCR) = XWRK1 + end if + End Do + XWRKT (IDEB) = XWRK + Do ICRS = IDEB + 2, IDEB + 6 + XWRK = XWRKT (ICRS) + If (XWRK < XWRKT(ICRS - 1)) Then + XWRKT (ICRS) = XWRKT (ICRS - 1) + IDCR = ICRS - 1 + XWRK1 = XWRKT (IDCR - 1) + Do + If (XWRK >= XWRK1) Exit + XWRKT (IDCR) = XWRK1 + IDCR = IDCR - 1 + XWRK1 = XWRKT (IDCR - 1) + End Do + XWRKT (IDCR) = XWRK + end if + End Do End Do ! ! Add-up alternatively + and - HUGE values to make the number of data ! an exact multiple of 7. ! - IDEB = 7 * (NDON/7) + IDEB = 7 * (NDON / 7) NTRI = NDON If (IDEB < NDON) Then - ! - XWRK1 = XHUGE - Do ICRS = IDEB+1, IDEB+7 - If (ICRS <= NDON) Then - XWRKT (ICRS) = XDONT (ICRS) - Else - If (ne(XWRK1 , XHUGE)) NMED = NMED + 1 - XWRKT (ICRS) = XWRK1 - XWRK1 = - XWRK1 - end if - End Do - ! - Do ICRS = IDEB+2, IDEB+7 - XWRK = XWRKT (ICRS) - Do IDCR = ICRS - 1, IDEB+1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - End Do - ! - NTRI = IDEB+7 + ! + XWRK1 = XHUGE + Do ICRS = IDEB + 1, IDEB + 7 + If (ICRS <= NDON) Then + XWRKT (ICRS) = XDONT (ICRS) + Else + If (ne(XWRK1, XHUGE)) NMED = NMED + 1 + XWRKT (ICRS) = XWRK1 + XWRK1 = - XWRK1 + end if + End Do + ! + Do ICRS = IDEB + 2, IDEB + 7 + XWRK = XWRKT (ICRS) + Do IDCR = ICRS - 1, IDEB + 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + End Do + ! + NTRI = IDEB + 7 End If ! ! Make the set of the indices of median values of each sorted subset ! IDON1 = 0 Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - IMEDT (IDON1) = IDON + 3 + IDON1 = IDON1 + 1 + IMEDT (IDON1) = IDON + 3 End Do ! ! Find XMED7, the median of the medians @@ -14153,54 +14153,54 @@ Recursive Function R_valmed (XDONT) Result (res_med) NLEQ = 0 NEQU = 0 Do IDON = 1, NTRI, 7 - IMED = IDON+3 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 2 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 1 - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 1 - end if - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 2 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 1 - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 1 - end if - end if - If (XWRKT (IMED) > XMED7) Then - NLEQ = NLEQ + IMED - IDON - IENDT (IDON1) = IMED - 1 - ISTRT (IDON1) = IMED - Else If (XWRKT (IMED) < XMED7) Then - NLEQ = NLEQ + IMED - IDON + 1 - IENDT (IDON1) = IMED - ISTRT (IDON1) = IMED + 1 - Else ! If (XWRKT (IMED) == XMED7) - NLEQ = NLEQ + IMED - IDON + 1 - NEQU = NEQU + 1 - IENDT (IDON1) = IMED - 1 - Do IMED1 = IMED - 1, IDON, -1 - If (eq(XWRKT (IMED1) , XMED7)) Then - NEQU = NEQU + 1 - IENDT (IDON1) = IMED1 - 1 - Else - Exit - End If - End Do - ISTRT (IDON1) = IMED + 1 - Do IMED1 = IMED + 1, IDON + 6 - If (eq(XWRKT (IMED1) , XMED7)) Then - NEQU = NEQU + 1 - NLEQ = NLEQ + 1 - ISTRT (IDON1) = IMED1 + 1 - Else - Exit - End If - End Do - end if - IDON1 = IDON1 + 1 + IMED = IDON + 3 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 2 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 1 + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 1 + end if + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 2 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 1 + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 1 + end if + end if + If (XWRKT (IMED) > XMED7) Then + NLEQ = NLEQ + IMED - IDON + IENDT (IDON1) = IMED - 1 + ISTRT (IDON1) = IMED + Else If (XWRKT (IMED) < XMED7) Then + NLEQ = NLEQ + IMED - IDON + 1 + IENDT (IDON1) = IMED + ISTRT (IDON1) = IMED + 1 + Else ! If (XWRKT (IMED) == XMED7) + NLEQ = NLEQ + IMED - IDON + 1 + NEQU = NEQU + 1 + IENDT (IDON1) = IMED - 1 + Do IMED1 = IMED - 1, IDON, -1 + If (eq(XWRKT (IMED1), XMED7)) Then + NEQU = NEQU + 1 + IENDT (IDON1) = IMED1 - 1 + Else + Exit + End If + End Do + ISTRT (IDON1) = IMED + 1 + Do IMED1 = IMED + 1, IDON + 6 + If (eq(XWRKT (IMED1), XMED7)) Then + NEQU = NEQU + 1 + NLEQ = NLEQ + 1 + ISTRT (IDON1) = IMED1 + 1 + Else + Exit + End If + End Do + end if + IDON1 = IDON1 + 1 End Do ! ! Carry out a partial insertion sort to find the Kth smallest of the @@ -14208,103 +14208,103 @@ Recursive Function R_valmed (XDONT) Result (res_med) ! what is needed. ! If (NLEQ - NEQU + 1 <= NMED) Then - If (NLEQ < NMED) Then ! Not enough low values - XWRK1 = XHUGE - NORD = NMED - NLEQ - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - IDCR = 0 - Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - If (ICRS2 < NORD) Then - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XWRKT(ICRS) < XWRK1) Then - XWRK = XWRKT (ICRS) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - If (ICRS2 < NORD) Then - XWRKT (ICRS1) = XWRKT (ICRS) - XWRK1 = XWRKT(ICRS1) - end if - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XWRKT(ICRS) >= XWRK1) Exit - XWRK = XWRKT (ICRS) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - End Do - End If - End Do - res_med = XWRK1 - Return - Else - res_med = XMED7 - Return - End If - Else ! If (NLEQ > NMED) - ! Not enough high values - XWRK1 = -XHUGE - NORD = NLEQ - NEQU - NMED + 1 - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - Do IDON = 1, NTRI, 7 + If (NLEQ < NMED) Then ! Not enough low values + XWRK1 = XHUGE + NORD = NMED - NLEQ + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + IDCR = 0 + Do IDON = 1, NTRI, 7 IDON1 = IDON1 + 1 If (ICRS2 < NORD) Then - ! - Do ICRS = IDON, IENDT (IDON1) - If (XWRKT(ICRS) > XWRK1) Then - XWRK = XWRKT (ICRS) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - If (ICRS2 < NORD) Then - XWRKT (ICRS1) = XWRKT (ICRS) - XWRK1 = XWRKT (ICRS1) - End If - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = IENDT (IDON1), IDON, -1 - If (XWRKT(ICRS) > XWRK1) Then - XWRK = XWRKT (ICRS) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - Exit - End If - End Do - end if - End Do - ! - res_med = XWRK1 - Return + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XWRKT(ICRS) < XWRK1) Then + XWRK = XWRKT (ICRS) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + If (ICRS2 < NORD) Then + XWRKT (ICRS1) = XWRKT (ICRS) + XWRK1 = XWRKT(ICRS1) + end if + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XWRKT(ICRS) >= XWRK1) Exit + XWRK = XWRKT (ICRS) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + End Do + End If + End Do + res_med = XWRK1 + Return + Else + res_med = XMED7 + Return + End If + Else ! If (NLEQ > NMED) + ! Not enough high values + XWRK1 = -XHUGE + NORD = NLEQ - NEQU - NMED + 1 + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + Do IDON = 1, NTRI, 7 + IDON1 = IDON1 + 1 + If (ICRS2 < NORD) Then + ! + Do ICRS = IDON, IENDT (IDON1) + If (XWRKT(ICRS) > XWRK1) Then + XWRK = XWRKT (ICRS) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + If (ICRS2 < NORD) Then + XWRKT (ICRS1) = XWRKT (ICRS) + XWRK1 = XWRKT (ICRS1) + End If + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = IENDT (IDON1), IDON, -1 + If (XWRKT(ICRS) > XWRK1) Then + XWRK = XWRKT (ICRS) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + Exit + End If + End Do + end if + End Do + ! + res_med = XWRK1 + Return End If ! End Function R_valmed @@ -14319,76 +14319,76 @@ Recursive Function I_valmed (XDONT) Result (res_med) ! average for random uniformly distributed values. ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: res_med + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: res_med ! __________________________________________________________ - Integer(kind=i4), Parameter :: XHUGE = HUGE (XDONT) - Integer(kind=i4), Dimension (SIZE(XDONT)+6) :: XWRKT - Integer(kind=i4) :: XWRK, XWRK1, XMED7 + Integer(kind = i4), Parameter :: XHUGE = HUGE (XDONT) + Integer(kind = i4), Dimension (SIZE(XDONT) + 6) :: XWRKT + Integer(kind = i4) :: XWRK, XWRK1, XMED7 ! - Integer(kind=i4), Dimension ((SIZE(XDONT)+6)/7) :: ISTRT, IENDT, IMEDT - Integer(kind=i4) :: NDON, NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 - Integer(kind=i4) :: IDEB, IWRK, IDCR, ICRS, ICRS1, ICRS2, IMED1 + Integer(kind = i4), Dimension ((SIZE(XDONT) + 6) / 7) :: ISTRT, IENDT, IMEDT + Integer(kind = i4) :: NDON, NTRI, NMED, NORD, NEQU, NLEQ, IMED, IDON, IDON1 + Integer(kind = i4) :: IDEB, IWRK, IDCR, ICRS, ICRS1, ICRS2, IMED1 ! NDON = SIZE (XDONT) - NMED = (NDON+1) / 2 + NMED = (NDON + 1) / 2 ! write(unit=*,fmt=*) NMED, NDON ! ! If the number of values is small, then use insertion sort ! If (NDON < 35) Then - ! - ! Bring minimum to first location to save test in decreasing loop - ! - IDCR = NDON - If (XDONT (1) < XDONT (NDON)) Then - XWRK = XDONT (1) - XWRKT (IDCR) = XDONT (IDCR) - Else - XWRK = XDONT (IDCR) - XWRKT (IDCR) = XDONT (1) - end if - Do IWRK = 1, NDON - 2 + ! + ! Bring minimum to first location to save test in decreasing loop + ! + IDCR = NDON + If (XDONT (1) < XDONT (NDON)) Then + XWRK = XDONT (1) + XWRKT (IDCR) = XDONT (IDCR) + Else + XWRK = XDONT (IDCR) + XWRKT (IDCR) = XDONT (1) + end if + Do IWRK = 1, NDON - 2 + IDCR = IDCR - 1 + XWRK1 = XDONT (IDCR) + If (XWRK1 < XWRK) Then + XWRKT (IDCR) = XWRK + XWRK = XWRK1 + Else + XWRKT (IDCR) = XWRK1 + end if + End Do + XWRKT (1) = XWRK + ! + ! Sort the first half, until we have NMED sorted values + ! + Do ICRS = 3, NMED + XWRK = XWRKT (ICRS) + IDCR = ICRS - 1 + Do + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) IDCR = IDCR - 1 - XWRK1 = XDONT (IDCR) - If (XWRK1 < XWRK) Then - XWRKT (IDCR) = XWRK - XWRK = XWRK1 - Else - XWRKT (IDCR) = XWRK1 - end if - End Do - XWRKT (1) = XWRK - ! - ! Sort the first half, until we have NMED sorted values - ! - Do ICRS = 3, NMED - XWRK = XWRKT (ICRS) - IDCR = ICRS - 1 + End Do + XWRKT (IDCR + 1) = XWRK + End Do + ! + ! Insert any value less than the current median in the first half + ! + Do ICRS = NMED + 1, NDON + XWRK = XWRKT (ICRS) + If (XWRK < XWRKT (NMED)) Then + IDCR = NMED - 1 Do - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - IDCR = IDCR - 1 - End Do - XWRKT (IDCR+1) = XWRK - End Do - ! - ! Insert any value less than the current median in the first half - ! - Do ICRS = NMED+1, NDON - XWRK = XWRKT (ICRS) - If (XWRK < XWRKT (NMED)) Then - IDCR = NMED - 1 - Do - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - IDCR = IDCR - 1 - End Do - XWRKT (IDCR+1) = XWRK - End If - End Do - res_med = XWRKT (NMED) - Return + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + IDCR = IDCR - 1 + End Do + XWRKT (IDCR + 1) = XWRK + End If + End Do + res_med = XWRKT (NMED) + Return End If ! ! Make sorted subsets of 7 elements @@ -14397,79 +14397,79 @@ Recursive Function I_valmed (XDONT) Result (res_med) ! decreasing disorder at the same time, so that we may remove ! remove the loop test in the insertion loop. ! - DO IDEB = 1, NDON-6, 7 - IDCR = IDEB + 6 - If (XDONT (IDEB) < XDONT (IDCR)) Then - XWRK = XDONT (IDEB) - XWRKT (IDCR) = XDONT (IDCR) - Else - XWRK = XDONT (IDCR) - XWRKT (IDCR) = XDONT (IDEB) - end if - Do IWRK = 1, 5 - IDCR = IDCR - 1 - XWRK1 = XDONT (IDCR) - If (XWRK1 < XWRK) Then - XWRKT (IDCR) = XWRK - XWRK = XWRK1 - Else - XWRKT (IDCR) = XWRK1 - end if - End Do - XWRKT (IDEB) = XWRK - Do ICRS = IDEB+2, IDEB+6 - XWRK = XWRKT (ICRS) - If (XWRK < XWRKT(ICRS-1)) Then - XWRKT (ICRS) = XWRKT (ICRS-1) - IDCR = ICRS - 1 - XWRK1 = XWRKT (IDCR-1) - Do - If (XWRK >= XWRK1) Exit - XWRKT (IDCR) = XWRK1 - IDCR = IDCR - 1 - XWRK1 = XWRKT (IDCR-1) - End Do - XWRKT (IDCR) = XWRK - end if - End Do + DO IDEB = 1, NDON - 6, 7 + IDCR = IDEB + 6 + If (XDONT (IDEB) < XDONT (IDCR)) Then + XWRK = XDONT (IDEB) + XWRKT (IDCR) = XDONT (IDCR) + Else + XWRK = XDONT (IDCR) + XWRKT (IDCR) = XDONT (IDEB) + end if + Do IWRK = 1, 5 + IDCR = IDCR - 1 + XWRK1 = XDONT (IDCR) + If (XWRK1 < XWRK) Then + XWRKT (IDCR) = XWRK + XWRK = XWRK1 + Else + XWRKT (IDCR) = XWRK1 + end if + End Do + XWRKT (IDEB) = XWRK + Do ICRS = IDEB + 2, IDEB + 6 + XWRK = XWRKT (ICRS) + If (XWRK < XWRKT(ICRS - 1)) Then + XWRKT (ICRS) = XWRKT (ICRS - 1) + IDCR = ICRS - 1 + XWRK1 = XWRKT (IDCR - 1) + Do + If (XWRK >= XWRK1) Exit + XWRKT (IDCR) = XWRK1 + IDCR = IDCR - 1 + XWRK1 = XWRKT (IDCR - 1) + End Do + XWRKT (IDCR) = XWRK + end if + End Do End Do ! ! Add-up alternatively + and - HUGE values to make the number of data ! an exact multiple of 7. ! - IDEB = 7 * (NDON/7) + IDEB = 7 * (NDON / 7) NTRI = NDON If (IDEB < NDON) Then - ! - XWRK1 = XHUGE - Do ICRS = IDEB+1, IDEB+7 - If (ICRS <= NDON) Then - XWRKT (ICRS) = XDONT (ICRS) - Else - If (XWRK1 /= XHUGE) NMED = NMED + 1 - XWRKT (ICRS) = XWRK1 - XWRK1 = - XWRK1 - end if - End Do - ! - Do ICRS = IDEB+2, IDEB+7 - XWRK = XWRKT (ICRS) - Do IDCR = ICRS - 1, IDEB+1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - End Do - ! - NTRI = IDEB+7 + ! + XWRK1 = XHUGE + Do ICRS = IDEB + 1, IDEB + 7 + If (ICRS <= NDON) Then + XWRKT (ICRS) = XDONT (ICRS) + Else + If (XWRK1 /= XHUGE) NMED = NMED + 1 + XWRKT (ICRS) = XWRK1 + XWRK1 = - XWRK1 + end if + End Do + ! + Do ICRS = IDEB + 2, IDEB + 7 + XWRK = XWRKT (ICRS) + Do IDCR = ICRS - 1, IDEB + 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + End Do + ! + NTRI = IDEB + 7 End If ! ! Make the set of the indices of median values of each sorted subset ! IDON1 = 0 Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - IMEDT (IDON1) = IDON + 3 + IDON1 = IDON1 + 1 + IMEDT (IDON1) = IDON + 3 End Do ! ! Find XMED7, the median of the medians @@ -14489,54 +14489,54 @@ Recursive Function I_valmed (XDONT) Result (res_med) NLEQ = 0 NEQU = 0 Do IDON = 1, NTRI, 7 - IMED = IDON+3 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 2 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 1 - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 1 - end if - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 2 - If (XWRKT (IMED) > XMED7) Then - IMED = IMED - 1 - Else If (XWRKT (IMED) < XMED7) Then - IMED = IMED + 1 - end if - end if - If (XWRKT (IMED) > XMED7) Then - NLEQ = NLEQ + IMED - IDON - IENDT (IDON1) = IMED - 1 - ISTRT (IDON1) = IMED - Else If (XWRKT (IMED) < XMED7) Then - NLEQ = NLEQ + IMED - IDON + 1 - IENDT (IDON1) = IMED - ISTRT (IDON1) = IMED + 1 - Else ! If (XWRKT (IMED) == XMED7) - NLEQ = NLEQ + IMED - IDON + 1 - NEQU = NEQU + 1 - IENDT (IDON1) = IMED - 1 - Do IMED1 = IMED - 1, IDON, -1 - If (XWRKT (IMED1) == XMED7) Then - NEQU = NEQU + 1 - IENDT (IDON1) = IMED1 - 1 - Else - Exit - End If - End Do - ISTRT (IDON1) = IMED + 1 - Do IMED1 = IMED + 1, IDON + 6 - If (XWRKT (IMED1) == XMED7) Then - NEQU = NEQU + 1 - NLEQ = NLEQ + 1 - ISTRT (IDON1) = IMED1 + 1 - Else - Exit - End If - End Do - end if - IDON1 = IDON1 + 1 + IMED = IDON + 3 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 2 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 1 + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 1 + end if + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 2 + If (XWRKT (IMED) > XMED7) Then + IMED = IMED - 1 + Else If (XWRKT (IMED) < XMED7) Then + IMED = IMED + 1 + end if + end if + If (XWRKT (IMED) > XMED7) Then + NLEQ = NLEQ + IMED - IDON + IENDT (IDON1) = IMED - 1 + ISTRT (IDON1) = IMED + Else If (XWRKT (IMED) < XMED7) Then + NLEQ = NLEQ + IMED - IDON + 1 + IENDT (IDON1) = IMED + ISTRT (IDON1) = IMED + 1 + Else ! If (XWRKT (IMED) == XMED7) + NLEQ = NLEQ + IMED - IDON + 1 + NEQU = NEQU + 1 + IENDT (IDON1) = IMED - 1 + Do IMED1 = IMED - 1, IDON, -1 + If (XWRKT (IMED1) == XMED7) Then + NEQU = NEQU + 1 + IENDT (IDON1) = IMED1 - 1 + Else + Exit + End If + End Do + ISTRT (IDON1) = IMED + 1 + Do IMED1 = IMED + 1, IDON + 6 + If (XWRKT (IMED1) == XMED7) Then + NEQU = NEQU + 1 + NLEQ = NLEQ + 1 + ISTRT (IDON1) = IMED1 + 1 + Else + Exit + End If + End Do + end if + IDON1 = IDON1 + 1 End Do ! ! Carry out a partial insertion sort to find the Kth smallest of the @@ -14544,103 +14544,103 @@ Recursive Function I_valmed (XDONT) Result (res_med) ! what is needed. ! If (NLEQ - NEQU + 1 <= NMED) Then - If (NLEQ < NMED) Then ! Not enough low values - XWRK1 = XHUGE - NORD = NMED - NLEQ - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - IDCR = 0 - Do IDON = 1, NTRI, 7 - IDON1 = IDON1 + 1 - If (ICRS2 < NORD) Then - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XWRKT(ICRS) < XWRK1) Then - XWRK = XWRKT (ICRS) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - If (ICRS2 < NORD) Then - XWRKT (ICRS1) = XWRKT (ICRS) - XWRK1 = XWRKT(ICRS1) - end if - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = ISTRT (IDON1), IDON + 6 - If (XWRKT(ICRS) >= XWRK1) Exit - XWRK = XWRKT (ICRS) - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK >= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - End Do - End If - End Do - res_med = XWRK1 - Return - Else - res_med = XMED7 - Return - End If - Else ! If (NLEQ > NMED) - ! Not enough high values - XWRK1 = -XHUGE - NORD = NLEQ - NEQU - NMED + 1 - IDON1 = 0 - ICRS1 = 1 - ICRS2 = 0 - Do IDON = 1, NTRI, 7 + If (NLEQ < NMED) Then ! Not enough low values + XWRK1 = XHUGE + NORD = NMED - NLEQ + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + IDCR = 0 + Do IDON = 1, NTRI, 7 IDON1 = IDON1 + 1 If (ICRS2 < NORD) Then - ! - Do ICRS = IDON, IENDT (IDON1) - If (XWRKT(ICRS) > XWRK1) Then - XWRK = XWRKT (ICRS) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - If (ICRS2 < NORD) Then - XWRKT (ICRS1) = XWRKT (ICRS) - XWRK1 = XWRKT (ICRS1) - End If - End If - ICRS1 = MIN (NORD, ICRS1 + 1) - ICRS2 = MIN (NORD, ICRS2 + 1) - End Do - Else - Do ICRS = IENDT (IDON1), IDON, -1 - If (XWRKT(ICRS) > XWRK1) Then - XWRK = XWRKT (ICRS) - IDCR = ICRS1 - 1 - Do IDCR = ICRS1 - 1, 1, - 1 - If (XWRK <= XWRKT(IDCR)) Exit - XWRKT (IDCR+1) = XWRKT (IDCR) - End Do - XWRKT (IDCR+1) = XWRK - XWRK1 = XWRKT(ICRS1) - Else - Exit - End If - End Do - end if - End Do - ! - res_med = XWRK1 - Return + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XWRKT(ICRS) < XWRK1) Then + XWRK = XWRKT (ICRS) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + If (ICRS2 < NORD) Then + XWRKT (ICRS1) = XWRKT (ICRS) + XWRK1 = XWRKT(ICRS1) + end if + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = ISTRT (IDON1), IDON + 6 + If (XWRKT(ICRS) >= XWRK1) Exit + XWRK = XWRKT (ICRS) + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK >= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + End Do + End If + End Do + res_med = XWRK1 + Return + Else + res_med = XMED7 + Return + End If + Else ! If (NLEQ > NMED) + ! Not enough high values + XWRK1 = -XHUGE + NORD = NLEQ - NEQU - NMED + 1 + IDON1 = 0 + ICRS1 = 1 + ICRS2 = 0 + Do IDON = 1, NTRI, 7 + IDON1 = IDON1 + 1 + If (ICRS2 < NORD) Then + ! + Do ICRS = IDON, IENDT (IDON1) + If (XWRKT(ICRS) > XWRK1) Then + XWRK = XWRKT (ICRS) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + If (ICRS2 < NORD) Then + XWRKT (ICRS1) = XWRKT (ICRS) + XWRK1 = XWRKT (ICRS1) + End If + End If + ICRS1 = MIN (NORD, ICRS1 + 1) + ICRS2 = MIN (NORD, ICRS2 + 1) + End Do + Else + Do ICRS = IENDT (IDON1), IDON, -1 + If (XWRKT(ICRS) > XWRK1) Then + XWRK = XWRKT (ICRS) + IDCR = ICRS1 - 1 + Do IDCR = ICRS1 - 1, 1, - 1 + If (XWRK <= XWRKT(IDCR)) Exit + XWRKT (IDCR + 1) = XWRKT (IDCR) + End Do + XWRKT (IDCR + 1) = XWRK + XWRK1 = XWRKT(ICRS1) + Else + Exit + End If + End Do + end if + End Do + ! + res_med = XWRK1 + Return End If ! End Function I_valmed @@ -14660,16 +14660,16 @@ Function D_valnth (XDONT, NORD) Result (valnth) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - real(Kind=dp), Dimension (:), Intent (In) :: XDONT - real(Kind=dp) :: valnth - Integer(kind=i4), Intent (In) :: NORD + real(Kind = dp), Dimension (:), Intent (In) :: XDONT + real(Kind = dp) :: valnth + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - real(Kind=dp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT - real(Kind=dp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX + real(Kind = dp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT + real(Kind = dp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX ! - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) INTH = MAX (MIN (NORD, NDON), 1) @@ -14677,80 +14677,80 @@ Function D_valnth (XDONT, NORD) Result (valnth) ! First loop is used to fill-in XLOWT, XHIGT at the same time ! If (NDON < 2) Then - If (INTH == 1) VALNTH = XDONT (1) - Return + If (INTH == 1) VALNTH = XDONT (1) + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - XLOWT (1) = XDONT(2) - XHIGT (1) = XDONT(1) + XLOWT (1) = XDONT(2) + XHIGT (1) = XDONT(1) Else - XLOWT (1) = XDONT(1) - XHIGT (1) = XDONT(2) + XLOWT (1) = XDONT(1) + XHIGT (1) = XDONT(2) End If ! If (NDON < 3) Then - If (INTH == 1) VALNTH = XLOWT (1) - If (INTH == 2) VALNTH = XHIGT (1) - Return + If (INTH == 1) VALNTH = XLOWT (1) + If (INTH == 2) VALNTH = XHIGT (1) + Return End If ! If (XDONT(3) < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - If (XDONT(3) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(3) - Else - XHIGT (1) = XDONT(3) - End If + XHIGT (2) = XHIGT (1) + If (XDONT(3) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(3) + Else + XHIGT (1) = XDONT(3) + End If Else - XHIGT (2) = XDONT(3) + XHIGT (2) = XDONT(3) End If ! If (NDON < 4) Then - If (INTH == 1) Then - VALNTH = XLOWT (1) - Else - VALNTH = XHIGT (INTH - 1) - End If - Return + If (INTH == 1) Then + VALNTH = XLOWT (1) + Else + VALNTH = XHIGT (INTH - 1) + End If + Return End If ! If (XDONT(NDON) < XHIGT(1)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XHIGT (1) - If (XDONT(NDON) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(NDON) - Else - XHIGT (1) = XDONT(NDON) - End If + XHIGT (3) = XHIGT (2) + XHIGT (2) = XHIGT (1) + If (XDONT(NDON) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(NDON) + Else + XHIGT (1) = XDONT(NDON) + End If Else - XHIGT (3) = XDONT(NDON) + XHIGT (3) = XDONT(NDON) End If ! If (NDON < 5) Then - If (INTH == 1) Then - VALNTH = XLOWT (1) - Else - VALNTH = XHIGT (INTH - 1) - End If - Return + If (INTH == 1) Then + VALNTH = XLOWT (1) + Else + VALNTH = XHIGT (INTH - 1) + End If + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XLOWT(1) + REAL(2*INTH,dp)/REAL(NDON+INTH,dp) * (XHIGT(3)-XLOWT(1)) + XPIV = XLOWT(1) + REAL(2 * INTH, dp) / REAL(NDON + INTH, dp) * (XHIGT(3) - XLOWT(1)) If (XPIV >= XHIGT(1)) Then - XPIV = XLOWT(1) + REAL(2*INTH,dp)/REAL(NDON+INTH,dp) * & - (XHIGT(2)-XLOWT(1)) - If (XPIV >= XHIGT(1)) & - XPIV = XLOWT(1) + REAL(2*INTH,dp) / REAL(NDON+INTH,dp) * & - (XHIGT(1)-XLOWT(1)) + XPIV = XLOWT(1) + REAL(2 * INTH, dp) / REAL(NDON + INTH, dp) * & + (XHIGT(2) - XLOWT(1)) + If (XPIV >= XHIGT(1)) & + XPIV = XLOWT(1) + REAL(2 * INTH, dp) / REAL(NDON + INTH, dp) * & + (XHIGT(1) - XLOWT(1)) End If ! ! One puts values > pivot in the end and those <= pivot @@ -14762,62 +14762,62 @@ Function D_valnth (XDONT, NORD) Result (valnth) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -14825,314 +14825,314 @@ Function D_valnth (XDONT, NORD) Result (valnth) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XHIGT(1) - IHIG = 1 - Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (IHIG) - XHIGT (IHIG) = XHIGT (JHIG) - JHIG = JHIG - 1 - Else - - XMAX = XLOWT (JLOW) - JLOW = JLOW - 1 - Do ICRS = 1, JLOW - If (XLOWT(ICRS) > XMAX) Then - XWRK = XMAX - XMAX = XLOWT(ICRS) - XLOWT (ICRS) = XWRK - End If - End Do - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XHIGT(1) <= XHIGT(2)) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (3) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (3) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - XLOWT (ICRS) = XHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (IFIN) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (IFIN) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - ! - XWRK1 = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XWRK1 - XPIV = XWRK1 + 0.5 * (XHIGT(IFIN)-XWRK1) - ! - ! One takes values <= pivot to XLOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - XHIGT (JHIG) = XHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XHIGT(1) IHIG = 1 Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If End Do ! - VALNTH = XHIGT (IHIG) - Return - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (IHIG) + XHIGT (IHIG) = XHIGT (JHIG) + JHIG = JHIG - 1 + Else + + XMAX = XLOWT (JLOW) + JLOW = JLOW - 1 + Do ICRS = 1, JLOW + If (XLOWT(ICRS) > XMAX) Then + XWRK = XMAX + XMAX = XLOWT(ICRS) + XLOWT (ICRS) = XWRK + End If + End Do + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XHIGT(1) <= XHIGT(2)) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + End If Exit ! - ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - XHIGT (1) = XLOWT (1) - ILOW = 1 + INTH - JLOW - Do ICRS = 2, INTH - XWRK = XLOWT (ICRS) - Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 - If (XWRK < XHIGT(IDCR)) Then - XHIGT (IDCR+1) = XHIGT (IDCR) - Else - Exit - End If - End Do - XHIGT (IDCR+1) = XWRK - ILOW = ILOW + 1 - End Do - ! - XWRK1 = XHIGT(INTH) - ILOW = 2*INTH - JLOW - Do ICRS = INTH + 1, JLOW - If (XLOWT (ICRS) < XWRK1) Then - XWRK = XLOWT (ICRS) - Do IDCR = INTH - 1, MAX (1, ILOW), - 1 - If (XWRK >= XHIGT(IDCR)) Exit - XHIGT (IDCR+1) = XHIGT (IDCR) - End Do - XHIGT (IDCR+1) = XLOWT (ICRS) - XWRK1 = XHIGT(INTH) - End If - ILOW = ILOW + 1 - End Do - ! - VALNTH = XHIGT(INTH) - Return + Case (3) ! ! - Case (:-6) - ! - ! last case: too many values in low part + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (3) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (3) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + XLOWT (ICRS) = XHIGT (JHIG) + End Do + JLOW = INTH + Exit ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - If (XLOWT(IMIL) > XLOWT(IFIN)) Then - XWRK = XLOWT (IFIN) - XLOWT (IFIN) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XLOWT(1) + REAL(INTH,dp)/REAL(JLOW+INTH,dp) * & - (XLOWT(IFIN)-XLOWT(1)) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (IFIN) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (IFIN) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + ! + XWRK1 = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XWRK1 + XPIV = XWRK1 + 0.5 * (XHIGT(IFIN) - XWRK1) ! - ! One takes values > XPIV to XHIGT + ! One takes values <= pivot to XLOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XLOWT(IFIN) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + XHIGT (JHIG) = XHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XHIGT(1) + IHIG = 1 + Do ICRS = 2, JHIG + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If + End Do + ! + VALNTH = XHIGT (IHIG) + Return + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + XHIGT (1) = XLOWT (1) + ILOW = 1 + INTH - JLOW + Do ICRS = 2, INTH + XWRK = XLOWT (ICRS) + Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 + If (XWRK < XHIGT(IDCR)) Then + XHIGT (IDCR + 1) = XHIGT (IDCR) + Else + Exit + End If + End Do + XHIGT (IDCR + 1) = XWRK + ILOW = ILOW + 1 + End Do + ! + XWRK1 = XHIGT(INTH) + ILOW = 2 * INTH - JLOW + Do ICRS = INTH + 1, JLOW + If (XLOWT (ICRS) < XWRK1) Then + XWRK = XLOWT (ICRS) + Do IDCR = INTH - 1, MAX (1, ILOW), - 1 + If (XWRK >= XHIGT(IDCR)) Exit + XHIGT (IDCR + 1) = XHIGT (IDCR) + End Do + XHIGT (IDCR + 1) = XLOWT (ICRS) + XWRK1 = XHIGT(INTH) + End If + ILOW = ILOW + 1 + End Do + ! + VALNTH = XHIGT(INTH) + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + If (XLOWT(IMIL) > XLOWT(IFIN)) Then + XWRK = XLOWT (IFIN) + XLOWT (IFIN) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XLOWT(1) + REAL(INTH, dp) / REAL(JLOW + INTH, dp) * & + (XLOWT(IFIN) - XLOWT(1)) + + ! + ! One takes values > XPIV to XHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XLOWT(IFIN) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! - VALNTH = MAXVAL (XLOWT (1:INTH)) + VALNTH = MAXVAL (XLOWT (1 : INTH)) Return ! ! @@ -15153,16 +15153,16 @@ Function R_valnth (XDONT, NORD) Result (valnth) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! _________________________________________________________ - Real(kind=sp), Dimension (:), Intent (In) :: XDONT - Real(kind=sp) :: valnth - Integer(kind=i4), Intent (In) :: NORD + Real(kind = sp), Dimension (:), Intent (In) :: XDONT + Real(kind = sp) :: valnth + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Real(kind=sp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT - Real(kind=sp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX + Real(kind = sp), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT + Real(kind = sp) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX ! - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) INTH = MAX (MIN (NORD, NDON), 1) @@ -15170,80 +15170,80 @@ Function R_valnth (XDONT, NORD) Result (valnth) ! First loop is used to fill-in XLOWT, XHIGT at the same time ! If (NDON < 2) Then - If (INTH == 1) VALNTH = XDONT (1) - Return + If (INTH == 1) VALNTH = XDONT (1) + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - XLOWT (1) = XDONT(2) - XHIGT (1) = XDONT(1) + XLOWT (1) = XDONT(2) + XHIGT (1) = XDONT(1) Else - XLOWT (1) = XDONT(1) - XHIGT (1) = XDONT(2) + XLOWT (1) = XDONT(1) + XHIGT (1) = XDONT(2) End If ! If (NDON < 3) Then - If (INTH == 1) VALNTH = XLOWT (1) - If (INTH == 2) VALNTH = XHIGT (1) - Return + If (INTH == 1) VALNTH = XLOWT (1) + If (INTH == 2) VALNTH = XHIGT (1) + Return End If ! If (XDONT(3) < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - If (XDONT(3) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(3) - Else - XHIGT (1) = XDONT(3) - End If + XHIGT (2) = XHIGT (1) + If (XDONT(3) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(3) + Else + XHIGT (1) = XDONT(3) + End If Else - XHIGT (2) = XDONT(3) + XHIGT (2) = XDONT(3) End If ! If (NDON < 4) Then - If (INTH == 1) Then - VALNTH = XLOWT (1) - Else - VALNTH = XHIGT (INTH - 1) - End If - Return + If (INTH == 1) Then + VALNTH = XLOWT (1) + Else + VALNTH = XHIGT (INTH - 1) + End If + Return End If ! If (XDONT(NDON) < XHIGT(1)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XHIGT (1) - If (XDONT(NDON) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(NDON) - Else - XHIGT (1) = XDONT(NDON) - End If + XHIGT (3) = XHIGT (2) + XHIGT (2) = XHIGT (1) + If (XDONT(NDON) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(NDON) + Else + XHIGT (1) = XDONT(NDON) + End If Else - XHIGT (3) = XDONT(NDON) + XHIGT (3) = XDONT(NDON) End If ! If (NDON < 5) Then - If (INTH == 1) Then - VALNTH = XLOWT (1) - Else - VALNTH = XHIGT (INTH - 1) - End If - Return + If (INTH == 1) Then + VALNTH = XLOWT (1) + Else + VALNTH = XHIGT (INTH - 1) + End If + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XLOWT(1) + REAL(2*INTH,sp)/REAL(NDON+INTH,sp) * (XHIGT(3)-XLOWT(1)) + XPIV = XLOWT(1) + REAL(2 * INTH, sp) / REAL(NDON + INTH, sp) * (XHIGT(3) - XLOWT(1)) If (XPIV >= XHIGT(1)) Then - XPIV = XLOWT(1) + REAL(2*INTH,sp)/REAL(NDON+INTH,sp) * & - (XHIGT(2)-XLOWT(1)) - If (XPIV >= XHIGT(1)) & - XPIV = XLOWT(1) + REAL(2*INTH,sp) / REAL(NDON+INTH,sp) * & - (XHIGT(1)-XLOWT(1)) + XPIV = XLOWT(1) + REAL(2 * INTH, sp) / REAL(NDON + INTH, sp) * & + (XHIGT(2) - XLOWT(1)) + If (XPIV >= XHIGT(1)) & + XPIV = XLOWT(1) + REAL(2 * INTH, sp) / REAL(NDON + INTH, sp) * & + (XHIGT(1) - XLOWT(1)) End If ! ! One puts values > pivot in the end and those <= pivot @@ -15255,62 +15255,62 @@ Function R_valnth (XDONT, NORD) Result (valnth) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -15318,314 +15318,314 @@ Function R_valnth (XDONT, NORD) Result (valnth) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XHIGT(1) - IHIG = 1 - Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (IHIG) - XHIGT (IHIG) = XHIGT (JHIG) - JHIG = JHIG - 1 - Else - - XMAX = XLOWT (JLOW) - JLOW = JLOW - 1 - Do ICRS = 1, JLOW - If (XLOWT(ICRS) > XMAX) Then - XWRK = XMAX - XMAX = XLOWT(ICRS) - XLOWT (ICRS) = XWRK - End If - End Do - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XHIGT(1) <= XHIGT(2)) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (3) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (3) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - XLOWT (ICRS) = XHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (IFIN) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (IFIN) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - ! - XWRK1 = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XWRK1 - XPIV = XWRK1 + 0.5 * (XHIGT(IFIN)-XWRK1) - ! - ! One takes values <= pivot to XLOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - XHIGT (JHIG) = XHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XHIGT(1) IHIG = 1 Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If End Do ! - VALNTH = XHIGT (IHIG) - Return - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (IHIG) + XHIGT (IHIG) = XHIGT (JHIG) + JHIG = JHIG - 1 + Else + + XMAX = XLOWT (JLOW) + JLOW = JLOW - 1 + Do ICRS = 1, JLOW + If (XLOWT(ICRS) > XMAX) Then + XWRK = XMAX + XMAX = XLOWT(ICRS) + XLOWT (ICRS) = XWRK + End If + End Do + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XHIGT(1) <= XHIGT(2)) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - XHIGT (1) = XLOWT (1) - ILOW = 1 + INTH - JLOW - Do ICRS = 2, INTH - XWRK = XLOWT (ICRS) - Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 - If (XWRK < XHIGT(IDCR)) Then - XHIGT (IDCR+1) = XHIGT (IDCR) - Else - Exit - End If - End Do - XHIGT (IDCR+1) = XWRK - ILOW = ILOW + 1 - End Do - ! - XWRK1 = XHIGT(INTH) - ILOW = 2*INTH - JLOW - Do ICRS = INTH + 1, JLOW - If (XLOWT (ICRS) < XWRK1) Then - XWRK = XLOWT (ICRS) - Do IDCR = INTH - 1, MAX (1, ILOW), - 1 - If (XWRK >= XHIGT(IDCR)) Exit - XHIGT (IDCR+1) = XHIGT (IDCR) - End Do - XHIGT (IDCR+1) = XLOWT (ICRS) - XWRK1 = XHIGT(INTH) - End If - ILOW = ILOW + 1 - End Do - ! - VALNTH = XHIGT(INTH) - Return - ! - ! - Case (:-6) ! - ! last case: too many values in low part + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (3) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (3) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + XLOWT (ICRS) = XHIGT (JHIG) + End Do + JLOW = INTH + Exit ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - If (XLOWT(IMIL) > XLOWT(IFIN)) Then - XWRK = XLOWT (IFIN) - XLOWT (IFIN) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XLOWT(1) + REAL(INTH,sp)/REAL(JLOW+INTH,sp) * & - (XLOWT(IFIN)-XLOWT(1)) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (IFIN) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (IFIN) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + ! + XWRK1 = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XWRK1 + XPIV = XWRK1 + 0.5 * (XHIGT(IFIN) - XWRK1) ! - ! One takes values > XPIV to XHIGT + ! One takes values <= pivot to XLOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XLOWT(IFIN) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + XHIGT (JHIG) = XHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XHIGT(1) + IHIG = 1 + Do ICRS = 2, JHIG + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If + End Do + ! + VALNTH = XHIGT (IHIG) + Return + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + XHIGT (1) = XLOWT (1) + ILOW = 1 + INTH - JLOW + Do ICRS = 2, INTH + XWRK = XLOWT (ICRS) + Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 + If (XWRK < XHIGT(IDCR)) Then + XHIGT (IDCR + 1) = XHIGT (IDCR) + Else + Exit + End If + End Do + XHIGT (IDCR + 1) = XWRK + ILOW = ILOW + 1 + End Do + ! + XWRK1 = XHIGT(INTH) + ILOW = 2 * INTH - JLOW + Do ICRS = INTH + 1, JLOW + If (XLOWT (ICRS) < XWRK1) Then + XWRK = XLOWT (ICRS) + Do IDCR = INTH - 1, MAX (1, ILOW), - 1 + If (XWRK >= XHIGT(IDCR)) Exit + XHIGT (IDCR + 1) = XHIGT (IDCR) + End Do + XHIGT (IDCR + 1) = XLOWT (ICRS) + XWRK1 = XHIGT(INTH) + End If + ILOW = ILOW + 1 + End Do + ! + VALNTH = XHIGT(INTH) + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + If (XLOWT(IMIL) > XLOWT(IFIN)) Then + XWRK = XLOWT (IFIN) + XLOWT (IFIN) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XLOWT(1) + REAL(INTH, sp) / REAL(JLOW + INTH, sp) * & + (XLOWT(IFIN) - XLOWT(1)) + + ! + ! One takes values > XPIV to XHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XLOWT(IFIN) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! - VALNTH = MAXVAL (XLOWT (1:INTH)) + VALNTH = MAXVAL (XLOWT (1 : INTH)) Return ! ! @@ -15646,16 +15646,16 @@ Function I_valnth (XDONT, NORD) Result (valnth) ! Michel Olagnon - Aug. 2000 ! __________________________________________________________ ! __________________________________________________________ - Integer(kind=i4), Dimension (:), Intent (In) :: XDONT - Integer(kind=i4) :: valnth - Integer(kind=i4), Intent (In) :: NORD + Integer(kind = i4), Dimension (:), Intent (In) :: XDONT + Integer(kind = i4) :: valnth + Integer(kind = i4), Intent (In) :: NORD ! __________________________________________________________ - Integer(kind=i4), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT - Integer(kind=i4) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX + Integer(kind = i4), Dimension (SIZE(XDONT)) :: XLOWT, XHIGT + Integer(kind = i4) :: XPIV, XWRK, XWRK1, XWRK2, XWRK3, XMIN, XMAX ! - Integer(kind=i4) :: NDON, JHIG, JLOW, IHIG - Integer(kind=i4) :: IMIL, IFIN, ICRS, IDCR, ILOW - Integer(kind=i4) :: JLM2, JLM1, JHM2, JHM1, INTH + Integer(kind = i4) :: NDON, JHIG, JLOW, IHIG + Integer(kind = i4) :: IMIL, IFIN, ICRS, IDCR, ILOW + Integer(kind = i4) :: JLM2, JLM1, JHM2, JHM1, INTH ! NDON = SIZE (XDONT) INTH = MAX (MIN (NORD, NDON), 1) @@ -15663,80 +15663,80 @@ Function I_valnth (XDONT, NORD) Result (valnth) ! First loop is used to fill-in XLOWT, XHIGT at the same time ! If (NDON < 2) Then - If (INTH == 1) VALNTH = XDONT (1) - Return + If (INTH == 1) VALNTH = XDONT (1) + Return End If ! ! One chooses a pivot, best estimate possible to put fractile near ! mid-point of the set of low values. ! If (XDONT(2) < XDONT(1)) Then - XLOWT (1) = XDONT(2) - XHIGT (1) = XDONT(1) + XLOWT (1) = XDONT(2) + XHIGT (1) = XDONT(1) Else - XLOWT (1) = XDONT(1) - XHIGT (1) = XDONT(2) + XLOWT (1) = XDONT(1) + XHIGT (1) = XDONT(2) End If ! If (NDON < 3) Then - If (INTH == 1) VALNTH = XLOWT (1) - If (INTH == 2) VALNTH = XHIGT (1) - Return + If (INTH == 1) VALNTH = XLOWT (1) + If (INTH == 2) VALNTH = XHIGT (1) + Return End If ! If (XDONT(3) < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - If (XDONT(3) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(3) - Else - XHIGT (1) = XDONT(3) - End If + XHIGT (2) = XHIGT (1) + If (XDONT(3) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(3) + Else + XHIGT (1) = XDONT(3) + End If Else - XHIGT (2) = XDONT(3) + XHIGT (2) = XDONT(3) End If ! If (NDON < 4) Then - If (INTH == 1) Then - VALNTH = XLOWT (1) - Else - VALNTH = XHIGT (INTH - 1) - End If - Return + If (INTH == 1) Then + VALNTH = XLOWT (1) + Else + VALNTH = XHIGT (INTH - 1) + End If + Return End If ! If (XDONT(NDON) < XHIGT(1)) Then - XHIGT (3) = XHIGT (2) - XHIGT (2) = XHIGT (1) - If (XDONT(NDON) < XLOWT(1)) Then - XHIGT (1) = XLOWT (1) - XLOWT (1) = XDONT(NDON) - Else - XHIGT (1) = XDONT(NDON) - End If + XHIGT (3) = XHIGT (2) + XHIGT (2) = XHIGT (1) + If (XDONT(NDON) < XLOWT(1)) Then + XHIGT (1) = XLOWT (1) + XLOWT (1) = XDONT(NDON) + Else + XHIGT (1) = XDONT(NDON) + End If Else - XHIGT (3) = XDONT(NDON) + XHIGT (3) = XDONT(NDON) End If ! If (NDON < 5) Then - If (INTH == 1) Then - VALNTH = XLOWT (1) - Else - VALNTH = XHIGT (INTH - 1) - End If - Return + If (INTH == 1) Then + VALNTH = XLOWT (1) + Else + VALNTH = XHIGT (INTH - 1) + End If + Return End If ! JLOW = 1 JHIG = 3 - XPIV = XLOWT(1) + INT(REAL(2*INTH,sp)/REAL(NDON+INTH,sp),i4) * (XHIGT(3)-XLOWT(1)) + XPIV = XLOWT(1) + INT(REAL(2 * INTH, sp) / REAL(NDON + INTH, sp), i4) * (XHIGT(3) - XLOWT(1)) If (XPIV >= XHIGT(1)) Then - XPIV = XLOWT(1) + INT(REAL(2*INTH,sp)/REAL(NDON+INTH,sp),i4) * & - (XHIGT(2)-XLOWT(1)) - If (XPIV >= XHIGT(1)) & - XPIV = XLOWT(1) + INT(REAL(2*INTH,sp) / REAL(NDON+INTH,sp),i4) * & - (XHIGT(1)-XLOWT(1)) + XPIV = XLOWT(1) + INT(REAL(2 * INTH, sp) / REAL(NDON + INTH, sp), i4) * & + (XHIGT(2) - XLOWT(1)) + If (XPIV >= XHIGT(1)) & + XPIV = XLOWT(1) + INT(REAL(2 * INTH, sp) / REAL(NDON + INTH, sp), i4) * & + (XHIGT(1) - XLOWT(1)) End If ! ! One puts values > pivot in the end and those <= pivot @@ -15748,62 +15748,62 @@ Function I_valnth (XDONT, NORD) Result (valnth) ! ! If (XDONT(NDON) > XPIV) Then - ICRS = 3 - Do + ICRS = 3 + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) > XPIV) Then + If (ICRS >= NDON) Exit + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + ! One restricts further processing because it is no use + ! to store more high values + ! + If (ICRS < NDON - 1) Then + Do ICRS = ICRS + 1 - If (XDONT(ICRS) > XPIV) Then - If (ICRS >= NDON) Exit - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - ! One restricts further processing because it is no use - ! to store more high values - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - Else If (ICRS >= NDON) Then - Exit - End If - End Do - End If - ! - ! + If (XDONT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + Else If (ICRS >= NDON) Then + Exit + End If + End Do + End If + ! + ! Else - ! - ! Same as above, but this is not as easy to optimize, so the - ! DO-loop is kept - ! - Do ICRS = 4, NDON - 1 - If (XDONT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XDONT(ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - If (JLOW >= INTH) Exit + ! + ! Same as above, but this is not as easy to optimize, so the + ! DO-loop is kept + ! + Do ICRS = 4, NDON - 1 + If (XDONT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XDONT(ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < NDON - 1) Then + Do + ICRS = ICRS + 1 + If (XDONT(ICRS) <= XPIV) Then + If (ICRS >= NDON) Exit + JLOW = JLOW + 1 + XLOWT (JLOW) = XDONT(ICRS) End If - End Do - ! - If (ICRS < NDON-1) Then - Do - ICRS = ICRS + 1 - If (XDONT(ICRS) <= XPIV) Then - If (ICRS >= NDON) Exit - JLOW = JLOW + 1 - XLOWT (JLOW) = XDONT(ICRS) - End If - End Do - End If + End Do + End If End If ! JLM2 = 0 @@ -15811,314 +15811,314 @@ Function I_valnth (XDONT, NORD) Result (valnth) JHM2 = 0 JHM1 = 0 Do - If (JLM2 == JLOW .And. JHM2 == JHIG) Then - ! - ! We are oscillating. Perturbate by bringing JLOW closer by one - ! to INTH - ! - If (INTH > JLOW) Then - XMIN = XHIGT(1) - IHIG = 1 - Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If - End Do - ! - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (IHIG) - XHIGT (IHIG) = XHIGT (JHIG) - JHIG = JHIG - 1 - Else - - XMAX = XLOWT (JLOW) - JLOW = JLOW - 1 - Do ICRS = 1, JLOW - If (XLOWT(ICRS) > XMAX) Then - XWRK = XMAX - XMAX = XLOWT(ICRS) - XLOWT (ICRS) = XWRK - End If - End Do - End If - End If - JLM2 = JLM1 - JLM1 = JLOW - JHM2 = JHM1 - JHM1 = JHIG - ! - ! We try to bring the number of values in the low values set - ! closer to INTH. - ! - Select Case (INTH-JLOW) - Case (2:) - ! - ! Not enough values in low part, at least 2 are missing - ! - INTH = INTH - JLOW - JLOW = 0 - Select Case (JHIG) -!!!!! CASE DEFAULT -!!!!! write (unit=*,fmt=*) "Assertion failed" -!!!!! STOP - ! - ! We make a special case when we have so few values in - ! the high values set that it is bad performance to choose a pivot - ! and apply the general algorithm. - ! - Case (2) - If (XHIGT(1) <= XHIGT(2)) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (2) - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (1) - End If - Exit - ! - Case (3) - ! - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (3) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (3) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - JHIG = 0 - Do ICRS = JLOW + 1, INTH - JHIG = JHIG + 1 - XLOWT (ICRS) = XHIGT (JHIG) - End Do - JLOW = INTH - Exit - ! - Case (4:) - ! - ! - IFIN = JHIG - ! - ! One chooses a pivot from the 2 first values and the last one. - ! This should ensure sufficient renewal between iterations to - ! avoid worst case behavior effects. - ! - XWRK1 = XHIGT (1) - XWRK2 = XHIGT (2) - XWRK3 = XHIGT (IFIN) - If (XWRK2 < XWRK1) Then - XHIGT (1) = XWRK2 - XHIGT (2) = XWRK1 - XWRK2 = XWRK1 - End If - If (XWRK2 > XWRK3) Then - XHIGT (IFIN) = XWRK2 - XHIGT (2) = XWRK3 - XWRK2 = XWRK3 - If (XWRK2 < XHIGT(1)) Then - XHIGT (2) = XHIGT (1) - XHIGT (1) = XWRK2 - End If - End If - ! - XWRK1 = XHIGT (1) - JLOW = JLOW + 1 - XLOWT (JLOW) = XWRK1 - XPIV = XWRK1 + (XHIGT(IFIN)-XWRK1)/2 - ! - ! One takes values <= pivot to XLOWT - ! Again, 2 parts, one where we take care of the remaining - ! high values because we might still need them, and the - ! other when we know that we will have more than enough - ! low values in the end. - ! - JHIG = 0 - Do ICRS = 2, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - If (JLOW >= INTH) Exit - Else - JHIG = JHIG + 1 - XHIGT (JHIG) = XHIGT (ICRS) - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XHIGT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XHIGT (ICRS) - End If - End Do - End Select - ! - ! - Case (1) - ! - ! Only 1 value is missing in low part - ! + If (JLM2 == JLOW .And. JHM2 == JHIG) Then + ! + ! We are oscillating. Perturbate by bringing JLOW closer by one + ! to INTH + ! + If (INTH > JLOW) Then XMIN = XHIGT(1) IHIG = 1 Do ICRS = 2, JHIG - If (XHIGT(ICRS) < XMIN) Then - XMIN = XHIGT(ICRS) - IHIG = ICRS - End If + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If End Do ! - VALNTH = XHIGT (IHIG) - Return - ! - ! - Case (0) - ! - ! Low part is exactly what we want - ! + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (IHIG) + XHIGT (IHIG) = XHIGT (JHIG) + JHIG = JHIG - 1 + Else + + XMAX = XLOWT (JLOW) + JLOW = JLOW - 1 + Do ICRS = 1, JLOW + If (XLOWT(ICRS) > XMAX) Then + XWRK = XMAX + XMAX = XLOWT(ICRS) + XLOWT (ICRS) = XWRK + End If + End Do + End If + End If + JLM2 = JLM1 + JLM1 = JLOW + JHM2 = JHM1 + JHM1 = JHIG + ! + ! We try to bring the number of values in the low values set + ! closer to INTH. + ! + Select Case (INTH - JLOW) + Case (2 :) + ! + ! Not enough values in low part, at least 2 are missing + ! + INTH = INTH - JLOW + JLOW = 0 + Select Case (JHIG) + !!!!! CASE DEFAULT + !!!!! write (unit=*,fmt=*) "Assertion failed" + !!!!! STOP + ! + ! We make a special case when we have so few values in + ! the high values set that it is bad performance to choose a pivot + ! and apply the general algorithm. + ! + Case (2) + If (XHIGT(1) <= XHIGT(2)) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (2) + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (1) + End If Exit ! + Case (3) ! - Case (-5:-1) - ! - ! Only few values too many in low part - ! - XHIGT (1) = XLOWT (1) - ILOW = 1 + INTH - JLOW - Do ICRS = 2, INTH - XWRK = XLOWT (ICRS) - Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 - If (XWRK < XHIGT(IDCR)) Then - XHIGT (IDCR+1) = XHIGT (IDCR) - Else - Exit - End If - End Do - XHIGT (IDCR+1) = XWRK - ILOW = ILOW + 1 - End Do - ! - XWRK1 = XHIGT(INTH) - ILOW = 2*INTH - JLOW - Do ICRS = INTH + 1, JLOW - If (XLOWT (ICRS) < XWRK1) Then - XWRK = XLOWT (ICRS) - Do IDCR = INTH - 1, MAX (1, ILOW), - 1 - If (XWRK >= XHIGT(IDCR)) Exit - XHIGT (IDCR+1) = XHIGT (IDCR) - End Do - XHIGT (IDCR+1) = XLOWT (ICRS) - XWRK1 = XHIGT(INTH) - End If - ILOW = ILOW + 1 - End Do - ! - VALNTH = XHIGT(INTH) - Return - ! - ! - Case (:-6) ! - ! last case: too many values in low part + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (3) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (3) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + JHIG = 0 + Do ICRS = JLOW + 1, INTH + JHIG = JHIG + 1 + XLOWT (ICRS) = XHIGT (JHIG) + End Do + JLOW = INTH + Exit ! - - IMIL = (JLOW+1) / 2 - IFIN = JLOW + Case (4 :) ! - ! One chooses a pivot from 1st, last, and middle values ! - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - If (XLOWT(IMIL) > XLOWT(IFIN)) Then - XWRK = XLOWT (IFIN) - XLOWT (IFIN) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - If (XLOWT(IMIL) < XLOWT(1)) Then - XWRK = XLOWT (1) - XLOWT (1) = XLOWT (IMIL) - XLOWT (IMIL) = XWRK - End If - End If - If (IFIN <= 3) Exit + IFIN = JHIG ! - XPIV = XLOWT(1) + INT(REAL(INTH,sp)/REAL(JLOW+INTH,sp),i4) * & - (XLOWT(IFIN)-XLOWT(1)) - + ! One chooses a pivot from the 2 first values and the last one. + ! This should ensure sufficient renewal between iterations to + ! avoid worst case behavior effects. + ! + XWRK1 = XHIGT (1) + XWRK2 = XHIGT (2) + XWRK3 = XHIGT (IFIN) + If (XWRK2 < XWRK1) Then + XHIGT (1) = XWRK2 + XHIGT (2) = XWRK1 + XWRK2 = XWRK1 + End If + If (XWRK2 > XWRK3) Then + XHIGT (IFIN) = XWRK2 + XHIGT (2) = XWRK3 + XWRK2 = XWRK3 + If (XWRK2 < XHIGT(1)) Then + XHIGT (2) = XHIGT (1) + XHIGT (1) = XWRK2 + End If + End If + ! + XWRK1 = XHIGT (1) + JLOW = JLOW + 1 + XLOWT (JLOW) = XWRK1 + XPIV = XWRK1 + (XHIGT(IFIN) - XWRK1) / 2 ! - ! One takes values > XPIV to XHIGT + ! One takes values <= pivot to XLOWT + ! Again, 2 parts, one where we take care of the remaining + ! high values because we might still need them, and the + ! other when we know that we will have more than enough + ! low values in the end. ! JHIG = 0 - JLOW = 0 - ! - If (XLOWT(IFIN) > XPIV) Then - ICRS = 0 - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - If (ICRS >= IFIN) Exit - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - If (ICRS < IFIN) Then - Do - ICRS = ICRS + 1 - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - Else - If (ICRS >= IFIN) Exit - End If - End Do - End If - Else - Do ICRS = 1, IFIN - If (XLOWT(ICRS) > XPIV) Then - JHIG = JHIG + 1 - XHIGT (JHIG) = XLOWT (ICRS) - Else - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - If (JLOW >= INTH) Exit - End If - End Do - ! - Do ICRS = ICRS + 1, IFIN - If (XLOWT(ICRS) <= XPIV) Then - JLOW = JLOW + 1 - XLOWT (JLOW) = XLOWT (ICRS) - End If - End Do - End If - ! - End Select - ! + Do ICRS = 2, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + If (JLOW >= INTH) Exit + Else + JHIG = JHIG + 1 + XHIGT (JHIG) = XHIGT (ICRS) + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XHIGT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XHIGT (ICRS) + End If + End Do + End Select + ! + ! + Case (1) + ! + ! Only 1 value is missing in low part + ! + XMIN = XHIGT(1) + IHIG = 1 + Do ICRS = 2, JHIG + If (XHIGT(ICRS) < XMIN) Then + XMIN = XHIGT(ICRS) + IHIG = ICRS + End If + End Do + ! + VALNTH = XHIGT (IHIG) + Return + ! + ! + Case (0) + ! + ! Low part is exactly what we want + ! + Exit + ! + ! + Case (-5 : -1) + ! + ! Only few values too many in low part + ! + XHIGT (1) = XLOWT (1) + ILOW = 1 + INTH - JLOW + Do ICRS = 2, INTH + XWRK = XLOWT (ICRS) + Do IDCR = ICRS - 1, MAX (1, ILOW), - 1 + If (XWRK < XHIGT(IDCR)) Then + XHIGT (IDCR + 1) = XHIGT (IDCR) + Else + Exit + End If + End Do + XHIGT (IDCR + 1) = XWRK + ILOW = ILOW + 1 + End Do + ! + XWRK1 = XHIGT(INTH) + ILOW = 2 * INTH - JLOW + Do ICRS = INTH + 1, JLOW + If (XLOWT (ICRS) < XWRK1) Then + XWRK = XLOWT (ICRS) + Do IDCR = INTH - 1, MAX (1, ILOW), - 1 + If (XWRK >= XHIGT(IDCR)) Exit + XHIGT (IDCR + 1) = XHIGT (IDCR) + End Do + XHIGT (IDCR + 1) = XLOWT (ICRS) + XWRK1 = XHIGT(INTH) + End If + ILOW = ILOW + 1 + End Do + ! + VALNTH = XHIGT(INTH) + Return + ! + ! + Case (: -6) + ! + ! last case: too many values in low part + ! + + IMIL = (JLOW + 1) / 2 + IFIN = JLOW + ! + ! One chooses a pivot from 1st, last, and middle values + ! + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + If (XLOWT(IMIL) > XLOWT(IFIN)) Then + XWRK = XLOWT (IFIN) + XLOWT (IFIN) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + If (XLOWT(IMIL) < XLOWT(1)) Then + XWRK = XLOWT (1) + XLOWT (1) = XLOWT (IMIL) + XLOWT (IMIL) = XWRK + End If + End If + If (IFIN <= 3) Exit + ! + XPIV = XLOWT(1) + INT(REAL(INTH, sp) / REAL(JLOW + INTH, sp), i4) * & + (XLOWT(IFIN) - XLOWT(1)) + + ! + ! One takes values > XPIV to XHIGT + ! + JHIG = 0 + JLOW = 0 + ! + If (XLOWT(IFIN) > XPIV) Then + ICRS = 0 + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + If (ICRS >= IFIN) Exit + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + If (ICRS < IFIN) Then + Do + ICRS = ICRS + 1 + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + Else + If (ICRS >= IFIN) Exit + End If + End Do + End If + Else + Do ICRS = 1, IFIN + If (XLOWT(ICRS) > XPIV) Then + JHIG = JHIG + 1 + XHIGT (JHIG) = XLOWT (ICRS) + Else + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + If (JLOW >= INTH) Exit + End If + End Do + ! + Do ICRS = ICRS + 1, IFIN + If (XLOWT(ICRS) <= XPIV) Then + JLOW = JLOW + 1 + XLOWT (JLOW) = XLOWT (ICRS) + End If + End Do + End If + ! + End Select + ! End Do ! ! Now, we only need to find maximum of the 1:INTH set ! - VALNTH = MAXVAL (XLOWT (1:INTH)) + VALNTH = MAXVAL (XLOWT (1 : INTH)) Return ! ! diff --git a/src/lib/mo_percentile.f90 b/src/lib/mo_percentile.f90 index bb1132dd..1f67dad0 100644 --- a/src/lib/mo_percentile.f90 +++ b/src/lib/mo_percentile.f90 @@ -17,7 +17,7 @@ MODULE mo_percentile ! Copyright 2011-2014 Matthias Cuntz, Juliane Mai, Stephan Thober - USE mo_kind, ONLY: i4, sp, dp + USE mo_kind, ONLY : i4, sp, dp Implicit NONE @@ -76,7 +76,7 @@ MODULE mo_percentile ! Written, Matthias Cuntz, Mar 2011 ! Modified, Matthias Cuntz, Juliane Mai, Jul 2012 - uses previous of ksmallest to half execution time INTERFACE median - MODULE PROCEDURE median_sp, median_dp + MODULE PROCEDURE median_sp, median_dp END INTERFACE median ! ------------------------------------------------------------------ @@ -131,7 +131,7 @@ MODULE mo_percentile ! HISTORY ! Written, Matthias Cuntz, May 2014 - based on qmedian INTERFACE n_element - MODULE PROCEDURE n_element_dp, n_element_sp + MODULE PROCEDURE n_element_dp, n_element_sp END INTERFACE n_element ! ------------------------------------------------------------------ @@ -205,7 +205,7 @@ MODULE mo_percentile ! Juliane Mai, July 2012 - different interpolation schemes ! Modified, Matthias Cuntz, Juliane Mai, Jul 2012 - uses previous of ksmallest to half execution time INTERFACE percentile - MODULE PROCEDURE percentile_0d_sp, percentile_0d_dp, percentile_1d_sp, percentile_1d_dp + MODULE PROCEDURE percentile_0d_sp, percentile_0d_dp, percentile_1d_sp, percentile_1d_dp END INTERFACE percentile ! ------------------------------------------------------------------ @@ -255,7 +255,7 @@ MODULE mo_percentile ! Modified, Matthias Cuntz, Jul 2012 - function, k=n/2+1 ! Modified, Matthias Cuntz, Juliane Mai, Jul 2012 - real median for even n INTERFACE qmedian - MODULE PROCEDURE qmedian_sp, qmedian_dp + MODULE PROCEDURE qmedian_sp, qmedian_dp END INTERFACE qmedian ! ------------------------------------------------------------------ @@ -272,39 +272,39 @@ FUNCTION median_dp(arrin, mask) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: arrin - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(dp) :: median_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: arrin + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(dp) :: median_dp INTEGER(i4) :: n REAL(dp), DIMENSION(:), ALLOCATABLE :: arr REAL(dp) :: tmp if (present(mask)) then - n = count(mask) - allocate(arr(n)) - arr = pack(arrin,mask) + n = count(mask) + allocate(arr(n)) + arr = pack(arrin, mask) - if (n < 2) stop 'median_dp: n < 2' + if (n < 2) stop 'median_dp: n < 2' - if (mod(n,2) == 0) then ! Even - median_dp = n_element(arr,n/2+1,previous=tmp) - median_dp = 0.5_dp*(median_dp+tmp) - else ! Odd - median_dp = n_element(arr,(n+1)/2) - end if + if (mod(n, 2) == 0) then ! Even + median_dp = n_element(arr, n / 2 + 1, previous = tmp) + median_dp = 0.5_dp * (median_dp + tmp) + else ! Odd + median_dp = n_element(arr, (n + 1) / 2) + end if - deallocate(arr) + deallocate(arr) else - n = size(arrin) - if (n < 2) stop 'median_dp: n < 2' - - if (mod(n,2) == 0) then ! Even - median_dp = n_element(arrin,n/2+1,previous=tmp) - median_dp = 0.5_dp*(median_dp+tmp) - else ! Odd - median_dp = n_element(arrin,(n+1)/2) - end if + n = size(arrin) + if (n < 2) stop 'median_dp: n < 2' + + if (mod(n, 2) == 0) then ! Even + median_dp = n_element(arrin, n / 2 + 1, previous = tmp) + median_dp = 0.5_dp * (median_dp + tmp) + else ! Odd + median_dp = n_element(arrin, (n + 1) / 2) + end if end if END FUNCTION median_dp @@ -314,39 +314,39 @@ FUNCTION median_sp(arrin, mask) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: arrin - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - REAL(sp) :: median_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: arrin + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + REAL(sp) :: median_sp INTEGER(i4) :: n REAL(sp), DIMENSION(:), ALLOCATABLE :: arr REAL(sp) :: tmp if (present(mask)) then - n = count(mask) - allocate(arr(n)) - arr = pack(arrin,mask) + n = count(mask) + allocate(arr(n)) + arr = pack(arrin, mask) - if (n < 2) stop 'median_sp: n < 2' + if (n < 2) stop 'median_sp: n < 2' - if (mod(n,2) == 0) then ! Even - median_sp = n_element(arr,n/2+1,previous=tmp) - median_sp = 0.5_sp*(median_sp+tmp) - else ! Odd - median_sp = n_element(arr,(n+1)/2) - end if + if (mod(n, 2) == 0) then ! Even + median_sp = n_element(arr, n / 2 + 1, previous = tmp) + median_sp = 0.5_sp * (median_sp + tmp) + else ! Odd + median_sp = n_element(arr, (n + 1) / 2) + end if - deallocate(arr) + deallocate(arr) else - n = size(arrin) - if (n < 2) stop 'median_sp: n < 2' - - if (mod(n,2) == 0) then ! Even - median_sp = n_element(arrin,n/2+1,previous=tmp) - median_sp = 0.5_sp*(median_sp+tmp) - else ! Odd - median_sp = n_element(arrin,(n+1)/2) - end if + n = size(arrin) + if (n < 2) stop 'median_sp: n < 2' + + if (mod(n, 2) == 0) then ! Even + median_sp = n_element(arrin, n / 2 + 1, previous = tmp) + median_sp = 0.5_sp * (median_sp + tmp) + else ! Odd + median_sp = n_element(arrin, (n + 1) / 2) + end if end if END FUNCTION median_sp @@ -357,28 +357,28 @@ function n_element_dp(idat, n, mask, before, after, previous, next) IMPLICIT NONE - real(dp), dimension(:), intent(in) :: idat - integer(i4), intent(in) :: n - logical, dimension(:), optional, intent(in) :: mask - real(dp), optional, intent(out) :: before - real(dp), optional, intent(out) :: after - real(dp), optional, intent(out) :: previous - real(dp), optional, intent(out) :: next - real(dp) :: n_element_dp + real(dp), dimension(:), intent(in) :: idat + integer(i4), intent(in) :: n + logical, dimension(:), optional, intent(in) :: mask + real(dp), optional, intent(out) :: before + real(dp), optional, intent(out) :: after + real(dp), optional, intent(out) :: previous + real(dp), optional, intent(out) :: next + real(dp) :: n_element_dp real(dp), dimension(:), allocatable :: dat real(dp) :: w integer(i4) :: nn, k - integer(i4) :: l,r,i,j + integer(i4) :: l, r, i, j if (present(mask)) then - nn = count(mask) - allocate(dat(nn)) - dat = pack(idat,mask) + nn = count(mask) + allocate(dat(nn)) + dat = pack(idat, mask) else - nn = size(idat) - allocate(dat(nn)) - dat = idat + nn = size(idat) + allocate(dat(nn)) + dat = idat end if if (n < 1) stop 'n_element_dp: n < 1' @@ -389,28 +389,28 @@ function n_element_dp(idat, n, mask, before, after, previous, next) k = n !nn/2 + 1 l = 1 r = nn - do while( l < r ) - n_element_dp = dat(k) - i = l - j = r - do - do while( dat(i) < n_element_dp ) - i = i + 1 - enddo - do while( n_element_dp < dat(j) ) - j = j - 1 - enddo - if ( i <= j ) then - w = dat(i) - dat(i) = dat(j) - dat(j) = w - i = i + 1 - j = j - 1 - end if - if ( i > j ) exit - enddo - if ( j < k ) l = i - if ( k < i ) r = j + do while(l < r) + n_element_dp = dat(k) + i = l + j = r + do + do while(dat(i) < n_element_dp) + i = i + 1 + enddo + do while(n_element_dp < dat(j)) + j = j - 1 + enddo + if (i <= j) then + w = dat(i) + dat(i) = dat(j) + dat(j) = w + i = i + 1 + j = j - 1 + end if + if (i > j) exit + enddo + if (j < k) l = i + if (k < i) r = j enddo ! if (mod(nn,2) == 0) then ! n_element_dp = 0.5_dp*(dat(k) + maxval(dat(:k-1))) @@ -419,10 +419,10 @@ function n_element_dp(idat, n, mask, before, after, previous, next) ! end if n_element_dp = dat(k) - if (present(before)) before = maxval(dat(:k-1)) - if (present(previous)) previous = maxval(dat(:k-1)) - if (present(after)) after = minval(dat(k+1:)) - if (present(next)) next = minval(dat(k+1:)) + if (present(before)) before = maxval(dat(: k - 1)) + if (present(previous)) previous = maxval(dat(: k - 1)) + if (present(after)) after = minval(dat(k + 1 :)) + if (present(next)) next = minval(dat(k + 1 :)) deallocate(dat) @@ -432,28 +432,28 @@ function n_element_sp(idat, n, mask, before, after, previous, next) IMPLICIT NONE - real(sp), dimension(:), intent(in) :: idat - integer(i4), intent(in) :: n - logical, dimension(:), optional, intent(in) :: mask - real(sp), optional, intent(out) :: before - real(sp), optional, intent(out) :: after - real(sp), optional, intent(out) :: previous - real(sp), optional, intent(out) :: next - real(sp) :: n_element_sp + real(sp), dimension(:), intent(in) :: idat + integer(i4), intent(in) :: n + logical, dimension(:), optional, intent(in) :: mask + real(sp), optional, intent(out) :: before + real(sp), optional, intent(out) :: after + real(sp), optional, intent(out) :: previous + real(sp), optional, intent(out) :: next + real(sp) :: n_element_sp real(sp), dimension(:), allocatable :: dat real(sp) :: w integer(i4) :: nn, k - integer(i4) :: l,r,i,j + integer(i4) :: l, r, i, j if (present(mask)) then - nn = count(mask) - allocate(dat(nn)) - dat = pack(idat,mask) + nn = count(mask) + allocate(dat(nn)) + dat = pack(idat, mask) else - nn = size(idat) - allocate(dat(nn)) - dat = idat + nn = size(idat) + allocate(dat(nn)) + dat = idat end if if (n < 1) stop 'n_element_sp: n < 1' @@ -464,28 +464,28 @@ function n_element_sp(idat, n, mask, before, after, previous, next) k = n !nn/2 + 1 l = 1 r = nn - do while( l < r ) - n_element_sp = dat(k) - i = l - j = r - do - do while( dat(i) < n_element_sp ) - i = i + 1 - enddo - do while( n_element_sp < dat(j) ) - j = j - 1 - enddo - if ( i <= j ) then - w = dat(i) - dat(i) = dat(j) - dat(j) = w - i = i + 1 - j = j - 1 - end if - if ( i > j ) exit - enddo - if ( j < k ) l = i - if ( k < i ) r = j + do while(l < r) + n_element_sp = dat(k) + i = l + j = r + do + do while(dat(i) < n_element_sp) + i = i + 1 + enddo + do while(n_element_sp < dat(j)) + j = j - 1 + enddo + if (i <= j) then + w = dat(i) + dat(i) = dat(j) + dat(j) = w + i = i + 1 + j = j - 1 + end if + if (i > j) exit + enddo + if (j < k) l = i + if (k < i) r = j enddo ! if (mod(nn,2) == 0) then ! n_element_sp = 0.5_sp*(dat(k) + maxval(dat(:k-1))) @@ -494,10 +494,10 @@ function n_element_sp(idat, n, mask, before, after, previous, next) ! end if n_element_sp = dat(k) - if (present(before)) before = maxval(dat(:k-1)) - if (present(previous)) previous = maxval(dat(:k-1)) - if (present(after)) after = minval(dat(k+1:)) - if (present(next)) next = minval(dat(k+1:)) + if (present(before)) before = maxval(dat(: k - 1)) + if (present(previous)) previous = maxval(dat(: k - 1)) + if (present(after)) after = minval(dat(k + 1 :)) + if (present(next)) next = minval(dat(k + 1 :)) deallocate(dat) @@ -505,257 +505,257 @@ end function n_element_sp ! ------------------------------------------------------------------ - FUNCTION percentile_0d_dp(arrin,k,mask,mode_in) + FUNCTION percentile_0d_dp(arrin, k, mask, mode_in) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: arrin - REAL(dp), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in - REAL(dp) :: percentile_0d_dp + REAL(dp), DIMENSION(:), INTENT(IN) :: arrin + REAL(dp), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in + REAL(dp) :: percentile_0d_dp - INTEGER(i4) :: n, nn1, nn2 - INTEGER(i4) :: mode - REAL(dp) :: kk, ks1, ks2 + INTEGER(i4) :: n, nn1, nn2 + INTEGER(i4) :: mode + REAL(dp) :: kk, ks1, ks2 REAL(dp), DIMENSION(:), ALLOCATABLE :: arr if (present(mask)) then - n = count(mask) + n = count(mask) else - n = size(arrin) + n = size(arrin) end if if (present(mode_in)) then - mode = mode_in + mode = mode_in else - ! Default : Inverse empirical CDF - mode = 1_i4 + ! Default : Inverse empirical CDF + mode = 1_i4 end if if (n < 2) stop 'percentile_0d_dp: n < 2' select case (mode) - ! Inverse empirical CDF: Mathematica default + ! Inverse empirical CDF: Mathematica default case(1_i4) - kk = k/100._dp*real(n,dp) - nn1 = min(n, max(1_i4,ceiling(kk,kind=i4))) - nn2 = nn1 + kk = k / 100._dp * real(n, dp) + nn1 = min(n, max(1_i4, ceiling(kk, kind = i4))) + nn2 = nn1 - ! Linear interpolation (California method) + ! Linear interpolation (California method) case(2_i4) - kk = k/100._dp*real(n,dp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = k / 100._dp * real(n, dp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Element numbered closest + ! Element numbered closest case(3_i4) - kk = 0.5_dp+k/100._dp*real(n,dp) - nn1 = min(n, max(1_i4,floor(kk,kind=i4))) - nn2 = nn1 + kk = 0.5_dp + k / 100._dp * real(n, dp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = nn1 - ! Linear interpolation (hydrologist method) + ! Linear interpolation (hydrologist method) case(4_i4) - kk = 0.5_dp+k/100._dp*(real(n,dp)) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 0.5_dp + k / 100._dp * (real(n, dp)) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Mean-based estimate (Weibull method): IMSL default + ! Mean-based estimate (Weibull method): IMSL default case(5_i4) - kk = k/100._dp*(real(n,dp)+1._dp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = k / 100._dp * (real(n, dp) + 1._dp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Mode-based estimate + ! Mode-based estimate case(6_i4) - kk = 1.0_dp+k/100._dp*(real(n,dp)-1._dp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 1.0_dp + k / 100._dp * (real(n, dp) - 1._dp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Median-based estimate + ! Median-based estimate case(7_i4) - kk = 1.0_dp/3.0_dp+k/100._dp*(real(n,dp)+1.0_dp/3.0_dp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 1.0_dp / 3.0_dp + k / 100._dp * (real(n, dp) + 1.0_dp / 3.0_dp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Normal distribution estimate + ! Normal distribution estimate case(8_i4) - kk = 3.0_dp/8.0_dp+k/100._dp*(real(n,dp)+1.0_dp/4.0_dp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 3.0_dp / 8.0_dp + k / 100._dp * (real(n, dp) + 1.0_dp / 4.0_dp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! No valid mode + ! No valid mode case default - stop 'percentile_0d_dp: mode > 8 not implemented' + stop 'percentile_0d_dp: mode > 8 not implemented' end select if (present(mask)) then - allocate(arr(n)) - arr = pack(arrin,mask) - if (nn1 .eq. nn2) then - ! no interpolation - percentile_0d_dp = n_element(arr,nn1) - else - ! interpolation - ks2 = n_element(arr,nn2,previous=ks1) - percentile_0d_dp = ks1 + (ks2-ks1)*(kk-real(nn1,dp)) - end if - deallocate(arr) + allocate(arr(n)) + arr = pack(arrin, mask) + if (nn1 .eq. nn2) then + ! no interpolation + percentile_0d_dp = n_element(arr, nn1) + else + ! interpolation + ks2 = n_element(arr, nn2, previous = ks1) + percentile_0d_dp = ks1 + (ks2 - ks1) * (kk - real(nn1, dp)) + end if + deallocate(arr) else - if (nn1 .eq. nn2) then - ! no interpolation - percentile_0d_dp = n_element(arrin,nn1) - else - ! interpolation - ks2 = n_element(arrin,nn2,previous=ks1) - percentile_0d_dp = ks1 + (ks2-ks1)*(kk-real(nn1,dp)) - end if + if (nn1 .eq. nn2) then + ! no interpolation + percentile_0d_dp = n_element(arrin, nn1) + else + ! interpolation + ks2 = n_element(arrin, nn2, previous = ks1) + percentile_0d_dp = ks1 + (ks2 - ks1) * (kk - real(nn1, dp)) + end if end if END FUNCTION percentile_0d_dp - FUNCTION percentile_0d_sp(arrin,k,mask,mode_in) + FUNCTION percentile_0d_sp(arrin, k, mask, mode_in) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: arrin - REAL(sp), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in - REAL(sp) :: percentile_0d_sp + REAL(sp), DIMENSION(:), INTENT(IN) :: arrin + REAL(sp), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in + REAL(sp) :: percentile_0d_sp - INTEGER(i4) :: n, nn1, nn2 - INTEGER(i4) :: mode - REAL(sp) :: kk, ks1, ks2 + INTEGER(i4) :: n, nn1, nn2 + INTEGER(i4) :: mode + REAL(sp) :: kk, ks1, ks2 REAL(sp), DIMENSION(:), ALLOCATABLE :: arr if (present(mask)) then - n = count(mask) + n = count(mask) else - n = size(arrin) + n = size(arrin) end if if (present(mode_in)) then - mode = mode_in + mode = mode_in else - ! Default : Inverse empirical CDF - mode = 1_i4 + ! Default : Inverse empirical CDF + mode = 1_i4 end if if (n < 2) stop 'percentile_0d_sp: n < 2' select case (mode) - ! Inverse empirical CDF: Mathematica default + ! Inverse empirical CDF: Mathematica default case(1_i4) - kk = k/100._sp*real(n,sp) - nn1 = min(n, max(1_i4,ceiling(kk,kind=i4))) - nn2 = nn1 + kk = k / 100._sp * real(n, sp) + nn1 = min(n, max(1_i4, ceiling(kk, kind = i4))) + nn2 = nn1 - ! Linear interpolation (California method) + ! Linear interpolation (California method) case(2_i4) - kk = k/100._sp*real(n,sp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = k / 100._sp * real(n, sp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Element numbered closest + ! Element numbered closest case(3_i4) - kk = 0.5_sp+k/100._sp*real(n,sp) - nn1 = min(n, max(1_i4,floor(kk,kind=i4))) - nn2 = nn1 + kk = 0.5_sp + k / 100._sp * real(n, sp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = nn1 - ! Linear interpolation (hydrologist method) + ! Linear interpolation (hydrologist method) case(4_i4) - kk = 0.5_sp+k/100._sp*(real(n,sp)) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 0.5_sp + k / 100._sp * (real(n, sp)) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Mean-based estimate (Weibull method): IMSL default + ! Mean-based estimate (Weibull method): IMSL default case(5_i4) - kk = k/100._sp*(real(n,sp)+1._sp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = k / 100._sp * (real(n, sp) + 1._sp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Mode-based estimate + ! Mode-based estimate case(6_i4) - kk = 1.0_sp+k/100._sp*(real(n,sp)-1._sp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 1.0_sp + k / 100._sp * (real(n, sp) - 1._sp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Median-based estimate + ! Median-based estimate case(7_i4) - kk = 1.0_sp/3.0_sp+k/100._sp*(real(n,sp)+1.0_sp/3.0_sp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 1.0_sp / 3.0_sp + k / 100._sp * (real(n, sp) + 1.0_sp / 3.0_sp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! Normal distribution estimate + ! Normal distribution estimate case(8_i4) - kk = 3.0_sp/8.0_sp+k/100._sp*(real(n,sp)+1.0_sp/4.0_sp) - nn1 = min(n, max(1_i4, floor(kk,kind=i4))) - nn2 = min(n, max(1_i4,ceiling(kk,kind=i4))) + kk = 3.0_sp / 8.0_sp + k / 100._sp * (real(n, sp) + 1.0_sp / 4.0_sp) + nn1 = min(n, max(1_i4, floor(kk, kind = i4))) + nn2 = min(n, max(1_i4, ceiling(kk, kind = i4))) - ! No valid mode + ! No valid mode case default - stop 'percentile_0d_sp: mode > 8 not implemented' + stop 'percentile_0d_sp: mode > 8 not implemented' end select if (present(mask)) then - allocate(arr(n)) - arr = pack(arrin,mask) - if (nn1 .eq. nn2) then - ! no interpolation - percentile_0d_sp = n_element(arr,nn1) - else - ! interpolation - ks2 = n_element(arr,nn2,previous=ks1) - percentile_0d_sp = ks1 + (ks2-ks1)*(kk-real(nn1,sp)) - end if - deallocate(arr) + allocate(arr(n)) + arr = pack(arrin, mask) + if (nn1 .eq. nn2) then + ! no interpolation + percentile_0d_sp = n_element(arr, nn1) + else + ! interpolation + ks2 = n_element(arr, nn2, previous = ks1) + percentile_0d_sp = ks1 + (ks2 - ks1) * (kk - real(nn1, sp)) + end if + deallocate(arr) else - if (nn1 .eq. nn2) then - ! no interpolation - percentile_0d_sp = n_element(arrin,nn1) - else - ! interpolation - ks2 = n_element(arrin,nn2,previous=ks1) - percentile_0d_sp = ks1 + (ks2-ks1)*(kk-real(nn1,sp)) - end if + if (nn1 .eq. nn2) then + ! no interpolation + percentile_0d_sp = n_element(arrin, nn1) + else + ! interpolation + ks2 = n_element(arrin, nn2, previous = ks1) + percentile_0d_sp = ks1 + (ks2 - ks1) * (kk - real(nn1, sp)) + end if end if END FUNCTION percentile_0d_sp - function percentile_1d_dp(arrin,k,mask,mode_in) + function percentile_1d_dp(arrin, k, mask, mode_in) IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: arrin - REAL(dp), DIMENSION(:), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in + REAL(dp), DIMENSION(:), INTENT(IN) :: arrin + REAL(dp), DIMENSION(:), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in - REAL(dp), DIMENSION(size(k)) :: percentile_1d_dp + REAL(dp), DIMENSION(size(k)) :: percentile_1d_dp - INTEGER(i4) :: i, n - INTEGER(i4) :: mode - INTEGER(i4), DIMENSION(size(k)) :: nn1, nn2 - REAL(dp), DIMENSION(size(k)) :: kk - REAL(dp) :: ks1, ks2 - REAL(dp), DIMENSION(:), ALLOCATABLE :: arr + INTEGER(i4) :: i, n + INTEGER(i4) :: mode + INTEGER(i4), DIMENSION(size(k)) :: nn1, nn2 + REAL(dp), DIMENSION(size(k)) :: kk + REAL(dp) :: ks1, ks2 + REAL(dp), DIMENSION(:), ALLOCATABLE :: arr if (present(mask)) then - n = count(mask) + n = count(mask) else - n = size(arrin) + n = size(arrin) end if if (present(mode_in)) then - mode = mode_in + mode = mode_in else - ! Default : Inverse empirical CDF - mode = 1_i4 + ! Default : Inverse empirical CDF + mode = 1_i4 end if ! check consistency @@ -763,119 +763,119 @@ function percentile_1d_dp(arrin,k,mask,mode_in) if (n < 2) stop 'percentile_1d_dp: n < 2' select case (mode) - ! Inverse empirical CDF: Mathematica default + ! Inverse empirical CDF: Mathematica default case(1_i4) - kk(:) = k(:)/100._dp*real(n,dp) - nn1(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) - nn2 = nn1 + kk(:) = k(:) / 100._dp * real(n, dp) + nn1(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) + nn2 = nn1 - ! Linear interpolation (California method) + ! Linear interpolation (California method) case(2_i4) - kk(:) = k(:)/100._dp*real(n,dp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = k(:) / 100._dp * real(n, dp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Element numbered closest + ! Element numbered closest case(3_i4) - kk(:) = 0.5_dp+k(:)/100._dp*real(n,dp) - nn1(:) = min(n, max(1_i4,floor(kk(:),kind=i4))) - nn2 = nn1 + kk(:) = 0.5_dp + k(:) / 100._dp * real(n, dp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2 = nn1 - ! Linear interpolation (hydrologist method) + ! Linear interpolation (hydrologist method) case(4_i4) - kk(:) = 0.5_dp+k(:)/100._dp*(real(n,dp)) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 0.5_dp + k(:) / 100._dp * (real(n, dp)) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Mean-based estimate (Weibull method): IMSL default + ! Mean-based estimate (Weibull method): IMSL default case(5_i4) - kk(:) = k(:)/100._dp*(real(n,dp)+1._dp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = k(:) / 100._dp * (real(n, dp) + 1._dp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Mode-based estimate + ! Mode-based estimate case(6_i4) - kk(:) = 1.0_dp+k(:)/100._dp*(real(n,dp)-1._dp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 1.0_dp + k(:) / 100._dp * (real(n, dp) - 1._dp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Median-based estimate + ! Median-based estimate case(7_i4) - kk(:) = 1.0_dp/3.0_dp+k(:)/100._dp*(real(n,dp)+1.0_dp/3.0_dp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 1.0_dp / 3.0_dp + k(:) / 100._dp * (real(n, dp) + 1.0_dp / 3.0_dp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Normal distribution estimate + ! Normal distribution estimate case(8_i4) - kk(:) = 3.0_dp/8.0_dp+k(:)/100._dp*(real(n,dp)+1.0_dp/4.0_dp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 3.0_dp / 8.0_dp + k(:) / 100._dp * (real(n, dp) + 1.0_dp / 4.0_dp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! No valid mode + ! No valid mode case default - stop 'percentile_1d_dp: mode > 8 not implemented' + stop 'percentile_1d_dp: mode > 8 not implemented' end select if (present(mask)) then - allocate(arr(n)) - arr = pack(arrin,mask) - do i=1, size(k) - if (nn1(i) .eq. nn2(i)) then - ! no interpolation - percentile_1d_dp(i) = n_element(arr,nn1(i)) - else - ! interpolation - ks2 = n_element(arr,nn2(i),previous=ks1) - percentile_1d_dp(i) = ks1 + (ks2-ks1)*(kk(i)-real(nn1(i),dp)) - end if - end do - deallocate(arr) + allocate(arr(n)) + arr = pack(arrin, mask) + do i = 1, size(k) + if (nn1(i) .eq. nn2(i)) then + ! no interpolation + percentile_1d_dp(i) = n_element(arr, nn1(i)) + else + ! interpolation + ks2 = n_element(arr, nn2(i), previous = ks1) + percentile_1d_dp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), dp)) + end if + end do + deallocate(arr) else - do i=1, size(k) - if (nn1(i) .eq. nn2(i)) then - ! no interpolation - percentile_1d_dp(i) = n_element(arrin,nn1(i)) - else - ! interpolation - ks2 = n_element(arrin,nn2(i),previous=ks1) - percentile_1d_dp(i) = ks1 + (ks2-ks1)*(kk(i)-real(nn1(i),dp)) - end if - end do + do i = 1, size(k) + if (nn1(i) .eq. nn2(i)) then + ! no interpolation + percentile_1d_dp(i) = n_element(arrin, nn1(i)) + else + ! interpolation + ks2 = n_element(arrin, nn2(i), previous = ks1) + percentile_1d_dp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), dp)) + end if + end do end if END function percentile_1d_dp - function percentile_1d_sp(arrin,k,mask,mode_in) + function percentile_1d_sp(arrin, k, mask, mode_in) IMPLICIT NONE - REAL(sp), DIMENSION(:), INTENT(IN) :: arrin - REAL(sp), DIMENSION(:), INTENT(IN) :: k - LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask - INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in + REAL(sp), DIMENSION(:), INTENT(IN) :: arrin + REAL(sp), DIMENSION(:), INTENT(IN) :: k + LOGICAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: mask + INTEGER(i4), OPTIONAL, INTENT(IN) :: mode_in - REAL(sp), DIMENSION(size(k)) :: percentile_1d_sp + REAL(sp), DIMENSION(size(k)) :: percentile_1d_sp - INTEGER(i4) :: i, n - INTEGER(i4) :: mode - INTEGER(i4), DIMENSION(size(k)) :: nn1, nn2 - REAL(sp), DIMENSION(size(k)) :: kk - REAL(sp) :: ks1, ks2 - REAL(sp), DIMENSION(:), ALLOCATABLE :: arr + INTEGER(i4) :: i, n + INTEGER(i4) :: mode + INTEGER(i4), DIMENSION(size(k)) :: nn1, nn2 + REAL(sp), DIMENSION(size(k)) :: kk + REAL(sp) :: ks1, ks2 + REAL(sp), DIMENSION(:), ALLOCATABLE :: arr if (present(mask)) then - n = count(mask) + n = count(mask) else - n = size(arrin) + n = size(arrin) end if if (present(mode_in)) then - mode = mode_in + mode = mode_in else - ! Default : Inverse empirical CDF - mode = 1_i4 + ! Default : Inverse empirical CDF + mode = 1_i4 end if ! check consistency @@ -883,85 +883,85 @@ function percentile_1d_sp(arrin,k,mask,mode_in) if (n < 2) stop 'percentile_1d_sp: n < 2' select case (mode) - ! Inverse empirical CDF: Mathematica default + ! Inverse empirical CDF: Mathematica default case(1_i4) - kk(:) = k(:)/100._sp*real(n,sp) - nn1(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) - nn2 = nn1 + kk(:) = k(:) / 100._sp * real(n, sp) + nn1(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) + nn2 = nn1 - ! Linear interpolation (California method) + ! Linear interpolation (California method) case(2_i4) - kk(:) = k(:)/100._sp*real(n,sp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = k(:) / 100._sp * real(n, sp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Element numbered closest + ! Element numbered closest case(3_i4) - kk(:) = 0.5_sp+k(:)/100._sp*real(n,sp) - nn1(:) = min(n, max(1_i4,floor(kk(:),kind=i4))) - nn2 = nn1 + kk(:) = 0.5_sp + k(:) / 100._sp * real(n, sp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2 = nn1 - ! Linear interpolation (hydrologist method) + ! Linear interpolation (hydrologist method) case(4_i4) - kk(:) = 0.5_sp+k(:)/100._sp*(real(n,sp)) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 0.5_sp + k(:) / 100._sp * (real(n, sp)) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Mean-based estimate (Weibull method): IMSL default + ! Mean-based estimate (Weibull method): IMSL default case(5_i4) - kk(:) = k(:)/100._sp*(real(n,sp)+1._sp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = k(:) / 100._sp * (real(n, sp) + 1._sp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Mode-based estimate + ! Mode-based estimate case(6_i4) - kk(:) = 1.0_sp+k(:)/100._sp*(real(n,sp)-1._sp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 1.0_sp + k(:) / 100._sp * (real(n, sp) - 1._sp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Median-based estimate + ! Median-based estimate case(7_i4) - kk(:) = 1.0_sp/3.0_sp+k(:)/100._sp*(real(n,sp)+1.0_sp/3.0_sp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 1.0_sp / 3.0_sp + k(:) / 100._sp * (real(n, sp) + 1.0_sp / 3.0_sp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! Normal distribution estimate + ! Normal distribution estimate case(8_i4) - kk(:) = 3.0_sp/8.0_sp+k(:)/100._sp*(real(n,sp)+1.0_sp/4.0_sp) - nn1(:) = min(n, max(1_i4, floor(kk(:),kind=i4))) - nn2(:) = min(n, max(1_i4,ceiling(kk(:),kind=i4))) + kk(:) = 3.0_sp / 8.0_sp + k(:) / 100._sp * (real(n, sp) + 1.0_sp / 4.0_sp) + nn1(:) = min(n, max(1_i4, floor(kk(:), kind = i4))) + nn2(:) = min(n, max(1_i4, ceiling(kk(:), kind = i4))) - ! No valid mode + ! No valid mode case default - stop 'percentile_1d_sp: mode > 8 not implemented' + stop 'percentile_1d_sp: mode > 8 not implemented' end select if (present(mask)) then - allocate(arr(n)) - arr = pack(arrin,mask) - do i=1, size(k) - if (nn1(i) .eq. nn2(i)) then - ! no interpolation - percentile_1d_sp(i) = n_element(arr,nn1(i)) - else - ! interpolation - ks2 = n_element(arr,nn2(i),previous=ks1) - percentile_1d_sp(i) = ks1 + (ks2-ks1)*(kk(i)-real(nn1(i),sp)) - end if - end do - deallocate(arr) + allocate(arr(n)) + arr = pack(arrin, mask) + do i = 1, size(k) + if (nn1(i) .eq. nn2(i)) then + ! no interpolation + percentile_1d_sp(i) = n_element(arr, nn1(i)) + else + ! interpolation + ks2 = n_element(arr, nn2(i), previous = ks1) + percentile_1d_sp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), sp)) + end if + end do + deallocate(arr) else - do i=1, size(k) - if (nn1(i) .eq. nn2(i)) then - ! no interpolation - percentile_1d_sp(i) = n_element(arrin,nn1(i)) - else - ! interpolation - ks2 = n_element(arrin,nn2(i),previous=ks1) - percentile_1d_sp(i) = ks1 + (ks2-ks1)*(kk(i)-real(nn1(i),sp)) - end if - end do + do i = 1, size(k) + if (nn1(i) .eq. nn2(i)) then + ! no interpolation + percentile_1d_sp(i) = n_element(arrin, nn1(i)) + else + ! interpolation + ks2 = n_element(arrin, nn2(i), previous = ks1) + percentile_1d_sp(i) = ks1 + (ks2 - ks1) * (kk(i) - real(nn1(i), sp)) + end if + end do end if END function percentile_1d_sp @@ -976,40 +976,40 @@ function qmedian_dp(dat) real(dp) :: qmedian_dp real(dp) :: w - integer(i4) :: n,k - integer(i4) :: l,r,i,j + integer(i4) :: n, k + integer(i4) :: l, r, i, j n = size(dat) - k = n/2 + 1 + k = n / 2 + 1 l = 1 r = n - do while( l < r ) - qmedian_dp = dat(k) - i = l - j = r - do - do while( dat(i) < qmedian_dp ) - i = i + 1 - enddo - do while( qmedian_dp < dat(j) ) - j = j - 1 - enddo - if ( i <= j ) then - w = dat(i) - dat(i) = dat(j) - dat(j) = w - i = i + 1 - j = j - 1 - end if - if ( i > j ) exit - enddo - if ( j < k ) l = i - if ( k < i ) r = j + do while(l < r) + qmedian_dp = dat(k) + i = l + j = r + do + do while(dat(i) < qmedian_dp) + i = i + 1 + enddo + do while(qmedian_dp < dat(j)) + j = j - 1 + enddo + if (i <= j) then + w = dat(i) + dat(i) = dat(j) + dat(j) = w + i = i + 1 + j = j - 1 + end if + if (i > j) exit + enddo + if (j < k) l = i + if (k < i) r = j enddo - if (mod(n,2) == 0) then - qmedian_dp = 0.5_dp*(dat(k) + maxval(dat(:k-1))) + if (mod(n, 2) == 0) then + qmedian_dp = 0.5_dp * (dat(k) + maxval(dat(: k - 1))) else - qmedian_dp = dat(k) + qmedian_dp = dat(k) end if end function qmedian_dp @@ -1023,40 +1023,40 @@ function qmedian_sp(dat) real(sp) :: qmedian_sp real(sp) :: w - integer(i4) :: n,k - integer(i4) :: l,r,i,j + integer(i4) :: n, k + integer(i4) :: l, r, i, j n = size(dat) - k = n/2 + 1 + k = n / 2 + 1 l = 1 r = n - do while( l < r ) - qmedian_sp = dat(k) - i = l - j = r - do - do while( dat(i) < qmedian_sp ) - i = i + 1 - enddo - do while( qmedian_sp < dat(j) ) - j = j - 1 - enddo - if ( i <= j ) then - w = dat(i) - dat(i) = dat(j) - dat(j) = w - i = i + 1 - j = j - 1 - end if - if ( i > j ) exit - enddo - if ( j < k ) l = i - if ( k < i ) r = j + do while(l < r) + qmedian_sp = dat(k) + i = l + j = r + do + do while(dat(i) < qmedian_sp) + i = i + 1 + enddo + do while(qmedian_sp < dat(j)) + j = j - 1 + enddo + if (i <= j) then + w = dat(i) + dat(i) = dat(j) + dat(j) = w + i = i + 1 + j = j - 1 + end if + if (i > j) exit + enddo + if (j < k) l = i + if (k < i) r = j enddo - if (mod(n,2) == 0) then - qmedian_sp = 0.5_sp*(dat(k) + maxval(dat(:k-1))) + if (mod(n, 2) == 0) then + qmedian_sp = 0.5_sp * (dat(k) + maxval(dat(: k - 1))) else - qmedian_sp = dat(k) + qmedian_sp = dat(k) end if end function qmedian_sp diff --git a/src/lib/mo_sce.f90 b/src/lib/mo_sce.f90 index 4c18d9f2..2354044c 100644 --- a/src/lib/mo_sce.f90 +++ b/src/lib/mo_sce.f90 @@ -216,1136 +216,1131 @@ MODULE mo_sce CONTAINS - function sce(functn,pini,prange, & ! IN - mymaxn,mymaxit,mykstop,mypcento,mypeps,myseed, & ! Optional IN - myngs,mynpg,mynps,mynspl,mymings,myiniflg,myprint, & ! Optional IN - mymask,myalpha, mybeta, & ! Optional IN - tmp_file, popul_file, & ! Optional IN - popul_file_append, & ! Optional IN - parallel, restart, restart_file, & ! OPTIONAL IN - bestf,neval,history & ! Optional OUT - ) result(bestx) - - use mo_kind, only: i4, i8, dp - use mo_orderpack, only: sort - use mo_string_utils, only: num2str, compress - use mo_xor4096, only: get_timeseed, n_save_state, xor4096, xor4096g + function sce(eval, functn, pini, prange, & ! IN + mymaxn, mymaxit, mykstop, mypcento, mypeps, myseed, & ! Optional IN + myngs, mynpg, mynps, mynspl, mymings, myiniflg, myprint, & ! Optional IN + mymask, myalpha, mybeta, & ! Optional IN + tmp_file, popul_file, & ! Optional IN + popul_file_append, & ! Optional IN + parallel, restart, restart_file, & ! OPTIONAL IN + bestf, neval, history & ! Optional OUT + ) result(bestx) + + use mo_kind, only : i4, i8, dp + use mo_orderpack, only : sort + use mo_string_utils, only : num2str, compress + use mo_xor4096, only : get_timeseed, n_save_state, xor4096, xor4096g !$ use omp_lib, only: OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS - use iso_fortran_env, only: output_unit, error_unit - use mo_utils, only: is_finite, special_value + use iso_fortran_env, only : output_unit, error_unit + use mo_utils, only : is_finite, special_value + use mo_optimization_utils, only : eval_interface, objective_interface implicit none ! - interface - function functn(paraset) - ! calculates the cost function at a certain parameter set paraset - use mo_kind, only: dp - real(dp), dimension(:), intent(in) :: paraset - real(dp) :: functn - end function functn - end interface - real(dp), dimension(:), intent(in) :: pini ! initial parameter set - real(dp), dimension(:,:), intent(in) :: prange ! lower and upper bound on parameters + procedure(eval_interface), INTENT(IN), POINTER :: eval + procedure(objective_interface), intent(in), pointer :: functn + real(dp), dimension(:), intent(in) :: pini ! initial parameter set + real(dp), dimension(:, :), intent(in) :: prange ! lower and upper bound on parameters ! ! algorithmic control & convergence parameter - integer(i8), optional, intent(in) :: mymaxn ! max no. of trials allowed before optimization is terminated + integer(i8), optional, intent(in) :: mymaxn ! max no. of trials allowed before optimization is terminated ! ! DEFAULT: 1000_i8 - logical, optional, intent(in) :: mymaxit ! maximization (.true.) or minimization (.false.) of function + logical, optional, intent(in) :: mymaxit ! maximization (.true.) or minimization (.false.) of function ! ! DEFAULT: false - integer(i4), optional, intent(in) :: mykstop ! number of shuffling loops in which the criterion value must + integer(i4), optional, intent(in) :: mykstop ! number of shuffling loops in which the criterion value must ! ! change by given percentage before optimiz. is terminated ! ! DEFAULT: 10_i4 - real(dp), optional, intent(in) :: mypcento ! percentage by which the criterion value must change in + real(dp), optional, intent(in) :: mypcento ! percentage by which the criterion value must change in ! ! given number of shuffling loops ! ! DEFAULT: 0.0001_dp - real(dp), optional, intent(in) :: mypeps ! optimization is terminated if volume of complex has + real(dp), optional, intent(in) :: mypeps ! optimization is terminated if volume of complex has ! ! converged to given percentage of feasible space ! ! DEFAULT: 0.001_dp - integer(i8), optional, intent(in) :: myseed ! initial random seed + integer(i8), optional, intent(in) :: myseed ! initial random seed ! ! DEFAULT: get_timeseed - integer(i4), optional, intent(in) :: myngs ! number of complexes in the initial population + integer(i4), optional, intent(in) :: myngs ! number of complexes in the initial population ! ! DEFAULT: 2_i4 - integer(i4), optional, intent(in) :: mynpg ! number of points in each complex + integer(i4), optional, intent(in) :: mynpg ! number of points in each complex ! ! DEFAULT: 2*n+1 - integer(i4), optional, intent(in) :: mynps ! number of points in a sub-complex + integer(i4), optional, intent(in) :: mynps ! number of points in a sub-complex ! ! DEFAULT: n+1 - integer(i4), optional, intent(in) :: mynspl ! number of evolution steps allowed for each complex before + integer(i4), optional, intent(in) :: mynspl ! number of evolution steps allowed for each complex before ! ! complex shuffling ! ! DEFAULT: 2*n+1 - integer(i4), optional, intent(in) :: mymings ! minimum number of complexes required, if the number of + integer(i4), optional, intent(in) :: mymings ! minimum number of complexes required, if the number of ! ! complexes is allowed to reduce as the ! ! optimization proceeds ! ! DEFAULT: ngs = number of complexes in initial population - integer(i4), optional, intent(in) :: myiniflg ! flag on whether to include the initial point in population + integer(i4), optional, intent(in) :: myiniflg ! flag on whether to include the initial point in population ! ! 0, not included ! ! 1, included (DEFAULT) - integer(i4), optional, intent(in) :: myprint ! flag for controlling print-out after each shuffling loop + integer(i4), optional, intent(in) :: myprint ! flag for controlling print-out after each shuffling loop ! ! 0, print information on the best point of the population ! ! 1, print information on every point of the population ! ! 2, no printing (DEFAULT) - logical, optional, intent(in), & - dimension(size(pini,1)) :: mymask ! parameter included in optimization (true) or discarded (false) + logical, optional, intent(in), & + dimension(size(pini, 1)) :: mymask ! parameter included in optimization (true) or discarded (false) ! ! DEFAULT: .true. - real(dp), optional, intent(in) :: myalpha ! parameter for reflection of points in complex + real(dp), optional, intent(in) :: myalpha ! parameter for reflection of points in complex ! ! DEFAULT: 0.8_dp - real(dp), optional, intent(in) :: mybeta ! parameter for contraction of points in complex + real(dp), optional, intent(in) :: mybeta ! parameter for contraction of points in complex ! ! DEFAULT: 0.45_dp - character(len=*), optional, intent(in) :: tmp_file ! file for temporal output: write results after evolution loop + character(len = *), optional, intent(in) :: tmp_file ! file for temporal output: write results after evolution loop ! ! # of headlines: 7 ! ! format: '# nloop icall ngs1 bestf worstf ... ! ! ... gnrng (bestx(j),j=1,nn)' - character(len=*), optional, intent(in) :: popul_file ! file for temporal output: writes whole population + character(len = *), optional, intent(in) :: popul_file ! file for temporal output: writes whole population ! ! # of headlines: 1 ! ! format: #_evolution_loop, xf(i), (x(i,j),j=1,nn) ! ! total number of lines written <= neval <= mymaxn - logical, optional, intent(in) :: popul_file_append ! if true, append to popul_file - logical, optional, intent(in) :: parallel ! sce runs in parallel (true) or not (false) + logical, optional, intent(in) :: popul_file_append ! if true, append to popul_file + logical, optional, intent(in) :: parallel ! sce runs in parallel (true) or not (false) ! ! parallel sce should only be used if model/ objective ! ! is not parallel ! ! DEAFULT: .false. - logical, optional, intent(in) :: restart ! if .true., start from restart file - character(len=*), optional, intent(in) :: restart_file ! restart file name (default: mo_sce.restart) - real(dp), optional, intent(out) :: bestf ! function value of bestx(.) - integer(i8), optional, intent(out) :: neval ! number of function evaluations - real(dp), optional, & - dimension(:), allocatable, intent(out) :: history ! history of best function values after each iteration - real(dp), dimension(size(pini,1)) :: bestx ! best point at current shuffling loop (is RETURN) + logical, optional, intent(in) :: restart ! if .true., start from restart file + character(len = *), optional, intent(in) :: restart_file ! restart file name (default: mo_sce.restart) + real(dp), optional, intent(out) :: bestf ! function value of bestx(.) + integer(i8), optional, intent(out) :: neval ! number of function evaluations + real(dp), optional, & + dimension(:), allocatable, intent(out) :: history ! history of best function values after each iteration + real(dp), dimension(size(pini, 1)) :: bestx ! best point at current shuffling loop (is RETURN) ! ! optionals transfer - real(dp), dimension(size(pini,1)) :: bl ! lower bound on parameters - real(dp), dimension(1000) :: dummy_bl ! dummy lower bound (only for namelist) - real(dp), dimension(size(pini,1)) :: bu ! upper bound on parameters - real(dp), dimension(1000) :: dummy_bu ! dummy upper bound (only for namelist) - integer(i8) :: maxn ! max no. of trials allowed before optimization is terminated - logical :: maxit ! minimization (false) or maximization (true) - integer(i4) :: kstop ! number of shuffling loops in which the criterion value + real(dp), dimension(size(pini, 1)) :: bl ! lower bound on parameters + real(dp), dimension(1000) :: dummy_bl ! dummy lower bound (only for namelist) + real(dp), dimension(size(pini, 1)) :: bu ! upper bound on parameters + real(dp), dimension(1000) :: dummy_bu ! dummy upper bound (only for namelist) + integer(i8) :: maxn ! max no. of trials allowed before optimization is terminated + logical :: maxit ! minimization (false) or maximization (true) + integer(i4) :: kstop ! number of shuffling loops in which the criterion value ! ! must change - real(dp) :: pcento ! percentage by which the criterion value must change - real(dp) :: peps ! optimization is terminated if volume of complex has + real(dp) :: pcento ! percentage by which the criterion value must change + real(dp) :: peps ! optimization is terminated if volume of complex has ! ! converged to given percentage of feasible space - integer(i4) :: ngs ! number of complexes in the initial population - integer(i4) :: npg ! number of points in each complex - integer(i4) :: nps ! number of points in a sub-complex - integer(i4) :: nspl ! number of evolution steps allowed for each complex before + integer(i4) :: ngs ! number of complexes in the initial population + integer(i4) :: npg ! number of points in each complex + integer(i4) :: nps ! number of points in a sub-complex + integer(i4) :: nspl ! number of evolution steps allowed for each complex before ! ! complex shuffling - integer(i4) :: mings ! minimum number of complexes required - integer(i4) :: iniflg ! flag on whether to include the initial point in population - integer(i4) :: iprint ! flag for controlling print-out after each shuffling loop - logical :: idot ! controls progress report . - logical, dimension(size(pini,1)) :: maskpara ! mask(i) = .true. --> parameter i will be optimized + integer(i4) :: mings ! minimum number of complexes required + integer(i4) :: iniflg ! flag on whether to include the initial point in population + integer(i4) :: iprint ! flag for controlling print-out after each shuffling loop + logical :: idot ! controls progress report . + logical, dimension(size(pini, 1)) :: maskpara ! mask(i) = .true. --> parameter i will be optimized ! ! mask(i) = .false. --> parameter i will not be optimized - logical, dimension(1000) :: dummy_maskpara ! dummy maskpara (only for namelist) - real(dp) :: alpha ! parameter for reflection of points in complex - real(dp) :: beta ! parameter for contraction of points in complex - logical :: itmp_file ! if temporal results wanted + logical, dimension(1000) :: dummy_maskpara ! dummy maskpara (only for namelist) + real(dp) :: alpha ! parameter for reflection of points in complex + real(dp) :: beta ! parameter for contraction of points in complex + logical :: itmp_file ! if temporal results wanted #ifdef pgiFortran - character(len=299) :: istmp_file ! local copy of file for temporal results output + character(len = 299) :: istmp_file ! local copy of file for temporal results output #else - character(len=1024) :: istmp_file ! local copy of file for temporal results output + character(len = 1024) :: istmp_file ! local copy of file for temporal results output #endif - logical :: ipopul_file ! if temporal population wanted + logical :: ipopul_file ! if temporal population wanted #ifdef pgiFortran - character(len=299) :: ispopul_file ! local copy of file for temporal population output + character(len = 299) :: ispopul_file ! local copy of file for temporal population output #else - character(len=1024) :: ispopul_file ! local copy of file for temporal population output + character(len = 1024) :: ispopul_file ! local copy of file for temporal population output #endif - real(dp), dimension(:), allocatable :: history_tmp ! history of best function values after each iteration - real(dp), dimension(:), allocatable :: ihistory_tmp ! local history for OpenMP - real(dp) :: bestf_tmp ! function value of bestx(.) - logical :: parall ! if sce is used parallel or not - logical :: irestart ! if restart wanted - character(len=1024) :: isrestart_file ! local copy of restart file name + real(dp), dimension(:), allocatable :: history_tmp ! history of best function values after each iteration + real(dp), dimension(:), allocatable :: ihistory_tmp ! local history for OpenMP + real(dp) :: bestf_tmp ! function value of bestx(.) + logical :: parall ! if sce is used parallel or not + logical :: irestart ! if restart wanted + character(len = 1024) :: isrestart_file ! local copy of restart file name ! ! local variables - integer(i4) :: nopt ! number of parameters to be optimized - integer(i4) :: nn ! total number of parameters - integer(i4) :: npt ! total number of points in initial population (npt=ngs*npg) - real(dp) :: fpini ! function value at initial point - real(dp), dimension(:,:), allocatable :: x ! coordinates of points in the population - real(dp), dimension(:), allocatable :: xf ! function values of x - real(dp), dimension(size(pini,1)) :: xx ! coordinates of a single point in x - real(dp), dimension(1000) :: dummy_xx ! dummy xx (only for namelist) - real(dp), dimension(:,:), allocatable :: cx ! coordinates of points in a complex - real(dp), dimension(:), allocatable :: cf ! function values of cx - real(dp), dimension(:,:), allocatable :: s ! coordinates of points in the current sub-complex !simplex - real(dp), dimension(:), allocatable :: sf ! function values of s - real(dp), dimension(:), allocatable :: worstx ! worst point at current shuffling loop - real(dp) :: worstf ! function value of worstx(.) - real(dp), dimension(:), allocatable :: xnstd ! standard deviation of parameters in the population - real(dp) :: gnrng ! normalized geometric mean of parameter ranges - integer(i4), dimension(:), allocatable :: lcs ! indices locating position of s(.,.) in x(.,.) - real(dp), dimension(:), allocatable :: bound ! length of range of ith variable being optimized - real(dp), dimension(:), allocatable :: unit ! standard deviation of initial parameter distributions - integer(i4) :: ngs1 ! number of complexes in current population - integer(i4) :: ngs2 ! number of complexes in last population - real(dp), dimension(:), allocatable :: criter ! vector containing the best criterion values of the last + integer(i4) :: nopt ! number of parameters to be optimized + integer(i4) :: nn ! total number of parameters + integer(i4) :: npt ! total number of points in initial population (npt=ngs*npg) + real(dp) :: fpini ! function value at initial point + real(dp), dimension(:, :), allocatable :: x ! coordinates of points in the population + real(dp), dimension(:), allocatable :: xf ! function values of x + real(dp), dimension(size(pini, 1)) :: xx ! coordinates of a single point in x + real(dp), dimension(1000) :: dummy_xx ! dummy xx (only for namelist) + real(dp), dimension(:, :), allocatable :: cx ! coordinates of points in a complex + real(dp), dimension(:), allocatable :: cf ! function values of cx + real(dp), dimension(:, :), allocatable :: s ! coordinates of points in the current sub-complex !simplex + real(dp), dimension(:), allocatable :: sf ! function values of s + real(dp), dimension(:), allocatable :: worstx ! worst point at current shuffling loop + real(dp) :: worstf ! function value of worstx(.) + real(dp), dimension(:), allocatable :: xnstd ! standard deviation of parameters in the population + real(dp) :: gnrng ! normalized geometric mean of parameter ranges + integer(i4), dimension(:), allocatable :: lcs ! indices locating position of s(.,.) in x(.,.) + real(dp), dimension(:), allocatable :: bound ! length of range of ith variable being optimized + real(dp), dimension(:), allocatable :: unit ! standard deviation of initial parameter distributions + integer(i4) :: ngs1 ! number of complexes in current population + integer(i4) :: ngs2 ! number of complexes in last population + real(dp), dimension(:), allocatable :: criter ! vector containing the best criterion values of the last ! ! (kstop+1) shuffling loops - integer(i4) :: ipcnvg ! flag indicating whether parameter convergence is reached + integer(i4) :: ipcnvg ! flag indicating whether parameter convergence is reached ! ! (i.e., check if gnrng is less than 0.001) ! ! 0, parameter convergence not satisfied ! ! 1, parameter convergence satisfied - integer(i4) :: nloop - integer(i4) :: loop - integer(i4) :: ii, jj, kk - integer(i4) :: lpos - logical :: lpos_ok ! for selction of points based on triangular + integer(i4) :: nloop + integer(i4) :: loop + integer(i4) :: ii, jj, kk + integer(i4) :: lpos + logical :: lpos_ok ! for selction of points based on triangular ! ! probability distribution - integer(i4) :: npt1 - integer(i8) :: icall ! counter for function evaluations - integer(i8) :: icall_merk, iicall ! local icall for OpenMP - integer(i4) :: igs - integer(i4) :: k1, k2 - real(dp) :: denomi ! for checking improvement of last steps - real(dp) :: timeou ! for checking improvement of last steps - character(4), dimension(:), allocatable :: xname ! parameter names: "p1", "p2", "p3", ... - character(512) :: format_str1 ! format string - character(512) :: format_str2 ! format string - ! for random numbers - real(dp) :: rand ! random number - integer(i8), dimension(:), allocatable :: iseed ! initial random seed - integer(i8), dimension(:,:), allocatable :: save_state_unif ! save state of uniform stream - integer(i8), dimension(:,:), allocatable :: save_state_gauss ! save state of gaussian stream - real(dp), dimension(:), allocatable :: rand_tmp ! random number - integer(i4) :: ithread, n_threads ! OMP or not - integer(i8), dimension(n_save_state) :: itmp - real(dp), dimension(:,:), allocatable :: xtmp ! tmp array for complex reduction - real(dp), dimension(:), allocatable :: ftmp ! % - real(dp) :: large ! for treating NaNs - logical :: ipopul_file_append - integer(i4) :: nonan ! # of non-NaN in history_tmp - real(dp), dimension(:), allocatable :: htmp ! tmp storage for history_tmp + integer(i4) :: npt1 + integer(i8) :: icall ! counter for function evaluations + integer(i8) :: icall_merk, iicall ! local icall for OpenMP + integer(i4) :: igs + integer(i4) :: k1, k2 + real(dp) :: denomi ! for checking improvement of last steps + real(dp) :: timeou ! for checking improvement of last steps + character(4), dimension(:), allocatable :: xname ! parameter names: "p1", "p2", "p3", ... + character(512) :: format_str1 ! format string + character(512) :: format_str2 ! format string + ! for random numbers + real(dp) :: rand ! random number + integer(i8), dimension(:), allocatable :: iseed ! initial random seed + integer(i8), dimension(:, :), allocatable :: save_state_unif ! save state of uniform stream + integer(i8), dimension(:, :), allocatable :: save_state_gauss ! save state of gaussian stream + real(dp), dimension(:), allocatable :: rand_tmp ! random number + integer(i4) :: ithread, n_threads ! OMP or not + integer(i8), dimension(n_save_state) :: itmp + real(dp), dimension(:, :), allocatable :: xtmp ! tmp array for complex reduction + real(dp), dimension(:), allocatable :: ftmp ! % + real(dp) :: large ! for treating NaNs + logical :: ipopul_file_append + integer(i4) :: nonan ! # of non-NaN in history_tmp + real(dp), dimension(:), allocatable :: htmp ! tmp storage for history_tmp namelist /restartnml1/ & - bestx, dummy_bl, dummy_bu, maxn, maxit, kstop, pcento, peps, ngs, npg, nps, nspl, & - mings, iniflg, iprint, idot, dummy_maskpara, alpha, beta, bestf_tmp, & - parall, nopt, nn, npt, fpini, dummy_xx, worstf, gnrng, & - ngs1, ngs2, nloop, npt1, icall, & - n_threads, ipopul_file_append, itmp_file, istmp_file, & - ipopul_file, ispopul_file + bestx, dummy_bl, dummy_bu, maxn, maxit, kstop, pcento, peps, ngs, npg, nps, nspl, & + mings, iniflg, iprint, idot, dummy_maskpara, alpha, beta, bestf_tmp, & + parall, nopt, nn, npt, fpini, dummy_xx, worstf, gnrng, & + ngs1, ngs2, nloop, npt1, icall, & + n_threads, ipopul_file_append, itmp_file, istmp_file, & + ipopul_file, ispopul_file namelist /restartnml2/ & - history_tmp, x, xf, worstx, xnstd, & - bound, unit, criter, xname, iseed, save_state_unif, & - save_state_gauss + history_tmp, x, xf, worstx, xnstd, & + bound, unit, criter, xname, iseed, save_state_unif, & + save_state_gauss if (present(restart)) then - irestart = restart + irestart = restart else - irestart = .false. + irestart = .false. end if if (present(restart_file)) then - isrestart_file = restart_file + isrestart_file = restart_file else - isrestart_file = 'mo_sce.restart' + isrestart_file = 'mo_sce.restart' end if if (.not. irestart) then - if (present(parallel)) then - parall = parallel - else - parall = .false. - end if - - if (parall) then - ! OpenMP or not - n_threads = 1 - !$ write(output_unit,*) '--------------------------------------------------' - !$OMP parallel - !$ n_threads = OMP_GET_NUM_THREADS() - !$OMP end parallel - !$ write(output_unit,*) ' SCE is parellel with ',n_threads,' threads' - !$ write(output_unit,*) '--------------------------------------------------' - else - n_threads = 1 - end if - - ! One random number chain per OpenMP thread - allocate(rand_tmp(n_threads)) - allocate(iseed(n_threads)) - allocate(save_state_unif(n_threads,n_save_state)) - allocate(save_state_gauss(n_threads,n_save_state)) - - if (present(mymask)) then - if (.not. any(mymask)) stop 'mo_sce: all parameters are masked --> none will be optimized' - maskpara = mymask - else - maskpara = .true. - end if - - ! number of parameters to optimize - nopt = count(maskpara,dim=1) - ! total number of parameters - nn = size(pini,1) - - ! input checking - if (size(prange,dim=1) .ne. size(pini,1)) then - stop 'mo_sce: prange has not matching rows' - end if - if (size(prange,dim=2) .ne. 2) then - stop 'mo_sce: two colums expected for prange' - end if - bl(:) = prange(:,1) - bu(:) = prange(:,2) - do ii=1, nn - if( ((bu(ii)-bl(ii)) .lt. tiny(1.0_dp) ) .and. maskpara(ii) ) then - write(error_unit,*) 'para #',ii,' :: range = ( ',bl(ii),' , ',bu(ii),' )' - stop 'mo_sce: inconsistent or too small parameter range' - end if - end do - - ! - ! optionals checking - if (present(mymaxn)) then - if (mymaxn .lt. 2_i4) stop 'mo_sce: maxn has to be at least 2' - maxn = mymaxn - else - maxn = 1000_i8 - end if - if (present(mymaxit)) then - maxit = mymaxit - else - maxit = .false. - end if - if (present(mykstop)) then - if (mykstop .lt. 1_i4) stop 'mo_sce: kstop has to be at least 1' - kstop = mykstop - else - kstop = 10_i4 - end if - if (present(mypcento)) then - if (mypcento .lt. 0_dp) stop 'mo_sce: pcento should be positive' - pcento = mypcento - else - pcento = 0.0001_dp - end if - if (present(mypeps)) then - if (mypeps .lt. 0_dp) stop 'mo_sce: peps should be positive' - peps = mypeps - else - peps = 0.001_dp - end if - if (present(myseed)) then - if (myseed .lt. 1_i8) stop 'mo_sce: seed should be non-negative' - forall(ii=1:n_threads) iseed(ii) = myseed + (ii-1)*1000_i8 - else - call get_timeseed(iseed) - end if - if (present(myngs)) then - if (myngs .lt. 1_i4) stop 'mo_sce: ngs has to be at least 1' - ngs = myngs - else - ngs = 2_i4 - end if - if (present(mynpg)) then - if (mynpg .lt. 3_i4) stop 'mo_sce: npg has to be at least 3' - npg = mynpg - else - npg = 2*nopt + 1 - end if - if (present(mynps)) then - if (mynps .lt. 2_i4) stop 'mo_sce: nps has to be at least 2' - nps = mynps - else - nps = nopt + 1_i4 - end if - if (present(mynspl)) then - if (mynspl .lt. 3_i4) stop 'mo_sce: nspl has to be at least 3' - nspl = mynspl - else - nspl = 2*nopt + 1 - end if - if (present(mymings)) then - if (mymings .lt. 1_i4) stop 'mo_sce: mings has to be at least 1' - mings = mymings - else - mings = ngs ! no reduction of complexes - end if - if (present(myiniflg)) then - if ( (myiniflg .ne. 1_i4) .and. (myiniflg .ne. 0_i4)) stop 'mo_sce: iniflg has to be 0 or 1' - iniflg = myiniflg - else - iniflg = 1_i4 - end if - idot = .false. - if (present(myprint)) then - if ( (myprint .lt. 0_i4) .or. (myprint .gt. 4_i4)) stop 'mo_sce: iprint has to be between 0 and 4' - if (myprint > 2_i4) then - iprint = myprint-3 - idot = .true. - else - iprint = myprint - end if - else - iprint = 2_i4 ! no printing - iprint = 0_i4 - end if - if (present(myalpha)) then - alpha = myalpha - else - alpha = 0.8_dp - end if - if (present(mybeta)) then - beta = mybeta - else - beta = 0.45_dp - end if - - if (present(popul_file_append)) then - ipopul_file_append = popul_file_append - else - ipopul_file_append = .false. - end if - - if (present(tmp_file)) then - itmp_file = .true. - istmp_file = tmp_file - open(999, file=trim(adjustl(istmp_file)), action='write', status = 'unknown') - write(999,*) '# settings :: general' - write(999,*) '# nIterations seed' - write(999,*) maxn, iseed - write(999,*) '# settings :: sce specific' - write(999,*) '# sce_ngs sce_npg sce_nps' - write(999,*) ngs, npg, nps - write(999,*) '# nloop icall ngs1 bestf worstf gnrng (bestx(j),j=1,nn)' - close(999) - else - itmp_file = .false. - istmp_file = '' - end if - - if (present(popul_file)) then - ipopul_file = .true. - ispopul_file = popul_file - else - ipopul_file = .false. - ispopul_file = '' - end if - - if (ipopul_file .and. (.not. ipopul_file_append)) then - open(999, file=trim(adjustl(ispopul_file)), action='write', status = 'unknown') - write(999,*) '# xf(i) (x(i,j),j=1,nn)' - close(999) - end if - - ! allocation of arrays - allocate(x(ngs*npg,nn)) - allocate(xf(ngs*npg)) - allocate(worstx(nn)) - allocate(xnstd(nn)) - allocate(bound(nn)) - allocate(unit(nn)) - allocate(criter(kstop+1)) - allocate(xname(nn)) - allocate(history_tmp(maxn+3*ngs*nspl)) - allocate(xtmp(npg,nn)) - allocate(ftmp(npg)) - if (maxit) then - large = -0.5_dp*huge(1.0_dp) - else - large = 0.5_dp*huge(1.0_dp) - end if - history_tmp(:) = large - criter(:) = large - ! - ! initialize variables - do ii=1,nn - xname(ii) = compress('p'//num2str(ii,'(I3.3)')) - end do - - nloop = 0_i4 - loop = 0_i4 - igs = 0_i4 - ! - ! compute the total number of points in initial population - npt = ngs * npg - ngs1 = ngs - npt1 = npt - ! - if (iprint .lt. 2) then - write(output_unit,*) '==================================================' - write(output_unit,*) 'ENTER THE SHUFFLED COMPLEX EVOLUTION GLOBAL SEARCH' - write(output_unit,*) '==================================================' - end if - ! - ! Print seed - if (iprint .lt. 2) then - write (*,*) ' Seeds used : ',iseed - end if - ! initialize random number generator: Uniform - call xor4096(iseed, rand_tmp, save_state=save_state_unif) - ! initialize random number generator: Gaussian - iseed = iseed + 1000_i8 - call xor4096g(iseed, rand_tmp, save_state=save_state_gauss) - iseed = 0_i8 - ! - ! compute the bound for parameters being optimized - do ii = 1, nn - bound(ii) = bu(ii) - bl(ii) - unit(ii) = 1.0_dp - end do - - !-------------------------------------------------- - ! compute the function value of the initial point - !-------------------------------------------------- - ! function evaluation will be counted later... - if (idot) write(output_unit,'(A1)') '.' - if (.not. maxit) then - fpini = functn(pini) - history_tmp(1) = fpini - else - fpini = -functn(pini) - history_tmp(1) = -fpini - end if - - ! print the initial point and its criterion value - bestx = pini - bestf_tmp = fpini - if (iprint .lt. 2) then - write(output_unit,*) '' - write(output_unit,*) '' - write(output_unit,*) '*** PRINT THE INITIAL POINT AND ITS CRITERION VALUE ***' - call write_best_final() - end if - if (itmp_file) then ! initial tmp file - open(999, file=trim(adjustl(istmp_file)), action='write', position='append', recl=(nn+6)*30) + if (present(parallel)) then + parall = parallel + else + parall = .false. + end if + + if (parall) then + ! OpenMP or not + n_threads = 1 + !$ write(output_unit,*) '--------------------------------------------------' + !$OMP parallel + !$ n_threads = OMP_GET_NUM_THREADS() + !$OMP end parallel + !$ write(output_unit,*) ' SCE is parellel with ',n_threads,' threads' + !$ write(output_unit,*) '--------------------------------------------------' + else + n_threads = 1 + end if + + ! One random number chain per OpenMP thread + allocate(rand_tmp(n_threads)) + allocate(iseed(n_threads)) + allocate(save_state_unif(n_threads, n_save_state)) + allocate(save_state_gauss(n_threads, n_save_state)) + + if (present(mymask)) then + if (.not. any(mymask)) stop 'mo_sce: all parameters are masked --> none will be optimized' + maskpara = mymask + else + maskpara = .true. + end if + + ! number of parameters to optimize + nopt = count(maskpara, dim = 1) + ! total number of parameters + nn = size(pini, 1) + + ! input checking + if (size(prange, dim = 1) .ne. size(pini, 1)) then + stop 'mo_sce: prange has not matching rows' + end if + if (size(prange, dim = 2) .ne. 2) then + stop 'mo_sce: two colums expected for prange' + end if + bl(:) = prange(:, 1) + bu(:) = prange(:, 2) + do ii = 1, nn + if(((bu(ii) - bl(ii)) .lt. tiny(1.0_dp)) .and. maskpara(ii)) then + write(error_unit, *) 'para #', ii, ' :: range = ( ', bl(ii), ' , ', bu(ii), ' )' + stop 'mo_sce: inconsistent or too small parameter range' + end if + end do + + ! + ! optionals checking + if (present(mymaxn)) then + if (mymaxn .lt. 2_i4) stop 'mo_sce: maxn has to be at least 2' + maxn = mymaxn + else + maxn = 1000_i8 + end if + if (present(mymaxit)) then + maxit = mymaxit + else + maxit = .false. + end if + if (present(mykstop)) then + if (mykstop .lt. 1_i4) stop 'mo_sce: kstop has to be at least 1' + kstop = mykstop + else + kstop = 10_i4 + end if + if (present(mypcento)) then + if (mypcento .lt. 0_dp) stop 'mo_sce: pcento should be positive' + pcento = mypcento + else + pcento = 0.0001_dp + end if + if (present(mypeps)) then + if (mypeps .lt. 0_dp) stop 'mo_sce: peps should be positive' + peps = mypeps + else + peps = 0.001_dp + end if + if (present(myseed)) then + if (myseed .lt. 1_i8) stop 'mo_sce: seed should be non-negative' + forall(ii = 1 : n_threads) iseed(ii) = myseed + (ii - 1) * 1000_i8 + else + call get_timeseed(iseed) + end if + if (present(myngs)) then + if (myngs .lt. 1_i4) stop 'mo_sce: ngs has to be at least 1' + ngs = myngs + else + ngs = 2_i4 + end if + if (present(mynpg)) then + if (mynpg .lt. 3_i4) stop 'mo_sce: npg has to be at least 3' + npg = mynpg + else + npg = 2 * nopt + 1 + end if + if (present(mynps)) then + if (mynps .lt. 2_i4) stop 'mo_sce: nps has to be at least 2' + nps = mynps + else + nps = nopt + 1_i4 + end if + if (present(mynspl)) then + if (mynspl .lt. 3_i4) stop 'mo_sce: nspl has to be at least 3' + nspl = mynspl + else + nspl = 2 * nopt + 1 + end if + if (present(mymings)) then + if (mymings .lt. 1_i4) stop 'mo_sce: mings has to be at least 1' + mings = mymings + else + mings = ngs ! no reduction of complexes + end if + if (present(myiniflg)) then + if ((myiniflg .ne. 1_i4) .and. (myiniflg .ne. 0_i4)) stop 'mo_sce: iniflg has to be 0 or 1' + iniflg = myiniflg + else + iniflg = 1_i4 + end if + idot = .false. + if (present(myprint)) then + if ((myprint .lt. 0_i4) .or. (myprint .gt. 4_i4)) stop 'mo_sce: iprint has to be between 0 and 4' + if (myprint > 2_i4) then + iprint = myprint - 3 + idot = .true. + else + iprint = myprint + end if + else + iprint = 2_i4 ! no printing + iprint = 0_i4 + end if + if (present(myalpha)) then + alpha = myalpha + else + alpha = 0.8_dp + end if + if (present(mybeta)) then + beta = mybeta + else + beta = 0.45_dp + end if + + if (present(popul_file_append)) then + ipopul_file_append = popul_file_append + else + ipopul_file_append = .false. + end if + + if (present(tmp_file)) then + itmp_file = .true. + istmp_file = tmp_file + open(999, file = trim(adjustl(istmp_file)), action = 'write', status = 'unknown') + write(999, *) '# settings :: general' + write(999, *) '# nIterations seed' + write(999, *) maxn, iseed + write(999, *) '# settings :: sce specific' + write(999, *) '# sce_ngs sce_npg sce_nps' + write(999, *) ngs, npg, nps + write(999, *) '# nloop icall ngs1 bestf worstf gnrng (bestx(j),j=1,nn)' + close(999) + else + itmp_file = .false. + istmp_file = '' + end if + + if (present(popul_file)) then + ipopul_file = .true. + ispopul_file = popul_file + else + ipopul_file = .false. + ispopul_file = '' + end if + + if (ipopul_file .and. (.not. ipopul_file_append)) then + open(999, file = trim(adjustl(ispopul_file)), action = 'write', status = 'unknown') + write(999, *) '# xf(i) (x(i,j),j=1,nn)' + close(999) + end if + + ! allocation of arrays + allocate(x(ngs * npg, nn)) + allocate(xf(ngs * npg)) + allocate(worstx(nn)) + allocate(xnstd(nn)) + allocate(bound(nn)) + allocate(unit(nn)) + allocate(criter(kstop + 1)) + allocate(xname(nn)) + allocate(history_tmp(maxn + 3 * ngs * nspl)) + allocate(xtmp(npg, nn)) + allocate(ftmp(npg)) + if (maxit) then + large = -0.5_dp * huge(1.0_dp) + else + large = 0.5_dp * huge(1.0_dp) + end if + history_tmp(:) = large + criter(:) = large + ! + ! initialize variables + do ii = 1, nn + xname(ii) = compress('p' // num2str(ii, '(I3.3)')) + end do + + nloop = 0_i4 + loop = 0_i4 + igs = 0_i4 + ! + ! compute the total number of points in initial population + npt = ngs * npg + ngs1 = ngs + npt1 = npt + ! + if (iprint .lt. 2) then + write(output_unit, *) '==================================================' + write(output_unit, *) 'ENTER THE SHUFFLED COMPLEX EVOLUTION GLOBAL SEARCH' + write(output_unit, *) '==================================================' + end if + ! + ! Print seed + if (iprint .lt. 2) then + write (*, *) ' Seeds used : ', iseed + end if + ! initialize random number generator: Uniform + call xor4096(iseed, rand_tmp, save_state = save_state_unif) + ! initialize random number generator: Gaussian + iseed = iseed + 1000_i8 + call xor4096g(iseed, rand_tmp, save_state = save_state_gauss) + iseed = 0_i8 + ! + ! compute the bound for parameters being optimized + do ii = 1, nn + bound(ii) = bu(ii) - bl(ii) + unit(ii) = 1.0_dp + end do + + !-------------------------------------------------- + ! compute the function value of the initial point + !-------------------------------------------------- + ! function evaluation will be counted later... + if (idot) write(output_unit, '(A1)') '.' + if (.not. maxit) then + fpini = functn(pini, eval) + history_tmp(1) = fpini + else + fpini = -functn(pini, eval) + history_tmp(1) = -fpini + end if + + ! print the initial point and its criterion value + bestx = pini + bestf_tmp = fpini + if (iprint .lt. 2) then + write(output_unit, *) '' + write(output_unit, *) '' + write(output_unit, *) '*** PRINT THE INITIAL POINT AND ITS CRITERION VALUE ***' + call write_best_final() + end if + if (itmp_file) then ! initial tmp file + open(999, file = trim(adjustl(istmp_file)), action = 'write', position = 'append', recl = (nn + 6) * 30) + if (.not. maxit) then + write(999, *) 0, 1, ngs1, fpini, fpini, 1.0_dp, pini + else + write(999, *) 0, 1, ngs1, -fpini, -fpini, 1.0_dp, pini + end if + close(999) + end if + ! + ! generate an initial set of npt1 points in the parameter space + ! if iniflg is equal to 1, set x(1,.) to initial point pini(.) + if (iniflg .eq. 1) then + do ii = 1, nn + x(1, ii) = pini(ii) + end do + xf(1) = fpini + ! + ! else, generate a point randomly and set it equal to x(1,.) + else + itmp = save_state_unif(1, :) + call getpnt(1, bl(1 : nn), bu(1 : nn), unit(1 : nn), pini(1 : nn), maskpara, itmp, xx) + save_state_unif(1, :) = itmp + do ii = 1, nn + x(1, ii) = xx(ii) + end do + if (idot) write(output_unit, '(A1)') '.' + if (.not. maxit) then + xf(1) = functn(xx, eval) + else + xf(1) = -functn(xx, eval) + end if + end if + ! + ! count function evaluation of the first point + icall = 1_i8 + ! if (icall .ge. maxn) return + ! + if (parall) then + + ! ----------------------------------------------------------------------- + ! Parallel version of complex-loop + ! ----------------------------------------------------------------------- + ! generate npt1-1 random points distributed uniformly in the parameter + ! space, and compute the corresponding function values + ithread = 1 + !$OMP parallel default(shared) private(ii,jj,ithread,xx) + !$OMP do + do ii = 2, npt1 + !$ ithread = OMP_GET_THREAD_NUM() + 1 + itmp = save_state_unif(ithread, :) + call getpnt(1, bl(1 : nn), bu(1 : nn), unit(1 : nn), pini(1 : nn), maskpara, itmp, xx) + save_state_unif(ithread, :) = itmp + do jj = 1, nn + x(ii, jj) = xx(jj) + end do + if (idot) write(output_unit, '(A1)') '.' if (.not. maxit) then - write(999,*) 0,1,ngs1,fpini,fpini,1.0_dp, pini + xf(ii) = functn(xx, eval) + history_tmp(ii) = xf(ii) ! min(history_tmp(ii-1),xf(ii)) --> will be sorted later else - write(999,*) 0,1,ngs1,-fpini,-fpini,1.0_dp, pini + xf(ii) = -functn(xx, eval) + history_tmp(ii) = -xf(ii) ! max(history_tmp(ii-1),-xf(ii)) --> will be sorted later end if - close(999) - end if - ! - ! generate an initial set of npt1 points in the parameter space - ! if iniflg is equal to 1, set x(1,.) to initial point pini(.) - if (iniflg .eq. 1) then - do ii = 1, nn - x(1,ii) = pini(ii) - end do - xf(1) = fpini - ! - ! else, generate a point randomly and set it equal to x(1,.) - else - itmp = save_state_unif(1,:) - call getpnt(1,bl(1:nn),bu(1:nn),unit(1:nn),pini(1:nn),maskpara,itmp,xx) - save_state_unif(1,:) = itmp - do ii=1, nn - x(1,ii) = xx(ii) + end do + !$OMP end do + !$OMP end parallel + + else + + ! ----------------------------------------------------------------------- + ! Non-Parallel version of complex-loop + ! ----------------------------------------------------------------------- + ! generate npt1-1 random points distributed uniformly in the parameter + ! space, and compute the corresponding function values + ithread = 1 + + do ii = 2, npt1 + call getpnt(1, bl(1 : nn), bu(1 : nn), unit(1 : nn), pini(1 : nn), maskpara, save_state_unif(ithread, :), xx) + do jj = 1, nn + x(ii, jj) = xx(jj) end do - if (idot) write(output_unit,'(A1)') '.' + if (idot) write(output_unit, '(A1)') '.' if (.not. maxit) then - xf(1) = functn(xx) + xf(ii) = functn(xx, eval) + icall = icall + 1_i8 + history_tmp(icall) = xf(ii) ! min(history_tmp(icall-1),xf(ii)) --> will be sorted later else - xf(1) = -functn(xx) + xf(ii) = -functn(xx, eval) + icall = icall + 1_i8 + history_tmp(icall) = -xf(ii) ! max(history_tmp(icall-1),-xf(ii)) --> will be sorted later end if - end if - ! - ! count function evaluation of the first point - icall = 1_i8 - ! if (icall .ge. maxn) return - ! - if (parall) then - - ! ----------------------------------------------------------------------- - ! Parallel version of complex-loop - ! ----------------------------------------------------------------------- - ! generate npt1-1 random points distributed uniformly in the parameter - ! space, and compute the corresponding function values - ithread = 1 - !$OMP parallel default(shared) private(ii,jj,ithread,xx) - !$OMP do - do ii = 2, npt1 - !$ ithread = OMP_GET_THREAD_NUM() + 1 - itmp = save_state_unif(ithread,:) - call getpnt(1,bl(1:nn),bu(1:nn),unit(1:nn),pini(1:nn),maskpara,itmp,xx) - save_state_unif(ithread,:) = itmp - do jj = 1, nn - x(ii,jj) = xx(jj) - end do - if (idot) write(output_unit,'(A1)') '.' - if (.not. maxit) then - xf(ii) = functn(xx) - history_tmp(ii) = xf(ii) ! min(history_tmp(ii-1),xf(ii)) --> will be sorted later - else - xf(ii) = -functn(xx) - history_tmp(ii) = -xf(ii) ! max(history_tmp(ii-1),-xf(ii)) --> will be sorted later - end if - end do - !$OMP end do - !$OMP end parallel - - else - - ! ----------------------------------------------------------------------- - ! Non-Parallel version of complex-loop - ! ----------------------------------------------------------------------- - ! generate npt1-1 random points distributed uniformly in the parameter - ! space, and compute the corresponding function values - ithread = 1 - - do ii = 2, npt1 - call getpnt(1,bl(1:nn),bu(1:nn),unit(1:nn),pini(1:nn),maskpara,save_state_unif(ithread,:),xx) - do jj = 1, nn - x(ii,jj) = xx(jj) - end do - if (idot) write(output_unit,'(A1)') '.' - if (.not. maxit) then - xf(ii) = functn(xx) - icall = icall + 1_i8 - history_tmp(icall) = xf(ii) ! min(history_tmp(icall-1),xf(ii)) --> will be sorted later - else - xf(ii) = -functn(xx) - icall = icall + 1_i8 - history_tmp(icall) = -xf(ii) ! max(history_tmp(icall-1),-xf(ii)) --> will be sorted later - end if - - if (icall .ge. maxn) then - npt1 = ii - if (iprint .lt. 2) then - ! maximum trials reached - call write_termination_case(1) - call write_best_final() - end if - exit - end if - end do - end if - - icall = int(npt1,i8) - ! - ! arrange the points in order of increasing function value - if (maxit) then - large = minval(xf(1:npt1)) - large = merge(0.9_dp*large, 1.1_dp*large, large>0._dp) - else - large = maxval(xf(1:npt1)) - large = merge(1.1_dp*large, 0.9_dp*large, large>0._dp) - end if - xf(1:npt1) = merge(xf(1:npt1), large, is_finite(xf(1:npt1))) ! NaN and Infinite - ! sort does not work with NaNs - ! -> get history_tmp w/o NaN, sort it, and set the rest to NaN - nonan = size(pack(history_tmp(1:npt1), mask=is_finite(history_tmp(1:npt1)))) - if (nonan /= npt1) then - allocate(htmp(nonan)) - htmp(1:nonan) = pack(history_tmp(1:npt1), mask=is_finite(history_tmp(1:npt1))) - call sort(htmp(1:nonan)) - history_tmp(1:nonan) = htmp(1:nonan) - history_tmp(nonan+1:npt1) = special_value(1.0_dp, 'IEEE_QUIET_NAN') - deallocate(htmp) - else - call sort(history_tmp(1:npt1)) - end if - call sort_matrix(x(1:npt1,1:nn),xf(1:npt1)) - ! - ! record the best and worst points - do ii = 1, nn - bestx(ii) = x(1,ii) - worstx(ii) = x(npt1,ii) - end do - bestf_tmp = xf(1) - worstf = xf(npt1) - ! - ! compute the parameter range for the initial population - call parstt(x(1:npt1,1:nn),bound,peps,maskpara,xnstd,gnrng,ipcnvg) - ! - ! write currently best x and xf to temporal file - if (itmp_file) then - call write_best_intermediate(.true.) - end if - - ! write population to file - if (ipopul_file) then - call write_population(.true.) - end if - ! - ! print the results for the initial population - print: if (iprint .lt. 2) then - ! write currently best x and xf to screen - call write_best_intermediate(.false.) - - ! write population on screen - if (iprint .eq. 1) then - call write_population(.false.) - end if - end if print - ! - ! Maximum number of function evaluations reached? - if (icall .ge. maxn) then - if (iprint .lt. 2) then - ! maximum trials reached - call write_termination_case(1) - call write_best_final() + if (icall .ge. maxn) then + npt1 = ii + if (iprint .lt. 2) then + ! maximum trials reached + call write_termination_case(1) + call write_best_final() + end if + exit end if - call set_optional() - ! ----------------------- - ! Abort subroutine - ! ----------------------- - return - end if - ! - ! Feasible parameter space converged? - if (ipcnvg .eq. 1) then - if (iprint .lt. 2) then - ! converged because feasible parameter space small - call write_termination_case(3) - call write_best_final() - end if - call set_optional() - ! ----------------------- - ! Abort subroutine - ! ----------------------- - return - end if - ! - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - dummy_maskpara = .false. - dummy_maskpara(1:size(pini,1)) = maskpara - dummy_bl = -9999.0_dp - dummy_bl(1:size(pini,1)) = bl - dummy_bu = -9999.0_dp - dummy_bu(1:size(pini,1)) = bu - dummy_xx = -9999.0_dp - dummy_xx(1:size(pini,1)) = xx - ! - ! write restart - open(999, file=isrestart_file, status='unknown', action='write', delim='quote') - write(999, restartnml1) - write(999, restartnml2) - close(999) + end do + + end if + + icall = int(npt1, i8) + ! + ! arrange the points in order of increasing function value + if (maxit) then + large = minval(xf(1 : npt1)) + large = merge(0.9_dp * large, 1.1_dp * large, large>0._dp) + else + large = maxval(xf(1 : npt1)) + large = merge(1.1_dp * large, 0.9_dp * large, large>0._dp) + end if + xf(1 : npt1) = merge(xf(1 : npt1), large, is_finite(xf(1 : npt1))) ! NaN and Infinite + ! sort does not work with NaNs + ! -> get history_tmp w/o NaN, sort it, and set the rest to NaN + nonan = size(pack(history_tmp(1 : npt1), mask = is_finite(history_tmp(1 : npt1)))) + if (nonan /= npt1) then + allocate(htmp(nonan)) + htmp(1 : nonan) = pack(history_tmp(1 : npt1), mask = is_finite(history_tmp(1 : npt1))) + call sort(htmp(1 : nonan)) + history_tmp(1 : nonan) = htmp(1 : nonan) + history_tmp(nonan + 1 : npt1) = special_value(1.0_dp, 'IEEE_QUIET_NAN') + deallocate(htmp) + else + call sort(history_tmp(1 : npt1)) + end if + call sort_matrix(x(1 : npt1, 1 : nn), xf(1 : npt1)) + ! + ! record the best and worst points + do ii = 1, nn + bestx(ii) = x(1, ii) + worstx(ii) = x(npt1, ii) + end do + bestf_tmp = xf(1) + worstf = xf(npt1) + ! + ! compute the parameter range for the initial population + call parstt(x(1 : npt1, 1 : nn), bound, peps, maskpara, xnstd, gnrng, ipcnvg) + ! + ! write currently best x and xf to temporal file + if (itmp_file) then + call write_best_intermediate(.true.) + end if + + ! write population to file + if (ipopul_file) then + call write_population(.true.) + end if + ! + ! print the results for the initial population + print : if (iprint .lt. 2) then + ! write currently best x and xf to screen + call write_best_intermediate(.false.) + + ! write population on screen + if (iprint .eq. 1) then + call write_population(.false.) + end if + end if print + ! + ! Maximum number of function evaluations reached? + if (icall .ge. maxn) then + if (iprint .lt. 2) then + ! maximum trials reached + call write_termination_case(1) + call write_best_final() + end if + call set_optional() + ! ----------------------- + ! Abort subroutine + ! ----------------------- + return + end if + ! + ! Feasible parameter space converged? + if (ipcnvg .eq. 1) then + if (iprint .lt. 2) then + ! converged because feasible parameter space small + call write_termination_case(3) + call write_best_final() + end if + call set_optional() + ! ----------------------- + ! Abort subroutine + ! ----------------------- + return + end if + ! + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + dummy_maskpara = .false. + dummy_maskpara(1 : size(pini, 1)) = maskpara + dummy_bl = -9999.0_dp + dummy_bl(1 : size(pini, 1)) = bl + dummy_bu = -9999.0_dp + dummy_bu(1 : size(pini, 1)) = bu + dummy_xx = -9999.0_dp + dummy_xx(1 : size(pini, 1)) = xx + ! + ! write restart + open(999, file = isrestart_file, status = 'unknown', action = 'write', delim = 'quote') + write(999, restartnml1) + write(999, restartnml2) + close(999) end if ! restart or not if (irestart) then - ! read 1st namelist with allocated/scalar variables - open(999, file=isrestart_file, status='old', action='read', delim='quote') - read(999, nml=restartnml1) - close(999) - - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - maskpara = dummy_maskpara(1:size(pini,1)) - bl = dummy_bl(1:size(pini,1)) - bu = dummy_bu(1:size(pini,1)) - xx = dummy_xx(1:size(pini,1)) - - ! allocate global arrays - allocate(rand_tmp(n_threads)) - allocate(iseed(n_threads)) - allocate(save_state_unif(n_threads,n_save_state)) - allocate(save_state_gauss(n_threads,n_save_state)) - allocate(x(ngs*npg,nn)) - allocate(xf(ngs*npg)) - allocate(worstx(nn)) - allocate(xnstd(nn)) - allocate(bound(nn)) - allocate(unit(nn)) - allocate(criter(kstop+1)) - allocate(xname(nn)) - allocate(history_tmp(maxn+3*ngs*nspl)) - allocate(xtmp(npg,nn)) - allocate(ftmp(npg)) + ! read 1st namelist with allocated/scalar variables + open(999, file = isrestart_file, status = 'old', action = 'read', delim = 'quote') + read(999, nml = restartnml1) + close(999) + + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + maskpara = dummy_maskpara(1 : size(pini, 1)) + bl = dummy_bl(1 : size(pini, 1)) + bu = dummy_bu(1 : size(pini, 1)) + xx = dummy_xx(1 : size(pini, 1)) + + ! allocate global arrays + allocate(rand_tmp(n_threads)) + allocate(iseed(n_threads)) + allocate(save_state_unif(n_threads, n_save_state)) + allocate(save_state_gauss(n_threads, n_save_state)) + allocate(x(ngs * npg, nn)) + allocate(xf(ngs * npg)) + allocate(worstx(nn)) + allocate(xnstd(nn)) + allocate(bound(nn)) + allocate(unit(nn)) + allocate(criter(kstop + 1)) + allocate(xname(nn)) + allocate(history_tmp(maxn + 3 * ngs * nspl)) + allocate(xtmp(npg, nn)) + allocate(ftmp(npg)) end if ! ! begin the main loop - mainloop:do while (icall .lt. maxn) - ! read variables from restart files - open(999, file=isrestart_file, status='old', action='read', delim='quote') - read(999, nml=restartnml1) - read(999, nml=restartnml2) - close(999) - ! - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - maskpara = dummy_maskpara(1:size(pini,1)) - bl = dummy_bl(1:size(pini,1)) - bu = dummy_bu(1:size(pini,1)) - xx = dummy_xx(1:size(pini,1)) - ! - nloop = nloop + 1 - ! - if (iprint .lt. 2) then - write(output_unit, *) '' - write(output_unit,'(A28,I4)') ' *** Evolution Loop Number ',nloop - end if - ! - ! begin loop on complexes - ! loop from duan(1993) - - if (parall) then - - ! ----------------------------------------------------------------------- - ! Parallel version of complex-loop - ! ----------------------------------------------------------------------- - - ithread = 1 - !$OMP parallel default(shared) & - !$OMP private(igs, loop, ithread, kk, k1, k2, jj, lpos_ok, lpos, rand, cx, cf, lcs, s, sf) & - !$OMP private(icall_merk, iicall, ihistory_tmp, large) - allocate(cx(npg,nn)) - allocate(cf(npg)) - allocate(lcs(nps)) - allocate(s(nps,nn)) - allocate(sf(nps)) - allocate(ihistory_tmp(maxn+3*ngs*nspl)) - !$OMP do - comploop_omp: do igs = 1, ngs1 - !$ ithread = OMP_GET_THREAD_NUM() + 1 - ! - ! assign points into complexes - do k1 = 1, npg - k2 = (k1-1) * ngs1 + igs - do jj = 1, nn - cx(k1,jj) = x(k2,jj) - end do - cf(k1) = xf(k2) - end do - ! - ! begin inner loop - random selection of sub-complexes - ! loop from duan(1993) - subcomploop_omp: do loop = 1, nspl - ! - ! choose a sub-complex (nps points) according to a linear - ! probability distribution - ! - ! if number of points in subcomplex (nps) = number of points in complex (npg) - ! --> select all - if (nps .eq. npg) then - do kk = 1, nps - lcs(kk) = kk - end do - else - call xor4096(iseed(ithread), rand, save_state=save_state_unif(ithread,:)) - lcs(1) = 1 + int(real(npg,dp) + 0.5_dp & - - sqrt( (real(npg,dp)+.5_dp)**2 - real(npg,dp) * real(npg+1,dp) * rand )) - do kk = 2, nps - lpos_ok = .false. - do while (.not. lpos_ok) - lpos_ok = .true. - call xor4096(iseed(ithread), rand, save_state=save_state_unif(ithread,:)) - lpos = 1 + int(real(npg,dp) + 0.5_dp & - - sqrt( (real(npg,dp)+.5_dp)**2 - real(npg,dp) * real(npg+1,dp) * rand )) - ! test if point already chosen: returns lpos_ok=false if any point already exists - do k1 = 1, kk-1 - if (lpos .eq. lcs(k1)) lpos_ok = (lpos_ok .and. .false.) - end do - end do - lcs(kk) = lpos - end do - ! - ! arrange the sub-complex in order of increasing function value - call sort(lcs(1:nps)) - end if - ! - ! create the sub-complex arrays - do kk = 1, nps - do jj = 1, nn - s(kk,jj) = cx(lcs(kk),jj) - end do - sf(kk) = cf(lcs(kk)) - end do - ! - ! remember largest for treating of NaNs - if (maxit) then - large = minval(cf(1:npg)) - large = merge(0.9_dp*large, 1.1_dp*large, large>0._dp) - else - large = maxval(cf(1:npg)) - large = merge(1.1_dp*large, 0.9_dp*large, large>0._dp) - end if - ! - ! use the sub-complex to generate new point(s) - icall_merk = icall - iicall = icall - ihistory_tmp = history_tmp - call cce(s(1:nps,1:nn),sf(1:nps),bl(1:nn),bu(1:nn),maskpara,xnstd(1:nn), & - iicall,maxn,maxit,save_state_gauss(ithread,:),functn,alpha,beta,ihistory_tmp,idot) - history_tmp(icall+1:icall+(iicall-icall_merk)) = ihistory_tmp(icall_merk+1:iicall) - icall = icall + (iicall-icall_merk) - ! - ! if the sub-complex is accepted, replace the new sub-complex - ! into the complex - do kk = 1, nps - do jj = 1, nn - cx(lcs(kk),jj) = s(kk,jj) - end do - cf(lcs(kk)) = sf(kk) - end do - ! - ! sort the points - cf(1:npg) = merge(cf(1:npg), large, is_finite(cf(1:npg))) ! NaN and Infinite - call sort_matrix(cx(1:npg,1:nn),cf(1:npg)) - ! - ! ! if maximum number of runs exceeded, break out of the loop - ! if (icall .ge. maxn) exit - ! - end do subcomploop_omp ! - ! - ! replace the new complex into original array x(.,.) - do k1 = 1, npg - k2 = (k1-1) * ngs1 + igs - do jj = 1, nn - x(k2,jj) = cx(k1,jj) - end do - xf(k2) = cf(k1) - end do - ! if (icall .ge. maxn) exit - ! - ! end loop on complexes - end do comploop_omp ! - !$OMP end do - deallocate(cx) - deallocate(cf) - deallocate(lcs) - deallocate(s) - deallocate(sf) - deallocate(ihistory_tmp) - !$OMP end parallel - - else - - ! ----------------------------------------------------------------------- - ! Non-parallel version of complex-loop - ! ----------------------------------------------------------------------- - - allocate(cx(npg,nn)) - allocate(cf(npg)) - allocate(lcs(nps)) - allocate(s(nps,nn)) - allocate(sf(nps)) - - ithread = 1 - - comploop: do igs = 1, ngs1 - ! - ! assign points into complexes - do k1 = 1, npg - k2 = (k1-1) * ngs1 + igs - do jj = 1, nn - cx(k1,jj) = x(k2,jj) - end do - cf(k1) = xf(k2) - end do - ! - ! begin inner loop - random selection of sub-complexes - ! loop from duan(1993) - subcomploop: do loop = 1, nspl - ! - ! choose a sub-complex (nps points) according to a linear - ! probability distribution - ! - ! if number of points in subcomplex (nps) = number of points in complex (npg) - ! --> select all - if (nps .eq. npg) then - do kk = 1, nps - lcs(kk) = kk - end do - else - call xor4096(iseed(ithread), rand, save_state=save_state_unif(ithread,:)) - lcs(1) = 1 + int(real(npg,dp) + 0.5_dp & - - sqrt( (real(npg,dp)+.5_dp)**2 - real(npg,dp) * real(npg+1,dp) * rand )) - do kk = 2, nps - lpos_ok = .false. - do while (.not. lpos_ok) - lpos_ok = .true. - call xor4096(iseed(ithread), rand, save_state=save_state_unif(ithread,:)) - lpos = 1 + int(real(npg,dp) + 0.5_dp & - - sqrt( (real(npg,dp)+.5_dp)**2 - real(npg,dp) * real(npg+1,dp) * rand )) - ! test if point already chosen: returns lpos_ok=false if any point already exists - do k1 = 1, kk-1 - if (lpos .eq. lcs(k1)) lpos_ok = (lpos_ok .and. .false.) - end do - end do - lcs(kk) = lpos - end do - ! - ! arrange the sub-complex in order of increasing function value - call sort(lcs(1:nps)) - end if - ! - ! create the sub-complex arrays - do kk = 1, nps - do jj = 1, nn - s(kk,jj) = cx(lcs(kk),jj) - end do - sf(kk) = cf(lcs(kk)) - end do - ! - ! remember largest for treating of NaNs - if (maxit) then - large = minval(cf(1:npg)) - large = merge(0.9_dp*large, 1.1_dp*large, large>0._dp) - else - large = maxval(cf(1:npg)) - large = merge(1.1_dp*large, 0.9_dp*large, large>0._dp) - end if - ! - ! use the sub-complex to generate new point(s) - call cce(s(1:nps,1:nn),sf(1:nps),bl(1:nn),bu(1:nn),maskpara,xnstd(1:nn), & - icall,maxn,maxit,save_state_gauss(ithread,:),functn, alpha,beta,history_tmp,idot) - ! - ! if the sub-complex is accepted, replace the new sub-complex - ! into the complex - do kk = 1, nps - do jj = 1, nn - cx(lcs(kk),jj) = s(kk,jj) - end do - cf(lcs(kk)) = sf(kk) - end do - ! - ! sort the points - cf(1:npg) = merge(cf(1:npg), large, is_finite(cf(1:npg))) ! NaN and Infinite - call sort_matrix(cx(1:npg,1:nn),cf(1:npg)) - ! - ! if maximum number of runs exceeded, break out of the loop - if (icall .ge. maxn) then - if (iprint .lt. 2) then - ! maximum trials reached - call write_termination_case(1) - call write_best_final() - end if - exit - end if - ! - end do subcomploop ! - ! - ! replace the new complex into original array x(.,.) - do k1 = 1, npg - k2 = (k1-1) * ngs1 + igs - do jj = 1, nn - x(k2,jj) = cx(k1,jj) + mainloop : do while (icall .lt. maxn) + ! read variables from restart files + open(999, file = isrestart_file, status = 'old', action = 'read', delim = 'quote') + read(999, nml = restartnml1) + read(999, nml = restartnml2) + close(999) + ! + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + maskpara = dummy_maskpara(1 : size(pini, 1)) + bl = dummy_bl(1 : size(pini, 1)) + bu = dummy_bu(1 : size(pini, 1)) + xx = dummy_xx(1 : size(pini, 1)) + ! + nloop = nloop + 1 + ! + if (iprint .lt. 2) then + write(output_unit, *) '' + write(output_unit, '(A28,I4)') ' *** Evolution Loop Number ', nloop + end if + ! + ! begin loop on complexes + ! loop from duan(1993) + + if (parall) then + + ! ----------------------------------------------------------------------- + ! Parallel version of complex-loop + ! ----------------------------------------------------------------------- + + ithread = 1 + !$OMP parallel default(shared) & + !$OMP private(igs, loop, ithread, kk, k1, k2, jj, lpos_ok, lpos, rand, cx, cf, lcs, s, sf) & + !$OMP private(icall_merk, iicall, ihistory_tmp, large) + allocate(cx(npg, nn)) + allocate(cf(npg)) + allocate(lcs(nps)) + allocate(s(nps, nn)) + allocate(sf(nps)) + allocate(ihistory_tmp(maxn + 3 * ngs * nspl)) + !$OMP do + comploop_omp : do igs = 1, ngs1 + !$ ithread = OMP_GET_THREAD_NUM() + 1 + ! + ! assign points into complexes + do k1 = 1, npg + k2 = (k1 - 1) * ngs1 + igs + do jj = 1, nn + cx(k1, jj) = x(k2, jj) + end do + cf(k1) = xf(k2) + end do + ! + ! begin inner loop - random selection of sub-complexes + ! loop from duan(1993) + subcomploop_omp : do loop = 1, nspl + ! + ! choose a sub-complex (nps points) according to a linear + ! probability distribution + ! + ! if number of points in subcomplex (nps) = number of points in complex (npg) + ! --> select all + if (nps .eq. npg) then + do kk = 1, nps + lcs(kk) = kk + end do + else + call xor4096(iseed(ithread), rand, save_state = save_state_unif(ithread, :)) + lcs(1) = 1 + int(real(npg, dp) + 0.5_dp & + - sqrt((real(npg, dp) + .5_dp)**2 - real(npg, dp) * real(npg + 1, dp) * rand)) + do kk = 2, nps + lpos_ok = .false. + do while (.not. lpos_ok) + lpos_ok = .true. + call xor4096(iseed(ithread), rand, save_state = save_state_unif(ithread, :)) + lpos = 1 + int(real(npg, dp) + 0.5_dp & + - sqrt((real(npg, dp) + .5_dp)**2 - real(npg, dp) * real(npg + 1, dp) * rand)) + ! test if point already chosen: returns lpos_ok=false if any point already exists + do k1 = 1, kk - 1 + if (lpos .eq. lcs(k1)) lpos_ok = (lpos_ok .and. .false.) + end do end do - xf(k2) = cf(k1) - end do - if (icall .ge. maxn) then - if (iprint .lt. 2) then - ! maximum trials reached - call write_termination_case(1) - call write_best_final() - end if - exit - end if - ! - ! end loop on complexes - end do comploop ! - - deallocate(cx) - deallocate(cf) - deallocate(lcs) - deallocate(s) - deallocate(sf) - - end if ! end parallel/non-parallel region - ! - ! re-sort the points - call sort_matrix(x(1:npt1,1:nn),xf(1:npt1)) - ! - ! record the best and worst points - do jj = 1, nn - bestx(jj) = x(1,jj) - worstx(jj) = x(npt1,jj) - end do - bestf_tmp = xf(1) - worstf = xf(npt1) - ! - ! test the population for parameter convergence - call parstt(x(1:npt1,1:nn),bound,peps,maskpara,xnstd,gnrng,ipcnvg) - ! - ! write currently best x and xf to temporal file - if (itmp_file) then - call write_best_intermediate(.true.) - end if - ! - ! write population to file - if (ipopul_file) then - call write_population(.true.) - end if - ! - ! print the results for current population - if (iprint .lt. 2) then - call write_best_intermediate(.false.) - - if (iprint .eq. 1) then - call write_population(.false.) - end if + lcs(kk) = lpos + end do + ! + ! arrange the sub-complex in order of increasing function value + call sort(lcs(1 : nps)) + end if + ! + ! create the sub-complex arrays + do kk = 1, nps + do jj = 1, nn + s(kk, jj) = cx(lcs(kk), jj) + end do + sf(kk) = cf(lcs(kk)) + end do + ! + ! remember largest for treating of NaNs + if (maxit) then + large = minval(cf(1 : npg)) + large = merge(0.9_dp * large, 1.1_dp * large, large>0._dp) + else + large = maxval(cf(1 : npg)) + large = merge(1.1_dp * large, 0.9_dp * large, large>0._dp) + end if + ! + ! use the sub-complex to generate new point(s) + icall_merk = icall + iicall = icall + ihistory_tmp = history_tmp + call cce(s(1 : nps, 1 : nn), sf(1 : nps), bl(1 : nn), bu(1 : nn), maskpara, xnstd(1 : nn), & + iicall, maxn, maxit, save_state_gauss(ithread, :), functn, eval, alpha, beta, ihistory_tmp, idot) + history_tmp(icall + 1 : icall + (iicall - icall_merk)) = ihistory_tmp(icall_merk + 1 : iicall) + icall = icall + (iicall - icall_merk) + ! + ! if the sub-complex is accepted, replace the new sub-complex + ! into the complex + do kk = 1, nps + do jj = 1, nn + cx(lcs(kk), jj) = s(kk, jj) + end do + cf(lcs(kk)) = sf(kk) + end do + ! + ! sort the points + cf(1 : npg) = merge(cf(1 : npg), large, is_finite(cf(1 : npg))) ! NaN and Infinite + call sort_matrix(cx(1 : npg, 1 : nn), cf(1 : npg)) + ! + ! ! if maximum number of runs exceeded, break out of the loop + ! if (icall .ge. maxn) exit + ! + end do subcomploop_omp ! + ! + ! replace the new complex into original array x(.,.) + do k1 = 1, npg + k2 = (k1 - 1) * ngs1 + igs + do jj = 1, nn + x(k2, jj) = cx(k1, jj) + end do + xf(k2) = cf(k1) + end do + ! if (icall .ge. maxn) exit + ! + ! end loop on complexes + end do comploop_omp ! + !$OMP end do + deallocate(cx) + deallocate(cf) + deallocate(lcs) + deallocate(s) + deallocate(sf) + deallocate(ihistory_tmp) + !$OMP end parallel - end if - ! - ! test if maximum number of function evaluations exceeded - ! Maximum number of function evaluations reached? - if (icall .ge. maxn) then - if (iprint .lt. 2) then - ! maximum trials reached - call write_termination_case(1) - call write_best_final() - end if - call set_optional() - ! ----------------------- - ! Abort subroutine - ! ----------------------- - return - end if - ! - ! compute the count on successive loops w/o function improvement - criter(kstop+1) = bestf_tmp - if (nloop .gt. kstop) then - denomi = 0.5_dp * abs(criter((kstop+1)-kstop) + criter(kstop+1)) - denomi = max(denomi, 1.0e-15_dp) - timeou = abs(criter((kstop+1)-kstop) - criter(kstop+1)) / denomi - if (timeou .lt. pcento) then - if (iprint .lt. 2) then - ! criterion value has not changed during last loops - call write_termination_case(2) + else + + ! ----------------------------------------------------------------------- + ! Non-parallel version of complex-loop + ! ----------------------------------------------------------------------- + + allocate(cx(npg, nn)) + allocate(cf(npg)) + allocate(lcs(nps)) + allocate(s(nps, nn)) + allocate(sf(nps)) + + ithread = 1 + + comploop : do igs = 1, ngs1 + ! + ! assign points into complexes + do k1 = 1, npg + k2 = (k1 - 1) * ngs1 + igs + do jj = 1, nn + cx(k1, jj) = x(k2, jj) + end do + cf(k1) = xf(k2) + end do + ! + ! begin inner loop - random selection of sub-complexes + ! loop from duan(1993) + subcomploop : do loop = 1, nspl + ! + ! choose a sub-complex (nps points) according to a linear + ! probability distribution + ! + ! if number of points in subcomplex (nps) = number of points in complex (npg) + ! --> select all + if (nps .eq. npg) then + do kk = 1, nps + lcs(kk) = kk + end do + else + call xor4096(iseed(ithread), rand, save_state = save_state_unif(ithread, :)) + lcs(1) = 1 + int(real(npg, dp) + 0.5_dp & + - sqrt((real(npg, dp) + .5_dp)**2 - real(npg, dp) * real(npg + 1, dp) * rand)) + do kk = 2, nps + lpos_ok = .false. + do while (.not. lpos_ok) + lpos_ok = .true. + call xor4096(iseed(ithread), rand, save_state = save_state_unif(ithread, :)) + lpos = 1 + int(real(npg, dp) + 0.5_dp & + - sqrt((real(npg, dp) + .5_dp)**2 - real(npg, dp) * real(npg + 1, dp) * rand)) + ! test if point already chosen: returns lpos_ok=false if any point already exists + do k1 = 1, kk - 1 + if (lpos .eq. lcs(k1)) lpos_ok = (lpos_ok .and. .false.) + end do + end do + lcs(kk) = lpos + end do + ! + ! arrange the sub-complex in order of increasing function value + call sort(lcs(1 : nps)) + end if + ! + ! create the sub-complex arrays + do kk = 1, nps + do jj = 1, nn + s(kk, jj) = cx(lcs(kk), jj) + end do + sf(kk) = cf(lcs(kk)) + end do + ! + ! remember largest for treating of NaNs + if (maxit) then + large = minval(cf(1 : npg)) + large = merge(0.9_dp * large, 1.1_dp * large, large>0._dp) + else + large = maxval(cf(1 : npg)) + large = merge(1.1_dp * large, 0.9_dp * large, large>0._dp) + end if + ! + ! use the sub-complex to generate new point(s) + call cce(s(1 : nps, 1 : nn), sf(1 : nps), bl(1 : nn), bu(1 : nn), maskpara, xnstd(1 : nn), & + icall, maxn, maxit, save_state_gauss(ithread, :), functn, eval, alpha, beta, history_tmp, idot) + ! + ! if the sub-complex is accepted, replace the new sub-complex + ! into the complex + do kk = 1, nps + do jj = 1, nn + cx(lcs(kk), jj) = s(kk, jj) + end do + cf(lcs(kk)) = sf(kk) + end do + ! + ! sort the points + cf(1 : npg) = merge(cf(1 : npg), large, is_finite(cf(1 : npg))) ! NaN and Infinite + call sort_matrix(cx(1 : npg, 1 : nn), cf(1 : npg)) + ! + ! if maximum number of runs exceeded, break out of the loop + if (icall .ge. maxn) then + if (iprint .lt. 2) then + ! maximum trials reached + call write_termination_case(1) call write_best_final() - end if - call set_optional() - ! ----------------------- - ! Abort subroutine - ! ----------------------- - return + end if + exit + end if + ! + end do subcomploop ! + ! + ! replace the new complex into original array x(.,.) + do k1 = 1, npg + k2 = (k1 - 1) * ngs1 + igs + do jj = 1, nn + x(k2, jj) = cx(k1, jj) + end do + xf(k2) = cf(k1) + end do + if (icall .ge. maxn) then + if (iprint .lt. 2) then + ! maximum trials reached + call write_termination_case(1) + call write_best_final() + end if + exit end if - end if - criter(1:kstop) = criter(2:kstop+1) - ! - ! if population is converged into a sufficiently small space - if (ipcnvg .eq. 1) then + ! + ! end loop on complexes + end do comploop ! + + deallocate(cx) + deallocate(cf) + deallocate(lcs) + deallocate(s) + deallocate(sf) + + end if ! end parallel/non-parallel region + ! + ! re-sort the points + call sort_matrix(x(1 : npt1, 1 : nn), xf(1 : npt1)) + ! + ! record the best and worst points + do jj = 1, nn + bestx(jj) = x(1, jj) + worstx(jj) = x(npt1, jj) + end do + bestf_tmp = xf(1) + worstf = xf(npt1) + ! + ! test the population for parameter convergence + call parstt(x(1 : npt1, 1 : nn), bound, peps, maskpara, xnstd, gnrng, ipcnvg) + ! + ! write currently best x and xf to temporal file + if (itmp_file) then + call write_best_intermediate(.true.) + end if + ! + ! write population to file + if (ipopul_file) then + call write_population(.true.) + end if + ! + ! print the results for current population + if (iprint .lt. 2) then + call write_best_intermediate(.false.) + + if (iprint .eq. 1) then + call write_population(.false.) + end if + + end if + ! + ! test if maximum number of function evaluations exceeded + ! Maximum number of function evaluations reached? + if (icall .ge. maxn) then + if (iprint .lt. 2) then + ! maximum trials reached + call write_termination_case(1) + call write_best_final() + end if + call set_optional() + ! ----------------------- + ! Abort subroutine + ! ----------------------- + return + end if + ! + ! compute the count on successive loops w/o function improvement + criter(kstop + 1) = bestf_tmp + if (nloop .gt. kstop) then + denomi = 0.5_dp * abs(criter((kstop + 1) - kstop) + criter(kstop + 1)) + denomi = max(denomi, 1.0e-15_dp) + timeou = abs(criter((kstop + 1) - kstop) - criter(kstop + 1)) / denomi + if (timeou .lt. pcento) then if (iprint .lt. 2) then - ! converged because feasible parameter space small - call write_termination_case(3) - call write_best_final() + ! criterion value has not changed during last loops + call write_termination_case(2) + call write_best_final() end if call set_optional() ! ----------------------- ! Abort subroutine ! ----------------------- return - end if - ! - ! none of the stopping criteria is satisfied, continue search - ! - ! check for complex number reduction - if (ngs1 .gt. mings) then - ngs2 = ngs1 - ngs1 = ngs1 - 1 - npt1 = ngs1 * npg - call comp(ngs2,npg,x(1:ngs2*npg,1:nn),xf(1:ngs2*npg),xtmp(1:ngs2*npg,1:nn),ftmp(1:ngs2*npg)) - end if - ! - ! transfer all array-like variables in namelist to fixed-size dummy-arrays - dummy_maskpara = .false. - dummy_maskpara(1:size(pini,1)) = maskpara - dummy_bl = -9999.0_dp - dummy_bl(1:size(pini,1)) = bl - dummy_bu = -9999.0_dp - dummy_bu(1:size(pini,1)) = bu - dummy_xx = -9999.0_dp - dummy_xx(1:size(pini,1)) = xx - ! - ! write restart - open(999, file=isrestart_file, status='unknown', action='write', delim='quote') - write(999, restartnml1) - write(999, restartnml2) - close(999) + end if + end if + criter(1 : kstop) = criter(2 : kstop + 1) + ! + ! if population is converged into a sufficiently small space + if (ipcnvg .eq. 1) then + if (iprint .lt. 2) then + ! converged because feasible parameter space small + call write_termination_case(3) + call write_best_final() + end if + call set_optional() + ! ----------------------- + ! Abort subroutine + ! ----------------------- + return + end if + ! + ! none of the stopping criteria is satisfied, continue search + ! + ! check for complex number reduction + if (ngs1 .gt. mings) then + ngs2 = ngs1 + ngs1 = ngs1 - 1 + npt1 = ngs1 * npg + call comp(ngs2, npg, x(1 : ngs2 * npg, 1 : nn), xf(1 : ngs2 * npg), xtmp(1 : ngs2 * npg, 1 : nn), ftmp(1 : ngs2 * npg)) + end if + ! + ! transfer all array-like variables in namelist to fixed-size dummy-arrays + dummy_maskpara = .false. + dummy_maskpara(1 : size(pini, 1)) = maskpara + dummy_bl = -9999.0_dp + dummy_bl(1 : size(pini, 1)) = bl + dummy_bu = -9999.0_dp + dummy_bu(1 : size(pini, 1)) = bu + dummy_xx = -9999.0_dp + dummy_xx(1 : size(pini, 1)) = xx + ! + ! write restart + open(999, file = isrestart_file, status = 'unknown', action = 'write', delim = 'quote') + write(999, restartnml1) + write(999, restartnml2) + close(999) end do mainloop deallocate(xtmp) @@ -1362,27 +1357,27 @@ subroutine write_best_intermediate(to_file) logical, intent(in) :: to_file if (to_file) then - open(999,file=trim(adjustl(istmp_file)), action='write', position='append',recl=(nn+6)*30) - if (.not. maxit) then - write(999,*) nloop,icall,ngs1,bestf_tmp,worstf,gnrng, (bestx(jj),jj=1,nn) - else - write(999,*) nloop,icall,ngs1,-bestf_tmp,-worstf,gnrng, (bestx(jj),jj=1,nn) - end if - close(999) + open(999, file = trim(adjustl(istmp_file)), action = 'write', position = 'append', recl = (nn + 6) * 30) + if (.not. maxit) then + write(999, *) nloop, icall, ngs1, bestf_tmp, worstf, gnrng, (bestx(jj), jj = 1, nn) + else + write(999, *) nloop, icall, ngs1, -bestf_tmp, -worstf, gnrng, (bestx(jj), jj = 1, nn) + end if + close(999) else - write(format_str1,'(A13,I3,A8)') '( A49, ',nn,'(6X,A4))' - write(format_str2,'(A26,I3,A8)') '(I5,1X,I5,3X,I5,3(E22.14), ',nn,'(G10.3))' - if (nloop == 0) then - write(output_unit,*) '' - write(output_unit,'(A44)') ' *** PRINT THE RESULTS OF THE SCE SEARCH ***' - write(output_unit,*) '' - write(output_unit,format_str1) ' LOOP TRIALS COMPLXS BEST F WORST F PAR RNG ',(xname(jj),jj=1,nn) - end if - if (.not. maxit) then - write(output_unit,format_str2) nloop,icall,ngs1,bestf_tmp,worstf,gnrng, (bestx(jj),jj=1,nn) - else - write(output_unit,format_str2) nloop,icall,ngs1,-bestf_tmp,-worstf,gnrng, (bestx(jj),jj=1,nn) - end if + write(format_str1, '(A13,I3,A8)') '( A49, ', nn, '(6X,A4))' + write(format_str2, '(A26,I3,A8)') '(I5,1X,I5,3X,I5,3(E22.14), ', nn, '(G10.3))' + if (nloop == 0) then + write(output_unit, *) '' + write(output_unit, '(A44)') ' *** PRINT THE RESULTS OF THE SCE SEARCH ***' + write(output_unit, *) '' + write(output_unit, format_str1) ' LOOP TRIALS COMPLXS BEST F WORST F PAR RNG ', (xname(jj), jj = 1, nn) + end if + if (.not. maxit) then + write(output_unit, format_str2) nloop, icall, ngs1, bestf_tmp, worstf, gnrng, (bestx(jj), jj = 1, nn) + else + write(output_unit, format_str2) nloop, icall, ngs1, -bestf_tmp, -worstf, gnrng, (bestx(jj), jj = 1, nn) + end if end if end subroutine write_best_intermediate @@ -1391,14 +1386,14 @@ subroutine write_best_final() implicit none - write(format_str1,'(A13,I3,A8)') '( A10, ',nn,'(6X,A4))' - write(format_str2,'(A14,I3,A8)') '(E22.14, ',nn,'(G10.3))' + write(format_str1, '(A13,I3,A8)') '( A10, ', nn, '(6X,A4))' + write(format_str2, '(A14,I3,A8)') '(E22.14, ', nn, '(G10.3))' - write(output_unit,format_str1) 'CRITERION ',(xname(jj),jj=1,nn) + write(output_unit, format_str1) 'CRITERION ', (xname(jj), jj = 1, nn) if (.not. maxit) then - write(output_unit,format_str2) bestf_tmp,(bestx(jj),jj=1,nn) + write(output_unit, format_str2) bestf_tmp, (bestx(jj), jj = 1, nn) else - write(output_unit,format_str2) -bestf_tmp,(bestx(jj),jj=1,nn) + write(output_unit, format_str2) -bestf_tmp, (bestx(jj), jj = 1, nn) end if end subroutine write_best_final @@ -1408,32 +1403,32 @@ subroutine write_population(to_file) logical, intent(in) :: to_file if (to_file) then - write(format_str2,'(A13,I3,A9)') '(I4, E22.14, ',nn,'(E22.14))' - open(unit=999,file=trim(adjustl(ispopul_file)), action='write', position='append',recl=(nn+2)*30) - if (.not. maxit) then - do ii = 1, npt1 - write(999,*) nloop, xf(ii), (x(ii,jj),jj=1,nn) - end do - else - do ii = 1, npt1 - write(999,*) nloop, -xf(ii), (x(ii,jj),jj=1,nn) - end do - end if - close(999) + write(format_str2, '(A13,I3,A9)') '(I4, E22.14, ', nn, '(E22.14))' + open(unit = 999, file = trim(adjustl(ispopul_file)), action = 'write', position = 'append', recl = (nn + 2) * 30) + if (.not. maxit) then + do ii = 1, npt1 + write(999, *) nloop, xf(ii), (x(ii, jj), jj = 1, nn) + end do + else + do ii = 1, npt1 + write(999, *) nloop, -xf(ii), (x(ii, jj), jj = 1, nn) + end do + end if + close(999) else - write(format_str2,'(A12,I3,A8)') '(I4, E22.14, ',nn,'(G10.3))' - write(output_unit,*) '' - write(output_unit,'(A22,I3)') ' POPULATION AT LOOP ',nloop - write(output_unit,'(A27)') '---------------------------' - if (.not. maxit) then - do ii = 1, npt1 - write(output_unit,format_str2) nloop, xf(ii), (x(ii,jj),jj=1,nn) - end do - else - do ii = 1, npt1 - write(output_unit,format_str2) nloop, -xf(ii), (x(ii,jj),jj=1,nn) - end do - end if + write(format_str2, '(A12,I3,A8)') '(I4, E22.14, ', nn, '(G10.3))' + write(output_unit, *) '' + write(output_unit, '(A22,I3)') ' POPULATION AT LOOP ', nloop + write(output_unit, '(A27)') '---------------------------' + if (.not. maxit) then + do ii = 1, npt1 + write(output_unit, format_str2) nloop, xf(ii), (x(ii, jj), jj = 1, nn) + end do + else + do ii = 1, npt1 + write(output_unit, format_str2) nloop, -xf(ii), (x(ii, jj), jj = 1, nn) + end do + end if end if end subroutine write_population @@ -1444,30 +1439,30 @@ subroutine write_termination_case(case) select case (case) case (1) ! maximal number of iterations reached - write(output_unit,*) '' - write(output_unit,'(A46,A39,I7,A46,I4,A12,I4,A19,I4,A4)') & - '*** OPTIMIZATION SEARCH TERMINATED BECAUSE THE', & - ' LIMIT ON THE MAXIMUM NUMBER OF TRIALS ', maxn, & - ' EXCEEDED. SEARCH WAS STOPPED AT SUB-COMPLEX ', & - loop, ' OF COMPLEX ', igs,' IN SHUFFLING LOOP ', nloop, ' ***' - ! + write(output_unit, *) '' + write(output_unit, '(A46,A39,I7,A46,I4,A12,I4,A19,I4,A4)') & + '*** OPTIMIZATION SEARCH TERMINATED BECAUSE THE', & + ' LIMIT ON THE MAXIMUM NUMBER OF TRIALS ', maxn, & + ' EXCEEDED. SEARCH WAS STOPPED AT SUB-COMPLEX ', & + loop, ' OF COMPLEX ', igs, ' IN SHUFFLING LOOP ', nloop, ' ***' + ! case(2) ! objective not changed during last evolution loops - write(output_unit,*) '' - write(output_unit,'(A72,F8.4,A12,I3,A20)') '*** OPTIMIZATION TERMINATED BECAUSE THE CRITERION VALUE HAS NOT CHANGED ', & - pcento*100._dp,' PERCENT IN ', kstop, ' SHUFFLING LOOPS ***' - ! + write(output_unit, *) '' + write(output_unit, '(A72,F8.4,A12,I3,A20)') '*** OPTIMIZATION TERMINATED BECAUSE THE CRITERION VALUE HAS NOT CHANGED ', & + pcento * 100._dp, ' PERCENT IN ', kstop, ' SHUFFLING LOOPS ***' + ! case(3) ! complexes converged - write(output_unit,*) '' - write(output_unit,'(A50,A20,F8.4,A34)') '*** OPTIMIZATION TERMINATED BECAUSE THE POPULATION', & - ' HAS CONVERGED INTO ', gnrng*100._dp, ' PERCENT OF THE FEASIBLE SPACE ***' - ! + write(output_unit, *) '' + write(output_unit, '(A50,A20,F8.4,A34)') '*** OPTIMIZATION TERMINATED BECAUSE THE POPULATION', & + ' HAS CONVERGED INTO ', gnrng * 100._dp, ' PERCENT OF THE FEASIBLE SPACE ***' + ! case default - write(error_unit,*) 'This termination case is not implemented!' - stop + write(error_unit, *) 'This termination case is not implemented!' + stop end select - write(output_unit,*) '' - write(output_unit,'(A66)') '*** PRINT THE FINAL PARAMETER ESTIMATE AND ITS CRITERION VALUE ***' + write(output_unit, *) '' + write(output_unit, '(A66)') '*** PRINT THE FINAL PARAMETER ESTIMATE AND ITS CRITERION VALUE ***' end subroutine write_termination_case @@ -1479,8 +1474,8 @@ subroutine set_optional() if (present(bestf) .and. .not. maxit) bestf = bestf_tmp if (present(bestf) .and. maxit) bestf = -bestf_tmp if (present(history)) then - allocate(history(icall)) - history(:) = history_tmp(1:icall) + allocate(history(icall)) + history(:) = history_tmp(1 : icall) end if end subroutine set_optional @@ -1488,75 +1483,75 @@ end subroutine set_optional end function sce - subroutine parstt(x,bound,peps,mask,xnstd,gnrng,ipcnvg) + subroutine parstt(x, bound, peps, mask, xnstd, gnrng, ipcnvg) ! ! subroutine checking for parameter convergence ! - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none - real(dp), dimension(:,:), intent(in) :: x ! points in population, cols=nn, rows=npt1 (!) - real(dp), dimension(:), intent(in) :: bound ! difference of upper and lower limit per parameter - real(dp), intent(in) :: peps ! optimization is terminated if volume of complex has + real(dp), dimension(:, :), intent(in) :: x ! points in population, cols=nn, rows=npt1 (!) + real(dp), dimension(:), intent(in) :: bound ! difference of upper and lower limit per parameter + real(dp), intent(in) :: peps ! optimization is terminated if volume of complex has ! ! converged to given percentage of feasible space - logical, dimension(:), intent(in) :: mask ! mask of parameters - real(dp), dimension(size(bound,1)), intent(out) :: xnstd ! std. deviation of points in population per parameter - real(dp), intent(out) :: gnrng ! fraction of feasible space covered by complexes - integer(i4), intent(out) :: ipcnvg ! 1 : population converged into sufficiently small space + logical, dimension(:), intent(in) :: mask ! mask of parameters + real(dp), dimension(size(bound, 1)), intent(out) :: xnstd ! std. deviation of points in population per parameter + real(dp), intent(out) :: gnrng ! fraction of feasible space covered by complexes + integer(i4), intent(out) :: ipcnvg ! 1 : population converged into sufficiently small space ! ! 0 : not converged ! ! local variables - integer(i4) :: nn ! number of parameters - integer(i4) :: npt1 ! number of points in current population - integer(i4) :: ii, kk - real(dp) :: xsum1 ! sum of all values per parameter - real(dp) :: xsum2 ! sum of square of all values per parameter - real(dp) :: gsum ! sum of all (range scaled) currently covered parameter ranges: + integer(i4) :: nn ! number of parameters + integer(i4) :: npt1 ! number of points in current population + integer(i4) :: ii, kk + real(dp) :: xsum1 ! sum of all values per parameter + real(dp) :: xsum2 ! sum of square of all values per parameter + real(dp) :: gsum ! sum of all (range scaled) currently covered parameter ranges: ! ! (max-min)/bound - real(dp), dimension(size(bound,1)) :: xmin ! minimal value per parameter - real(dp), dimension(size(bound,1)) :: xmax ! maximal value per parameter - real(dp), dimension(size(bound,1)) :: xmean ! mean value per parameter - real(dp), parameter :: delta = tiny(1.0_dp) + real(dp), dimension(size(bound, 1)) :: xmin ! minimal value per parameter + real(dp), dimension(size(bound, 1)) :: xmax ! maximal value per parameter + real(dp), dimension(size(bound, 1)) :: xmean ! mean value per parameter + real(dp), parameter :: delta = tiny(1.0_dp) ! - nn = size(x,2) - npt1 = size(x,1) + nn = size(x, 2) + npt1 = size(x, 1) ! compute maximum, minimum and standard deviation of parameter values gsum = 0._dp do kk = 1, nn - if (mask(kk)) then - xmax(kk) = -huge(1.0_dp) - xmin(kk) = huge(1.0_dp) - xsum1 = 0._dp - xsum2 = 0._dp - do ii = 1, npt1 - xmax(kk) = dmax1(x(ii,kk), xmax(kk)) - xmin(kk) = dmin1(x(ii,kk), xmin(kk)) - xsum1 = xsum1 + x(ii,kk) - xsum2 = xsum2 + x(ii,kk)*x(ii,kk) - end do - xmean(kk) = xsum1 / real(npt1,dp) - xnstd(kk) = (xsum2 / real(npt1,dp) - xmean(kk)*xmean(kk)) - if (xnstd(kk) .le. delta) then - xnstd(kk) = delta - end if - xnstd(kk) = sqrt(xnstd(kk)) - xnstd(kk) = xnstd(kk) / bound(kk) - gsum = gsum + log( delta + (xmax(kk)-xmin(kk))/bound(kk) ) - end if + if (mask(kk)) then + xmax(kk) = -huge(1.0_dp) + xmin(kk) = huge(1.0_dp) + xsum1 = 0._dp + xsum2 = 0._dp + do ii = 1, npt1 + xmax(kk) = dmax1(x(ii, kk), xmax(kk)) + xmin(kk) = dmin1(x(ii, kk), xmin(kk)) + xsum1 = xsum1 + x(ii, kk) + xsum2 = xsum2 + x(ii, kk) * x(ii, kk) + end do + xmean(kk) = xsum1 / real(npt1, dp) + xnstd(kk) = (xsum2 / real(npt1, dp) - xmean(kk) * xmean(kk)) + if (xnstd(kk) .le. delta) then + xnstd(kk) = delta + end if + xnstd(kk) = sqrt(xnstd(kk)) + xnstd(kk) = xnstd(kk) / bound(kk) + gsum = gsum + log(delta + (xmax(kk) - xmin(kk)) / bound(kk)) + end if end do - gnrng = exp(gsum/real(nn,dp)) + gnrng = exp(gsum / real(nn, dp)) ! ! check if normalized standard deviation of parameter is <= eps ipcnvg = 0_i4 if (gnrng .le. peps) then - ipcnvg = 1_i4 + ipcnvg = 1_i4 end if end subroutine parstt - subroutine comp(ngs2,npg,a,af,b,bf) + subroutine comp(ngs2, npg, a, af, b, bf) ! ! This subroutine reduce ! input matrix a(n,ngs2*npg) to matrix b(n,ngs1*npg) and @@ -1566,16 +1561,16 @@ subroutine comp(ngs2,npg,a,af,b,bf) ! Number of complexes decreases from ngs2 to ngs1 ! Therefore, number of points in population decreases (npt+npg) to npt ! - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none - integer(i4), intent(in) :: ngs2 ! OLD number of complexes = ngs1+1 - integer(i4), intent(in) :: npg ! number of points in each complex - real(dp), dimension(:,:), intent(inout) :: a ! OLD points, ncols=n, nrows=ngs2*npg - real(dp), dimension(:), intent(inout) :: af ! OLD function values, nrows=ngs2*npg - real(dp), dimension(size(a,1),size(a,2)), intent(out) :: b ! NEW points, ncols=n, nrows=ngs1*npg=npt - real(dp), dimension(size(af)), intent(out) :: bf ! NEW function values, nrows=ngs1*npg=npt + integer(i4), intent(in) :: ngs2 ! OLD number of complexes = ngs1+1 + integer(i4), intent(in) :: npg ! number of points in each complex + real(dp), dimension(:, :), intent(inout) :: a ! OLD points, ncols=n, nrows=ngs2*npg + real(dp), dimension(:), intent(inout) :: af ! OLD function values, nrows=ngs2*npg + real(dp), dimension(size(a, 1), size(a, 2)), intent(out) :: b ! NEW points, ncols=n, nrows=ngs1*npg=npt + real(dp), dimension(size(af)), intent(out) :: bf ! NEW function values, nrows=ngs1*npg=npt ! ! local variables integer(i4) :: n ! cols: number of parameters: nopt @@ -1586,65 +1581,65 @@ subroutine comp(ngs2,npg,a,af,b,bf) integer(i4) :: ipg ! current new point in complex igs integer(i4) :: k1, k2 - n = size(a,dim=2) + n = size(a, dim = 2) ! NEW number of complexes ngs1 = ngs2 - 1 ! number of points in NEW population - npt = ngs1 * npg - - do igs=1, ngs1 - do ipg=1, npg - k1=(ipg-1)*ngs2 + igs - k2=(ipg-1)*ngs1 + igs - do i=1, n - b(k2,i) = a(k1,i) - end do - bf(k2) = af(k1) - end do + npt = ngs1 * npg + + do igs = 1, ngs1 + do ipg = 1, npg + k1 = (ipg - 1) * ngs2 + igs + k2 = (ipg - 1) * ngs1 + igs + do i = 1, n + b(k2, i) = a(k1, i) + end do + bf(k2) = af(k1) + end do end do ! - do j=1, npt - do i=1, n - a(j,i) = b(j,i) - end do - af(j) = bf(j) + do j = 1, npt + do i = 1, n + a(j, i) = b(j, i) + end do + af(j) = bf(j) end do ! end subroutine comp - subroutine sort_matrix(rb,ra) + subroutine sort_matrix(rb, ra) ! - use mo_kind, only: i4, dp - use mo_orderpack, only: sort_index + use mo_kind, only : i4, dp + use mo_orderpack, only : sort_index implicit none - real(dp), dimension(:), intent(inout) :: ra ! rows: number of points in population --> npt1 - real(dp), dimension(:,:), intent(inout) :: rb ! rows: number of points in population --> npt1 + real(dp), dimension(:), intent(inout) :: ra ! rows: number of points in population --> npt1 + real(dp), dimension(:, :), intent(inout) :: rb ! rows: number of points in population --> npt1 ! ! cols: number of parameters --> nn ! local variables - integer(i4) :: n ! number of points in population --> npt1 - integer(i4) :: m ! number of parameters --> nn - integer(i4) :: i - integer(i4), dimension(size(rb,1)) :: iwk + integer(i4) :: n ! number of points in population --> npt1 + integer(i4) :: m ! number of parameters --> nn + integer(i4) :: i + integer(i4), dimension(size(rb, 1)) :: iwk ! - n = size(rb,1) - m = size(rb,2) + n = size(rb, 1) + m = size(rb, 2) ! indexes of sorted reference vector - iwk(:) = sort_index(ra(1:n)) + iwk(:) = sort_index(ra(1 : n)) ! sort reference vector - ra(1:n) = ra(iwk) + ra(1 : n) = ra(iwk) ! sort each column of second array - do i=1, m - rb(1:n,i) = rb(iwk,i) + do i = 1, m + rb(1 : n, i) = rb(iwk, i) end do end subroutine sort_matrix - subroutine chkcst(x,bl,bu,mask,ibound) + subroutine chkcst(x, bl, bu, mask, ibound) ! ! This subroutine check if the trial point satisfies all ! constraints. @@ -1657,146 +1652,141 @@ subroutine chkcst(x,bl,bu,mask,ibound) ! ! Note: removed checking for implicit constraints (was anyway empty) ! - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none - real(dp), dimension(:), intent(in) :: x ! trial point dim=(nn) - real(dp), dimension(:), intent(in) :: bl ! lower bound dim=(nn) - real(dp), dimension(:), intent(in) :: bu ! upper bound dim=(nn) - logical, dimension(:), intent(in) :: mask ! parameter mask - integer(i4), intent(out) :: ibound ! violation indicator + real(dp), dimension(:), intent(in) :: x ! trial point dim=(nn) + real(dp), dimension(:), intent(in) :: bl ! lower bound dim=(nn) + real(dp), dimension(:), intent(in) :: bu ! upper bound dim=(nn) + logical, dimension(:), intent(in) :: mask ! parameter mask + integer(i4), intent(out) :: ibound ! violation indicator ! local variables integer(i4) :: ii integer(i4) :: nn ! ibound = 0_i4 - nn = size(x,1) - - do ii=1, nn - if (mask(ii)) then - if ( (x(ii) .lt. bl(ii)) .or. (x(ii) .gt. bu(ii)) ) then - ! This constraint is violated - ibound = 1_i4 - return - end if - end if + nn = size(x, 1) + + do ii = 1, nn + if (mask(ii)) then + if ((x(ii) .lt. bl(ii)) .or. (x(ii) .gt. bu(ii))) then + ! This constraint is violated + ibound = 1_i4 + return + end if + end if end do end subroutine chkcst - subroutine getpnt(idist,bl,bu,std,xi,mask,save_state,x) + subroutine getpnt(idist, bl, bu, std, xi, mask, save_state, x) ! ! This subroutine generates a new point within feasible region ! ! Note: checking of implicit constraints removed ! - use mo_kind, only: i4, i8, dp - use mo_xor4096, only: n_save_state, xor4096, xor4096g + use mo_kind, only : i4, i8, dp + use mo_xor4096, only : n_save_state, xor4096, xor4096g implicit none - integer(i4), intent(in) :: idist ! idist = probability flag + integer(i4), intent(in) :: idist ! idist = probability flag ! ! = 1 - uniform distribution ! ! = 2 - Gaussian distribution - real(dp), dimension(:), intent(in) :: bl ! lower bound - real(dp), dimension(:), intent(in) :: bu ! upper bound - real(dp), dimension(:), intent(in) :: std ! standard deviation of probability distribution - real(dp), dimension(:), intent(in) :: xi ! focal point - logical, dimension(:), intent(in) :: mask ! mask of parameters + real(dp), dimension(:), intent(in) :: bl ! lower bound + real(dp), dimension(:), intent(in) :: bu ! upper bound + real(dp), dimension(:), intent(in) :: std ! standard deviation of probability distribution + real(dp), dimension(:), intent(in) :: xi ! focal point + logical, dimension(:), intent(in) :: mask ! mask of parameters integer(i8), dimension(n_save_state), intent(inout) :: save_state ! save state of random number stream ! ! --> stream has to be according to idist - real(dp), dimension(size(xi,1)), intent(out) :: x ! new point + real(dp), dimension(size(xi, 1)), intent(out) :: x ! new point ! ! local variables integer(i4) :: nn ! number of parameters integer(i4) :: jj integer(i4) :: ibound ! 0=point in bound, 1=point out of bound - real(dp) :: rand + real(dp) :: rand ! - nn = size(xi,1) - do jj=1, nn - if (mask(jj)) then - ibound = 1 - do while (ibound .eq. 1) - if (idist .eq. 1) then - call xor4096(0_i8, rand, save_state=save_state) - x(jj) = bl(jj) + std(jj) * rand * (bu(jj) - bl(jj)) - end if - if (idist .eq. 2) then - call xor4096g(0_i8, rand, save_state=save_state) - x(jj) = xi(jj) + std(jj) * rand * (bu(jj) - bl(jj)) - end if - ! - ! Check explicit constraints - ! - call chkcst((/x(jj)/),(/bl(jj)/),(/bu(jj)/),(/mask(jj)/),ibound) - end do - else - x(jj) = xi(jj) - end if + nn = size(xi, 1) + do jj = 1, nn + if (mask(jj)) then + ibound = 1 + do while (ibound .eq. 1) + if (idist .eq. 1) then + call xor4096(0_i8, rand, save_state = save_state) + x(jj) = bl(jj) + std(jj) * rand * (bu(jj) - bl(jj)) + end if + if (idist .eq. 2) then + call xor4096g(0_i8, rand, save_state = save_state) + x(jj) = xi(jj) + std(jj) * rand * (bu(jj) - bl(jj)) + end if + ! + ! Check explicit constraints + ! + call chkcst((/x(jj)/), (/bl(jj)/), (/bu(jj)/), (/mask(jj)/), ibound) + end do + else + x(jj) = xi(jj) + end if end do end subroutine getpnt - subroutine cce(s,sf,bl,bu,maskpara,xnstd,icall,maxn,maxit,save_state_gauss, functn, & - alpha,beta,history,idot) + subroutine cce(s, sf, bl, bu, maskpara, xnstd, icall, maxn, maxit, save_state_gauss, functn, eval, & + alpha, beta, history, idot) ! ! algorithm generate a new point(s) from a sub-complex ! ! Note: new intent IN variables for flexible reflection & contraction: alpha, beta ! new intent INOUT variable for history of objective function values ! - use mo_kind, only: i4, i8, dp - use mo_xor4096, only: n_save_state - use iso_fortran_env, only: output_unit - use mo_utils, only: is_finite + use mo_kind, only : i4, i8, dp + use mo_xor4096, only : n_save_state + use iso_fortran_env, only : output_unit + use mo_utils, only : is_finite + use mo_optimization_utils, only : eval_interface, objective_interface implicit none - real(dp), dimension(:,:), intent(inout) :: s ! points in sub-complex, cols=nn, rows=nps - real(dp), dimension(:), intent(inout) :: sf ! objective function value of points in + real(dp), dimension(:, :), intent(inout) :: s ! points in sub-complex, cols=nn, rows=nps + real(dp), dimension(:), intent(inout) :: sf ! objective function value of points in ! ! sub-complex, rows=nps - real(dp), dimension(:), intent(in) :: bl ! lower bound per parameter - real(dp), dimension(:), intent(in) :: bu ! upper bound per parameter - logical, dimension(:), intent(in) :: maskpara ! mask of parameters - real(dp), dimension(:), intent(in) :: xnstd ! standard deviation of points in + real(dp), dimension(:), intent(in) :: bl ! lower bound per parameter + real(dp), dimension(:), intent(in) :: bu ! upper bound per parameter + logical, dimension(:), intent(in) :: maskpara ! mask of parameters + real(dp), dimension(:), intent(in) :: xnstd ! standard deviation of points in ! ! sub-complex per parameter - integer(i8), intent(inout) :: icall ! number of function evaluations - integer(i8), intent(in) :: maxn ! maximal number of function evaluations allowed - logical, intent(in) :: maxit ! minimization (true) or maximization (false) + integer(i8), intent(inout) :: icall ! number of function evaluations + integer(i8), intent(in) :: maxn ! maximal number of function evaluations allowed + logical, intent(in) :: maxit ! minimization (true) or maximization (false) integer(i8), dimension(n_save_state), intent(inout) :: save_state_gauss ! seed for random number generation - interface - function functn(paraset) - ! calculates the cost function at a certain parameter set paraset - use mo_kind - real(dp), dimension(:), intent(in) :: paraset - real(dp) :: functn - end function functn - end interface - real(dp), intent(in) :: alpha ! parameter for reflection steps - real(dp), intent(in) :: beta ! parameter for contraction steps - real(dp), dimension(maxn), intent(inout) :: history ! history of best function value - logical, intent(in) :: idot ! if true: progress report with '.' + procedure(objective_interface), intent(in), pointer :: functn + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp), intent(in) :: alpha ! parameter for reflection steps + real(dp), intent(in) :: beta ! parameter for contraction steps + real(dp), dimension(maxn), intent(inout) :: history ! history of best function value + logical, intent(in) :: idot ! if true: progress report with '.' ! ! local variables - integer(i4) :: nn ! number of parameters - integer(i4) :: nps ! number of points in a sub-complex - integer(i4) :: i, j - integer(i4) :: n ! nps = number of points in sub-complex - integer(i4) :: m ! nn = number of parameters - integer(i4) :: ibound ! ibound = flag indicating if constraints are violated + integer(i4) :: nn ! number of parameters + integer(i4) :: nps ! number of points in a sub-complex + integer(i4) :: i, j + integer(i4) :: n ! nps = number of points in sub-complex + integer(i4) :: m ! nn = number of parameters + integer(i4) :: ibound ! ibound = flag indicating if constraints are violated ! ! = 1 yes ! ! = 0 no - real(dp), dimension(size(s,2)) :: sw ! the worst point of the simplex - real(dp), dimension(size(s,2)) :: sb ! the best point of the simplex - real(dp), dimension(size(s,2)) :: ce ! the centroid of the simplex excluding wo - real(dp), dimension(size(s,2)) :: snew ! new point generated from the simplex - real(dp) :: fw ! function value of the worst point - real(dp) :: fnew ! function value of the new point - - nps = size(s,1) - nn = size(s,2) + real(dp), dimension(size(s, 2)) :: sw ! the worst point of the simplex + real(dp), dimension(size(s, 2)) :: sb ! the best point of the simplex + real(dp), dimension(size(s, 2)) :: ce ! the centroid of the simplex excluding wo + real(dp), dimension(size(s, 2)) :: snew ! new point generated from the simplex + real(dp) :: fw ! function value of the worst point + real(dp) :: fnew ! function value of the new point + + nps = size(s, 1) + nn = size(s, 2) ! ! equivalence of variables for readabilty of code n = nps @@ -1807,13 +1797,13 @@ end function functn ! compute step, the vector between wo and ce ! identify the worst function value fw do j = 1, m - sb(j) = s(1,j) - sw(j) = s(n,j) - ce(j) = 0.0_dp - do i = 1, n-1 - ce(j) = ce(j) + s(i,j) - end do - ce(j) = ce(j)/real(n-1,dp) + sb(j) = s(1, j) + sw(j) = s(n, j) + ce(j) = 0.0_dp + do i = 1, n - 1 + ce(j) = ce(j) + s(i, j) + end do + ce(j) = ce(j) / real(n - 1, dp) end do fw = sf(n) ! @@ -1821,34 +1811,34 @@ end function functn ! ! first try a reflection step do j = 1, m - if (maskpara(j)) then - snew(j) = ce(j) + alpha * (ce(j) - sw(j)) - else - snew(j) = s(1,j) - end if + if (maskpara(j)) then + snew(j) = ce(j) + alpha * (ce(j) - sw(j)) + else + snew(j) = s(1, j) + end if end do ! ! check if snew satisfies all constraints - call chkcst(snew(1:nn),bl(1:nn),bu(1:nn),maskpara(1:nn),ibound) + call chkcst(snew(1 : nn), bl(1 : nn), bu(1 : nn), maskpara(1 : nn), ibound) ! ! snew is outside the bound, ! choose a point at random within feasible region according to ! a normal distribution with best point of the sub-complex ! as mean and standard deviation of the population as std if (ibound .eq. 1) then - call getpnt(2,bl(1:nn),bu(1:nn),xnstd(1:nn),sb(1:nn),maskpara(1:nn),save_state_gauss,snew) + call getpnt(2, bl(1 : nn), bu(1 : nn), xnstd(1 : nn), sb(1 : nn), maskpara(1 : nn), save_state_gauss, snew) end if ! ! compute the function value at snew - if (idot) write(output_unit,'(A1)') '.' + if (idot) write(output_unit, '(A1)') '.' if (.not. maxit) then - fnew = functn(snew) - icall = icall + 1_i8 - history(icall) = min(history(icall-1),fnew) + fnew = functn(snew, eval) + icall = icall + 1_i8 + history(icall) = min(history(icall - 1), fnew) else - fnew = -functn(snew) - icall = icall + 1_i8 - history(icall) = max(history(icall-1),-fnew) + fnew = -functn(snew, eval) + icall = icall + 1_i8 + history(icall) = max(history(icall - 1), -fnew) end if ! ! maximum numbers of function evaluations reached @@ -1857,65 +1847,65 @@ end function functn ! compare fnew with the worst function value fw ! fnew is greater than fw, so try a contraction step if ((fnew .gt. fw) .or. (.not. is_finite(fnew))) then - do j = 1, m - if (maskpara(j)) then - snew(j) = ce(j) - beta * (ce(j) - sw(j)) - else - snew(j) = s(1,j) - end if - end do - ! - ! compute the function value of the contracted point - if (idot) write(output_unit,'(A1)') '.' - if (.not. maxit) then - fnew = functn(snew) + do j = 1, m + if (maskpara(j)) then + snew(j) = ce(j) - beta * (ce(j) - sw(j)) + else + snew(j) = s(1, j) + end if + end do + ! + ! compute the function value of the contracted point + if (idot) write(output_unit, '(A1)') '.' + if (.not. maxit) then + fnew = functn(snew, eval) + icall = icall + 1_i8 + history(icall) = min(history(icall - 1), fnew) + else + fnew = -functn(snew, eval) + icall = icall + 1_i8 + history(icall) = max(history(icall - 1), -fnew) + end if + ! + ! maximum numbers of function evaluations reached + if (icall .ge. maxn) return + ! + ! compare fnew to the worst value fw + ! if fnew is less than or equal to fw, then accept the point and return + if ((fnew .gt. fw) .or. (.not. is_finite(fnew))) then + ! + ! if both reflection and contraction fail, choose another point + ! according to a normal distribution with best point of the sub-complex + ! as mean and standard deviation of the population as std + call getpnt(2, bl(1 : nn), bu(1 : nn), xnstd(1 : nn), sb(1 : nn), maskpara(1 : nn), save_state_gauss, snew) + ! + ! compute the function value at the random point + if (idot) write(output_unit, '(A1)') '.' + if (.not. maxit) then + fnew = functn(snew, eval) icall = icall + 1_i8 - history(icall) = min(history(icall-1),fnew) - else - fnew = -functn(snew) + history(icall) = min(history(icall - 1), fnew) + else + fnew = -functn(snew, eval) icall = icall + 1_i8 - history(icall) = max(history(icall-1),-fnew) - end if - ! - ! maximum numbers of function evaluations reached - if (icall .ge. maxn) return - ! - ! compare fnew to the worst value fw - ! if fnew is less than or equal to fw, then accept the point and return - if ((fnew .gt. fw) .or. (.not. is_finite(fnew))) then - ! - ! if both reflection and contraction fail, choose another point - ! according to a normal distribution with best point of the sub-complex - ! as mean and standard deviation of the population as std - call getpnt(2,bl(1:nn),bu(1:nn),xnstd(1:nn),sb(1:nn),maskpara(1:nn),save_state_gauss,snew) - ! - ! compute the function value at the random point - if (idot) write(output_unit,'(A1)') '.' - if (.not. maxit) then - fnew = functn(snew) - icall = icall + 1_i8 - history(icall) = min(history(icall-1),fnew) - else - fnew = -functn(snew) - icall = icall + 1_i8 - history(icall) = max(history(icall-1),-fnew) - end if - ! - ! maximum numbers of function evaluations reached - if (icall .ge. maxn) return - ! - ! successful mutation - ! replace the worst point by the new point - do j = 1, m - s(n,j) = snew(j) - end do - sf(n) = fnew - end if + history(icall) = max(history(icall - 1), -fnew) + end if + ! + ! maximum numbers of function evaluations reached + if (icall .ge. maxn) return + ! + ! successful mutation + ! replace the worst point by the new point + do j = 1, m + s(n, j) = snew(j) + end do + sf(n) = fnew + end if end if ! ! replace the worst point by the new point do j = 1, m - s(n,j) = snew(j) + s(n, j) = snew(j) end do sf(n) = fnew diff --git a/src/lib/mo_spatialsimilarity.f90 b/src/lib/mo_spatialsimilarity.f90 index 7e25c891..ea08b3d9 100644 --- a/src/lib/mo_spatialsimilarity.f90 +++ b/src/lib/mo_spatialsimilarity.f90 @@ -24,7 +24,7 @@ MODULE mo_spatialsimilarity ! Copyright 2012-2015 Matthias Zink and Juliane Mai - USE mo_kind, ONLY: i4, sp, dp + USE mo_kind, ONLY : i4, sp, dp IMPLICIT NONE @@ -70,7 +70,7 @@ MODULE mo_spatialsimilarity !> | 4-1, 5-3, 2-2 | | 3, 2, 0 | !> | 0-3, 5-0, 0-3 | | 3, 5, 3 | !> - !> DISSIMILAR / VALID NEIGH CELLS + !> DISSIMILAR / VALID NEIGH CELLS !> NNDVMatrix / VALID NEIGH CELLS = | 2, 4, 3 | / | 3, 5, 3 | !> | 3, 2, 0 | | 5, 8, 5 | !> | 3, 5, 3 | | 3, 5, 3 | @@ -87,7 +87,7 @@ MODULE mo_spatialsimilarity ! CALLING SEQUENCE ! out = NNDV(mat1, mat2, mask=mask, valid=valid) - + ! INDENT(IN) !> \param[in] "real(sp/dp), dimension(:,:) :: mat1" 2D-array with input numbers !> \param[in] "real(sp/dp), dimension(:,:) :: mat2" 2D-array with input numbers @@ -109,10 +109,10 @@ MODULE mo_spatialsimilarity !> \param[out] "logical :: valid" indicates if the function could determine a valid value !> result can be unvalid if entire mask is .false. for ex. !> in this case PatternDissim is set to 0 (worst case) - + ! RETURN !> \return real(sp/dp) :: NNDV — Number of neighboring dominating values - + ! RESTRICTIONS ! Input values must be floating points. @@ -121,7 +121,7 @@ MODULE mo_spatialsimilarity ! mat2 = reshape(/ 1., 2, 3., -999., 5., 6. /, (/3,3/)) ! out = NNDV(mat1, mat2, mask=(mat1 >= 0. .and. mat2 >= 0.)) ! -> see also example in test directory - + ! LITERATURE !> \note routine based on algorithm by Luis Samaniego 2009 @@ -129,8 +129,8 @@ MODULE mo_spatialsimilarity !> \author Matthias Zink !> \date Nov 2012 ! update May 2015 created documentation - INTERFACE NNDV - MODULE PROCEDURE NNDV_sp, NNDV_dp + INTERFACE NNDV + MODULE PROCEDURE NNDV_sp, NNDV_dp END INTERFACE NNDV ! ------------------------------------------------------------------ @@ -153,7 +153,7 @@ MODULE mo_spatialsimilarity !> the values for PD is [0..1]. In which 1 indicates full agreement and 0 full dismatching. !> !>
- !>            EXAMPLE:\n
+  !>            EXAMPLE:\n
   !>            mat1 =  | 12 17  1 | , mat2 = |  7  9 12 | 
   !>                    |  4 10 11 |          | 12 11 11 | 
   !>                    | 15  2 20 |          |  5 13  7 |
@@ -187,7 +187,7 @@ MODULE mo_spatialsimilarity
 
   !     CALLING SEQUENCE
   !         out = PD(mat1, mat2, mask=mask, valid=valid)
-  
+
   !     INDENT(IN)
   !>        \param[in] "real(sp/dp), dimension(:,:) :: mat1" 2D-array with input numbers
   !>        \param[in] "real(sp/dp), dimension(:,:) :: mat2" 2D-array with input numbers
@@ -212,7 +212,7 @@ MODULE mo_spatialsimilarity
 
   !     RETURN
   !>        \return real(sp/dp) :: PD — pattern dissimilarity measure 
-  
+
   !     RESTRICTIONS
   !         Input values must be floating points.
 
@@ -228,43 +228,43 @@ MODULE mo_spatialsimilarity
   !     HISTORY
   !>         \author Matthias Zink and Juliane Mai
   !>         \date   Jan 2013
-  INTERFACE PD                  
-     MODULE PROCEDURE PD_sp, PD_dp
+  INTERFACE PD
+    MODULE PROCEDURE PD_sp, PD_dp
   END INTERFACE PD
 
   ! ------------------------------------------------------------------
 
 CONTAINS
-  
+
   FUNCTION NNDV_sp(mat1, mat2, mask, valid)
 
     IMPLICIT NONE
 
-    REAL(sp),    DIMENSION(:,:),                                            INTENT(IN)  :: mat1, mat2
-    LOGICAL,     DIMENSION(:,:),                                  OPTIONAL, INTENT(IN)  :: mask
-    LOGICAL,                                                      OPTIONAL, INTENT(OUT) :: valid
-    REAL(sp)                                                                            :: NNDV_sp
+    REAL(sp), DIMENSION(:, :), INTENT(IN) :: mat1, mat2
+    LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask
+    LOGICAL, OPTIONAL, INTENT(OUT) :: valid
+    REAL(sp) :: NNDV_sp
 
-    INTEGER(i4)                                                                         :: iCo, iRo
-    INTEGER(i4)                                                                         :: noValidPixels
-    INTEGER(i4), DIMENSION(size(shape(mat1)) )                                          :: shapemask
-    INTEGER(i4), DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validcount
-    REAL(sp),    DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: bufferedMat1, bufferedMat2
-    REAL(sp)   , DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: NNDVMatrix              
-    LOGICAL,     DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: maske
-    LOGICAL,     DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validmaske
+    INTEGER(i4) :: iCo, iRo
+    INTEGER(i4) :: noValidPixels
+    INTEGER(i4), DIMENSION(size(shape(mat1))) :: shapemask
+    INTEGER(i4), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
+    REAL(sp), DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
+    REAL(sp), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: NNDVMatrix
+    LOGICAL, DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
+    LOGICAL, DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
 
     ! check if input has all the same dimensions
     if (present(mask)) then
-       shapemask = shape(mask)
+      shapemask = shape(mask)
     else
-       shapemask = shape(mat1)
+      shapemask = shape(mat1)
     end if
     !
     if (any(shape(mat1) .NE. shape(mat2)))  &
-         stop 'NNDV_sp: shapes of input matrix 1 and input matrix 2 are not matching'
+            stop 'NNDV_sp: shapes of input matrix 1 and input matrix 2 are not matching'
     if (any(shape(mat1) .NE. shapemask))    &
-         stop 'NNDV_sp: shapes of input matrices and mask are not matching'
+            stop 'NNDV_sp: shapes of input matrices and mask are not matching'
     !
     ! additional 2 rows and 2 cols added for checking the border cells without crashing the search agorithm
     ! so the search windows can always cover 9 cells even if it is checking a border cell
@@ -274,83 +274,83 @@ FUNCTION NNDV_sp(mat1, mat2, mask, valid)
     ! initialize mask with default=.false.
     maske = .false.
     if (present(mask)) then
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = mask
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = mask
     else
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = .true.
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = .true.
     end if
     !
     ! initialize bufferedMat1 & bufferedMat2 
     bufferedMat1 = 0.0_sp
     bufferedMat2 = 0.0_sp
-    bufferedMat1(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat1
-    bufferedMat2(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat2
+    bufferedMat1(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat1
+    bufferedMat2(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat2
     !
     ! initialize NNDV
     NNDVMatrix = 0.0_sp
     !
     NNDV_sp = 0.0_sp
-    do iCo = 2_i4, size(bufferedMat1, dim=2) - 1
-       do iRo = 2_i4, size(bufferedMat1, dim=1) - 1
-          if (.NOT. maske(iRo,iCo)) cycle
-          NNDVMatrix(iRo-1_i4,iCo-1_i4) =   &
-               real(    &
-                  abs(  &
-                     count((bufferedMat1(iRo-1:iRo+1 , iCo-1:iCo+1) - bufferedMat1(iRo,iCo) > epsilon(0.0_sp)) .AND. &
-                           (maske(iRo-1:iRo+1 , iCo-1:iCo+1))) -                                                     &
-                     count((bufferedMat2(iRo-1:iRo+1 , iCo-1:iCo+1) - bufferedMat2(iRo,iCo) > epsilon(0.0_sp)) .AND. &
-                           (maske(iRo-1:iRo+1 , iCo-1:iCo+1)))                                                       &
-                  ),    &
-               sp)
-          ! count - 1 to exclude referendce cell (iRo, iCo)
-          validcount(iRo-1_i4,iCo-1_i4) = count(maske(iRo-1_i4:iRo+1_i4 , iCo-1_i4:iCo+1_i4)) - 1_i4
-        end do
+    do iCo = 2_i4, size(bufferedMat1, dim = 2) - 1
+      do iRo = 2_i4, size(bufferedMat1, dim = 1) - 1
+        if (.NOT. maske(iRo, iCo)) cycle
+        NNDVMatrix(iRo - 1_i4, iCo - 1_i4) = &
+                real(abs(count((bufferedMat1(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) &
+                               - bufferedMat1(iRo, iCo) > epsilon(0.0_sp)) .AND. &
+                               (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) - &
+                         count((bufferedMat2(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) &
+                               - bufferedMat2(iRo, iCo) > epsilon(0.0_sp)) .AND. &
+                               (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) &
+                        ), &
+                     sp)
+        ! count - 1 to exclude referendce cell (iRo, iCo)
+        validcount(iRo - 1_i4, iCo - 1_i4) = count(maske(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4)) - 1_i4
+      end do
     end do
     !
     ! normalize every pixel to number of valid neighbouring cells (defined by maske) [0..8] --> [0..1]
-    validmaske = (maske(2:size(maske, dim=1) - 1_i4, 2:size(maske, dim=2) - 1_i4) .and. (validcount > 0_i4))
+    validmaske = (maske(2 : size(maske, dim = 1) - 1_i4, 2 : size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
     noValidPixels = count(validmaske)
     if (noValidPixels .GT. 0_i4) then
-       NNDVMatrix = merge(NNDVMatrix/real(validcount, sp),NNDVMatrix, validmaske)
-       ! average over all pixels
-       NNDV_sp = 1.0_sp - sum(NNDVMatrix, mask=validmaske) / noValidPixels
-       if (present(valid)) valid = .TRUE.
-    ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
+      NNDVMatrix = merge(NNDVMatrix / real(validcount, sp), NNDVMatrix, validmaske)
+      ! average over all pixels
+      NNDV_sp = 1.0_sp - sum(NNDVMatrix, mask = validmaske) / noValidPixels
+      if (present(valid)) valid = .TRUE.
+      ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
     else
-       NNDV_sp = 0.0_sp
-       if (present(valid)) valid = .FALSE.
+      NNDV_sp = 0.0_sp
+      if (present(valid)) valid = .FALSE.
     end if
     !
   END FUNCTION NNDV_sp
 
- FUNCTION NNDV_dp(mat1, mat2, mask, valid)
+  FUNCTION NNDV_dp(mat1, mat2, mask, valid)
 
     IMPLICIT NONE
 
-    REAL(dp),    DIMENSION(:,:),                                            INTENT(IN)  :: mat1, mat2
-    LOGICAL,     DIMENSION(:,:),                                  OPTIONAL, INTENT(IN)  :: mask
-    LOGICAL,                                                      OPTIONAL, INTENT(OUT) :: valid
-    REAL(dp)                                                                            :: NNDV_dp
+    REAL(dp), DIMENSION(:, :), INTENT(IN) :: mat1, mat2
+    LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask
+    LOGICAL, OPTIONAL, INTENT(OUT) :: valid
+    REAL(dp) :: NNDV_dp
 
-    INTEGER(i4)                                                                         :: iCo, iRo
-    INTEGER(i4)                                                                         :: noValidPixels
-    INTEGER(i4), DIMENSION(size(shape(mat1)) )                                          :: shapemask
-    INTEGER(i4), DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validcount
-    REAL(dp),    DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: bufferedMat1, bufferedMat2
-    REAL(dp)   , DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: NNDVMatrix              
-    LOGICAL,     DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: maske
-    LOGICAL,     DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validmaske
+    INTEGER(i4) :: iCo, iRo
+    INTEGER(i4) :: noValidPixels
+    INTEGER(i4), DIMENSION(size(shape(mat1))) :: shapemask
+    INTEGER(i4), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
+    REAL(dp), DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
+    REAL(dp), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: NNDVMatrix
+    LOGICAL, DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
+    LOGICAL, DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
 
     ! check if input has all the same dimensions
     if (present(mask)) then
-       shapemask = shape(mask)
+      shapemask = shape(mask)
     else
-       shapemask = shape(mat1)
+      shapemask = shape(mat1)
     end if
     !
     if (any(shape(mat1) .NE. shape(mat2)))  &
-         stop 'NNDV_dp: shapes of input matrix 1 and input matrix 2 are not matching'
+            stop 'NNDV_dp: shapes of input matrix 1 and input matrix 2 are not matching'
     if (any(shape(mat1) .NE. shapemask))    &
-         stop 'NNDV_dp: shapes of input matrices and mask are not matching'
+            stop 'NNDV_dp: shapes of input matrices and mask are not matching'
     !
     ! additional 2 rows and 2 cols added for checking the border cells without crashing the search agorithm
     ! so the search windows can always cover 9 cells even if it is checking a border cell
@@ -360,50 +360,50 @@ FUNCTION NNDV_dp(mat1, mat2, mask, valid)
     ! initialize mask with default=.false.
     maske = .false.
     if (present(mask)) then
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = mask
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = mask
     else
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = .true.
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = .true.
     end if
     !
     ! initialize bufferedMat1 & bufferedMat2 
     bufferedMat1 = 0.0_dp
     bufferedMat2 = 0.0_dp
-    bufferedMat1(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat1
-    bufferedMat2(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat2
+    bufferedMat1(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat1
+    bufferedMat2(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat2
     !
     ! initialize NNDV
     NNDVMatrix = 0.0_dp
     !
     NNDV_dp = 0.0_dp
-    do iCo = 2_i4, size(bufferedMat1, dim=2) - 1
-       do iRo = 2_i4, size(bufferedMat1, dim=1) - 1
-          if (.NOT. maske(iRo,iCo)) cycle
-          NNDVMatrix(iRo-1_i4,iCo-1_i4) =   &
-               real(    &
-                  abs(  &
-                     count((bufferedMat1(iRo-1:iRo+1 , iCo-1:iCo+1) - bufferedMat1(iRo,iCo) > epsilon(0.0_dp)) .AND. &
-                           (maske(iRo-1:iRo+1 , iCo-1:iCo+1))) -                                                     &
-                     count((bufferedMat2(iRo-1:iRo+1 , iCo-1:iCo+1) - bufferedMat2(iRo,iCo) > epsilon(0.0_dp)) .AND. &
-                           (maske(iRo-1:iRo+1 , iCo-1:iCo+1)))                                                       &
-                  ),    &
-               dp)
-          ! count - 1 to exclude referendce cell (iRo, iCo)
-          validcount(iRo-1_i4,iCo-1_i4) = count(maske(iRo-1_i4:iRo+1_i4 , iCo-1_i4:iCo+1_i4)) - 1_i4
-        end do
+    do iCo = 2_i4, size(bufferedMat1, dim = 2) - 1
+      do iRo = 2_i4, size(bufferedMat1, dim = 1) - 1
+        if (.NOT. maske(iRo, iCo)) cycle
+        NNDVMatrix(iRo - 1_i4, iCo - 1_i4) = &
+                real(abs(count((bufferedMat1(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) - &
+                                bufferedMat1(iRo, iCo) > epsilon(0.0_dp)) .AND. &
+                               (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) - &
+                         count((bufferedMat2(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1) - &
+                                bufferedMat2(iRo, iCo) > epsilon(0.0_dp)) .AND. &
+                               (maske(iRo - 1 : iRo + 1, iCo - 1 : iCo + 1))) &
+                        ), &
+                     dp)
+        ! count - 1 to exclude referendce cell (iRo, iCo)
+        validcount(iRo - 1_i4, iCo - 1_i4) = count(maske(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4)) - 1_i4
+      end do
     end do
     !
     ! normalize every pixel to number of valid neighbouring cells (defined by maske) [0..8] --> [0..1]
-    validmaske = (maske(2:size(maske, dim=1) - 1_i4, 2:size(maske, dim=2) - 1_i4) .and. (validcount > 0_i4))
+    validmaske = (maske(2 : size(maske, dim = 1) - 1_i4, 2 : size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
     noValidPixels = count(validmaske)
     if (noValidPixels .GT. 0_i4) then
-       NNDVMatrix = merge(NNDVMatrix/real(validcount, dp),NNDVMatrix, validmaske)
-       ! average over all pixels
-       NNDV_dp = 1.0_dp - sum(NNDVMatrix, mask=validmaske) / noValidPixels
-       if (present(valid)) valid = .TRUE.
-    ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
+      NNDVMatrix = merge(NNDVMatrix / real(validcount, dp), NNDVMatrix, validmaske)
+      ! average over all pixels
+      NNDV_dp = 1.0_dp - sum(NNDVMatrix, mask = validmaske) / noValidPixels
+      if (present(valid)) valid = .TRUE.
+      ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
     else
-       NNDV_dp = 0.0_dp
-       if (present(valid)) valid = .FALSE.
+      NNDV_dp = 0.0_dp
+      if (present(valid)) valid = .FALSE.
     end if
     !
   END FUNCTION NNDV_dp
@@ -414,30 +414,30 @@ FUNCTION PD_sp(mat1, mat2, mask, valid)
 
     IMPLICIT NONE
 
-    REAL(sp),    DIMENSION(:,:),                                            INTENT(IN)  :: mat1, mat2
-    LOGICAL,     DIMENSION(:,:)                                 , OPTIONAL, INTENT(IN)  :: mask
-    LOGICAL,                                                      OPTIONAL, INTENT(OUT) :: valid
-    REAL(sp)                                                                            :: PD_sp
-
-    INTEGER(i4)                                                                         :: iCo, iRo
-    INTEGER(i4)                                                                         :: noValidPixels
-    INTEGER(i4), DIMENSION(size(shape(mat1)) )                                          :: shapemask
-    INTEGER(i4), DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validcount
-    REAL(sp),    DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: bufferedMat1, bufferedMat2
-    REAL(sp),    DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: PDMatrix
-    LOGICAL,     DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: maske
-    LOGICAL,     DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validmaske
+    REAL(sp), DIMENSION(:, :), INTENT(IN) :: mat1, mat2
+    LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask
+    LOGICAL, OPTIONAL, INTENT(OUT) :: valid
+    REAL(sp) :: PD_sp
+
+    INTEGER(i4) :: iCo, iRo
+    INTEGER(i4) :: noValidPixels
+    INTEGER(i4), DIMENSION(size(shape(mat1))) :: shapemask
+    INTEGER(i4), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
+    REAL(sp), DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
+    REAL(sp), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: PDMatrix
+    LOGICAL, DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
+    LOGICAL, DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
     ! check if input has all the same dimensions
     if (present(mask)) then
-       shapemask = shape(mask)
+      shapemask = shape(mask)
     else
-       shapemask = shape(mat1)
+      shapemask = shape(mat1)
     end if
     !
     if (any(shape(mat1) .NE. shape(mat2)))  &
-         stop 'PD_sp: shapes of input matrix 1 and input matrix 2 are not matching'
+            stop 'PD_sp: shapes of input matrix 1 and input matrix 2 are not matching'
     if (any(shape(mat1) .NE. shapemask))    &
-         stop 'PD_sp: shapes of input matrices and mask are not matching'
+            stop 'PD_sp: shapes of input matrices and mask are not matching'
     !
     ! additional 2 rows and 2 cols added for checking the border cells without crashing the search agorithm
     ! so the search windows can always cover 9 cells even if it is checking a border cell
@@ -447,58 +447,56 @@ FUNCTION PD_sp(mat1, mat2, mask, valid)
     ! initialize mask with default=.false.
     maske = .false.
     if (present(mask)) then
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = mask
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = mask
     else
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = .true.
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = .true.
     end if
     !
     ! initialize bufferedMat1 & bufferedMat2 
     bufferedMat1 = 0.0_sp
     bufferedMat2 = 0.0_sp
-    bufferedMat1(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat1
-    bufferedMat2(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat2
+    bufferedMat1(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat1
+    bufferedMat2(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat2
     !
     ! initialize PD
     PDMatrix = 0.0_sp
-    do iCo = 2_i4, size(bufferedMat1, dim=2)-1_i4
-       do iRo = 2_i4, size(bufferedMat1, dim=1)-1_i4
-          ! no calculation at unmasked values
-          if (.NOT. maske(iRo,iCo)) cycle
-          ! .NEQV. is the fortran standard for .XOR. 
-          ! result is written to -1 column and row because of buffer
-          PDMatrix(iRo-1_i4,iCo-1_i4) = &
-            real( &   
-              count( & 
-                     ( &
+    do iCo = 2_i4, size(bufferedMat1, dim = 2) - 1_i4
+      do iRo = 2_i4, size(bufferedMat1, dim = 1) - 1_i4
+        ! no calculation at unmasked values
+        if (.NOT. maske(iRo, iCo)) cycle
+        ! .NEQV. is the fortran standard for .XOR.
+        ! result is written to -1 column and row because of buffer
+        PDMatrix(iRo - 1_i4, iCo - 1_i4) = &
+                real(count(( &
                         ! determine higher neighbouring values in mat1
-                        (bufferedMat1(iRo-1_i4:iRo+1_i4, iCo-1_i4:iCo+1_i4) -                         &
-                         bufferedMat1(iRo,iCo)                              > epsilon(0.0_sp)) .NEQV. &
-                        ! determine higher neighbouring values in mat2                                &
-                        (bufferedMat2(iRo-1_i4:iRo+1_i4, iCo-1_i4:iCo+1_i4) -                         &
-                         bufferedMat2(iRo,iCo)                              > epsilon(0.0_sp))        &
-                     ) &
-                  ! exclude unmasked values
-                  .and. (maske(iRo-1_i4:iRo+1_i4 , iCo-1_i4:iCo+1_i4)) &
-                  ), &
-            sp )
-          ! count - 1 to exclude reference cell / center pixel (iRo, iCo)
-          validcount(iRo-1_i4,iCo-1_i4) = count(maske(iRo-1_i4:iRo+1_i4 , iCo-1_i4:iCo+1_i4)) - 1_i4
-          !
-       end do
+                        (bufferedMat1(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4) - &
+                         bufferedMat1(iRo, iCo) > epsilon(0.0_sp)) .NEQV. &
+                        ! determine higher neighbouring values in mat2
+                        (bufferedMat2(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4) - &
+                         bufferedMat2(iRo, iCo) > epsilon(0.0_sp)) &
+                           ) &
+                          ! exclude unmasked values
+                          .and. (maske(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4)) &
+                          ), &
+                     sp)
+        ! count - 1 to exclude reference cell / center pixel (iRo, iCo)
+        validcount(iRo - 1_i4, iCo - 1_i4) = count(maske(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4)) - 1_i4
+        !
+      end do
     end do
     !
     ! normalize every pixel to number of valid neighbouring cells (defined by maske) [0..8] --> [0..1]
-    validmaske = (maske(2:size(maske, dim=1) - 1_i4, 2:size(maske, dim=2) - 1_i4) .and. (validcount > 0_i4))
+    validmaske = (maske(2 : size(maske, dim = 1) - 1_i4, 2 : size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
     noValidPixels = count(validmaske)
     if (noValidPixels .GT. 0_i4) then
-       PDMatrix = merge(PDMatrix/real(validcount, sp),PDMatrix, validmaske)
-       ! average over all pixels
-       PD_sp = 1.0_sp - sum(PDMatrix, mask=validmaske) / noValidPixels
-       if (present(valid)) valid = .TRUE.
-    ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
+      PDMatrix = merge(PDMatrix / real(validcount, sp), PDMatrix, validmaske)
+      ! average over all pixels
+      PD_sp = 1.0_sp - sum(PDMatrix, mask = validmaske) / noValidPixels
+      if (present(valid)) valid = .TRUE.
+      ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
     else
-       PD_sp = 0.0_sp
-       if (present(valid)) valid = .FALSE.
+      PD_sp = 0.0_sp
+      if (present(valid)) valid = .FALSE.
     end if
     !
   END FUNCTION PD_sp
@@ -507,30 +505,30 @@ FUNCTION PD_dp(mat1, mat2, mask, valid)
 
     IMPLICIT NONE
 
-    REAL(dp),    DIMENSION(:,:),                                            INTENT(IN)  :: mat1, mat2
-    LOGICAL,     DIMENSION(:,:)                                 , OPTIONAL, INTENT(IN)  :: mask
-    LOGICAL,                                                      OPTIONAL, INTENT(OUT) :: valid
-    REAL(dp)                                                                            :: PD_dp
-
-    INTEGER(i4)                                                                         :: iCo, iRo
-    INTEGER(i4)                                                                         :: noValidPixels
-    INTEGER(i4), DIMENSION(size(shape(mat1)) )                                          :: shapemask
-    INTEGER(i4), DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validcount
-    REAL(dp),    DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: bufferedMat1, bufferedMat2
-    REAL(dp),    DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: PDMatrix
-    LOGICAL,     DIMENSION(size(mat1, dim=1)+2_i4, size(mat1, dim=2)+2_i4)              :: maske
-    LOGICAL,     DIMENSION(size(mat1, dim=1), size(mat1, dim=2))                        :: validmaske
+    REAL(dp), DIMENSION(:, :), INTENT(IN) :: mat1, mat2
+    LOGICAL, DIMENSION(:, :), OPTIONAL, INTENT(IN) :: mask
+    LOGICAL, OPTIONAL, INTENT(OUT) :: valid
+    REAL(dp) :: PD_dp
+
+    INTEGER(i4) :: iCo, iRo
+    INTEGER(i4) :: noValidPixels
+    INTEGER(i4), DIMENSION(size(shape(mat1))) :: shapemask
+    INTEGER(i4), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validcount
+    REAL(dp), DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: bufferedMat1, bufferedMat2
+    REAL(dp), DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: PDMatrix
+    LOGICAL, DIMENSION(size(mat1, dim = 1) + 2_i4, size(mat1, dim = 2) + 2_i4) :: maske
+    LOGICAL, DIMENSION(size(mat1, dim = 1), size(mat1, dim = 2)) :: validmaske
     ! check if input has all the same dimensions
     if (present(mask)) then
-       shapemask = shape(mask)
+      shapemask = shape(mask)
     else
-       shapemask = shape(mat1)
+      shapemask = shape(mat1)
     end if
     !
     if (any(shape(mat1) .NE. shape(mat2)))  &
-         stop 'PD_dp: shapes of input matrix 1 and input matrix 2 are not matching'
+            stop 'PD_dp: shapes of input matrix 1 and input matrix 2 are not matching'
     if (any(shape(mat1) .NE. shapemask))    &
-         stop 'PD_dp: shapes of input matrices and mask are not matching'
+            stop 'PD_dp: shapes of input matrices and mask are not matching'
     !
     ! additional 2 rows and 2 cols added for checking the border cells without crashing the search agorithm
     ! so the search windows can always cover 9 cells even if it is checking a border cell
@@ -540,58 +538,56 @@ FUNCTION PD_dp(mat1, mat2, mask, valid)
     ! initialize mask with default=.false.
     maske = .false.
     if (present(mask)) then
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = mask
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = mask
     else
-       maske(2:(size(maske,dim=1)-1_i4), 2:(size(maske,dim=2)-1_i4)) = .true.
+      maske(2 : (size(maske, dim = 1) - 1_i4), 2 : (size(maske, dim = 2) - 1_i4)) = .true.
     end if
     !
     ! initialize bufferedMat1 & bufferedMat2 
     bufferedMat1 = 0.0_dp
     bufferedMat2 = 0.0_dp
-    bufferedMat1(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat1
-    bufferedMat2(2:(size(maske,dim=1)-1), 2:(size(maske,dim=2)-1)) = mat2
+    bufferedMat1(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat1
+    bufferedMat2(2 : (size(maske, dim = 1) - 1), 2 : (size(maske, dim = 2) - 1)) = mat2
     !
     ! initialize PD
     PDMatrix = 0.0_dp
-    do iCo = 2_i4, size(bufferedMat1, dim=2)-1_i4
-       do iRo = 2_i4, size(bufferedMat1, dim=1)-1_i4
-          ! no calculation at unmasked values
-          if (.NOT. maske(iRo,iCo)) cycle
-          ! .NEQV. is the fortran standard for .XOR. 
-          ! result is written to -1 column and row because of buffer
-          PDMatrix(iRo-1_i4,iCo-1_i4) = &
-            real( &   
-              count( & 
-                     ( &
+    do iCo = 2_i4, size(bufferedMat1, dim = 2) - 1_i4
+      do iRo = 2_i4, size(bufferedMat1, dim = 1) - 1_i4
+        ! no calculation at unmasked values
+        if (.NOT. maske(iRo, iCo)) cycle
+        ! .NEQV. is the fortran standard for .XOR.
+        ! result is written to -1 column and row because of buffer
+        PDMatrix(iRo - 1_i4, iCo - 1_i4) = &
+                real(count(( &
                         ! determine higher neighbouring values in mat1
-                        (bufferedMat1(iRo-1_i4:iRo+1_i4, iCo-1_i4:iCo+1_i4) -                         &
-                         bufferedMat1(iRo,iCo)                              > epsilon(0.0_dp)) .NEQV. &
-                        ! determine higher neighbouring values in mat2                                &
-                        (bufferedMat2(iRo-1_i4:iRo+1_i4, iCo-1_i4:iCo+1_i4) -                         &
-                         bufferedMat2(iRo,iCo)                              > epsilon(0.0_dp))        &
-                     ) &
-                  ! exclude unmasked values
-                  .and. (maske(iRo-1_i4:iRo+1_i4 , iCo-1_i4:iCo+1_i4)) &
-                  ), &
-            dp )
-          ! count - 1 to exclude referendce cell (iRo, iCo)
-          validcount(iRo-1_i4,iCo-1_i4) = count(maske(iRo-1_i4:iRo+1_i4 , iCo-1_i4:iCo+1_i4)) - 1_i4
-          !
-       end do
+                        (bufferedMat1(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4) - &
+                         bufferedMat1(iRo, iCo) > epsilon(0.0_dp)) .NEQV. &
+                        ! determine higher neighbouring values in mat2
+                        (bufferedMat2(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4) - &
+                         bufferedMat2(iRo, iCo) > epsilon(0.0_dp)) &
+                           ) &
+                          ! exclude unmasked values
+                          .and. (maske(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4)) &
+                          ), &
+                     dp)
+        ! count - 1 to exclude referendce cell (iRo, iCo)
+        validcount(iRo - 1_i4, iCo - 1_i4) = count(maske(iRo - 1_i4 : iRo + 1_i4, iCo - 1_i4 : iCo + 1_i4)) - 1_i4
+        !
+      end do
     end do
     !
     ! normalize every pixel to number of valid neighbouring cells (defined by maske) [0..8] --> [0..1]
-    validmaske = (maske(2:size(maske, dim=1) - 1_i4, 2:size(maske, dim=2) - 1_i4) .and. (validcount > 0_i4))
+    validmaske = (maske(2 : size(maske, dim = 1) - 1_i4, 2 : size(maske, dim = 2) - 1_i4) .and. (validcount > 0_i4))
     noValidPixels = count(validmaske)
     if (noValidPixels .GT. 0_i4) then
-       PDMatrix = merge(PDMatrix/real(validcount, dp),PDMatrix, validmaske)
-       ! average over all pixels
-       PD_dp = 1.0_dp - sum(PDMatrix, mask=validmaske) / noValidPixels
-       if (present(valid)) valid = .TRUE.
-    ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
+      PDMatrix = merge(PDMatrix / real(validcount, dp), PDMatrix, validmaske)
+      ! average over all pixels
+      PD_dp = 1.0_dp - sum(PDMatrix, mask = validmaske) / noValidPixels
+      if (present(valid)) valid = .TRUE.
+      ! case if maske is full of .false. or no valid neighbouring cells available for every pixel (validcount(:,:)=0)
     else
-       PD_dp = 0.0_dp
-       if (present(valid)) valid = .FALSE.
+      PD_dp = 0.0_dp
+      if (present(valid)) valid = .FALSE.
     end if
     !
   END FUNCTION PD_dp
diff --git a/src/lib/mo_standard_score.f90 b/src/lib/mo_standard_score.f90
index cdf43d62..1aa6d615 100644
--- a/src/lib/mo_standard_score.f90
+++ b/src/lib/mo_standard_score.f90
@@ -38,7 +38,7 @@ MODULE mo_standard_score
 
   ! Copyright 2014 Matthias Zink
 
-  USE mo_kind, ONLY: i4, sp, dp
+  USE mo_kind, ONLY : i4, sp, dp
 
   IMPLICIT NONE
 
@@ -72,7 +72,7 @@ MODULE mo_standard_score
 
   !     CALLING SEQUENCE
   !         out = standard_score(data, mask=mask)
-  
+
   !     INDENT(IN)
   !>        \param[in] "real(sp/dp), dimension(:) :: data" data to calculate the standard score for
 
@@ -91,10 +91,10 @@ MODULE mo_standard_score
 
   !     INDENT(OUT), OPTIONAL
   !         None
-  
+
   !     RETURN
   !>        \return real(sp/dp) :: standard_score — standard score / normalization (anomaly) / z-score
-  
+
   !     RESTRICTIONS
   !         Input values must be floating points.
 
@@ -102,7 +102,7 @@ MODULE mo_standard_score
   !         data = (/ 1., 2, 3., -999., 5., 6. /)
   !         out  = standard_score(data, mask=(data >= 0.))
   !         -> see also example in test directory
-  
+
   !     LITERATURE
   !>         \note Richard J. Larsen and Morris L. Marx (2000) An Introduction to Mathematical Statistics and Its
   !>            Applications, Third Edition, ISBN 0-13-922303-7. p. 282. 
@@ -112,7 +112,7 @@ MODULE mo_standard_score
   !>         \date   May 2015
 
   INTERFACE standard_score
-     MODULE PROCEDURE standard_score_sp, standard_score_dp
+    MODULE PROCEDURE standard_score_sp, standard_score_dp
   END INTERFACE standard_score
 
   ! ------------------------------------------------------------------
@@ -146,12 +146,12 @@ MODULE mo_standard_score
 
   !     CALLING SEQUENCE
   !         out = classified_standard_score(data, mask=mask)
-  
+
   !     INDENT(IN)
   !>        \param[in] "integer,     dimension(:) :: classes" classes to categorize data (e.g. months)
   !>        \param[in] "real(sp/dp), dimension(:) :: data"    data to calculate the standard score for
 
-  
+
   !     INDENT(INOUT)
   !         None
 
@@ -167,11 +167,11 @@ MODULE mo_standard_score
 
   !     INDENT(OUT), OPTIONAL
   !         None
-  
+
   !     RETURN
   !>        \return real(sp/dp) :: classified_standard_score — classified standard score (e.g. deseasonalized
   !>                                                                                                 time series)
-  
+
   !     RESTRICTIONS
   !         Input values must be floating points.
 
@@ -180,7 +180,7 @@ MODULE mo_standard_score
   !         classes = (/ 1,  1, 1,     2,  2 , 2 /)
   !         out  = classified_standard_score(data, classes, mask=(data >= 0.))
   !         -> see also example in test directory
-  
+
   !     LITERATURE
   !        None
 
@@ -189,7 +189,7 @@ MODULE mo_standard_score
   !>         \date   May 2015
 
   INTERFACE classified_standard_score
-     MODULE PROCEDURE classified_standard_score_sp, classified_standard_score_dp
+    MODULE PROCEDURE classified_standard_score_sp, classified_standard_score_dp
   END INTERFACE classified_standard_score
   ! ------------------------------------------------------------------
 
@@ -203,58 +203,58 @@ MODULE mo_standard_score
 
   FUNCTION standard_score_sp(data, mask)
 
-    use mo_moment, only: average, stddev
-    
+    use mo_moment, only : average, stddev
+
     implicit none
-    
-    real(sp), dimension(:),             intent(in) :: data ! data arrau input
-    logical,  dimension(:), optional,   intent(in) :: mask ! optional input
-    real(sp), dimension(size(data, dim=1))         :: standard_score_sp
+
+    real(sp), dimension(:), intent(in) :: data ! data arrau input
+    logical, dimension(:), optional, intent(in) :: mask ! optional input
+    real(sp), dimension(size(data, dim = 1)) :: standard_score_sp
 
     ! local
-    logical, dimension(size(data, dim=1))          :: maske
-    
+    logical, dimension(size(data, dim = 1)) :: maske
+
     ! check if optional mask matches shape of data
     if (present(mask)) then
-       if (size(mask) .ne. size(data)) stop '***Error: standard_score_sp: size(mask) .ne. size(data)'
-       maske = mask
+      if (size(mask) .ne. size(data)) stop '***Error: standard_score_sp: size(mask) .ne. size(data)'
+      maske = mask
     else
-       maske(:) = .true.
+      maske(:) = .true.
     end if
 
     ! check if enough values (>1) are available
     if (count(maske) .LE. 2) stop '***Error: standard_score_sp: less than 2 elements avaiable'
-    
-    standard_score_sp = ( data(:) - average(data, mask=maske) ) / stddev(data,mask=maske)
+
+    standard_score_sp = (data(:) - average(data, mask = maske)) / stddev(data, mask = maske)
 
   END FUNCTION standard_score_sp
 
-  
+
   FUNCTION standard_score_dp(data, mask)
 
-    use mo_moment, only: average, stddev
-    
+    use mo_moment, only : average, stddev
+
     implicit none
-    
-    real(dp), dimension(:),             intent(in) :: data ! data arrau input
-    logical,  dimension(:), optional,   intent(in) :: mask ! optional input
-    real(dp), dimension(size(data, dim=1))         :: standard_score_dp
+
+    real(dp), dimension(:), intent(in) :: data ! data arrau input
+    logical, dimension(:), optional, intent(in) :: mask ! optional input
+    real(dp), dimension(size(data, dim = 1)) :: standard_score_dp
 
     ! local
-    logical, dimension(size(data, dim=1))          :: maske
-    
+    logical, dimension(size(data, dim = 1)) :: maske
+
     ! check if optional mask matches shape of data
     if (present(mask)) then
-       if (size(mask) .ne. size(data)) stop '***Error: standard_score_dp: size(mask) .ne. size(data)'
-       maske = mask
+      if (size(mask) .ne. size(data)) stop '***Error: standard_score_dp: size(mask) .ne. size(data)'
+      maske = mask
     else
-       maske(:) = .true.
+      maske(:) = .true.
     end if
 
     ! check if enough values (>1) are available
     if (count(maske) .LE. 2) stop '***Error: standard_score_dp: less than 2 elements avaiable'
-    
-    standard_score_dp = ( data(:) - average(data, mask=maske) ) / stddev(data,mask=maske)
+
+    standard_score_dp = (data(:) - average(data, mask = maske)) / stddev(data, mask = maske)
 
   END FUNCTION standard_score_dp
 
@@ -262,33 +262,33 @@ END FUNCTION standard_score_dp
 
   FUNCTION classified_standard_score_sp(data, classes, mask)
 
-    use mo_moment,    only: average, stddev
-    use mo_orderpack, only: unista
-    
+    use mo_moment, only : average, stddev
+    use mo_orderpack, only : unista
+
     implicit none
-    
-    real(sp),    dimension(:),             intent(in) :: data    ! data array with input
-    integer,     dimension(:),             intent(in) :: classes ! array indicateing classes
-    logical,     dimension(:), optional,   intent(in) :: mask    ! array masking elements of data
-    real(sp),    dimension(size(data, dim=1))         :: classified_standard_score_sp
+
+    real(sp), dimension(:), intent(in) :: data    ! data array with input
+    integer, dimension(:), intent(in) :: classes ! array indicateing classes
+    logical, dimension(:), optional, intent(in) :: mask    ! array masking elements of data
+    real(sp), dimension(size(data, dim = 1)) :: classified_standard_score_sp
 
     ! local
-    integer(i4)                                       :: iclass, ielem        ! loop variable
-    integer(i4)                                       :: number_of_classes    ! number of unique classes in vector
+    integer(i4) :: iclass, ielem        ! loop variable
+    integer(i4) :: number_of_classes    ! number of unique classes in vector
     ! classes
-    integer(i4), dimension(size(data, dim=1))         :: unique_classes       ! vector of uniqe classes
-    real(sp)                                          :: class_mean           ! mean of class
-    real(sp)                                          :: class_stddev         ! standard deviation of class
-    logical,     dimension(size(data, dim=1))         :: maske                ! data mask
-    logical,     dimension(size(data, dim=1))         :: mask_class_maske     ! combined mask for current class and
+    integer(i4), dimension(size(data, dim = 1)) :: unique_classes       ! vector of uniqe classes
+    real(sp) :: class_mean           ! mean of class
+    real(sp) :: class_stddev         ! standard deviation of class
+    logical, dimension(size(data, dim = 1)) :: maske                ! data mask
+    logical, dimension(size(data, dim = 1)) :: mask_class_maske     ! combined mask for current class and
     ! maske
 
     ! check if optional mask matches shape of data
     if (present(mask)) then
-       if (size(mask) .ne. size(data)) stop '***Error: classified_standard_score_sp: size(mask) .ne. size(data)'
-       maske = mask
+      if (size(mask) .ne. size(data)) stop '***Error: classified_standard_score_sp: size(mask) .ne. size(data)'
+      maske = mask
     else
-       maske(:) = .true.
+      maske(:) = .true.
     end if
 
     ! check if enough values (>1) are available
@@ -296,55 +296,55 @@ FUNCTION classified_standard_score_sp(data, classes, mask)
 
     ! initialization
     classified_standard_score_sp = 0.0_sp
-    
+
     ! write classes to new array for getting unique array elements
     unique_classes = classes
     call unista(unique_classes, number_of_classes) ! (unique arry elements in the 1:number_of_classes 
     !                                              ! indexes of array unique_classes)
-    
+
     ! loop over classes
     do iclass = 1, number_of_classes
-       ! calculate mean and standard deviation for class
-       mask_class_maske = (maske .AND. (classes==unique_classes(iclass)))
-       class_mean   = average(data, mask=mask_class_maske)
-       class_stddev =  stddev(data, mask=mask_class_maske)
-       ! loop over array elements
-       do ielem = 1, size(data, dim=1)
-          if (.NOT. mask_class_maske(ielem)) cycle ! skip masked values and other classes
-          classified_standard_score_sp(ielem) = ( data(ielem) - class_mean ) / class_stddev
-       end do
+      ! calculate mean and standard deviation for class
+      mask_class_maske = (maske .AND. (classes==unique_classes(iclass)))
+      class_mean = average(data, mask = mask_class_maske)
+      class_stddev = stddev(data, mask = mask_class_maske)
+      ! loop over array elements
+      do ielem = 1, size(data, dim = 1)
+        if (.NOT. mask_class_maske(ielem)) cycle ! skip masked values and other classes
+        classified_standard_score_sp(ielem) = (data(ielem) - class_mean) / class_stddev
+      end do
     end do
-    
+
   END FUNCTION classified_standard_score_sp
 
-  
+
   FUNCTION classified_standard_score_dp(data, classes, mask)
 
-    use mo_moment,    only: average, stddev
-    use mo_orderpack, only: unista
-    
+    use mo_moment, only : average, stddev
+    use mo_orderpack, only : unista
+
     implicit none
-    
-    real(dp),    dimension(:),             intent(in) :: data    ! data array with input
-    integer,     dimension(:),             intent(in) :: classes ! array indicateing classes
-    logical,     dimension(:), optional,   intent(in) :: mask    ! array masking elements of data
-    real(dp),    dimension(size(data, dim=1))         :: classified_standard_score_dp
+
+    real(dp), dimension(:), intent(in) :: data    ! data array with input
+    integer, dimension(:), intent(in) :: classes ! array indicateing classes
+    logical, dimension(:), optional, intent(in) :: mask    ! array masking elements of data
+    real(dp), dimension(size(data, dim = 1)) :: classified_standard_score_dp
 
     ! local
-    integer(i4)                                       :: iclass, ielem        ! loop variable
-    integer(i4)                                       :: number_of_classes    ! number of unique classes in vector classes
-    integer(i4), dimension(size(data, dim=1))         :: unique_classes       ! vector of uniqe classes
-    real(dp)                                          :: class_mean           ! mean of class
-    real(dp)                                          :: class_stddev         ! standard deviation of class
-    logical,     dimension(size(data, dim=1))         :: maske                ! data mask
-    logical,     dimension(size(data, dim=1))         :: mask_class_maske     ! combined mask for current class and maske
+    integer(i4) :: iclass, ielem        ! loop variable
+    integer(i4) :: number_of_classes    ! number of unique classes in vector classes
+    integer(i4), dimension(size(data, dim = 1)) :: unique_classes       ! vector of uniqe classes
+    real(dp) :: class_mean           ! mean of class
+    real(dp) :: class_stddev         ! standard deviation of class
+    logical, dimension(size(data, dim = 1)) :: maske                ! data mask
+    logical, dimension(size(data, dim = 1)) :: mask_class_maske     ! combined mask for current class and maske
 
     ! check if optional mask matches shape of data
     if (present(mask)) then
-       if (size(mask) .ne. size(data)) stop '***Error: classified_standard_score_dp: size(mask) .ne. size(data)'
-       maske = mask
+      if (size(mask) .ne. size(data)) stop '***Error: classified_standard_score_dp: size(mask) .ne. size(data)'
+      maske = mask
     else
-       maske(:) = .true.
+      maske(:) = .true.
     end if
 
     ! check if enough values (>1) are available
@@ -352,25 +352,25 @@ FUNCTION classified_standard_score_dp(data, classes, mask)
 
     ! initialization
     classified_standard_score_dp = 0.0_dp
-    
+
     ! write classes to new array for getting unique array elements
     unique_classes = classes
     call unista(unique_classes, number_of_classes) ! (unique arry elements in the 1:number_of_classes 
     !                                              ! indexes of array unique_classes)
-    
+
     ! loop over classes
     do iclass = 1, number_of_classes
-       ! calculate mean and standard deviation for class
-       mask_class_maske = (maske .AND. (classes==unique_classes(iclass)))
-       class_mean   = average(data, mask=mask_class_maske)
-       class_stddev =  stddev(data, mask=mask_class_maske)
-       ! loop over array elements
-       do ielem = 1, size(data, dim=1)
-          if (.NOT. mask_class_maske(ielem)) cycle ! skip masked values and other classes
-          classified_standard_score_dp(ielem) = ( data(ielem) - class_mean ) / class_stddev
-       end do
+      ! calculate mean and standard deviation for class
+      mask_class_maske = (maske .AND. (classes==unique_classes(iclass)))
+      class_mean = average(data, mask = mask_class_maske)
+      class_stddev = stddev(data, mask = mask_class_maske)
+      ! loop over array elements
+      do ielem = 1, size(data, dim = 1)
+        if (.NOT. mask_class_maske(ielem)) cycle ! skip masked values and other classes
+        classified_standard_score_dp(ielem) = (data(ielem) - class_mean) / class_stddev
+      end do
     end do
-    
+
   END FUNCTION classified_standard_score_dp
-  
+
 END MODULE mo_standard_score
diff --git a/src/lib/mo_string_utils.f90 b/src/lib/mo_string_utils.f90
index bda70fab..fe1f5605 100644
--- a/src/lib/mo_string_utils.f90
+++ b/src/lib/mo_string_utils.f90
@@ -31,7 +31,7 @@ MODULE mo_string_utils
 
   ! Copyright 2011-2015 Matthias Cuntz
 
-  USE mo_kind, ONLY: i4, i8, sp, dp
+  USE mo_kind, ONLY : i4, i8, sp, dp
 
   IMPLICIT NONE
 
@@ -48,7 +48,7 @@ MODULE mo_string_utils
   PUBLIC :: str2num       ! Converts string into an array of its numerical representation
   PUBLIC :: tolower       ! Conversion   : 'ABCXYZ' -> 'abcxyz'
   PUBLIC :: toupper       ! Conversion   : 'abcxyz' -> 'ABCXYZ'
-  
+
   ! public :: numarray2str
 
   ! ------------------------------------------------------------------
@@ -117,7 +117,7 @@ MODULE mo_string_utils
   !>        \author Matthias Cuntz - modified from Echam5, (C) MPI-MET, Hamburg, Germany
   !>        \date Dec 2011
   INTERFACE num2str
-     MODULE PROCEDURE i42str, i82str, sp2str, dp2str, log2str
+    MODULE PROCEDURE i42str, i82str, sp2str, dp2str, log2str
   END INTERFACE num2str
 
 
@@ -145,7 +145,7 @@ MODULE mo_string_utils
 
   !     INTENT(IN), OPTIONAL
   !         None
-  
+
   !     INTENT(INOUT), OPTIONAL
   !         None
 
@@ -170,7 +170,7 @@ MODULE mo_string_utils
   !>        \date Dec 2011
 
   INTERFACE numarray2str
-     MODULE PROCEDURE i4array2str
+    MODULE PROCEDURE i4array2str
   END INTERFACE numarray2str
 
   ! ------------------------------------------------------------------
@@ -179,7 +179,7 @@ MODULE mo_string_utils
 
   ! ------------------------------------------------------------------
 
-  CHARACTER(len=*), PARAMETER :: separator = repeat('-',70)
+  CHARACTER(len = *), PARAMETER :: separator = repeat('-', 70)
 
   ! ------------------------------------------------------------------
 
@@ -234,48 +234,48 @@ MODULE mo_string_utils
   !         \author Giovanni Dalmasso - modified from Paul van Delst, CIMSS/SSEC 18-Oct-1999
   !         \date Jan 2013
 
-  function compress( whiteSpaces, n )
+  function compress(whiteSpaces, n)
 
-        use mo_kind,    only : i4
+    use mo_kind, only : i4
 
-        implicit none
+    implicit none
 
-        character(len=*),               intent(in)  :: whiteSpaces
-        integer(i4),        optional,   intent(out) :: n
+    character(len = *), intent(in) :: whiteSpaces
+    integer(i4), optional, intent(out) :: n
 
-        character(len(whiteSpaces))                 ::  compress
+    character(len(whiteSpaces)) :: compress
 
-        ! Local parameters
-        integer(i4),    parameter                   :: iachar_space = 32_i4
-        integer(i4),    parameter                   :: iachar_tab   = 9_i4
+    ! Local parameters
+    integer(i4), parameter :: iachar_space = 32_i4
+    integer(i4), parameter :: iachar_tab = 9_i4
 
-        ! Local variables
-        integer(i4)                                 :: i, j
-        integer(i4)                                 :: iachar_character
+    ! Local variables
+    integer(i4) :: i, j
+    integer(i4) :: iachar_character
 
-        ! Setup
+    ! Setup
 
-        ! Initialise compress
-        compress = ' '
-        ! Initialise counter
-        j = 0_i4
+    ! Initialise compress
+    compress = ' '
+    ! Initialise counter
+    j = 0_i4
 
-        ! Loop over string
-        do i = 1, len(whiteSpaces)
-            ! Convert the current character to its position
-            iachar_character = iachar(whiteSpaces(i:i))
+    ! Loop over string
+    do i = 1, len(whiteSpaces)
+      ! Convert the current character to its position
+      iachar_character = iachar(whiteSpaces(i : i))
 
-            ! If the character is NOT a space ' ' or a tab '->|' copy it to the output string.
-            if ( iachar_character .ne. iachar_space .and. iachar_character .ne. iachar_tab )    then
-                j = j + 1
-                compress(j:j) = whiteSpaces(i:i)
-            end if
-        end do
+      ! If the character is NOT a space ' ' or a tab '->|' copy it to the output string.
+      if (iachar_character .ne. iachar_space .and. iachar_character .ne. iachar_tab)    then
+        j = j + 1
+        compress(j : j) = whiteSpaces(i : i)
+      end if
+    end do
 
-        ! Save the non-whitespace count
-        if ( present(n) ) n = j
+    ! Save the non-whitespace count
+    if (present(n)) n = j
 
-    end function compress
+  end function compress
 
 #ifndef ABSOFT
   ! ------------------------------------------------------------------
@@ -332,41 +332,41 @@ SUBROUTINE divide_string(string, delim, strArr)
 
     IMPLICIT NONE
 
-    CHARACTER(len=*)             , INTENT(IN)        :: string
-    CHARACTER(len=*)             , INTENT(IN)        :: delim
-    CHARACTER(len=*), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: strArr
+    CHARACTER(len = *), INTENT(IN) :: string
+    CHARACTER(len = *), INTENT(IN) :: delim
+    CHARACTER(len = *), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: strArr
 
-    CHARACTER(256)                                   :: stringDummy   ! string in fisrt place but cutted in pieces
-    CHARACTER(256), DIMENSION(:) , ALLOCATABLE       :: strDummyArr   ! Dummy arr until number of substrings is known
-    INTEGER(i4)                                      :: pos           ! position of dilimiter
-    INTEGER(i4)                                      :: nosubstr      ! number of substrings in string
+    CHARACTER(256) :: stringDummy   ! string in fisrt place but cutted in pieces
+    CHARACTER(256), DIMENSION(:), ALLOCATABLE :: strDummyArr   ! Dummy arr until number of substrings is known
+    INTEGER(i4) :: pos           ! position of dilimiter
+    INTEGER(i4) :: nosubstr      ! number of substrings in string
 
     stringDummy = string
 
     allocate(strDummyArr(len_trim(stringDummy)))
-    pos=999_i4
-    nosubstr=0_i4
+    pos = 999_i4
+    nosubstr = 0_i4
     ! search for substrings and theirs count
     do
-       pos = index(trim(adjustl(stringDummy)), delim)
-       ! exit if no more delimiter is find and save the last part of the string
-       if (pos .EQ. 0_i4) then
-          nosubstr = nosubstr + 1_i4
-          StrDummyArr(nosubstr) = trim(stringDummy)
-          exit
-       end if
-
-       nosubstr = nosubstr + 1_i4
-       strDummyArr(nosubstr) = stringDummy(1:pos-1)
-       stringDummy = stringDummy(pos+1:len_trim(stringDummy))
+      pos = index(trim(adjustl(stringDummy)), delim)
+      ! exit if no more delimiter is find and save the last part of the string
+      if (pos .EQ. 0_i4) then
+        nosubstr = nosubstr + 1_i4
+        StrDummyArr(nosubstr) = trim(stringDummy)
+        exit
+      end if
+
+      nosubstr = nosubstr + 1_i4
+      strDummyArr(nosubstr) = stringDummy(1 : pos - 1)
+      stringDummy = stringDummy(pos + 1 : len_trim(stringDummy))
     end do
     ! hand over results to strArr
     if (nosubstr .EQ. 0_i4) then
-       print*, '***WARNING: string does not contain delimiter. There are no substrings. (subroutine DIVIDE_STRING)'
-       return
+      print*, '***WARNING: string does not contain delimiter. There are no substrings. (subroutine DIVIDE_STRING)'
+      return
     else
-       allocate(strArr(nosubstr))
-       strArr = StrDummyArr(1:nosubstr)
+      allocate(strArr(nosubstr))
+      strArr = StrDummyArr(1 : nosubstr)
     end if
 
     deallocate(strDummyArr)
@@ -374,7 +374,7 @@ SUBROUTINE divide_string(string, delim, strArr)
   END SUBROUTINE divide_string
 #endif
 
-    ! ------------------------------------------------------------------
+  ! ------------------------------------------------------------------
 
   !     NAME
   !         equalStrings
@@ -422,26 +422,26 @@ END SUBROUTINE divide_string
   !         \author David Schaefer
   !         \date Mar 2015
 
-  function equalStrings(string1,string2)
+  function equalStrings(string1, string2)
     implicit none
 
-    character(len=*), intent(in)     :: string1, string2
-    integer(i4),      allocatable    :: array1(:), array2(:)
-    integer(i4)                      :: i
-    logical                          :: equalStrings
+    character(len = *), intent(in) :: string1, string2
+    integer(i4), allocatable :: array1(:), array2(:)
+    integer(i4) :: i
+    logical :: equalStrings
 
     array1 = str2num(trim(string1))
     array2 = str2num(trim(string2))
     equalStrings = .false.
 
     if (size(array1) .eq. size(array2)) then
-       equalStrings = .true.
-       do i=1, size(array1)
-          if (array1(i) .ne. array2(i)) then
-             equalStrings = .false.
-             exit 
-          end if
-       end do
+      equalStrings = .true.
+      do i = 1, size(array1)
+        if (array1(i) .ne. array2(i)) then
+          equalStrings = .false.
+          exit
+        end if
+      end do
     end if
 
   end function equalStrings
@@ -498,13 +498,13 @@ FUNCTION nonull(str)
 
     IMPLICIT NONE
 
-    CHARACTER(LEN=*), INTENT(in) :: str
-    LOGICAL                      :: nonull
+    CHARACTER(LEN = *), INTENT(in) :: str
+    LOGICAL :: nonull
 
     if (scan(str, achar(0)) == 0) then
-       nonull = .true.
+      nonull = .true.
     else
-       nonull = .false.
+      nonull = .false.
     end if
 
   END FUNCTION nonull
@@ -557,27 +557,27 @@ END FUNCTION nonull
   !         \author David Schaefer
   !         \date Mar 2015
 
-  function splitString(string,delim) result(out)
-    
-    use mo_append, only : append    
+  function splitString(string, delim) result(out)
+
+    use mo_append, only : append
     implicit none
-    
-    character(len=*),   intent(in)        :: string
-    character(len=*),   intent(in)        :: delim
-    character(len=256), allocatable       :: out(:)
-    integer(i4),        allocatable       :: string_array(:), delim_array(:)
-    integer(i4)                           :: i, start
+
+    character(len = *), intent(in) :: string
+    character(len = *), intent(in) :: delim
+    character(len = 256), allocatable :: out(:)
+    integer(i4), allocatable :: string_array(:), delim_array(:)
+    integer(i4) :: i, start
     !
     if (allocated(out)) deallocate(out)
-    string_array = str2num(string//delim)
+    string_array = str2num(string // delim)
     delim_array = str2num(delim)
     start = 1
 
-    do i=1, size(string_array) - size(delim_array) + 1
-       if (all(string_array(i:i+size(delim_array)-1) .eq. delim_array)) then
-          call append(out, numarray2str(string_array(start:i-1)))
-          start = i + size(delim_array)
-       end if
+    do i = 1, size(string_array) - size(delim_array) + 1
+      if (all(string_array(i : i + size(delim_array) - 1) .eq. delim_array)) then
+        call append(out, numarray2str(string_array(start : i - 1)))
+        start = i + size(delim_array)
+      end if
     end do
     !
   end function splitString
@@ -631,19 +631,19 @@ end function splitString
   !         \date Mar 2015
 
   function startsWith(string, start)
-    
+
     implicit none
 
-    character(len=*), intent(in)     :: string, start
-    integer(i4), allocatable         :: string_array(:), start_array(:)
-    logical                          :: startsWith
+    character(len = *), intent(in) :: string, start
+    integer(i4), allocatable :: string_array(:), start_array(:)
+    logical :: startsWith
 
     string_array = str2num(string)
     start_array = str2num(start)
 
     startsWith = .false.
-    if (all(string_array(1:1+size(start_array)-1) .eq. start_array)) then 
-       startsWith = .true.
+    if (all(string_array(1 : 1 + size(start_array) - 1) .eq. start_array)) then
+      startsWith = .true.
     end if
   end function startsWith
 
@@ -700,19 +700,19 @@ FUNCTION tolower(upper)
 
     IMPLICIT NONE
 
-    CHARACTER(LEN=*)              ,INTENT(in) :: upper
-    CHARACTER(LEN=LEN_TRIM(upper))            :: tolower
+    CHARACTER(LEN = *), INTENT(in) :: upper
+    CHARACTER(LEN = LEN_TRIM(upper)) :: tolower
 
-    INTEGER            :: i
-    INTEGER ,PARAMETER :: idel = ICHAR('a')-ICHAR('A')
+    INTEGER :: i
+    INTEGER, PARAMETER :: idel = ICHAR('a') - ICHAR('A')
 
-    DO i=1,LEN_TRIM(upper)
-       IF (ICHAR(upper(i:i)) >= ICHAR('A') .AND. &
-            ICHAR(upper(i:i)) <= ICHAR('Z')) THEN
-          tolower(i:i) = CHAR( ICHAR(upper(i:i)) + idel )
-       ELSE
-          tolower(i:i) = upper(i:i)
-       END IF
+    DO i = 1, LEN_TRIM(upper)
+      IF (ICHAR(upper(i : i)) >= ICHAR('A') .AND. &
+              ICHAR(upper(i : i)) <= ICHAR('Z')) THEN
+        tolower(i : i) = CHAR(ICHAR(upper(i : i)) + idel)
+      ELSE
+        tolower(i : i) = upper(i : i)
+      END IF
     END DO
 
   END FUNCTION tolower
@@ -770,19 +770,19 @@ FUNCTION toupper (lower)
 
     IMPLICIT NONE
 
-    CHARACTER(LEN=*)              ,INTENT(in) :: lower
-    CHARACTER(LEN=LEN_TRIM(lower))            :: toupper
+    CHARACTER(LEN = *), INTENT(in) :: lower
+    CHARACTER(LEN = LEN_TRIM(lower)) :: toupper
 
-    INTEGER            :: i
-    INTEGER, PARAMETER :: idel = ICHAR('A')-ICHAR('a')
+    INTEGER :: i
+    INTEGER, PARAMETER :: idel = ICHAR('A') - ICHAR('a')
 
-    DO i=1,LEN_TRIM(lower)
-       IF (ICHAR(lower(i:i)) >= ICHAR('a') .AND. &
-            ICHAR(lower(i:i)) <= ICHAR('z')) THEN
-          toupper(i:i) = CHAR( ICHAR(lower(i:i)) + idel )
-       ELSE
-          toupper(i:i) = lower(i:i)
-       END IF
+    DO i = 1, LEN_TRIM(lower)
+      IF (ICHAR(lower(i : i)) >= ICHAR('a') .AND. &
+              ICHAR(lower(i : i)) <= ICHAR('z')) THEN
+        toupper(i : i) = CHAR(ICHAR(lower(i : i)) + idel)
+      ELSE
+        toupper(i : i) = lower(i : i)
+      END IF
     END DO
 
   END FUNCTION toupper
@@ -793,85 +793,85 @@ END FUNCTION toupper
   ! (no "template" documentation required)
   ! -----------------------------------------------------------
 
-  PURE FUNCTION i42str(nn,form)
+  PURE FUNCTION i42str(nn, form)
     ! returns integer nn as a string (often needed in printing messages)
     IMPLICIT NONE
-    INTEGER(i4),      INTENT(IN)           :: nn
-    CHARACTER(len=*), INTENT(IN), OPTIONAL :: form
-    CHARACTER(len=10) :: i42str
+    INTEGER(i4), INTENT(IN) :: nn
+    CHARACTER(len = *), INTENT(IN), OPTIONAL :: form
+    CHARACTER(len = 10) :: i42str
 
     if (present(form)) then
-       write(i42str,form) nn
+      write(i42str, form) nn
     else
-       write(i42str,'(I10)') nn
+      write(i42str, '(I10)') nn
     end if
     !i42str = adjustl(i42str)
 
   END FUNCTION i42str
 
 
-  PURE FUNCTION i82str(nn,form)
+  PURE FUNCTION i82str(nn, form)
     ! returns integer nn as a string (often needed in printing messages)
     IMPLICIT NONE
-    INTEGER(i8),      INTENT(IN)           :: nn
-    CHARACTER(len=*), INTENT(IN), OPTIONAL :: form
-    CHARACTER(len=20) :: i82str
+    INTEGER(i8), INTENT(IN) :: nn
+    CHARACTER(len = *), INTENT(IN), OPTIONAL :: form
+    CHARACTER(len = 20) :: i82str
 
     if (present(form)) then
-       write(i82str,form) nn
+      write(i82str, form) nn
     else
-       write(i82str,'(I20)') nn
+      write(i82str, '(I20)') nn
     end if
     !i82str = adjustl(i82str)
 
   END FUNCTION i82str
 
 
-  PURE FUNCTION sp2str(rr,form)
+  PURE FUNCTION sp2str(rr, form)
     ! returns real rr as a string (often needed in printing messages)
     IMPLICIT NONE
-    REAL(sp),         INTENT(IN)           :: rr
-    CHARACTER(len=*), INTENT(IN), OPTIONAL :: form
-    CHARACTER(len=32) :: sp2str
+    REAL(sp), INTENT(IN) :: rr
+    CHARACTER(len = *), INTENT(IN), OPTIONAL :: form
+    CHARACTER(len = 32) :: sp2str
 
     if (present(form)) then
-       write(sp2str,form) rr
+      write(sp2str, form) rr
     else
-       write(sp2str,'(G32.5)') rr
+      write(sp2str, '(G32.5)') rr
     end if
     !sp2str = adjustl(sp2str)
 
   END FUNCTION sp2str
 
 
-  PURE FUNCTION dp2str(rr,form)
+  PURE FUNCTION dp2str(rr, form)
     ! returns real rr as a string (often needed in printing messages)
     IMPLICIT NONE
-    REAL(dp),         INTENT(IN)           :: rr
-    CHARACTER(len=*), INTENT(IN), OPTIONAL :: form
-    CHARACTER(len=32) :: dp2str
+    REAL(dp), INTENT(IN) :: rr
+    CHARACTER(len = *), INTENT(IN), OPTIONAL :: form
+    CHARACTER(len = 32) :: dp2str
 
     if (present(form)) then
-       write(dp2str,form) rr
+      write(dp2str, form) rr
     else
-       write(dp2str,'(G32.5)') rr
+      write(dp2str, '(G32.5)') rr
     end if
     !dp2str = adjustl(dp2str)
 
   END FUNCTION dp2str
 
 
-  PURE FUNCTION log2str(ll,form)
+  PURE FUNCTION log2str(ll, form)
     ! returns logical ll as a string (often needed in printing messages)
     IMPLICIT NONE
-    LOGICAL,          INTENT(in)           :: ll
-    CHARACTER(len=*), INTENT(IN), OPTIONAL :: form
-    CHARACTER(len=10) :: log2str
+    LOGICAL, INTENT(in) :: ll
+    CHARACTER(len = *), INTENT(IN), OPTIONAL :: form
+    CHARACTER(len = 10) :: log2str
 
     if (present(form)) then
-       write(log2str,form) ll
+      write(log2str, form) ll
     else
-       write(log2str,'(L10)') ll
+      write(log2str, '(L10)') ll
     end if
     !log2str = adjustl(log2str)
 
@@ -879,18 +879,18 @@ END FUNCTION log2str
 
   function i4array2str(arr) result(out)
 
-    integer(i4), intent(in)     :: arr(:)
-    integer(i4)                 :: ii
-    character(len=size(arr))    :: out
+    integer(i4), intent(in) :: arr(:)
+    integer(i4) :: ii
+    character(len = size(arr)) :: out
 
     out = " "
-    do ii=1,size(arr)
-       out(ii:ii) = char(arr(ii))
+    do ii = 1, size(arr)
+      out(ii : ii) = char(arr(ii))
     end do
 
   end function i4array2str
 
-    ! ------------------------------------------------------------------
+  ! ------------------------------------------------------------------
 
   !     NAME
   !         str2num
@@ -938,18 +938,18 @@ end function i4array2str
   !         \date Mar 2015
 
   function str2num(string) result(out)
-  
+
     implicit none
 
-    character(len=*), intent(in)       :: string
-    integer(i4), allocatable           :: out(:)
-    integer(i4)                        :: i  
+    character(len = *), intent(in) :: string
+    integer(i4), allocatable :: out(:)
+    integer(i4) :: i
 
     if (allocated(out)) deallocate(out)
     allocate(out(len(string)))
 
-    do i=1,len(string)
-       out(i) = ichar(string(i:i))
+    do i = 1, len(string)
+      out(i) = ichar(string(i : i))
     end do
 
   end function str2num
diff --git a/src/lib/mo_temporal_aggregation.f90 b/src/lib/mo_temporal_aggregation.f90
index 683626b4..da6708bf 100644
--- a/src/lib/mo_temporal_aggregation.f90
+++ b/src/lib/mo_temporal_aggregation.f90
@@ -33,10 +33,9 @@ MODULE mo_temporal_aggregation
 
   ! Copyright 2015 Oldrich Rakovec, Rohini Kumar
 
-  use mo_kind,   ONLY: i4, dp
-  use mo_julian, ONLY: julday, dec2date
-  use mo_constants,    ONLY: eps_dp
-
+  use mo_kind, ONLY : i4, dp
+  use mo_julian, ONLY : julday, dec2date
+  use mo_common_constants, ONLY : eps_dp
 
   IMPLICIT NONE
 
@@ -89,15 +88,15 @@ MODULE mo_temporal_aggregation
 
   !     LITERATURE
   !
-  
+
   !     HISTORY
   !>        \author Oldrich Rakovec, Rohini Kumar
   !>        \date Oct 2015
   !         Modified,
 
-   INTERFACE day2mon_average
-      MODULE PROCEDURE day2mon_average_dp
-   END INTERFACE day2mon_average
+  INTERFACE day2mon_average
+    MODULE PROCEDURE day2mon_average_dp
+  END INTERFACE day2mon_average
 
   ! ------------------------------------------------------------------
   !     NAME
@@ -146,15 +145,15 @@ MODULE mo_temporal_aggregation
 
   !     LITERATURE
   !
-  
+
   !     HISTORY
   !>        \author Oldrich Rakovec, Rohini Kumar
   !>        \date Oct 2015
   !         Modified,
 
-   INTERFACE hour2day_average
-      MODULE PROCEDURE hour2day_average_dp
-   END INTERFACE hour2day_average
+  INTERFACE hour2day_average
+    MODULE PROCEDURE hour2day_average_dp
+  END INTERFACE hour2day_average
 
   ! ------------------------------------------------------------------
 
@@ -164,185 +163,185 @@ MODULE mo_temporal_aggregation
 
 CONTAINS
 
-  SUBROUTINE day2mon_average_dp(daily_data,yearS,monthS,dayS,mon_avg, misval, rm_misval )
+  SUBROUTINE day2mon_average_dp(daily_data, yearS, monthS, dayS, mon_avg, misval, rm_misval)
 
     IMPLICIT NONE
 
-    REAL(dp), dimension(:),                         INTENT(IN)  :: daily_data      ! array of daily data
-    INTEGER(i4),                                    INTENT(IN)  :: yearS           ! year of the initial time step
-    INTEGER(i4),                                    INTENT(IN)  :: monthS          ! month of the initial time step
-    INTEGER(i4),                                    INTENT(IN)  :: dayS            ! day of the initial time step
+    REAL(dp), dimension(:), INTENT(IN) :: daily_data      ! array of daily data
+    INTEGER(i4), INTENT(IN) :: yearS           ! year of the initial time step
+    INTEGER(i4), INTENT(IN) :: monthS          ! month of the initial time step
+    INTEGER(i4), INTENT(IN) :: dayS            ! day of the initial time step
 
-    REAL(dp), dimension(:), allocatable,          INTENT(INOUT) :: mon_avg         ! array of the monthly averages
+    REAL(dp), dimension(:), allocatable, INTENT(INOUT) :: mon_avg         ! array of the monthly averages
 
-    REAL(dp),                             optional, INTENT(IN)  :: misval          ! missing value definition
-    logical,                              optional, INTENT(IN)  :: rm_misval       ! switch to remove missing values
+    REAL(dp), optional, INTENT(IN) :: misval          ! missing value definition
+    logical, optional, INTENT(IN) :: rm_misval       ! switch to remove missing values
 
     ! local variables 
-    INTEGER(i4)                                                 :: ndays, tt, kk      ! number of days, indices
-    INTEGER(i4)                                                 :: start_day, end_day ! size of input array, size of days  
-    INTEGER(i4)                                                 :: y, m                
-    INTEGER(i4)                                                 :: year, month, day    ! variables for date
-    INTEGER(i4)                                                 :: yearE, monthE, dayE ! vatiables for End date    
-    REAL(dp)                                                    :: newTime 
+    INTEGER(i4) :: ndays, tt, kk      ! number of days, indices
+    INTEGER(i4) :: start_day, end_day ! size of input array, size of days
+    INTEGER(i4) :: y, m
+    INTEGER(i4) :: year, month, day    ! variables for date
+    INTEGER(i4) :: yearE, monthE, dayE ! vatiables for End date
+    REAL(dp) :: newTime
 
-    REAL(dp), dimension(:,:), allocatable                       :: nCounter_m       ! counter number of days in months (w/ data)
-    REAL(dp), dimension(:,:), allocatable                       :: nCounter_m_full  ! counter number of days in months (complete) 
-    REAL(dp), dimension(:,:), allocatable                       :: mon_sum          ! monthly sum
+    REAL(dp), dimension(:, :), allocatable :: nCounter_m       ! counter number of days in months (w/ data)
+    REAL(dp), dimension(:, :), allocatable :: nCounter_m_full  ! counter number of days in months (complete)
+    REAL(dp), dimension(:, :), allocatable :: mon_sum          ! monthly sum
 
-    INTEGER(i4)                                                 :: nmonths     ! number of days, number of months
-    LOGICAL                                                     :: remove      ! switch for considering missing data
-    REAL(dp)                                                    :: missing  ! switch for reading missing value or default -9999.
+    INTEGER(i4) :: nmonths     ! number of days, number of months
+    LOGICAL :: remove      ! switch for considering missing data
+    REAL(dp) :: missing  ! switch for reading missing value or default -9999.
 
     if (present(misval)) then
-       missing = misval
+      missing = misval
     else
-       missing = -9999._dp
-    end if   
-   
+      missing = -9999._dp
+    end if
+
     if (present(rm_misval)) then
-       remove = rm_misval
+      remove = rm_misval
     else
-       remove = .FALSE.
-    end if   
-    
+      remove = .FALSE.
+    end if
+
     ! get total number of days 
-    ndays   = SIZE(daily_data)
-  
+    ndays = SIZE(daily_data)
+
     ! assign initial julian day
-    start_day = julday(dayS,monthS,yearS) 
+    start_day = julday(dayS, monthS, yearS)
 
     ! calculate last julian day
     end_day = start_day + ndays - 1_i4
 
     ! get year, month and day of the end date:
-    call dec2date( real(end_day, dp), yy=yearE, mm=monthE, dd=dayE)
- 
+    call dec2date(real(end_day, dp), yy = yearE, mm = monthE, dd = dayE)
+
     ! get number of days with data for each month
-    allocate( nCounter_m(yearS:yearE,12) )
-    allocate( nCounter_m_full(yearS:yearE,12) )
-    allocate(mon_sum(yearS:yearE,12))
-    nCounter_m(:,:)      = 0
-    nCounter_m_full(:,:) = 0
-    mon_sum(:,:)         = 0.0_dp
+    allocate(nCounter_m(yearS : yearE, 12))
+    allocate(nCounter_m_full(yearS : yearE, 12))
+    allocate(mon_sum(yearS : yearE, 12))
+    nCounter_m(:, :) = 0
+    nCounter_m_full(:, :) = 0
+    mon_sum(:, :) = 0.0_dp
 
     newTime = real(start_day, dp)
     ! calculate monthly sums
-    do tt = 1, (end_day - start_day + 1)          
-       call dec2date( (newTime + tt - 1), yy=year, mm=month, dd=day)
-       nCounter_m_full(year,month) = nCounter_m_full(year,month) + 1.0_dp
-       if ( abs( daily_data(tt) - missing ) .lt. eps_dp ) cycle
-       mon_sum(year,month) = mon_sum(year,month) + daily_data(tt)
-       nCounter_m(year,month) = nCounter_m(year,month) + 1.0_dp
+    do tt = 1, (end_day - start_day + 1)
+      call dec2date((newTime + tt - 1), yy = year, mm = month, dd = day)
+      nCounter_m_full(year, month) = nCounter_m_full(year, month) + 1.0_dp
+      if (abs(daily_data(tt) - missing) .lt. eps_dp) cycle
+      mon_sum(year, month) = mon_sum(year, month) + daily_data(tt)
+      nCounter_m(year, month) = nCounter_m(year, month) + 1.0_dp
     end do
 
     ! calculate number of months
     nmonths = 0
     do y = yearS, yearE
-       do m = 1, 12
-          if ( (y .EQ. yearS) .AND. ( m .LT. monthS ) ) cycle
-          if ( (y .EQ. yearE) .AND. ( m .GT. monthE ) ) cycle         
-          nmonths = nmonths + 1
-       end do
+      do m = 1, 12
+        if ((y .EQ. yearS) .AND. (m .LT. monthS)) cycle
+        if ((y .EQ. yearE) .AND. (m .GT. monthE)) cycle
+        nmonths = nmonths + 1
+      end do
     end do
-   
+
     ! calculate monthly averages
     allocate(mon_avg(nmonths))
     mon_avg(:) = missing
     kk = 0
     do y = yearS, yearE
-       do m = 1, 12
-          if ( (y .EQ. yearS) .AND. ( m .LT. monthS ) ) cycle
-          if ( (y .EQ. yearE) .AND. ( m .GT. monthE ) ) cycle         
-          kk = kk + 1
-          if ( ( nCounter_m(y,m) .GT. 0 ) .AND. &
-               ( abs( nCounter_m_full(y,m) - nCounter_m(y,m)) .LT. eps_dp ) ) then
-             mon_avg(kk) = mon_sum(y,m) / real( nCounter_m(y,m), dp)
-          else if ( ( nCounter_m(y,m) .GT. 0 ) .AND. remove) then
-             mon_avg(kk) = mon_sum(y,m) / real( nCounter_m(y,m), dp)
-          end if    
-       end do
+      do m = 1, 12
+        if ((y .EQ. yearS) .AND. (m .LT. monthS)) cycle
+        if ((y .EQ. yearE) .AND. (m .GT. monthE)) cycle
+        kk = kk + 1
+        if ((nCounter_m(y, m) .GT. 0) .AND. &
+                (abs(nCounter_m_full(y, m) - nCounter_m(y, m)) .LT. eps_dp)) then
+          mon_avg(kk) = mon_sum(y, m) / real(nCounter_m(y, m), dp)
+        else if ((nCounter_m(y, m) .GT. 0) .AND. remove) then
+          mon_avg(kk) = mon_sum(y, m) / real(nCounter_m(y, m), dp)
+        end if
+      end do
     end do
-    
+
     deallocate(nCounter_m_full)
     deallocate(nCounter_m)
     deallocate(mon_sum)
-    
+
   END SUBROUTINE day2mon_average_dp
 
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE hour2day_average_dp(hourly_data,yearS,monthS,dayS,hourS,day_avg, misval, rm_misval )
+  SUBROUTINE hour2day_average_dp(hourly_data, yearS, monthS, dayS, hourS, day_avg, misval, rm_misval)
 
     IMPLICIT NONE
 
-    REAL(dp), dimension(:),                         INTENT(IN)  :: hourly_data     ! array of hourly data
-    INTEGER(i4),                                    INTENT(IN)  :: yearS           ! year of the initial time step
-    INTEGER(i4),                                    INTENT(IN)  :: monthS          ! month of the initial time step
-    INTEGER(i4),                                    INTENT(IN)  :: dayS            ! day of the initial time step
-    INTEGER(i4),                                    INTENT(IN)  :: hourS           ! hour of the initial time step   
+    REAL(dp), dimension(:), INTENT(IN) :: hourly_data     ! array of hourly data
+    INTEGER(i4), INTENT(IN) :: yearS           ! year of the initial time step
+    INTEGER(i4), INTENT(IN) :: monthS          ! month of the initial time step
+    INTEGER(i4), INTENT(IN) :: dayS            ! day of the initial time step
+    INTEGER(i4), INTENT(IN) :: hourS           ! hour of the initial time step
 
-    REAL(dp), dimension(:), allocatable,          INTENT(INOUT) :: day_avg         ! array of the daily averages
+    REAL(dp), dimension(:), allocatable, INTENT(INOUT) :: day_avg         ! array of the daily averages
 
-    REAL(dp),                             optional, INTENT(IN)  :: misval          ! missing value definition
-    logical,                              optional, INTENT(IN)  :: rm_misval       ! switch to remove missing values
+    REAL(dp), optional, INTENT(IN) :: misval          ! missing value definition
+    logical, optional, INTENT(IN) :: rm_misval       ! switch to remove missing values
 
     ! local variables 
-    INTEGER(i4)                                                 :: nhours, ndays_dummy, tt, dd, kk 
-    REAL(dp)                                                    :: start_day, end_day   ! assign julian values
-    INTEGER(i4)                                                 :: yearE, monthE, dayE, hourE, hourEd ! End dates, incl. Dummy
+    INTEGER(i4) :: nhours, ndays_dummy, tt, dd, kk
+    REAL(dp) :: start_day, end_day   ! assign julian values
+    INTEGER(i4) :: yearE, monthE, dayE, hourE, hourEd ! End dates, incl. Dummy
+
+    REAL(dp), dimension(:), allocatable :: nCounter_h       ! counter number of hours in day (w/ data)
+    REAL(dp), dimension(:), allocatable :: nCounter_h_full  ! counter number of hours in day (complete)
+    REAL(dp), dimension(:), allocatable :: day_sum          ! daily sum
 
-    REAL(dp), dimension(:), allocatable                         :: nCounter_h       ! counter number of hours in day (w/ data)
-    REAL(dp), dimension(:), allocatable                         :: nCounter_h_full  ! counter number of hours in day (complete) 
-    REAL(dp), dimension(:), allocatable                         :: day_sum          ! daily sum
-    
-    LOGICAL                                                     :: remove   ! switch for considering missing data
-    REAL(dp)                                                    :: missing  ! switch for reading missing value or default -9999.
+    LOGICAL :: remove   ! switch for considering missing data
+    REAL(dp) :: missing  ! switch for reading missing value or default -9999.
 
     if (present(misval)) then
-       missing = misval
+      missing = misval
     else
-       missing = -9999._dp
-    end if   
+      missing = -9999._dp
+    end if
 
     if (present(rm_misval)) then
-       remove = rm_misval
+      remove = rm_misval
     else
-       remove = .FALSE.
-    end if   
-   
+      remove = .FALSE.
+    end if
+
     ! get total number of hours 
-    nhours   = SIZE(hourly_data)
+    nhours = SIZE(hourly_data)
     ! assign initial julian day
-    start_day = julday(dayS,monthS,yearS) - 0.5_dp + real(hourS,dp)/24._dp
-    
+    start_day = julday(dayS, monthS, yearS) - 0.5_dp + real(hourS, dp) / 24._dp
+
     ! calculate last julian day
-    end_day = start_day + real( nhours - 1._dp ,dp )/ 24._dp 
+    end_day = start_day + real(nhours - 1._dp, dp) / 24._dp
 
     ! get year, month and day of the end date 
-    call dec2date( end_day , yy=yearE, mm=monthE, dd=dayE, hh=hourE)
+    call dec2date(end_day, yy = yearE, mm = monthE, dd = dayE, hh = hourE)
 
     ! get largerst possible number of calendar days
-    ndays_dummy = ceiling( real(nhours,dp) / 24._dp + 2._dp ) 
-   
-    allocate( day_sum(ndays_dummy))
-    allocate( nCounter_h(ndays_dummy) )
-    allocate( nCounter_h_full(ndays_dummy) )
-    day_sum(:)         = 0.0_dp
-    nCounter_h(:)      = 0
+    ndays_dummy = ceiling(real(nhours, dp) / 24._dp + 2._dp)
+
+    allocate(day_sum(ndays_dummy))
+    allocate(nCounter_h(ndays_dummy))
+    allocate(nCounter_h_full(ndays_dummy))
+    day_sum(:) = 0.0_dp
+    nCounter_h(:) = 0
     nCounter_h_full(:) = 0
 
     ! calculate daily sums
     dd = 1
     do tt = 1, nhours
-       call dec2date( start_day + real(tt-1,dp)/24._dp , hh=hourEd)
-       nCounter_h_full(dd) = nCounter_h_full(dd) + 1
-       if ( abs( hourly_data(tt) - missing ) .lt. eps_dp ) then
-          day_sum(dd) = day_sum(dd)          
-       else
-          day_sum(dd) = day_sum(dd) + hourly_data(tt)
-          nCounter_h(dd) = nCounter_h(dd) + 1
-       end if  
-       if ( (hourEd .EQ. 23) .AND. (tt .LT. nhours)) dd = dd + 1    
+      call dec2date(start_day + real(tt - 1, dp) / 24._dp, hh = hourEd)
+      nCounter_h_full(dd) = nCounter_h_full(dd) + 1
+      if (abs(hourly_data(tt) - missing) .lt. eps_dp) then
+        day_sum(dd) = day_sum(dd)
+      else
+        day_sum(dd) = day_sum(dd) + hourly_data(tt)
+        nCounter_h(dd) = nCounter_h(dd) + 1
+      end if
+      if ((hourEd .EQ. 23) .AND. (tt .LT. nhours)) dd = dd + 1
     end do
 
     ! dd is the total number of calendar days, between hourS and hourE
@@ -350,19 +349,19 @@ SUBROUTINE hour2day_average_dp(hourly_data,yearS,monthS,dayS,hourS,day_avg, misv
     day_avg(:) = missing
 
     ! calculate daily average
-    do kk = 1,dd      
-       if ( ( nCounter_h(kk) .GT. 0 ) .AND. &
-            ( abs( nCounter_h_full(kk) - nCounter_h(kk)) .LT. eps_dp ) ) then
-          day_avg(kk) = day_sum(kk) / real( nCounter_h(kk), dp)
-       else if ( ( nCounter_h(kk) .GT. 0 ) .AND. remove) then
-          day_avg(kk) = day_sum(kk) / real( nCounter_h(kk), dp)
-       end if
-    end do   
-    
+    do kk = 1, dd
+      if ((nCounter_h(kk) .GT. 0) .AND. &
+              (abs(nCounter_h_full(kk) - nCounter_h(kk)) .LT. eps_dp)) then
+        day_avg(kk) = day_sum(kk) / real(nCounter_h(kk), dp)
+      else if ((nCounter_h(kk) .GT. 0) .AND. remove) then
+        day_avg(kk) = day_sum(kk) / real(nCounter_h(kk), dp)
+      end if
+    end do
+
     deallocate(nCounter_h_full)
     deallocate(nCounter_h)
     deallocate(day_sum)
-    
+
   END SUBROUTINE hour2day_average_dp
-   
+
 END MODULE mo_temporal_aggregation
diff --git a/src/lib/mo_timer.f90 b/src/lib/mo_timer.f90
index f8b7a1e3..523f8c31 100644
--- a/src/lib/mo_timer.f90
+++ b/src/lib/mo_timer.f90
@@ -67,7 +67,7 @@ module mo_timer
 
   ! Copyright 2012 Matthias Cuntz
 
-  use mo_kind, only: i4, sp
+  use mo_kind, only : i4, sp
 
   implicit none
 
@@ -92,19 +92,19 @@ module mo_timer
 
   ! Save variables
   !> max number of timers allowed
-  integer(i4),      parameter                   :: max_timers = 99
+  integer(i4), parameter :: max_timers = 99
   !> max value of clock allowed by system
-  integer(i4),                             save :: cycles_max
+  integer(i4), save :: cycles_max
   !> clock_rate in seconds for each cycle
-  real(sp),                                save :: clock_rate
+  real(sp), save :: clock_rate
   !> cycle number at start for each timer
-  integer(i4),      dimension(max_timers), save :: cycles1
+  integer(i4), dimension(max_timers), save :: cycles1
   !> cycle number at stop  for each timer
-  integer(i4),      dimension(max_timers), save :: cycles2
+  integer(i4), dimension(max_timers), save :: cycles2
   !> accumulated cpu time in each timer
-  real(sp),         dimension(max_timers), save :: cputime
+  real(sp), dimension(max_timers), save :: cputime
   !>  timer status string
-  character(len=8), dimension(max_timers), save :: status
+  character(len = 8), dimension(max_timers), save :: status
 
   ! -----------------------------------------------------------------------
 
@@ -160,8 +160,8 @@ subroutine timer_check(timer)
     integer(i4), intent(in) :: timer            ! timer number
 
     if (status(timer) .eq. 'running') then
-       call timer_stop (timer)
-       call timer_start(timer)
+      call timer_stop (timer)
+      call timer_start(timer)
     end if
 
   end subroutine timer_check
@@ -216,9 +216,9 @@ subroutine timer_clear(timer)
     integer(i4), intent(in), optional :: timer            ! timer number
 
     if (present(timer)) then
-       cputime(timer) = 0.0_sp ! clear the timer
+      cputime(timer) = 0.0_sp ! clear the timer
     else
-       cputime(:)     = 0.0_sp ! clear all timers
+      cputime(:) = 0.0_sp ! clear all timers
     end if
 
   end subroutine timer_clear
@@ -275,11 +275,11 @@ function timer_get(timer)
     real(sp) :: timer_get   ! accumulated cputime in given timer
 
     if (status(timer) .eq. 'stopped') then
-       timer_get = cputime(timer)
+      timer_get = cputime(timer)
     else
-       call timer_stop(timer)
-       timer_get = cputime(timer)
-       call timer_start(timer)
+      call timer_stop(timer)
+      timer_get = cputime(timer)
+      call timer_start(timer)
     end if
 
   end function timer_get
@@ -337,13 +337,13 @@ subroutine timer_print(timer)
     !---
 
     if (status(timer) .eq. 'stopped') then
-       write(*,"(' CPU time for timer',i3,':',1p,e16.8)")   &
-            timer,cputime(timer)
+      write(*, "(' CPU time for timer',i3,':',1p,e16.8)")   &
+              timer, cputime(timer)
     else
-       call timer_stop(timer)
-       write(*,"(' CPU time for timer',i3,':',1p,e16.8)")   &
-            timer,cputime(timer)
-       call timer_start(timer)
+      call timer_stop(timer)
+      write(*, "(' CPU time for timer',i3,':',1p,e16.8)")   &
+              timer, cputime(timer)
+      call timer_start(timer)
     end if
 
   end subroutine timer_print
@@ -400,8 +400,8 @@ subroutine timer_start(timer)
     !---
 
     if (status(timer) .eq. 'stopped') then
-       call system_clock(count=cycles1(timer))
-       status(timer) = 'running'
+      call system_clock(count = cycles1(timer))
+      status(timer) = 'running'
     end if
 
   end subroutine timer_start
@@ -455,29 +455,29 @@ subroutine timer_stop(timer)
 
     if (status(timer) .eq. 'running') then
 
-       !---
-       !--- Stop the desired timer.
-       !---
+      !---
+      !--- Stop the desired timer.
+      !---
 
-       call system_clock(count=cycles2(timer))
+      call system_clock(count = cycles2(timer))
 
-       !---
-       !--- check and correct for cycle wrapping
-       !---
+      !---
+      !--- check and correct for cycle wrapping
+      !---
 
-       if (cycles2(timer) .ge. cycles1(timer)) then
-          cputime(timer) = cputime(timer) + clock_rate*   &
-               (cycles2(timer) - cycles1(timer))
-       else
-          cputime(timer) = cputime(timer) + clock_rate*   &
-               (cycles2(timer) - cycles1(timer) + cycles_max)
-       end if
+      if (cycles2(timer) .ge. cycles1(timer)) then
+        cputime(timer) = cputime(timer) + clock_rate * &
+                (cycles2(timer) - cycles1(timer))
+      else
+        cputime(timer) = cputime(timer) + clock_rate * &
+                (cycles2(timer) - cycles1(timer) + cycles_max)
+      end if
 
-       !---
-       !--- Change timer status.
-       !---
+      !---
+      !--- Change timer status.
+      !---
 
-       status(timer)='stopped'
+      status(timer) = 'stopped'
 
     end if
 
@@ -544,20 +544,20 @@ subroutine timers_init
     cycles1(:) = 0
     cycles2(:) = 0
     cputime(:) = 0.0_sp
-    status(:)  = 'stopped'
+    status(:) = 'stopped'
 
     !---
     !--- Call F90 intrinsic system_clock to determine clock rate
     !--- and maximum cycles.  If no clock available, print message.
     !---
 
-    call system_clock(count_rate=cycles, count_max=cycles_max)
+    call system_clock(count_rate = cycles, count_max = cycles_max)
 
     if (cycles /= 0) then
-       clock_rate = 1.0_sp/real(cycles)
+      clock_rate = 1.0_sp / real(cycles)
     else
-       clock_rate = 0.0_sp
-       print *, '--- No system clock available ---'
+      clock_rate = 0.0_sp
+      print *, '--- No system clock available ---'
     end if
 
   end subroutine timers_init
diff --git a/src/lib/mo_utils.f90 b/src/lib/mo_utils.f90
index 7af970d4..5d4b7d69 100644
--- a/src/lib/mo_utils.f90
+++ b/src/lib/mo_utils.f90
@@ -33,8 +33,8 @@ MODULE mo_utils
 
   ! Copyright 2014 Matthias Cuntz, Juliane Mai
 
-  USE mo_kind,         only: sp, dp, i4
-  USE mo_string_utils, only: toupper
+  USE mo_kind, only : sp, dp, i4
+  USE mo_string_utils, only : toupper
 
   IMPLICIT NONE
 
@@ -105,35 +105,35 @@ MODULE mo_utils
   !>        \date Feb 2014
   !         Modified, Matthias Cuntz, Juliane Mai, Feb 2014 - sp, dp
   INTERFACE equal
-     MODULE PROCEDURE equal_sp, equal_dp
+    MODULE PROCEDURE equal_sp, equal_dp
   END INTERFACE equal
 
   INTERFACE notequal
-     MODULE PROCEDURE notequal_sp, notequal_dp
+    MODULE PROCEDURE notequal_sp, notequal_dp
   END INTERFACE notequal
 
   INTERFACE greaterequal
-     MODULE PROCEDURE greaterequal_sp, greaterequal_dp
+    MODULE PROCEDURE greaterequal_sp, greaterequal_dp
   END INTERFACE greaterequal
 
   INTERFACE lesserequal
-     MODULE PROCEDURE lesserequal_sp, lesserequal_dp
+    MODULE PROCEDURE lesserequal_sp, lesserequal_dp
   END INTERFACE lesserequal
 
   INTERFACE eq
-     MODULE PROCEDURE equal_sp, equal_dp
+    MODULE PROCEDURE equal_sp, equal_dp
   END INTERFACE eq
 
   INTERFACE ne
-     MODULE PROCEDURE notequal_sp, notequal_dp
+    MODULE PROCEDURE notequal_sp, notequal_dp
   END INTERFACE ne
 
   INTERFACE ge
-     MODULE PROCEDURE greaterequal_sp, greaterequal_dp
+    MODULE PROCEDURE greaterequal_sp, greaterequal_dp
   END INTERFACE ge
 
   INTERFACE le
-     MODULE PROCEDURE lesserequal_sp, lesserequal_dp
+    MODULE PROCEDURE lesserequal_sp, lesserequal_dp
   END INTERFACE le
 
 
@@ -191,16 +191,16 @@ MODULE mo_utils
   !>        \authors Matthias Cuntz
   !>        \date Mar 2015
   INTERFACE is_finite
-     MODULE PROCEDURE is_finite_sp, is_finite_dp
-  END INTERFACE is_finite  
+    MODULE PROCEDURE is_finite_sp, is_finite_dp
+  END INTERFACE is_finite
 
   INTERFACE is_nan
-     MODULE PROCEDURE is_nan_sp, is_nan_dp
+    MODULE PROCEDURE is_nan_sp, is_nan_dp
   END INTERFACE is_nan
-  
+
   INTERFACE is_normal
-     MODULE PROCEDURE is_normal_sp, is_normal_dp
-  END INTERFACE is_normal  
+    MODULE PROCEDURE is_normal_sp, is_normal_dp
+  END INTERFACE is_normal
 
 
   ! ------------------------------------------------------------------
@@ -262,10 +262,10 @@ MODULE mo_utils
   !>        \author Matthias Cuntz
   !>        \date May 2014
   INTERFACE locate
-     MODULE PROCEDURE locate_0d_dp, locate_0d_sp, locate_1d_dp, locate_1d_sp
+    MODULE PROCEDURE locate_0d_dp, locate_0d_sp, locate_1d_dp, locate_1d_sp
   END INTERFACE locate
 
-  
+
   ! ------------------------------------------------------------------
 
   !     NAME
@@ -322,12 +322,12 @@ MODULE mo_utils
   !>        \author Matthias Cuntz
   !>        \date May 2014
   INTERFACE swap
-     MODULE PROCEDURE &
-          swap_xy_dp, swap_xy_sp, swap_xy_i4, &
-          swap_vec_dp, swap_vec_sp, swap_vec_i4
+    MODULE PROCEDURE &
+            swap_xy_dp, swap_xy_sp, swap_xy_i4, &
+            swap_vec_dp, swap_vec_sp, swap_vec_i4
   END INTERFACE swap
 
-  
+
   ! ------------------------------------------------------------------
 
   !     NAME
@@ -403,7 +403,7 @@ MODULE mo_utils
   !>        \authors Matthias Cuntz
   !>        \date Mar 2015
   INTERFACE special_value
-     MODULE PROCEDURE special_value_sp, special_value_dp
+    MODULE PROCEDURE special_value_sp, special_value_dp
   END INTERFACE special_value
 
   ! ------------------------------------------------------------------
@@ -422,12 +422,12 @@ ELEMENTAL PURE FUNCTION equal_dp(a, b)
 
     REAL(dp), INTENT(IN) :: a
     REAL(dp), INTENT(IN) :: b
-    LOGICAL              :: equal_dp
+    LOGICAL :: equal_dp
 
-    if ((epsilon(1.0_dp)*abs(b) - abs(a-b)) < 0.0_dp) then
-       equal_dp = .false.
+    if ((epsilon(1.0_dp) * abs(b) - abs(a - b)) < 0.0_dp) then
+      equal_dp = .false.
     else
-       equal_dp = .true.
+      equal_dp = .true.
     end if
 
   END FUNCTION equal_dp
@@ -439,12 +439,12 @@ ELEMENTAL PURE FUNCTION equal_sp(a, b)
 
     REAL(sp), INTENT(IN) :: a
     REAL(sp), INTENT(IN) :: b
-    LOGICAL              :: equal_sp
+    LOGICAL :: equal_sp
 
-    if ((epsilon(1.0_sp)*abs(b) - abs(a-b)) < 0.0_sp) then
-       equal_sp = .false.
+    if ((epsilon(1.0_sp) * abs(b) - abs(a - b)) < 0.0_sp) then
+      equal_sp = .false.
     else
-       equal_sp = .true.
+      equal_sp = .true.
     end if
 
   END FUNCTION equal_sp
@@ -457,11 +457,11 @@ ELEMENTAL PURE FUNCTION greaterequal_dp(a, b)
 
     REAL(dp), INTENT(IN) :: a
     REAL(dp), INTENT(IN) :: b
-    LOGICAL              :: greaterequal_dp
+    LOGICAL :: greaterequal_dp
 
     greaterequal_dp = .true.
     ! 1st part is /=, 2nd part is the ab
-    if ( ((epsilon(1.0_dp)*abs(b) - abs(a-b)) < 0.0_dp) .and. (a > b) ) lesserequal_dp = .false.
+    if (((epsilon(1.0_dp) * abs(b) - abs(a - b)) < 0.0_dp) .and. (a > b)) lesserequal_dp = .false.
 
   END FUNCTION lesserequal_dp
 
@@ -503,11 +503,11 @@ ELEMENTAL PURE FUNCTION lesserequal_sp(a, b)
 
     REAL(sp), INTENT(IN) :: a
     REAL(sp), INTENT(IN) :: b
-    LOGICAL              :: lesserequal_sp
+    LOGICAL :: lesserequal_sp
 
     lesserequal_sp = .true.
     ! 1st part is /=, 2nd part is the a>b
-    if ( ((epsilon(1.0_sp)*abs(b) - abs(a-b)) < 0.0_sp) .and. (a > b) ) lesserequal_sp = .false.
+    if (((epsilon(1.0_sp) * abs(b) - abs(a - b)) < 0.0_sp) .and. (a > b)) lesserequal_sp = .false.
 
   END FUNCTION lesserequal_sp
 
@@ -519,12 +519,12 @@ ELEMENTAL PURE FUNCTION notequal_dp(a, b)
 
     REAL(dp), INTENT(IN) :: a
     REAL(dp), INTENT(IN) :: b
-    LOGICAL              :: notequal_dp
+    LOGICAL :: notequal_dp
 
-    if ((epsilon(1.0_dp)*abs(b) - abs(a-b)) < 0.0_dp) then
-       notequal_dp = .true.
+    if ((epsilon(1.0_dp) * abs(b) - abs(a - b)) < 0.0_dp) then
+      notequal_dp = .true.
     else
-       notequal_dp = .false.
+      notequal_dp = .false.
     end if
 
   END FUNCTION notequal_dp
@@ -536,28 +536,28 @@ ELEMENTAL PURE FUNCTION notequal_sp(a, b)
 
     REAL(sp), INTENT(IN) :: a
     REAL(sp), INTENT(IN) :: b
-    LOGICAL              :: notequal_sp
+    LOGICAL :: notequal_sp
 
-    if ((epsilon(1.0_sp)*abs(b) - abs(a-b)) < 0.0_sp) then
-       notequal_sp = .true.
+    if ((epsilon(1.0_sp) * abs(b) - abs(a - b)) < 0.0_sp) then
+      notequal_sp = .true.
     else
-       notequal_sp = .false.
+      notequal_sp = .false.
     end if
 
   END FUNCTION notequal_sp
-  
+
   ! ------------------------------------------------------------------
 
   ELEMENTAL PURE FUNCTION is_finite_dp(a)
 
 #ifndef GFORTRAN
-  use, intrinsic :: ieee_arithmetic, only: ieee_is_finite
+  use, intrinsic :: ieee_arithmetic, only : ieee_is_finite
 #endif
 
-    IMPLICIT NONE
+  IMPLICIT NONE
 
-    REAL(dp), INTENT(IN) :: a
-    LOGICAL              :: is_finite_dp
+  REAL(dp), INTENT(IN) :: a
+  LOGICAL :: is_finite_dp
 
 #ifndef GFORTRAN
     is_finite_dp = ieee_is_finite(a)
@@ -570,13 +570,13 @@ END FUNCTION is_finite_dp
   ELEMENTAL PURE FUNCTION is_finite_sp(a)
 
 #ifndef GFORTRAN
-  use, intrinsic :: ieee_arithmetic, only: ieee_is_finite
+  use, intrinsic :: ieee_arithmetic, only : ieee_is_finite
 #endif
 
-    IMPLICIT NONE
+  IMPLICIT NONE
 
-    REAL(sp), INTENT(IN) :: a
-    LOGICAL              :: is_finite_sp
+  REAL(sp), INTENT(IN) :: a
+  LOGICAL :: is_finite_sp
 
 #ifndef GFORTRAN
     is_finite_sp = ieee_is_finite(a)
@@ -590,15 +590,15 @@ END FUNCTION is_finite_sp
   ELEMENTAL PURE FUNCTION is_nan_dp(a)
 
 #ifndef GFORTRAN
-  use, intrinsic :: ieee_arithmetic, only: isnan => ieee_is_nan
+  use, intrinsic :: ieee_arithmetic, only : isnan => ieee_is_nan
 #endif
 
-    IMPLICIT NONE
+  IMPLICIT NONE
 
-    REAL(dp), INTENT(IN) :: a
-    LOGICAL              :: is_nan_dp
+  REAL(dp), INTENT(IN) :: a
+  LOGICAL :: is_nan_dp
 
-    ! isnan introduced in gfortran rev 4.2
+  ! isnan introduced in gfortran rev 4.2
 #ifdef GFORTRAN41
     is_nan_dp = a /= a
 #else
@@ -610,15 +610,15 @@ END FUNCTION is_nan_dp
   ELEMENTAL PURE FUNCTION is_nan_sp(a)
 
 #ifndef GFORTRAN
-  use, intrinsic :: ieee_arithmetic, only: isnan => ieee_is_nan
+  use, intrinsic :: ieee_arithmetic, only : isnan => ieee_is_nan
 #endif
 
-    IMPLICIT NONE
+  IMPLICIT NONE
 
-    REAL(sp), INTENT(IN) :: a
-    LOGICAL              :: is_nan_sp
+  REAL(sp), INTENT(IN) :: a
+  LOGICAL :: is_nan_sp
 
-    ! isnan introduced in gfortran rev 4.2
+  ! isnan introduced in gfortran rev 4.2
 #ifdef GFORTRAN41
     is_nan_sp = a /= a
 #else
@@ -631,13 +631,13 @@ END FUNCTION is_nan_sp
   ELEMENTAL PURE FUNCTION is_normal_dp(a)
 
 #ifndef GFORTRAN
-  use, intrinsic :: ieee_arithmetic, only: ieee_is_normal
+  use, intrinsic :: ieee_arithmetic, only : ieee_is_normal
 #endif
 
-    IMPLICIT NONE
+  IMPLICIT NONE
 
-    REAL(dp), INTENT(IN) :: a
-    LOGICAL              :: is_normal_dp
+  REAL(dp), INTENT(IN) :: a
+  LOGICAL :: is_normal_dp
 
 #ifndef GFORTRAN
     is_normal_dp = ieee_is_normal(a)
@@ -650,13 +650,13 @@ END FUNCTION is_normal_dp
   ELEMENTAL PURE FUNCTION is_normal_sp(a)
 
 #ifndef GFORTRAN
-  use, intrinsic :: ieee_arithmetic, only: ieee_is_normal
+  use, intrinsic :: ieee_arithmetic, only : ieee_is_normal
 #endif
 
-    IMPLICIT NONE
+  IMPLICIT NONE
 
-    REAL(sp), INTENT(IN) :: a
-    LOGICAL              :: is_normal_sp
+  REAL(sp), INTENT(IN) :: a
+  LOGICAL :: is_normal_sp
 
 #ifndef GFORTRAN
     is_normal_sp = ieee_is_normal(a)
@@ -672,45 +672,45 @@ END FUNCTION is_normal_sp
   !  x(j) and x(j+1). x must be monotonically increasing.
   !  j=0 or j=N is returned to indicate that x is out of range.
 
-  FUNCTION locate_0d_dp(x,y)
+  FUNCTION locate_0d_dp(x, y)
 
     IMPLICIT NONE
 
     REAL(dp), DIMENSION(:), INTENT(IN) :: x
-    REAL(dp),               INTENT(IN) :: y
-    INTEGER(i4)                        :: locate_0d_dp
+    REAL(dp), INTENT(IN) :: y
+    INTEGER(i4) :: locate_0d_dp
 
     INTEGER(i4), dimension(1) :: c
 
-    c = minloc(abs(x-y))
-    if (le(x(c(1)),y)) then
-       locate_0d_dp = c(1)
+    c = minloc(abs(x - y))
+    if (le(x(c(1)), y)) then
+      locate_0d_dp = c(1)
     else
-       locate_0d_dp = c(1)-1
+      locate_0d_dp = c(1) - 1
     end if
 
   END FUNCTION locate_0d_dp
 
-  FUNCTION locate_0d_sp(x,y)
+  FUNCTION locate_0d_sp(x, y)
 
     IMPLICIT NONE
 
     REAL(sp), DIMENSION(:), INTENT(IN) :: x
-    REAL(sp),               INTENT(IN) :: y
-    INTEGER(i4)                        :: locate_0d_sp
+    REAL(sp), INTENT(IN) :: y
+    INTEGER(i4) :: locate_0d_sp
 
     INTEGER(i4), dimension(1) :: c
 
-    c = minloc(abs(x-y))
-    if (le(x(c(1)),y)) then
-       locate_0d_sp = c(1)
+    c = minloc(abs(x - y))
+    if (le(x(c(1)), y)) then
+      locate_0d_sp = c(1)
     else
-       locate_0d_sp = c(1)-1
+      locate_0d_sp = c(1) - 1
     end if
 
   END FUNCTION locate_0d_sp
 
-  FUNCTION locate_1d_dp(x,y)
+  FUNCTION locate_1d_dp(x, y)
 
     IMPLICIT NONE
 
@@ -721,22 +721,21 @@ FUNCTION locate_1d_dp(x,y)
     INTEGER(i4) :: ny, i
     INTEGER(i4), dimension(1) :: c
 
-
     ny = size(y)
     if (.not. allocated(locate_1d_dp)) allocate(locate_1d_dp(ny))
 
-    do i=1, ny
-       c = minloc(abs(x-y(i)))
-       if (le(x(c(1)),y(i))) then
-          locate_1d_dp(i) = c(1)
-       else
-          locate_1d_dp(i) = c(1)-1
-       end if
+    do i = 1, ny
+      c = minloc(abs(x - y(i)))
+      if (le(x(c(1)), y(i))) then
+        locate_1d_dp(i) = c(1)
+      else
+        locate_1d_dp(i) = c(1) - 1
+      end if
     end do
 
   END FUNCTION locate_1d_dp
 
-  FUNCTION locate_1d_sp(x,y)
+  FUNCTION locate_1d_sp(x, y)
 
     IMPLICIT NONE
 
@@ -747,24 +746,23 @@ FUNCTION locate_1d_sp(x,y)
     INTEGER(i4) :: ny, i
     INTEGER(i4), dimension(1) :: c
 
-
     ny = size(y)
     if (.not. allocated(locate_1d_sp)) allocate(locate_1d_sp(ny))
 
-    do i=1, ny
-       c = minloc(abs(x-y(i)))
-       if (le(x(c(1)),y(i))) then
-          locate_1d_sp(i) = c(1)
-       else
-          locate_1d_sp(i) = c(1)-1
-       end if
+    do i = 1, ny
+      c = minloc(abs(x - y(i)))
+      if (le(x(c(1)), y(i))) then
+        locate_1d_sp(i) = c(1)
+      else
+        locate_1d_sp(i) = c(1) - 1
+      end if
     end do
 
   END FUNCTION locate_1d_sp
 
   ! ------------------------------------------------------------------
 
-  elemental pure subroutine swap_xy_dp(x,y)
+  elemental pure subroutine swap_xy_dp(x, y)
 
     implicit none
 
@@ -779,7 +777,7 @@ elemental pure subroutine swap_xy_dp(x,y)
 
   end subroutine swap_xy_dp
 
-  elemental pure subroutine swap_xy_sp(x,y)
+  elemental pure subroutine swap_xy_sp(x, y)
 
     implicit none
 
@@ -794,7 +792,7 @@ elemental pure subroutine swap_xy_sp(x,y)
 
   end subroutine swap_xy_sp
 
-  elemental pure subroutine swap_xy_i4(x,y)
+  elemental pure subroutine swap_xy_i4(x, y)
 
     implicit none
 
@@ -810,49 +808,49 @@ elemental pure subroutine swap_xy_i4(x,y)
   end subroutine swap_xy_i4
 
 
-  subroutine swap_vec_dp(x,i1,i2)
+  subroutine swap_vec_dp(x, i1, i2)
 
     implicit none
 
-    real(dp),    dimension(:), intent(inout) :: x
-    integer(i4),               intent(in)    :: i1
-    integer(i4),               intent(in)    :: i2
+    real(dp), dimension(:), intent(inout) :: x
+    integer(i4), intent(in) :: i1
+    integer(i4), intent(in) :: i2
 
     real(dp) :: z
 
-    z     = x(i1)
+    z = x(i1)
     x(i1) = x(i2)
     x(i2) = z
 
   end subroutine swap_vec_dp
 
-  subroutine swap_vec_sp(x,i1,i2)
+  subroutine swap_vec_sp(x, i1, i2)
 
     implicit none
 
-    real(sp),    dimension(:), intent(inout) :: x
-    integer(i4),               intent(in)    :: i1
-    integer(i4),               intent(in)    :: i2
+    real(sp), dimension(:), intent(inout) :: x
+    integer(i4), intent(in) :: i1
+    integer(i4), intent(in) :: i2
 
     real(sp) :: z
 
-    z     = x(i1)
+    z = x(i1)
     x(i1) = x(i2)
     x(i2) = z
 
   end subroutine swap_vec_sp
 
-  subroutine swap_vec_i4(x,i1,i2)
+  subroutine swap_vec_i4(x, i1, i2)
 
     implicit none
 
-    integer(i4),    dimension(:), intent(inout) :: x
-    integer(i4),               intent(in)    :: i1
-    integer(i4),               intent(in)    :: i2
+    integer(i4), dimension(:), intent(inout) :: x
+    integer(i4), intent(in) :: i1
+    integer(i4), intent(in) :: i2
 
     integer(i4) :: z
 
-    z     = x(i1)
+    z = x(i1)
     x(i1) = x(i2)
     x(i2) = z
 
@@ -863,86 +861,86 @@ end subroutine swap_vec_i4
   function special_value_dp(x, ieee)
 
 #ifndef GFORTRAN
-    use, intrinsic :: ieee_arithmetic, only: ieee_value, &
-         IEEE_SIGNALING_NAN, &
-         IEEE_QUIET_NAN, &
-         IEEE_NEGATIVE_INF, &
-         IEEE_POSITIVE_INF, &
-         IEEE_NEGATIVE_DENORMAL, &
-         IEEE_POSITIVE_DENORMAL, &
-         IEEE_NEGATIVE_NORMAL, &
-         IEEE_POSITIVE_NORMAL, &
-         IEEE_NEGATIVE_ZERO, &
-         IEEE_POSITIVE_ZERO
+    use, intrinsic :: ieee_arithmetic, only : ieee_value, &
+          IEEE_SIGNALING_NAN, &
+          IEEE_QUIET_NAN, &
+          IEEE_NEGATIVE_INF, &
+          IEEE_POSITIVE_INF, &
+          IEEE_NEGATIVE_DENORMAL, &
+          IEEE_POSITIVE_DENORMAL, &
+          IEEE_NEGATIVE_NORMAL, &
+          IEEE_POSITIVE_NORMAL, &
+          IEEE_NEGATIVE_ZERO, &
+          IEEE_POSITIVE_ZERO
 #endif
 
-    implicit none
-    
-    real(dp),         intent(in) :: x
-    character(len=*), intent(in) :: ieee
-    real(dp)                     :: special_value_dp
+  implicit none
 
-    ! local
-    character(len=21) :: ieee_up
+  real(dp), intent(in) :: x
+  character(len = *), intent(in) :: ieee
+  real(dp) :: special_value_dp
+
+  ! local
+  character(len = 21) :: ieee_up
 #ifdef GFORTRAN
     real(dp) :: tmp
 #endif
 
-    ieee_up = toupper(ieee)
+  ieee_up = toupper(ieee)
 #ifndef GFORTRAN
     select case(trim(ieee_up))
-    case('IEEE_SIGNALING_NAN')
-       special_value_dp = ieee_value(x, IEEE_SIGNALING_NAN)
-    case('IEEE_QUIET_NAN')
-       special_value_dp = ieee_value(x, IEEE_QUIET_NAN)
-    case('IEEE_NEGATIVE_INF')
-       special_value_dp = ieee_value(x, IEEE_NEGATIVE_INF)
-    case('IEEE_POSITIVE_INF')
-       special_value_dp = ieee_value(x, IEEE_POSITIVE_INF)
-    case('IEEE_NEGATIVE_DENORMAL')
-       special_value_dp = ieee_value(x, IEEE_NEGATIVE_DENORMAL)
-    case('IEEE_POSITIVE_DENORMAL')
-       special_value_dp = ieee_value(x, IEEE_POSITIVE_DENORMAL)
-    case('IEEE_NEGATIVE_NORMAL')
-       special_value_dp = ieee_value(x, IEEE_NEGATIVE_NORMAL)
-    case('IEEE_POSITIVE_NORMAL')
-       special_value_dp = ieee_value(x, IEEE_POSITIVE_NORMAL)
-    case('IEEE_NEGATIVE_ZERO')
-       special_value_dp = ieee_value(x, IEEE_NEGATIVE_ZERO)
-    case('IEEE_POSITIVE_ZERO')
-       special_value_dp = ieee_value(x, IEEE_POSITIVE_ZERO)
-    case default
-       special_value_dp = 0.0_dp
-    end select
+  case('IEEE_SIGNALING_NAN')
+    special_value_dp = ieee_value(x, IEEE_SIGNALING_NAN)
+  case('IEEE_QUIET_NAN')
+    special_value_dp = ieee_value(x, IEEE_QUIET_NAN)
+  case('IEEE_NEGATIVE_INF')
+    special_value_dp = ieee_value(x, IEEE_NEGATIVE_INF)
+  case('IEEE_POSITIVE_INF')
+    special_value_dp = ieee_value(x, IEEE_POSITIVE_INF)
+  case('IEEE_NEGATIVE_DENORMAL')
+    special_value_dp = ieee_value(x, IEEE_NEGATIVE_DENORMAL)
+  case('IEEE_POSITIVE_DENORMAL')
+    special_value_dp = ieee_value(x, IEEE_POSITIVE_DENORMAL)
+  case('IEEE_NEGATIVE_NORMAL')
+    special_value_dp = ieee_value(x, IEEE_NEGATIVE_NORMAL)
+  case('IEEE_POSITIVE_NORMAL')
+    special_value_dp = ieee_value(x, IEEE_POSITIVE_NORMAL)
+  case('IEEE_NEGATIVE_ZERO')
+    special_value_dp = ieee_value(x, IEEE_NEGATIVE_ZERO)
+  case('IEEE_POSITIVE_ZERO')
+    special_value_dp = ieee_value(x, IEEE_POSITIVE_ZERO)
+  case default
+    special_value_dp = 0.0_dp
+  end select
 #else
     select case(ieee_up)
-    case('IEEE_SIGNALING_NAN')
-       tmp = 0.0_dp
-       special_value_dp = tmp/tmp
-    case('IEEE_QUIET_NAN')
-       tmp = 0.0_dp
-       special_value_dp = tmp/tmp
-    case('IEEE_NEGATIVE_INF')
-       tmp = huge(x)
-       special_value_dp = -tmp*tmp
-    case('IEEE_POSITIVE_INF')
-       tmp = huge(x)
-       special_value_dp = tmp*tmp
-    case('IEEE_NEGATIVE_DENORMAL')
-       special_value_dp = -0.0_dp
-    case('IEEE_POSITIVE_DENORMAL')
-       special_value_dp = 0.0_dp
-    case('IEEE_NEGATIVE_NORMAL')
-       special_value_dp = -1.0_dp
-    case('IEEE_POSITIVE_NORMAL')
-       special_value_dp = 1.0_dp
-    case('IEEE_NEGATIVE_ZERO')
-       special_value_dp = -0.0_dp
-    case('IEEE_POSITIVE_ZERO')
-       special_value_dp = 0.0_dp
-    case default
-       special_value_dp = 0.0_dp
-    end select
+  case('IEEE_SIGNALING_NAN')
+    tmp = 0.0_dp
+    special_value_dp = tmp / tmp
+  case('IEEE_QUIET_NAN')
+    tmp = 0.0_dp
+    special_value_dp = tmp / tmp
+  case('IEEE_NEGATIVE_INF')
+    tmp = huge(x)
+    special_value_dp = -tmp * tmp
+  case('IEEE_POSITIVE_INF')
+    tmp = huge(x)
+    special_value_dp = tmp * tmp
+  case('IEEE_NEGATIVE_DENORMAL')
+    special_value_dp = -0.0_dp
+  case('IEEE_POSITIVE_DENORMAL')
+    special_value_dp = 0.0_dp
+  case('IEEE_NEGATIVE_NORMAL')
+    special_value_dp = -1.0_dp
+  case('IEEE_POSITIVE_NORMAL')
+    special_value_dp = 1.0_dp
+  case('IEEE_NEGATIVE_ZERO')
+    special_value_dp = -0.0_dp
+  case('IEEE_POSITIVE_ZERO')
+    special_value_dp = 0.0_dp
+  case default
+    special_value_dp = 0.0_dp
+  end select
 #endif
 
   end function special_value_dp
@@ -950,86 +948,86 @@ end function special_value_dp
   function special_value_sp(x, ieee)
 
 #ifndef GFORTRAN
-    use, intrinsic :: ieee_arithmetic, only: ieee_value, &
-         IEEE_SIGNALING_NAN, &
-         IEEE_QUIET_NAN, &
-         IEEE_NEGATIVE_INF, &
-         IEEE_POSITIVE_INF, &
-         IEEE_NEGATIVE_DENORMAL, &
-         IEEE_POSITIVE_DENORMAL, &
-         IEEE_NEGATIVE_NORMAL, &
-         IEEE_POSITIVE_NORMAL, &
-         IEEE_NEGATIVE_ZERO, &
-         IEEE_POSITIVE_ZERO
+    use, intrinsic :: ieee_arithmetic, only : ieee_value, &
+          IEEE_SIGNALING_NAN, &
+          IEEE_QUIET_NAN, &
+          IEEE_NEGATIVE_INF, &
+          IEEE_POSITIVE_INF, &
+          IEEE_NEGATIVE_DENORMAL, &
+          IEEE_POSITIVE_DENORMAL, &
+          IEEE_NEGATIVE_NORMAL, &
+          IEEE_POSITIVE_NORMAL, &
+          IEEE_NEGATIVE_ZERO, &
+          IEEE_POSITIVE_ZERO
 #endif
 
-    implicit none
-    
-    real(sp),         intent(in) :: x
-    character(len=*), intent(in) :: ieee
-    real(sp)                     :: special_value_sp
+  implicit none
+
+  real(sp), intent(in) :: x
+  character(len = *), intent(in) :: ieee
+  real(sp) :: special_value_sp
 
-    ! local
-    character(len=21) :: ieee_up
+  ! local
+  character(len = 21) :: ieee_up
 #ifdef GFORTRAN
     real(sp) :: tmp
 #endif
 
-    ieee_up = toupper(ieee)
+  ieee_up = toupper(ieee)
 #ifndef GFORTRAN
     select case(trim(ieee_up))
-    case('IEEE_SIGNALING_NAN')
-       special_value_sp = ieee_value(x, IEEE_SIGNALING_NAN)
-    case('IEEE_QUIET_NAN')
-       special_value_sp = ieee_value(x, IEEE_QUIET_NAN)
-    case('IEEE_NEGATIVE_INF')
-       special_value_sp = ieee_value(x, IEEE_NEGATIVE_INF)
-    case('IEEE_POSITIVE_INF')
-       special_value_sp = ieee_value(x, IEEE_POSITIVE_INF)
-    case('IEEE_NEGATIVE_DENORMAL')
-       special_value_sp = ieee_value(x, IEEE_NEGATIVE_DENORMAL)
-    case('IEEE_POSITIVE_DENORMAL')
-       special_value_sp = ieee_value(x, IEEE_POSITIVE_DENORMAL)
-    case('IEEE_NEGATIVE_NORMAL')
-       special_value_sp = ieee_value(x, IEEE_NEGATIVE_NORMAL)
-    case('IEEE_POSITIVE_NORMAL')
-       special_value_sp = ieee_value(x, IEEE_POSITIVE_NORMAL)
-    case('IEEE_NEGATIVE_ZERO')
-       special_value_sp = ieee_value(x, IEEE_NEGATIVE_ZERO)
-    case('IEEE_POSITIVE_ZERO')
-       special_value_sp = ieee_value(x, IEEE_POSITIVE_ZERO)
-    case default
-       special_value_sp = 0.0_sp
-    end select
+  case('IEEE_SIGNALING_NAN')
+    special_value_sp = ieee_value(x, IEEE_SIGNALING_NAN)
+  case('IEEE_QUIET_NAN')
+    special_value_sp = ieee_value(x, IEEE_QUIET_NAN)
+  case('IEEE_NEGATIVE_INF')
+    special_value_sp = ieee_value(x, IEEE_NEGATIVE_INF)
+  case('IEEE_POSITIVE_INF')
+    special_value_sp = ieee_value(x, IEEE_POSITIVE_INF)
+  case('IEEE_NEGATIVE_DENORMAL')
+    special_value_sp = ieee_value(x, IEEE_NEGATIVE_DENORMAL)
+  case('IEEE_POSITIVE_DENORMAL')
+    special_value_sp = ieee_value(x, IEEE_POSITIVE_DENORMAL)
+  case('IEEE_NEGATIVE_NORMAL')
+    special_value_sp = ieee_value(x, IEEE_NEGATIVE_NORMAL)
+  case('IEEE_POSITIVE_NORMAL')
+    special_value_sp = ieee_value(x, IEEE_POSITIVE_NORMAL)
+  case('IEEE_NEGATIVE_ZERO')
+    special_value_sp = ieee_value(x, IEEE_NEGATIVE_ZERO)
+  case('IEEE_POSITIVE_ZERO')
+    special_value_sp = ieee_value(x, IEEE_POSITIVE_ZERO)
+  case default
+    special_value_sp = 0.0_sp
+  end select
 #else
     select case(ieee_up)
-    case('IEEE_SIGNALING_NAN')
-       tmp = 0.0_sp
-       special_value_sp = tmp/tmp
-    case('IEEE_QUIET_NAN')
-       tmp = 0.0_sp
-       special_value_sp = tmp/tmp
-    case('IEEE_NEGATIVE_INF')
-       tmp = huge(x)
-       special_value_sp = -tmp*tmp
-    case('IEEE_POSITIVE_INF')
-       tmp = huge(x)
-       special_value_sp = tmp*tmp
-    case('IEEE_NEGATIVE_DENORMAL')
-       special_value_sp = -0.0_sp
-    case('IEEE_POSITIVE_DENORMAL')
-       special_value_sp = 0.0_sp
-    case('IEEE_NEGATIVE_NORMAL')
-       special_value_sp = -1.0_sp
-    case('IEEE_POSITIVE_NORMAL')
-       special_value_sp = 1.0_sp
-    case('IEEE_NEGATIVE_ZERO')
-       special_value_sp = -0.0_sp
-    case('IEEE_POSITIVE_ZERO')
-       special_value_sp = 0.0_sp
-    case default
-       special_value_sp = 0.0_sp
-    end select
+  case('IEEE_SIGNALING_NAN')
+    tmp = 0.0_sp
+    special_value_sp = tmp / tmp
+  case('IEEE_QUIET_NAN')
+    tmp = 0.0_sp
+    special_value_sp = tmp / tmp
+  case('IEEE_NEGATIVE_INF')
+    tmp = huge(x)
+    special_value_sp = -tmp * tmp
+  case('IEEE_POSITIVE_INF')
+    tmp = huge(x)
+    special_value_sp = tmp * tmp
+  case('IEEE_NEGATIVE_DENORMAL')
+    special_value_sp = -0.0_sp
+  case('IEEE_POSITIVE_DENORMAL')
+    special_value_sp = 0.0_sp
+  case('IEEE_NEGATIVE_NORMAL')
+    special_value_sp = -1.0_sp
+  case('IEEE_POSITIVE_NORMAL')
+    special_value_sp = 1.0_sp
+  case('IEEE_NEGATIVE_ZERO')
+    special_value_sp = -0.0_sp
+  case('IEEE_POSITIVE_ZERO')
+    special_value_sp = 0.0_sp
+  case default
+    special_value_sp = 0.0_sp
+  end select
 #endif
 
   end function special_value_sp
diff --git a/src/lib/mo_xor4096.f90 b/src/lib/mo_xor4096.f90
index e4fc2664..43789b81 100644
--- a/src/lib/mo_xor4096.f90
+++ b/src/lib/mo_xor4096.f90
@@ -35,7 +35,7 @@ module mo_xor4096
 
   ! Copyright 2011-13 Juliane Mai
 
-  use mo_kind, only: i4, i8, sp, dp
+  use mo_kind, only : i4, i8, sp, dp
 
   Implicit NONE
 
@@ -102,8 +102,8 @@ module mo_xor4096
   !         Written,  Juliane Mai, Aug 2012
 
   INTERFACE get_timeseed
-     MODULE PROCEDURE   get_timeseed_i4_0d, get_timeseed_i4_1d, &
-          get_timeseed_i8_0d, get_timeseed_i8_1d
+    MODULE PROCEDURE   get_timeseed_i4_0d, get_timeseed_i4_1d, &
+            get_timeseed_i8_0d, get_timeseed_i8_1d
   END INTERFACE get_timeseed
 
   ! ------------------------------------------------------------------
@@ -230,8 +230,8 @@ module mo_xor4096
   !         Written,  Juliane Mai, Nov 2011
 
   INTERFACE xor4096
-     MODULE PROCEDURE   xor4096s_0d, xor4096s_1d, xor4096f_0d, xor4096f_1d, &
-          xor4096l_0d, xor4096l_1d, xor4096d_0d, xor4096d_1d
+    MODULE PROCEDURE   xor4096s_0d, xor4096s_1d, xor4096f_0d, xor4096f_1d, &
+            xor4096l_0d, xor4096l_1d, xor4096d_0d, xor4096d_1d
   END INTERFACE xor4096
 
   ! ------------------------------------------------------------------
@@ -344,7 +344,7 @@ module mo_xor4096
   !         Modified, Juliane Mai, Feb 2013 - all optionals combined in save_state
 
   INTERFACE xor4096g
-     MODULE PROCEDURE xor4096gf_0d, xor4096gf_1d, xor4096gd_0d, xor4096gd_1d
+    MODULE PROCEDURE xor4096gf_0d, xor4096gf_1d, xor4096gd_0d, xor4096gd_1d
   END INTERFACE xor4096g
 
   ! ------------------------------------------------------------------
@@ -363,37 +363,37 @@ module mo_xor4096
   subroutine get_timeseed_i4_0d(seed)
 
     implicit none
-    integer(i4), intent(inout)  :: seed
+    integer(i4), intent(inout) :: seed
 
     ! local variables
-    integer(i4), dimension(8)  :: time_array
+    integer(i4), dimension(8) :: time_array
 
-    call date_and_time(values=time_array)
+    call date_and_time(values = time_array)
     seed = &
-         time_array(5) * 3600000_i4  + &   ! hour
-         time_array(6) * 60000_i4    + &   ! minutes
-         time_array(7) * 1000_i4     + &   ! seconds
-         time_array(8) * 1_i4              ! milliseconds
+            time_array(5) * 3600000_i4 + &   ! hour
+                    time_array(6) * 60000_i4 + &   ! minutes
+                    time_array(7) * 1000_i4 + &   ! seconds
+                    time_array(8) * 1_i4              ! milliseconds
 
   end subroutine get_timeseed_i4_0d
 
   subroutine get_timeseed_i4_1d(seed)
 
     implicit none
-    integer(i4), dimension(:), intent(inout)  :: seed
+    integer(i4), dimension(:), intent(inout) :: seed
 
     ! local variables
-    integer(i4), dimension(8)  :: time_array
-    integer(i4)                :: i
+    integer(i4), dimension(8) :: time_array
+    integer(i4) :: i
 
-    call date_and_time(values=time_array)
+    call date_and_time(values = time_array)
     seed(1) = &
-         time_array(5) * 3600000_i4  + &   ! hour
-         time_array(6) * 60000_i4    + &   ! minutes
-         time_array(7) * 1000_i4     + &   ! seconds
-         time_array(8) * 1_i4              ! milliseconds
-    do i=2,size(seed)
-       seed(i) = seed(i-1) + 1000_i4
+            time_array(5) * 3600000_i4 + &   ! hour
+                    time_array(6) * 60000_i4 + &   ! minutes
+                    time_array(7) * 1000_i4 + &   ! seconds
+                    time_array(8) * 1_i4              ! milliseconds
+    do i = 2, size(seed)
+      seed(i) = seed(i - 1) + 1000_i4
     end do
 
   end subroutine get_timeseed_i4_1d
@@ -401,60 +401,58 @@ end subroutine get_timeseed_i4_1d
   subroutine get_timeseed_i8_0d(seed)
 
     implicit none
-    integer(i8), intent(inout)  :: seed
+    integer(i8), intent(inout) :: seed
 
     ! local variables
-    integer(i4), dimension(8)  :: time_array
+    integer(i4), dimension(8) :: time_array
 
-    call date_and_time(values=time_array)
+    call date_and_time(values = time_array)
     seed = &
-         int(time_array(5),i8) * 3600000_i8  + &   ! hour
-         int(time_array(6),i8) * 60000_i8    + &   ! minutes
-         int(time_array(7),i8) * 1000_i8     + &   ! seconds
-         int(time_array(8),i8) * 1_i8              ! milliseconds
+            int(time_array(5), i8) * 3600000_i8 + &   ! hour
+                    int(time_array(6), i8) * 60000_i8 + &   ! minutes
+                    int(time_array(7), i8) * 1000_i8 + &   ! seconds
+                    int(time_array(8), i8) * 1_i8              ! milliseconds
 
   end subroutine get_timeseed_i8_0d
 
   subroutine get_timeseed_i8_1d(seed)
 
     implicit none
-    integer(i8), dimension(:), intent(inout)  :: seed
+    integer(i8), dimension(:), intent(inout) :: seed
 
     ! local variables
-    integer(i4), dimension(8)  :: time_array
-    integer(i4)                :: i
+    integer(i4), dimension(8) :: time_array
+    integer(i4) :: i
 
-    call date_and_time(values=time_array)
+    call date_and_time(values = time_array)
     seed(1) = &
-         int(time_array(5),i8) * 3600000_i8  + &   ! hour
-         int(time_array(6),i8) * 60000_i8    + &   ! minutes
-         int(time_array(7),i8) * 1000_i8     + &   ! seconds
-         int(time_array(8),i8) * 1_i8              ! milliseconds
-    do i=2,size(seed)
-       seed(i) = seed(i-1) + 1000_i8
+            int(time_array(5), i8) * 3600000_i8 + &   ! hour
+                    int(time_array(6), i8) * 60000_i8 + &   ! minutes
+                    int(time_array(7), i8) * 1000_i8 + &   ! seconds
+                    int(time_array(8), i8) * 1_i8              ! milliseconds
+    do i = 2, size(seed)
+      seed(i) = seed(i - 1) + 1000_i8
     end do
 
   end subroutine get_timeseed_i8_1d
 
   ! ------------------------------------------------------------------
 
-  subroutine xor4096s_0d(seed,SingleIntegerRN,save_state)
+  subroutine xor4096s_0d(seed, SingleIntegerRN, save_state)
     implicit none
 
-    integer(i4),                                    intent(in)    :: seed
-    integer(i4),                                    intent(out)   :: SingleIntegerRN
+    integer(i4), intent(in) :: seed
+    integer(i4), intent(out) :: SingleIntegerRN
     integer(i4), optional, dimension(n_save_state), intent(inout) :: save_state
 
-    integer(i4)        :: wlen, r, s, a, b, c, d
+    integer(i4) :: wlen, r, s, a, b, c, d
 
-    integer(i4), save  :: w
-    integer(i4), save  :: x(0:127)                 ! x(0) ... x(r-1)
-    integer(i4)        :: weyl = 1640531527_i4     !Z'61C88647'       ! Hexadecimal notation
-    integer(i4)        :: t,v
-    integer(i4), save  :: i = -1                   ! i<0 indicates first call
-    integer(i4)        :: k
-
-    !$omp   threadprivate(x,i,w)
+    integer(i4), save :: w
+    integer(i4), save :: x(0 : 127)                 ! x(0) ... x(r-1)
+    integer(i4) :: weyl = 1640531527_i4     !Z'61C88647'       ! Hexadecimal notation
+    integer(i4) :: t, v
+    integer(i4), save :: i = -1                   ! i<0 indicates first call
+    integer(i4) :: k
 
     wlen = 32
     r = 128
@@ -464,91 +462,89 @@ subroutine xor4096s_0d(seed,SingleIntegerRN,save_state)
     c = 13
     d = 15
 
-    if ( present(save_state) .and. (seed .eq. 0) ) then
-       x(0:r-1) = save_state(1:r)
-       i        = save_state(r+1)
-       w        = save_state(r+2)
+    if (present(save_state) .and. (seed .eq. 0)) then
+      x(0 : r - 1) = save_state(1 : r)
+      i = save_state(r + 1)
+      w = save_state(r + 2)
     end if
 
     If ((i .lt. 0) .or. (seed .ne. 0)) then     ! Initialization necessary
-       If (seed .ne. 0) then                   ! v must be nonzero
-          v = seed
-       else
-          v = NOT(seed)
-       end if
-
-       do k=wlen,1,-1                          ! Avoid correlations for close seeds
-          ! This recurrence has period of 2^32-1
-          v = IEOR(v,ISHFT(v,13))
-          v = IEOR(v,ISHFT(v,-17))
-          v = IEOR(v,ISHFT(v, 5))
-       end do
-
-       ! Initialize circular array
-       w = v
-       do k=0,r-1
-          w = w + weyl
-          v = IEOR(v,ISHFT(v,13))
-          v = IEOR(v,ISHFT(v,-17))
-          v = IEOR(v,ISHFT(v, 5))
-          x(k) = v + w
-       end do
-
-       ! Discard first 4*r results (Gimeno)
-       i = r-1
-       do k = 4*r,1,-1
-          i = IAND(i+1,r-1)
-          t = x(i)
-          v = x(IAND(i+(r-s),r-1))
-          t = IEOR(t,ISHFT(t,a))
-          t = IEOR(t,ISHFT(t,-b))
-          v = IEOR(v,ISHFT(v,c))
-          v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-          x(i) = v
-       end do
+      If (seed .ne. 0) then                   ! v must be nonzero
+        v = seed
+      else
+        v = NOT(seed)
+      end if
+
+      do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+        ! This recurrence has period of 2^32-1
+        v = IEOR(v, ISHFT(v, 13))
+        v = IEOR(v, ISHFT(v, -17))
+        v = IEOR(v, ISHFT(v, 5))
+      end do
+
+      ! Initialize circular array
+      w = v
+      do k = 0, r - 1
+        w = w + weyl
+        v = IEOR(v, ISHFT(v, 13))
+        v = IEOR(v, ISHFT(v, -17))
+        v = IEOR(v, ISHFT(v, 5))
+        x(k) = v + w
+      end do
+
+      ! Discard first 4*r results (Gimeno)
+      i = r - 1
+      do k = 4 * r, 1, -1
+        i = IAND(i + 1, r - 1)
+        t = x(i)
+        v = x(IAND(i + (r - s), r - 1))
+        t = IEOR(t, ISHFT(t, a))
+        t = IEOR(t, ISHFT(t, -b))
+        v = IEOR(v, ISHFT(v, c))
+        v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+        x(i) = v
+      end do
     end if ! end of initialization
 
     ! Apart from initialization (above), this is the generator
-    i = IAND(i+1,r-1)
+    i = IAND(i + 1, r - 1)
     t = x(i)
-    v = x(IAND(i+(r-s),r-1))
-    t = IEOR(t,ISHFT(t,a))
-    t = IEOR(t,ISHFT(t,-b))
-    v = IEOR(v,ISHFT(v,c))
-    v = IEOR(v,IEOR(t,ISHFT(v,-d)))
+    v = x(IAND(i + (r - s), r - 1))
+    t = IEOR(t, ISHFT(t, a))
+    t = IEOR(t, ISHFT(t, -b))
+    v = IEOR(v, ISHFT(v, c))
+    v = IEOR(v, IEOR(t, ISHFT(v, -d)))
     x(i) = v
 
     w = w + weyl
 
-    SingleIntegerRN = v+w
+    SingleIntegerRN = v + w
 
-    if( present(save_state) ) then
-       save_state(1:r)   = x(0:r-1)
-       save_state(r+1)   = i
-       save_state(r+2)   = w
-       if ((r+3) <= n_save_state) save_state(r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(1 : r) = x(0 : r - 1)
+      save_state(r + 1) = i
+      save_state(r + 2) = w
+      if ((r + 3) <= n_save_state) save_state(r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096s_0d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096s_1d(seed,SingleIntegerRN,save_state)
+  subroutine xor4096s_1d(seed, SingleIntegerRN, save_state)
     implicit none
 
-    integer(i4),           dimension(:),                         intent(in)    :: seed
-    integer(i4),           dimension(size(seed,1)),              intent(out)   :: SingleIntegerRN
-    integer(i4), optional, dimension(size(seed,1),n_save_state), intent(inout) :: save_state
+    integer(i4), dimension(:), intent(in) :: seed
+    integer(i4), dimension(size(seed, 1)), intent(out) :: SingleIntegerRN
+    integer(i4), optional, dimension(size(seed, 1), n_save_state), intent(inout) :: save_state
 
-    integer(i4)                        :: m
-    integer(i4)                        :: wlen, r, s, a, b, c, d
-    integer(i4)                        :: weyl = 1640531527_i4    !Z'61C88647'       ! Hexadecimal notation
-    integer(i4)                        :: k, j
-    integer(i4), dimension(size(seed,1)) :: t,v
-    integer(i4), dimension(:,:), allocatable, save   :: x               ! x(0) ... x(r-1)
-    integer(i4), dimension(:),   allocatable, save   :: i,w             ! i<0 indicates first call
-
-    !$omp   threadprivate(x,i,w)
+    integer(i4) :: m
+    integer(i4) :: wlen, r, s, a, b, c, d
+    integer(i4) :: weyl = 1640531527_i4    !Z'61C88647'       ! Hexadecimal notation
+    integer(i4) :: k, j
+    integer(i4), dimension(size(seed, 1)) :: t, v
+    integer(i4), dimension(:, :), allocatable, save :: x               ! x(0) ... x(r-1)
+    integer(i4), dimension(:), allocatable, save :: i, w             ! i<0 indicates first call
 
     wlen = 32
     r = 128
@@ -558,131 +554,131 @@ subroutine xor4096s_1d(seed,SingleIntegerRN,save_state)
     c = 13
     d = 15
 
-    m = size(seed,1)
+    m = size(seed, 1)
 
     if (any(seed .eq. 0_i4) .and. any(seed .ne. 0_i4)) then
-       stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
+      stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
     end if
 
-    if ( present(save_state) .and. all(seed .eq. 0_i4) ) then
-        if (allocated(x)) then
-           if (size(x,1) .ne. m) then
-              deallocate(x)
-              deallocate(i)
-              deallocate(w)
-              allocate(i(m))
-              allocate(x(m,0:r-1))
-              allocate(w(m))
-           end if
+    if (present(save_state) .and. all(seed .eq. 0_i4)) then
+      if (allocated(x)) then
+        if (size(x, 1) .ne. m) then
+          deallocate(x)
+          deallocate(i)
+          deallocate(w)
+          allocate(i(m))
+          allocate(x(m, 0 : r - 1))
+          allocate(w(m))
         end if
-       if (.not. allocated(x) ) then
-           allocate(i(m))
-           allocate(x(m,0:r-1))
-           allocate(w(m))
-       end if
-        x(:,0:r-1)  = save_state(:,1:r)
-        i(:)        = save_state(:,r+1)
-        w(:)        = save_state(:,r+2)
-    end if 
+      end if
+      if (.not. allocated(x)) then
+        allocate(i(m))
+        allocate(x(m, 0 : r - 1))
+        allocate(w(m))
+      end if
+      x(:, 0 : r - 1) = save_state(:, 1 : r)
+      i(:) = save_state(:, r + 1)
+      w(:) = save_state(:, r + 2)
+    end if
 
     if(all(seed .ne. 0_i4)) then
-       if ( allocated(x) ) then
-           deallocate(x)
-           deallocate(i)
-           deallocate(w)
-        end if
-
-       allocate(i(m))
-       i = -1
-       allocate(x(m,0:r-1))
-       allocate(w(m))
+      if (allocated(x)) then
+        deallocate(x)
+        deallocate(i)
+        deallocate(w)
+      end if
+
+      allocate(i(m))
+      i = -1
+      allocate(x(m, 0 : r - 1))
+      allocate(w(m))
     end if
 
     Do j = 1, m
-       If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
-          If (seed(j) .ne. 0) then                   ! v must be nonzero
-             v(j) = seed(j)
-          else
-             v(j) = NOT(seed(j))
-          end if
-
-          do k=wlen,1,-1                          ! Avoid correlations for close seeds
-             ! This recurrence has period of 2^32-1
-             v(j) = IEOR(v(j),ISHFT(v(j),13))
-             v(j) = IEOR(v(j),ISHFT(v(j),-17))
-             v(j) = IEOR(v(j),ISHFT(v(j), 5))
-          end do
-
-          ! Initialize circular array
-          w(j) = v(j)
-          do k=0,r-1
-             w(j) = w(j) + weyl
-             v(j) = IEOR(v(j),ISHFT(v(j),13))
-             v(j) = IEOR(v(j),ISHFT(v(j),-17))
-             v(j) = IEOR(v(j),ISHFT(v(j), 5))
-             x(j,k) = v(j) + w(j)
-          end do
-
-          ! Discard first 4*r results (Gimeno)
-          i(j) = r-1
-          do k = 4*r,1,-1
-             i(j) = IAND(i(j)+1,r-1)
-             t(j) = x(j,i(j))
-             v(j) = x(j,IAND(i(j)+(r-s),r-1))
-             t(j) = IEOR(t(j),ISHFT(t(j),a))
-             t(j) = IEOR(t(j),ISHFT(t(j),-b))
-             v(j) = IEOR(v(j),ISHFT(v(j),c))
-             v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-             x(j,i(j)) = v(j)
-          end do
-       end if ! end of initialization
+      If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
+        If (seed(j) .ne. 0) then                   ! v must be nonzero
+          v(j) = seed(j)
+        else
+          v(j) = NOT(seed(j))
+        end if
+
+        do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+          ! This recurrence has period of 2^32-1
+          v(j) = IEOR(v(j), ISHFT(v(j), 13))
+          v(j) = IEOR(v(j), ISHFT(v(j), -17))
+          v(j) = IEOR(v(j), ISHFT(v(j), 5))
+        end do
+
+        ! Initialize circular array
+        w(j) = v(j)
+        do k = 0, r - 1
+          w(j) = w(j) + weyl
+          v(j) = IEOR(v(j), ISHFT(v(j), 13))
+          v(j) = IEOR(v(j), ISHFT(v(j), -17))
+          v(j) = IEOR(v(j), ISHFT(v(j), 5))
+          x(j, k) = v(j) + w(j)
+        end do
+
+        ! Discard first 4*r results (Gimeno)
+        i(j) = r - 1
+        do k = 4 * r, 1, -1
+          i(j) = IAND(i(j) + 1, r - 1)
+          t(j) = x(j, i(j))
+          v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+          t(j) = IEOR(t(j), ISHFT(t(j), a))
+          t(j) = IEOR(t(j), ISHFT(t(j), -b))
+          v(j) = IEOR(v(j), ISHFT(v(j), c))
+          v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+          x(j, i(j)) = v(j)
+        end do
+      end if ! end of initialization
     end do
 
     ! Apart from initialization (above), this is the generator
 
-    do j=1,m
-       i(j) = IAND(i(j)+1,r-1)
-       t(j) = x(j,i(j))
-       v(j) = x(j,IAND(i(j)+(r-s),r-1))
-       t(j) = IEOR(t(j),ISHFT(t(j),a))
-       t(j) = IEOR(t(j),ISHFT(t(j),-b))
-       v(j) = IEOR(v(j),ISHFT(v(j),c))
-       v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-       x(j,i(j)) = v(j)
-
-       w(j) = w(j) + weyl
+    do j = 1, m
+      i(j) = IAND(i(j) + 1, r - 1)
+      t(j) = x(j, i(j))
+      v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+      t(j) = IEOR(t(j), ISHFT(t(j), a))
+      t(j) = IEOR(t(j), ISHFT(t(j), -b))
+      v(j) = IEOR(v(j), ISHFT(v(j), c))
+      v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+      x(j, i(j)) = v(j)
+
+      w(j) = w(j) + weyl
     end do
 
-    SingleIntegerRN = v+w
+    SingleIntegerRN = v + w
 
-    if( present(save_state) ) then
-       save_state(:,1:r)   = x(:,0:r-1)
-       save_state(:,r+1)   = i(:)
-       save_state(:,r+2)   = w(:)
-       if ((r+3) <= n_save_state) save_state(:,r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(:, 1 : r) = x(:, 0 : r - 1)
+      save_state(:, r + 1) = i(:)
+      save_state(:, r + 2) = w(:)
+      if ((r + 3) <= n_save_state) save_state(:, r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096s_1d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096f_0d(seed,SingleRealRN,save_state)
+  subroutine xor4096f_0d(seed, SingleRealRN, save_state)
 
     implicit none
 
-    integer(i4),                                    intent(in)    :: seed
-    real(SP),                                       intent(out)   :: SingleRealRN
+    integer(i4), intent(in) :: seed
+    real(SP), intent(out) :: SingleRealRN
     integer(i4), optional, dimension(n_save_state), intent(inout) :: save_state
 
-    integer(i4)        :: wlen, r, s, a, b, c, d
-    integer(i4), save  :: w
-    integer(i4), save  :: x(0:127)                 ! x(0) ... x(r-1)
-    integer(i4)        :: weyl = 1640531527_i4    !Z'61C88647'       ! Hexadecimal notation
-    integer(i4)        :: t,v
-    integer(i4), save  :: i = -1                   ! i<0 indicates first call
-    integer(i4)        :: k
+    integer(i4) :: wlen, r, s, a, b, c, d
+    integer(i4), save :: w
+    integer(i4), save :: x(0 : 127)                 ! x(0) ... x(r-1)
+    integer(i4) :: weyl = 1640531527_i4    !Z'61C88647'       ! Hexadecimal notation
+    integer(i4) :: t, v
+    integer(i4), save :: i = -1                   ! i<0 indicates first call
+    integer(i4) :: k
 
-    real(SP)            :: t24 = 1.0_SP/16777216.0_SP     ! = 0.5^24 = 1/2^24
+    real(SP) :: t24 = 1.0_SP / 16777216.0_SP     ! = 0.5^24 = 1/2^24
 
     !$omp   threadprivate(x,i,w)
 
@@ -697,95 +693,95 @@ subroutine xor4096f_0d(seed,SingleRealRN,save_state)
     c = 13
     d = 15
 
-    if ( present(save_state) .and. (seed .eq. 0) ) then
-       x(0:r-1) = save_state(1:r)
-       i        = save_state(r+1)
-       w        = save_state(r+2)
+    if (present(save_state) .and. (seed .eq. 0)) then
+      x(0 : r - 1) = save_state(1 : r)
+      i = save_state(r + 1)
+      w = save_state(r + 2)
     end if
 
     If ((i .lt. 0) .or. (seed .ne. 0)) then     ! Initialization necessary
-       If (seed .ne. 0) then                   ! v must be nonzero
-          v = seed
-       else
-          v = NOT(seed)
-       end if
-
-       do k=wlen,1,-1                          ! Avoid correlations for close seeds
-          ! This recurrence has period of 2^32-1
-          v = IEOR(v,ISHFT(v,13))
-          v = IEOR(v,ISHFT(v,-17))
-          v = IEOR(v,ISHFT(v, 5))
-       end do
-
-       ! Initialize circular array
-       w = v
-       do k=0,r-1
-          w = w + weyl
-          v = IEOR(v,ISHFT(v,13))
-          v = IEOR(v,ISHFT(v,-17))
-          v = IEOR(v,ISHFT(v, 5))
-          x(k) = v + w
-       end do
-
-       ! Discard first 4*r results (Gimeno)
-       i = r-1
-       do k = 4*r,1,-1
-          i = IAND(i+1,r-1)
-          t = x(i)
-          v = x(IAND(i+(r-s),r-1))
-          t = IEOR(t,ISHFT(t,a))
-          t = IEOR(t,ISHFT(t,-b))
-          v = IEOR(v,ISHFT(v,c))
-          v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-          x(i) = v
-       end do
+      If (seed .ne. 0) then                   ! v must be nonzero
+        v = seed
+      else
+        v = NOT(seed)
+      end if
+
+      do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+        ! This recurrence has period of 2^32-1
+        v = IEOR(v, ISHFT(v, 13))
+        v = IEOR(v, ISHFT(v, -17))
+        v = IEOR(v, ISHFT(v, 5))
+      end do
+
+      ! Initialize circular array
+      w = v
+      do k = 0, r - 1
+        w = w + weyl
+        v = IEOR(v, ISHFT(v, 13))
+        v = IEOR(v, ISHFT(v, -17))
+        v = IEOR(v, ISHFT(v, 5))
+        x(k) = v + w
+      end do
+
+      ! Discard first 4*r results (Gimeno)
+      i = r - 1
+      do k = 4 * r, 1, -1
+        i = IAND(i + 1, r - 1)
+        t = x(i)
+        v = x(IAND(i + (r - s), r - 1))
+        t = IEOR(t, ISHFT(t, a))
+        t = IEOR(t, ISHFT(t, -b))
+        v = IEOR(v, ISHFT(v, c))
+        v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+        x(i) = v
+      end do
     end if ! end of initialization
 
     ! Apart from initialization (above), this is the generator
     v = 0_i4
     Do While (v .eq. 0_i4)
-       i = IAND(i+1,r-1)
-       t = x(i)
-       v = x(IAND(i+(r-s),r-1))
-       t = IEOR(t,ISHFT(t,a))
-       t = IEOR(t,ISHFT(t,-b))
-       v = IEOR(v,ISHFT(v,c))
-       v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-       x(i) = v
-       w = w + weyl
-       v = v + w
-       v = ISHFT(v,-8)
+      i = IAND(i + 1, r - 1)
+      t = x(i)
+      v = x(IAND(i + (r - s), r - 1))
+      t = IEOR(t, ISHFT(t, a))
+      t = IEOR(t, ISHFT(t, -b))
+      v = IEOR(v, ISHFT(v, c))
+      v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+      x(i) = v
+      w = w + weyl
+      v = v + w
+      v = ISHFT(v, -8)
     End Do
 
-    SingleRealRN = t24*v
+    SingleRealRN = t24 * v
 
-    if( present(save_state) ) then
-       save_state(1:r)   = x(0:r-1)
-       save_state(r+1)   = i
-       save_state(r+2)   = w
-       if ((r+3) <= n_save_state) save_state(r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(1 : r) = x(0 : r - 1)
+      save_state(r + 1) = i
+      save_state(r + 2) = w
+      if ((r + 3) <= n_save_state) save_state(r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096f_0d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096f_1d(seed,SingleRealRN,save_state)
+  subroutine xor4096f_1d(seed, SingleRealRN, save_state)
 
     implicit none
 
-    integer(i4),           dimension(:),                         intent(in)  :: seed
-    real(SP),              dimension(size(seed)),                intent(out) :: SingleRealRN
-    integer(i4), optional, dimension(size(seed,1),n_save_state), intent(inout) :: save_state
+    integer(i4), dimension(:), intent(in) :: seed
+    real(SP), dimension(size(seed)), intent(out) :: SingleRealRN
+    integer(i4), optional, dimension(size(seed, 1), n_save_state), intent(inout) :: save_state
 
-    integer(i4)                         :: m
-    integer(i4)                         :: wlen, r, s, a, b, c, d
-    integer(i4)                         :: weyl =  1640531527_i4              !Z'61C88647' = Hexadecimal notation
-    integer(i4)                         :: k, j
-    real(SP), save                       :: t24 = 1.0_SP/16777216.0_SP      ! = 0.5^24 = 1/2^24
-    integer(i4), dimension(size(seed))  :: t,v
-    integer(i4), dimension(:,:), allocatable, save  :: x                   ! x(0) ... x(r-1)
-    integer(i4), dimension(:),   allocatable, save  :: i,w                 ! i<0 indicates first call
+    integer(i4) :: m
+    integer(i4) :: wlen, r, s, a, b, c, d
+    integer(i4) :: weyl = 1640531527_i4              !Z'61C88647' = Hexadecimal notation
+    integer(i4) :: k, j
+    real(SP), save :: t24 = 1.0_SP / 16777216.0_SP      ! = 0.5^24 = 1/2^24
+    integer(i4), dimension(size(seed)) :: t, v
+    integer(i4), dimension(:, :), allocatable, save :: x                   ! x(0) ... x(r-1)
+    integer(i4), dimension(:), allocatable, save :: i, w                 ! i<0 indicates first call
 
     ! produces a 24bit Integer Random Number (0...16777216) and
     ! scales it afterwards to (0.0,1.0)
@@ -800,132 +796,132 @@ subroutine xor4096f_1d(seed,SingleRealRN,save_state)
     c = 13
     d = 15
 
-    m = size(seed,1)
+    m = size(seed, 1)
 
     if (any(seed .eq. 0_i4) .and. any(seed .ne. 0_i4)) then
-       stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
+      stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
     end if
 
-    if ( present(save_state) .and. all(seed .eq. 0_i4) ) then
-        if (allocated(x)) then
-           if (size(x,1) .ne. m) then
-              deallocate(x)
-              deallocate(i)
-              deallocate(w)
-              allocate(i(m))
-              allocate(x(m,0:r-1))
-              allocate(w(m))
-           end if
+    if (present(save_state) .and. all(seed .eq. 0_i4)) then
+      if (allocated(x)) then
+        if (size(x, 1) .ne. m) then
+          deallocate(x)
+          deallocate(i)
+          deallocate(w)
+          allocate(i(m))
+          allocate(x(m, 0 : r - 1))
+          allocate(w(m))
         end if
-       if (.not. allocated(x) ) then
-           allocate(i(m))
-           allocate(x(m,0:r-1))
-           allocate(w(m))
-       end if
-        x(:,0:r-1)  = save_state(:,1:r)
-        i(:)        = save_state(:,r+1)
-        w(:)        = save_state(:,r+2)
-    end if 
+      end if
+      if (.not. allocated(x)) then
+        allocate(i(m))
+        allocate(x(m, 0 : r - 1))
+        allocate(w(m))
+      end if
+      x(:, 0 : r - 1) = save_state(:, 1 : r)
+      i(:) = save_state(:, r + 1)
+      w(:) = save_state(:, r + 2)
+    end if
 
     if(all(seed .ne. 0_i4)) then
-       if ( allocated(x) ) then
-           deallocate(x)
-           deallocate(i)
-           deallocate(w)
+      if (allocated(x)) then
+        deallocate(x)
+        deallocate(i)
+        deallocate(w)
+      end if
+
+      allocate(i(m))
+      i = -1
+      allocate(x(m, 0 : r - 1))
+      allocate(w(m))
+    end if
+
+    Do j = 1, m !Loop over every stream
+      If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
+        If (seed(j) .ne. 0) then                   ! v must be nonzero
+          v(j) = seed(j)
+        else
+          v(j) = NOT(seed(j))
         end if
 
-       allocate(i(m))
-       i = -1
-       allocate(x(m,0:r-1))
-       allocate(w(m))
-    end if
+        do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+          ! This recurrence has period of 2^32-1
+          v(j) = IEOR(v(j), ISHFT(v(j), 13))
+          v(j) = IEOR(v(j), ISHFT(v(j), -17))
+          v(j) = IEOR(v(j), ISHFT(v(j), 5))
+        end do
 
-    Do j = 1,m !Loop over every stream
-       If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
-          If (seed(j) .ne. 0) then                   ! v must be nonzero
-             v(j) = seed(j)
-          else
-             v(j) = NOT(seed(j))
-          end if
-
-          do k=wlen,1,-1                          ! Avoid correlations for close seeds
-             ! This recurrence has period of 2^32-1
-             v(j) = IEOR(v(j),ISHFT(v(j),13))
-             v(j) = IEOR(v(j),ISHFT(v(j),-17))
-             v(j) = IEOR(v(j),ISHFT(v(j), 5))
-          end do
-
-          ! Initialize circular array
-          w(j) = v(j)
-          do k=0,r-1
-             w(j) = w(j) + weyl
-             v(j) = IEOR(v(j),ISHFT(v(j),13))
-             v(j) = IEOR(v(j),ISHFT(v(j),-17))
-             v(j) = IEOR(v(j),ISHFT(v(j), 5))
-             x(j,k) = v(j) + w(j)
-          end do
-
-          ! Discard first 4*r results (Gimeno)
-          i(j) = r-1
-          do k = 4*r,1,-1
-             i(j) = IAND(i(j)+1,r-1)
-             t(j) = x(j,i(j))
-             v(j) = x(j,IAND(i(j)+(r-s),r-1))
-             t(j) = IEOR(t(j),ISHFT(t(j),a))
-             t(j) = IEOR(t(j),ISHFT(t(j),-b))
-             v(j) = IEOR(v(j),ISHFT(v(j),c))
-             v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-             x(j,i(j)) = v(j)
-          end do
-       end if ! end of initialization
+        ! Initialize circular array
+        w(j) = v(j)
+        do k = 0, r - 1
+          w(j) = w(j) + weyl
+          v(j) = IEOR(v(j), ISHFT(v(j), 13))
+          v(j) = IEOR(v(j), ISHFT(v(j), -17))
+          v(j) = IEOR(v(j), ISHFT(v(j), 5))
+          x(j, k) = v(j) + w(j)
+        end do
+
+        ! Discard first 4*r results (Gimeno)
+        i(j) = r - 1
+        do k = 4 * r, 1, -1
+          i(j) = IAND(i(j) + 1, r - 1)
+          t(j) = x(j, i(j))
+          v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+          t(j) = IEOR(t(j), ISHFT(t(j), a))
+          t(j) = IEOR(t(j), ISHFT(t(j), -b))
+          v(j) = IEOR(v(j), ISHFT(v(j), c))
+          v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+          x(j, i(j)) = v(j)
+        end do
+      end if ! end of initialization
     end do
 
     ! Apart from initialization (above), this is the generator
     v = 0_i4
-    Do j=1,m
-       Do While (v(j) .eq. 0_i4)
-          i(j) = IAND(i(j)+1,r-1)
-          t(j) = x(j,i(j))
-          v(j) = x(j,IAND(i(j)+(r-s),r-1))
-          t(j) = IEOR(t(j),ISHFT(t(j),a))
-          t(j) = IEOR(t(j),ISHFT(t(j),-b))
-          v(j) = IEOR(v(j),ISHFT(v(j),c))
-          v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-          x(j,i(j)) = v(j)
-          w(j) = w(j) + weyl
-          v(j) = v(j) + w(j)
-          v(j) = ISHFT(v(j),-8)
-       End Do
+    Do j = 1, m
+      Do While (v(j) .eq. 0_i4)
+        i(j) = IAND(i(j) + 1, r - 1)
+        t(j) = x(j, i(j))
+        v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+        t(j) = IEOR(t(j), ISHFT(t(j), a))
+        t(j) = IEOR(t(j), ISHFT(t(j), -b))
+        v(j) = IEOR(v(j), ISHFT(v(j), c))
+        v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+        x(j, i(j)) = v(j)
+        w(j) = w(j) + weyl
+        v(j) = v(j) + w(j)
+        v(j) = ISHFT(v(j), -8)
+      End Do
     End Do
 
-    SingleRealRN = t24*v
+    SingleRealRN = t24 * v
 
-    if( present(save_state) ) then
-       save_state(:,1:r)   = x(:,0:r-1)
-       save_state(:,r+1)   = i(:)
-       save_state(:,r+2)   = w(:)
-       if ((r+3) <= n_save_state) save_state(:,r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(:, 1 : r) = x(:, 0 : r - 1)
+      save_state(:, r + 1) = i(:)
+      save_state(:, r + 2) = w(:)
+      if ((r + 3) <= n_save_state) save_state(:, r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096f_1d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096l_0d(seed,DoubleIntegerRN,save_state)
+  subroutine xor4096l_0d(seed, DoubleIntegerRN, save_state)
 
     implicit none
 
-    integer(i8),                                    intent(in)  :: seed
-    integer(i8),                                    intent(out) :: DoubleIntegerRN
+    integer(i8), intent(in) :: seed
+    integer(i8), intent(out) :: DoubleIntegerRN
     integer(i8), optional, dimension(n_save_state), intent(inout) :: save_state
 
-    integer(i8)        :: wlen, r, s, a, b, c, d
-    integer(i8), save  :: w
-    integer(i8), save  :: x(0:63)                  ! x(0) ... x(r-1)
-    integer(i8)        :: weyl = 7046029254386353131_i8
-    integer(i8)        :: t,v
-    integer(i8), save  :: i = -1                   ! i<0 indicates first call
-    integer(i8)        :: k
+    integer(i8) :: wlen, r, s, a, b, c, d
+    integer(i8), save :: w
+    integer(i8), save :: x(0 : 63)                  ! x(0) ... x(r-1)
+    integer(i8) :: weyl = 7046029254386353131_i8
+    integer(i8) :: t, v
+    integer(i8), save :: i = -1                   ! i<0 indicates first call
+    integer(i8) :: k
 
     !$omp   threadprivate(x,i,w)
 
@@ -937,67 +933,67 @@ subroutine xor4096l_0d(seed,DoubleIntegerRN,save_state)
     c = 27_i8
     d = 29_i8
 
-    if ( present(save_state) .and. (seed .eq. 0_i8) ) then
-       x(0:r-1)  = save_state(1:r)
-       i         = save_state(r+1)
-       w         = save_state(r+2)
+    if (present(save_state) .and. (seed .eq. 0_i8)) then
+      x(0 : r - 1) = save_state(1 : r)
+      i = save_state(r + 1)
+      w = save_state(r + 2)
     end if
 
     If ((i .lt. 0) .or. (seed .ne. 0)) then     ! Initialization necessary
-       If (seed .ne. 0) then                   ! v must be nonzero
-          v = seed
-       else
-          v = NOT(seed)
-       end if
-
-       do k=wlen,1,-1                          ! Avoid correlations for close seeds
-          ! This recurrence has period of 2^64-1
-          v = IEOR(v,ISHFT(v,7))
-          v = IEOR(v,ISHFT(v,-9))
-       end do
-
-       ! Initialize circular array
-       w = v
-       do k=0,r-1
-          w = w + weyl
-          v = IEOR(v,ISHFT(v,7))
-          v = IEOR(v,ISHFT(v,-9))
-          x(k) = v + w
-       end do
-
-       ! Discard first 4*r results (Gimeno)
-       i = r-1
-       do k = 4*r,1,-1
-          i = IAND(i+1,r-1)
-          t = x(i)
-          v = x(IAND(i+(r-s),r-1))
-          t = IEOR(t,ISHFT(t,a))
-          t = IEOR(t,ISHFT(t,-b))
-          v = IEOR(v,ISHFT(v,c))
-          v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-          x(i) = v
-       end do
+      If (seed .ne. 0) then                   ! v must be nonzero
+        v = seed
+      else
+        v = NOT(seed)
+      end if
+
+      do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+        ! This recurrence has period of 2^64-1
+        v = IEOR(v, ISHFT(v, 7))
+        v = IEOR(v, ISHFT(v, -9))
+      end do
+
+      ! Initialize circular array
+      w = v
+      do k = 0, r - 1
+        w = w + weyl
+        v = IEOR(v, ISHFT(v, 7))
+        v = IEOR(v, ISHFT(v, -9))
+        x(k) = v + w
+      end do
+
+      ! Discard first 4*r results (Gimeno)
+      i = r - 1
+      do k = 4 * r, 1, -1
+        i = IAND(i + 1, r - 1)
+        t = x(i)
+        v = x(IAND(i + (r - s), r - 1))
+        t = IEOR(t, ISHFT(t, a))
+        t = IEOR(t, ISHFT(t, -b))
+        v = IEOR(v, ISHFT(v, c))
+        v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+        x(i) = v
+      end do
     end if ! end of initialization
 
     ! Apart from initialization (above), this is the generator
-    i = IAND(i+1,r-1)
+    i = IAND(i + 1, r - 1)
     t = x(i)
-    v = x(IAND(i+(r-s),r-1))
-    t = IEOR(t,ISHFT(t,a))
-    t = IEOR(t,ISHFT(t,-b))
-    v = IEOR(v,ISHFT(v,c))
-    v = IEOR(v,IEOR(t,ISHFT(v,-d)))
+    v = x(IAND(i + (r - s), r - 1))
+    t = IEOR(t, ISHFT(t, a))
+    t = IEOR(t, ISHFT(t, -b))
+    v = IEOR(v, ISHFT(v, c))
+    v = IEOR(v, IEOR(t, ISHFT(v, -d)))
     x(i) = v
 
     w = w + weyl
 
-    DoubleIntegerRN = v+w
+    DoubleIntegerRN = v + w
 
-    if( present(save_state) ) then
-       save_state(1:r)   = x(0:r-1)
-       save_state(r+1)   = i
-       save_state(r+2)   = w
-       if ((r+3) <= n_save_state) save_state(r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(1 : r) = x(0 : r - 1)
+      save_state(r + 1) = i
+      save_state(r + 2) = w
+      if ((r + 3) <= n_save_state) save_state(r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096l_0d
@@ -1008,17 +1004,17 @@ subroutine xor4096l_1d(seed, DoubleIntegerRN, save_state)
 
     implicit none
 
-    integer(i8),           dimension(:),                         intent(in)    :: seed
-    integer(i8),           dimension(size(seed,1)),              intent(out)   :: DoubleIntegerRN
-    integer(i8), optional, dimension(size(seed,1),n_save_state), intent(inout) :: save_state
+    integer(i8), dimension(:), intent(in) :: seed
+    integer(i8), dimension(size(seed, 1)), intent(out) :: DoubleIntegerRN
+    integer(i8), optional, dimension(size(seed, 1), n_save_state), intent(inout) :: save_state
 
-    integer(i4)        :: m
-    integer(i8)        :: wlen, r, s, a, b, c, d
-    integer(i8)        :: weyl = 7046029254386353131_i8
-    integer(i8)        :: k, j
-    integer(i8), dimension(size(seed))              :: t,v
-    integer(i8), dimension(:,:), allocatable, save  :: x                  ! x(0) ... x(r-1)
-    integer(i8), dimension(:),   allocatable, save  :: i,w                ! i<0 indicates first call
+    integer(i4) :: m
+    integer(i8) :: wlen, r, s, a, b, c, d
+    integer(i8) :: weyl = 7046029254386353131_i8
+    integer(i8) :: k, j
+    integer(i8), dimension(size(seed)) :: t, v
+    integer(i8), dimension(:, :), allocatable, save :: x                  ! x(0) ... x(r-1)
+    integer(i8), dimension(:), allocatable, save :: i, w                ! i<0 indicates first call
 
     !$omp   threadprivate(x,i,w)
 
@@ -1030,129 +1026,129 @@ subroutine xor4096l_1d(seed, DoubleIntegerRN, save_state)
     c = 27_i8
     d = 29_i8
 
-    m = size(seed,1)
+    m = size(seed, 1)
 
     if (any(seed .eq. 0_i8) .and. any(seed .ne. 0_i8)) then
-       stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
+      stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
     end if
 
-    if ( present(save_state) .and. all(seed .eq. 0_i4) ) then
-        if (allocated(x)) then
-           if (size(x,1) .ne. m) then
-              deallocate(x)
-              deallocate(i)
-              deallocate(w)
-              allocate(i(m))
-              allocate(x(m,0:r-1))
-              allocate(w(m))
-           end if
+    if (present(save_state) .and. all(seed .eq. 0_i4)) then
+      if (allocated(x)) then
+        if (size(x, 1) .ne. m) then
+          deallocate(x)
+          deallocate(i)
+          deallocate(w)
+          allocate(i(m))
+          allocate(x(m, 0 : r - 1))
+          allocate(w(m))
         end if
-       if (.not. allocated(x) ) then
-           allocate(i(m))
-           allocate(x(m,0:r-1))
-           allocate(w(m))
-       end if
-        x(:,0:r-1)  = save_state(:,1:r)
-        i(:)        = save_state(:,r+1)
-        w(:)        = save_state(:,r+2)
-    end if 
+      end if
+      if (.not. allocated(x)) then
+        allocate(i(m))
+        allocate(x(m, 0 : r - 1))
+        allocate(w(m))
+      end if
+      x(:, 0 : r - 1) = save_state(:, 1 : r)
+      i(:) = save_state(:, r + 1)
+      w(:) = save_state(:, r + 2)
+    end if
 
     if(all(seed .ne. 0_i4)) then
-       if ( allocated(x) ) then
-           deallocate(x)
-           deallocate(i)
-           deallocate(w)
+      if (allocated(x)) then
+        deallocate(x)
+        deallocate(i)
+        deallocate(w)
+      end if
+
+      allocate(i(m))
+      i = -1
+      allocate(x(m, 0 : r - 1))
+      allocate(w(m))
+    end if
+
+    Do j = 1, m
+      If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
+        If (seed(j) .ne. 0) then                   ! v must be nonzero
+          v(j) = seed(j)
+        else
+          v(j) = NOT(seed(j))
         end if
 
-       allocate(i(m))
-       i = -1
-       allocate(x(m,0:r-1))
-       allocate(w(m))
-    end if
+        do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+          ! This recurrence has period of 2^64-1
+          v(j) = IEOR(v(j), ISHFT(v(j), 7))
+          v(j) = IEOR(v(j), ISHFT(v(j), -9))
+        end do
 
-    Do j=1,m
-       If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
-          If (seed(j) .ne. 0) then                   ! v must be nonzero
-             v(j) = seed(j)
-          else
-             v(j) = NOT(seed(j))
-          end if
-
-          do k=wlen,1,-1                          ! Avoid correlations for close seeds
-             ! This recurrence has period of 2^64-1
-             v(j) = IEOR(v(j),ISHFT(v(j),7))
-             v(j) = IEOR(v(j),ISHFT(v(j),-9))
-          end do
-
-          ! Initialize circular array
-          w(j) = v(j)
-          do k=0,r-1
-             w(j) = w(j) + weyl
-             v(j) = IEOR(v(j),ISHFT(v(j),7))
-             v(j) = IEOR(v(j),ISHFT(v(j),-9))
-             x(j,k) = v(j) + w(j)
-          end do
-
-          ! Discard first 4*r results (Gimeno)
-          i(j) = r-1
-          do k = 4*r,1,-1
-             i(j) = IAND(i(j)+1,r-1)
-             t(j) = x(j,i(j))
-             v(j) = x(j,IAND(i(j)+(r-s),r-1))
-             t(j) = IEOR(t(j),ISHFT(t(j),a))
-             t(j) = IEOR(t(j),ISHFT(t(j),-b))
-             v(j) = IEOR(v(j),ISHFT(v(j),c))
-             v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-             x(j,i(j)) = v(j)
-          end do
-       end if ! end of initialization
+        ! Initialize circular array
+        w(j) = v(j)
+        do k = 0, r - 1
+          w(j) = w(j) + weyl
+          v(j) = IEOR(v(j), ISHFT(v(j), 7))
+          v(j) = IEOR(v(j), ISHFT(v(j), -9))
+          x(j, k) = v(j) + w(j)
+        end do
+
+        ! Discard first 4*r results (Gimeno)
+        i(j) = r - 1
+        do k = 4 * r, 1, -1
+          i(j) = IAND(i(j) + 1, r - 1)
+          t(j) = x(j, i(j))
+          v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+          t(j) = IEOR(t(j), ISHFT(t(j), a))
+          t(j) = IEOR(t(j), ISHFT(t(j), -b))
+          v(j) = IEOR(v(j), ISHFT(v(j), c))
+          v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+          x(j, i(j)) = v(j)
+        end do
+      end if ! end of initialization
     end do
 
     ! Apart from initialization (above), this is the generator
-    do j=1,m
-       i(j) = IAND(i(j)+1,r-1)
-       t(j) = x(j,i(j))
-       v(j) = x(j,IAND(i(j)+(r-s),r-1))
-       t(j) = IEOR(t(j),ISHFT(t(j),a))
-       t(j) = IEOR(t(j),ISHFT(t(j),-b))
-       v(j) = IEOR(v(j),ISHFT(v(j),c))
-       v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-       x(j,i(j)) = v(j)
-
-       w(j) = w(j) + weyl
+    do j = 1, m
+      i(j) = IAND(i(j) + 1, r - 1)
+      t(j) = x(j, i(j))
+      v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+      t(j) = IEOR(t(j), ISHFT(t(j), a))
+      t(j) = IEOR(t(j), ISHFT(t(j), -b))
+      v(j) = IEOR(v(j), ISHFT(v(j), c))
+      v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+      x(j, i(j)) = v(j)
+
+      w(j) = w(j) + weyl
     end do
 
-    DoubleIntegerRN = v+w
+    DoubleIntegerRN = v + w
 
-    if( present(save_state) ) then
-       save_state(:,1:r)   = x(:,0:r-1)
-       save_state(:,r+1)   = i(:)
-       save_state(:,r+2)   = w(:)
-       if ((r+3) <= n_save_state) save_state(:,r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(:, 1 : r) = x(:, 0 : r - 1)
+      save_state(:, r + 1) = i(:)
+      save_state(:, r + 2) = w(:)
+      if ((r + 3) <= n_save_state) save_state(:, r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096l_1d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096d_0d(seed,DoubleRealRN,save_state)
+  subroutine xor4096d_0d(seed, DoubleRealRN, save_state)
 
     implicit none
 
-    integer(i8),                                    intent(in)    :: seed
-    real(DP),                                       intent(out)   :: DoubleRealRN
+    integer(i8), intent(in) :: seed
+    real(DP), intent(out) :: DoubleRealRN
     integer(i8), optional, dimension(n_save_state), intent(inout) :: save_state
 
-    integer(i8)        :: wlen, r, s, a, b, c, d
+    integer(i8) :: wlen, r, s, a, b, c, d
 
-    integer(i8), save  :: w
-    integer(i8), save  :: x(0:63)                  ! x(0) ... x(r-1)
-    integer(i8)        :: weyl = 7046029254386353131_i8
-    integer(i8)        :: t,v
-    integer(i8), save  :: i = -1                   ! i<0 indicates first call
-    integer(i8)        :: k
+    integer(i8), save :: w
+    integer(i8), save :: x(0 : 63)                  ! x(0) ... x(r-1)
+    integer(i8) :: weyl = 7046029254386353131_i8
+    integer(i8) :: t, v
+    integer(i8), save :: i = -1                   ! i<0 indicates first call
+    integer(i8) :: k
 
-    real(DP)            :: t53 = 1.0_DP/9007199254740992.0_DP                     ! = 0.5^53 = 1/2^53
+    real(DP) :: t53 = 1.0_DP / 9007199254740992.0_DP                     ! = 0.5^53 = 1/2^53
 
     !$omp   threadprivate(x,i,w)
 
@@ -1167,94 +1163,94 @@ subroutine xor4096d_0d(seed,DoubleRealRN,save_state)
     c = 27_i8
     d = 29_i8
 
-    if ( present(save_state) .and. (seed .eq. 0_i8) ) then
-       x(0:r-1)  = save_state(1:r)
-       i         = save_state(r+1)
-       w         = save_state(r+2)
+    if (present(save_state) .and. (seed .eq. 0_i8)) then
+      x(0 : r - 1) = save_state(1 : r)
+      i = save_state(r + 1)
+      w = save_state(r + 2)
     end if
 
     If ((i .lt. 0) .or. (seed .ne. 0)) then     ! Initialization necessary
-       If (seed .ne. 0) then                   ! v must be nonzero
-          v = seed
-       else
-          v = NOT(seed)
-       end if
-
-       do k=wlen,1,-1                          ! Avoid correlations for close seeds
-          ! This recurrence has period of 2^64-1
-          v = IEOR(v,ISHFT(v,7))
-          v = IEOR(v,ISHFT(v,-9))
-       end do
-
-       ! Initialize circular array
-       w = v
-       do k=0,r-1
-          w = w + weyl
-          v = IEOR(v,ISHFT(v,7))
-          v = IEOR(v,ISHFT(v,-9))
-          x(k) = v + w
-       end do
-
-       ! Discard first 4*r results (Gimeno)
-       i = r-1
-       do k = 4*r,1,-1
-          i = IAND(i+1,r-1)
-          t = x(i)
-          v = x(IAND(i+(r-s),r-1))
-          t = IEOR(t,ISHFT(t,a))
-          t = IEOR(t,ISHFT(t,-b))
-          v = IEOR(v,ISHFT(v,c))
-          v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-          x(i) = v
-       end do
+      If (seed .ne. 0) then                   ! v must be nonzero
+        v = seed
+      else
+        v = NOT(seed)
+      end if
+
+      do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+        ! This recurrence has period of 2^64-1
+        v = IEOR(v, ISHFT(v, 7))
+        v = IEOR(v, ISHFT(v, -9))
+      end do
+
+      ! Initialize circular array
+      w = v
+      do k = 0, r - 1
+        w = w + weyl
+        v = IEOR(v, ISHFT(v, 7))
+        v = IEOR(v, ISHFT(v, -9))
+        x(k) = v + w
+      end do
+
+      ! Discard first 4*r results (Gimeno)
+      i = r - 1
+      do k = 4 * r, 1, -1
+        i = IAND(i + 1, r - 1)
+        t = x(i)
+        v = x(IAND(i + (r - s), r - 1))
+        t = IEOR(t, ISHFT(t, a))
+        t = IEOR(t, ISHFT(t, -b))
+        v = IEOR(v, ISHFT(v, c))
+        v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+        x(i) = v
+      end do
     end if ! end of initialization
 
     ! Apart from initialization (above), this is the generator
     v = 0_i8
     Do While (v .eq. 0_i8)
-       i = IAND(i+1,r-1)
-       t = x(i)
-       v = x(IAND(i+(r-s),r-1))
-       t = IEOR(t,ISHFT(t,a))
-       t = IEOR(t,ISHFT(t,-b))
-       v = IEOR(v,ISHFT(v,c))
-       v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-       x(i) = v
-       w = w + weyl
-       v = v + w
-       v = ISHFT(v,-11)
+      i = IAND(i + 1, r - 1)
+      t = x(i)
+      v = x(IAND(i + (r - s), r - 1))
+      t = IEOR(t, ISHFT(t, a))
+      t = IEOR(t, ISHFT(t, -b))
+      v = IEOR(v, ISHFT(v, c))
+      v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+      x(i) = v
+      w = w + weyl
+      v = v + w
+      v = ISHFT(v, -11)
     End Do
 
-    DoubleRealRN = t53*v
+    DoubleRealRN = t53 * v
 
-    if( present(save_state) ) then
-       save_state(1:r)   = x(0:r-1)
-       save_state(r+1)   = i
-       save_state(r+2)   = w
-       if ((r+3) <= n_save_state) save_state(r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(1 : r) = x(0 : r - 1)
+      save_state(r + 1) = i
+      save_state(r + 2) = w
+      if ((r + 3) <= n_save_state) save_state(r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096d_0d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096d_1d(seed,DoubleRealRN,save_state)
+  subroutine xor4096d_1d(seed, DoubleRealRN, save_state)
 
     implicit none
 
-    integer(i8),           dimension(:),                         intent(in)    :: seed
-    real(DP),              dimension(size(seed,1)),              intent(out)   :: DoubleRealRN
-    integer(i8), optional, dimension(size(seed,1),n_save_state), intent(inout) :: save_state
+    integer(i8), dimension(:), intent(in) :: seed
+    real(DP), dimension(size(seed, 1)), intent(out) :: DoubleRealRN
+    integer(i8), optional, dimension(size(seed, 1), n_save_state), intent(inout) :: save_state
 
-    integer(i4)                       :: m
-    integer(i8)                       :: wlen, r, s, a, b, c, d
-    integer(i8)                       :: weyl = 7046029254386353131_i8
-    real(DP)                           :: t53  = 1.0_DP/9007199254740992.0_DP  ! = 0.5^53 = 1/2^53
-    integer(i8)                       :: k,j
-    integer(i8), dimension(size(seed))              :: t,v
-    integer(i8), dimension(:,:), allocatable, save  :: x       ! x(0) ... x(r-1)
-    integer(i8), dimension(:),   allocatable, save  :: w
-    integer(i8), dimension(:),   allocatable, save  :: i       ! i<0 indicates first call
+    integer(i4) :: m
+    integer(i8) :: wlen, r, s, a, b, c, d
+    integer(i8) :: weyl = 7046029254386353131_i8
+    real(DP) :: t53 = 1.0_DP / 9007199254740992.0_DP  ! = 0.5^53 = 1/2^53
+    integer(i8) :: k, j
+    integer(i8), dimension(size(seed)) :: t, v
+    integer(i8), dimension(:, :), allocatable, save :: x       ! x(0) ... x(r-1)
+    integer(i8), dimension(:), allocatable, save :: w
+    integer(i8), dimension(:), allocatable, save :: i       ! i<0 indicates first call
 
     !$omp   threadprivate(x,i,w)
 
@@ -1269,136 +1265,136 @@ subroutine xor4096d_1d(seed,DoubleRealRN,save_state)
     c = 27_i8
     d = 29_i8
 
-    m = size(seed,1)
+    m = size(seed, 1)
 
     if (any(seed .eq. 0_i8) .and. any(seed .ne. 0_i8)) then
-       stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
+      stop 'xor4096: seeds have to be eigther all 0 or all larger than 0'
     end if
 
-    if ( present(save_state) .and. all(seed .eq. 0_i4) ) then
-        if (allocated(x)) then
-           if (size(x,1) .ne. m) then
-              deallocate(x)
-              deallocate(i)
-              deallocate(w)
-              allocate(i(m))
-              allocate(x(m,0:r-1))
-              allocate(w(m))
-           end if
+    if (present(save_state) .and. all(seed .eq. 0_i4)) then
+      if (allocated(x)) then
+        if (size(x, 1) .ne. m) then
+          deallocate(x)
+          deallocate(i)
+          deallocate(w)
+          allocate(i(m))
+          allocate(x(m, 0 : r - 1))
+          allocate(w(m))
         end if
-       if (.not. allocated(x) ) then
-           allocate(i(m))
-           allocate(x(m,0:r-1))
-           allocate(w(m))
-       end if
-        x(:,0:r-1)  = save_state(:,1:r)
-        i(:)        = save_state(:,r+1)
-        w(:)        = save_state(:,r+2)
-    end if 
+      end if
+      if (.not. allocated(x)) then
+        allocate(i(m))
+        allocate(x(m, 0 : r - 1))
+        allocate(w(m))
+      end if
+      x(:, 0 : r - 1) = save_state(:, 1 : r)
+      i(:) = save_state(:, r + 1)
+      w(:) = save_state(:, r + 2)
+    end if
 
     if(all(seed .ne. 0_i4)) then
-       if ( allocated(x) ) then
-           deallocate(x)
-           deallocate(i)
-           deallocate(w)
+      if (allocated(x)) then
+        deallocate(x)
+        deallocate(i)
+        deallocate(w)
+      end if
+
+      allocate(i(m))
+      i = -1
+      allocate(x(m, 0 : r - 1))
+      allocate(w(m))
+    end if
+
+    Do j = 1, m
+      If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
+        If (seed(j) .ne. 0) then                   ! v must be nonzero
+          v(j) = seed(j)
+        else
+          v(j) = NOT(seed(j))
         end if
 
-       allocate(i(m))
-       i = -1
-       allocate(x(m,0:r-1))
-       allocate(w(m))
-    end if
+        do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+          ! This recurrence has period of 2^64-1
+          v(j) = IEOR(v(j), ISHFT(v(j), 7))
+          v(j) = IEOR(v(j), ISHFT(v(j), -9))
+        end do
 
-    Do j=1,m
-       If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
-          If (seed(j) .ne. 0) then                   ! v must be nonzero
-             v(j) = seed(j)
-          else
-             v(j) = NOT(seed(j))
-          end if
-
-          do k=wlen,1,-1                          ! Avoid correlations for close seeds
-             ! This recurrence has period of 2^64-1
-             v(j) = IEOR(v(j),ISHFT(v(j),7))
-             v(j) = IEOR(v(j),ISHFT(v(j),-9))
-          end do
-
-          ! Initialize circular array
-          w(j) = v(j)
-          do k=0,r-1
-             w(j) = w(j) + weyl
-             v(j) = IEOR(v(j),ISHFT(v(j),7))
-             v(j) = IEOR(v(j),ISHFT(v(j),-9))
-             x(j,k) = v(j) + w(j)
-          end do
-
-          ! Discard first 4*r results (Gimeno)
-          i(j) = r-1
-          do k = 4*r,1,-1
-             i(j) = IAND(i(j)+1,r-1)
-             t(j) = x(j,i(j))
-             v(j) = x(j,IAND(i(j)+(r-s),r-1))
-             t(j) = IEOR(t(j),ISHFT(t(j),a))
-             t(j) = IEOR(t(j),ISHFT(t(j),-b))
-             v(j) = IEOR(v(j),ISHFT(v(j),c))
-             v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-             x(j,i(j)) = v(j)
-          end do
-       end if ! end of initialization
+        ! Initialize circular array
+        w(j) = v(j)
+        do k = 0, r - 1
+          w(j) = w(j) + weyl
+          v(j) = IEOR(v(j), ISHFT(v(j), 7))
+          v(j) = IEOR(v(j), ISHFT(v(j), -9))
+          x(j, k) = v(j) + w(j)
+        end do
+
+        ! Discard first 4*r results (Gimeno)
+        i(j) = r - 1
+        do k = 4 * r, 1, -1
+          i(j) = IAND(i(j) + 1, r - 1)
+          t(j) = x(j, i(j))
+          v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+          t(j) = IEOR(t(j), ISHFT(t(j), a))
+          t(j) = IEOR(t(j), ISHFT(t(j), -b))
+          v(j) = IEOR(v(j), ISHFT(v(j), c))
+          v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+          x(j, i(j)) = v(j)
+        end do
+      end if ! end of initialization
     end do
 
     ! Apart from initialization (above), this is the generator
     v = 0_i8
-    Do j=1,m
-       Do While (v(j) .eq. 0_i8)
-          i(j) = IAND(i(j)+1,r-1)
-          t(j) = x(j,i(j))
-          v(j) = x(j,IAND(i(j)+(r-s),r-1))
-          t(j) = IEOR(t(j),ISHFT(t(j),a))
-          t(j) = IEOR(t(j),ISHFT(t(j),-b))
-          v(j) = IEOR(v(j),ISHFT(v(j),c))
-          v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-          x(j,i(j)) = v(j)
-          w(j) = w(j) + weyl
-          v(j) = v(j) + w(j)
-          v(j) = ISHFT(v(j),-11)
-       End Do
+    Do j = 1, m
+      Do While (v(j) .eq. 0_i8)
+        i(j) = IAND(i(j) + 1, r - 1)
+        t(j) = x(j, i(j))
+        v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+        t(j) = IEOR(t(j), ISHFT(t(j), a))
+        t(j) = IEOR(t(j), ISHFT(t(j), -b))
+        v(j) = IEOR(v(j), ISHFT(v(j), c))
+        v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+        x(j, i(j)) = v(j)
+        w(j) = w(j) + weyl
+        v(j) = v(j) + w(j)
+        v(j) = ISHFT(v(j), -11)
+      End Do
     End Do
 
-    DoubleRealRN = t53*v
+    DoubleRealRN = t53 * v
 
-    if( present(save_state) ) then
-       save_state(:,1:r)   = x(:,0:r-1)
-       save_state(:,r+1)   = i(:)
-       save_state(:,r+2)   = w(:)
-       if ((r+3) <= n_save_state) save_state(:,r+3:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(:, 1 : r) = x(:, 0 : r - 1)
+      save_state(:, r + 1) = i(:)
+      save_state(:, r + 2) = w(:)
+      if ((r + 3) <= n_save_state) save_state(:, r + 3 : n_save_state) = 0
     end if
 
   end subroutine xor4096d_1d
 
   ! ------------------------------------------------------------------
 
-  subroutine xor4096gf_0d(seed,SingleRealRN,save_state) 
+  subroutine xor4096gf_0d(seed, SingleRealRN, save_state)
 
     implicit none
 
-    integer(i4),                                    intent(in)    :: seed
-    real(SP),                                       intent(out)   :: SingleRealRN
+    integer(i4), intent(in) :: seed
+    real(SP), intent(out) :: SingleRealRN
     integer(i4), optional, dimension(n_save_state), intent(inout) :: save_state
 
-    integer(i4)        :: wlen, r, s, a, b, c, d
-    integer(i4), save  :: w
-    integer(i4), save  :: x(0:127)                 ! x(0) ... x(r-1)
-    integer(i4)        :: weyl = 1640531527_i4
-    integer(i4)        :: t,v
-    integer(i4), save  :: i = -1                   ! i<0 indicates first call
-    integer(i4)        :: k
-    real(SP)           :: t24 = 1.0_SP/16777216.0_SP     ! = 0.5^24 = 1/2^24
+    integer(i4) :: wlen, r, s, a, b, c, d
+    integer(i4), save :: w
+    integer(i4), save :: x(0 : 127)                 ! x(0) ... x(r-1)
+    integer(i4) :: weyl = 1640531527_i4
+    integer(i4) :: t, v
+    integer(i4), save :: i = -1                   ! i<0 indicates first call
+    integer(i4) :: k
+    real(SP) :: t24 = 1.0_SP / 16777216.0_SP     ! = 0.5^24 = 1/2^24
 
-    real(SP)            :: rn1, rn2               ! uniform random numbers
-    real(SP)            :: x1,x2,y1,ww            ! for Box-Mueller transform
-    integer(i4),save    :: Flag = 1               ! if Flag = 1 return y1 else return y2
-    real(SP),save       :: y2
+    real(SP) :: rn1, rn2               ! uniform random numbers
+    real(SP) :: x1, x2, y1, ww            ! for Box-Mueller transform
+    integer(i4), save :: Flag = 1               ! if Flag = 1 return y1 else return y2
+    real(SP), save :: y2
 
     !$omp   threadprivate(x,i,w,y2,flag)
 
@@ -1414,147 +1410,147 @@ subroutine xor4096gf_0d(seed,SingleRealRN,save_state)
     c = 13
     d = 15
 
-    if( present(save_state) .and. (seed .eq. 0) ) then
-       x(0:r-1)  = save_state(1:r)
-       i         = save_state(r+1)
-       w         = save_state(r+2)
-       flag      = save_state(r+3)
-       y2        = transfer(save_state(r+4),1.0_sp)
+    if(present(save_state) .and. (seed .eq. 0)) then
+      x(0 : r - 1) = save_state(1 : r)
+      i = save_state(r + 1)
+      w = save_state(r + 2)
+      flag = save_state(r + 3)
+      y2 = transfer(save_state(r + 4), 1.0_sp)
     end if
 
     If ((i .lt. 0) .or. (seed .ne. 0)) then     ! Initialization necessary
-       If (seed .ne. 0) then                   ! v must be nonzero
-          v = seed
-       else
-          v = NOT(seed)
-       end if
-
-       do k=wlen,1,-1                          ! Avoid correlations for close seeds
-          ! This recurrence has period of 2^32-1
-          v = IEOR(v,ISHFT(v,13))
-          v = IEOR(v,ISHFT(v,-17))
-          v = IEOR(v,ISHFT(v, 5))
-       end do
-
-       ! Initialize circular array
-       w = v
-       do k=0,r-1
-          w = w + weyl
-          v = IEOR(v,ISHFT(v,13))
-          v = IEOR(v,ISHFT(v,-17))
-          v = IEOR(v,ISHFT(v, 5))
-          x(k) = v + w
-       end do
-
-       ! Discard first 4*r results (Gimeno)
-       i = r-1
-       do k = 4*r,1,-1
-          i = IAND(i+1,r-1)
-          t = x(i)
-          v = x(IAND(i+(r-s),r-1))
-          t = IEOR(t,ISHFT(t,a))
-          t = IEOR(t,ISHFT(t,-b))
-          v = IEOR(v,ISHFT(v,c))
-          v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-          x(i) = v
-       end do
-       Flag = 1
+      If (seed .ne. 0) then                   ! v must be nonzero
+        v = seed
+      else
+        v = NOT(seed)
+      end if
+
+      do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+        ! This recurrence has period of 2^32-1
+        v = IEOR(v, ISHFT(v, 13))
+        v = IEOR(v, ISHFT(v, -17))
+        v = IEOR(v, ISHFT(v, 5))
+      end do
+
+      ! Initialize circular array
+      w = v
+      do k = 0, r - 1
+        w = w + weyl
+        v = IEOR(v, ISHFT(v, 13))
+        v = IEOR(v, ISHFT(v, -17))
+        v = IEOR(v, ISHFT(v, 5))
+        x(k) = v + w
+      end do
+
+      ! Discard first 4*r results (Gimeno)
+      i = r - 1
+      do k = 4 * r, 1, -1
+        i = IAND(i + 1, r - 1)
+        t = x(i)
+        v = x(IAND(i + (r - s), r - 1))
+        t = IEOR(t, ISHFT(t, a))
+        t = IEOR(t, ISHFT(t, -b))
+        v = IEOR(v, ISHFT(v, c))
+        v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+        x(i) = v
+      end do
+      Flag = 1
     end if ! end of initialization
 
     If (Flag .eq. 1) then
-       ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
-       ww = 1.0_SP
-       do while (ww .ge. 1.0_SP)
+      ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
+      ww = 1.0_SP
+      do while (ww .ge. 1.0_SP)
+
+        ! Apart from initialization (above), this is the generator
+        v = 0_i4
+        Do While (v .eq. 0_i4)
+          i = IAND(i + 1, r - 1)
+          t = x(i)
+          v = x(IAND(i + (r - s), r - 1))
+          t = IEOR(t, ISHFT(t, a))
+          t = IEOR(t, ISHFT(t, -b))
+          v = IEOR(v, ISHFT(v, c))
+          v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+          x(i) = v
+          w = w + weyl
+          v = v + w
+          v = ISHFT(v, -8)
+        End Do
 
-          ! Apart from initialization (above), this is the generator
-          v = 0_i4
-          Do While (v .eq. 0_i4)
-             i = IAND(i+1,r-1)
-             t = x(i)
-             v = x(IAND(i+(r-s),r-1))
-             t = IEOR(t,ISHFT(t,a))
-             t = IEOR(t,ISHFT(t,-b))
-             v = IEOR(v,ISHFT(v,c))
-             v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-             x(i) = v
-             w = w + weyl
-             v = v + w
-             v = ISHFT(v,-8)
-          End Do
+        rn1 = t24 * v
 
-          rn1 = t24*v
-
-          v = 0_i4
-          Do While (v .eq. 0_i4)
-             i = IAND(i+1,r-1)
-             t = x(i)
-             v = x(IAND(i+(r-s),r-1))
-             t = IEOR(t,ISHFT(t,a))
-             t = IEOR(t,ISHFT(t,-b))
-             v = IEOR(v,ISHFT(v,c))
-             v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-             x(i) = v
-             w = w + weyl
-             v = v + w
-             v = ISHFT(v,-8)
-          End Do
+        v = 0_i4
+        Do While (v .eq. 0_i4)
+          i = IAND(i + 1, r - 1)
+          t = x(i)
+          v = x(IAND(i + (r - s), r - 1))
+          t = IEOR(t, ISHFT(t, a))
+          t = IEOR(t, ISHFT(t, -b))
+          v = IEOR(v, ISHFT(v, c))
+          v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+          x(i) = v
+          w = w + weyl
+          v = v + w
+          v = ISHFT(v, -8)
+        End Do
 
-          rn2 = t24*v
+        rn2 = t24 * v
 
-          x1 = 2.0_SP * rn1 -1.0_SP
-          x2 = 2.0_SP * rn2 -1.0_SP
+        x1 = 2.0_SP * rn1 - 1.0_SP
+        x2 = 2.0_SP * rn2 - 1.0_SP
 
-          ww = x1*x1 + x2*x2
-       end do ! end of polar method
+        ww = x1 * x1 + x2 * x2
+      end do ! end of polar method
 
-       ww = Sqrt( (-2.0_SP * Log(ww)) / ww)
-       y1 = x1 * ww
-       y2 = x2 * ww
+      ww = Sqrt((-2.0_SP * Log(ww)) / ww)
+      y1 = x1 * ww
+      y2 = x2 * ww
 
     end if  ! Only if Flag = 1
 
     If (Flag .eq. 1) then
-       Flag = 2
-       SingleRealRN = y1
+      Flag = 2
+      SingleRealRN = y1
     else
-       Flag = 1
-       SingleRealRN = y2
+      Flag = 1
+      SingleRealRN = y2
     end if
 
-    if( present(save_state) ) then
-       save_state(1:r) = x(0:r-1)
-       save_state(r+1) = i
-       save_state(r+2) = w
-       save_state(r+3) = flag
-       save_state(r+4) = transfer(y2, 1_i4)
-       if ((r+5) <= n_save_state) save_state(r+5:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(1 : r) = x(0 : r - 1)
+      save_state(r + 1) = i
+      save_state(r + 2) = w
+      save_state(r + 3) = flag
+      save_state(r + 4) = transfer(y2, 1_i4)
+      if ((r + 5) <= n_save_state) save_state(r + 5 : n_save_state) = 0
     end if
 
   end subroutine xor4096gf_0d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096gf_1d(seed,SingleRealRN,save_state) 
+  subroutine xor4096gf_1d(seed, SingleRealRN, save_state)
 
     implicit none
 
-    integer(i4), dimension(:),                                 intent(in)    :: seed
-    real(SP),    dimension(size(seed)),                        intent(out)   :: SingleRealRN
-    integer(i4), optional, dimension(size(seed),n_save_state), intent(inout) :: save_state
+    integer(i4), dimension(:), intent(in) :: seed
+    real(SP), dimension(size(seed)), intent(out) :: SingleRealRN
+    integer(i4), optional, dimension(size(seed), n_save_state), intent(inout) :: save_state
 
-    integer(i4)                         :: m
-    integer(i4)                         :: wlen, r, s, a, b, c, d
-    integer(i4)                         :: weyl =  1640531527_i4
-    integer(i4)                         :: k, j
-    real(SP)                            :: t24 = 1.0_SP/16777216.0_SP      ! = 0.5^24 = 1/2^24
-    integer(i4), dimension(size(seed))  :: t,v
-    integer(i4), dimension(:,:), allocatable, save  :: x                   ! x(0) ... x(r-1)
-    integer(i4), dimension(:),   allocatable, save  :: i,w                 ! i<0 indicates first call
+    integer(i4) :: m
+    integer(i4) :: wlen, r, s, a, b, c, d
+    integer(i4) :: weyl = 1640531527_i4
+    integer(i4) :: k, j
+    real(SP) :: t24 = 1.0_SP / 16777216.0_SP      ! = 0.5^24 = 1/2^24
+    integer(i4), dimension(size(seed)) :: t, v
+    integer(i4), dimension(:, :), allocatable, save :: x                   ! x(0) ... x(r-1)
+    integer(i4), dimension(:), allocatable, save :: i, w                 ! i<0 indicates first call
 
-    real(SP),    dimension(size(seed))              :: rn1, rn2     ! uniform random numbers
-    real(SP),    dimension(size(seed))              :: x1,x2,y1,ww  ! for Box-Mueller transform
-    real(SP),    dimension(:), allocatable, save    :: y2
-    integer(i4), dimension(:), allocatable, save    :: Flag         ! if Flag = 1 return y1 else return y2
+    real(SP), dimension(size(seed)) :: rn1, rn2     ! uniform random numbers
+    real(SP), dimension(size(seed)) :: x1, x2, y1, ww  ! for Box-Mueller transform
+    real(SP), dimension(:), allocatable, save :: y2
+    integer(i4), dimension(:), allocatable, save :: Flag         ! if Flag = 1 return y1 else return y2
 
     !$omp   threadprivate(x,i,w,y2,flag)
 
@@ -1570,205 +1566,202 @@ subroutine xor4096gf_1d(seed,SingleRealRN,save_state)
     c = 13
     d = 15
 
-    m = size(seed,1)
+    m = size(seed, 1)
 
     if (any(seed .eq. 0_i4) .and. any(seed .ne. 0_i4)) then
-       stop 'xor4096g: seeds have to be eigther all 0 or all larger than 0'
+      stop 'xor4096g: seeds have to be eigther all 0 or all larger than 0'
     end if
 
-    if ( present(save_state) .and. all(seed .eq. 0_i4) ) then
-        if (allocated(x)) then
-           if (size(x,1) .ne. m) then
-              deallocate(x)
-              deallocate(i)
-              deallocate(w)
-              deallocate(flag)
-              deallocate(y2)
-              allocate(i(m))
-              allocate(x(m,0:r-1))
-              allocate(w(m))
-              allocate(Flag(m))
-              allocate(y2(m))
-           end if
+    if (present(save_state) .and. all(seed .eq. 0_i4)) then
+      if (allocated(x)) then
+        if (size(x, 1) .ne. m) then
+          deallocate(x)
+          deallocate(i)
+          deallocate(w)
+          deallocate(flag)
+          deallocate(y2)
+          allocate(i(m))
+          allocate(x(m, 0 : r - 1))
+          allocate(w(m))
+          allocate(Flag(m))
+          allocate(y2(m))
         end if
-       if (.not. allocated(x) ) then
-           allocate(i(m))
-           allocate(x(m,0:r-1))
-           allocate(w(m))
-           allocate(Flag(m))
-           allocate(y2(m))
-       end if
-        x(:,0:r-1)  = save_state(:,1:r)
-        i(:)        = save_state(:,r+1)
-        w(:)        = save_state(:,r+2)
-        flag(:)      = save_state(:,r+3)
-        do j=1,m
-           y2(j) = transfer(save_state(j,r+4),1.0_sp)
-        end do
-    end if 
-
+      end if
+      if (.not. allocated(x)) then
+        allocate(i(m))
+        allocate(x(m, 0 : r - 1))
+        allocate(w(m))
+        allocate(Flag(m))
+        allocate(y2(m))
+      end if
+      x(:, 0 : r - 1) = save_state(:, 1 : r)
+      i(:) = save_state(:, r + 1)
+      w(:) = save_state(:, r + 2)
+      flag(:) = save_state(:, r + 3)
+      do j = 1, m
+        y2(j) = transfer(save_state(j, r + 4), 1.0_sp)
+      end do
+    end if
 
     if(all(seed .ne. 0_i4)) then
-       if ( allocated(x) ) then
-           deallocate(x)
-           deallocate(i)
-           deallocate(w)
-           deallocate(Flag)
-           deallocate(y2)
+      if (allocated(x)) then
+        deallocate(x)
+        deallocate(i)
+        deallocate(w)
+        deallocate(Flag)
+        deallocate(y2)
+      end if
+
+      allocate(i(m))
+      i = -1
+      allocate(x(m, 0 : r - 1))
+      allocate(w(m))
+      allocate(Flag(m))
+      Flag = 1
+      allocate(y2(m))
+    end if
+
+    Do j = 1, m !Loop over every stream
+      If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
+        If (seed(j) .ne. 0) then                   ! v must be nonzero
+          v(j) = seed(j)
+        else
+          v(j) = NOT(seed(j))
         end if
 
-       allocate(i(m))
-       i = -1
-       allocate(x(m,0:r-1))
-       allocate(w(m))
-       allocate(Flag(m))
-       Flag = 1
-       allocate(y2(m))
-    end if
+        do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+          ! This recurrence has period of 2^32-1
+          v(j) = IEOR(v(j), ISHFT(v(j), 13))
+          v(j) = IEOR(v(j), ISHFT(v(j), -17))
+          v(j) = IEOR(v(j), ISHFT(v(j), 5))
+        end do
 
+        ! Initialize circular array
+        w(j) = v(j)
+        do k = 0, r - 1
+          w(j) = w(j) + weyl
+          v(j) = IEOR(v(j), ISHFT(v(j), 13))
+          v(j) = IEOR(v(j), ISHFT(v(j), -17))
+          v(j) = IEOR(v(j), ISHFT(v(j), 5))
+          x(j, k) = v(j) + w(j)
+        end do
 
-    Do j=1,m !Loop over every stream
-       If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
-          If (seed(j) .ne. 0) then                   ! v must be nonzero
-             v(j) = seed(j)
-          else
-             v(j) = NOT(seed(j))
-          end if
-
-          do k=wlen,1,-1                          ! Avoid correlations for close seeds
-             ! This recurrence has period of 2^32-1
-             v(j) = IEOR(v(j),ISHFT(v(j),13))
-             v(j) = IEOR(v(j),ISHFT(v(j),-17))
-             v(j) = IEOR(v(j),ISHFT(v(j), 5))
-          end do
-
-          ! Initialize circular array
-          w(j) = v(j)
-          do k=0,r-1
-             w(j) = w(j) + weyl
-             v(j) = IEOR(v(j),ISHFT(v(j),13))
-             v(j) = IEOR(v(j),ISHFT(v(j),-17))
-             v(j) = IEOR(v(j),ISHFT(v(j), 5))
-             x(j,k) = v(j) + w(j)
-          end do
-
-          ! Discard first 4*r results (Gimeno)
-          i(j) = r-1
-          do k = 4*r,1,-1
-             i(j) = IAND(i(j)+1,r-1)
-             t(j) = x(j,i(j))
-             v(j) = x(j,IAND(i(j)+(r-s),r-1))
-             t(j) = IEOR(t(j),ISHFT(t(j),a))
-             t(j) = IEOR(t(j),ISHFT(t(j),-b))
-             v(j) = IEOR(v(j),ISHFT(v(j),c))
-             v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-             x(j,i(j)) = v(j)
-          end do
-          Flag(j) = 1
-       end if ! end of initialization
+        ! Discard first 4*r results (Gimeno)
+        i(j) = r - 1
+        do k = 4 * r, 1, -1
+          i(j) = IAND(i(j) + 1, r - 1)
+          t(j) = x(j, i(j))
+          v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+          t(j) = IEOR(t(j), ISHFT(t(j), a))
+          t(j) = IEOR(t(j), ISHFT(t(j), -b))
+          v(j) = IEOR(v(j), ISHFT(v(j), c))
+          v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+          x(j, i(j)) = v(j)
+        end do
+        Flag(j) = 1
+      end if ! end of initialization
     end do
 
-    Do j=1,m        !Loop over every stream
-       If (Flag(j) .eq. 1) then
-          ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
-          ww(j) = 1.0_SP
-          do while (ww(j) .ge. 1.0_SP)
-
-             ! Apart from initialization (above), this is the generator
-             v(j) = 0_i4
-             Do While (v(j) .eq. 0_i4)
-                i(j) = IAND(i(j)+1,r-1)
-                t(j) = x(j,i(j))
-                v(j) = x(j,IAND(i(j)+(r-s),r-1))
-                t(j) = IEOR(t(j),ISHFT(t(j),a))
-                t(j) = IEOR(t(j),ISHFT(t(j),-b))
-                v(j) = IEOR(v(j),ISHFT(v(j),c))
-                v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-                x(j,i(j)) = v(j)
-                w(j) = w(j) + weyl
-                v(j) = v(j) + w(j)
-                v(j) = ISHFT(v(j),-8)
-             End Do
-
-             rn1(j) = t24*v(j)
-
-             v(j) = 0_i4
-             Do While (v(j) .eq. 0_i4)
-                i(j) = IAND(i(j)+1,r-1)
-                t(j) = x(j,i(j))
-                v(j) = x(j,IAND(i(j)+(r-s),r-1))
-                t(j) = IEOR(t(j),ISHFT(t(j),a))
-                t(j) = IEOR(t(j),ISHFT(t(j),-b))
-                v(j) = IEOR(v(j),ISHFT(v(j),c))
-                v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-                x(j,i(j)) = v(j)
-                w(j) = w(j) + weyl
-                v(j) = v(j) + w(j)
-                v(j) = ISHFT(v(j),-8)
-             End Do
-
-             rn2(j) = t24*v(j)
-
-             x1(j) = 2.0_SP * rn1(j) -1.0_SP
-             x2(j) = 2.0_SP * rn2(j) -1.0_SP
-             ww(j) = x1(j)*x1(j) + x2(j)*x2(j)
-          end do ! end of polar method
-
-          ww(j) = Sqrt( (-2.0_SP * Log(ww(j))) / ww(j))
-          y1(j) = x1(j) * ww(j)
-          y2(j) = x2(j) * ww(j)
-       end if  ! Only if Flag = 1
-    end do ! Loop over each stream
+    Do j = 1, m        !Loop over every stream
+      If (Flag(j) .eq. 1) then
+        ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
+        ww(j) = 1.0_SP
+        do while (ww(j) .ge. 1.0_SP)
+
+          ! Apart from initialization (above), this is the generator
+          v(j) = 0_i4
+          Do While (v(j) .eq. 0_i4)
+            i(j) = IAND(i(j) + 1, r - 1)
+            t(j) = x(j, i(j))
+            v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+            t(j) = IEOR(t(j), ISHFT(t(j), a))
+            t(j) = IEOR(t(j), ISHFT(t(j), -b))
+            v(j) = IEOR(v(j), ISHFT(v(j), c))
+            v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+            x(j, i(j)) = v(j)
+            w(j) = w(j) + weyl
+            v(j) = v(j) + w(j)
+            v(j) = ISHFT(v(j), -8)
+          End Do
+
+          rn1(j) = t24 * v(j)
+
+          v(j) = 0_i4
+          Do While (v(j) .eq. 0_i4)
+            i(j) = IAND(i(j) + 1, r - 1)
+            t(j) = x(j, i(j))
+            v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+            t(j) = IEOR(t(j), ISHFT(t(j), a))
+            t(j) = IEOR(t(j), ISHFT(t(j), -b))
+            v(j) = IEOR(v(j), ISHFT(v(j), c))
+            v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+            x(j, i(j)) = v(j)
+            w(j) = w(j) + weyl
+            v(j) = v(j) + w(j)
+            v(j) = ISHFT(v(j), -8)
+          End Do
 
+          rn2(j) = t24 * v(j)
 
-    Do j=1,m
-       If (Flag(j) .eq. 1) then
-          Flag(j) = 2
-          SingleRealRN(j) = y1(j)
-       else
-          Flag(j) = 1
-          SingleRealRN(j) = y2(j)
-       end if
+          x1(j) = 2.0_SP * rn1(j) - 1.0_SP
+          x2(j) = 2.0_SP * rn2(j) - 1.0_SP
+          ww(j) = x1(j) * x1(j) + x2(j) * x2(j)
+        end do ! end of polar method
+
+        ww(j) = Sqrt((-2.0_SP * Log(ww(j))) / ww(j))
+        y1(j) = x1(j) * ww(j)
+        y2(j) = x2(j) * ww(j)
+      end if  ! Only if Flag = 1
+    end do ! Loop over each stream
+
+    Do j = 1, m
+      If (Flag(j) .eq. 1) then
+        Flag(j) = 2
+        SingleRealRN(j) = y1(j)
+      else
+        Flag(j) = 1
+        SingleRealRN(j) = y2(j)
+      end if
     end Do
 
-    if( present(save_state) ) then
-       save_state(:,1:r) = x(:,0:r-1)
-       save_state(:,r+1) = i(:)
-       save_state(:,r+2) = w(:)
-       save_state(:,r+3) = flag(:)
-       do j=1,m
-          save_state(j,r+4) = transfer(y2(j), 1_i4)
-       end do
-       if ((r+5) <= n_save_state) save_state(:,r+5:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(:, 1 : r) = x(:, 0 : r - 1)
+      save_state(:, r + 1) = i(:)
+      save_state(:, r + 2) = w(:)
+      save_state(:, r + 3) = flag(:)
+      do j = 1, m
+        save_state(j, r + 4) = transfer(y2(j), 1_i4)
+      end do
+      if ((r + 5) <= n_save_state) save_state(:, r + 5 : n_save_state) = 0
     end if
 
   end subroutine xor4096gf_1d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096gd_0d(seed,DoubleRealRN,save_state) 
+  subroutine xor4096gd_0d(seed, DoubleRealRN, save_state)
 
     implicit none
 
-    integer(i8),                                    intent(in)    :: seed
-    real(DP),                                       intent(out)   :: DoubleRealRN
+    integer(i8), intent(in) :: seed
+    real(DP), intent(out) :: DoubleRealRN
     integer(i8), optional, dimension(n_save_state), intent(inout) :: save_state
 
-    integer(i8)        :: wlen, r, s, a, b, c, d
+    integer(i8) :: wlen, r, s, a, b, c, d
 
-    integer(i8), save  :: w
-    integer(i8), save  :: x(0:63)                  ! x(0) ... x(r-1)
-    integer(i8)        :: weyl = 7046029254386353131_i8
-    integer(i8)        :: t,v
-    integer(i8), save  :: i = -1_i8                ! i<0 indicates first call
-    integer(i8)        :: k
+    integer(i8), save :: w
+    integer(i8), save :: x(0 : 63)                  ! x(0) ... x(r-1)
+    integer(i8) :: weyl = 7046029254386353131_i8
+    integer(i8) :: t, v
+    integer(i8), save :: i = -1_i8                ! i<0 indicates first call
+    integer(i8) :: k
 
-    real(DP)            :: t53 = 1.0_DP/9007199254740992.0_DP     ! = 0.5^53 = 1/2^53
+    real(DP) :: t53 = 1.0_DP / 9007199254740992.0_DP     ! = 0.5^53 = 1/2^53
 
-    real(DP)            :: rn1, rn2                 ! uniform random numbers
-    real(DP)            :: x1,x2,y1,ww              ! for Box-Mueller transform
-    real(DP), save      :: y2
-    integer(i8), save   :: Flag = 1_i8             ! if Flag = 1 return y1 else return y2
+    real(DP) :: rn1, rn2                 ! uniform random numbers
+    real(DP) :: x1, x2, y1, ww              ! for Box-Mueller transform
+    real(DP), save :: y2
+    integer(i8), save :: Flag = 1_i8             ! if Flag = 1 return y1 else return y2
 
     !$omp   threadprivate(x,i,w,y2,flag)
 
@@ -1784,145 +1777,144 @@ subroutine xor4096gd_0d(seed,DoubleRealRN,save_state)
     c = 27_i8
     d = 29_i8
 
-    if( present(save_state) .and. (seed .eq. 0) ) then
-       x(0:r-1)  = save_state(1:r)
-       i         = save_state(r+1)
-       w         = save_state(r+2)
-       flag      = save_state(r+3)
-       y2        = transfer(save_state(r+4),1.0_dp)
+    if(present(save_state) .and. (seed .eq. 0)) then
+      x(0 : r - 1) = save_state(1 : r)
+      i = save_state(r + 1)
+      w = save_state(r + 2)
+      flag = save_state(r + 3)
+      y2 = transfer(save_state(r + 4), 1.0_dp)
     end if
 
     If ((i .lt. 0_i8) .or. (seed .ne. 0_i8)) then     ! Initialization necessary
-       If (seed .ne. 0) then                   ! v must be nonzero
-          v = seed
-       else
-          v = NOT(seed)
-       end if
-
-       do k=wlen,1,-1                          ! Avoid correlations for close seeds
-          ! This recurrence has period of 2^64-1
-          v = IEOR(v,ISHFT(v,7))
-          v = IEOR(v,ISHFT(v,-9))
-       end do
-
-       ! Initialize circular array
-       w = v
-       do k=0,r-1
-          w = w + weyl
-          v = IEOR(v,ISHFT(v,7))
-          v = IEOR(v,ISHFT(v,-9))
-          x(k) = v + w
-       end do
-
-       ! Discard first 4*r results (Gimeno)
-       i = r-1
-       do k = 4*r,1,-1
-          i = IAND(i+1,r-1)
-          t = x(i)
-          v = x(IAND(i+(r-s),r-1))
-          t = IEOR(t,ISHFT(t,a))
-          t = IEOR(t,ISHFT(t,-b))
-          v = IEOR(v,ISHFT(v,c))
-          v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-          x(i) = v
-       end do
-       Flag = 1_i8
+      If (seed .ne. 0) then                   ! v must be nonzero
+        v = seed
+      else
+        v = NOT(seed)
+      end if
+
+      do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+        ! This recurrence has period of 2^64-1
+        v = IEOR(v, ISHFT(v, 7))
+        v = IEOR(v, ISHFT(v, -9))
+      end do
+
+      ! Initialize circular array
+      w = v
+      do k = 0, r - 1
+        w = w + weyl
+        v = IEOR(v, ISHFT(v, 7))
+        v = IEOR(v, ISHFT(v, -9))
+        x(k) = v + w
+      end do
+
+      ! Discard first 4*r results (Gimeno)
+      i = r - 1
+      do k = 4 * r, 1, -1
+        i = IAND(i + 1, r - 1)
+        t = x(i)
+        v = x(IAND(i + (r - s), r - 1))
+        t = IEOR(t, ISHFT(t, a))
+        t = IEOR(t, ISHFT(t, -b))
+        v = IEOR(v, ISHFT(v, c))
+        v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+        x(i) = v
+      end do
+      Flag = 1_i8
     end if ! end of initialization
 
     If (Flag .eq. 1_i8) then
-       ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
-       ww = 1.0_DP
-       do while (ww .ge. 1.0_DP)
+      ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
+      ww = 1.0_DP
+      do while (ww .ge. 1.0_DP)
+
+        ! Apart from initialization (above), this is the generator
+        v = 0_i8
+        Do While (v .eq. 0_i8)
+          i = IAND(i + 1, r - 1)
+          t = x(i)
+          v = x(IAND(i + (r - s), r - 1))
+          t = IEOR(t, ISHFT(t, a))
+          t = IEOR(t, ISHFT(t, -b))
+          v = IEOR(v, ISHFT(v, c))
+          v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+          x(i) = v
+          w = w + weyl
+          v = v + w
+          v = ISHFT(v, -11)
+        End Do
 
-          ! Apart from initialization (above), this is the generator
-          v = 0_i8
-          Do While (v .eq. 0_i8)
-             i = IAND(i+1,r-1)
-             t = x(i)
-             v = x(IAND(i+(r-s),r-1))
-             t = IEOR(t,ISHFT(t,a))
-             t = IEOR(t,ISHFT(t,-b))
-             v = IEOR(v,ISHFT(v,c))
-             v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-             x(i) = v
-             w = w + weyl
-             v = v + w
-             v = ISHFT(v,-11)
-          End Do
+        rn1 = t53 * v
 
-          rn1 = t53*v
-
-          v = 0_i8
-          Do While (v .eq. 0_i8)
-             i = IAND(i+1,r-1)
-             t = x(i)
-             v = x(IAND(i+(r-s),r-1))
-             t = IEOR(t,ISHFT(t,a))
-             t = IEOR(t,ISHFT(t,-b))
-             v = IEOR(v,ISHFT(v,c))
-             v = IEOR(v,IEOR(t,ISHFT(v,-d)))
-             x(i) = v
-             w = w + weyl
-             v = v + w
-             v = ISHFT(v,-11)
-          End Do
+        v = 0_i8
+        Do While (v .eq. 0_i8)
+          i = IAND(i + 1, r - 1)
+          t = x(i)
+          v = x(IAND(i + (r - s), r - 1))
+          t = IEOR(t, ISHFT(t, a))
+          t = IEOR(t, ISHFT(t, -b))
+          v = IEOR(v, ISHFT(v, c))
+          v = IEOR(v, IEOR(t, ISHFT(v, -d)))
+          x(i) = v
+          w = w + weyl
+          v = v + w
+          v = ISHFT(v, -11)
+        End Do
 
-          rn2 = t53*v
+        rn2 = t53 * v
 
-          x1 = 2.0_DP * rn1 -1.0_DP
-          x2 = 2.0_DP * rn2 -1.0_DP
-          ww = x1*x1 + x2*x2
-       end do ! end of polar method
+        x1 = 2.0_DP * rn1 - 1.0_DP
+        x2 = 2.0_DP * rn2 - 1.0_DP
+        ww = x1 * x1 + x2 * x2
+      end do ! end of polar method
 
-       ww = Sqrt( (-2.0_DP * Log(ww)) / ww)
-       y1 = x1 * ww
-       y2 = x2 * ww
+      ww = Sqrt((-2.0_DP * Log(ww)) / ww)
+      y1 = x1 * ww
+      y2 = x2 * ww
 
     end if ! Only if Flag = 1
 
     If (Flag .eq. 1) then
-       Flag = 2
-       DoubleRealRN = y1
+      Flag = 2
+      DoubleRealRN = y1
     else
-       Flag = 1
-       DoubleRealRN = y2
+      Flag = 1
+      DoubleRealRN = y2
     end if
 
-    if( present(save_state) ) then
-       save_state(1:r) = x(0:r-1)
-       save_state(r+1) = i
-       save_state(r+2) = w
-       save_state(r+3) = flag
-       save_state(r+4) = transfer(y2, 1_i8)
-       if ((r+5) <= n_save_state) save_state(r+5:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(1 : r) = x(0 : r - 1)
+      save_state(r + 1) = i
+      save_state(r + 2) = w
+      save_state(r + 3) = flag
+      save_state(r + 4) = transfer(y2, 1_i8)
+      if ((r + 5) <= n_save_state) save_state(r + 5 : n_save_state) = 0
     end if
 
-
   end subroutine xor4096gd_0d
 
   ! -----------------------------------------------------------------------------
 
-  subroutine xor4096gd_1d(seed,DoubleRealRN,save_state) 
+  subroutine xor4096gd_1d(seed, DoubleRealRN, save_state)
 
     implicit none
 
-    integer(i8),           dimension(:),                       intent(in)    :: seed
-    real(DP),              dimension(size(seed)),              intent(out)   :: DoubleRealRN
-    integer(i8), optional, dimension(size(seed),n_save_state), intent(inout) :: save_state
+    integer(i8), dimension(:), intent(in) :: seed
+    real(DP), dimension(size(seed)), intent(out) :: DoubleRealRN
+    integer(i8), optional, dimension(size(seed), n_save_state), intent(inout) :: save_state
 
-    integer(i4)                         :: m
-    integer(i8)                         :: wlen, r, s, a, b, c, d
-    integer(i8)                         :: weyl =  7046029254386353131_i8              !Z'61C88647' = Hexadecimal notation
-    integer(i8)                         :: k, j
-    real(DP)                            :: t53 = 1.0_DP/9007199254740992.0_DP      ! = 0.5^24 = 1/2^24
-    integer(i8), dimension(size(seed))  :: t,v
-    integer(i8), dimension(:,:), allocatable, save  :: x                   ! x(0) ... x(r-1)
-    integer(i8), dimension(:),   allocatable, save  :: i,w                   ! i<0 indicates first call
+    integer(i4) :: m
+    integer(i8) :: wlen, r, s, a, b, c, d
+    integer(i8) :: weyl = 7046029254386353131_i8              !Z'61C88647' = Hexadecimal notation
+    integer(i8) :: k, j
+    real(DP) :: t53 = 1.0_DP / 9007199254740992.0_DP      ! = 0.5^24 = 1/2^24
+    integer(i8), dimension(size(seed)) :: t, v
+    integer(i8), dimension(:, :), allocatable, save :: x                   ! x(0) ... x(r-1)
+    integer(i8), dimension(:), allocatable, save :: i, w                   ! i<0 indicates first call
 
-    real(DP),    dimension(size(seed))              :: rn1, rn2     ! uniform random numbers
-    real(DP),    dimension(size(seed))              :: x1,x2,y1,ww  ! for Box-Mueller transform
-    real(DP),    dimension(:),   allocatable, save  :: y2
-    integer(i8), dimension(:),   allocatable, save  :: Flag         ! if Flag = 1 return y1 else return y2
+    real(DP), dimension(size(seed)) :: rn1, rn2     ! uniform random numbers
+    real(DP), dimension(size(seed)) :: x1, x2, y1, ww  ! for Box-Mueller transform
+    real(DP), dimension(:), allocatable, save :: y2
+    integer(i8), dimension(:), allocatable, save :: Flag         ! if Flag = 1 return y1 else return y2
 
     !$omp   threadprivate(x,i,w,y2,flag)
 
@@ -1938,173 +1930,172 @@ subroutine xor4096gd_1d(seed,DoubleRealRN,save_state)
     c = 27_i8
     d = 29_i8
 
-    m = size(seed,1)
+    m = size(seed, 1)
 
     if (any(seed .eq. 0_i8) .and. any(seed .ne. 0_i8)) then
-       stop 'xor4096g: seeds have to be eigther all 0 or all larger than 0'
+      stop 'xor4096g: seeds have to be eigther all 0 or all larger than 0'
     end if
 
-    if ( present(save_state) .and. all(seed .eq. 0_i8) ) then
-        if (allocated(x)) then
-           if (size(x,1) .ne. m) then
-              deallocate(x)
-              deallocate(i)
-              deallocate(w)
-              deallocate(flag)
-              deallocate(y2)
-              allocate(i(m))
-              allocate(x(m,0:r-1))
-              allocate(w(m))
-              allocate(Flag(m))
-              allocate(y2(m))
-           end if
+    if (present(save_state) .and. all(seed .eq. 0_i8)) then
+      if (allocated(x)) then
+        if (size(x, 1) .ne. m) then
+          deallocate(x)
+          deallocate(i)
+          deallocate(w)
+          deallocate(flag)
+          deallocate(y2)
+          allocate(i(m))
+          allocate(x(m, 0 : r - 1))
+          allocate(w(m))
+          allocate(Flag(m))
+          allocate(y2(m))
         end if
-       if (.not. allocated(x) ) then
-           allocate(i(m))
-           allocate(x(m,0:r-1))
-           allocate(w(m))
-           allocate(Flag(m))
-           allocate(y2(m))
-       end if
-        x(:,0:r-1)  = save_state(:,1:r)
-        i(:)        = save_state(:,r+1)
-        w(:)        = save_state(:,r+2)
-        flag(:)      = save_state(:,r+3)
-        do j=1,m
-           y2(j) = transfer(save_state(j,r+4),1.0_dp)
-        end do
-    end if 
+      end if
+      if (.not. allocated(x)) then
+        allocate(i(m))
+        allocate(x(m, 0 : r - 1))
+        allocate(w(m))
+        allocate(Flag(m))
+        allocate(y2(m))
+      end if
+      x(:, 0 : r - 1) = save_state(:, 1 : r)
+      i(:) = save_state(:, r + 1)
+      w(:) = save_state(:, r + 2)
+      flag(:) = save_state(:, r + 3)
+      do j = 1, m
+        y2(j) = transfer(save_state(j, r + 4), 1.0_dp)
+      end do
+    end if
 
     if(all(seed .ne. 0_i8)) then
-       if ( allocated(x) ) then
-           deallocate(x)
-           deallocate(i)
-           deallocate(w)
-           deallocate(Flag)
-           deallocate(y2)
+      if (allocated(x)) then
+        deallocate(x)
+        deallocate(i)
+        deallocate(w)
+        deallocate(Flag)
+        deallocate(y2)
+      end if
+
+      allocate(i(m))
+      i = -1
+      allocate(x(m, 0 : r - 1))
+      allocate(w(m))
+      allocate(Flag(m))
+      Flag = 1
+      allocate(y2(m))
+    end if
+
+    Do j = 1, m !Loop over every stream
+      If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
+        If (seed(j) .ne. 0) then                   ! v must be nonzero
+          v(j) = seed(j)
+        else
+          v(j) = NOT(seed(j))
         end if
 
-       allocate(i(m))
-       i = -1
-       allocate(x(m,0:r-1))
-       allocate(w(m))
-       allocate(Flag(m))
-       Flag = 1
-       allocate(y2(m))
-    end if
+        do k = wlen, 1, -1                          ! Avoid correlations for close seeds
+          ! This recurrence has period of 2^64-1
+          v(j) = IEOR(v(j), ISHFT(v(j), 7))
+          v(j) = IEOR(v(j), ISHFT(v(j), -9))
+        end do
 
-    Do j=1,m !Loop over every stream
-       If ((i(j) .lt. 0) .or. (seed(j) .ne. 0)) then     ! Initialization necessary
-          If (seed(j) .ne. 0) then                   ! v must be nonzero
-             v(j) = seed(j)
-          else
-             v(j) = NOT(seed(j))
-          end if
-
-          do k=wlen,1,-1                          ! Avoid correlations for close seeds
-             ! This recurrence has period of 2^64-1
-             v(j) = IEOR(v(j),ISHFT(v(j),7))
-             v(j) = IEOR(v(j),ISHFT(v(j),-9))
-          end do
-
-          ! Initialize circular array
-          w(j) = v(j)
-          do k=0,r-1
-             w(j) = w(j) + weyl
-             v(j) = IEOR(v(j),ISHFT(v(j),7))
-             v(j) = IEOR(v(j),ISHFT(v(j),-9))
-             x(j,k) = v(j) + w(j)
-          end do
-
-          ! Discard first 4*r results (Gimeno)
-          i(j) = r-1
-          do k = 4*r,1,-1
-             i(j) = IAND(i(j)+1,r-1)
-             t(j) = x(j,i(j))
-             v(j) = x(j,IAND(i(j)+(r-s),r-1))
-             t(j) = IEOR(t(j),ISHFT(t(j),a))
-             t(j) = IEOR(t(j),ISHFT(t(j),-b))
-             v(j) = IEOR(v(j),ISHFT(v(j),c))
-             v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-             x(j,i(j)) = v(j)
-          end do
-          Flag(j) = 1
-       end if ! end of initialization
+        ! Initialize circular array
+        w(j) = v(j)
+        do k = 0, r - 1
+          w(j) = w(j) + weyl
+          v(j) = IEOR(v(j), ISHFT(v(j), 7))
+          v(j) = IEOR(v(j), ISHFT(v(j), -9))
+          x(j, k) = v(j) + w(j)
+        end do
+
+        ! Discard first 4*r results (Gimeno)
+        i(j) = r - 1
+        do k = 4 * r, 1, -1
+          i(j) = IAND(i(j) + 1, r - 1)
+          t(j) = x(j, i(j))
+          v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+          t(j) = IEOR(t(j), ISHFT(t(j), a))
+          t(j) = IEOR(t(j), ISHFT(t(j), -b))
+          v(j) = IEOR(v(j), ISHFT(v(j), c))
+          v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+          x(j, i(j)) = v(j)
+        end do
+        Flag(j) = 1
+      end if ! end of initialization
     end do
 
-    Do j=1,m        !Loop over every stream
-       If (Flag(j) .eq. 1) then
-          ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
-          ww(j) = 1.0_DP
-          do while (ww(j) .ge. 1.0_DP)
-
-             ! Apart from initialization (above), this is the generator
-             v(j) = 0_i8
-             Do While (v(j) .eq. 0_i8)
-                i(j) = IAND(i(j)+1,r-1)
-                t(j) = x(j,i(j))
-                v(j) = x(j,IAND(i(j)+(r-s),r-1))
-                t(j) = IEOR(t(j),ISHFT(t(j),a))
-                t(j) = IEOR(t(j),ISHFT(t(j),-b))
-                v(j) = IEOR(v(j),ISHFT(v(j),c))
-                v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-                x(j,i(j)) = v(j)
-                w(j) = w(j) + weyl
-                v(j) = v(j) + w(j)
-                v(j) = ISHFT(v(j),-11)
-             End Do
-
-             rn1(j) = t53*v(j)
-
-             v(j) = 0_i8
-             Do While (v(j) .eq. 0_i8)
-                i(j) = IAND(i(j)+1,r-1)
-                t(j) = x(j,i(j))
-                v(j) = x(j,IAND(i(j)+(r-s),r-1))
-                t(j) = IEOR(t(j),ISHFT(t(j),a))
-                t(j) = IEOR(t(j),ISHFT(t(j),-b))
-                v(j) = IEOR(v(j),ISHFT(v(j),c))
-                v(j) = IEOR(v(j),IEOR(t(j),ISHFT(v(j),-d)))
-                x(j,i(j)) = v(j)
-                w(j) = w(j) + weyl
-                v(j) = v(j) + w(j)
-                v(j) = ISHFT(v(j),-11)
-             End Do
-
-             rn2(j) = t53*v(j)
-
-             x1(j) = 2.0_DP * rn1(j) -1.0_DP
-             x2(j) = 2.0_DP * rn2(j) -1.0_DP
-             ww(j) = x1(j)*x1(j) + x2(j)*x2(j)
-          end do ! end of polar method
-
-          ww(j) = Sqrt( (-2.0_DP * Log(ww(j))) / ww(j))
-          y1(j) = x1(j) * ww(j)
-          y2(j) = x2(j) * ww(j)
-
-       end if  ! Only if Flag = 1
-    end do ! Loop over each stream
+    Do j = 1, m        !Loop over every stream
+      If (Flag(j) .eq. 1) then
+        ! Polar method of Box-Mueller-transform to generate Gaussian distributed random number
+        ww(j) = 1.0_DP
+        do while (ww(j) .ge. 1.0_DP)
+
+          ! Apart from initialization (above), this is the generator
+          v(j) = 0_i8
+          Do While (v(j) .eq. 0_i8)
+            i(j) = IAND(i(j) + 1, r - 1)
+            t(j) = x(j, i(j))
+            v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+            t(j) = IEOR(t(j), ISHFT(t(j), a))
+            t(j) = IEOR(t(j), ISHFT(t(j), -b))
+            v(j) = IEOR(v(j), ISHFT(v(j), c))
+            v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+            x(j, i(j)) = v(j)
+            w(j) = w(j) + weyl
+            v(j) = v(j) + w(j)
+            v(j) = ISHFT(v(j), -11)
+          End Do
+
+          rn1(j) = t53 * v(j)
+
+          v(j) = 0_i8
+          Do While (v(j) .eq. 0_i8)
+            i(j) = IAND(i(j) + 1, r - 1)
+            t(j) = x(j, i(j))
+            v(j) = x(j, IAND(i(j) + (r - s), r - 1))
+            t(j) = IEOR(t(j), ISHFT(t(j), a))
+            t(j) = IEOR(t(j), ISHFT(t(j), -b))
+            v(j) = IEOR(v(j), ISHFT(v(j), c))
+            v(j) = IEOR(v(j), IEOR(t(j), ISHFT(v(j), -d)))
+            x(j, i(j)) = v(j)
+            w(j) = w(j) + weyl
+            v(j) = v(j) + w(j)
+            v(j) = ISHFT(v(j), -11)
+          End Do
+
+          rn2(j) = t53 * v(j)
 
+          x1(j) = 2.0_DP * rn1(j) - 1.0_DP
+          x2(j) = 2.0_DP * rn2(j) - 1.0_DP
+          ww(j) = x1(j) * x1(j) + x2(j) * x2(j)
+        end do ! end of polar method
 
-    Do j=1,m
-       If (Flag(j) .eq. 1) then
-          Flag(j) = 2
-          DoubleRealRN(j) = y1(j)
-       else
-          Flag(j) = 1
-          DoubleRealRN(j) = y2(j)
-       end if
+        ww(j) = Sqrt((-2.0_DP * Log(ww(j))) / ww(j))
+        y1(j) = x1(j) * ww(j)
+        y2(j) = x2(j) * ww(j)
+
+      end if  ! Only if Flag = 1
+    end do ! Loop over each stream
+
+    Do j = 1, m
+      If (Flag(j) .eq. 1) then
+        Flag(j) = 2
+        DoubleRealRN(j) = y1(j)
+      else
+        Flag(j) = 1
+        DoubleRealRN(j) = y2(j)
+      end if
     End do
 
-    if( present(save_state) ) then
-       save_state(:,1:r) = x(:,0:r-1)
-       save_state(:,r+1) = i(:)
-       save_state(:,r+2) = w(:)
-       save_state(:,r+3) = flag(:)
-       do j=1,m
-          save_state(j,r+4) = transfer(y2(j), 1_i8)
-       end do
-       if ((r+5) <= n_save_state) save_state(:,r+5:n_save_state) = 0
+    if(present(save_state)) then
+      save_state(:, 1 : r) = x(:, 0 : r - 1)
+      save_state(:, r + 1) = i(:)
+      save_state(:, r + 2) = w(:)
+      save_state(:, r + 3) = flag(:)
+      do j = 1, m
+        save_state(j, r + 4) = transfer(y2(j), 1_i8)
+      end do
+      if ((r + 5) <= n_save_state) save_state(:, r + 5 : n_save_state) = 0
     end if
 
   end subroutine xor4096gd_1d
diff --git a/src/mHM/mhm_driver.f90 b/src/mHM/mhm_driver.f90
index 776042e4..6563f640 100644
--- a/src/mHM/mhm_driver.f90
+++ b/src/mHM/mhm_driver.f90
@@ -150,77 +150,80 @@
 
 PROGRAM mhm_driver
 
-  USE mo_file,                ONLY :                         &
-       version, version_date, file_main,                     &      ! main info
-       file_namelist,                                        &      ! filename of namelist: main setup
-       file_namelist_param,                                  &      ! filename of namelist: mhm model parameter
-       file_defOutput                                               ! filename of namelist: output setup
-  USE mo_finish,              ONLY : finish                         ! Finish with style
-  USE mo_global_variables,    ONLY :                         &
-       nbasins, timestep_model_inputs,                       &      ! number of basins, frequency of input read
-       write_restart,                                        &      ! restart writing flags
-       dirRestartOut,                                        &      ! directories
-       dirMorpho, dirLCover,  dirPrecipitation,              &      ! directories
-       dirTemperature, dirOut,                               &      ! directories
-       dirReferenceET,                                       &      ! PET input path  if process 5 is 'PET is input' (case 0)
-       dirMinTemperature, dirMaxTemperature,                 &      ! PET input paths if process 5 is Hargreaves-Samani  (case 1)
-       dirNetRadiation,                                      &      ! PET input paths if process 5 is Priestley-Taylor (case 2)
-       dirabsVapPressure, dirwindspeed,                      &      ! PET input paths if process 5 is Penman-Monteith  (case 3)
-       dirgridded_LAI,                                       &      ! directories
-       simPer,                                               &      ! simulation period
-       NTSTEPDAY,                                            &      ! number of timesteps per day (former: NAGG)
-       timeStep_LAI_input,                                   &      ! LAI option for reading gridded LAI field
-       dirConfigOut,                                         &
-       basin,                                                & ! L0_mask for mrm_init call
-       L0_elev,                                              & ! L0_elev for mrm_init call
-       L0_LCover                                               ! L0_LCover for mrm_init call
-  USE mo_common_variables,    ONLY : &
-       processMatrix,                                        &      ! basin information,  processMatrix
-       optimize, opti_function,                              &      ! optimization on/off and optimization method
-       global_parameters, global_parameters_name                    ! mhm parameters (gamma) and their clear names
-  USE mo_kind,                ONLY : i4, dp                         ! number precision
-  USE mo_message,             ONLY : message, message_text          ! For print out
-  USE mo_meteo_forcings,      ONLY : prepare_meteo_forcings_data
-  USE mo_mhm_eval,            ONLY : mhm_eval
-  USE mo_prepare_gridded_LAI, ONLY : prepare_gridded_daily_LAI_data, & ! prepare daily LAI gridded fields
-                             prepare_gridded_mean_monthly_LAI_data  ! prepare mean monthly LAI gridded fields
-
-  USE mo_read_optional_data,  ONLY : read_soil_moisture,     &      ! optional soil moisture reader, basin_avg_TWS reader
-                                     read_basin_avg_TWS,     &
-                                     read_neutrons,          &
-                                     read_evapotranspiration
-  USE mo_read_config,         ONLY : read_config                    ! Read main configuration files
-  USE mo_read_wrapper,        ONLY : read_data                      ! Read all input data
-  USE mo_read_latlon,         ONLY : read_latlon
-  USE mo_restart,             ONLY : write_restart_files
-  USE mo_startup,             ONLY : initialise
-  USE mo_string_utils,        ONLY : num2str, separator             ! String magic
-  USE mo_timer,               ONLY :                         &
-       timers_init, timer_start, timer_stop, timer_get              ! Timing of processes
-  USE mo_write_ascii,         ONLY :                         &
-       write_configfile,                                     &      ! Writing Configuration file
-       write_optifile,                                       &      ! Writing optimized parameter set and objective
-       write_optinamelist                                           ! Writing optimized parameter set to a namelist
-  USE mo_objective_function,  ONLY : objective                 ! objective functions and likelihoods
-  USE mo_optimization,        ONLY : optimization
+  USE mo_file, ONLY : &
+          version, version_date, file_main, &      ! main info
+          file_namelist_mhm, unamelist_mhm, &      ! filename of namelist: main setup
+          file_namelist_mhm_param, unamelist_mhm_param, &      ! filename of namelist: mhm model parameter
+          file_defOutput                                               ! filename of namelist: output setup
+  USE mo_finish, ONLY : finish                         ! Finish with style
+  USE mo_global_variables, ONLY : &
+          dirPrecipitation, &      ! directories
+          dirTemperature, &      ! directories
+          dirReferenceET, &      ! PET input path  if process 5 is 'PET is input' (case 0)
+          dirMinTemperature, dirMaxTemperature, &      ! PET input paths if process 5 is Hargreaves-Samani  (case 1)
+          dirNetRadiation, &      ! PET input paths if process 5 is Priestley-Taylor (case 2)
+          dirabsVapPressure, dirwindspeed, &      ! PET input paths if process 5 is Penman-Monteith  (case 3)
+          timestep_model_inputs !frequency of input read
+  USE mo_common_mHM_mRM_variables, ONLY : &
+          nTstepDay, &      ! number of timesteps per day (former: NAGG)
+          simPer, &      ! simulation period
+          optimize, opti_function, &                                   ! optimization on/off and optimization method
+          mrm_coupling_mode
+  USE mo_common_variables, ONLY : &
+          write_restart, &      ! restart writing flags
+          dirRestartOut, &
+          dirConfigOut, &
+          dirMorpho, dirLCover, &                                         ! directories
+          dirOut, &      ! directories
+          nbasins, &      ! number of basins
+          processMatrix, &      ! basin information,  processMatrix
+          global_parameters, global_parameters_name      ! mhm parameters (gamma) and their clear names
+  USE mo_kind, ONLY : i4, dp                         ! number precision
+  USE mo_message, ONLY : message, message_text          ! For print out
+  USE mo_meteo_forcings, ONLY : prepare_meteo_forcings_data
+  USE mo_mhm_eval, ONLY : mhm_eval
+  USE mo_read_optional_data, ONLY : read_soil_moisture, &      ! optional soil moisture reader, basin_avg_TWS reader
+          read_basin_avg_TWS, &
+          read_neutrons, &
+          read_evapotranspiration
+  USE mo_common_read_config, ONLY : common_read_config                    ! Read main configuration files
+  USE mo_common_mHM_mRM_read_config, ONLY : &
+          common_mHM_mRM_read_config, check_optimization_settings ! Read main configuration files
+  USE mo_mpr_read_config, ONLY : mpr_read_config                    ! Read main configuration files
+  USE mo_mhm_read_config, ONLY : mhm_read_config                    ! Read main configuration files
+  USE mo_read_wrapper, ONLY : read_data                      ! Read all input data
+  USE mo_restart, ONLY : write_restart_files
+  USE mo_startup, ONLY : mhm_initialize
+  USE mo_string_utils, ONLY : num2str, separator             ! String magic
+  USE mo_timer, ONLY : &
+          timers_init, timer_start, timer_stop, timer_get              ! Timing of processes
+  USE mo_write_ascii, ONLY : &
+          write_configfile, &      ! Writing Configuration file
+          write_optifile, &      ! Writing optimized parameter set and objective
+          write_optinamelist                                           ! Writing optimized parameter set to a namelist
+  USE mo_objective_function, ONLY : objective                 ! objective functions and likelihoods
+  USE mo_optimization, ONLY : optimization
 #ifdef MRM2MHM
-  USE mo_mrm_objective_function_runoff, only: single_objective_runoff
-  USE mo_mrm_init,            ONLY : mrm_init
-  USE mo_mrm_write,           only : mrm_write
+  USE mo_mrm_objective_function_runoff, only : single_objective_runoff
+  USE mo_mrm_init, ONLY : mrm_init
+  USE mo_mrm_write, only : mrm_write
+
 #endif
   !$ USE omp_lib,             ONLY : OMP_GET_NUM_THREADS           ! OpenMP routines
 
   IMPLICIT NONE
 
   ! local
-  integer(i4), dimension(8)             :: datetime         ! Date and time
+  integer(i4), dimension(8) :: datetime         ! Date and time
   !$ integer(i4)                        :: n_threads        ! OpenMP number of parallel threads
-  integer(i4)                           :: ii               ! Counters
-  integer(i4)                           :: iTimer           ! Current timer number
-  integer(i4)                           :: nTimeSteps
-  real(dp)                              :: funcbest         ! best objective function achivied during optimization
-  logical,  dimension(:),   allocatable :: maskpara         ! true  = parameter will be optimized     = parameter(i,4) = 1
+  integer(i4) :: iBasin               ! Counters
+  integer(i4) :: iTimer           ! Current timer number
+  integer(i4) :: nTimeSteps
+  real(dp) :: funcbest         ! best objective function achivied during optimization
+  logical, dimension(:), allocatable :: maskpara         ! true  = parameter will be optimized     = parameter(i,4) = 1
   !                                                         ! false = parameter will not be optimized = parameter(i,4) = 0
+  procedure(mhm_eval), pointer :: eval
+  procedure(objective), pointer :: obj_func
 
   ! --------------------------------------------------------------------------
   ! START
@@ -237,15 +240,15 @@ PROGRAM mhm_driver
   call message(separator)
 
   call message()
-  call date_and_time(values=datetime)
-  message_text = trim(num2str(datetime(3),'(I2.2)'))//"."//trim(num2str(datetime(2),'(I2.2)')) &
-       //"."//trim(num2str(datetime(1),'(I4.4)'))//" "//trim(num2str(datetime(5),'(I2.2)')) &
-       //":"//trim(num2str(datetime(6),'(I2.2)'))//":"//trim(num2str(datetime(7),'(I2.2)'))
+  call date_and_time(values = datetime)
+  message_text = trim(num2str(datetime(3), '(I2.2)')) // "." // trim(num2str(datetime(2), '(I2.2)')) &
+          // "." // trim(num2str(datetime(1), '(I4.4)')) // " " // trim(num2str(datetime(5), '(I2.2)')) &
+          // ":" // trim(num2str(datetime(6), '(I2.2)')) // ":" // trim(num2str(datetime(7), '(I2.2)'))
   call message('Start at ', trim(message_text), '.')
   call message('Using main file ', trim(file_main), ' and namelists: ')
-  call message('     ',trim(file_namelist))
-  call message('     ',trim(file_namelist_param))
-  call message('     ',trim(file_defOutput))
+  call message('     ', trim(file_namelist_mhm))
+  call message('     ', trim(file_namelist_mhm_param))
+  call message('     ', trim(file_defOutput))
   call message()
 
   !$OMP PARALLEL
@@ -254,132 +257,116 @@ PROGRAM mhm_driver
   !$ call message('Run with OpenMP with ', trim(num2str(n_threads)), ' threads.')
 
   call message()
-  call message('Read namelist file: ', trim(file_namelist))
-  call message('Read namelist file: ', trim(file_namelist_param))
+  call message('Read namelist file: ', trim(file_namelist_mhm))
+  call message('Read namelist file: ', trim(file_namelist_mhm_param))
   call message('Read namelist file: ', trim(file_defOutput))
-  call read_config()
+  call common_read_config(file_namelist_mhm, unamelist_mhm)
+  call mpr_read_config(file_namelist_mhm, unamelist_mhm, file_namelist_mhm_param, unamelist_mhm_param)
+  call common_mHM_mRM_read_config(file_namelist_mhm, unamelist_mhm)
+  call mhm_read_config(file_namelist_mhm, unamelist_mhm)
+  call check_optimization_settings()
 
   call message()
-  call message('  # of basins:         ', trim(num2str(nbasins)))
+  call message('# of basins:         ', trim(num2str(nbasins)))
   call message()
   call message('  Input data directories:')
-  do ii = 1, nbasins
-     call message( '  --------------' )
-     call message( '      BASIN                   ', num2str(ii,'(I3)') )
-     call message( '  --------------' )
-     call message('    Morphological directory:    ',   trim(dirMorpho(ii) ))
-     call message('    Land cover directory:       ',   trim(dirLCover(ii) ))
-     call message('    Precipitation directory:    ',   trim(dirPrecipitation(ii)  ))
-     call message('    Temperature directory:      ',   trim(dirTemperature(ii)  ))
-     select case (processMatrix(5,1))
-     case(-1:0) ! PET is input
-        call message('    PET directory:              ', trim(dirReferenceET(ii)  ))
-     case(1) ! Hargreaves-Samani
-        call message('    Min. temperature directory: ', trim(dirMinTemperature(ii)  ))
-        call message('    Max. temperature directory: ', trim(dirMaxTemperature(ii)  ))
-     case(2) ! Priestely-Taylor
-        call message('    Net radiation directory:    ', trim(dirNetRadiation(ii) ))
-     case(3) ! Penman-Monteith
-        call message('    Net radiation directory:    ', trim(dirNetRadiation(ii) ))
-        call message('    Abs. vap. press. directory: ', trim(dirabsVapPressure(ii)  ))
-        call message('    Windspeed directory:        ', trim(dirwindspeed(ii)  ))
-     end select
-     call message('    Output directory:           ',   trim(dirOut(ii) ))
-     if (timeStep_LAI_input .NE. 0) then
-        call message('    LAI directory:              ', trim(dirgridded_LAI(ii)) )
-     end if
-
-     call message('')
+  do iBasin = 1, nbasins
+    call message('  --------------')
+    call message('      BASIN                   ', num2str(iBasin, '(I3)'))
+    call message('  --------------')
+    call message('    Morphological directory:    ', trim(dirMorpho(iBasin)))
+    call message('    Land cover directory:       ', trim(dirLCover(iBasin)))
+    call message('    Precipitation directory:    ', trim(dirPrecipitation(iBasin)))
+    call message('    Temperature directory:      ', trim(dirTemperature(iBasin)))
+    select case (processMatrix(5, 1))
+    case(-1 : 0) ! PET is input
+      call message('    PET directory:              ', trim(dirReferenceET(iBasin)))
+    case(1) ! Hargreaves-Samani
+      call message('    Min. temperature directory: ', trim(dirMinTemperature(iBasin)))
+      call message('    Max. temperature directory: ', trim(dirMaxTemperature(iBasin)))
+    case(2) ! Priestely-Taylor
+      call message('    Net radiation directory:    ', trim(dirNetRadiation(iBasin)))
+    case(3) ! Penman-Monteith
+      call message('    Net radiation directory:    ', trim(dirNetRadiation(iBasin)))
+      call message('    Abs. vap. press. directory: ', trim(dirabsVapPressure(iBasin)))
+      call message('    Windspeed directory:        ', trim(dirwindspeed(iBasin)))
+    end select
+    call message('    Output directory:           ', trim(dirOut(iBasin)))
+
+    call message('')
   end do
 
   ! Start timings
   call timers_init
 
   ! --------------------------------------------------------------------------
-  ! READ AND (RE-)INITIALISE
+  ! READ AND INITIALIZE
   ! --------------------------------------------------------------------------
   itimer = 1
   call message()
 
-  call message('  Read data ' )
+  call message('  Read data ...')
   call timer_start(itimer)
   ! for DEM, slope, ... define nGvar local
   ! read_data has a basin loop inside
-  call read_data()
+  call read_data(simPer)
   call timer_stop(itimer)
-  call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
+  call message('    in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.')
 
   ! read data for every basin
-  do ii=1, nbasins
-     itimer = itimer + 1
-     call message('  Initialise basin: ', trim(adjustl(num2str(ii))),' ...')
-     call timer_start(itimer)
-     call initialise(ii)
-     call timer_stop(itimer)
-     call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
-
-     ! read meteorology now, if optimization is switched on
-     ! meteorological forcings (reading, upscaling or downscaling)
-     if ( timestep_model_inputs(ii) .eq. 0_i4 ) then
-        call prepare_meteo_forcings_data(ii, 1)
-     end if
-
-     ! read lat lon coordinates of each basin
-     call message('  Reading lat-lon for basin: ', trim(adjustl(num2str(ii))),' ...')
-     call timer_start(itimer)
-     call read_latlon(ii)
-     call timer_stop(itimer)
-     call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
-
-     ! gridded LAI values
-     if( timeStep_LAI_input .NE. 0 ) then
-        ! daily gridded fieelds
-        if (timeStep_LAI_input .LT. 0) then
-           call message('  Reading LAI for basin: ', trim(adjustl(num2str(ii))),' ...')
-           call timer_start(itimer)
-           call prepare_gridded_daily_LAI_data(ii)
-           call timer_stop(itimer)
-           call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
-        end if
-        ! long term mean monthly gridded fields
-        if ( timeStep_LAI_input .EQ. 1 ) then
-           call message('  Reading LAI for basin: ', trim(adjustl(num2str(ii))),' ...')
-           call timer_start(itimer)
-           call prepare_gridded_mean_monthly_LAI_data(ii)
-           call timer_stop(itimer)
-           call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
+  itimer = itimer + 1
+  call message('  Initialize basins ...')
+  call timer_start(itimer)
+  call mhm_initialize()
+  call timer_stop(itimer)
+  call message('  in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.')
+
+  itimer = itimer + 1
+  call message('  Read forcing and optional data ...')
+  call timer_start(itimer)
+
+  do iBasin = 1, nbasins
+    ! read meteorology now, if optimization is switched on
+    ! meteorological forcings (reading, upscaling or downscaling)
+    if (timestep_model_inputs(iBasin) .eq. 0_i4) then
+      call prepare_meteo_forcings_data(iBasin, 1)
+    end if
+
+    ! read optional optional data if necessary
+    if (optimize) then
+      select case (opti_function)
+      case(10 : 13, 28)
+        ! read optional spatio-temporal soil mositure data
+        call read_soil_moisture(iBasin)
+      case(17)
+        ! read optional spatio-temporal neutrons data
+        call read_neutrons(iBasin)
+      case(27, 29, 30)
+        ! read optional spatio-temporal evapotranspiration data
+        call read_evapotranspiration(iBasin)
+      case(15)
+        ! read optional basin average TWS data at once, therefore only read it
+        ! the last iteration of the basin loop to ensure same time for all basins
+        ! note: this is similar to how the runoff is read using mrm below
+        if (iBasin == nbasins) then
+          call read_basin_avg_TWS()
         end if
-     end if
-
-     ! read optional optional data if necessary
-     if (optimize) then
-        select case (opti_function)
-        case(10:13,28)
-           ! read optional spatio-temporal soil mositure data
-           call read_soil_moisture(ii)
-        case(17)
-           ! read optional spatio-temporal neutrons data
-           call read_neutrons(ii)
-        case(27,29,30)
-           ! read optional spatio-temporal evapotranspiration data
-           call read_evapotranspiration(ii)
-        case(15)
-           ! read optional basin average TWS data at once, therefore only read it
-           ! the last iteration of the basin loop to ensure same time for all basins
-           ! note: this is similar to how the runoff is read using mrm below
-           if ( ii == nbasins) then
-              call read_basin_avg_TWS()
-           end if
-        end select
-     end if
+      end select
+    end if
 
   end do
+  call timer_stop(itimer)
+  call message('    in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.')
 
 #ifdef MRM2MHM
   ! --------------------------------------------------------------------------
   ! READ and INITIALISE mRM ROUTING
   ! --------------------------------------------------------------------------
-  if (processMatrix(8, 1) .ne. 0_i4) call mrm_init(basin%L0_mask, L0_elev, L0_LCover)
+  mrm_coupling_mode = 2_i4
+  if (processMatrix(8, 1) .ne. 0_i4) call mrm_init(file_namelist_mhm, unamelist_mhm, &
+          file_namelist_mhm_param, unamelist_mhm_param)
+#else
+  mrm_coupling_mode = -1_i4
 #endif
 
   !this call may be moved to another position as it writes the master config out file for all basins
@@ -390,54 +377,57 @@ PROGRAM mhm_driver
   ! --------------------------------------------------------------------------
   iTimer = iTimer + 1
   call message()
-  if ( optimize ) then
+  if (optimize) then
+    eval => mhm_eval
 
-     select case(opti_function)
+    select case(opti_function)
 #ifdef MRM2MHM
-     case(1:9,14,31)
-        ! call optimization against only runoff (no other variables)
-        call optimization(single_objective_runoff, dirConfigOut, funcBest, maskpara)
+     case(1 : 9, 14, 31)
+      ! call optimization against only runoff (no other variables)
+      obj_func => single_objective_runoff
+      call optimization(eval, obj_func, dirConfigOut, funcBest, maskpara)
 #endif
-     case(10:13,15,17,27,28,29,30)
-        ! call optimization for other variables
-        call optimization(objective, dirConfigOut, funcBest, maskpara)
-     case default
-        call message('***ERROR: mhm_driver: The given objective function number ', &
-             trim(adjustl(num2str(opti_function))), ' in mhm.nml is not valid!')
-        stop
-     end select
-
-     ! write a file with final objective function and the best parameter set
-     call write_optifile(funcbest, global_parameters(:,3), global_parameters_name(:))
-     ! write a file with final best parameter set in a namlist format
-     call write_optinamelist(processMatrix, global_parameters, maskpara, global_parameters_name(:))
-     deallocate(maskpara)
+     case(10 : 13, 15, 17, 27, 28, 29, 30)
+      ! call optimization for other variables
+      obj_func => objective
+      call optimization(eval, obj_func, dirConfigOut, funcBest, maskpara)
+    case default
+      call message('***ERROR: mhm_driver: The given objective function number ', &
+              trim(adjustl(num2str(opti_function))), ' in mhm.nml is not valid!')
+      stop 1
+    end select
+
+    ! write a file with final objective function and the best parameter set
+    call write_optifile(funcbest, global_parameters(:, 3), global_parameters_name(:))
+    ! write a file with final best parameter set in a namlist format
+    call write_optinamelist(processMatrix, global_parameters, maskpara, global_parameters_name(:))
+    deallocate(maskpara)
   else
 
-     ! --------------------------------------------------------------------------
-     ! call mHM
-     ! get runoff timeseries if possible (i.e. when processMatrix(8,1) > 0)
-     ! get other model outputs  (i.e. gridded fields of model output)
-     ! --------------------------------------------------------------------------
-     call message('  Run mHM')
-     call timer_start(iTimer)
-     call mhm_eval(global_parameters(:,3))
-     call timer_stop(itimer)
-     call message('    in ', trim(num2str(timer_get(itimer),'(F12.3)')), ' seconds.')
+    ! --------------------------------------------------------------------------
+    ! call mHM
+    ! get runoff timeseries if possible (i.e. when processMatrix(8,1) > 0)
+    ! get other model outputs  (i.e. gridded fields of model output)
+    ! --------------------------------------------------------------------------
+    call message('  Run mHM')
+    call timer_start(iTimer)
+    call mhm_eval(global_parameters(:, 3))
+    call timer_stop(itimer)
+    call message('    in ', trim(num2str(timer_get(itimer), '(F12.3)')), ' seconds.')
 
   end if
 
   ! --------------------------------------------------------------------------
   ! WRITE RESTART files
   ! --------------------------------------------------------------------------
-  if ( write_restart  .AND. (.NOT. optimize)) then
-     itimer = itimer + 1
-     call message()
-     call message( '  Write restart file')
-     call timer_start(itimer)
-     call write_restart_files( dirRestartOut )
-     call timer_stop(itimer)
-     call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
+  if (write_restart  .AND. (.NOT. optimize)) then
+    itimer = itimer + 1
+    call message()
+    call message('  Write restart file')
+    call timer_start(itimer)
+    call write_restart_files(dirRestartOut)
+    call timer_stop(itimer)
+    call message('    in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.')
   end if
 
 #ifdef MRM2MHM
@@ -460,16 +450,16 @@ PROGRAM mhm_driver
   ! call timer_stop(itimer)
   ! call message('    in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.')
 
-  nTimeSteps = maxval( simPer(1:nBasins)%julEnd - simPer(1:nBasins)%julStart + 1 ) * NTSTEPDAY
-  call date_and_time(values=datetime)
+  nTimeSteps = maxval(simPer(1 : nBasins)%julEnd - simPer(1 : nBasins)%julStart + 1) * nTstepDay
+  call date_and_time(values = datetime)
   call message()
-  message_text = 'Done '//trim(num2str(nTimeSteps,'(I10)'))//" time steps."
+  message_text = 'Done ' // trim(num2str(nTimeSteps, '(I10)')) // " time steps."
   call message(trim(message_text))
-  message_text = trim(num2str(datetime(3),'(I2.2)'))//"."//trim(num2str(datetime(2),'(I2.2)')) &
-       //"."//trim(num2str(datetime(1),'(I4.4)'))//" "//trim(num2str(datetime(5),'(I2.2)')) &
-       //":"//trim(num2str(datetime(6),'(I2.2)'))//":"//trim(num2str(datetime(7),'(I2.2)'))
+  message_text = trim(num2str(datetime(3), '(I2.2)')) // "." // trim(num2str(datetime(2), '(I2.2)')) &
+          // "." // trim(num2str(datetime(1), '(I4.4)')) // " " // trim(num2str(datetime(5), '(I2.2)')) &
+          // ":" // trim(num2str(datetime(6), '(I2.2)')) // ":" // trim(num2str(datetime(7), '(I2.2)'))
   call message('Finished at ', trim(message_text), '.')
   call message()
-  call finish('mHM','Finished!')
+  call finish('mHM', 'Finished!')
 
 END PROGRAM mhm_driver
diff --git a/src/mHM/mo_canopy_interc.f90 b/src/mHM/mo_canopy_interc.f90
index 26305c48..8844fac3 100644
--- a/src/mHM/mo_canopy_interc.f90
+++ b/src/mHM/mo_canopy_interc.f90
@@ -10,8 +10,9 @@
 
 MODULE mo_canopy_interc
 
-  USE mo_kind,      ONLY: dp
-  USE mo_constants, ONLY: twothird_dp, eps_dp
+  USE mo_kind, ONLY : dp
+  USE mo_common_constants, ONLY : eps_dp
+  USE mo_constants, ONLY : twothird_dp
 
   IMPLICIT NONE
 
@@ -33,19 +34,19 @@ MODULE mo_canopy_interc
 
   !>        \details  Calculates throughfall.
   !>                  Updates interception and evaporation intensity from canopy.\n
-  
+
   !>         Throughfall (\f$F\f$) is estimated as a function of the incoming precipitation (\f$P\f$), 
   !>         the current status of the canopy water content (\f$C\f$), and the max. water 
   !          content(\f$C_{max}\f$) that can be intecepted by the vegetation.\n       
   !>         \f[ F = Max( (P + C - C_{max}), 0) \f]
-  
+
   !>         Evaporation (\f$E\f$) from canopy is estimated as a fraction of the potential 
   !>         evapotranspiration(\f$E_{p}\f$) depending on the current status of the canopy  
   !>         water content (\f$C\f$) and the max. water content(\f$C_{max}\f$) that can be 
   !>         intecepted by the vegetation. \n
   !>         \f[ E = E_{p}(C/C_{max})^{2/3} \f]
-  
-  
+
+
   !     CALLING SEQUENCE
   !         canopy_interc(pet, interc_month_max, interc_max, precip, throughfall, evap_canopy, interc)
 
@@ -56,7 +57,7 @@ MODULE mo_canopy_interc
 
   !     INDENT(INOUT)
   !>        \param[in,out] "real(dp)  ::  interc"          Interception [mm]
-  
+
   !     INDENT(OUT)
   !>        \param[out] "real(dp)  ::  evap_canopy"        Real evaporation intensity from canopy[mm s-1]
   !>        \param[out] "real(dp)  ::  throughfall"        Throughfall [mm s-1]
@@ -93,15 +94,15 @@ ELEMENTAL PURE SUBROUTINE canopy_interc(pet, interc_max, precip, interc, through
 
     IMPLICIT NONE
 
-    REAL(dp), INTENT(IN)     :: pet
-    REAL(dp), INTENT(IN)     :: interc_max
-    REAL(dp), INTENT(IN)     :: precip
-    REAL(dp), INTENT(INOUT)  :: interc
-    REAL(dp), INTENT(OUT)    :: throughfall
-    REAL(dp), INTENT(OUT)    :: evap_canopy
-    
+    REAL(dp), INTENT(IN) :: pet
+    REAL(dp), INTENT(IN) :: interc_max
+    REAL(dp), INTENT(IN) :: precip
+    REAL(dp), INTENT(INOUT) :: interc
+    REAL(dp), INTENT(OUT) :: throughfall
+    REAL(dp), INTENT(OUT) :: evap_canopy
+
     ! local variables
-    REAL(dp)                 :: aux_help ! Auxiliary helping variable [-]
+    REAL(dp) :: aux_help ! Auxiliary helping variable [-]
 
     !===============================================
     ! Canopy Interception
@@ -111,30 +112,30 @@ ELEMENTAL PURE SUBROUTINE canopy_interc(pet, interc_max, precip, interc, through
 
     aux_help = interc + precip
     if (aux_help >= interc_max) then
-       throughfall = aux_help - interc_max
-       interc      = interc_max
+      throughfall = aux_help - interc_max
+      interc = interc_max
     else
-       throughfall = 0.0_dp
-       interc      = aux_help
+      throughfall = 0.0_dp
+      interc = aux_help
     end if
 
     ! New module for evaporation from canopy surface
     ! [power (2/3) is based on the paper of Liang et al. 1994 & Deardorf, 1978]
     if (interc_max > eps_dp) then
-       evap_canopy = pet * (interc/interc_max)**twothird_dp       
+      evap_canopy = pet * (interc / interc_max)**twothird_dp
     else
-       ! in case interc_max is 
-       evap_canopy = 0.0_dp
+      ! in case interc_max is
+      evap_canopy = 0.0_dp
     end if
 
     ! numerical problem
     if (evap_canopy < 0.0_dp) evap_canopy = 0.0_dp ! this should never appear
 
     if (interc > evap_canopy) then
-       interc = interc - evap_canopy
+      interc = interc - evap_canopy
     else
-       evap_canopy = interc
-       interc      = 0.0_dp
+      evap_canopy = interc
+      interc = 0.0_dp
     end if
 
   END SUBROUTINE canopy_interc
diff --git a/src/mHM/mo_file.f90 b/src/mHM/mo_file.f90
index 039f6cd5..83eb1f66 100644
--- a/src/mHM/mo_file.f90
+++ b/src/mHM/mo_file.f90
@@ -10,119 +10,28 @@
 MODULE mo_file
 
   IMPLICIT NONE
-  
+
   !> Current mHM model version
-  CHARACTER(len=*), PARAMETER :: version                = '5.8'                         ! Version
+  CHARACTER(len = *), PARAMETER :: version = '5.8'                         ! Version
   !> Time of current mHM model version release
-  CHARACTER(len=*), PARAMETER :: version_date           = 'December 2017'                   ! Release date
+  CHARACTER(len = *), PARAMETER :: version_date = 'December 2017'                   ! Release date
   !> Driver file
-  CHARACTER(len=*), PARAMETER :: file_main              = 'mhm_driver.f90'              ! Driver
+  CHARACTER(len = *), PARAMETER :: file_main = 'mhm_driver.f90'              ! Driver
   !> Namelist file name
-  CHARACTER(len=*), PARAMETER :: file_namelist          = 'mhm.nml'                     ! Namelist
+  CHARACTER(len = *), PARAMETER :: file_namelist_mhm = 'mhm.nml'                     ! Namelist
   !> Unit for namelist
-  INTEGER,          PARAMETER :: unamelist              = 30                            ! 
+  INTEGER, PARAMETER :: unamelist_mhm = 30                            !
   !> Parameter namelists file name
-  CHARACTER(len=*), PARAMETER :: file_namelist_param    = 'mhm_parameter.nml'           ! Parameter namelists
+  CHARACTER(len = *), PARAMETER :: file_namelist_mhm_param = 'mhm_parameter.nml'           ! Parameter namelists
   !> Unit for namelist
-  INTEGER,          PARAMETER :: unamelist_param        = 31                            ! 
-
-  !> Input nCols and nRows of binary meteo files are in header file
-  CHARACTER(len=*), PARAMETER :: file_meteo_header      = 'header.txt'                  ! Meteo header
-  !> Unit for meteo header file
-  INTEGER,          PARAMETER :: umeteo_header          = 50                            ! 
-  !> File ending of meteo files
-  CHARACTER(len=*), PARAMETER :: file_meteo_binary_end  = '.bin'                        ! Meteo
-  !> Unit for meteo files
-  INTEGER,          PARAMETER :: umeteo                 = 51                            ! 
-  !> Soil database file (iFlag_soilDB = 0) = classical mHM format
-  CHARACTER(len=*), PARAMETER :: file_soil_database     = 'soil_classdefinition.txt'    ! Soil data base 
-  !>> Soil database file (iFlag_soilDB = 1)
-  CHARACTER(len=*), PARAMETER :: file_soil_database_1   = 'soil_classdefinition_iFlag_soilDB_1.txt' 
-  !> Unit for soil data base
-  INTEGER,          PARAMETER :: usoil_database         = 52                            ! 
-  !> DEM input data file
-  CHARACTER(len=*), PARAMETER :: file_dem               = 'dem.asc'                     ! DEM
-  !> Unit for  DEM input data file
-  INTEGER,          PARAMETER :: udem                   = 53                            ! 
-  !> slope input data file
-  CHARACTER(len=*), PARAMETER :: file_slope             = 'slope.asc'                   ! slope
-  !> Unit for  slope input data file
-  INTEGER,          PARAMETER :: uslope                 = 54                            ! 
-  !> aspect input data file
-  CHARACTER(len=*), PARAMETER :: file_aspect            = 'aspect.asc'                  ! aspect
-  !> Unit for  aspect input data file
-  INTEGER,          PARAMETER :: uaspect                = 55                            ! 
-  !> flow accumulation input data file
-  CHARACTER(len=*), PARAMETER :: file_facc              = 'facc.asc'                    ! flow accumulation
-  !> Unit for  flow accumulation input data file
-  INTEGER,          PARAMETER :: ufacc                  = 56                            ! 
-  !> flow direction input data file
-  CHARACTER(len=*), PARAMETER :: file_fdir              = 'fdir.asc'                    ! flow direction
-  !> Unit for  flow direction input data file
-  INTEGER,          PARAMETER :: ufdir                  = 57                            ! 
-  !> hydrogeological classes input data file
-  CHARACTER(len=*), PARAMETER :: file_hydrogeoclass     = 'geology_class.asc'           ! hydrogeological classes
-  !> Unit for  hydrogeological classes input data file
-  INTEGER,          PARAMETER :: uhydrogeoclass         = 58                            ! 
-  !> soil classes input data file
-  CHARACTER(len=*), PARAMETER :: file_soilclass         = 'soil_class.asc'              ! soil classes
-  !> Unit for  soil classes input data file
-  INTEGER,          PARAMETER :: usoilclass             = 59                            ! 
-  !> LAI classes input data file
-  CHARACTER(len=*), PARAMETER :: file_laiclass          = 'LAI_class.asc'               ! LAI classes
-  !> Unit for  LAI input data file
-  INTEGER,          PARAMETER :: ulaiclass              = 60                            ! 
-  !> Unit for  LCover input data file
-  ! Land cover files are explicit given by the user in mhm.nml file
-  INTEGER,          PARAMETER :: ulcoverclass           = 61                            ! 
-
-  !> geological formation lookup table file
-  CHARACTER(len=*), PARAMETER :: file_geolut            = 'geology_classdefinition.txt' ! geolog. formation lookup table
-  !> Unit for geological formation lookup table file
-  INTEGER,          PARAMETER :: ugeolut                = 64                            ! 
-
-  !> LAI classes lookup table file
-  CHARACTER(len=*), PARAMETER :: file_lailut            = 'LAI_classdefinition.txt'     ! LAI classes lookup table
-  !> Unit for LAI classes lookup table file
-  INTEGER,          PARAMETER :: ulailut                = 65                            ! 
-
-  !> unit for discharge time series 
-  INTEGER,          PARAMETER :: udischarge             = 66                            ! 
+  INTEGER, PARAMETER :: unamelist_mhm_param = 31                            !
 
   !> file defining mHM's outputs
-  CHARACTER(len=*), PARAMETER :: file_defOutput         = 'mhm_outputs.nml'             ! output states and fluxes
+  CHARACTER(len = *), PARAMETER :: file_defOutput = 'mhm_outputs.nml'             ! output states and fluxes
   !> Unit for file defining mHM's outputs
-  INTEGER,          PARAMETER :: udefOutput             = 67                            ! 
-
-  !> file containing mHM configuration
-  CHARACTER(len=*), PARAMETER :: file_config            = 'ConfigFile.log'              ! configuration
-  !> Unit for file containing mHM configuration
-  INTEGER,          PARAMETER :: uconfig                = 68                            ! 
-
-  !> file defining optimization outputs (objective and parameter set)
-  CHARACTER(len=*), PARAMETER :: file_opti              = 'FinalParam.out'              ! final parameters & objective
-  !> Unit for file optimization outputs (objective and parameter set)
-  INTEGER,          PARAMETER :: uopti                  = 72                            ! 
-  !> file defining optimization outputs in a namelist format (parameter set)
-  CHARACTER(len=*), PARAMETER :: file_opti_nml          = 'FinalParam.nml'              ! final parameters
-  !> Unit for file optimization outputs in a namelist format (parameter set)
-  INTEGER,          PARAMETER :: uopti_nml              = 73                            ! 
+  INTEGER, PARAMETER :: udefOutput = 67                            !
 
-  !> file defining optimazation outputs
-  CHARACTER(len=*), PARAMETER :: file_daily_discharge   = 'daily_discharge.out'         ! daily discharge file
-  !> Unit for file optimazation outputs
-  INTEGER,          PARAMETER :: udaily_discharge       = 74                            ! 
-  
-  !> Input nCols and nRows of binary gridded LAI files are in header file
-  CHARACTER(len=*), PARAMETER :: file_lai_header        = 'header.txt'                  ! LAI header
-  !> Unit for LAI header file
-  INTEGER,          PARAMETER :: ulai_header            = 75                            !
-  !> Binary file ending of LAI files
-  CHARACTER(len=*), PARAMETER :: file_lai_binary_end    = '.bin'                        ! Gridded LAI
-  !> Unit for binary LAI files
-  INTEGER,          PARAMETER :: ulai                   = 76                            ! 
-  !> unit for tws time series 
-  INTEGER,          PARAMETER :: utws                   = 77                            ! 
+  !> unit for tws time series
+  INTEGER, PARAMETER :: utws = 77                            !
 
-  
 END MODULE mo_file
diff --git a/src/mHM/mo_global_variables.f90 b/src/mHM/mo_global_variables.f90
index f898c13d..39e0b320 100644
--- a/src/mHM/mo_global_variables.f90
+++ b/src/mHM/mo_global_variables.f90
@@ -33,60 +33,36 @@ MODULE mo_global_variables
   !           Zink M. Demirel C., Mar 2017 - added Jarvis soil water stress variable for SM process(3) 
   !           Demirel M.C.        May 2017 - added L1_petLAIcorFactor for PET correction
   !           O. Rakovec, R.Kumar Nov 2017 - added project description for the netcdf outputs
-  
-  USE mo_kind,             ONLY: i4, i8, dp
-  use mo_common_variables, ONLY: period
-  USE mo_mhm_constants,    ONLY: nOutFlxState, YearMonths, maxNoBasins, maxNLCovers
+  !           Robert Schweppe,    Dec 2017 - expanded dimensions of effective parameters
+  !           Robert Schweppe,    Dec 2017 - merged duplicated variables with mrm into common variables
 
-  IMPLICIT NONE
+  USE mo_kind, ONLY : i4, i8, dp
+  USE mo_mhm_constants, ONLY : nOutFlxState
+  USE mo_common_constants, ONLY : YearMonths, maxNoBasins, maxNLCovers
+  use mo_common_variables, only : Grid
 
-  ! Types have to be public
-  PUBLIC :: period
-  ! PUBLIC :: gaugingStation
-  PUBLIC :: soilType
-  PUBLIC :: gridGeoRef
-  PUBLIC :: basinInfo
+  IMPLICIT NONE
 
   ! -------------------------------------------------------------------
-  ! PROJECT DESCRIPTION for the NETCDF output file
+  ! DEFINE OUTPUTS
   ! -------------------------------------------------------------------
-  character(1024),public                             :: project_details            ! project including funding instituion., PI, etc.
-  character(1024),public                             :: setup_description          ! any specific description of simulation 
-  character(1024),public                             :: simulation_type            ! e.g. seasonal forecast, climate projection, ...
-  character(256),public                              :: Conventions                ! convention used for dataset
-  character(1024),public                             :: contact                    ! contact details, incl. PI name
-  character(1024),public                             :: mHM_details                ! developing institution, specific mHM revision
-  character(1024),public                             :: history                    ! details on version/creation date
-
+  integer(i4) :: timeStep_model_outputs ! timestep for writing model outputs
+  logical, dimension(nOutFlxState) :: outputFlxState         ! Define model outputs see "mhm_outputs.nml"
+  !                                                            dim1 = number of output variables to be written
   ! -------------------------------------------------------------------
   ! INPUT variables for configuration of mHM
   ! -------------------------------------------------------------------
-  integer(i4),   public                              :: timeStep                   ! [h] simulation time step (= TS) in [h]
-  integer(i4),   dimension(:), allocatable, public   :: timeStep_model_inputs      ! frequency for reading meteo input
-  real(dp),      dimension(:), allocatable, public   :: resolutionHydrology        ! [m or degree] resolution of hydrology - Level 1
-  real(dp),      dimension(:), allocatable, public   :: resolutionRouting          ! [m or degree] resolution of routing - Level 11
-  integer(i4),   dimension(:), allocatable, public   :: L0_Basin
-  logical,       public                              :: read_restart               ! flag
-  logical,       public                              :: write_restart              ! flag
-  logical,       public                              :: perform_mpr                ! switch for performing
-  logical,       public                              :: read_meteo_weights         ! read weights for tavg and pet
-  ! multiscale parameter regionalization
-  character(256),public                              :: inputFormat_meteo_forcings ! format of meteo input data(bin or nc)
-  ! LAI information
-  character(256), public                             :: inputFormat_gridded_LAI    ! format of gridded LAI data(bin or nc)
-  integer(i4),    public                             :: timeStep_LAI_input         ! time step of gridded LAI input
+  integer(i4), dimension(:), allocatable, public :: timeStep_model_inputs      ! frequency for reading meteo input
+  logical, public :: read_meteo_weights         ! read weights for tavg and pet
+  character(256), public :: inputFormat_meteo_forcings ! format of meteo input data(bin or nc)
   ! Optional data
-  integer(i4),    public                             :: timeStep_sm_input          ! time step of optional data: soil moisture sm
-  integer(i4),    public                             :: timeStep_neutrons_input    ! time step of optional data: neutron counts
-  integer(i4),    public                             :: timeStep_et_input          ! time step of optional data: evapotransp. et
-  integer(i4),    public                             :: iFlag_cordinate_sys        ! options model for the run cordinate system
-  integer(i4),    public                             :: iFlag_soilDB               ! options to handle different soil databases
+  integer(i4), public :: timeStep_sm_input          ! time step of optional data: soil moisture sm
+  integer(i4), public :: timeStep_neutrons_input    ! time step of optional data: neutron counts
+  integer(i4), public :: timeStep_et_input          ! time step of optional data: evapotransp. et
   ! ------------------------------------------------------------------
   ! DIRECTORIES
   ! ------------------------------------------------------------------
   ! has the dimension of nBasins
-  character(256), dimension(:), allocatable, public :: dirMorpho          ! Directory where morphological files are located
-  character(256), dimension(:), allocatable, public :: dirLCover          ! Directory where land cover files are located
   character(256), dimension(:), allocatable, public :: dirPrecipitation   ! Directory where precipitation files are located
   character(256), dimension(:), allocatable, public :: dirTemperature     ! Directory where temperature files are located
   character(256), dimension(:), allocatable, public :: dirMinTemperature  ! Directory where minimum temp. files are located
@@ -95,365 +71,113 @@ MODULE mo_global_variables
   character(256), dimension(:), allocatable, public :: dirabsVapPressure  ! Directory where abs. vap. pressure files are located
   character(256), dimension(:), allocatable, public :: dirwindspeed       ! Directory where windspeed files are located
   character(256), dimension(:), allocatable, public :: dirReferenceET     ! Directory where reference-ET files are located
-  character(256), dimension(:), allocatable, public :: dirOut             ! Directory where output is written to
-  character(256), dimension(:), allocatable, public :: dirRestartOut      ! Directory where output of restart is written to
-  character(256), dimension(:), allocatable, public :: dirRestartIn       ! Directory where input of restart is read from
-  character(256), dimension(:), allocatable, public :: dirgridded_LAI     ! Directory where gridded LAI is located
-                                                                          ! used when timeStep_LAI_input < 0
-  character(256), dimension(:), allocatable, public :: fileLatLon          ! directory to lat lon files
-
   character(256), dimension(:), allocatable, public :: dirSoil_moisture        ! File of monthly soil moisture
   character(256), dimension(:), allocatable, public :: fileTWS                 ! File of tws data
   character(256), dimension(:), allocatable, public :: dirNeutrons             ! File of spatio-temporal neutron data
   character(256), dimension(:), allocatable, public :: dirEvapotranspiration   ! File of monthly soil moisture
 
-  ! directory common to all basins
-  character(256),                            public :: dirConfigOut       ! Directory where config run output is written to
-  character(256),                            public :: dirCommonFiles     ! directory where common input files should be located
-  !                                                                       ! for all modeled basins
-  ! ------------------------------------------------------------------
-  ! NETCDF OUTPUT
-  ! ------------------------------------------------------------------
-  real(dp), dimension(:),   allocatable, target, public :: yCoor               ! GK4 (DHDN3-zone 4) easting
-  real(dp), dimension(:),   allocatable, target, public :: xCoor               ! GK4 (DHDN3-zone 4) northing
-  real(dp), dimension(:,:), allocatable, target, public :: lons                ! WGS84 lons
-  real(dp), dimension(:,:), allocatable, target, public :: lats                ! WGS84 lats
-
   ! ------------------------------------------------------------------
   ! CONSTANT
   ! ------------------------------------------------------------------
-  real(dp), public                                  :: c2TSTu             !       Unit transformation = timeStep/24
-  integer(i4), public                               :: nTstepDay          !       Number of time intervals per day
-  !                                                                       !       (was previously NAGG)
-  integer(i4), public, parameter                    :: routingStates = 2  ! [-]   Routing states (2=current, 1=past)
-
-  ! ------------------------------------------------------------------
-  ! SOIL DATA
-  ! ------------------------------------------------------------------
-  real(dp), public                                  :: tillageDepth       ! [mm]  Soil depth down to which organic
-  !                                                                               matter is possible
-  integer(i4), public                               :: nSoilHorizons_mHM  !       Number of horizons to model
-  real(dp), dimension(:), allocatable, public       :: HorizonDepth_mHM   ! [mm]  Horizon depth from surface,
-  !                                                                               positive downwards
-  integer(i4), public                               :: nSoilTypes         !       Number of soil types
-
-  type soilType
-     ! dim1 =  nSoilType (e.g. i=1..72 for BUEK)
-     ! dim2 =  the maximum of nHorizons
-     ! dim3 =  land cover classes
-     ! input data
-     integer(i4), dimension(:), allocatable     :: id                 !            Soil Id
-     integer(i4), dimension(:), allocatable     :: nHorizons          !            Number of horizons
-     integer(i4), dimension(:), allocatable     :: is_present         !            Wether this soil type is present in
-     !                                                                !            this basin or not
-     real(dp), dimension(:,:),   allocatable    :: UD                 ! [mm]       Upper Bound of depth
-     real(dp), dimension(:,:),   allocatable    :: LD                 ! [mm]       Lower Bound of depth
-     real(dp), dimension(:,:),   allocatable    :: clay               ! [%]        Clay content
-     real(dp), dimension(:,:),   allocatable    :: sand               ! [%]        Sand content
-     real(dp), dimension(:,:),   allocatable    :: DbM                ! [g/cm2]    Mineral Bulk density
-     real(dp), dimension(:,:),   allocatable    :: depth              ! [mm]       Depth of the soil Horizon
-     real(dp), dimension(:),     allocatable    :: RZdepth            ! [mm]       Total soil depth
-     real(dp), dimension(:,:,:), allocatable    :: Wd                 ! [1]        Weights of mHM Horizons according to
-     !                                                                !            horizons provided in soil database
-     integer(i4), dimension(:),  allocatable    :: nTillHorizons      ! [1]        Number of tillage horizons
-
-     ! derived soil hydraulic properties
-     real(dp), dimension(:,:,:), allocatable    :: thetaS_Till        ! [1]        Saturated water content of soil horizons
-     !                                                                !            tillage depth - f(OM, management)
-     real(dp), dimension(:,:),   allocatable    :: thetaS             ! [1]        Saturated water content of soil horizons
-     !                                                                !            after tillage depth
-     real(dp), dimension(:,:,:), allocatable    :: Db                 ! [g/cm2]    Bulk density, LUC dependent
-     !                                                                !            = f( OM, management)
-     real(dp), dimension(:,:,:), allocatable    :: thetaFC_Till       ! [1]        Field capacity of tillage layers;
-     !                                                                !            LUC dependent - f(OM, management)
-     real(dp), dimension(:,:),   allocatable    :: thetaFC            ! [1]        Field capacity of deeper layers
-     real(dp), dimension(:,:,:), allocatable    :: thetaPW_Till       ! [1]        Permament wilting point of tillage layers;
-     !                                                                !            LUC dependent - f(OM, management)
-     real(dp), dimension(:,:),   allocatable    :: thetaPW            ! [1]        Permanent wilting point of deeper layers
-     real(dp), dimension(:,:,:), allocatable    :: Ks                 ! [cm/d]     Saturated hydaulic conductivity
-  end type soilType
-  type(soilType), public                        :: soilDB             !            The soil database
+  integer(i4), public, parameter :: routingStates = 2  ! [-]   Routing states (2=current, 1=past)
 
   ! ------------------------------------------------------------------
   ! BASIN AVERAGED TOTAL WATER STORAGE DATA
   ! ------------------------------------------------------------------
   type TWSstructure
-     integer(i4),    dimension(:),     allocatable :: basinId            ! Basin Id
-     character(256), dimension(:),     allocatable :: fname              ! file name
-     real(dp),       dimension(:,:),   allocatable :: TWS                ! [mm]
+    integer(i4), dimension(:), allocatable :: basinId            ! Basin Id
+    character(256), dimension(:), allocatable :: fname              ! file name
+    real(dp), dimension(:, :), allocatable :: TWS                ! [mm]
   end type TWSstructure
-  type(TWSstructure), public                       :: basin_avg_TWS_obs   ! [mm] basin average TWS observational data
+  type(TWSstructure), public :: basin_avg_TWS_obs   ! [mm] basin average TWS observational data
 
-  real(dp), public, dimension(:,:), allocatable    :: basin_avg_TWS_sim  ! variable containing basin average TWS for each basin
-  integer(i4), public                              :: nMeasPerDay_TWS    ! Number of WTS observations per day,
+  real(dp), public, dimension(:, :), allocatable :: basin_avg_TWS_sim  ! variable containing basin average TWS for each basin
+  integer(i4), public :: nMeasPerDay_TWS    ! Number of WTS observations per day,
   !                                                                      ! e.g. 24 -> hourly, 1 -> daily
 
-  ! -----------------------------------------------------------------
-  ! GEOLOGICAL FORMATION data
-  ! -----------------------------------------------------------------
-  integer(i4), public                              :: nGeoUnits   ! Number of geological formations
-  integer(i4), dimension(:), allocatable, public   :: GeoUnitList ! List of ids of each geological formations
-  integer(i4), dimension(:), allocatable, public   :: GeoUnitKar  ! Id of Karstic formation (0 == does not exist)
-
-  ! -----------------------------------------------------------------
-  ! Land cover, LAI LUT data
-  ! -----------------------------------------------------------------
-  ! Land cover information
-  real(dp), public                                    :: fracSealed_cityArea ! fraction of area within city assumed to be
-                                                                             ! perfectly sealed [0-1]
-  integer(i4),    public                              :: nLCoverScene        ! Number of land cover scene
-  character(256), public, dimension(:),   allocatable :: LCfilename          ! file names for the different land cover scenes
-  integer(i4),    public, dimension(:,:), allocatable :: LCyearId            ! Mapping of landcover scenes (1, 2, ...) for each basin
-                                                                             ! to the actual year(1960, 1961, ...)
-  ! LAI data
-  ! variables used when timeStep_LAI_input == 0
-  integer(i4),    public                              :: nLAIclass         ! Number of LAI classes
-  integer(i4),    public, dimension(:),   allocatable :: LAIUnitList       ! List of ids of each LAI class in LAILUT
-  real(dp),       public, dimension(:,:), allocatable :: LAILUT            ! [m2/m2] Leaf area index for LAIUnit
-  !                                                                        ! dim1=land cover class, dim2=month of year
-
-
   ! -------------------------------------------------------------------
   ! GRID description
   ! -------------------------------------------------------------------
-  type gridGeoRef
-  !  dim1=basin id
-     integer(i4), dimension(:), allocatable :: ncols        ! Number of columns
-     integer(i4), dimension(:), allocatable :: nrows        ! Number of rows
-     real(dp), dimension(:), allocatable    :: xllcorner    ! x coordinate of the lowerleft corner
-     real(dp), dimension(:), allocatable    :: yllcorner    ! y coordinate of the lowerleft corner
-     real(dp), dimension(:), allocatable    :: cellsize     ! Cellsize x = cellsize y
-     real(dp), dimension(:), allocatable    :: nodata_value ! Code to define the mask
-  end type gridGeoRef
-
-  type(gridGeoRef), public                  :: level0       ! Reference of the input data files
-  type(gridGeoRef), public                  :: level1       ! Reference of the hydrological variables
-  type(gridGeoRef), public                  :: level2       ! Reference of the metereological variables
-
-  real(dp), dimension(:), allocatable, public :: L0_longitude  ! 1d longitude array
-  real(dp), dimension(:), allocatable, public :: L0_latitude   ! 1d latitude  array
-  real(dp), dimension(:), allocatable, public :: L1_longitude  ! 1d longitude array for active grid cells
-  real(dp), dimension(:), allocatable, public :: L1_latitude   ! 1d latitude  array for active grid cells
-  real(dp), dimension(:), allocatable, public :: L1_rect_longitude  ! 1d longitude array for whole basin rectangle
-  real(dp), dimension(:), allocatable, public :: L1_rect_latitude   ! 1d latitude  array for whole basin rectangle
-
-  ! -------------------------------------------------------------------
-  ! PERIOD description
-  ! -------------------------------------------------------------------
-  type(period), dimension(:), allocatable, public :: warmPer     ! time period for warming
-  type(period), dimension(:), allocatable, public :: evalPer     ! time period for model evaluation
-  type(period), dimension(:), allocatable, public :: simPer      ! warmPer + evalPer
-  type(period),                            public :: readPer     ! start and end dates of read period
-  integer(i4),  dimension(:), allocatable, public :: warmingDays ! number of days for warm up period
-
-  ! -------------------------------------------------------------------
-  ! BASIN general description
-  ! -------------------------------------------------------------------
-  integer(i4), public                           :: nBasins            ! Number of basins for multi-basin optimization
-  type basinInfo
-     ! dim1 = basin id
-     ! for remapping
-     integer(i4), dimension(:), allocatable     :: L0_iStart          ! Starting cell index of a given basin at L0
-     integer(i4), dimension(:), allocatable     :: L0_iEnd            ! Ending cell index of a given basin at L0
-     integer(i4), dimension(:), allocatable     :: L0_iStartMask      ! Starting cell index of mask a given basin at L0
-     integer(i4), dimension(:), allocatable     :: L0_iEndMask        ! Ending cell index of mask a given basin at L0
-     logical,     dimension(:), pointer         :: L0_mask            ! Mask of level0 based on DEM
-
-     integer(i4), dimension(:), allocatable     :: L1_iStart          ! Starting cell index of a given basin at L1
-     integer(i4), dimension(:), allocatable     :: L1_iEnd            ! Ending cell index of a given basin at L1
-     integer(i4), dimension(:), allocatable     :: L1_iStartMask      ! Starting cell index of mask a given basin at L1
-     integer(i4), dimension(:), allocatable     :: L1_iEndMask        ! Ending cell index of mask a given basin at L1
-     logical,     dimension(:), allocatable     :: L1_mask            ! Mask of level1
-
-     Integer(i4), dimension(:), allocatable     :: L2_iStart          ! Starting cell index of a given basin at L2
-     integer(i4), dimension(:), allocatable     :: L2_iEnd            ! Ending cell index of a given basin at L2
-     integer(i4), dimension(:), allocatable     :: L2_iStartMask      ! Starting cell index of mask a given basin at L2
-     integer(i4), dimension(:), allocatable     :: L2_iEndMask        ! Ending cell index of mask a given basin at L2
-     logical,     dimension(:), allocatable     :: L2_mask            ! Mask of level2
-
-  end type basinInfo
-  type(basinInfo), public                       :: basin              ! Basin structure
-  logical, dimension(:), allocatable, target    :: L0_mask            ! target variable for mRM
-
-  ! -------------------------------------------------------------------
-  ! L0 DOMAIN description -> 
-  ! -------------------------------------------------------------------
-  ! dim1 = number grid cells
-  ! input data - morphological variables
-  real(dp), public, dimension(:), allocatable, target :: L0_elev    ! [m]      Elevation (sinks removed)
-  !                                                                 !           target variable for coupling to mRM
-  real(dp), public, dimension(:), allocatable         :: L0_slope    ! [%]      Slope
-  real(dp), public, dimension(:), allocatable         :: L0_asp     ! [degree]  Aspect degree
-  integer(i4), public, dimension(:,:), allocatable    :: L0_soilId  !           soil id (iFlag_soilDB = 0)  
-  !  [dim1=number grid cells, dim2=Number of soil horizons] note: for iFlag_soilDB=0, dim2=1
-  integer(i4), public, dimension(:), allocatable   :: L0_geoUnit    !      Geologic formation (unit)
-
-  ! input data - land cover
-  integer(i4), public, dimension(:), allocatable           :: L0_LCover_LAI  ! Special landcover class for the LAI index
-  integer(i4), public, dimension(:,:), allocatable, target :: L0_LCover      ! Classic mHM landcover class (upto 3 classes)
-  !                                                                          ! dim1=number grid cells, dim2=Number of land cover scenes
-  !                                                                          ! target variable for coupling to mRM
-
-  ! mHM derived variables
-  ! dim1 = number grid cells L0
-  integer(i4), public                                :: L0_nCells            ! Number of valid cells
-  integer(i4), public, dimension(:,:), allocatable   :: L0_cellCoor          ! Cell coordinates (row,col) for each grid cell, dim2=2
-  integer(i4), public, dimension(:),   allocatable   :: L0_Id                ! Level-0 id
-  real(dp),    public, dimension(:),   allocatable   :: L0_slope_emp         ! Empirical quantiles of slope
-  !
-  real(dp),    public, dimension(:,:), allocatable   :: L0_gridded_LAI       ! gridded AI data used when timeStep_LAI_input<0 or==1
-  !                                                                          ! dim1=number of gridcells, dim2=number LAI timesteps
-
-  real(dp),    public, dimension(:),   allocatable   :: L0_areaCell          ! [m2] Area of a cell at level-0
+  type(Grid), dimension(:), allocatable, public :: level2       ! Reference of the metereological variables
 
   ! -------------------------------------------------------------------
   ! L1 DOMAIN description
   ! -------------------------------------------------------------------
-  ! dim1 = number grid cells L1
-  ! dim2 = 2
-  integer(i4), public                              :: L1_nCells        !       No. of cells at this level
-  integer(i4), public, dimension(:,:), allocatable :: L1_cellCoor      !       Cell coordinates (row,col)
-  !                                                                    !       ->  L1 modelling
-  integer(i4), public, dimension(:), allocatable   :: L1_Id            !       Level-1 id
-  real(dp),    public, dimension(:), allocatable   :: L1_areaCell      ! [km2] Effective area of cell at this level
-
-  integer(i4), public, dimension(:), allocatable   :: L1_upBound_L0    ! Row start at finer level-0 scale
-  integer(i4), public, dimension(:), allocatable   :: L1_downBound_L0  ! Row end at finer level-0 scale
-  integer(i4), public, dimension(:), allocatable   :: L1_leftBound_L0  ! Col start at finer level-0 scale
-  integer(i4), public, dimension(:), allocatable   :: L1_rightBound_L0 ! Col end at finer level-0 scale
-  integer(i4), public, dimension(:), allocatable   :: L1_nTCells_L0    ! Total number of valid L0 cells
-  !                                                                    ! in a given L1 cell
   ! Forcings
   ! dim1 = number grid cells L1
   ! dim2 = number of meteorological time steps
-  real(dp), public, dimension(:,:,:), allocatable  :: L1_temp_weights  ! hourly temperature weights for daily values
-  real(dp), public, dimension(:,:,:), allocatable  :: L1_pet_weights   ! hourly pet weights for daily values
-  real(dp), public, dimension(:,:,:), allocatable  :: L1_pre_weights   ! hourly pre weights for daily values
-  real(dp), public, dimension(:,:), allocatable    :: L1_pre           ! [mm]    Precipitation
-  real(dp), public, dimension(:,:), allocatable    :: L1_temp          ! [degC]  Air temperature
-  real(dp), public, dimension(:,:), allocatable    :: L1_pet           ! [mm TST-1] Potential evapotranspiration
-  real(dp), public, dimension(:,:), allocatable    :: L1_tmin          ! [degC]  minimum daily air temperature
-  real(dp), public, dimension(:,:), allocatable    :: L1_tmax          ! [degC]  maximum daily air temperature
-  real(dp), public, dimension(:,:), allocatable    :: L1_netrad        ! [W m2]  net radiation
-  real(dp), public, dimension(:,:), allocatable    :: L1_absvappress   ! [Pa]    absolute vapour pressure
-  real(dp), public, dimension(:,:), allocatable    :: L1_windspeed     ! [m s-1] windspeed
+  real(dp), public, dimension(:, :, :), allocatable :: L1_temp_weights  ! hourly temperature weights for daily values
+  real(dp), public, dimension(:, :, :), allocatable :: L1_pet_weights   ! hourly pet weights for daily values
+  real(dp), public, dimension(:, :, :), allocatable :: L1_pre_weights   ! hourly pre weights for daily values
+  real(dp), public, dimension(:, :), allocatable :: L1_pre           ! [mm]    Precipitation
+  real(dp), public, dimension(:, :), allocatable :: L1_temp          ! [degC]  Air temperature
+  real(dp), public, dimension(:, :), allocatable :: L1_pet           ! [mm TST-1] Potential evapotranspiration
+  real(dp), public, dimension(:, :), allocatable :: L1_tmin          ! [degC]  minimum daily air temperature
+  real(dp), public, dimension(:, :), allocatable :: L1_tmax          ! [degC]  maximum daily air temperature
+  real(dp), public, dimension(:, :), allocatable :: L1_netrad        ! [W m2]  net radiation
+  real(dp), public, dimension(:, :), allocatable :: L1_absvappress   ! [Pa]    absolute vapour pressure
+  real(dp), public, dimension(:, :), allocatable :: L1_windspeed     ! [m s-1] windspeed
 
   ! optional data
   ! dim1 = number grid cells L1
   ! dim2 = number of meteorological time steps
   ! soil moisture
-  real(dp), public, dimension(:,:), allocatable    :: L1_sm                  ! [-] soil moisture input for optimization
-  logical,  public, dimension(:,:), allocatable    :: L1_sm_mask             ! [-] mask for valid data in L1_sm
-  integer(i4)                                      :: nTimeSteps_L1_sm       ! [-] number of time steps in L1_sm_mask
-  integer(i4)                                      :: nSoilHorizons_sm_input ! No. of mhm soil horizons equivalent to sm input
+  real(dp), public, dimension(:, :), allocatable :: L1_sm                  ! [-] soil moisture input for optimization
+  logical, public, dimension(:, :), allocatable :: L1_sm_mask             ! [-] mask for valid data in L1_sm
+  integer(i4) :: nTimeSteps_L1_sm       ! [-] number of time steps in L1_sm_mask
+  integer(i4) :: nSoilHorizons_sm_input ! No. of mhm soil horizons equivalent to sm input
   ! neutrons
-  real(dp), public, dimension(:,:), allocatable    :: L1_neutronsdata            ! [cph] ground albedo neutrons input
-  logical,  public, dimension(:,:), allocatable    :: L1_neutronsdata_mask       ! [cph] mask for valid data in L1_neutrons
-  integer(i4)                                      :: nTimeSteps_L1_neutrons     ! [-] number of time steps in L1_neutrons_mask
+  real(dp), public, dimension(:, :), allocatable :: L1_neutronsdata            ! [cph] ground albedo neutrons input
+  logical, public, dimension(:, :), allocatable :: L1_neutronsdata_mask       ! [cph] mask for valid data in L1_neutrons
+  integer(i4) :: nTimeSteps_L1_neutrons     ! [-] number of time steps in L1_neutrons_mask
   ! evapotranspiration
-  real(dp), public, dimension(:,:), allocatable    :: L1_et                 ! [mm] Evapotranspiration input for optimization
-  logical,  public, dimension(:,:), allocatable    :: L1_et_mask            ! [mm] mask for valid data in L1_neutrons
-  integer(i4)                                      :: nTimeSteps_L1_et      ! [-] number of time steps in L1_sm_mask
-
-  ! Land cover
-  ! dim1 = number grid cells L1
-  real(dp), public, dimension(:), allocatable      :: L1_fSealed       ! [1]  Fraction of sealed area
-  real(dp), public, dimension(:), allocatable      :: L1_fForest       ! [1]  Fraction of forest cover
-  real(dp), public, dimension(:), allocatable      :: L1_fPerm         ! [1]  Fraction of permeable cover
+  real(dp), public, dimension(:, :), allocatable :: L1_et                 ! [mm] Evapotranspiration input for optimization
+  logical, public, dimension(:, :), allocatable :: L1_et_mask            ! [mm] mask for valid data in L1_neutrons
+  integer(i4) :: nTimeSteps_L1_et      ! [-] number of time steps in L1_sm_mask
 
   ! State variables
   ! dim1 = number grid cells L1
   ! dim2 = number model soil horizons
-  real(dp), public, dimension(:), allocatable   :: L1_inter        ! [mm]  Interception
-  real(dp), public, dimension(:), allocatable   :: L1_snowPack     ! [mm]  Snowpack
-  real(dp), public, dimension(:), allocatable   :: L1_sealSTW      ! [mm]  Retention storage of impervious areas
-  real(dp), public, dimension(:,:), allocatable :: L1_soilMoist    ! [mm]  Soil moisture of each horizon
-  real(dp), public, dimension(:), allocatable   :: L1_unsatSTW     ! [mm]  upper soil storage
-  real(dp), public, dimension(:), allocatable   :: L1_satSTW       ! [mm]  groundwater storage
-  real(dp), public, dimension(:), allocatable   :: L1_neutrons     ! [mm]  Ground Albedo Neutrons
+  real(dp), public, dimension(:), allocatable :: L1_inter        ! [mm]  Interception
+  real(dp), public, dimension(:), allocatable :: L1_snowPack     ! [mm]  Snowpack
+  real(dp), public, dimension(:), allocatable :: L1_sealSTW      ! [mm]  Retention storage of impervious areas
+  real(dp), public, dimension(:, :), allocatable :: L1_soilMoist    ! [mm]  Soil moisture of each horizon
+  real(dp), public, dimension(:), allocatable :: L1_unsatSTW     ! [mm]  upper soil storage
+  real(dp), public, dimension(:), allocatable :: L1_satSTW       ! [mm]  groundwater storage
+  real(dp), public, dimension(:), allocatable :: L1_neutrons     ! [mm]  Ground Albedo Neutrons
 
   ! Fluxes
   ! dim1 = number grid cells L1
   ! dim2 = number model soil horizons
-  real(dp), public, dimension(:),   allocatable :: L1_pet_calc     ! [mm TS-1] estimated/corrected potential evapotranspiration
-  real(dp), public, dimension(:,:), allocatable :: L1_aETSoil      ! [mm TS-1] Actual ET from soil layers
-  real(dp), public, dimension(:),   allocatable :: L1_aETCanopy    ! [mm TS-1] Real evaporation intensity from canopy
-  real(dp), public, dimension(:),   allocatable :: L1_aETSealed    ! [mm TS-1] Real evap. from free water surfaces
-  real(dp), public, dimension(:),   allocatable :: L1_baseflow     ! [mm TS-1] Baseflow
-  real(dp), public, dimension(:,:), allocatable :: L1_infilSoil    ! [mm TS-1] Infiltration intensity each soil horizon
-  real(dp), public, dimension(:),   allocatable :: L1_fastRunoff   ! [mm TS-1] Fast runoff component
-  real(dp), public, dimension(:),   allocatable :: L1_melt         ! [mm TS-1] Melting snow depth.
-  real(dp), public, dimension(:),   allocatable :: L1_percol       ! [mm TS-1] Percolation.
-  real(dp), public, dimension(:),   allocatable :: L1_preEffect    ! [mm TS-1] Effective precip. depth (snow melt + rain)
-  real(dp), public, dimension(:),   allocatable :: L1_rain         ! [mm TS-1] Rain precipitation depth
-  real(dp), public, dimension(:),   allocatable :: L1_runoffSeal   ! [mm TS-1] Direct runoff from impervious areas
-  real(dp), public, dimension(:),   allocatable :: L1_slowRunoff   ! [mm TS-1] Slow runoff component
-  real(dp), public, dimension(:),   allocatable :: L1_snow         ! [mm TS-1] Snow precipitation depth
-  real(dp), public, dimension(:),   allocatable :: L1_Throughfall  ! [mm TS-1] Throughfall.
-  real(dp), public, dimension(:),   allocatable :: L1_total_runoff ! [m3 TS-1] Generated runoff
-
-  ! Effective parameters
-  ! dim1 = number grid cells L1
-  ! dim2 = number model soil horizons
-  real(dp), public, dimension(:), allocatable   :: L1_alpha                 ! [1]            Exponent for the upper reservoir
-  real(dp), public, dimension(:), allocatable   :: L1_degDayInc             ! [d-1 degC-1]   Increase of the Degree-day factor
-  !                                                                         !                per mm of increase in precipitation
-  real(dp), public, dimension(:), allocatable   :: L1_degDayMax             ! [mm-1 degC-1]  Maximum Degree-day factor
-  real(dp), public, dimension(:), allocatable   :: L1_degDayNoPre           ! [mm-1 degC-1]  Degree-day factor with no precipitation.
-  real(dp), public, dimension(:), allocatable   :: L1_degDay                ! [mm d-1degC-1] Degree-day factor.
-  real(dp), public, dimension(:), allocatable   :: L1_karstLoss             ! [1]    Karstic percolation loss
-  real(dp), public, dimension(:), allocatable   :: L1_fAsp                  ! [1]    PET correction for aspect
-  real(dp), public, dimension(:), allocatable   :: L1_petLAIcorFactor       ! [-]   PET correction based on LAI (KC by GEUS.dk)
+  real(dp), public, dimension(:), allocatable :: L1_pet_calc     ! [mm TS-1] estimated/corrected potential evapotranspiration
+  real(dp), public, dimension(:, :), allocatable :: L1_aETSoil      ! [mm TS-1] Actual ET from soil layers
+  real(dp), public, dimension(:), allocatable :: L1_aETCanopy    ! [mm TS-1] Real evaporation intensity from canopy
+  real(dp), public, dimension(:), allocatable :: L1_aETSealed    ! [mm TS-1] Real evap. from free water surfaces
+  real(dp), public, dimension(:), allocatable :: L1_baseflow     ! [mm TS-1] Baseflow
+  real(dp), public, dimension(:, :), allocatable :: L1_infilSoil    ! [mm TS-1] Infiltration intensity each soil horizon
+  real(dp), public, dimension(:), allocatable :: L1_fastRunoff   ! [mm TS-1] Fast runoff component
+  real(dp), public, dimension(:), allocatable :: L1_melt         ! [mm TS-1] Melting snow depth.
+  real(dp), public, dimension(:), allocatable :: L1_percol       ! [mm TS-1] Percolation.
+  real(dp), public, dimension(:), allocatable :: L1_preEffect    ! [mm TS-1] Effective precip. depth (snow melt + rain)
+  real(dp), public, dimension(:), allocatable :: L1_rain         ! [mm TS-1] Rain precipitation depth
+  real(dp), public, dimension(:), allocatable :: L1_runoffSeal   ! [mm TS-1] Direct runoff from impervious areas
+  real(dp), public, dimension(:), allocatable :: L1_slowRunoff   ! [mm TS-1] Slow runoff component
+  real(dp), public, dimension(:), allocatable :: L1_snow         ! [mm TS-1] Snow precipitation depth
+  real(dp), public, dimension(:), allocatable :: L1_Throughfall  ! [mm TS-1] Throughfall.
+  real(dp), public, dimension(:), allocatable :: L1_total_runoff ! [m3 TS-1] Generated runoff
 
-  real(dp), public, dimension(:), allocatable   :: L1_HarSamCoeff           ! [1]    Hargreaves Samani coeffiecient
-  real(dp), public, dimension(:,:), allocatable :: L1_PrieTayAlpha          ! [1]    Priestley Taylor coeffiecient
-  real(dp), public, dimension(:,:), allocatable :: L1_aeroResist            ! [s m-1] aerodynamical resitance
-  real(dp), public, dimension(:,:), allocatable :: L1_surfResist            ! [s m-1] bulk surface resitance
-  !                                                                         ! dim1 = No cells for basin, dim2 = No of Months in year
-  real(dp), public, dimension(:,:), allocatable :: L1_fRoots                ! [1]    Fraction of roots in soil horizons
-  real(dp), public, dimension(:), allocatable   :: L1_maxInter              ! [mm]   Maximum interception
-  
-
-  
-  real(dp), public, dimension(:), allocatable   :: L1_kfastFlow             ! [d-1]  Fast interflow recession coefficient
-  real(dp), public, dimension(:), allocatable   :: L1_kSlowFlow             ! [d-1]  Slow interflow recession coefficient
-  real(dp), public, dimension(:), allocatable   :: L1_kBaseFlow             ! [d-1]  Baseflow recession coefficient
-  real(dp), public, dimension(:), allocatable   :: L1_kPerco                ! [d-1]  percolation coefficient
-  real(dp), public, dimension(:,:), allocatable :: L1_soilMoistFC           ! [mm]   Soil moisture below which actual ET
-  !                                                                         !        is reduced linearly till PWP
-  real(dp), public, dimension(:,:), allocatable :: L1_soilMoistSat          ! [mm]   Saturation soil moisture for each horizon [mm]
-  real(dp), public, dimension(:,:), allocatable :: L1_soilMoistExp          ! [1]    Exponential parameter to how non-linear
-  !                                                                         !        is the soil water retention
-  real(dp), public, dimension(:),   allocatable :: L1_jarvis_thresh_c1      ![1] jarvis critical value for normalized soil 
-  !                                                                         !        water content 
-  real(dp), public, dimension(:), allocatable   :: L1_tempThresh            ! [degC]   Threshold temperature for snow/rain
-  real(dp), public, dimension(:), allocatable   :: L1_unsatThresh           ! [mm]  Threshold waterdepth controlling fast interflow
-  real(dp), public, dimension(:), allocatable   :: L1_sealedThresh          ! [mm]  Threshold waterdepth for surface runoff
-  !                                                                         !       in sealed surfaces
-  real(dp), public, dimension(:,:), allocatable :: L1_wiltingPoint          ! [mm]  Permanent wilting point: below which neither
-  !                                                                         !       plant can take water nor water can drain in
-            
   ! -------------------------------------------------------------------
   ! Monthly day/night variation of Meteorological variables
   ! for temporal disaggregation
   ! -------------------------------------------------------------------
   ! dim1 = number of months in a year
-  real(dp), public, dimension(int(YearMonths,i4)) :: evap_coeff     ! [-] Evap. coef. for free-water surfaces
-  real(dp), public, dimension(int(YearMonths,i4)) :: fday_prec      ! [-] Day ratio precipitation < 1
-  real(dp), public, dimension(int(YearMonths,i4)) :: fnight_prec    ! [-] Night ratio precipitation < 1
-  real(dp), public, dimension(int(YearMonths,i4)) :: fday_pet       ! [-] Day ratio PET  < 1
-  real(dp), public, dimension(int(YearMonths,i4)) :: fnight_pet     ! [-] Night ratio PET  < 1
-  real(dp), public, dimension(int(YearMonths,i4)) :: fday_temp      ! [-] Day factor mean temp
-  real(dp), public, dimension(int(YearMonths,i4)) :: fnight_temp    ! [-] Night factor mean temp
-
-  ! -------------------------------------------------------------------
-  ! DEFINE OUTPUTS
-  ! -------------------------------------------------------------------
-  !
-  integer(i4)                      :: timeStep_model_outputs ! timestep for writing model outputs
-  logical, dimension(nOutFlxState) :: outputFlxState         ! Define model outputs see "mhm_outputs.nml"
-  !                                                            dim1 = number of output variables to be written
-  !
+  real(dp), public, dimension(int(YearMonths, i4)) :: evap_coeff     ! [-] Evap. coef. for free-water surfaces
+  real(dp), public, dimension(int(YearMonths, i4)) :: fday_prec      ! [-] Day ratio precipitation < 1
+  real(dp), public, dimension(int(YearMonths, i4)) :: fnight_prec    ! [-] Night ratio precipitation < 1
+  real(dp), public, dimension(int(YearMonths, i4)) :: fday_pet       ! [-] Day ratio PET  < 1
+  real(dp), public, dimension(int(YearMonths, i4)) :: fnight_pet     ! [-] Night ratio PET  < 1
+  real(dp), public, dimension(int(YearMonths, i4)) :: fday_temp      ! [-] Day factor mean temp
+  real(dp), public, dimension(int(YearMonths, i4)) :: fnight_temp    ! [-] Night factor mean temp
 
   ! -------------------------------------------------------------------
   ! AUXILIARY VARIABLES
@@ -461,6 +185,6 @@ MODULE mo_global_variables
   !
 
   real(dp), public, dimension(:), allocatable :: neutron_integral_AFast ! pre-calculated integrand for
-                                                                        ! vertical projection of isotropic neutron flux
+  ! vertical projection of isotropic neutron flux
 
 END MODULE mo_global_variables
diff --git a/src/mHM/mo_init_states.f90 b/src/mHM/mo_init_states.f90
index b0415924..d28b13e0 100644
--- a/src/mHM/mo_init_states.f90
+++ b/src/mHM/mo_init_states.f90
@@ -16,7 +16,7 @@ MODULE mo_init_states
 
   ! Written Luis Samaniego & Rohini Kumar, Dec 2012
 
-  USE mo_kind, ONLY: i4, dp
+  USE mo_kind, ONLY : i4, dp
 
   IMPLICIT NONE
 
@@ -25,9 +25,6 @@ MODULE mo_init_states
   PUBLIC :: variables_alloc                 ! allocation of space for state variables/fluxes/effective parameters
   PUBLIC :: variables_default_init          ! initialization for state variables/fluxes/effective parameters
 
-  PUBLIC :: get_basin_info                  ! get basin info
-  PUBLIC :: calculate_grid_properties       ! generate Lx (x = 1, 11, 2) grid properties using L0 grid
-
 CONTAINS
 
   ! ------------------------------------------------------------------
@@ -77,269 +74,120 @@ MODULE mo_init_states
   !>        \date Jan 2013
   !         Modified, R. Kumar, Sep 2013   - documentation added according to the template
   !                   S. Thober, Aug 2015  - removed routing related variables
-  !                   Zink M. Demirel C.,Mar 2017 - Init Jarvis soil water stress variable at SM process(3)  
-
-
-  subroutine variables_alloc(iBasin)
-
-    use mo_global_variables, only: nSoilHorizons_mHM,            &
-         L1_fSealed, L1_fForest, L1_fPerm, L1_inter, L1_snowPack, L1_sealSTW,                    &
-         L1_soilMoist, L1_unsatSTW, L1_satSTW,                                                   &
-         L1_pet_calc, L1_aETSoil, L1_aETCanopy, L1_aETSealed,                                    &
-         L1_baseflow, L1_infilSoil, L1_fastRunoff, L1_melt,                                      &
-         L1_percol, L1_preEffect, L1_rain, L1_runoffSeal, L1_slowRunoff,                         &
-         L1_snow, L1_Throughfall, L1_total_runoff, L1_alpha, L1_degDayInc,                       &
-         L1_degDayMax, L1_degDayNoPre, L1_degDay, L1_karstLoss, L1_fAsp,L1_petLAIcorFactor,      &
-         L1_HarSamCoeff, L1_PrieTayAlpha, L1_aeroResist, L1_surfResist,                          &
-         L1_fRoots, L1_maxInter, L1_kfastFlow, L1_kSlowFlow, L1_kBaseFlow,                       &
-         L1_kPerco, L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp,                            &
-         L1_jarvis_thresh_c1, L1_tempThresh, L1_unsatThresh, L1_sealedThresh, L1_wiltingPoint,   &
-         L1_neutrons
-
-    use mo_mhm_constants,    only: YearMonths_i4
-    use mo_append,           only: append                      ! append vector
+  !                   Zink M. Demirel C.,Mar 2017 - Init Jarvis soil water stress variable at SM process(3)
+  !                   Robert Schweppe,      Dec 2017 - restructured allocation in variables_alloc,
+  !                                                    expanded dimensions of effective parameters
+
+
+  subroutine variables_alloc(ncells1)
+
+    use mo_mpr_global_variables, only : &
+            nSoilHorizons_mHM, HorizonDepth_mHM
+    use mo_global_variables, only : &
+            L1_inter, L1_snowPack, L1_sealSTW, &
+            L1_soilMoist, L1_unsatSTW, L1_satSTW, &
+            L1_pet_calc, L1_aETSoil, L1_aETCanopy, L1_aETSealed, &
+            L1_baseflow, L1_infilSoil, L1_fastRunoff, L1_melt, &
+            L1_percol, L1_preEffect, L1_rain, L1_runoffSeal, L1_slowRunoff, &
+            L1_snow, L1_Throughfall, L1_total_runoff, &
+            L1_neutrons
+    use mo_append, only : append                      ! append vector
+
+    use mo_common_constants, only : P1_InitStateFluxes
+    use mo_mpr_constants, only : &
+            P2_InitStateFluxes, &
+            P3_InitStateFluxes, P4_InitStateFluxes, &
+            P5_InitStateFluxes, C1_InitStateSM
 
     implicit none
 
-    integer(i4), intent(in)                   :: iBasin
+    integer(i4), intent(in) :: ncells1
 
     ! local variables
-    integer(i4)                               :: nrows1, ncols1
-    integer(i4)                               :: ncells1
-    real(dp), dimension(:),   allocatable     :: dummy_Vector
-    real(dp), dimension(:,:), allocatable     :: dummy_Matrix
-    real(dp), dimension(:,:), allocatable     :: dummy_Matrix_months
-
-    ! level-1 information
-    call get_basin_info( iBasin, 1, nrows1, ncols1, ncells=ncells1 )
+    integer(i4) :: i
+    real(dp), dimension(:), allocatable :: dummy_1D
+    real(dp), dimension(:, :), allocatable :: dummy_2D
 
     ! for appending and intialization
-    allocate( dummy_Vector        (nCells1)                        )
-    allocate( dummy_Matrix        (nCells1, nSoilHorizons_mHM)     )
-    allocate( dummy_Matrix_months (nCells1,     YearMonths_i4)     )
+    allocate(dummy_1D(nCells1))
+    allocate(dummy_2D(nCells1, nSoilHorizons_mHM))
 
-    !-------------------------------------------
-    ! LAND COVER variables
-    !-------------------------------------------
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_fSealed,  dummy_Vector )
-    call append( L1_fForest,  dummy_Vector )
-    call append( L1_fPerm,    dummy_Vector )
-
-    !-------------------------------------------
-    ! STATE VARIABLES
-    !-------------------------------------------
-    ! Interception
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_inter,  dummy_Vector )
-
-    !Snowpack
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_snowPack,  dummy_Vector )
-
-    !Retention storage of impervious areas
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_sealSTW,  dummy_Vector )
-
-    ! Soil moisture of each horizon
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_soilMoist, dummy_Matrix )
-
-    ! upper soil storage
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_unsatSTW,  dummy_Vector )
-
-    ! groundwater storage
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_satSTW,  dummy_Vector )
-
-    ! ground albedo neutrons
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_neutrons,  dummy_Vector )
+    dummy_1D = P1_InitStateFluxes
+    dummy_2D = P1_InitStateFluxes
 
     !-------------------------------------------
     ! FLUXES
     !-------------------------------------------
-
     ! calculated / corrected potential evapotranspiration
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_pet_calc,  dummy_Vector )
-
+    call append(L1_pet_calc, dummy_1D)
     !  soil actual ET
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_aETSoil,  dummy_Matrix )
-
+    call append(L1_aETSoil, dummy_2D)
     ! canopy actual ET
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_aETCanopy,  dummy_Vector )
-
+    call append(L1_aETCanopy, dummy_1D)
     ! sealed area actual ET
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_aETSealed,  dummy_Vector )
-
+    call append(L1_aETSealed, dummy_1D)
     ! baseflow
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_baseflow,  dummy_Vector )
-
+    call append(L1_baseflow, dummy_1D)
     !  soil in-exfiltration
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_infilSoil,  dummy_Matrix )
-
+    call append(L1_infilSoil, dummy_2D)
     ! fast runoff
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_fastRunoff,  dummy_Vector )
-
+    call append(L1_fastRunoff, dummy_1D)
     ! snow melt
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_melt,  dummy_Vector )
-
+    call append(L1_melt, dummy_1D)
     ! percolation
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_percol,  dummy_Vector )
-
+    call append(L1_percol, dummy_1D)
     ! effective precip. depth (snow melt + rain)
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_preEffect,  dummy_Vector )
-
+    call append(L1_preEffect, dummy_1D)
     ! rain (liquid water)
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_rain,  dummy_Vector )
-
+    call append(L1_rain, dummy_1D)
     ! runoff from impervious area
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_runoffSeal,  dummy_Vector )
-
+    call append(L1_runoffSeal, dummy_1D)
     ! slow runoff
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_slowRunoff,  dummy_Vector )
-
+    call append(L1_slowRunoff, dummy_1D)
     ! snow (solid water)
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_snow,  dummy_Vector )
-
+    call append(L1_snow, dummy_1D)
     ! throughfall
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_Throughfall,  dummy_Vector )
-
+    call append(L1_Throughfall, dummy_1D)
     ! throughfall
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_total_runoff,  dummy_Vector )
+    call append(L1_total_runoff, dummy_1D)
 
     !-------------------------------------------
-    ! EFFECTIVE PARAMETERS
+    ! STATE VARIABLES
     !-------------------------------------------
-
-    ! exponent for the upper reservoir
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_alpha,  dummy_Vector )
-
-    ! increase of the Degree-day factor per mm of increase in precipitation
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_degDayInc,  dummy_Vector )
-
-    ! maximum degree-day factor
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_degDayMax,  dummy_Vector )
-
-    ! degree-day factor with no precipitation
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_degDayNoPre,  dummy_Vector )
-
-    ! degree-day factor
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_degDay,  dummy_Vector )
-
-    ! Karstic percolation loss
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_karstLoss,  dummy_Vector )
-   
-    ! PET correction factor due to terrain aspect
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_fAsp,  dummy_Vector )
-
-    ! PET correction factor due to LAI
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_petLAIcorFactor,  dummy_Vector )
-    
-    ! PET Hargreaves Samani coefficient
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_HarSamCoeff,   dummy_Vector )
-
-    ! PET Prietley Taylor coefficient
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_PrieTayAlpha,  dummy_Matrix_months )
-
-    ! PET aerodynamical resistance
-    dummy_Matrix_months = 0.0_dp
-    call append( L1_aeroResist,   dummy_Matrix_months )
-
-    ! PET bulk surface resistance
-    dummy_Matrix_months = 0.0_dp
-    call append( L1_surfResist,   dummy_Matrix_months )
-
-    ! Fraction of roots in soil horizons
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_fRoots,  dummy_Matrix )
-
-    ! Maximum interception
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_maxInter,  dummy_Vector(:) )
-
-    ! fast interflow recession coefficient
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_kfastFlow,  dummy_Vector )
-
-    ! slow interflow recession coefficient
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_kSlowFlow,  dummy_Vector )
-
-    ! baseflow recession coefficient
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_kBaseFlow,  dummy_Vector )
-
-    ! percolation coefficient
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_kPerco,  dummy_Vector )
-
-    ! Soil moisture below which actual ET is reduced linearly till PWP
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_soilMoistFC,  dummy_Matrix )
-
-    ! Saturation soil moisture for each horizon [mm]
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_soilMoistSat,  dummy_Matrix )
-
-    ! jarvis critical value for normalized soil water content 
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_jarvis_thresh_c1,  dummy_Vector )
-
-    ! Exponential parameter to how non-linear is the soil water retention
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_soilMoistExp,  dummy_Matrix )
-
-    ! Threshold temperature for snow/rain
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_tempThresh,  dummy_Vector )
-
-    ! Threshhold water depth controlling fast interflow
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_unsatThresh,  dummy_Vector )
-
-    ! Threshhold water depth for surface runoff in sealed surfaces
-    dummy_Vector(:) = 0.0_dp
-    call append( L1_sealedThresh,  dummy_Vector )
-
-    ! Permanent wilting point
-    dummy_Matrix(:,:) = 0.0_dp
-    call append( L1_wiltingPoint,  dummy_Matrix )
+    ! Interception
+    call append(L1_inter, dummy_1D)
+    !Retention storage of impervious areas
+    call append(L1_sealSTW, dummy_1D)
+    ! ground albedo neutrons
+    call append(L1_neutrons, dummy_1D)
+    !Snowpack
+    dummy_1D = P2_InitStateFluxes
+    call append(L1_snowPack, dummy_1D)
+    ! upper soil storage
+    dummy_1D = P3_InitStateFluxes
+    call append(L1_unsatSTW, dummy_1D)
+    ! groundwater storage
+    dummy_1D = P4_InitStateFluxes
+    call append(L1_satSTW, dummy_1D)
+    ! Soil moisture of each horizon
+    do i = 1, nSoilHorizons_mHM - 1
+      if (i == 1) then
+        dummy_2D(:, i) = HorizonDepth_mHM(i) * C1_InitStateSM
+      else
+        dummy_2D(:, i) = (HorizonDepth_mHM(i) - HorizonDepth_mHM(i - 1)) * C1_InitStateSM
+      end if
+    end do
+    dummy_2D(:, nSoilHorizons_mHM) = (P5_InitStateFluxes - &
+            HorizonDepth_mHM(nSoilHorizons_mHM - 1)) * C1_InitStateSM
+    call append(L1_soilMoist, dummy_2D)
 
     ! free space
-    if ( allocated( dummy_Vector          ) ) deallocate( dummy_Vector          )
-    if ( allocated( dummy_Matrix          ) ) deallocate( dummy_Matrix          )
-    if ( allocated( dummy_Matrix_months   ) ) deallocate( dummy_Matrix_months   )
+    if (allocated(dummy_1D)) deallocate(dummy_1D)
+    if (allocated(dummy_2D)) deallocate(dummy_2D)
 
   end subroutine variables_alloc
 
+
   ! ------------------------------------------------------------------
 
   !      NAME
@@ -392,37 +240,32 @@ end subroutine variables_alloc
 
   subroutine variables_default_init()
 
-    use mo_global_variables, only:                                                                           &
-         nSoilHorizons_mHM, HorizonDepth_mHM,                                                                &
-         L1_fSealed, L1_fForest, L1_fPerm, L1_inter, L1_snowPack, L1_sealSTW,                                &
-         L1_soilMoist, L1_unsatSTW, L1_satSTW,                                                               &
-         L1_pet_calc, L1_aETSoil, L1_aETCanopy, L1_aETSealed,                                                &
-         L1_baseflow, L1_infilSoil, L1_fastRunoff, L1_melt,                                                  &
-         L1_percol, L1_preEffect, L1_rain, L1_runoffSeal, L1_slowRunoff,                                     &
-         L1_snow, L1_Throughfall, L1_total_runoff, L1_alpha, L1_degDayInc,                                   &
-         L1_degDayMax, L1_degDayNoPre, L1_degDay, L1_karstLoss, L1_fAsp, L1_petLAIcorFactor,                 &
-         L1_HarSamCoeff, L1_PrieTayAlpha, L1_aeroResist, L1_surfResist,                                      &
-         L1_fRoots, L1_maxInter, L1_kfastFlow, L1_kSlowFlow, L1_kBaseFlow,                                   &
-         L1_kPerco, L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp,                                        &
-         L1_jarvis_thresh_c1,L1_tempThresh, L1_unsatThresh, L1_sealedThresh, L1_wiltingPoint,                &
-         L1_neutrons
-
-    use mo_mhm_constants,    only:               &
-         P1_InitStateFluxes, P2_InitStateFluxes, &
-         P3_InitStateFluxes, P4_InitStateFluxes, &
-         P5_InitStateFluxes, C1_InitStateSM
+    use mo_mpr_global_variables, only : &
+            nSoilHorizons_mHM, HorizonDepth_mHM, &
+            L1_fSealed, L1_alpha, L1_degDayInc, &
+            L1_degDayMax, L1_degDayNoPre, L1_degDay, L1_karstLoss, L1_fAsp, L1_petLAIcorFactor, &
+            L1_HarSamCoeff, L1_PrieTayAlpha, L1_aeroResist, L1_surfResist, &
+            L1_fRoots, L1_maxInter, L1_kfastFlow, L1_kSlowFlow, L1_kBaseFlow, &
+            L1_kPerco, L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp, &
+            L1_jarvis_thresh_c1, L1_tempThresh, L1_unsatThresh, L1_sealedThresh, L1_wiltingPoint
+    use mo_global_variables, only : &
+            L1_inter, L1_snowPack, L1_sealSTW, &
+            L1_soilMoist, L1_unsatSTW, L1_satSTW, &
+            L1_pet_calc, L1_aETSoil, L1_aETCanopy, L1_aETSealed, &
+            L1_baseflow, L1_infilSoil, L1_fastRunoff, L1_melt, &
+            L1_percol, L1_preEffect, L1_rain, L1_runoffSeal, L1_slowRunoff, &
+            L1_snow, L1_Throughfall, L1_total_runoff, L1_neutrons
+
+    use mo_common_constants, only : P1_InitStateFluxes
+    use mo_mpr_constants, only : &
+            P2_InitStateFluxes, &
+            P3_InitStateFluxes, P4_InitStateFluxes, &
+            P5_InitStateFluxes, C1_InitStateSM
 
     implicit none
 
     ! inital values
-    integer(i4)                               :: i
-
-    !-------------------------------------------
-    ! LAND COVER variables
-    !-------------------------------------------
-    L1_fSealed = P1_InitStateFluxes
-    L1_fForest = P1_InitStateFluxes
-    L1_fPerm   = P1_InitStateFluxes
+    integer(i4) :: i
 
     !-------------------------------------------
     ! STATE VARIABLES
@@ -437,15 +280,15 @@ subroutine variables_default_init()
     L1_sealSTW = P1_InitStateFluxes
 
     ! Soil moisture of each horizon
-    do i = 1, nSoilHorizons_mHM-1
-       if (i .eq. 1) then
-          L1_soilMoist(:,i) = HorizonDepth_mHM(i)*C1_InitStateSM
-       else
-          L1_soilMoist(:,i)  = ( HorizonDepth_mHM(i) - HorizonDepth_mHM(i-1) )*C1_InitStateSM
-       end if
+    do i = 1, nSoilHorizons_mHM - 1
+      if (i .eq. 1) then
+        L1_soilMoist(:, i) = HorizonDepth_mHM(i) * C1_InitStateSM
+      else
+        L1_soilMoist(:, i) = (HorizonDepth_mHM(i) - HorizonDepth_mHM(i - 1)) * C1_InitStateSM
+      end if
     end do
-    L1_soilMoist(:,nSoilHorizons_mHM) = ( P5_InitStateFluxes - &
-         HorizonDepth_mHM(nSoilHorizons_mHM-1) )*C1_InitStateSM
+    L1_soilMoist(:, nSoilHorizons_mHM) = (P5_InitStateFluxes - &
+            HorizonDepth_mHM(nSoilHorizons_mHM - 1)) * C1_InitStateSM
 
     ! upper soil storage
     L1_unsatSTW = P3_InitStateFluxes
@@ -511,6 +354,8 @@ subroutine variables_default_init()
     !-------------------------------------------
     ! EFFECTIVE PARAMETERS
     !-------------------------------------------
+    ! sealed fraction of LCover
+    L1_fSealed = P1_InitStateFluxes
 
     ! exponent for the upper reservoir
     L1_alpha = P1_InitStateFluxes
@@ -532,7 +377,7 @@ subroutine variables_default_init()
 
     ! PET correction factor due to LAI
     L1_petLAIcorFactor = P1_InitStateFluxes
-    
+
     ! PET correction factor due to terrain aspect
     L1_fAsp = P1_InitStateFluxes
 
@@ -576,9 +421,9 @@ subroutine variables_default_init()
     ! Exponential parameter to how non-linear is the soil water retention
     L1_soilMoistExp = P1_InitStateFluxes
 
-    ! jarvis critical value for normalized soil water content 
+    ! jarvis critical value for normalized soil water content
     L1_jarvis_thresh_c1 = P1_InitStateFluxes
-    
+
     ! Threshold temperature for snow/rain
     L1_tempThresh = P1_InitStateFluxes
 
@@ -592,258 +437,5 @@ subroutine variables_default_init()
     L1_wiltingPoint = P1_InitStateFluxes
 
   end subroutine variables_default_init
-  ! ------------------------------------------------------------------
-
-  !      NAME
-  !          get_basin_info
-
-  !>        \brief Get basic basin information (e.g., nrows, ncols, indices, mask)
-
-  !>        \details Get basic basin information (e.g., nrows, ncols, indices, mask) for
-  !>                 different levels (L0, L1, and L2).
-  !
-  !     CALLING SEQUENCE
-  !         call get_basin_info(iBasin, iLevel,nrows,ncols, ncells, iStart, iEnd, &
-  !                             iStartMask, iEndMask, mask, xllcorner, yllcorner, cellsize)
-
-  !     INTENT(IN)
-  !>        \param[in] "integer(i4)             :: iBasin"    basin id
-  !>        \param[in] "integer(i4)             :: iLevel"    level id (e.g., 0, 1, 11, 2)
-
-  !     INTENT(INOUT)
-  !         None
-
-  !     INTENT(OUT)
-  !>        \param[out] "integer(i4)             :: nRows"      no. of rows
-  !>        \param[out] "integer(i4)             :: nCols"      no. of coloums
-  !>        \param[out] "integer(i4)             :: ncells"     no. of cells
-  !>        \param[out] "integer(i4)             :: iStart"     start cell index of a given basin at a given level
-  !>        \param[out] "integer(i4)             :: iEnd"       end cell index of a given basin at a given level
-  !>        \param[out] "integer(i4)             :: iStartMask" start cell index of mask a given basin at a given level
-  !>        \param[out] "integer(i4)             :: iEndMask"   end cell index of mask a given basin at a given level
-
-  !     INTENT(IN), OPTIONAL
-  !         None
-
-  !     INTENT(INOUT), OPTIONAL
-  !         None
-
-  !     INTENT(OUT), OPTIONAL
-  !>        \param[out] "logical, optional       :: mask"       Mask at a given level
-  !>        \param[out] "real(dp), optional      :: xllcorner"  x coordinate of the lowerleft corner at a given level
-  !>        \param[out] "real(dp), optional      :: yllcorner"  y coordinate of the lowerleft corner at a given level
-  !>        \param[out] "real(dp), optional      :: cellsize"   cell size at a given level
-
-  !     RETURN
-
-  !     RESTRICTIONS
-
-  !     EXAMPLE
-
-  !     LITERATURE
-
-  !     HISTORY
-  !         \authors  Rohini Kumar, Luis Samaniego
-  !         \date     Jan 2013
-  !         Modified, R. Kumar, Sep 2013   - documentation added according to the template
-  !                   Stephan Thober, Aug 2015 - moved L11 and L110 to mRM
-
-  subroutine get_basin_info(iBasin, iLevel, nrows, ncols, ncells, iStart, iEnd, &
-                            iStartMask, iEndMask, mask, xllcorner, yllcorner, cellsize)
-
-    use mo_message, only: message
-    use mo_global_variables, only: basin, level0, level1, level2
-    implicit none
-
-    integer(i4), intent(in)                                      :: iBasin
-    integer(i4), intent(in)                                      :: iLevel
-    integer(i4), intent(out)                                     :: nrows, ncols
-    integer(i4), optional, intent(out)                           :: ncells
-    integer(i4), optional, intent(out)                           :: iStart, iEnd
-    integer(i4), optional, intent(out)                           :: iStartMask, iEndMask
-    logical, optional, dimension(:,:), allocatable,  intent(out) :: mask
-    real(dp), optional, intent(out)                              :: xllcorner, yllcorner, cellsize
-
-    ! level information
-    select case (iLevel)
-    case (0)
-       nrows = level0%nrows(iBasin)
-       ncols = level0%ncols(iBasin)
-       if (present(ncells)) ncells = basin%L0_iEnd(iBasin) - basin%L0_iStart(iBasin) + 1
-       if (present(iStart)) iStart = basin%L0_iStart(iBasin)
-       if (present(iEnd))   iEnd   = basin%L0_iEnd(iBasin)
-       if (present(iStartMask)) iStartMask = basin%L0_iStartMask(iBasin)
-       if (present(iEndMask))   iEndMask   = basin%L0_iEndMask(iBasin)
-       if (present(Mask)) then
-          allocate ( mask(nrows, ncols) )
-          mask(:,:) = .FALSE.
-          mask(:,:) = RESHAPE( basin%L0_Mask( basin%L0_iStartMask(iBasin): basin%L0_iEndMask(iBasin)),&
-               (/nrows,ncols/) )
-       end if
-       if (present(xllcorner)) xllcorner = level0%xllcorner(iBasin)
-       if (present(yllcorner)) yllcorner = level0%yllcorner(iBasin)
-       if (present(cellsize))  cellsize  = level0%cellsize(iBasin)
-
-    case (1)
-       nrows = level1%nrows(iBasin)
-       ncols = level1%ncols(iBasin)
-       if (present(ncells)) ncells = basin%L1_iEnd(iBasin) - basin%L1_iStart(iBasin) + 1
-       if (present(iStart)) iStart = basin%L1_iStart(iBasin)
-       if (present(iEnd))   iEnd   = basin%L1_iEnd(iBasin)
-       if (present(iStartMask)) iStartMask = basin%L1_iStartMask(iBasin)
-       if (present(iEndMask))   iEndMask   = basin%L1_iEndMask(iBasin)
-       if (present(Mask)) then
-          allocate ( mask(nrows, ncols) )
-          mask(:,:) = .FALSE.
-          mask(:,:) = RESHAPE( basin%L1_Mask( basin%L1_iStartMask(iBasin): basin%L1_iEndMask(iBasin)),&
-               (/nrows,ncols/) )
-       end if
-       if (present(xllcorner)) xllcorner = level1%xllcorner(iBasin)
-       if (present(yllcorner)) yllcorner = level1%yllcorner(iBasin)
-       if (present(cellsize))  cellsize = level1%cellsize(iBasin)
-
-    case (11)
-       call message('***ERROR: get_basin_info has been called for level 11 that does not exist within mHM')
-       call message('***ERROR: use get_basin_info_mrm from mRM instead')
-       stop
-
-    case (110)
-       call message('***ERROR: get_basin_info has been called for level 110 that does not exist within mHM')
-       call message('***ERROR: use get_basin_info_mrm from mRM instead')
-       stop
-
-    case (2)
-       nrows = level2%nrows(iBasin)
-       ncols = level2%ncols(iBasin)
-       if (present(ncells)) ncells = basin%L2_iEnd(iBasin) - basin%L2_iStart(iBasin) + 1
-       if (present(iStart)) iStart = basin%L2_iStart(iBasin)
-       if (present(iEnd))   iEnd   = basin%L2_iEnd(iBasin)
-       if (present(iStartMask)) iStartMask = basin%L2_iStartMask(iBasin)
-       if (present(iEndMask))   iEndMask   = basin%L2_iEndMask(iBasin)
-       if (present(Mask)) then
-          allocate ( mask(nrows, ncols) )
-          mask(:,:) = .FALSE.
-          mask(:,:) = RESHAPE( basin%L2_Mask( basin%L2_iStartMask(iBasin): basin%L2_iEndMask(iBasin)),&
-               (/nrows,ncols/) )
-       end if
-       if (present(xllcorner)) xllcorner = level2%xllcorner(iBasin)
-       if (present(yllcorner)) yllcorner = level2%yllcorner(iBasin)
-       if (present(cellsize)) cellsize   = level2%cellsize(iBasin)
-
-    end select
-
-  end subroutine get_basin_info
-
-  ! ------------------------------------------------------------------
-
-  !      NAME
-  !         calculate_grid_properties
-
-  !     PURPOSE
-  !>        \brief Calculates basic grid properties at a required coarser level using
-  !>              information of a given finer level.
-
-  !>        \brief Calculates basic grid properties at a required coarser level (e.g., L11) using
-  !>              information of a given finer level (e.g., L0). Basic grid properties such as
-  !>              nrows, ncols, xllcorner, yllcorner cellsize are estimated in this
-  !>              routine.
-
-  !     CALLING SEQUENCE
-  !         call calculate_grid_properties( nrowsIn, ncolsIn,  xllcornerIn,                     &
-  !                                         yllcornerIn,  cellsizeIn, nodata_valueIn,           &
-  !                                         aimingResolution, nrowsOut, ncolsOut, xllcornerOut, &
-  !                                         yllcornerOut, cellsizeOut, nodata_valueOut )
-  !     INTENT(IN)
-  !>        \param[in] "integer(i4)             :: nrowsIn"           no. of rows at an input level
-  !>        \param[in] "integer(i4)             :: ncolsIn"           no. of cols at an input level
-  !>        \param[in] "real(dp)                :: xllcornerIn"       xllcorner at an input level
-  !>        \param[in] "real(dp)                :: yllcornerIn"       yllcorner at an input level
-  !>        \param[in] "real(dp)                :: cellsizeIn"        cell size at an input level
-  !>        \param[in] "real(dp)                :: nodata_valueIn"    nodata value at an input level
-  !>        \param[in] "real(dp)                :: aimingResolution"  resolution of an output level
-
-  !     INTENT(INOUT)
-  !         None
-
-  !     INTENT(OUT)
-  !>        \param[out] "integer(i4)             :: nrowsOut"         no. of rows at an output level
-  !>        \param[out] "integer(i4)             :: ncolsOut"         no. of cols at an output level
-  !>        \param[out] "real(dp)                :: xllcornerOut"      xllcorner at an output level
-  !>        \param[out] "real(dp)                :: yllcornerOut"      yllcorner at an output level
-  !>        \param[out] "real(dp)                :: cellsizeOut"       cell size at an output level
-  !>        \param[out] "real(dp)                :: nodata_valueOut"   nodata value at an output level
-
-  !     INTENT(IN), OPTIONAL
-  !         None
-
-  !     INTENT(INOUT), OPTIONAL
-  !         None
-
-  !     INTENT(OUT), OPTIONAL
-  !         None
-
-  !     RETURN
-  !         None
-
-  !     RESTRICTIONS
-  !>       \note resolutions of input and output levels should confirm each other.
-
-  !     EXAMPLE
-  !         None
-
-  !     LITERATURE
-  !         None
-
-  !     HISTORY
-  !>        \author Matthias Zink & Rohini Kumar
-  !>        \date Feb 2013
-  !         Modified, R. Kumar, Sep 2013   - documentation added according to the template
-
-  subroutine calculate_grid_properties( &
-       nrowsIn, ncolsIn,  xllcornerIn,  yllcornerIn,  cellsizeIn, nodata_valueIn,  &
-       aimingResolution,                                                           &
-       nrowsOut, ncolsOut, xllcornerOut, yllcornerOut, cellsizeOut, nodata_valueOut )
-
-    use mo_message,      only: message       ! for print out
-    use mo_string_utils, only: num2str
-
-    implicit none
-
-    integer(i4), intent(in) :: nrowsIn
-    integer(i4), intent(in) :: ncolsIn
-    real(dp), intent(in)    :: xllcornerIn
-    real(dp), intent(in)    :: yllcornerIn
-    real(dp), intent(in)    :: cellsizeIn
-    real(dp), intent(in)    :: nodata_valueIn
-    real(dp), intent(in)    :: aimingResolution
-
-    integer(i4), intent(out) :: nrowsOut
-    integer(i4), intent(out) :: ncolsOut
-    real(dp), intent(out)    :: xllcornerOut
-    real(dp), intent(out)    :: yllcornerOut
-    real(dp), intent(out)    :: cellsizeOut
-    real(dp), intent(out)    :: nodata_valueOut
-
-    ! local variables
-    real(dp)                 :: cellfactor
-
-    cellFactor = aimingResolution / cellsizeIn
-
-    if ( nint(mod(aimingResolution, cellsizeIn)) .ne. 0) then
-       call message()
-       call message('***ERROR: Two resolutions size do not confirm: ',   &
-            trim(adjustl(num2str(nint(AimingResolution)))),              &
-            trim(adjustl(num2str(nint(cellsizeIn))))         )
-       stop
-    end if
-
-    cellsizeOut     = cellsizeIn * cellFactor
-    ncolsOut        = ceiling( real(ncolsIn, dp) / cellFactor)
-    nrowsOut        = ceiling( real(nrowsIn, dp) / cellFactor)
-    xllcornerOut    = xllcornerIn + real(ncolsIn,dp) * cellsizeIn - real(ncolsOut,dp) * cellsizeOut
-    yllcornerOut    = yllcornerIn + real(nrowsIn,dp) * cellsizeIn - real(nrowsOut,dp) * cellsizeOut
-    nodata_valueOut  = nodata_valueIn
-
-  end subroutine calculate_grid_properties
 
 END MODULE mo_init_states
diff --git a/src/mHM/mo_meteo_forcings.f90 b/src/mHM/mo_meteo_forcings.f90
index e3d5d0bb..6db042dc 100644
--- a/src/mHM/mo_meteo_forcings.f90
+++ b/src/mHM/mo_meteo_forcings.f90
@@ -14,14 +14,14 @@ MODULE mo_meteo_forcings
   ! Written  Rohini Kumar, Jan 2013
   ! Modified
 
-  USE mo_kind, ONLY: i4, dp
+  USE mo_kind, ONLY : i4, dp
 
   IMPLICIT NONE
 
   PRIVATE
 
-  PUBLIC :: prepare_meteo_forcings_data  
- 
+  PUBLIC :: prepare_meteo_forcings_data
+
   ! ------------------------------------------------------------------
 
 CONTAINS
@@ -30,7 +30,7 @@ MODULE mo_meteo_forcings
 
   !     NAME
   !         prepare_meteo_forcings_data
-  
+
   !     PURPOSE
   !>        \brief Prepare meteorological forcings data for a given variable
 
@@ -81,154 +81,154 @@ MODULE mo_meteo_forcings
   !           Stephan Thober,  Jan  2017 - added subroutine for meteo_weights
   !
   subroutine prepare_meteo_forcings_data(iBasin, tt)
-    use mo_message,          only: message
-    use mo_string_utils,     only: num2str
-    use mo_timer,            only:                         &
-         timer_start, timer_stop, timer_get                   ! Timing of processes
-    use mo_global_variables, only: &
-         read_meteo_weights,                                & ! flag for reading meteo weights
-         dirPrecipitation, dirTemperature,                  & ! directory of meteo input
-         dirReferenceET,                                    & ! PET input path  if process 5 is 'PET is input' (case 0)
-         dirMinTemperature, dirMaxTemperature,              & ! PET input paths if process 5 is Hargreaves-Samani (case 1)
-         dirNetRadiation,                                   & ! PET input paths if process 5 is Priestley-Taylor (case 2)
-         dirabsVapPressure, dirwindspeed,                   & ! PET input paths if process 5 is Penman-Monteith (case 3)
-         inputFormat_meteo_forcings,                        & ! 'bin' for binary data or 'nc' for NetCDF input
-         nBasins,                                           & ! Number of basins for multi-basin optimization 
-         readPer, timeStep_model_inputs,                    & ! chunk read in config
-         L1_temp_weights, L1_pet_weights, L1_pre_weights,   & ! meteorological weights at L1 resolution
-         L1_pre, L1_temp, L1_pet , L1_tmin, L1_tmax,        & ! meteorological data
-         L1_netrad, L1_absvappress, L1_windspeed              ! meteorological data
-    use mo_common_variables, only: &
-         processMatrix                                        ! process configuration
-
+    use mo_message, only : message
+    use mo_string_utils, only : num2str
+    use mo_timer, only : &
+            timer_start, timer_stop, timer_get                   ! Timing of processes
+    use mo_global_variables, only : &
+            read_meteo_weights, & ! flag for reading meteo weights
+            dirPrecipitation, dirTemperature, & ! directory of meteo input
+            dirReferenceET, & ! PET input path  if process 5 is 'PET is input' (case 0)
+            dirMinTemperature, dirMaxTemperature, & ! PET input paths if process 5 is Hargreaves-Samani (case 1)
+            dirNetRadiation, & ! PET input paths if process 5 is Priestley-Taylor (case 2)
+            dirabsVapPressure, dirwindspeed, & ! PET input paths if process 5 is Penman-Monteith (case 3)
+            inputFormat_meteo_forcings, & ! 'bin' for binary data or 'nc' for NetCDF input
+            timeStep_model_inputs, &
+            L1_temp_weights, L1_pet_weights, L1_pre_weights, & ! meteorological weights at L1 resolution
+            L1_pre, L1_temp, L1_pet, L1_tmin, L1_tmax, & ! meteorological data
+            L1_netrad, L1_absvappress, L1_windspeed              ! meteorological data
+    use mo_common_mhm_mrm_variables, only : &
+            readPer                       ! chunk read in config
+    use mo_common_variables, only : &
+            processMatrix, & ! process configuration
+            nBasins                                              ! Number of basins for multi-basin optimization
 
     implicit none
 
-    integer(i4),                   intent(in)  :: iBasin        ! Basin Id
-    integer(i4),                   intent(in)  :: tt            ! current timestep
+    integer(i4), intent(in) :: iBasin        ! Basin Id
+    integer(i4), intent(in) :: tt            ! current timestep
 
     ! local variables
-    logical                                    :: read_flag     ! indicate whether data should be read
+    logical :: read_flag     ! indicate whether data should be read
 
     ! configuration of chunk_read
-    call chunk_config( iBasin, tt, read_flag, readPer )
- 
+    call chunk_config(iBasin, tt, read_flag, readPer)
+
     ! only read, if read_flag is true
-    if ( read_flag ) then
-
-       ! read weights for hourly disaggregation of temperature
-       if ( tt .eq. 1 ) then
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read meteo weights for tavg     ...' )
-          call meteo_weights_wrapper( iBasin, read_meteo_weights, dirTemperature(iBasin),  &
-               L1_temp_weights, ncvarName='tavg_weight' )
-          
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read meteo weights for pet     ...' )
-          call meteo_weights_wrapper( iBasin, read_meteo_weights, dirReferenceET(iBasin),  &
-               L1_pet_weights, ncvarName='pet_weight' )
-
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read meteo weights for pre     ...' )
-          call meteo_weights_wrapper( iBasin, read_meteo_weights, dirPrecipitation(iBasin),  &
-               L1_pre_weights, ncvarName='pre_weight' )
-       end if
-       
-       ! free L1 variables if chunk read is activated
-       if ( timeStep_model_inputs(iBasin) .ne. 0 ) then
-          if ( allocated( L1_pre         )) deallocate( L1_pre         )
-          if ( allocated( L1_temp        )) deallocate( L1_temp        )
-          if ( allocated( L1_pet         )) deallocate( L1_pet         )
-          if ( allocated( L1_tmin        )) deallocate( L1_tmin        )
-          if ( allocated( L1_tmax        )) deallocate( L1_tmax        )
-          if ( allocated( L1_netrad      )) deallocate( L1_netrad      )
-          if ( allocated( L1_absvappress )) deallocate( L1_absvappress )
-          if ( allocated( L1_windspeed   )) deallocate( L1_windspeed   )
-       end if
-       
-       !  basin characteristics and read meteo header
-       if ( timeStep_model_inputs(iBasin) .eq. 0 ) then
-          call message( '  Reading meteorological forcings for basin: ', trim(adjustl(num2str(iBasin))),' ...')
-          call timer_start(1)
-       end if
-
-       ! precipitation
-       if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read precipitation        ...' )
-       call meteo_forcings_wrapper( iBasin, dirPrecipitation(iBasin), inputFormat_meteo_forcings, &
-            L1_pre, lower=0.0_dp, upper=1000._dp, ncvarName='pre' )
-
-       ! temperature
-       if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read temperature          ...' )
-       call meteo_forcings_wrapper( iBasin, dirTemperature(iBasin), inputFormat_meteo_forcings,  &
-            L1_temp, lower = -100._dp, upper=100._dp, ncvarName='tavg' )
-
-       ! read input for PET (process 5) depending on specified option
-       ! 0 - input, 1 - Hargreaves-Samani, 2 - Priestley-Taylor, 3 - Penman-Monteith
-       select case (processMatrix(5,1))    
-
-       case(-1:0) ! pet is input
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read pet                  ...' )
-          call meteo_forcings_wrapper( iBasin, dirReferenceET(iBasin), inputFormat_meteo_forcings, &
-               L1_pet, lower=0.0_dp, upper = 1000._dp, ncvarName='pet' )
-          ! allocate PET and dummies for mhm_call
-          if ((iBasin.eq.nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
-             allocate( L1_tmin(1,1)); allocate( L1_tmax(1,1) ); allocate( L1_netrad(1,1) )
-             allocate( L1_absvappress(1,1)); allocate( L1_windspeed(1,1) )
-          end if
-
-       case(1) ! Hargreaves-Samani formulation (input: minimum and maximum Temperature)
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read min. temperature     ...' )
-          call meteo_forcings_wrapper( iBasin, dirMinTemperature(iBasin), inputFormat_meteo_forcings, &
-               L1_tmin, lower=-100.0_dp, upper = 100._dp, ncvarName='tmin' )
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read max. temperature     ...' )
-          call meteo_forcings_wrapper( iBasin, dirMaxTemperature(iBasin), inputFormat_meteo_forcings, &
-               L1_tmax, lower=-100.0_dp, upper = 100._dp, ncvarName='tmax' )
-          ! allocate PET and dummies for mhm_call
-          if ((iBasin .eq. nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
-             allocate( L1_pet    (size(L1_tmax, dim=1), size(L1_tmax, dim=2)))
-             allocate( L1_netrad(1,1) ); allocate( L1_absvappress(1,1)); allocate( L1_windspeed(1,1) )
-          end if
-
-       case(2) ! Priestley-Taylor formulation (input: net radiation)
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read net radiation        ...' )
-          call meteo_forcings_wrapper( iBasin, dirNetRadiation(iBasin), inputFormat_meteo_forcings, &
-               L1_netrad, lower=-500.0_dp, upper = 1500._dp, ncvarName='net_rad' )
-          ! allocate PET and dummies for mhm_call
-          if ((iBasin .eq. nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
-             allocate( L1_pet    (size(L1_netrad, dim=1), size(L1_netrad, dim=2)))
-             allocate( L1_tmin(1,1)); allocate( L1_tmax(1,1) )
-             allocate( L1_absvappress(1,1)); allocate( L1_windspeed(1,1) )
-          end if
-
-       case(3) ! Penman-Monteith formulation (input: net radiationm absulute vapour pressure, windspeed)
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read net radiation        ...' )
-          call meteo_forcings_wrapper( iBasin, dirNetRadiation(iBasin), inputFormat_meteo_forcings, &
-               L1_netrad, lower=-500.0_dp, upper = 1500._dp, ncvarName='net_rad' )
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read absolute vapour pressure  ...' )
-          call meteo_forcings_wrapper( iBasin, dirabsVapPressure(iBasin), inputFormat_meteo_forcings, &
-               L1_absvappress, lower=0.0_dp, upper = 15000.0_dp, ncvarName='eabs' )
-          if ( timeStep_model_inputs(iBasin) .eq. 0 ) call message( '    read windspeed            ...' )
-          call meteo_forcings_wrapper( iBasin, dirwindspeed(iBasin), inputFormat_meteo_forcings, &
-               L1_windspeed, lower=0.0_dp, upper = 250.0_dp, ncvarName='windspeed' )
-          ! allocate PET and dummies for mhm_call
-          if ((iBasin.eq.nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
-             allocate( L1_pet    (size(L1_absvappress, dim=1), size(L1_absvappress, dim=2)))
-             allocate( L1_tmin(1,1)); allocate( L1_tmax(1,1) )
-          end if
-       end select
-
-       if ( timeStep_model_inputs(iBasin) .eq. 0 ) then
-          call timer_stop(1)
-          call message('    in ', trim(num2str(timer_get(1),'(F9.3)')), ' seconds.')
-       end if
+    if (read_flag) then
+
+      ! read weights for hourly disaggregation of temperature
+      if (tt .eq. 1) then
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read meteo weights for tavg     ...')
+        call meteo_weights_wrapper(iBasin, read_meteo_weights, dirTemperature(iBasin), &
+                L1_temp_weights, ncvarName = 'tavg_weight')
+
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read meteo weights for pet     ...')
+        call meteo_weights_wrapper(iBasin, read_meteo_weights, dirReferenceET(iBasin), &
+                L1_pet_weights, ncvarName = 'pet_weight')
+
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read meteo weights for pre     ...')
+        call meteo_weights_wrapper(iBasin, read_meteo_weights, dirPrecipitation(iBasin), &
+                L1_pre_weights, ncvarName = 'pre_weight')
+      end if
+
+      ! free L1 variables if chunk read is activated
+      if (timeStep_model_inputs(iBasin) .ne. 0) then
+        if (allocated(L1_pre)) deallocate(L1_pre)
+        if (allocated(L1_temp)) deallocate(L1_temp)
+        if (allocated(L1_pet)) deallocate(L1_pet)
+        if (allocated(L1_tmin)) deallocate(L1_tmin)
+        if (allocated(L1_tmax)) deallocate(L1_tmax)
+        if (allocated(L1_netrad)) deallocate(L1_netrad)
+        if (allocated(L1_absvappress)) deallocate(L1_absvappress)
+        if (allocated(L1_windspeed)) deallocate(L1_windspeed)
+      end if
+
+      !  basin characteristics and read meteo header
+      if (timeStep_model_inputs(iBasin) .eq. 0) then
+        call message('  Reading meteorological forcings for basin: ', trim(adjustl(num2str(iBasin))), ' ...')
+        call timer_start(1)
+      end if
+
+      ! precipitation
+      if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read precipitation        ...')
+      call meteo_forcings_wrapper(iBasin, dirPrecipitation(iBasin), inputFormat_meteo_forcings, &
+              L1_pre, lower = 0.0_dp, upper = 1000._dp, ncvarName = 'pre')
+
+      ! temperature
+      if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read temperature          ...')
+      call meteo_forcings_wrapper(iBasin, dirTemperature(iBasin), inputFormat_meteo_forcings, &
+              L1_temp, lower = -100._dp, upper = 100._dp, ncvarName = 'tavg')
+
+      ! read input for PET (process 5) depending on specified option
+      ! 0 - input, 1 - Hargreaves-Samani, 2 - Priestley-Taylor, 3 - Penman-Monteith
+      select case (processMatrix(5, 1))
+
+      case(-1 : 0) ! pet is input
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read pet                  ...')
+        call meteo_forcings_wrapper(iBasin, dirReferenceET(iBasin), inputFormat_meteo_forcings, &
+                L1_pet, lower = 0.0_dp, upper = 1000._dp, ncvarName = 'pet')
+        ! allocate PET and dummies for mhm_call
+        if ((iBasin.eq.nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
+          allocate(L1_tmin(1, 1)); allocate(L1_tmax(1, 1)); allocate(L1_netrad(1, 1))
+          allocate(L1_absvappress(1, 1)); allocate(L1_windspeed(1, 1))
+        end if
+
+      case(1) ! Hargreaves-Samani formulation (input: minimum and maximum Temperature)
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read min. temperature     ...')
+        call meteo_forcings_wrapper(iBasin, dirMinTemperature(iBasin), inputFormat_meteo_forcings, &
+                L1_tmin, lower = -100.0_dp, upper = 100._dp, ncvarName = 'tmin')
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read max. temperature     ...')
+        call meteo_forcings_wrapper(iBasin, dirMaxTemperature(iBasin), inputFormat_meteo_forcings, &
+                L1_tmax, lower = -100.0_dp, upper = 100._dp, ncvarName = 'tmax')
+        ! allocate PET and dummies for mhm_call
+        if ((iBasin .eq. nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
+          allocate(L1_pet    (size(L1_tmax, dim = 1), size(L1_tmax, dim = 2)))
+          allocate(L1_netrad(1, 1)); allocate(L1_absvappress(1, 1)); allocate(L1_windspeed(1, 1))
+        end if
+
+      case(2) ! Priestley-Taylor formulation (input: net radiation)
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read net radiation        ...')
+        call meteo_forcings_wrapper(iBasin, dirNetRadiation(iBasin), inputFormat_meteo_forcings, &
+                L1_netrad, lower = -500.0_dp, upper = 1500._dp, ncvarName = 'net_rad')
+        ! allocate PET and dummies for mhm_call
+        if ((iBasin .eq. nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
+          allocate(L1_pet    (size(L1_netrad, dim = 1), size(L1_netrad, dim = 2)))
+          allocate(L1_tmin(1, 1)); allocate(L1_tmax(1, 1))
+          allocate(L1_absvappress(1, 1)); allocate(L1_windspeed(1, 1))
+        end if
+
+      case(3) ! Penman-Monteith formulation (input: net radiationm absulute vapour pressure, windspeed)
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read net radiation        ...')
+        call meteo_forcings_wrapper(iBasin, dirNetRadiation(iBasin), inputFormat_meteo_forcings, &
+                L1_netrad, lower = -500.0_dp, upper = 1500._dp, ncvarName = 'net_rad')
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read absolute vapour pressure  ...')
+        call meteo_forcings_wrapper(iBasin, dirabsVapPressure(iBasin), inputFormat_meteo_forcings, &
+                L1_absvappress, lower = 0.0_dp, upper = 15000.0_dp, ncvarName = 'eabs')
+        if (timeStep_model_inputs(iBasin) .eq. 0) call message('    read windspeed            ...')
+        call meteo_forcings_wrapper(iBasin, dirwindspeed(iBasin), inputFormat_meteo_forcings, &
+                L1_windspeed, lower = 0.0_dp, upper = 250.0_dp, ncvarName = 'windspeed')
+        ! allocate PET and dummies for mhm_call
+        if ((iBasin.eq.nBasins) .OR. (timeStep_model_inputs(iBasin) .NE. 0)) then
+          allocate(L1_pet    (size(L1_absvappress, dim = 1), size(L1_absvappress, dim = 2)))
+          allocate(L1_tmin(1, 1)); allocate(L1_tmax(1, 1))
+        end if
+      end select
+
+      if (timeStep_model_inputs(iBasin) .eq. 0) then
+        call timer_stop(1)
+        call message('    in ', trim(num2str(timer_get(1), '(F9.3)')), ' seconds.')
+      end if
     end if
 
-end subroutine prepare_meteo_forcings_data
-
+  end subroutine prepare_meteo_forcings_data
 
 
   ! ------------------------------------------------------------------
 
   !     NAME
   !         meteo_forcings_wrapper
-  
+
   !     PURPOSE
   !>        \brief Prepare meteorological forcings data for mHM at Level-1
 
@@ -281,123 +281,124 @@ end subroutine prepare_meteo_forcings_data
   !                   Stephan Thober, Feb 2016 -- refactored deallocate statements
 
   subroutine meteo_forcings_wrapper(iBasin, dataPath, inputFormat, dataOut1, lower, upper, ncvarName)
-  
-    use mo_global_variables,           only: readPer, level1, level2
-    use mo_mhm_constants,              only: nodata_dp
-    use mo_init_states,                only: get_basin_info
-    use mo_read_meteo,                 only: read_meteo_bin
-    use mo_read_forcing_nc,            only: read_forcing_nc
-    use mo_spatial_agg_disagg_forcing, only: spatial_aggregation, spatial_disaggregation
-    use mo_append,                     only: append                    ! append vector
-    
+
+    use mo_common_mhm_mrm_variables, only : readPer
+    use mo_common_variables, only : level1
+    use mo_global_variables, only : level2
+    use mo_common_constants, only : nodata_dp
+    use mo_read_bin, only : read_bin
+    use mo_read_forcing_nc, only : read_forcing_nc
+    use mo_spatial_agg_disagg_forcing, only : spatial_aggregation, spatial_disaggregation
+    use mo_append, only : append                    ! append vector
+
     implicit none
 
-    integer(i4),                          intent(in)    :: iBasin        ! Basin Id
-    character(len=*),                     intent(in)    :: dataPath      ! Data path
-    character(len=*),                     intent(in)    :: inputFormat   ! either 'bin' or 'nc'
-    real(dp), dimension(:,:),allocatable, intent(inout) :: dataOut1      ! Packed meteorological variable
-    real(dp),                   optional, intent(in)    :: lower         ! lower bound for data points
-    real(dp),                   optional, intent(in)    :: upper         ! upper bound for data points
-    character(len=*),           optional, intent(in)    :: ncvarName     ! name of the variable (for .nc files)
+    integer(i4), intent(in) :: iBasin        ! Basin Id
+    character(len = *), intent(in) :: dataPath      ! Data path
+    character(len = *), intent(in) :: inputFormat   ! either 'bin' or 'nc'
+    real(dp), dimension(:, :), allocatable, intent(inout) :: dataOut1      ! Packed meteorological variable
+    real(dp), optional, intent(in) :: lower         ! lower bound for data points
+    real(dp), optional, intent(in) :: upper         ! upper bound for data points
+    character(len = *), optional, intent(in) :: ncvarName     ! name of the variable (for .nc files)
 
-    
-    integer(i4)                                :: nrows1, ncols1
-    logical, dimension(:,:), allocatable       :: mask1
-    integer(i4)                                :: ncells1
+    logical, dimension(:, :), allocatable :: mask1
+    integer(i4) :: ncells1
 
-    integer(i4)                                :: nrows2, ncols2
-    logical, dimension(:,:), allocatable       :: mask2
+    integer(i4) :: nrows2, ncols2
+    logical, dimension(:, :), allocatable :: mask2
 
-    real(dp), dimension(:,:,:), allocatable    :: L2_data            ! meteo data at level-2 
-    real(dp), dimension(:,:,:), allocatable    :: L1_data            ! meteo data at level-1
-    real(dp), dimension(:,:), allocatable      :: L1_data_packed     ! packed meteo data at level-1 from 3D to 2D
+    real(dp), dimension(:, :, :), allocatable :: L2_data            ! meteo data at level-2
+    real(dp), dimension(:, :, :), allocatable :: L1_data            ! meteo data at level-1
+    real(dp), dimension(:, :), allocatable :: L1_data_packed     ! packed meteo data at level-1 from 3D to 2D
 
-    integer(i4)                                :: nTimeSteps
-    real(dp)                                   :: cellFactorHbyM   ! level-1_resolution/level-2_resolution
-    integer(i4)                                :: t
+    integer(i4) :: nTimeSteps
+    real(dp) :: cellFactorHbyM   ! level-1_resolution/level-2_resolution
+    integer(i4) :: t
 
     ! get basic basin information at level-1
-    call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, mask=mask1 )
-    
+    nCells1 = level1(iBasin)%nCells
+    mask1 = level1(iBasin)%mask
+
     ! make  basic basin information at level-2
-    call get_basin_info( iBasin, 2, nrows2, ncols2, mask=mask2 )
+    nrows2 = level2(iBasin)%nrows
+    ncols2 = level2(iBasin)%ncols
+    mask2 = level2(iBasin)%mask
 
-    select case (trim(inputFormat))       
+    select case (trim(inputFormat))
     case ('bin')
-       ! read data
-       if( present(lower) .AND. (.not. present(upper)) ) then
-          CALL read_meteo_bin( dataPath, nRows2, nCols2, readPer,  L2_data, mask2, lower=lower )
-       end if
-       !
-       if( present(upper) .AND. (.not. present(lower)) ) then
-          CALL read_meteo_bin( dataPath, nRows2, nCols2, readPer, L2_data, mask2, upper=upper )
-       end if
-       !
-       if( present(lower) .AND. present(upper) ) then
-          CALL read_meteo_bin( dataPath, nRows2, nCols2, readPer, L2_data, mask2, lower=lower, upper=upper )
-       end if
-    
-       if( (.not. present(lower)) .AND. (.not. present(upper)) ) then
-          CALL read_meteo_bin( dataPath, nRows2, nCols2, readPer, L2_data, mask2 )
-       end if
+      ! read data
+      if(present(lower) .AND. (.not. present(upper))) then
+        CALL read_bin(dataPath, nRows2, nCols2, readPer, L2_data, mask2, lower = lower)
+      end if
+      !
+      if(present(upper) .AND. (.not. present(lower))) then
+        CALL read_bin(dataPath, nRows2, nCols2, readPer, L2_data, mask2, upper = upper)
+      end if
+      !
+      if(present(lower) .AND. present(upper)) then
+        CALL read_bin(dataPath, nRows2, nCols2, readPer, L2_data, mask2, lower = lower, upper = upper)
+      end if
+
+      if((.not. present(lower)) .AND. (.not. present(upper))) then
+        CALL read_bin(dataPath, nRows2, nCols2, readPer, L2_data, mask2)
+      end if
     case('nc')
-       if( present(lower) .AND. (.not. present(upper)) ) then
-          CALL read_forcing_nc( dataPath, nRows2, nCols2, readPer, ncvarName, L2_data, mask2, &
-               lower=lower )
-       end if
-       !
-       if( present(upper) .AND. (.not. present(lower)) ) then
-          CALL read_forcing_nc( dataPath, nRows2, nCols2, readPer, ncvarName, L2_data, mask2, &
-               upper=upper )
-       end if
-       !
-       if( present(lower) .AND. present(upper) ) then
-          CALL read_forcing_nc( dataPath, nRows2, nCols2, readPer, ncvarName, L2_data, mask2, &
-               lower=lower, upper=upper )
-       end if
-    
-       if( (.not. present(lower)) .AND. (.not. present(upper)) ) then
-          CALL read_forcing_nc( dataPath, nRows2, nCols2, readPer, ncvarName, L2_data, mask2 )
-       end if
+      if(present(lower) .AND. (.not. present(upper))) then
+        CALL read_forcing_nc(dataPath, nRows2, nCols2, ncvarName, mask2, L2_data, target_period = readPer, &
+                lower = lower)
+      end if
+      !
+      if(present(upper) .AND. (.not. present(lower))) then
+        CALL read_forcing_nc(dataPath, nRows2, nCols2, ncvarName, mask2, L2_data, target_period = readPer, &
+                upper = upper)
+      end if
+      !
+      if(present(lower) .AND. present(upper)) then
+        CALL read_forcing_nc(dataPath, nRows2, nCols2, ncvarName, mask2, L2_data, target_period = readPer, &
+                lower = lower, upper = upper)
+      end if
+
+      if((.not. present(lower)) .AND. (.not. present(upper))) then
+        CALL read_forcing_nc(dataPath, nRows2, nCols2, ncvarName, mask2, L2_data, target_period = readPer)
+      end if
     case DEFAULT
-       stop '***ERROR: meteo_forcings_wrapper: Not recognized input format'
+      stop '***ERROR: meteo_forcings_wrapper: Not recognized input format'
     end select
-
     ! cellfactor to decide on the upscaling or downscaling of meteo. fields
-    cellFactorHbyM = level1%cellsize(iBasin) / level2%cellsize(iBasin) 
+    cellFactorHbyM = level1(iBasin)%cellsize / level2(iBasin)%cellsize
 
     ! upscaling & packing
-    if(cellFactorHbyM .gt. 1.0_dp) then 
-        call spatial_aggregation(L2_data, level2%cellsize(iBasin), level1%cellsize(iBasin), mask1, mask2, L1_data)
-    ! downscaling   
+    if(cellFactorHbyM .gt. 1.0_dp) then
+      call spatial_aggregation(L2_data, level2(iBasin)%cellsize, level1(iBasin)%cellsize, mask1, mask2, L1_data)
+      ! downscaling
     elseif(cellFactorHbyM .lt. 1.0_dp) then
-        call spatial_disaggregation(L2_data, level2%cellsize(iBasin), level1%cellsize(iBasin), mask1, mask2, L1_data)
-    ! nothing
+      call spatial_disaggregation(L2_data, level2(iBasin)%cellsize, level1(iBasin)%cellsize, mask1, mask2, L1_data)
+      ! nothing
     else
-      allocate( L1_data( size(L2_data,1), size(L2_data,2), size(L2_data,3) ) )
-      L1_data(:,:,:) = L2_data(:,:,:)
-   end if
-   ! free memory immediately
-   deallocate(L2_data)
-    
+      allocate(L1_data(size(L2_data, 1), size(L2_data, 2), size(L2_data, 3)))
+      L1_data(:, :, :) = L2_data(:, :, :)
+    end if
+    ! free memory immediately
+    deallocate(L2_data)
+
     ! pack variables
     nTimeSteps = size(L1_data, 3)
-    allocate( L1_data_packed(nCells1, nTimeSteps))
+    allocate(L1_data_packed(nCells1, nTimeSteps))
     do t = 1, nTimeSteps
-    
-       L1_data_packed(:,t) = pack( L1_data(:,:,t), MASK=mask1(:,:) )  
-       
+
+      L1_data_packed(:, t) = pack(L1_data(:, :, t), MASK = mask1(:, :))
+
     end do
 
     ! free memory immediately
     deallocate(L1_data)
-    
+
     ! append
-    call append( dataOut1, L1_data_packed(:,:), nodata_dp )
+    call append(dataOut1, L1_data_packed(:, :), nodata_dp)
 
     !free space
-    deallocate(L1_data_packed) 
-    
+    deallocate(L1_data_packed)
+
   end subroutine meteo_forcings_wrapper
 
 
@@ -449,102 +450,103 @@ end subroutine meteo_forcings_wrapper
   !         Modified, Stephan Thober, May 2017 -- updated documentation
 
   subroutine meteo_weights_wrapper(iBasin, read_meteo_weights, dataPath, dataOut1, lower, upper, ncvarName)
-  
-    use mo_global_variables,           only: level1, level2
-    use mo_mhm_constants,              only: nodata_dp
-    use mo_init_states,                only: get_basin_info
-    use mo_read_forcing_nc,            only: read_weights_nc
-    use mo_spatial_agg_disagg_forcing, only: spatial_aggregation, spatial_disaggregation
-    use mo_append,                     only: append                    ! append vector
-    
+
+    use mo_global_variables, only : level2
+    use mo_common_variables, only : level1
+    use mo_common_constants, only : nodata_dp
+    use mo_read_forcing_nc, only : read_weights_nc
+    use mo_spatial_agg_disagg_forcing, only : spatial_aggregation, spatial_disaggregation
+    use mo_append, only : append                    ! append vector
+
     implicit none
 
-    integer(i4),                            intent(in)    :: iBasin             ! Basin Id
-    logical,                                intent(in)    :: read_meteo_weights ! flag for reading meteo weights
-    character(len=*),                       intent(in)    :: dataPath           ! Data path
-    real(dp), dimension(:,:,:),allocatable, intent(inout) :: dataOut1           ! Packed meteorological variable
-    real(dp),                   optional,   intent(in)    :: lower              ! lower bound for data points
-    real(dp),                   optional,   intent(in)    :: upper              ! upper bound for data points
-    character(len=*),           optional,   intent(in)    :: ncvarName          ! name of the variable (for .nc files)
+    integer(i4), intent(in) :: iBasin             ! Basin Id
+    logical, intent(in) :: read_meteo_weights ! flag for reading meteo weights
+    character(len = *), intent(in) :: dataPath           ! Data path
+    real(dp), dimension(:, :, :), allocatable, intent(inout) :: dataOut1           ! Packed meteorological variable
+    real(dp), optional, intent(in) :: lower              ! lower bound for data points
+    real(dp), optional, intent(in) :: upper              ! upper bound for data points
+    character(len = *), optional, intent(in) :: ncvarName          ! name of the variable (for .nc files)
 
-    
-    integer(i4)                                :: nrows1, ncols1
-    logical, dimension(:,:), allocatable       :: mask1
-    integer(i4)                                :: ncells1
+    logical, dimension(:, :), allocatable :: mask1
+    integer(i4) :: ncells1
 
-    integer(i4)                                :: nrows2, ncols2
-    logical, dimension(:,:), allocatable       :: mask2
+    integer(i4) :: nrows2, ncols2
+    logical, dimension(:, :), allocatable :: mask2
 
-    real(dp), dimension(:,:,:,:), allocatable  :: L2_data        ! meteo weights data at level-2 
-    real(dp), dimension(:,:,:,:), allocatable  :: L1_data        ! meteo weights data at level-1
-    real(dp), dimension(:,:,:),   allocatable  :: L1_data_packed ! packed meteo weights data at level-1 from 4D to 3D
+    real(dp), dimension(:, :, :, :), allocatable :: L2_data        ! meteo weights data at level-2
+    real(dp), dimension(:, :, :, :), allocatable :: L1_data        ! meteo weights data at level-1
+    real(dp), dimension(:, :, :), allocatable :: L1_data_packed ! packed meteo weights data at level-1 from 4D to 3D
 
-    integer(i4)                                :: nMonths, nHours
-    real(dp)                                   :: cellFactorHbyM ! level-1_resolution/level-2_resolution
-    integer(i4)                                :: t, j
+    integer(i4) :: nMonths, nHours
+    real(dp) :: cellFactorHbyM ! level-1_resolution/level-2_resolution
+    integer(i4) :: t, j
 
     ! get basic basin information at level-1
-    call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, mask=mask1 )
-    
+    nCells1 = level1(iBasin)%nCells
+    mask1 = level1(iBasin)%mask
+
     ! make  basic basin information at level-2
-    call get_basin_info( iBasin, 2, nrows2, ncols2, mask=mask2 )
+    nrows2 = level2(iBasin)%nrows
+    ncols2 = level2(iBasin)%ncols
+    mask2 = level2(iBasin)%mask
 
     if (read_meteo_weights) then
-       if( present(lower) .AND. (.not. present(upper)) ) then
-          CALL read_weights_nc( dataPath, nRows2, nCols2, ncvarName, L2_data, mask2, lower=lower )
-       end if
-       !
-       if( present(upper) .AND. (.not. present(lower)) ) then
-          CALL read_weights_nc( dataPath, nRows2, nCols2, ncvarName, L2_data, mask2, upper=upper )
-       end if
-       !
-       if( present(lower) .AND. present(upper) ) then
-          CALL read_weights_nc( dataPath, nRows2, nCols2, ncvarName, L2_data, mask2, lower=lower, upper=upper )
-       end if
-
-       if( (.not. present(lower)) .AND. (.not. present(upper)) ) then
-          CALL read_weights_nc( dataPath, nRows2, nCols2, ncvarName, L2_data, mask2 )
-       end if
-
-       ! cellfactor to decide on the upscaling or downscaling of meteo. fields
-       cellFactorHbyM = level1%cellsize(iBasin) / level2%cellsize(iBasin) 
-
-       ! upscaling & packing
-       if(cellFactorHbyM .gt. 1.0_dp) then
-          call spatial_aggregation(L2_data, level2%cellsize(iBasin), level1%cellsize(iBasin), mask1, mask2, L1_data)
-          ! downscaling   
-       elseif(cellFactorHbyM .lt. 1.0_dp) then
-          call spatial_disaggregation(L2_data, level2%cellsize(iBasin), level1%cellsize(iBasin), mask1, mask2, L1_data)
-          ! nothing
-       else
-          L1_data = L2_data
-       end if
-       ! free memory immediately
-       deallocate(L2_data)
-
-       ! pack variables
-       nMonths = size(L1_data, dim=3)
-       nHours  = size(L1_data, dim=4)
-       allocate( L1_data_packed(nCells1, nMonths, nHours))
-       do t = 1, nMonths
-          do j = 1, nHours
-             L1_data_packed(:,t,j) = pack( L1_data(:,:,t,j), MASK=mask1(:,:) )
-          end do
-       end do
-       ! free memory immediately
-       deallocate(L1_data)
+      if(present(lower) .AND. (.not. present(upper))) then
+        CALL read_weights_nc(dataPath, nRows2, nCols2, ncvarName, L2_data, mask2, lower = lower)
+      end if
+      !
+      if(present(upper) .AND. (.not. present(lower))) then
+        CALL read_weights_nc(dataPath, nRows2, nCols2, ncvarName, L2_data, mask2, upper = upper)
+      end if
+      !
+      if(present(lower) .AND. present(upper)) then
+        CALL read_weights_nc(dataPath, nRows2, nCols2, ncvarName, L2_data, mask2, lower = lower, upper = upper)
+      end if
+
+      if((.not. present(lower)) .AND. (.not. present(upper))) then
+        CALL read_weights_nc(dataPath, nRows2, nCols2, ncvarName, L2_data, mask2)
+      end if
+
+      ! cellfactor to decide on the upscaling or downscaling of meteo. fields
+      cellFactorHbyM = level1(iBasin)%cellsize / level2(iBasin)%cellsize
+
+      ! upscaling & packing
+      if(cellFactorHbyM .gt. 1.0_dp) then
+        call spatial_aggregation(L2_data, level2(iBasin)%cellsize, level1(iBasin)%cellsize, mask1, mask2, L1_data)
+        ! downscaling
+      elseif(cellFactorHbyM .lt. 1.0_dp) then
+        call spatial_disaggregation(L2_data, level2(iBasin)%cellsize, level1(iBasin)%cellsize, mask1, mask2, L1_data)
+        ! nothing
+      else
+        L1_data = L2_data
+      end if
+      ! free memory immediately
+      deallocate(L2_data)
+
+      ! pack variables
+      nMonths = size(L1_data, dim = 3)
+      nHours = size(L1_data, dim = 4)
+      allocate(L1_data_packed(nCells1, nMonths, nHours))
+      do t = 1, nMonths
+        do j = 1, nHours
+          L1_data_packed(:, t, j) = pack(L1_data(:, :, t, j), MASK = mask1(:, :))
+        end do
+      end do
+      ! free memory immediately
+      deallocate(L1_data)
     else
-       ! dummy allocation
-       allocate(L1_data_packed(nCells1, 12, 24))
-       L1_data_packed = nodata_dp
+      ! dummy allocation
+      allocate(L1_data_packed(nCells1, 12, 24))
+      L1_data_packed = nodata_dp
     end if
-    
+
     ! append
-    call append( dataOut1, L1_data_packed )
+    call append(dataOut1, L1_data_packed)
 
     !free space
-    deallocate(L1_data_packed) 
-    
+    deallocate(L1_data_packed)
+
   end subroutine meteo_weights_wrapper
 
 
@@ -559,48 +561,48 @@ end subroutine meteo_weights_wrapper
   !
   ! created: June 2014
   ! ------------------------------------------------------------------
-  subroutine chunk_config( iBasin, tt, read_flag, readPer )
+  subroutine chunk_config(iBasin, tt, read_flag, readPer)
     !
-    use mo_kind,             only: i4
-    use mo_global_variables, only: period
-    use mo_mhm_constants,    only: nodata_dp
+    use mo_kind, only : i4
+    use mo_common_variables, only : period
+    use mo_common_constants, only : nodata_dp
     !
     implicit none
     !
     ! input variables
-    integer(i4), intent(in)  :: iBasin ! current Basin
-    integer(i4), intent(in)  :: tt     ! current timestep
+    integer(i4), intent(in) :: iBasin ! current Basin
+    integer(i4), intent(in) :: tt     ! current timestep
     !
     ! output variables
-    logical,     intent(out) :: read_flag  ! indicate whether reading data should be read
-    type(period),intent(out) :: readPer    ! start and end dates of reading Period
+    logical, intent(out) :: read_flag  ! indicate whether reading data should be read
+    type(period), intent(out) :: readPer    ! start and end dates of reading Period
 
     ! initialize
-    read_flag        = .false.
-    if ( tt .eq. 1_i4 ) then
-       readPer%julStart = int( nodata_dp, i4 )
-       readPer%julEnd   = int( nodata_dp, i4 )
-       readPer%dstart   = int( nodata_dp, i4 )
-       readPer%mstart   = int( nodata_dp, i4 )
-       readPer%ystart   = int( nodata_dp, i4 )
-       readPer%dend     = int( nodata_dp, i4 )
-       readper%mend     = int( nodata_dp, i4 )
-       readper%yend     = int( nodata_dp, i4 )
-       readPer%Nobs     = int( nodata_dp, i4 )
+    read_flag = .false.
+    if (tt .eq. 1_i4) then
+      readPer%julStart = int(nodata_dp, i4)
+      readPer%julEnd = int(nodata_dp, i4)
+      readPer%dstart = int(nodata_dp, i4)
+      readPer%mstart = int(nodata_dp, i4)
+      readPer%ystart = int(nodata_dp, i4)
+      readPer%dend = int(nodata_dp, i4)
+      readper%mend = int(nodata_dp, i4)
+      readper%yend = int(nodata_dp, i4)
+      readPer%Nobs = int(nodata_dp, i4)
     end if
 
     ! evaluate date and timeStep_model_inputs to get read_flag -------
-    read_flag = is_read( iBasin, tt )
+    read_flag = is_read(iBasin, tt)
     !
     ! determine start and end date of chunk to read
-    if ( read_flag ) call chunk_size( iBasin, tt, readPer )
+    if (read_flag) call chunk_size(iBasin, tt, readPer)
     !
   end subroutine chunk_config
   ! ------------------------------------------------------------------
 
   !     NAME
   !         is_read
-  
+
   !     PURPOSE
   !>        \brief evaluate whether new chunk should be read at this timestep
 
@@ -641,77 +643,78 @@ end subroutine chunk_config
   !>        \author Stephan Thober
   !>        \date Jun 2014
   ! ------------------------------------------------------------------
-  function is_read( iBasin, tt )
-    
-    use mo_kind,             only: i4
-    use mo_global_variables, only: simPer, timeStep_model_inputs, timestep, nTstepDay
-    use mo_message,          only: message
-    use mo_julian,           only: caldat
+  function is_read(iBasin, tt)
+
+    use mo_kind, only : i4
+    use mo_global_variables, only : timeStep_model_inputs
+    use mo_common_mhm_mrm_variables, only : timestep, simPer, nTstepDay
+    use mo_message, only : message
+    use mo_julian, only : caldat
 
     ! input variables
     integer(i4), intent(in) :: iBasin ! Basin ID
     integer(i4), intent(in) :: tt     ! timestep
-    
+
     ! return variable
     logical :: is_read
 
     ! local variables
-    integer(i4)             :: Ndays        ! number of simulated days
-    integer(i4)             :: day          ! day
-    integer(i4)             :: month        ! months
-    integer(i4)             :: year         ! years
-    integer(i4)             :: Ndays_before ! number of simulated days one timestep before
-    integer(i4)             :: day_before   ! day one simulated timestep before
-    integer(i4)             :: month_before ! month one simulated timestep before
-    integer(i4)             :: year_before  ! year one simulated timestep before
-    
-    
+    integer(i4) :: Ndays        ! number of simulated days
+    integer(i4) :: day          ! day
+    integer(i4) :: month        ! months
+    integer(i4) :: year         ! years
+    integer(i4) :: Ndays_before ! number of simulated days one timestep before
+    integer(i4) :: day_before   ! day one simulated timestep before
+    integer(i4) :: month_before ! month one simulated timestep before
+    integer(i4) :: year_before  ! year one simulated timestep before
+
+
     ! initialize
-    is_read      = .false.
-    
+    is_read = .false.
+
     ! special case for first timestep
-    if ( tt .eq. 1_i4 ) then
-       is_read = .true.
+    if (tt .eq. 1_i4) then
+      is_read = .true.
     else
-       ! check if a new day started by comparing the day of the current time step (Ndays)
-       ! with the one before (Ndays_before)
-       Ndays        = ceiling( (real(tt,dp)           ) / real(nTstepDay, dp) ) 
-       Ndays_before = ceiling( (real(tt,dp) - 1.0_dp  ) / real(nTstepDay, dp) )   
-       
-       ! evaluate cases of given timeStep_model_inputs
-       select case( timeStep_model_inputs(iBasin) )
-       case(0)  ! only at the beginning of the period
-          if ( tt .eq. 1_i4 ) is_read = .true.
-       case(1:) ! every timestep with frequency timeStep_model_inputs
-          if ( mod( (tt-1) * timestep, timeStep_model_inputs(iBasin) * 24 ) .eq. 0_i4 ) is_read = .true.
-       case(-1) ! every day
-          if ( Ndays .ne. Ndays_before ) is_read = .true.
-       case(-2) ! every month
-          if ( Ndays .ne. Ndays_before ) then
-             ! calculate months
-             call caldat( simPer(iBasin)%julStart + Ndays - 1, dd = day, mm = month, yy = year )
-             call caldat( simPer(iBasin)%julStart + Ndays_before - 1, dd = day_before, mm = month_before, yy = year_before )
-             if ( month .ne. month_before ) is_read = .true.
-          end if
-       case(-3) ! every year
-          if ( Ndays .ne. Ndays_before ) then
-             ! calculate months
-             call caldat( simPer(iBasin)%julStart + Ndays - 1, dd = day, mm = month, yy = year )
-             call caldat( simPer(iBasin)%julStart + Ndays_before - 1, dd = day_before, mm = month_before, yy = year_before )
-             if ( year .ne. year_before ) is_read = .true.
-          end if
-       case default ! not specified correctly
-          call message('ERROR*** mo_meteo_forcings: function is_read: timStep_model_inputs not specified correctly!')
-          stop
-       end select
+      ! check if a new day started by comparing the day of the current time step (Ndays)
+      ! with the one before (Ndays_before)
+      Ndays = ceiling((real(tt, dp)) / real(nTstepDay, dp))
+      Ndays_before = ceiling((real(tt, dp) - 1.0_dp) / real(nTstepDay, dp))
+
+      ! evaluate cases of given timeStep_model_inputs
+      select case(timeStep_model_inputs(iBasin))
+      case(0)  ! only at the beginning of the period
+        if (tt .eq. 1_i4) is_read = .true.
+      case(1 :) ! every timestep with frequency timeStep_model_inputs
+        if (mod((tt - 1) * timestep, timeStep_model_inputs(iBasin) * 24) .eq. 0_i4) is_read = .true.
+      case(-1) ! every day
+        if (Ndays .ne. Ndays_before) is_read = .true.
+      case(-2) ! every month
+        if (Ndays .ne. Ndays_before) then
+          ! calculate months
+          call caldat(simPer(iBasin)%julStart + Ndays - 1, dd = day, mm = month, yy = year)
+          call caldat(simPer(iBasin)%julStart + Ndays_before - 1, dd = day_before, mm = month_before, yy = year_before)
+          if (month .ne. month_before) is_read = .true.
+        end if
+      case(-3) ! every year
+        if (Ndays .ne. Ndays_before) then
+          ! calculate months
+          call caldat(simPer(iBasin)%julStart + Ndays - 1, dd = day, mm = month, yy = year)
+          call caldat(simPer(iBasin)%julStart + Ndays_before - 1, dd = day_before, mm = month_before, yy = year_before)
+          if (year .ne. year_before) is_read = .true.
+        end if
+      case default ! not specified correctly
+        call message('ERROR*** mo_meteo_forcings: function is_read: timStep_model_inputs not specified correctly!')
+        stop
+      end select
     end if
-  
+
   end function is_read
   ! ------------------------------------------------------------------
 
   !     NAME
   !         chunk_size
-  
+
   !     PURPOSE
   !>        \brief calculate beginning and end of read Period, i.e. that
   !>               is length of current chunk to read
@@ -755,73 +758,76 @@ end function is_read
   !>        \date Jun 2014
   !         modified Stephan Thober - Jan 2015 added iBasin
   ! ------------------------------------------------------------------
-  subroutine chunk_size( iBasin, tt, readPer )
-    
-    use mo_kind,             only: i4
-    use mo_global_variables, only: simPer, & !     start and end of simulation period
-         timeStep_model_inputs,            & !     frequency for reading meteo input  
-         period,                           & !     type for describing read in period
-         nTstepDay                           !     Number of time intervals per day
-    use mo_message,          only: message
-    use mo_julian,           only: caldat, julday
-    
+  subroutine chunk_size(iBasin, tt, readPer)
+
+    use mo_kind, only : i4
+    use mo_global_variables, only : &
+            timeStep_model_inputs!,            & !     frequency for reading meteo input
+    use mo_common_mhm_mrm_variables, only : &
+            simPer, & !     start and end of simulation period
+            nTstepDay !     Number of time intervals per day
+    use mo_common_variables, only : &
+            period
+    use mo_message, only : message
+    use mo_julian, only : caldat, julday
+
     implicit none
-    
+
     ! input variables
-    integer(i4), intent(in)  :: tt         ! current time step
-    integer(i4), intent(in)  :: iBasin     ! Basin ID
-    
+    integer(i4), intent(in) :: tt         ! current time step
+    integer(i4), intent(in) :: iBasin     ! Basin ID
+
     ! output variables
-    type(period),intent(out) :: readPer    ! start and end dates of reading Period
+    type(period), intent(out) :: readPer    ! start and end dates of reading Period
 
     ! local variables
-    integer(i4)              :: Ndays        ! number of simulated days
-    integer(i4)              :: day          ! day
-    integer(i4)              :: month        ! months
-    integer(i4)              :: year         ! years
+    integer(i4) :: Ndays        ! number of simulated days
+    integer(i4) :: day          ! day
+    integer(i4) :: month        ! months
+    integer(i4) :: year         ! years
 
     ! calculate date of start date
-    Ndays        =  ceiling( real(tt,dp) / real(nTstepDay,dp) )
+    Ndays = ceiling(real(tt, dp) / real(nTstepDay, dp))
 
     ! get start date
     readPer%julStart = simPer(iBasin)%julStart + Ndays - 1
-    
+
     ! calculate end date according to specified frequency
-    select case ( timeStep_model_inputs(iBasin) )
+    select case (timeStep_model_inputs(iBasin))
     case(0)  ! length of chunk has to cover whole period
-       readPer%julEnd = simPer(iBasin)%julEnd 
-    case(1:) ! every timestep with frequency timeStep_model_inputs
-       readPer%julEnd= readPer%julStart + timeStep_model_inputs(iBasin) - 1
+      readPer%julEnd = simPer(iBasin)%julEnd
+    case(1 :) ! every timestep with frequency timeStep_model_inputs
+      readPer%julEnd = readPer%julStart + timeStep_model_inputs(iBasin) - 1
     case(-1) ! every day
-       readPer%julEnd = readPer%julStart
+      readPer%julEnd = readPer%julStart
     case(-2) ! every month
-       ! calculate date
-       call caldat( simPer(iBasin)%julStart + Ndays, dd = day, mm = month, yy = year )
-       ! increment month
-       if ( month .eq. 12 ) then
-          month = 1
-          year  = year + 1
-       else
-          month = month + 1
-       end if
-       readPer%julEnd = julday( dd = 1, mm = month, yy = year ) - 1
+      ! calculate date
+      call caldat(simPer(iBasin)%julStart + Ndays, dd = day, mm = month, yy = year)
+      ! increment month
+      if (month .eq. 12) then
+        month = 1
+        year = year + 1
+      else
+        month = month + 1
+      end if
+      readPer%julEnd = julday(dd = 1, mm = month, yy = year) - 1
     case(-3) ! every year
-       ! calculate date
-       call caldat( simPer(iBasin)%julStart + Ndays, dd = day, mm = month, yy = year )
-       readPer%julEnd = julday( dd = 31, mm = 12, yy = year )
+      ! calculate date
+      call caldat(simPer(iBasin)%julStart + Ndays, dd = day, mm = month, yy = year)
+      readPer%julEnd = julday(dd = 31, mm = 12, yy = year)
     case default ! not specified correctly
-       call message('ERROR*** mo_meteo_forcings: chunk_size: timStep_model_inputs not specified correctly!')
-       stop
+      call message('ERROR*** mo_meteo_forcings: chunk_size: timStep_model_inputs not specified correctly!')
+      stop
     end select
 
     ! end date should not be greater than end of simulation period
-    readPer%julEnd = min( readPer%julEnd, simPer(iBasin)%julEnd )
-    
+    readPer%julEnd = min(readPer%julEnd, simPer(iBasin)%julEnd)
+
     ! calculate the dates of the start and end dates
-    call caldat( readPer%julStart, dd = readPer%dstart, mm = readPer%mstart, yy = readPer%ystart )
-    call caldat( readPer%julEnd,   dd = readPer%dEnd,   mm = readPer%mend,   yy = readPer%yend   )
-    readPer%Nobs = readPer%julEnd - readPer%julstart + 1    
-    
+    call caldat(readPer%julStart, dd = readPer%dstart, mm = readPer%mstart, yy = readPer%ystart)
+    call caldat(readPer%julEnd, dd = readPer%dEnd, mm = readPer%mend, yy = readPer%yend)
+    readPer%Nobs = readPer%julEnd - readPer%julstart + 1
+
   end subroutine chunk_size
   !
 END MODULE mo_meteo_forcings
diff --git a/src/mHM/mo_mhm.f90 b/src/mHM/mo_mhm.f90
index d3e20a9f..e6d8c847 100644
--- a/src/mHM/mo_mhm.f90
+++ b/src/mHM/mo_mhm.f90
@@ -8,8 +8,6 @@
 !>
 !>          The processes are executed in ascending order. At the moment only
 !>          process 5 and 8 have options.\n
-!>          The MPR technique is only called either if the land cover has been
-!>          changed or for very first time step.\n
 !>
 !>          Currently the following processes are implemented: \n
 !>
@@ -39,9 +37,8 @@
 
 MODULE mo_mHM
 
-  use mo_kind,          only: i4, dp
-  use mo_mhm_constants, only: nodata_dp
-  use mo_message,       only: message
+  use mo_kind, only : i4, dp
+  use mo_message, only : message
   !$ USE omp_lib
 
   IMPLICIT NONE
@@ -123,594 +120,338 @@ MODULE mo_mHM
   !                  Zink M. Demirel C.,              Mar 2017 - added Jarvis soil water stress function at SM process(3)  
   !                  M.Cuneyd Demirel & Simon Stisen  May 2017 - added FC dependency on root fraction coef. at SM process(3)
   !                  M.Cuneyd Demirel & Simon Stisen  Jun 2017 - added PET correction based on LAI at PET process(5)
-  !                                                  
+  !                  Robert Schweppe, Stephan Thober  Nov 2017 - moved call to MPR to mhm_eval
+  !
   ! ------------------------------------------------------------------
 
-  subroutine mHM(  &
-      ! Input -----------------------------------------------------------------
-      ! Configuration
-      perform_mpr,          & ! flag for reading restart files for state variables
-      read_states,          & ! flag indicating whether states have been read
-      fSealedInCity       , & ! sealed area fraction within cities
-      timeStep_LAI_input  , & ! time step of gridded LAI input
-      counter_year        , & ! counter to tackle the change of year
-      counter_month       , & ! counter to tackle the change of month
-      counter_day         , & ! counter to tackle the change of day
-      tt                  , & ! simulation time step
-      time                , & ! current decimal Julian day
-      processMatrix       , & ! mHM process configuration matrix
-      c2TSTu              , & ! unit transformation coefficient
-      horizon_depth       , & ! Depth of each horizon in mHM
-      nCells1             , & ! number of cells in a given basin at level L1
-      nHorizons_mHM       , & ! Number of Horizons in mHM
-      ntimesteps_day      , & ! number of time intervals per day, transformed in dp
-      mask0               , & ! mask 0 for MPR
-      neutron_integral_AFast,&! tabular for neutron flux approximation
-      iflag_soil_option   , & ! flags for handling multiple soil databases      
-      global_parameters   , & ! global mHM parameters
-      ! LUT
-      LCyearId            , & ! mapping of landcover scenes
-      GeoUnitList         , & ! List of Ids for geological units
-      GeoUnitKar          , & ! List of Ids for geological units with Karstic formation
-      LAIUnitList         , & ! List of ids of each LAI class in LAILUT
-      LAILUT              , & ! List of Ids for LAI
-      ! Physiographic L0
-      slope_emp0          , &
-      L0_Latitude         , & ! latitude on level 0
-      cellId0             , & ! cell Ids at level 0
-      soilId0             , & ! soil Ids at level 0
-      L0_LCover_LAI       , & ! land cover ID for LAI estimation
-      LCover0             , & ! land use cover at level 0
-      Asp0                , & ! [degree] Aspect at Level 0
-      LAI0                , & ! LAI at level 0
-      geoUnit0            , & ! geological units at level 0
-      SDB_is_present      , & ! indicates whether soiltype exists
-      SDB_nHorizons       , & ! Number of Horizons per soiltype
-      SDB_nTillHorizons   , & ! Number of Tillage Horizons
-      SDB_sand            , & ! sand content from LUT
-      SDB_clay            , & ! clay content from LUT
-      SDB_DbM             , & ! mineral Bulk density from LUT
-      SDB_Wd              , & ! soil weighing vertical column of mHM
-      SDB_RZdepth         , & ! soil depth from LUT
-      ! Physiographic L1
-      nTCells0_inL1       , & ! total number of valid L0 cells in a given L1 cell
-      L0upBound_inL1      , & ! upper row of L0 block within L1 cell
-      L0downBound_inL1    , & ! lower row of L0 block within L1 cell
-      L0leftBound_inL1    , & ! left column of L0 block within L1 cell
-      L0rightBound_inL1   , & ! right column of L0 block within L1 cell
-      latitude            , & ! latitude on level 1
-      ! Forcings
-      evap_coeff          , & ! Evaporation coefficent for free-water surface of that current month
-      fday_prec           , & ! [-] day ratio precipitation < 1
-      fnight_prec         , & ! [-] night ratio precipitation < 1
-      fday_pet            , & ! [-] day ratio PET  < 1
-      fnight_pet          , & ! [-] night ratio PET  < 1
-      fday_temp           , & ! [-] day factor mean temp
-      fnight_temp         , & ! [-] night factor mean temp
-      temp_weights        , & ! multiplicative weights for temperature (deg K)
-      pet_weights         , & ! multiplicative weights for potential evapotranspiration
-      pre_weights         , & ! multiplicative weights for precipitation
-      read_meteo_weights  , & ! flag whether weights for tavg and pet have read and should be used
-      pet_in              , & ! [mm d-1] Daily potential evapotranspiration (input)
-      tmin_in             , & ! [degc]   Daily minimum temperature
-      tmax_in             , & ! [degc]   Daily maxumum temperature
-      netrad_in           , & ! [w m2]   Daily average net radiation
-      absvappres_in       , & ! [Pa]     Daily average absolute vapour pressure
-      windspeed_in        , & ! [m s-1]  Daily average wind speed
-      prec_in             , & ! [mm d-1] Daily mean precipitation
-      temp_in             , & ! [degc]   Daily average temperature
-      ! In-Out -----------------------------------------------------------------
-      ! Configuration
-      yId                 , & ! Current Id of the LCover year scene
-      ! Land cover L1 and L11
-      fForest1            , & ! fraction of forest cover at scale L1
-      fPerm1              , & ! fraction of permeable area at scale L1
-      fSealed1            , & ! fraction of sealed area at scale L1
-      ! States
-      interc              , & ! Interception
-      snowpack            , & ! Snowpack
-      sealedStorage       , & ! Retention storage of impervious areas
-      soilMoisture        , & ! Soil moisture of each horizon
-      unsatStorage        , & ! Upper soil storage
-      satStorage          , & ! Groundwater storage
-      neutrons            , & ! Ground albedo neutrons
-      ! Fluxes L1
-      pet_calc            , & ! [mm TST-1] estimated PET (if PET is input = corrected values (fAsp*PET))
-      aet_soil            , & ! actual ET
-      aet_canopy          , & ! Real evaporation intensity from canopy
-      aet_sealed          , & ! Actual ET from free-water surfaces
-      baseflow            , & ! Baseflow
-      infiltration        , & ! Recharge, infiltration intensity or effective precipitation of each horizon
-      fast_interflow      , & ! Fast runoff component
-      melt                , & ! Melting snow depth
-      perc                , & ! Percolation
-      prec_effect         , & ! Effective precipitation depth (snow melt + rain)
-      rain                , & ! Rain precipitation depth
-      runoff_sealed       , & ! Direct runoff from impervious areas
-      slow_interflow      , & ! Slow runoff component
-      snow                , & ! Snow precipitation depth
-      throughfall         , & ! Throughfall
-      total_runoff        , & ! Generated runoff
-      ! Effective Parameters
-      alpha               , & ! Exponent for the upper reservoir
-      deg_day_incr        , & ! Increase of the Degree-day factor per mm of increase in precipitation
-      deg_day_max         , & ! Maximum Degree-day factor
-      deg_day_noprec      , & ! Degree-day factor with no precipitation
-      deg_day             , & ! Degree-day factor
-      fAsp                , & ! [1]     PET correction for Aspect at level 1
-      petLAIcorFactorL1   , & ! PET correction factor based on LAI at level 1    
-      HarSamCoeff         , & ! [1]     PET Hargreaves Samani coefficient at level 1
-      PrieTayAlpha        , & ! [1]     PET Priestley Taylor coefficient at level 1
-      aeroResist          , & ! [s m-1] PET aerodynamical resitance at level 1
-      surfResist          , & ! [s m-1] PET bulk surface resitance at level 1
-      frac_roots          , & ! Fraction of Roots in soil horizon
-      interc_max          , & ! Maximum interception
-      karst_loss          , & ! Karstic percolation loss
-      k0                  , & ! Recession coefficient of the upper reservoir, upper outlet
-      k1                  , & ! Recession coefficient of the upper reservoir, lower outlet
-      k2                  , & ! Baseflow recession coefficient
-      kp                  , & ! Percolation coefficient
-      soil_moist_FC       , & ! Soil moisture below which actual ET is reduced
-      soil_moist_sat      , & ! Saturation soil moisture for each horizon [mm]
-      soil_moist_exponen  , & ! Exponential parameter to how non-linear is the soil water retention
-      jarvis_thresh_c1    , & ! jarvis critical value for normalized soil water content
-      temp_thresh         , & ! Threshold temperature for snow/rain
-      unsat_thresh        , & ! Threshold water depth in upper reservoir
-      water_thresh_sealed , & ! Threshold water depth in impervious areas
-      wilting_point         ) ! Permanent wilting point for each horizon
+  subroutine mHM(&
+          ! Input -----------------------------------------------------------------
+          ! Configuration
+          read_states, & ! flag indicating whether states have been read
+          tt, & ! simulation time step
+          time, & ! current decimal Julian day
+          processMatrix, & ! mHM process configuration matrix
+          horizon_depth, & ! Depth of each horizon in mHM
+          nCells1, & ! number of cells in a given basin at level L1
+          nHorizons_mHM, & ! Number of Horizons in mHM
+          ntimesteps_day, & ! number of time intervals per day, transformed in dp
+          neutron_integral_AFast, &! tabular for neutron flux approximation
+          global_parameters, & ! global mHM parameters
+          ! Physiographic L1
+          latitude, & ! latitude on level 1
+          ! Forcings
+          evap_coeff, & ! Evaporation coefficent for free-water surface of that current month
+          fday_prec, & ! [-] day ratio precipitation < 1
+          fnight_prec, & ! [-] night ratio precipitation < 1
+          fday_pet, & ! [-] day ratio PET  < 1
+          fnight_pet, & ! [-] night ratio PET  < 1
+          fday_temp, & ! [-] day factor mean temp
+          fnight_temp, & ! [-] night factor mean temp
+          temp_weights, & ! multiplicative weights for temperature (deg K)
+          pet_weights, & ! multiplicative weights for potential evapotranspiration
+          pre_weights, & ! multiplicative weights for precipitation
+          read_meteo_weights, & ! flag whether weights for tavg and pet have read and should be used
+          pet_in, & ! [mm d-1] Daily potential evapotranspiration (input)
+          tmin_in, & ! [degc]   Daily minimum temperature
+          tmax_in, & ! [degc]   Daily maxumum temperature
+          netrad_in, & ! [w m2]   Daily average net radiation
+          absvappres_in, & ! [Pa]     Daily average absolute vapour pressure
+          windspeed_in, & ! [m s-1]  Daily average wind speed
+          prec_in, & ! [mm d-1] Daily mean precipitation
+          temp_in, & ! [degc]   Daily average temperature
+          ! In-Out -----------------------------------------------------------------
+          fSealed1, & ! fraction of sealed area at scale L1
+          ! States
+          interc, & ! Interception
+          snowpack, & ! Snowpack
+          sealedStorage, & ! Retention storage of impervious areas
+          soilMoisture, & ! Soil moisture of each horizon
+          unsatStorage, & ! Upper soil storage
+          satStorage, & ! Groundwater storage
+          neutrons, & ! Ground albedo neutrons
+          ! Fluxes L1
+          pet_calc, & ! [mm TST-1] estimated PET (if PET is input = corrected values (fAsp*PET))
+          aet_soil, & ! actual ET
+          aet_canopy, & ! Real evaporation intensity from canopy
+          aet_sealed, & ! Actual ET from free-water surfaces
+          baseflow, & ! Baseflow
+          infiltration, & ! Recharge, infiltration intensity or effective precipitation of each horizon
+          fast_interflow, & ! Fast runoff component
+          melt, & ! Melting snow depth
+          perc, & ! Percolation
+          prec_effect, & ! Effective precipitation depth (snow melt + rain)
+          rain, & ! Rain precipitation depth
+          runoff_sealed, & ! Direct runoff from impervious areas
+          slow_interflow, & ! Slow runoff component
+          snow, & ! Snow precipitation depth
+          throughfall, & ! Throughfall
+          total_runoff, & ! Generated runoff
+          ! Effective Parameters
+          alpha, & ! Exponent for the upper reservoir
+          deg_day_incr, & ! Increase of the Degree-day factor per mm of increase in precipitation
+          deg_day_max, & ! Maximum Degree-day factor
+          deg_day_noprec, & ! Degree-day factor with no precipitation
+          deg_day, & ! Degree-day factor
+          fAsp, & ! [1]     PET correction for Aspect at level 1
+          petLAIcorFactorL1, & ! PET correction factor based on LAI at level 1
+          HarSamCoeff, & ! [1]     PET Hargreaves Samani coefficient at level 1
+          PrieTayAlpha, & ! [1]     PET Priestley Taylor coefficient at level 1
+          aeroResist, & ! [s m-1] PET aerodynamical resitance at level 1
+          surfResist, & ! [s m-1] PET bulk surface resitance at level 1
+          frac_roots, & ! Fraction of Roots in soil horizon
+          interc_max, & ! Maximum interception
+          karst_loss, & ! Karstic percolation loss
+          k0, & ! Recession coefficient of the upper reservoir, upper outlet
+          k1, & ! Recession coefficient of the upper reservoir, lower outlet
+          k2, & ! Baseflow recession coefficient
+          kp, & ! Percolation coefficient
+          soil_moist_FC, & ! Soil moisture below which actual ET is reduced
+          soil_moist_sat, & ! Saturation soil moisture for each horizon [mm]
+          soil_moist_exponen, & ! Exponential parameter to how non-linear is the soil water retention
+          jarvis_thresh_c1, & ! jarvis critical value for normalized soil water content
+          temp_thresh, & ! Threshold temperature for snow/rain
+          unsat_thresh, & ! Threshold water depth in upper reservoir
+          water_thresh_sealed, & ! Threshold water depth in impervious areas
+          wilting_point         & ! Permanent wilting point for each horizon
+          )
     ! subroutines required to estimate variables prior to the MPR call
-    use mo_upscaling_operators,     only: L0_fractionalCover_in_Lx         ! land cover fraction
-    use mo_multi_param_reg,         only: mpr,canopy_intercept_param       ! reg. and scaling
-    use mo_pet,                     only: pet_hargreaves, pet_priestly,  & ! calc. of pot. evapotranspiration
-                                          pet_penman
-    use mo_Temporal_Disagg_Forcing, only: Temporal_Disagg_Forcing
-    use mo_canopy_interc ,          only: canopy_interc
-    use mo_snow_accum_melt,         only: snow_accum_melt
-    use mo_soil_moisture,           only: soil_moisture
-    use mo_neutrons,                only: DesiletsN0, COSMIC
-    use mo_runoff,                  only: runoff_unsat_zone
-    use mo_runoff,                  only: runoff_sat_zone, L1_total_runoff
-    use mo_julian,                  only: dec2date, date2dec
-    use mo_string_utils,            only: num2str
-    use mo_mhm_constants,           only: HarSamConst ! parameters for Hargreaves-Samani Equation
-    use mo_mpr_pet,                 only: pet_correctbyLAI
+    use mo_pet, only : pet_hargreaves, pet_priestly, & ! calc. of pot. evapotranspiration
+            pet_penman
+    use mo_Temporal_Disagg_Forcing, only : Temporal_Disagg_Forcing
+    use mo_canopy_interc, only : canopy_interc
+    use mo_snow_accum_melt, only : snow_accum_melt
+    use mo_soil_moisture, only : soil_moisture
+    use mo_neutrons, only : DesiletsN0, COSMIC
+    use mo_runoff, only : runoff_unsat_zone
+    use mo_runoff, only : runoff_sat_zone, L1_total_runoff
+    use mo_julian, only : dec2date, date2dec
+    use mo_string_utils, only : num2str
+    use mo_mhm_constants, only : HarSamConst ! parameters for Hargreaves-Samani Equation
 
     implicit none
 
     ! Intent
-    logical,                     intent(in) :: perform_mpr          ! flag for reading restart files for state variables
-    logical,                     intent(in) :: read_states          ! indicated whether states have been read from file
-    real(dp),                    intent(in) :: fSealedInCity        ! fraction of perfectly sealed area within cities
-    integer(i4),                 intent(in) :: timeStep_LAI_input   ! time step of gridded LAI input
-    integer(i4),                 intent(in) :: counter_year         ! counter to tackle the change of year
-    integer(i4),                 intent(in) :: counter_month        ! counter to tackle the change of month
-    integer(i4),                 intent(in) :: counter_day          ! counter to tackle the change of day
-    integer(i4),                 intent(in) :: tt
-    real(dp),                    intent(in) :: time
-    integer(i4), dimension(:,:), intent(in) :: processMatrix
-    real(dp),                    intent(in) :: c2TSTu
-    real(dp),    dimension(:),   intent(in) :: horizon_depth
-    integer(i4),                 intent(in) :: nCells1
-    integer(i4),                 intent(in) :: nHorizons_mHM
-    real(dp),                    intent(in) :: ntimesteps_day
-    logical,     dimension(:,:), intent(in) :: mask0
-    real(dp),    dimension(:),   intent(in) :: neutron_integral_AFast
-    integer(i4),                 intent(in) :: iflag_soil_option                
-    real(dp),    dimension(:),   intent(in) :: global_parameters
-
-    ! LUT
-    integer(i4),                   intent(in) :: LCyearId
-    integer(i4), dimension(:),     intent(in) :: GeoUnitList
-    integer(i4), dimension(:),     intent(in) :: GeoUnitKar
-    integer(i4), dimension(:),     intent(in) :: LAIUnitList
-    real(dp),    dimension(:,:),   intent(in) :: LAILUT
-
-    ! Physiographic L0
-    real(dp),    dimension(:),     intent(in) :: slope_emp0
-    real(dp),    dimension(:),     intent(in) :: l0_latitude ! l1 ids of l0 cells
-    integer(i4), dimension(:),     intent(in) :: cellId0
-    integer(i4), dimension(:,:),   intent(in) :: soilId0
-    integer(i4), dimension(:),     intent(in) :: L0_LCover_LAI
-    integer(i4), dimension(:),     intent(in) :: LCover0
-    real(dp),    dimension(:),     intent(in) :: Asp0
-    real(dp),    dimension(:),     intent(in) :: LAI0
-    integer(i4), dimension(:),     intent(in) :: geoUnit0
-
-    integer(i4), dimension(:),     intent(in) :: SDB_is_present
-    integer(i4), dimension(:),     intent(in) :: SDB_nHorizons
-    integer(i4), dimension(:),     intent(in) :: SDB_nTillHorizons
-    real(dp),    dimension(:,:),   intent(in) :: SDB_sand
-    real(dp),    dimension(:,:),   intent(in) :: SDB_clay
-    real(dp),    dimension(:,:),   intent(in) :: SDB_DbM
-    real(dp),    dimension(:,:,:), intent(in) :: SDB_Wd
-    real(dp),    dimension(:),     intent(in) :: SDB_RZdepth
+    logical, intent(in) :: read_states          ! indicated whether states have been read from file
+    integer(i4), intent(in) :: tt
+    real(dp), intent(in) :: time
+    integer(i4), dimension(:, :), intent(in) :: processMatrix
+    real(dp), dimension(:), intent(in) :: horizon_depth
+    integer(i4), intent(in) :: nCells1
+    integer(i4), intent(in) :: nHorizons_mHM
+    real(dp), intent(in) :: ntimesteps_day
+    real(dp), dimension(:), intent(in) :: neutron_integral_AFast
+    real(dp), dimension(:), intent(in) :: global_parameters
 
     ! Physiographic L1
-    integer(i4), dimension(:),     intent(in) :: nTCells0_inL1
-    integer(i4), dimension(:),     intent(in) :: L0upBound_inL1
-    integer(i4), dimension(:),     intent(in) :: L0downBound_inL1
-    integer(i4), dimension(:),     intent(in) :: L0leftBound_inL1
-    integer(i4), dimension(:),     intent(in) :: L0rightBound_inL1
-    real(dp),    dimension(:),     intent(in) :: latitude
+    real(dp), dimension(:), intent(in) :: latitude
 
     ! Forcings
-    real(dp),    dimension(:),     intent(in) :: evap_coeff
-    real(dp),    dimension(:),     intent(in) :: fday_prec
-    real(dp),    dimension(:),     intent(in) :: fnight_prec
-    real(dp),    dimension(:),     intent(in) :: fday_pet
-    real(dp),    dimension(:),     intent(in) :: fnight_pet
-    real(dp),    dimension(:),     intent(in) :: fday_temp
-    real(dp),    dimension(:),     intent(in) :: fnight_temp
-    real(dp),    dimension(:,:,:), intent(in) :: temp_weights
-    real(dp),    dimension(:,:,:), intent(in) :: pet_weights
-    real(dp),    dimension(:,:,:), intent(in) :: pre_weights
-    logical,                       intent(in) :: read_meteo_weights
-    real(dp),    dimension(:),     intent(in) :: pet_in
-    real(dp),    dimension(:),     intent(in) :: tmin_in
-    real(dp),    dimension(:),     intent(in) :: tmax_in
-    real(dp),    dimension(:),     intent(in) :: netrad_in
-    real(dp),    dimension(:),     intent(in) :: absvappres_in
-    real(dp),    dimension(:),     intent(in) :: windspeed_in
-    real(dp),    dimension(:),     intent(in) :: prec_in
-    real(dp),    dimension(:),     intent(in) :: temp_in
-
-    ! Configuration
-    integer(i4),                   intent(inout) ::  yId
-
-    ! Land cover L1 and
-    real(dp), dimension(:),        intent(inout) :: fForest1
-    real(dp), dimension(:),        intent(inout) :: fPerm1
-    real(dp), dimension(:),        intent(inout) :: fSealed1
+    real(dp), dimension(:), intent(in) :: evap_coeff
+    real(dp), dimension(:), intent(in) :: fday_prec
+    real(dp), dimension(:), intent(in) :: fnight_prec
+    real(dp), dimension(:), intent(in) :: fday_pet
+    real(dp), dimension(:), intent(in) :: fnight_pet
+    real(dp), dimension(:), intent(in) :: fday_temp
+    real(dp), dimension(:), intent(in) :: fnight_temp
+    real(dp), dimension(:, :, :), intent(in) :: temp_weights
+    real(dp), dimension(:, :, :), intent(in) :: pet_weights
+    real(dp), dimension(:, :, :), intent(in) :: pre_weights
+    logical, intent(in) :: read_meteo_weights
+    real(dp), dimension(:), intent(in) :: pet_in
+    real(dp), dimension(:), intent(in) :: tmin_in
+    real(dp), dimension(:), intent(in) :: tmax_in
+    real(dp), dimension(:), intent(in) :: netrad_in
+    real(dp), dimension(:), intent(in) :: absvappres_in
+    real(dp), dimension(:), intent(in) :: windspeed_in
+    real(dp), dimension(:), intent(in) :: prec_in
+    real(dp), dimension(:), intent(in) :: temp_in
 
     ! States
-    real(dp),  dimension(:),       intent(inout) :: interc
-    real(dp),  dimension(:),       intent(inout) :: snowpack
-    real(dp),  dimension(:),       intent(inout) :: sealedStorage
-    real(dp),  dimension(:,:),     intent(inout) :: soilMoisture
-    real(dp),  dimension(:),       intent(inout) :: unsatStorage
-    real(dp),  dimension(:),       intent(inout) :: satStorage
-    real(dp),  dimension(:),       intent(inout) :: neutrons
+    real(dp), dimension(:), intent(inout) :: fSealed1
+
+    real(dp), dimension(:), intent(inout) :: interc
+    real(dp), dimension(:), intent(inout) :: snowpack
+    real(dp), dimension(:), intent(inout) :: sealedStorage
+    real(dp), dimension(:, :), intent(inout) :: soilMoisture
+    real(dp), dimension(:), intent(inout) :: unsatStorage
+    real(dp), dimension(:), intent(inout) :: satStorage
+    real(dp), dimension(:), intent(inout) :: neutrons
 
     ! Fluxes L1
-    real(dp),  dimension(:),       intent(inout) :: pet_calc
-    real(dp),  dimension(:,:),     intent(inout) :: aet_soil
-    real(dp),  dimension(:),       intent(inout) :: aet_canopy
-    real(dp),  dimension(:),       intent(inout) :: aet_sealed
-    real(dp),  dimension(:),       intent(inout) :: baseflow
-    real(dp),  dimension(:,:),     intent(inout) :: infiltration
-    real(dp),  dimension(:),       intent(inout) :: fast_interflow
-    real(dp),  dimension(:),       intent(inout) :: melt
-    real(dp),  dimension(:),       intent(inout) :: perc
-    real(dp),  dimension(:),       intent(inout) :: prec_effect
-    real(dp),  dimension(:),       intent(inout) :: rain
-    real(dp),  dimension(:),       intent(inout) :: runoff_sealed
-    real(dp),  dimension(:),       intent(inout) :: slow_interflow
-    real(dp),  dimension(:),       intent(inout) :: snow
-    real(dp),  dimension(:),       intent(inout) :: throughfall
-    real(dp),  dimension(:),       intent(inout) :: total_runoff
+    real(dp), dimension(:), intent(inout) :: pet_calc
+    real(dp), dimension(:, :), intent(inout) :: aet_soil
+    real(dp), dimension(:), intent(inout) :: aet_canopy
+    real(dp), dimension(:), intent(inout) :: aet_sealed
+    real(dp), dimension(:), intent(inout) :: baseflow
+    real(dp), dimension(:, :), intent(inout) :: infiltration
+    real(dp), dimension(:), intent(inout) :: fast_interflow
+    real(dp), dimension(:), intent(inout) :: melt
+    real(dp), dimension(:), intent(inout) :: perc
+    real(dp), dimension(:), intent(inout) :: prec_effect
+    real(dp), dimension(:), intent(inout) :: rain
+    real(dp), dimension(:), intent(inout) :: runoff_sealed
+    real(dp), dimension(:), intent(inout) :: slow_interflow
+    real(dp), dimension(:), intent(inout) :: snow
+    real(dp), dimension(:), intent(inout) :: throughfall
+    real(dp), dimension(:), intent(inout) :: total_runoff
 
     ! Effective Parameters
-    real(dp), dimension(:),        intent(inout) ::  alpha
-    real(dp), dimension(:),        intent(inout) ::  deg_day_incr
-    real(dp), dimension(:),        intent(inout) ::  deg_day_max
-    real(dp), dimension(:),        intent(inout) ::  deg_day_noprec
-    real(dp), dimension(:),        intent(inout) ::  deg_day
-    real(dp), dimension(:),        intent(inout) ::  fAsp
-    real(dp), dimension(:),        intent(inout) ::  petLAIcorFactorL1
-    real(dp), dimension(:),        intent(inout) ::  HarSamCoeff
-    real(dp), dimension(:,:),      intent(inout) ::  PrieTayAlpha
-    real(dp), dimension(:,:),      intent(inout) ::  aeroResist
-    real(dp), dimension(:,:),      intent(inout) ::  surfResist
-    real(dp), dimension(:,:),      intent(inout) ::  frac_roots
-    real(dp), dimension(:),        intent(inout) ::  interc_max
-    real(dp), dimension(:),        intent(inout) ::  karst_loss
-    real(dp), dimension(:),        intent(inout) ::  k0
-    real(dp), dimension(:),        intent(inout) ::  k1
-    real(dp), dimension(:),        intent(inout) ::  k2
-    real(dp), dimension(:),        intent(inout) ::  kp
-    real(dp), dimension(:,:),      intent(inout) ::  soil_moist_FC
-    real(dp), dimension(:,:),      intent(inout) ::  soil_moist_sat
-    real(dp), dimension(:,:),      intent(inout) ::  soil_moist_exponen
-    real(dp), dimension(:),        intent(inout) ::  jarvis_thresh_c1
-    real(dp), dimension(:),        intent(inout) ::  temp_thresh
-    real(dp), dimension(:),        intent(inout) ::  unsat_thresh
-    real(dp), dimension(:),        intent(inout) ::  water_thresh_sealed
-    real(dp), dimension(:,:),      intent(inout) ::  wilting_point
+    real(dp), dimension(:), intent(inout) :: alpha
+    real(dp), dimension(:), intent(inout) :: deg_day_incr
+    real(dp), dimension(:), intent(inout) :: deg_day_max
+    real(dp), dimension(:), intent(inout) :: deg_day_noprec
+    real(dp), dimension(:), intent(inout) :: deg_day
+    real(dp), dimension(:), intent(inout) :: fAsp
+    real(dp), dimension(:), intent(inout) :: petLAIcorFactorL1
+    real(dp), dimension(:), intent(inout) :: HarSamCoeff
+    real(dp), dimension(:), intent(inout) :: PrieTayAlpha
+    real(dp), dimension(:), intent(inout) :: aeroResist
+    real(dp), dimension(:), intent(inout) :: surfResist
+    real(dp), dimension(:, :), intent(inout) :: frac_roots
+    real(dp), dimension(:), intent(inout) :: interc_max
+    real(dp), dimension(:), intent(inout) :: karst_loss
+    real(dp), dimension(:), intent(inout) :: k0
+    real(dp), dimension(:), intent(inout) :: k1
+    real(dp), dimension(:), intent(inout) :: k2
+    real(dp), dimension(:), intent(inout) :: kp
+    real(dp), dimension(:, :), intent(inout) :: soil_moist_FC
+    real(dp), dimension(:, :), intent(inout) :: soil_moist_sat
+    real(dp), dimension(:, :), intent(inout) :: soil_moist_exponen
+    real(dp), dimension(:), intent(inout) :: jarvis_thresh_c1
+    real(dp), dimension(:), intent(inout) :: temp_thresh
+    real(dp), dimension(:), intent(inout) :: unsat_thresh
+    real(dp), dimension(:), intent(inout) :: water_thresh_sealed
+    real(dp), dimension(:, :), intent(inout) :: wilting_point
 
     ! local
-    logical                :: isday       ! is day or night
-    integer(i4)            :: hour        ! current hour of a given day
-    integer(i4)            :: day         ! day of the month     [1-28 or 1-29 or 1-30 or 1-31]
-    integer(i4)            :: month       ! Month of current day [1-12]
-    integer(i4)            :: year        ! year
-    integer(i4)            :: doy         ! doy of the year [1-365 or 1-366]
-    integer(i4)            :: k           ! cell index
-    integer(i4)            :: iStart, iEnd 
-    real(dp)               :: pet         !
-    real(dp)               :: prec        !
-    real(dp)               :: temp        !
+    logical :: isday       ! is day or night
+    integer(i4) :: hour        ! current hour of a given day
+    integer(i4) :: day         ! day of the month     [1-28 or 1-29 or 1-30 or 1-31]
+    integer(i4) :: month       ! Month of current day [1-12]
+    integer(i4) :: year        ! year
+    integer(i4) :: doy         ! doy of the year [1-365 or 1-366]
+    integer(i4) :: k           ! cell index
+    real(dp) :: pet         !
+    real(dp) :: prec        !
+    real(dp) :: temp        !
 
     ! temporary arrays so that inout of routines is contiguous array
-    real(dp), dimension(size(infiltration,2)) :: tmp_infiltration
-    real(dp), dimension(size(soilMoisture,2)) :: tmp_soilMoisture
-    real(dp), dimension(size(aet_soil,2))     :: tmp_aet_soil
+    real(dp), dimension(size(infiltration, 2)) :: tmp_infiltration
+    real(dp), dimension(size(soilMoisture, 2)) :: tmp_soilMoisture
+    real(dp), dimension(size(aet_soil, 2)) :: tmp_aet_soil
 
     !-------------------------------------------------------------------
     ! date and month of this timestep
     !-------------------------------------------------------------------
-    call dec2date(time, yy=year, mm=month, dd=day, hh=hour)
-
-   !-------------------------------------------------------------------
-    ! MPR CALL
-    !   -> call only when LC had changed
-    !   -> or for very first time step
-    !
-    ! Variables required prior to the MPR call:
-    ! 1) LC fractions
-    !      --> time independent variable: to be initalized every time
-    !          with landcover change
-    ! 2) Impervious area fraction in flood plains
-    !      --> time independent variable: to be initalized every time
-    !          with landcover change
-    !-------------------------------------------------------------------
-    if( (LCyearId .NE. yId) .or. (tt .EQ. 1) ) then
-
-       ! abort if land cover change is there and mpr is switched off
-       if ( (tt .ne. 1) .and. (.not. perform_mpr) ) then
-          call message()
-          call message('***ERROR: land cover change detected and mpr is switched off!')
-          stop
-       end if
-
-        ! update yId to keep track of LC change
-        yId = LCyearId
-
-        ! estimate land cover fractions for dominant landcover class
-        ! --> time independent variable: to be initalized every time
-        !     with landcover change
-        fForest1(:) = L0_fractionalCover_in_Lx( LCover0, 1, mask0, &
-                                                L0upBound_inL1,    &
-                                                L0downBound_inL1,  &
-                                                L0leftBound_inL1,  &
-                                                L0rightBound_inL1, &
-                                                nTCells0_inL1      )
-        fSealed1(:) = L0_fractionalCover_in_Lx( LCover0, 2, mask0, &
-                                                L0upBound_inL1,    &
-                                                L0downBound_inL1,  &
-                                                L0leftBound_inL1,  &
-                                                L0rightBound_inL1, &
-                                                nTCells0_inL1      )
-        fPerm1(:)   = L0_fractionalCover_in_Lx( LCover0, 3, mask0, &
-                                                L0upBound_inL1,    &
-                                                L0downBound_inL1,  &
-                                                L0leftBound_inL1,  &
-                                                L0rightBound_inL1, &
-                                                nTCells0_inL1      )
-        !---------------------------------------------------------
-        ! Update fractions of sealed area fractions
-        ! based on the sealing fraction[0-1] in cities
-        !---------------------------------------------------------
-        fSealed1(:) = fSealedInCity*fSealed1(:)
-        fPerm1(:)   = fPerm1(:) + (1.0_dp - fSealedInCity)*fSealed1(:)
-
-        ! to make sure everything happens smoothly
-        fForest1(:) = fForest1(:) / ( fForest1(:) + fSealed1(:)  + fPerm1(:) )
-        fSealed1(:) = fSealed1(:) / ( fForest1(:) + fSealed1(:)  + fPerm1(:) )
-        fPerm1(:)   = fPerm1(:)   / ( fForest1(:) + fSealed1(:)  + fPerm1(:) )
-
-        !-------------------------------------------------------------------
-        ! NOW call MPR
-        !-------------------------------------------------------------------
-        if ( perform_mpr ) then
-           call mpr( processMatrix, iflag_soil_option, global_parameters(:), nodata_dp,   &
-                mask0, geoUnit0, GeoUnitList, GeoUnitKar, LAILUT, LAIUnitList,            &
-                SDB_is_present, SDB_nHorizons,                                            &
-                SDB_nTillHorizons, SDB_sand, SDB_clay, SDB_DbM, SDB_Wd, SDB_RZdepth,      &
-                nHorizons_mHM, horizon_depth, c2TSTu, fForest1, fSealed1, fPerm1,         &
-                soilId0, Asp0, L0_LCover_LAI, LCover0,                                    &
-                slope_emp0, cellId0,                                                      &
-                L0upBound_inL1, L0downBound_inL1, L0leftBound_inL1,                       &
-                L0rightBound_inL1, nTCells0_inL1, l0_latitude,                            &
-                alpha, deg_day_incr, deg_day_max, deg_day_noprec,                         &
-                fAsp, HarSamCoeff(:), PrieTayAlpha(:,:), aeroResist(:,:),                 &
-                surfResist(:,:), frac_roots, k0, k1, k2, kp, karst_loss,                  &
-                soil_moist_FC, soil_moist_sat, soil_moist_exponen, jarvis_thresh_c1(:),   &
-                temp_thresh, unsat_thresh, water_thresh_sealed, wilting_point            )
-        end if
-    
-        !-------------------------------------------------------------------
-        ! Update the inital states of soil water content for the first time
-        ! step and when perform_mpr = FALSE
-        ! based on the half of the derived values of Field capacity
-        ! other states are kept at their inital values
-        !-------------------------------------------------------------------
-        if( (tt .EQ. 1) .AND. ( .not. read_states ) ) then
-          soilMoisture(:,:) = 0.5_dp*soil_moist_FC(:,:)
-        end if
-
-    end if
+    call dec2date(time, yy = year, mm = month, dd = day, hh = hour)
 
     !-------------------------------------------------------------------
-    ! CALL regionalization of parameters related to LAI
-    ! IT is now outside of mHM since LAI is now dynamic variable
+    ! Update the inital states of soil water content for the first time
+    ! step and when perform_mpr = FALSE
+    ! based on the half of the derived values of Field capacity
+    ! other states are kept at their inital values
     !-------------------------------------------------------------------
-    select case(timeStep_LAI_input)
-    case(0:1) ! in both case of option with 0 and 1
-       ! Estimate max. intecept. capacity based on long term monthly mean LAI values
-       ! Max. interception is updated every month rather than every day
-       if( (tt .EQ. 1) .OR. (month .NE. counter_month) ) then
-          call canopy_intercept_param( processMatrix, global_parameters(:), &
-               LAI0, nTCells0_inL1, L0upBound_inL1, &
-               L0downBound_inL1, L0leftBound_inL1,  &
-               L0rightBound_inL1, cellId0, mask0,   &
-               nodata_dp,  interc_max               )
-
-          if (processMatrix(5,1) == -1) then 
-             iStart = processMatrix(5,3) - processMatrix(5,2) + 1
-             iEnd   = processMatrix(5,3)  
-
-             call pet_correctbyLAI(global_parameters(iStart:iEnd), nodata_dp, LCOVER0, LAI0, mask0, cellId0, &
-                  L0upBound_inL1, L0downBound_inL1, L0leftBound_inL1, L0rightBound_inL1, nTCells0_inL1, petLAIcorFactorL1)
-          end if
-       end if
-       ! Estimate max. inteception based on daily LAI values
-    case(-1) ! daily
-       if ( (tt .EQ. 1) .OR. (day .NE. counter_day) ) then
-          call canopy_intercept_param( processMatrix, global_parameters(:), &
-               LAI0, nTCells0_inL1, L0upBound_inL1, &
-               L0downBound_inL1, L0leftBound_inL1,  &
-               L0rightBound_inL1, cellId0, mask0,   &
-               nodata_dp,  interc_max               )
-
-          if (processMatrix(5,1) == -1) then 
-             iStart = processMatrix(5,3) - processMatrix(5,2) + 1
-             iEnd   = processMatrix(5,3)  
-
-             call pet_correctbyLAI(global_parameters(iStart:iEnd), nodata_dp, LCOVER0, LAI0, mask0, cellId0, &
-                  L0upBound_inL1, L0downBound_inL1, L0leftBound_inL1, L0rightBound_inL1, nTCells0_inL1, petLAIcorFactorL1)
-          end if
-       end if
-    case(-2) ! monthly
-       if ( (tt .EQ. 1) .OR. (month .NE. counter_month) ) then
-          call canopy_intercept_param( processMatrix, global_parameters(:), &
-               LAI0, nTCells0_inL1, L0upBound_inL1, &
-               L0downBound_inL1, L0leftBound_inL1,  &
-               L0rightBound_inL1, cellId0, mask0,   &
-               nodata_dp,  interc_max               )
-
-          if (processMatrix(5,1) == -1) then 
-             iStart = processMatrix(5,3) - processMatrix(5,2) + 1
-             iEnd   = processMatrix(5,3)  
-
-             call pet_correctbyLAI(global_parameters(iStart:iEnd), nodata_dp, LCOVER0, LAI0, mask0, cellId0, &
-                  L0upBound_inL1, L0downBound_inL1, L0leftBound_inL1, L0rightBound_inL1, nTCells0_inL1, petLAIcorFactorL1)
-          end if
-       end if
-    case(-3) ! yearly
-       if ( (tt .EQ. 1) .OR. (year .NE. counter_year) ) then
-          call canopy_intercept_param( processMatrix, global_parameters(:), &
-               LAI0, nTCells0_inL1, L0upBound_inL1, &
-               L0downBound_inL1, L0leftBound_inL1,  &
-               L0rightBound_inL1, cellId0, mask0,   &
-               nodata_dp,  interc_max               )
-
-          if (processMatrix(5,1) == -1) then
-             iStart = processMatrix(5,3) - processMatrix(5,2) + 1
-             iEnd   = processMatrix(5,3)  
-             
-             call pet_correctbyLAI(global_parameters(iStart:iEnd), nodata_dp, LCOVER0, LAI0, mask0, cellId0, &
-                  L0upBound_inL1, L0downBound_inL1, L0leftBound_inL1, L0rightBound_inL1, nTCells0_inL1, petLAIcorFactorL1)
-          end if
-       end if
-
-    case default ! no output at all
-       continue
-    end select
+    if((tt .EQ. 1) .AND. (.not. read_states)) then
+      soilMoisture(:, :) = 0.5_dp * soil_moist_FC(:, :)
+    end if
 
     !-------------------------------------------------------------------
     ! flag for day or night depending on hours of the day
     !-------------------------------------------------------------------
-    isday = ( hour .gt. 6 ) .AND. ( hour .le. 18 )
+    isday = (hour .gt. 6) .AND. (hour .le. 18)
 
     !-------------------------------------------------------------------
     ! HYDROLOGICAL PROCESSES at L1-LEVEL
     !-------------------------------------------------------------------
-
     !$OMP parallel default(shared) &
     !$OMP private(k, prec, pet, temp, tmp_soilmoisture, tmp_infiltration, tmp_aet_soil)
     !$OMP do SCHEDULE(STATIC)
     do k = 1, nCells1
 
-       ! PET calculation
-       select case (processMatrix(5,1))
-       case(-1) ! PET is input ! correct pet for every day only once at the first time step
-          pet =  petLAIcorFactorL1(k) * pet_in(k)
-
-       case(0) ! PET is input ! correct pet for every day only once at the first time step
-          pet =  fAsp(k) * pet_in(k)
-
-       case(1) ! Hargreaves-Samani
-          ! estimate day of the year (doy) for approximation of the extraterrestrial radiation
-          doy = nint(date2dec(day,month,year,12) - date2dec(1,1,year,12) ) + 1
-          
-          if (tmax_in(k) .lt. tmin_in(k)) call message('WARNING: tmax smaller than tmin at doy ', &
-               num2str(doy), ' in year ', num2str(year),' at cell', num2str(k),'!')
-
-          pet = fAsp(k) * pet_hargreaves(HarSamCoeff(k), HarSamConst,  temp_in(k), tmax_in(k),   &
-               tmin_in(k), latitude(k), doy)
-
-       case(2) ! Priestley-Taylor
-           ! Priestley Taylor is not defined for values netrad < 0.0_dp
-          pet = pet_priestly( PrieTayAlpha(k,month), max(netrad_in(k), 0.0_dp), temp_in(k))
-
-       case(3) ! Penman-Monteith
-          pet = pet_penman  (max(netrad_in(k), 0.0_dp), temp_in(k), absvappres_in(k)/1000.0_dp, &
-               aeroResist(k,month) / windspeed_in(k), surfResist(k,month), 1.0_dp, 1.0_dp)
-  
-       end select
-
-       ! temporal disaggreagtion of forcing variables
-       call temporal_disagg_forcing( isday, ntimesteps_day, prec_in(k),                        & ! Intent IN
-            pet, temp_in(k), fday_prec(month), fday_pet(month),                                & ! Intent IN
-            fday_temp(month), fnight_prec(month), fnight_pet(month), fnight_temp(month),       & ! Intent IN
-            temp_weights(k, month, hour + 1), pet_weights(k, month, hour + 1),                 & ! Intent IN
-            pre_weights(k, month, hour + 1),                                                   & ! Intent IN
-            read_meteo_weights,                                                                & ! Intent IN
-            prec, pet_calc(k), temp )                                                            ! Intent OUT
-
-       call canopy_interc( pet_calc(k), interc_max(k), prec,                                   & ! Intent IN
-            interc(k),                                                                         & ! Intent INOUT
-            throughfall(k), aet_canopy(k) )                                                      ! Intent OUT
-
-       call snow_accum_melt( deg_day_incr(k), deg_day_max(k),                                  & ! Intent IN
-            deg_day_noprec(k), prec, temp, temp_thresh(k), throughfall(k),                     & ! Intent IN
-            snowpack(k),                                                                       & ! Intent INOUT
-            deg_day(k),                                                                        & ! Intent OUT
-            melt(k), prec_effect(k), rain(k), snow(k) )                                          ! Intent OUT
-
-       tmp_soilMoisture(:) = soilMoisture(k,:)
-       tmp_infiltration(:) = infiltration(k,:)
-       
-       call soil_moisture(processMatrix(3,1),                                                  & ! Intent IN
-            fSealed1(k), water_thresh_sealed(k),                                               & ! Intent IN
-            pet_calc(k), evap_coeff(month), soil_moist_sat(k,:), frac_roots(k,:),              & ! Intent IN
-            soil_moist_FC(k,:), wilting_point(k,:), soil_moist_exponen(k,:),                   & ! Intent IN
-            jarvis_thresh_c1(k), aet_canopy(k),                                                & ! Intent IN
-            prec_effect(k), runoff_sealed(k), sealedStorage(k),                                & ! Intent INOUT
-            tmp_infiltration(:), tmp_soilMoisture(:),                                          & ! Intent INOUT
-            tmp_aet_soil(:), aet_sealed(k) )                                                     ! Intent OUT
-       infiltration(k,:) = tmp_infiltration(:)
-       soilMoisture(k,:) = tmp_soilMoisture(:)
-       aet_soil(k,:)     = tmp_aet_soil(:)
-
-       call runoff_unsat_zone( k1(k), kp(k), k0(k), alpha(k), karst_loss(k),                   & ! Intent IN
-            infiltration(k, nHorizons_mHM),  unsat_thresh(k),                                  & ! Intent IN
-            satStorage(k), unsatStorage(k),                                                    & ! Intent INOUT
-            slow_interflow(k), fast_interflow(k), perc(k) )                                      ! Intent OUT
-
-       call runoff_sat_zone( k2(k),                                                            & ! Intent IN
-            satStorage(k),                                                                     & ! Intent INOUT
-            baseflow(k) )                                                                        ! Intent OUT
-
-       call L1_total_runoff( fSealed1(k), fast_interflow(k), slow_interflow(k), baseflow(k),   & ! Intent IN
-            runoff_sealed(k),                                                                  & ! Intent IN
-            total_runoff(k) )                                                                    ! Intent OUT
-
-       !-------------------------------------------------------------------
-       ! Nested model: Neutrons state variable, related to soil moisture   
-       !-------------------------------------------------------------------
-
-       ! based on soilMoisture
-       ! TODO they again loop over all cells. Maybe move this to line 680 in the loop used above?
-       if ( processMatrix(10, 1) .eq. 1 ) &
-           call DesiletsN0( soilMoisture(k,:), horizon_depth(:), &
-                           global_parameters(processMatrix(10,3)-processMatrix(10,2)+1), &
-                           neutrons(k))
-       if ( processMatrix(10, 1) .eq. 2 ) &
-           call COSMIC( soilMoisture(k,:), horizon_depth(:), &
-                       global_parameters(processMatrix(10,3)-processMatrix(10,2)+2:processMatrix(10,3)), &
-                       neutron_integral_AFast(:), &
-                       neutrons(k))
+      ! PET calculation
+      select case (processMatrix(5, 1))
+      case(-1) ! PET is input ! correct pet for every day only once at the first time step
+        pet = petLAIcorFactorL1(k) * pet_in(k)
+
+      case(0) ! PET is input ! correct pet for every day only once at the first time step
+        pet = fAsp(k) * pet_in(k)
+
+      case(1) ! Hargreaves-Samani
+        ! estimate day of the year (doy) for approximation of the extraterrestrial radiation
+        doy = nint(date2dec(day, month, year, 12) - date2dec(1, 1, year, 12)) + 1
+
+        if (tmax_in(k) .lt. tmin_in(k)) call message('WARNING: tmax smaller than tmin at doy ', &
+                num2str(doy), ' in year ', num2str(year), ' at cell', num2str(k), '!')
+
+        pet = fAsp(k) * pet_hargreaves(HarSamCoeff(k), HarSamConst, temp_in(k), tmax_in(k), &
+                tmin_in(k), latitude(k), doy)
+
+      case(2) ! Priestley-Taylor
+        ! Priestley Taylor is not defined for values netrad < 0.0_dp
+        pet = pet_priestly(PrieTayAlpha(k), max(netrad_in(k), 0.0_dp), temp_in(k))
+
+      case(3) ! Penman-Monteith
+        pet = pet_penman  (max(netrad_in(k), 0.0_dp), temp_in(k), absvappres_in(k) / 1000.0_dp, &
+                aeroResist(k) / windspeed_in(k), surfResist(k), 1.0_dp, 1.0_dp)
+
+      end select
+      ! temporal disaggreagtion of forcing variables
+      call temporal_disagg_forcing(isday, ntimesteps_day, prec_in(k), & ! Intent IN
+              pet, temp_in(k), fday_prec(month), fday_pet(month), & ! Intent IN
+              fday_temp(month), fnight_prec(month), fnight_pet(month), fnight_temp(month), & ! Intent IN
+              temp_weights(k, month, hour + 1), pet_weights(k, month, hour + 1), & ! Intent IN
+              pre_weights(k, month, hour + 1), & ! Intent IN
+              read_meteo_weights, & ! Intent IN
+              prec, pet_calc(k), temp)                                                            ! Intent OUT
+      call canopy_interc(pet_calc(k), interc_max(k), prec, & ! Intent IN
+              interc(k), & ! Intent INOUT
+              throughfall(k), aet_canopy(k))                                                      ! Intent OUT
+      call snow_accum_melt(deg_day_incr(k), deg_day_max(k), & ! Intent IN
+              deg_day_noprec(k), prec, temp, temp_thresh(k), throughfall(k), & ! Intent IN
+              snowpack(k), & ! Intent INOUT
+              deg_day(k), & ! Intent OUT
+              melt(k), prec_effect(k), rain(k), snow(k))                                          ! Intent OUT
+
+      tmp_soilMoisture(:) = soilMoisture(k, :)
+      tmp_infiltration(:) = infiltration(k, :)
+
+      call soil_moisture(processMatrix(3, 1), & ! Intent IN
+              fSealed1(k), water_thresh_sealed(k), & ! Intent IN
+              pet_calc(k), evap_coeff(month), soil_moist_sat(k, :), frac_roots(k, :), & ! Intent IN
+              soil_moist_FC(k, :), wilting_point(k, :), soil_moist_exponen(k, :), & ! Intent IN
+              jarvis_thresh_c1(k), aet_canopy(k), & ! Intent IN
+              prec_effect(k), runoff_sealed(k), sealedStorage(k), & ! Intent INOUT
+              tmp_infiltration(:), tmp_soilMoisture(:), & ! Intent INOUT
+              tmp_aet_soil(:), aet_sealed(k))                                                     ! Intent OUT
+
+      infiltration(k, :) = tmp_infiltration(:)
+      soilMoisture(k, :) = tmp_soilMoisture(:)
+      aet_soil(k, :) = tmp_aet_soil(:)
+      call runoff_unsat_zone(k1(k), kp(k), k0(k), alpha(k), karst_loss(k), & ! Intent IN
+              infiltration(k, nHorizons_mHM), unsat_thresh(k), & ! Intent IN
+              satStorage(k), unsatStorage(k), & ! Intent INOUT
+              slow_interflow(k), fast_interflow(k), perc(k))                                      ! Intent OUT
+      call runoff_sat_zone(k2(k), & ! Intent IN
+              satStorage(k), & ! Intent INOUT
+              baseflow(k))                                                                        ! Intent OUT
+      call L1_total_runoff(fSealed1(k), fast_interflow(k), slow_interflow(k), baseflow(k), & ! Intent IN
+              runoff_sealed(k), & ! Intent IN
+              total_runoff(k))                                                                    ! Intent OUT
+
+      !-------------------------------------------------------------------
+      ! Nested model: Neutrons state variable, related to soil moisture
+      !-------------------------------------------------------------------
+
+      ! based on soilMoisture
+      if (processMatrix(10, 1) .eq. 1) &
+              call DesiletsN0(soilMoisture(k, :), horizon_depth(:), &
+                      global_parameters(processMatrix(10, 3) - processMatrix(10, 2) + 1), &
+                      neutrons(k))
+      if (processMatrix(10, 1) .eq. 2) &
+              call COSMIC(soilMoisture(k, :), horizon_depth(:), &
+                      global_parameters(processMatrix(10, 3) - processMatrix(10, 2) + 2 : processMatrix(10, 3)), &
+                      neutron_integral_AFast(:), &
+                      neutrons(k))
     end do
     !$OMP end do
     !$OMP end parallel
diff --git a/src/mHM/mo_mhm_constants.f90 b/src/mHM/mo_mhm_constants.f90
index 7692db70..e03f3e71 100644
--- a/src/mHM/mo_mhm_constants.f90
+++ b/src/mHM/mo_mhm_constants.f90
@@ -9,121 +9,59 @@
 
 MODULE mo_mhm_constants
 
-  USE mo_kind, ONLY: i4, dp
+  ! Written   Matthias Cuntz,     Nov 2011
+  ! Modified  Robert Schweppe,    May 2018 - refactoring
+
+  USE mo_kind, ONLY : i4, dp
 
   IMPLICIT NONE
 
   PRIVATE
 
   ! natural
-  real(dp),    public, parameter :: H2Odens            = 1000.0_dp ! Density of water (kg/m3)
-
-  ! computational
-  integer(i4), public, parameter :: nodata_i4          = -9999_i4  ! [-]     global no data value
-  real(dp),    public, parameter :: nodata_dp          = -9999._dp ! [-]     global no data value
-
-  ! hydrologic modeling
-  integer(i4), public, parameter :: nLCover_class      = 3_i4      ! [-]     Number of land cover class
-
-  integer(i4), public, parameter :: nColPars           = 5_i4      ! number of properties of the global variables
-  integer(i4), public, parameter :: maxNoSoilHorizons  = 10_i4     ! maximum number of allowed soil layers
-  integer(i4), public, parameter :: maxNoBasins        = 50_i4     ! maximum number of allowed basins
-  integer(i4), public, parameter :: maxNLcovers        = 50_i4     ! maximum number of allowed LCover scenes
-  integer(i4), public, parameter :: maxGeoUnit         = 25_i4     ! maximum number of allowed geological classes
+  real(dp), public, parameter :: H2Odens = 1000.0_dp ! Density of water (kg/m3)
 
   ! default inital values for states and fluxes as well as parameter fields
-  real(dp),    public, parameter :: P1_InitStateFluxes =    0.00_dp
-  real(dp),    public, parameter :: P2_InitStateFluxes =   15.00_dp
-  real(dp),    public, parameter :: P3_InitStateFluxes =   10.00_dp
-  real(dp),    public, parameter :: P4_InitStateFluxes =   75.00_dp
-  real(dp),    public, parameter :: P5_InitStateFluxes = 1500.00_dp
-  real(dp),    public, parameter :: C1_InitStateSM     =    0.25_dp
+  real(dp), public, parameter :: P2_InitStateFluxes = 15.00_dp
+  real(dp), public, parameter :: P3_InitStateFluxes = 10.00_dp
+  real(dp), public, parameter :: P4_InitStateFluxes = 75.00_dp
+  real(dp), public, parameter :: P5_InitStateFluxes = 1500.00_dp
+  real(dp), public, parameter :: C1_InitStateSM = 0.25_dp
 
   ! maximum number of outputs (fluxes states) for mHM
-  integer(i4), public, parameter :: nOutFlxState       = 20_i4     ! max. number of outputs to write into a netcdf file
-
-  ! temporal
-  real(dp),    public, parameter :: DayHours           =     24.0_dp  ! hours per day
-  real(dp),    public, parameter :: YearMonths         =     12.0_dp  ! months per year
-  integer(i4), public, parameter :: YearMonths_i4      =     12       ! months per year
-  real(dp),    public, parameter :: YearDays           =    365.0_dp  ! days in a year
-  real(dp),    public, parameter :: DaySecs            =  86400.0_dp  ! sec in a day
-
-  ! soil paramterization (mo_mpr_soilmoist)
-  ! organic matter constant for calculation of mineral bulk density following RAWL
-  real(dp),   public, parameter :: BulkDens_OrgMatter  = 0.224_dp     ! [g/cm3] from W.R. RAWLS
-  ! constants for determinination of the field capacity following Twarakavi
-  real(dp),   public, parameter :: field_cap_c1        = -0.60_dp     ! field capacity constant 1
-  real(dp),   public, parameter :: field_cap_c2        =  2.0_dp      ! field capacity constant 2
-  ! constants for determinination of the van Genuchten parameter n and sand treshold
-  real(dp),   public, parameter :: vGenuchten_sandtresh = 66.5_dp     ! van Genuchten snad treshold
-  real(dp),   public, parameter :: vGenuchtenN_c1       =  1.392_dp   ! constants for van Genuchten n
-  real(dp),   public, parameter :: vGenuchtenN_c2       =  0.418_dp
-  real(dp),   public, parameter :: vGenuchtenN_c3       = -0.024_dp
-  real(dp),   public, parameter :: vGenuchtenN_c4       =  1.212_dp
-  real(dp),   public, parameter :: vGenuchtenN_c5       = -0.704_dp
-  real(dp),   public, parameter :: vGenuchtenN_c6       = -0.648_dp
-  real(dp),   public, parameter :: vGenuchtenN_c7       =  0.023_dp
-  real(dp),   public, parameter :: vGenuchtenN_c8       =  0.044_dp
-  real(dp),   public, parameter :: vGenuchtenN_c9       =  3.168_dp
-  real(dp),   public, parameter :: vGenuchtenN_c10      = -2.562_dp
-  real(dp),   public, parameter :: vGenuchtenN_c11      =  7.0E-9_dp
-  real(dp),   public, parameter :: vGenuchtenN_c12      =  4.004_dp
-  real(dp),   public, parameter :: vGenuchtenN_c13      =  3.750_dp
-  real(dp),   public, parameter :: vGenuchtenN_c14      = -0.016_dp
-  real(dp),   public, parameter :: vGenuchtenN_c15      = -4.197_dp
-  real(dp),   public, parameter :: vGenuchtenN_c16      =  0.013_dp
-  real(dp),   public, parameter :: vGenuchtenN_c17      =  0.076_dp
-  real(dp),   public, parameter :: vGenuchtenN_c18      =  0.276_dp
-  ! determinination Ks
-  real(dp),   public, parameter :: Ks_c                 = 10.0_dp
-  ! permanent wiltung point (PWP)
-  real(dp),   public, parameter :: PWP_c                = 1.0_dp
-  real(dp),   public, parameter :: PWP_matPot_ThetaR    = 15000.0_dp ! [hPa] matrix potential of -1500 kPa, assumed as thetaR=0
+  integer(i4), public, parameter :: nOutFlxState = 20_i4     ! max. number of outputs to write into a netcdf file
 
 
   !> Stefan-Boltzmann constant [W m^-2 K^-4]
-  real(dp),   public, parameter  :: StBoltzmann          = 5.67e-08_dp
+  real(dp), public, parameter :: StBoltzmann = 5.67e-08_dp
   !> Hargreaves-Samani ref. ET formula [deg C]
-  real(dp),   public, parameter  :: HarSamConst          = 17.800_dp
-  !> assumed meteorol. measurement hight for estimation of aeroResist and surfResist
-  real(dp),    public, parameter :: WindMeasHeight       = 10.0_dp
-  !> von karman constant
-  real(dp),    public, parameter :: karman               = 0.41_dp
-
-  !> LAI factor for bulk surface resistance formulation
-  real(dp),    public, parameter :: LAI_factor_surfResi  = 0.3_dp
-  !> LAI offset for bulk surface resistance formulation
-  real(dp),    public, parameter :: LAI_offset_surfResi  = 1.2_dp
-  !> maximum bulk surface resistance
-  real(dp),    public, parameter :: max_surfResist       = 250.0_dp
-
+  real(dp), public, parameter :: HarSamConst = 17.800_dp
 
   ! Duffie formula for computing extraterrestrial radiation
-  real(dp),    public, parameter :: DuffieDr             =   0.0330_dp
-  real(dp),    public, parameter :: DuffieDelta1         =   0.4090_dp
-  real(dp),    public, parameter :: DuffieDelta2         =   1.3900_dp
+  real(dp), public, parameter :: DuffieDr = 0.0330_dp
+  real(dp), public, parameter :: DuffieDelta1 = 0.4090_dp
+  real(dp), public, parameter :: DuffieDelta2 = 1.3900_dp
 
   !> Tetens's formula to calculate saturated vapour pressure
-  real(dp),   public, parameter  :: tetens_c1            = 0.6108_dp
-  real(dp),   public, parameter  :: tetens_c2            = 17.270_dp
-  real(dp),   public, parameter  :: tetens_c3            = 237.30_dp
+  real(dp), public, parameter :: tetens_c1 = 0.6108_dp
+  real(dp), public, parameter :: tetens_c2 = 17.270_dp
+  real(dp), public, parameter :: tetens_c3 = 237.30_dp
   !> calculation of the slope of the saturation vapour pressure curve following Tetens
-  real(dp),   public, parameter  :: satpressureslope1    = 4098.0_dp
+  real(dp), public, parameter :: satpressureslope1 = 4098.0_dp
 
   !> Neutrons and moisture: N0 formula, Desilets et al. 2010
-  real(dp),    public, parameter :: Desilets_a0   = 0.0808_dp
-  real(dp),    public, parameter :: Desilets_a1   = 0.372_dp
-  real(dp),    public, parameter :: Desilets_a2   = 0.115_dp
+  real(dp), public, parameter :: Desilets_a0 = 0.0808_dp
+  real(dp), public, parameter :: Desilets_a1 = 0.372_dp
+  real(dp), public, parameter :: Desilets_a2 = 0.115_dp
 
   !> Neutrons and moisture: COSMIC, Shuttleworth et al. 2013
-  real(dp),    public, parameter :: COSMIC_bd     =   1.4020_dp       ! Dry soil bulk density (g/m3)
-  real(dp),    public, parameter :: COSMIC_vwclat =   0.0753_dp       ! Volumetric "lattice" water content (m3/m3)
-  real(dp),    public, parameter :: COSMIC_N      = 348.33_dp         ! High energy neutron flux (cph), original was 510.51737902_dp
-  real(dp),    public, parameter :: COSMIC_alpha  =   0.2392421548_dp ! Ratio of Fast Neutron Creation Factor (Soil to Water)
-  real(dp),    public, parameter :: COSMIC_L1     = 161.98621864_dp   ! High Energy Soil Attenuation Length (g/cm2)
-  real(dp),    public, parameter :: COSMIC_L2     = 129.14558985_dp   ! High Energy Water Attenuation Length (g/cm2)
-  real(dp),    public, parameter :: COSMIC_L3     = 107.82204562_dp   ! Fast Neutron Soil Attenuation Length (g/cm2)
-  real(dp),    public, parameter :: COSMIC_L4     =   3.1627190566_dp ! Fast Neutron Water Attenuation Length (g/cm2)
+  real(dp), public, parameter :: COSMIC_bd = 1.4020_dp       ! Dry soil bulk density (g/m3)
+  real(dp), public, parameter :: COSMIC_vwclat = 0.0753_dp       ! Volumetric "lattice" water content (m3/m3)
+  real(dp), public, parameter :: COSMIC_N = 348.33_dp         ! High energy neutron flux (cph), original was 510.51737902_dp
+  real(dp), public, parameter :: COSMIC_alpha = 0.2392421548_dp ! Ratio of Fast Neutron Creation Factor (Soil to Water)
+  real(dp), public, parameter :: COSMIC_L1 = 161.98621864_dp   ! High Energy Soil Attenuation Length (g/cm2)
+  real(dp), public, parameter :: COSMIC_L2 = 129.14558985_dp   ! High Energy Water Attenuation Length (g/cm2)
+  real(dp), public, parameter :: COSMIC_L3 = 107.82204562_dp   ! Fast Neutron Soil Attenuation Length (g/cm2)
+  real(dp), public, parameter :: COSMIC_L4 = 3.1627190566_dp ! Fast Neutron Water Attenuation Length (g/cm2)
 
 END MODULE mo_mhm_constants
diff --git a/src/mHM/mo_mhm_eval.f90 b/src/mHM/mo_mhm_eval.f90
index cd164f66..8f3f882e 100644
--- a/src/mHM/mo_mhm_eval.f90
+++ b/src/mHM/mo_mhm_eval.f90
@@ -9,7 +9,7 @@
 
 MODULE mo_mhm_eval
 
-  USE mo_kind, ONLY: i4, dp
+  USE mo_kind, ONLY : i4, dp
 
   IMPLICIT NONE
 
@@ -103,179 +103,172 @@ MODULE mo_mhm_eval
   !                   Rohini Kuamr,         Dec  2016 - option to handle monthly mean gridded fields of LAI
   !                   Stephan Thober,       Jan 2017 - added prescribed weights for tavg and pet
   !                   Zink M. Demirel C.,   Mar 2017 - Added Jarvis soil water stress function at SM process(3)
+  !                   Robert Schweppe,      Dec 2017 - extracted call to mpr from inside mhm
 
 
   SUBROUTINE mhm_eval(parameterset, runoff, sm_opti, basin_avg_tws, neutrons_opti, et_opti)
 
-    use mo_init_states,         only : get_basin_info
-    use mo_init_states,         only : variables_default_init   ! default initalization of variables
-    use mo_julian,              only : caldat, julday
-    use mo_message,             only : message
-    use mo_mhm,                 only : mhm
+    use mo_julian, only : caldat, julday
+    use mo_message, only : message
+    use mo_mhm, only : mhm
+    use mo_mpr_eval, only : mpr_eval
 
-    use mo_mhm_constants,       only : nodata_dp
-    use mo_restart,             only : read_restart_states      ! read initial values of variables
+    use mo_common_constants, only : nodata_dp
 
-    use mo_meteo_forcings,      only : prepare_meteo_forcings_data
+    use mo_meteo_forcings, only : prepare_meteo_forcings_data
     use mo_write_fluxes_states, only : OutputDataset
+    use mo_init_states, only : variables_default_init
+    use mo_restart, only : read_restart_states
 #ifdef pgiFortran154
     use mo_write_fluxes_states, only : newOutputDataset
 #endif
-    use mo_global_variables,    only : &
-         nTstepDay,                                                                 &
-         timeStep_model_outputs, outputFlxState,                                    &  ! definition which output to write
-         read_restart, perform_mpr, fracSealed_CityArea,                            &
-         timeStep_model_inputs,                                                     &
-         timeStep, nBasins, simPer, readPer,                                        & ! [h] simulation time step, No. of basins
-         c2TSTu, HorizonDepth_mHM,                                                  &
-         nSoilHorizons_mHM, NTSTEPDAY, timeStep,                                    &
-         LCyearId, LAIUnitList, LAILUT,                                             &
-         GeoUnitList, GeoUnitKar, soilDB,                                           &
-         iFlag_soilDB,                                                              & ! to handle dif. types of soil databases
-         L0_Id, L0_soilId,                                                          &
-         L0_LCover, L0_asp, L0_LCover_LAI, L0_geoUnit,                              &
-         soilDB, L1_nTCells_L0,                                                     &
-         L0_slope_emp,                                                              &
-         L1_upBound_L0, L1_downBound_L0, L1_leftBound_L0,                           &
-         L1_rightBound_L0, L0_latitude, L1_latitude,                                &
-         evap_coeff, fday_prec,                                                     &
-         fnight_prec, fday_pet, fnight_pet, fday_temp,                              &
-         fnight_temp, L1_pet, L1_tmin, L1_tmax, L1_netrad,                          &
-         L1_temp_weights, L1_pet_weights, L1_pre_weights,                           &
-         read_meteo_weights,                                                        &
-         L1_absvappress, L1_windspeed,                                              &
-         L1_pre, L1_temp , L1_fForest,                                              &
-         L1_fPerm, L1_fSealed, L1_inter,                                            &
-         L1_snowPack, L1_sealSTW, L1_soilMoist, L1_unsatSTW,                        &
-         L1_satSTW, L1_pet_calc,                                                    &
-         L1_aETSoil, L1_aETCanopy, L1_aETSealed,                                    &
-         L1_baseflow, L1_infilSoil, L1_fastRunoff, L1_melt,                         &
-         L1_percol, L1_preEffect, L1_rain, L1_runoffSeal,                           &
-         L1_slowRunoff, L1_snow, L1_Throughfall,                                    &
-         L1_total_runoff, L1_alpha, L1_degDayInc,                                   &
-         L1_degDayMax,                                                              &
-         L1_degDayNoPre, L1_degDay, L1_fAsp, L1_petLAIcorFactor, L1_HarSamCoeff,    &
-         L1_PrieTayAlpha, L1_aeroResist, L1_surfResist,                             &
-         L1_fRoots, L1_maxInter, L1_karstLoss, L1_kfastFlow,                        &
-         L1_kSlowFlow, L1_kBaseFlow, L1_kPerco,                                     &
-         L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp,                          &
-         L1_jarvis_thresh_c1,                                                       &
-         L1_tempThresh, L1_unsatThresh, L1_sealedThresh,                            &
-         L1_wiltingPoint, L1_neutrons,                                              &
-         basin_avg_TWS_sim,                                                         &
-         warmingDays,                                                               &
-         timeStep_LAI_input,                                                        & ! flag on how LAI data has to be read
-         L0_gridded_LAI, dirRestartIn,                                              & ! restart directory location
-         timeStep_sm_input,                                                         & ! time step of SM input (d, m, y)
-         timeStep_et_input,                                                         & ! time step of ET input (d, m, y)
-         nSoilHorizons_sm_input,                                                    & ! no. of mhm soil horizons equal to sm input
-         nTimeSteps_L1_sm,                                                          & ! tot. no. of timesteps in SM input
-         nTimeSteps_L1_neutrons,                                                    & ! tot. no. of timesteps in neutrons input
-         nTimeSteps_L1_et,                                                          & ! tot. no. of timesteps in ET input
-         neutron_integral_AFast                                                       ! pre-calc. integrand for neutron flux projec
-    use mo_common_variables, only: &
-         optimize, &
-         processMatrix
+    use mo_global_variables, only : &
+            timeStep_model_outputs, outputFlxState, &  ! definition which output to write
+            evap_coeff, fday_prec, &
+            fnight_prec, fday_pet, fnight_pet, fday_temp, &
+            fnight_temp, L1_pet, L1_tmin, L1_tmax, L1_netrad, &
+            L1_temp_weights, L1_pet_weights, L1_pre_weights, &
+            read_meteo_weights, &
+            L1_absvappress, L1_windspeed, &
+            L1_pre, L1_temp, &
+            L1_inter, &
+            L1_snowPack, L1_sealSTW, L1_soilMoist, L1_unsatSTW, &
+            L1_satSTW, L1_pet_calc, &
+            L1_aETSoil, L1_aETCanopy, L1_aETSealed, &
+            L1_baseflow, L1_infilSoil, L1_fastRunoff, L1_melt, &
+            L1_percol, L1_preEffect, L1_rain, L1_runoffSeal, &
+            L1_slowRunoff, L1_snow, L1_Throughfall, &
+            L1_total_runoff, L1_neutrons, &
+            basin_avg_TWS_sim, &
+            timeStep_sm_input, & ! time step of SM input (d, m, y)
+            timeStep_et_input, & ! time step of ET input (d, m, y)
+            nSoilHorizons_sm_input, & ! no. of mhm soil horizons equal to sm input
+            nTimeSteps_L1_sm, & ! tot. no. of timesteps in SM input
+            nTimeSteps_L1_neutrons, & ! tot. no. of timesteps in neutrons input
+            nTimeSteps_L1_et, & ! tot. no. of timesteps in ET input
+            timeStep_model_inputs, &
+            neutron_integral_AFast  ! pre-calc. integrand for neutron flux project
+    use mo_mpr_global_variables, only : &
+            timeStep_LAI_input, &
+            HorizonDepth_mHM, &
+            nSoilHorizons_mHM, &
+            L1_fSealed, L1_alpha, L1_degDayInc, &
+            L1_degDayMax, &
+            L1_degDayNoPre, L1_degDay, L1_fAsp, L1_petLAIcorFactor, L1_HarSamCoeff, &
+            L1_PrieTayAlpha, L1_aeroResist, L1_surfResist, &
+            L1_fRoots, L1_maxInter, L1_karstLoss, L1_kfastFlow, &
+            L1_kSlowFlow, L1_kBaseFlow, L1_kPerco, &
+            L1_soilMoistFC, L1_soilMoistSat, L1_soilMoistExp, &
+            L1_jarvis_thresh_c1, &
+            L1_tempThresh, L1_unsatThresh, L1_sealedThresh, &
+            L1_wiltingPoint
+    use mo_common_variables, only : &
+            nBasins, & !No. of basins
+            processMatrix, &
+            level1
+    use mo_common_mHM_mRM_variables, only : &
+            nTstepDay, &
+            optimize, &
+            LCyearId, &
+            simPer, readPer, & ! [h] simulation time step,
+            warmingDays, &
+            dirRestartIn, & ! restart directory location
+            timeStep, read_restart
+
+    !USE mo_timer, ONLY : timers_init, timer_start, timer_stop, timer_get              ! Timing of processes
+
+
 #ifdef MRM2MHM
-    use mo_utils, only: ge
-    use mo_mrm_global_variables, only: &
-         ! INPUT variables for mRM routing ====================================
-         resolutionRouting,          &
-         resolutionHydrology,        &
-         L0_LCover_mRM,              & ! L0 land cover
-         L0_floodPlain,              & ! flood plains at L0 level
-         L0_areaCell,                &
-         L1_areaCell,                &
-         L1_L11_Id,                  &
-         L11_areaCell,               &
-         L11_L1_Id,                  &
-         L11_aFloodPlain,            & ! flood plains at L11 level
-         L11_length,                 & ! link length
-         L11_slope,                  &
-         L11_netPerm,                & ! routing order at L11
-         L11_fromN,                  & ! link source at L11
-         L11_toN,                    & ! link target at L11
-         L11_nOutlets,               & ! number of outlets at the L11
-         basin_mrm,                  & ! basin_mrm structure
-         InflowGauge,                &
-         outputFlxState_mrm,         &
-         ! INPUT variables for writing output =================================
-         warmingDays_mrm,            &
-         timeStep_model_outputs_mrm, &
-         ! INPUT/OUTPUT variables for mRM routing =============================
-         L11_TSrout,                 & ! routing timestep in seconds
-         L11_C1,                     & ! first muskingum parameter
-         L11_C2,                     & ! second muskigum parameter
-         L11_qOUT,                   & ! routed runoff flowing out of L11 cell
-         L11_qTIN,                   & ! inflow water into the reach at L11
-         L11_qTR,                    & !
-         L11_FracFPimp,              & ! fraction of impervious layer at L11 scale
-         L11_qMod,                   &
-         mRM_runoff ! global variable containing runoff for every gauge
-    use mo_mrm_tools, only: get_basin_info_mrm
-    use mo_mrm_restart, only: mrm_read_restart_states
-    use mo_mrm_routing, only: mrm_routing
-    use mo_mrm_write, only: mrm_write_output_fluxes
-    use mo_mrm_init, only: variables_default_init_routing, mrm_update_param
-    use mo_mrm_constants, only: hourSecs
+    use mo_utils, only : ge
+    use mo_mrm_global_variables, only : &
+            ! INPUT variables for mRM routing ====================================
+            level11, &
+            L1_L11_Id, &
+            L11_L1_Id, &
+            L11_length, & ! link length
+            L11_slope, &
+            L11_netPerm, & ! routing order at L11
+            L11_fromN, & ! link source at L11
+            L11_toN, & ! link target at L11
+            L11_nOutlets, & ! number of outlets at the L11
+            basin_mrm, & ! basin_mrm structure
+            InflowGauge, &
+            ! INPUT/OUTPUT variables for mRM routing =============================
+            L11_TSrout, & ! routing timestep in seconds
+            L11_C1, & ! first muskingum parameter
+            L11_C2, & ! second muskigum parameter
+            L11_qOUT, & ! routed runoff flowing out of L11 cell
+            L11_qTIN, & ! inflow water into the reach at L11
+            L11_qTR, & !
+            L11_nLinkFracFPimp, & ! fraction of impervious layer at L11 scale
+            L11_qMod, &
+            timeStep_model_outputs_mrm, &
+            outputFlxState_mrm, &
+            mRM_runoff ! global variable containing runoff for every gauge
+    use mo_mrm_restart, only : mrm_read_restart_states
+    use mo_mrm_routing, only : mrm_routing
+    use mo_mrm_write, only : mrm_write_output_fluxes
+    use mo_mrm_init, only : variables_default_init_routing, mrm_update_param
+    use mo_common_constants, only : HourSecs
+    use mo_common_variables, only : &
+            ! INPUT variables for mRM routing ====================================
+            resolutionHydrology
+    use mo_common_mHM_mRM_variables, only : &
+            ! INPUT variables for mRM routing ====================================
+            resolutionRouting
 #endif
 
     implicit none
 
-    real(dp), dimension(:),                          intent(in)  :: parameterset
-    real(dp), dimension(:,:), allocatable, optional, intent(out) :: runoff        ! dim1=time dim2=gauge
-    real(dp), dimension(:,:), allocatable, optional, intent(out) :: sm_opti       ! dim1=ncells, dim2=time
-    real(dp), dimension(:,:), allocatable, optional, intent(out) :: basin_avg_tws ! dim1=time dim2=nBasins
-    real(dp), dimension(:,:), allocatable, optional, intent(out) :: neutrons_opti ! dim1=ncells, dim2=time
-    real(dp), dimension(:,:), allocatable, optional, intent(out) :: et_opti       ! dim1=ncells, dim2=time
+    real(dp), dimension(:), intent(in) :: parameterset
+    real(dp), dimension(:, :), allocatable, optional, intent(out) :: runoff        ! dim1=time dim2=gauge
+    real(dp), dimension(:, :), allocatable, optional, intent(out) :: sm_opti       ! dim1=ncells, dim2=time
+    real(dp), dimension(:, :), allocatable, optional, intent(out) :: basin_avg_tws ! dim1=time dim2=nBasins
+    real(dp), dimension(:, :), allocatable, optional, intent(out) :: neutrons_opti ! dim1=ncells, dim2=time
+    real(dp), dimension(:, :), allocatable, optional, intent(out) :: et_opti       ! dim1=ncells, dim2=time
 
     ! -------------------------------------
     ! local variables
     !
     ! FOR WRITING GRIDDED STATES AND FLUXES
-    integer(i4)                               :: tIndex_out          ! for writing netcdf file
-    real(dp), dimension(size(L1_fSealed))     :: L1_fNotSealed
-    type(OutputDataset)                       :: nc
+    integer(i4) :: tIndex_out          ! for writing netcdf file
+    real(dp), dimension(size(L1_fSealed, 1), size(L1_fSealed, 2), size(L1_fSealed, 3)) :: L1_fNotSealed
+    type(OutputDataset) :: nc
     !
     ! counters and indexes
-    integer(i4)                               :: nTimeSteps
-    integer(i4)                               :: ii, tt, ll       ! Counters
-    integer(i4)                               :: nCells           ! No. of cells at level 1 for current basin
-    integer(i4)                               :: Lcover_yID       ! Land cover year ID
-    integer(i4)                               :: s0, e0           ! start and end index at level 0 for current basin
-    integer(i4)                               :: s1, e1           ! start and end index at level 1 for current basin
+    integer(i4) :: nTimeSteps
+    integer(i4) :: iBasin, tt       ! Counters
+    integer(i4) :: nCells           ! No. of cells at level 1 for current basin
+    integer(i4) :: s1, e1           ! start and end index at level 1 for current basin
     !
     ! process case dependent length specifiers of vectors to pass to mHM
-    integer(i4), dimension(6)                 :: iMeteo_p5        ! meteorological time step for process 5 (PET)
-    integer(i4), dimension(6)                 :: s_p5, e_p5       ! process 5: start and end index of vectors
+    integer(i4), dimension(6) :: iMeteo_p5        ! meteorological time step for process 5 (PET)
+    integer(i4), dimension(6) :: s_p5, e_p5       ! process 5: start and end index of vectors
     !                                                             ! index 1: pet
     !                                                             ! index 2: tmin
     !                                                             ! index 3: tmax
     !                                                             ! index 4: netrad
     !                                                             ! index 5: absolute vapour pressure
     !                                                             ! index 6: windspeed
-    integer(i4)                               :: s_meteo, e_meteo
-    logical, dimension(:,:), allocatable      :: mask0, mask1
-    integer(i4)                               :: nrows, ncols
-    integer(i4)                               :: day, month, year, hour
-    integer(i4)                               :: iMeteoTS
-    integer(i4)                               :: iGridLAI_TS
-    integer(i4)                               :: yId
-    real(dp)                                  :: newTime
-    integer(i4)                               :: year_counter     ! for yearly output
-    integer(i4)                               :: average_counter  ! for averaging output
-    logical                                   :: writeout         ! if true write out netcdf files
-    integer(i4)                               :: writeout_counter ! write out time step
+    integer(i4) :: s_meteo, e_meteo
+    logical, dimension(:, :), allocatable :: mask1
+    integer(i4) :: day, month, year, hour, prev_day, prev_month, prev_year
+    integer(i4) :: iMeteoTS
+    integer(i4) :: iLAI
+    integer(i4) :: yId
+    real(dp) :: newTime
+    logical :: is_new_day, is_new_month, is_new_year ! flags for stepping into new period
+    integer(i4) :: average_counter  ! for averaging output
+    logical :: writeout         ! if true write out netcdf files
+    integer(i4) :: writeout_counter ! write out time step
     !
 #ifdef MRM2MHM
     ! for routing
-    logical               :: do_mpr
-    integer(i4)           :: jj
-    integer(i4)           :: iDischargeTS ! discharge timestep
-    integer(i4)           :: s11, e11 ! start and end index at L11
-    integer(i4)           :: s110, e110 ! start and end index of L11 at L0
-    real(dp)              :: tsRoutFactor ! factor between routing and hydrological modelling resolution
-    real(dp)              :: tsRoutFactorIn ! factor between routing and hydrological modelling resolution (dummy)
+    integer(i4) :: jj
+    integer(i4) :: iDischargeTS ! discharge timestep
+    integer(i4) :: s11, e11 ! start and end index at L11
+    real(dp) :: tsRoutFactor ! factor between routing and hydrological modelling resolution
+    real(dp) :: tsRoutFactorIn ! factor between routing and hydrological modelling resolution (dummy)
     integer(i4) :: timestep_rout            ! timestep of runoff to rout [h]
     !                                       ! - identical to timestep of input if
     !                                       !   tsRoutFactor is less than 1
@@ -285,694 +278,647 @@ SUBROUTINE mhm_eval(parameterset, runoff, sm_opti, basin_avg_tws, neutrons_opti,
 
     real(dp), allocatable :: RunToRout(:) ! Runoff that is input for routing
     real(dp), allocatable :: InflowDischarge(:) ! inflowing discharge
-    logical,  allocatable :: mask11(:,:)
-    logical               :: do_rout ! flag for performing routing
+    logical, allocatable :: mask11(:, :)
+    logical :: do_rout ! flag for performing routing
 #endif
     !
 
     ! for basin average tws timeseries
-    integer(i4)                               :: gg
-    real(dp), dimension(:), allocatable       :: TWS_field      ! field of TWS
-    real(dp)                                  :: area_basin
-
-    ! LAI options
-    integer(i4)                               :: day_counter
-    integer(i4)                               :: month_counter
-    real(dp), dimension(:), allocatable       :: LAI            ! local variable for leaf area index
+    integer(i4) :: gg
+    real(dp), dimension(:), allocatable :: TWS_field      ! field of TWS
+    real(dp) :: area_basin
 
     !----------------------------------------------------------
     ! Check optionals and initialize
     !----------------------------------------------------------
-    if ( present(runoff) ) then
-       if ( processMatrix(8, 1) .eq. 0 ) then
-          call message("***ERROR: runoff can not be produced, since routing process is off in Process Matrix")
-          stop
-       end if
+    if (present(runoff)) then
+      if (processMatrix(8, 1) .eq. 0) then
+        call message("***ERROR: runoff can not be produced, since routing process is off in Process Matrix")
+        stop
+      end if
     end if
-    ! soil mosiure optimization
+    ! soil moisture optimization
     !--------------------------
-    if ( present(sm_opti) ) then
-       !                ! total No of cells, No of timesteps
-       !                ! of all basins    , in soil moist input
-       allocate(sm_opti(size(L1_pre, dim=1), nTimeSteps_L1_sm))
-       sm_opti(:,:) = 0.0_dp ! has to be intialized with zero because later summation
+    if (present(sm_opti)) then
+      !                ! total No of cells, No of timesteps
+      !                ! of all basins    , in soil moist input
+      allocate(sm_opti(size(L1_pre, dim = 1), nTimeSteps_L1_sm))
+      sm_opti(:, :) = 0.0_dp ! has to be intialized with zero because later summation
     end if
     ! neutrons optimization
     !--------------------------
-    if ( present(neutrons_opti) ) then
-       !                ! total No of cells, No of timesteps
-       !                ! of all basins    , in neutrons input
-       allocate(neutrons_opti(size(L1_pre, dim=1), nTimeSteps_L1_neutrons))
-       neutrons_opti(:,:) = 0.0_dp ! has to be intialized with zero because later summation
+    if (present(neutrons_opti)) then
+      !                ! total No of cells, No of timesteps
+      !                ! of all basins    , in neutrons input
+      allocate(neutrons_opti(size(L1_pre, dim = 1), nTimeSteps_L1_neutrons))
+      neutrons_opti(:, :) = 0.0_dp ! has to be intialized with zero because later summation
     end if
     ! evapotranspiration optimization
     !--------------------------
-    if ( present(et_opti) ) then
-       !                ! total No of cells, No of timesteps
-       !                ! of all basins    , in evapotranspiration input
-       allocate(et_opti(size(L1_pre, dim=1), nTimeSteps_L1_et))
-       et_opti(:,:) = 0.0_dp ! has to be intialized with zero because later summation
+    if (present(et_opti)) then
+      !                ! total No of cells, No of timesteps
+      !                ! of all basins    , in evapotranspiration input
+      allocate(et_opti(size(L1_pre, dim = 1), nTimeSteps_L1_et))
+      et_opti(:, :) = 0.0_dp ! has to be intialized with zero because later summation
     end if
     ! add other optionals...
 
     !-------------------------------------------------------------------
-    ! Initalize State variables either to the default value or
-    ! from the restart_files.
-    ! All variables to be initalized had been allocated to the required
-    ! space before this point (see, mo_startup: initialise)
+    ! All variables had been allocated to the required
+    ! space before this point (see, mo_startup: initialise) and initialised
     !-------------------------------------------------------------------
-    if (.NOT. read_restart ) then
-       ! as default values,
-       ! all cells for all modeled basins are simultenously initalized ONLY ONCE
-       call variables_default_init()
+    if (.NOT. read_restart) then
+      ! as default values,
+      ! all cells for all modeled basins are simultenously initalized ONLY ONCE
+      call variables_default_init()
+      call mpr_eval(parameterset)
+
 #ifdef MRM2MHM
        if (processMatrix(8, 1) .gt. 0) then
-          !-------------------------------------------
-          ! L11 ROUTING STATE VARIABLES, FLUXES AND
-          !             PARAMETERS
-          !-------------------------------------------
-          call variables_default_init_routing()
-       end if
+        !-------------------------------------------
+        ! L11 ROUTING STATE VARIABLES, FLUXES AND
+        !             PARAMETERS
+        !-------------------------------------------
+        call variables_default_init_routing()
+      end if
 #endif
     else
-       ! read from restart files, basin wise ...
-       do ii = 1, nBasins
-          call read_restart_states(ii, dirRestartIn(ii) )
-       end do
+      do iBasin = 1, nBasins
+        ! this reads the eff. parameters and optionally the states and fluxes
+        call read_restart_states(iBasin, dirRestartIn(iBasin))
+      end do
     end if
 
 #ifdef MRM2MHM
     if (processMatrix(8, 1) .gt. 0) then
-       ! ----------------------------------------
-       ! initialize factor between routing resolution and hydrologic model resolution
-       ! ----------------------------------------
-       tsRoutFactor = 1_i4
-       allocate(InflowDischarge(size(InflowGauge%Q, dim=2)))
-       InflowDischarge = 0._dp
+      ! ----------------------------------------
+      ! initialize factor between routing resolution and hydrologic model resolution
+      ! ----------------------------------------
+      tsRoutFactor = 1_i4
+      allocate(InflowDischarge(size(InflowGauge%Q, dim = 2)))
+      InflowDischarge = 0._dp
     end if
 #endif
 
+    L1_fNotSealed = 1.0_dp - L1_fSealed
     !----------------------------------------
     ! loop over basins
     !----------------------------------------
-    do ii = 1, nBasins
+    do iBasin = 1, nBasins
 
-       ! calculate NtimeSteps for this basin
-       nTimeSteps = ( simPer(ii)%julEnd - simPer(ii)%julStart + 1 ) * NTSTEPDAY
-
-       ! reinitialize time counter for LCover and MPR
-       ! -0.5 is due to the fact that dec2date routine
-       !   changes the day at 12:00 in NOON
-       ! Whereas mHM needs day change at 00:00 h
-       newTime = real(simPer(ii)%julStart,dp)
-       yId     = 0
-
-       ! get basin information
-       call get_basin_info ( ii,  0, nrows, ncols,                iStart=s0,  iEnd=e0, mask=mask0 )
-       call get_basin_info ( ii,  1, nrows, ncols, ncells=nCells, iStart=s1,  iEnd=e1, mask=mask1 )
+      ! get basin information
+      nCells = level1(iBasin)%nCells
+      mask1 = level1(iBasin)%mask
+      s1 = level1(iBasin)%iStart
+      e1 = level1(iBasin)%iEnd
 
 #ifdef MRM2MHM
        if (processMatrix(8, 1) .gt. 0) then
-          ! read states from restart
-          if (read_restart) call mrm_read_restart_states(ii, dirRestartIn(ii))
-          !
-          ! get basin information at L11 and L110 if routing is activated
-          call get_basin_info_mrm ( ii,  11, nrows, ncols,  iStart=s11,  iEnd=e11, mask=mask11  )
-          call get_basin_info_mrm ( ii, 110, nrows, ncols, iStart=s110,  iEnd=e110 )
-          ! initialize routing parameters (has to be called for routing option 2)
-          if (processMatrix(8, 1) .eq. 2) call mrm_update_param(ii, &
-               parameterset(processMatrix(8,3) - processMatrix(8,2) + 1:processMatrix(8,3)))
-          ! initialize variable for runoff for routing
-          allocate(RunToRout(e1 - s1 + 1))
-          RunToRout = 0._dp
-       end if
+        ! read states from restart
+        if (read_restart) call mrm_read_restart_states(iBasin, dirRestartIn(iBasin))
+        !
+        ! get basin information at L11 and L110 if routing is activated
+        s11 = level11(iBasin)%iStart
+        e11 = level11(iBasin)%iEnd
+        mask11 = level11(iBasin)%mask
+
+        ! initialize routing parameters (has to be called for routing option 2)
+        if (processMatrix(8, 1) .eq. 2) call mrm_update_param(iBasin, &
+                parameterset(processMatrix(8, 3) - processMatrix(8, 2) + 1 : processMatrix(8, 3)))
+        ! initialize variable for runoff for routing
+        allocate(RunToRout(e1 - s1 + 1))
+        RunToRout = 0._dp
+      end if
 #endif
-       ! allocate space for local LAI grid
-       allocate( LAI(s0:e0) )
-       LAI(:) = nodata_dp
-
-       ! allocate space for local tws field
-       if (present(basin_avg_tws)) then
-          allocate(TWS_field(s1:e1))
-          TWS_field(s1:e1) = nodata_dp
-       end if
-
-       ! Loop over time
-       average_counter  = 0
-       writeout_counter = 0
-       hour = -timestep
-       iGridLAI_TS = 0
-       do tt = 1, nTimeSteps
-          if ( timeStep_model_inputs(ii) .eq. 0_i4 ) then
-             ! whole meteorology is already read
-
-             ! set start and end of meteo position
-             s_meteo = s1
-             e_meteo = e1
-             ! time step for meteorological variable (daily values)
-             iMeteoTS = ceiling( real(tt,dp) / real(NTSTEPDAY,dp) )
-          else
-             ! read chunk of meteorological forcings data (reading, upscaling/downscaling)
-             call prepare_meteo_forcings_data(ii, tt)
-             ! set start and end of meteo position
-             s_meteo = 1
-             e_meteo = e1 - s1 + 1
-             ! time step for meteorological variable (daily values)
-             iMeteoTS = ceiling( real(tt,dp) / real(NTSTEPDAY,dp) ) &
-                        - ( readPer%julStart - simPer(ii)%julStart )
-          end if
 
-          hour = mod(hour+timestep, 24)
-
-          ! year needed to be passed to mHM call, e.g., yearly LC scene
-          ! month needed for LAI process
-          call caldat(int(newTime), yy=year, mm=month, dd=day)
-
-          ! preapare vector length specifications depending on the process case
-          ! process 5 - PET
-          select case (processMatrix(5,1))
-             !      (/pet,        tmax,    tmin,  netrad, absVapP,windspeed/)
-          case(-1:0) ! PET is input
-             s_p5 = (/s_meteo,       1,       1,       1,       1,       1/)
-             e_p5 = (/e_meteo,       1,       1,       1,       1,       1/)
-          case(1) ! Hargreaves-Samani
-             s_p5 = (/s_meteo, s_meteo, s_meteo,       1,       1,       1/)
-             e_p5 = (/e_meteo, e_meteo, e_meteo,       1,       1,       1/)
-          case(2) ! Priestely-Taylor
-             s_p5 = (/s_meteo,       1,       1, s_meteo,       1,       1/)
-             e_p5 = (/e_meteo,       1,       1, e_meteo,       1,       1/)
-          case(3) ! Penman-Monteith
-             s_p5 = (/s_meteo,       1,       1, s_meteo, s_meteo, s_meteo/)
-             e_p5 = (/e_meteo,       1,       1, e_meteo, e_meteo, e_meteo/)
-          end select
-
-          ! customize iMeteoTS for process 5 - PET
-          select case (processMatrix(5,1))
+      ! allocate space for local tws field
+      if (present(basin_avg_tws)) then
+        allocate(TWS_field(s1 : e1))
+        TWS_field(s1 : e1) = nodata_dp
+      end if
+
+      ! calculate NtimeSteps for this basin
+      nTimeSteps = (simPer(iBasin)%julEnd - simPer(iBasin)%julStart + 1) * nTstepDay
+
+      ! reinitialize time counter for LCover and MPR
+      ! -0.5 is due to the fact that dec2date routine
+      !   changes the day at 12:00 in NOON
+      ! Whereas mHM needs day change at 00:00 h
+      ! initialize the julian day as real
+      newTime = real(simPer(iBasin)%julStart, dp)
+      ! initialize the date
+      call caldat(int(newTime), yy = year, mm = month, dd = day)
+      ! initialize flags for period changes, they are true for first time step
+      is_new_day = .true.
+      is_new_month = .true.
+      is_new_year = .true.
+
+      ! initialize arrays and counters
+      yId = LCyearId(year, iBasin)
+      average_counter = 0
+      writeout_counter = 0
+      hour = -timestep
+      iLAI = 0
+
+      ! Loop over time
+      do tt = 1, nTimeSteps
+        ! time increment is done right after call to mrm (and initially before looping)
+        if (timeStep_model_inputs(iBasin) .eq. 0_i4) then
+          ! whole meteorology is already read
+
+          ! set start and end of meteo position
+          s_meteo = s1
+          e_meteo = e1
+          ! time step for meteorological variable (daily values)
+          iMeteoTS = ceiling(real(tt, dp) / real(nTstepDay, dp))
+        else
+          ! read chunk of meteorological forcings data (reading, upscaling/downscaling)
+          call prepare_meteo_forcings_data(iBasin, tt)
+          ! set start and end of meteo position
+          s_meteo = 1
+          e_meteo = e1 - s1 + 1
+          ! time step for meteorological variable (daily values)
+          iMeteoTS = ceiling(real(tt, dp) / real(nTstepDay, dp)) &
+                  - (readPer%julStart - simPer(iBasin)%julStart)
+        end if
+
+        ! preapare vector length specifications depending on the process case
+        ! process 5 - PET
+        select case (processMatrix(5, 1))
+          !      (/pet,        tmax,    tmin,  netrad, absVapP,windspeed/)
+        case(-1 : 0) ! PET is input
+          s_p5 = (/s_meteo, 1, 1, 1, 1, 1/)
+          e_p5 = (/e_meteo, 1, 1, 1, 1, 1/)
+        case(1) ! Hargreaves-Samani
+          s_p5 = (/s_meteo, s_meteo, s_meteo, 1, 1, 1/)
+          e_p5 = (/e_meteo, e_meteo, e_meteo, 1, 1, 1/)
+        case(2) ! Priestely-Taylor
+          s_p5 = (/s_meteo, 1, 1, s_meteo, 1, 1/)
+          e_p5 = (/e_meteo, 1, 1, e_meteo, 1, 1/)
+        case(3) ! Penman-Monteith
+          s_p5 = (/s_meteo, 1, 1, s_meteo, s_meteo, s_meteo/)
+          e_p5 = (/e_meteo, 1, 1, e_meteo, e_meteo, e_meteo/)
+        end select
+
+        ! customize iMeteoTS for process 5 - PET
+        select case (processMatrix(5, 1))
           !              (/     pet,     tmin,     tmax,   netrad,  absVapP,windspeed /)
-          case(-1:0) ! PET is input
-             iMeteo_p5 = (/iMeteoTS,        1,        1,        1,        1,        1 /)
-          case(1) ! Hargreaves-Samani
-             iMeteo_p5 = (/iMeteoTS, iMeteoTS, iMeteoTS,        1,        1,        1 /)
-          case(2) ! Priestely-Taylor
-             iMeteo_p5 = (/iMeteoTS,        1,        1, iMeteoTS,        1,        1 /)
-          case(3) ! Penman-Monteith
-             iMeteo_p5 = (/iMeteoTS,        1,        1, iMeteoTS, iMeteoTS, iMeteoTS /)
-          end select
-
-          !--------------------------------------------------------------------
-          ! call LAI function to get LAI fields for this timestep and basin
-          !--------------------------------------------------------------------
-          ! initalise counters
-          if ( tt .EQ. 1 ) then
-             day_counter   = day
-             month_counter = month
-             year_counter  = year
+        case(-1 : 0) ! PET is input
+          iMeteo_p5 = (/iMeteoTS, 1, 1, 1, 1, 1 /)
+        case(1) ! Hargreaves-Samani
+          iMeteo_p5 = (/iMeteoTS, iMeteoTS, iMeteoTS, 1, 1, 1 /)
+        case(2) ! Priestely-Taylor
+          iMeteo_p5 = (/iMeteoTS, 1, 1, iMeteoTS, 1, 1 /)
+        case(3) ! Penman-Monteith
+          iMeteo_p5 = (/iMeteoTS, 1, 1, iMeteoTS, iMeteoTS, iMeteoTS /)
+        end select
+
+        select case (timeStep_LAI_input)
+        case(0 : 1) ! long term mean monthly gridded fields or LUT-based values
+          iLAI = month
+        case(-1) ! daily timestep
+          if (is_new_day) then
+            iLAI = iLAI + 1
           end if
-          !
-          select case(timeStep_LAI_input)
-          case(0)
-             ! create gridded fields of LAI using long term monthly mean LAI values
-             ! and the corresponding LC file
-             ! update LAI --> for 1st timestep and when month changes
-             if( (tt .EQ. 1) .OR. (month_counter .NE. month) ) then
-
-                do ll = 1, size(LAIUnitList)
-                   where( L0_LCover_LAI(s0:e0) .EQ. LAIUnitList(ll) ) LAI(:) = LAILUT(ll, month)
-                end do
-
-             end if
-
-          case(1) ! long term mean monthly gridded lai
-                LAI(:) = L0_gridded_LAI(s0:e0, month)
-                !print*,minval(LAI),maxval(LAI),month
-          case(-1) ! daily
-             if ( (tt .EQ. 1) .OR. (day .NE. day_counter) ) then
-                iGridLAI_TS = iGridLAI_TS + 1_i4
-                LAI(:) = L0_gridded_LAI(s0:e0, iGridLAI_TS)
-             end if
-          case(-2) ! monthly
-             if ( (tt .EQ. 1) .OR. (month .NE. month_counter) ) then
-                iGridLAI_TS = iGridLAI_TS + 1_i4
-                LAI(:) = L0_gridded_LAI(s0:e0, iGridLAI_TS)
-             end if
-
-          case(-3) ! yearly
-             if ( (tt .EQ. 1) .OR. (year .NE. year_counter) ) then
-                iGridLAI_TS = iGridLAI_TS + 1_i4
-                LAI(:) = L0_gridded_LAI(s0:e0, iGridLAI_TS)
-             end if
-
-
-
-          case default ! no output at all
-             continue
-          end select
-
-
-          !
-          ! -------------------------------------------------------------------------
-          ! ARGUMENT LIST KEY FOR mHM
-          ! -------------------------------------------------------------------------
-          !  C    CONFIGURATION
-          !  F    FORCING DATA L2
-          !  Q    INFLOW FROM UPSTREAM AREAS
-          !  L0   MORPHOLOGIC DATA L0
-          !  L1   MORPHOLOGIC DATA L1
-          !  L11  MORPHOLOGIC DATA L11
-          !  P    GLOBAL PARAMETERS
-          !  E    EFFECTIVE PARAMETER FIELDS (L1, L11 levels)
-          !  S    STATE VARIABLES L1
-          !  X    FLUXES (L1, L11 levels)
-          ! --------------------------------------------------------------------------
-          call mhm(perform_mpr, read_restart, fracSealed_cityArea,                                       & ! IN C
-               timeStep_LAI_input, year_counter, month_counter, day_counter,                             & ! IN C
-               tt, newTime-0.5_dp, processMatrix, c2TSTu, HorizonDepth_mHM,                              & ! IN C
-               nCells, nSoilHorizons_mHM, real(NTSTEPDAY,dp), mask0,                                     & ! IN C
-               neutron_integral_AFast,                                                                   & ! IN C
-               iFlag_soilDB,                                                                             & ! IN C
-               parameterset,                                                                             & ! IN P
-               LCyearId(year,ii), GeoUnitList, GeoUnitKar, LAIUnitList, LAILUT,                          & ! IN L0
-               L0_slope_emp(s0:e0), L0_Latitude(s0:e0),                                                  & ! IN L0
-               L0_Id(s0:e0), L0_soilId(s0:e0,:), L0_LCover_LAI(s0:e0),                                   & ! IN L0
-               L0_LCover(s0:e0, LCyearId(year,ii)), L0_asp(s0:e0),                                       & ! IN L0
-               LAI(s0:e0), L0_geoUnit(s0:e0),                                                            & ! IN L0
-               soilDB%is_present, soilDB%nHorizons, soilDB%nTillHorizons,                                & ! IN L0
-               soilDB%sand, soilDB%clay, soilDB%DbM, soilDB%Wd, soilDB%RZdepth,                          & ! IN L0
-               L1_nTCells_L0(s1:e1),                                                                     & ! IN L1
-               L1_upBound_L0(s1:e1), L1_downBound_L0(s1:e1),                                             & ! IN L1
-               L1_leftBound_L0(s1:e1), L1_rightBound_L0(s1:e1),                                          & ! IN L1
-               L1_latitude(s_p5(1):e_p5(1)),                                                             & ! IN L1
-               evap_coeff, fday_prec, fnight_prec, fday_pet, fnight_pet,                                 & ! IN F
-               fday_temp, fnight_temp,                                                                   & ! IN F
-               L1_temp_weights(s1:e1,:,:),                                                               & ! IN F
-               L1_pet_weights(s1:e1,:,:),                                                                & ! IN F
-               L1_pre_weights(s1:e1,:,:),                                                                & ! IN F
-               read_meteo_weights,                                                                       & ! IN F
-               L1_pet(s_p5(1):e_p5(1), iMeteo_p5(1)),                                                    & ! INOUT F:PET
-               L1_tmin(s_p5(2):e_p5(2), iMeteo_p5(2)),                                                   & ! IN F:PET
-               L1_tmax(s_p5(3):e_p5(3), iMeteo_p5(3)),                                                   & ! IN F:PET
-               L1_netrad(s_p5(4):e_p5(4), iMeteo_p5(4)),                                                 & ! IN F:PET
-               L1_absvappress(s_p5(5):e_p5(5), iMeteo_p5(5)),                                            & ! IN F:PET
-               L1_windspeed(s_p5(6):e_p5(6), iMeteo_p5(6)),                                              & ! IN F:PET
-               L1_pre(s_meteo:e_meteo,iMeteoTS),                                                         & ! IN F:Pre
-               L1_temp(s_meteo:e_meteo,iMeteoTS),                                                        & ! IN F:Temp
-               yId,                                                                                      & ! INOUT C
-               L1_fForest(s1:e1), L1_fPerm(s1:e1),  L1_fSealed(s1:e1),                                   & ! INOUT L1
-               L1_inter(s1:e1), L1_snowPack(s1:e1), L1_sealSTW(s1:e1),                                   & ! INOUT S
-               L1_soilMoist(s1:e1,:), L1_unsatSTW(s1:e1), L1_satSTW(s1:e1),                              & ! INOUT S
-               L1_neutrons(s1:e1),                                                                       & ! INOUT S
-               L1_pet_calc(s1:e1),                                                                       & ! INOUT X
-               L1_aETSoil(s1:e1,:), L1_aETCanopy(s1:e1), L1_aETSealed(s1:e1),                            & ! INOUT X
-               L1_baseflow(s1:e1), L1_infilSoil(s1:e1,:), L1_fastRunoff(s1:e1),                          & ! INOUT X
-               L1_melt(s1:e1), L1_percol(s1:e1), L1_preEffect(s1:e1), L1_rain(s1:e1),                    & ! INOUT X
-               L1_runoffSeal(s1:e1), L1_slowRunoff(s1:e1), L1_snow(s1:e1),                               & ! INOUT X
-               L1_Throughfall(s1:e1), L1_total_runoff(s1:e1),                                            & ! INOUT X
-               L1_alpha(s1:e1), L1_degDayInc(s1:e1), L1_degDayMax(s1:e1),                                & ! INOUT E1
-               L1_degDayNoPre(s1:e1), L1_degDay(s1:e1), L1_fAsp(s1:e1), L1_petLAIcorFactor(s1:e1),       & ! INOUT E1
-               L1_HarSamCoeff(s1:e1), L1_PrieTayAlpha(s1:e1,:), L1_aeroResist(s1:e1,:),                  & ! INOUT E1
-               L1_surfResist(s1:e1,:), L1_fRoots(s1:e1,:),                                               & ! INOUT E1
-               L1_maxInter(s1:e1), L1_karstLoss(s1:e1),  L1_kFastFlow(s1:e1),                            & ! INOUT E1
-               L1_kSlowFlow(s1:e1), L1_kBaseFlow(s1:e1), L1_kPerco(s1:e1),                               & ! INOUT E1
-               L1_soilMoistFC(s1:e1,:), L1_soilMoistSat(s1:e1,:), L1_soilMoistExp(s1:e1,:),              & ! INOUT E1
-               L1_jarvis_thresh_c1(s1:e1),                                                               & ! INOUT E1
-               L1_tempThresh(s1:e1), L1_unsatThresh(s1:e1), L1_sealedThresh(s1:e1),                      & ! INOUT E1
-               L1_wiltingPoint(s1:e1,:)                                                                  ) ! INOUT E1
-
-          ! call mRM routing
+        case(-2) ! monthly timestep
+          if (is_new_month) then
+            iLAI = iLAI + 1
+          end if
+        case(-3) ! yearly timestep
+          if (is_new_year) then
+            iLAI = iLAI + 1
+          end if
+        end select
+
+        ! -------------------------------------------------------------------------
+        ! ARGUMENT LIST KEY FOR mHM
+        ! -------------------------------------------------------------------------
+        !  C    CONFIGURATION
+        !  F    FORCING DATA L2
+        !  Q    INFLOW FROM UPSTREAM AREAS
+        !  L0   MORPHOLOGIC DATA L0
+        !  L1   MORPHOLOGIC DATA L1
+        !  L11  MORPHOLOGIC DATA L11
+        !  P    GLOBAL PARAMETERS
+        !  E    EFFECTIVE PARAMETER FIELDS (L1, L11 levels)
+        !  S    STATE VARIABLES L1
+        !  X    FLUXES (L1, L11 levels)
+        ! --------------------------------------------------------------------------
+        call mhm(read_restart, & ! IN C
+                tt, newTime - 0.5_dp, processMatrix, HorizonDepth_mHM, & ! IN C
+                nCells, nSoilHorizons_mHM, real(nTstepDay, dp), & ! IN C
+                neutron_integral_AFast, & ! IN C
+                parameterset, & ! IN
+                pack(level1(iBasin)%y, level1(iBasin)%mask), & ! IN L1
+                evap_coeff, fday_prec, fnight_prec, fday_pet, fnight_pet, & ! IN F
+                fday_temp, fnight_temp, & ! IN F
+                L1_temp_weights(s1 : e1, :, :), & ! IN F
+                L1_pet_weights(s1 : e1, :, :), & ! IN F
+                L1_pre_weights(s1 : e1, :, :), & ! IN F
+                read_meteo_weights, & ! IN F
+                L1_pet(s_p5(1) : e_p5(1), iMeteo_p5(1)), & ! INOUT F:PET
+                L1_tmin(s_p5(2) : e_p5(2), iMeteo_p5(2)), & ! IN F:PET
+                L1_tmax(s_p5(3) : e_p5(3), iMeteo_p5(3)), & ! IN F:PET
+                L1_netrad(s_p5(4) : e_p5(4), iMeteo_p5(4)), & ! IN F:PET
+                L1_absvappress(s_p5(5) : e_p5(5), iMeteo_p5(5)), & ! IN F:PET
+                L1_windspeed(s_p5(6) : e_p5(6), iMeteo_p5(6)), & ! IN F:PET
+                L1_pre(s_meteo : e_meteo, iMeteoTS), & ! IN F:Pre
+                L1_temp(s_meteo : e_meteo, iMeteoTS), & ! IN F:Temp
+                L1_fSealed(s1 : e1, 1, yId), & ! INOUT L1
+                L1_inter(s1 : e1), L1_snowPack(s1 : e1), L1_sealSTW(s1 : e1), & ! INOUT S
+                L1_soilMoist(s1 : e1, :), L1_unsatSTW(s1 : e1), L1_satSTW(s1 : e1), & ! INOUT S
+                L1_neutrons(s1 : e1), & ! INOUT S
+                L1_pet_calc(s1 : e1), & ! INOUT X
+                L1_aETSoil(s1 : e1, :), L1_aETCanopy(s1 : e1), L1_aETSealed(s1 : e1), & ! INOUT X
+                L1_baseflow(s1 : e1), L1_infilSoil(s1 : e1, :), L1_fastRunoff(s1 : e1), & ! INOUT X
+                L1_melt(s1 : e1), L1_percol(s1 : e1), L1_preEffect(s1 : e1), L1_rain(s1 : e1), & ! INOUT X
+                L1_runoffSeal(s1 : e1), L1_slowRunoff(s1 : e1), L1_snow(s1 : e1), & ! INOUT X
+                L1_Throughfall(s1 : e1), L1_total_runoff(s1 : e1), & ! INOUT X
+                L1_alpha(s1 : e1, 1, 1), L1_degDayInc(s1 : e1, 1, yId), L1_degDayMax(s1 : e1, 1, yId), & ! INOUT E1
+                L1_degDayNoPre(s1 : e1, 1, yId), L1_degDay(s1 : e1, 1, 1), L1_fAsp(s1 : e1, 1, 1), & ! INOUT E1
+                L1_petLAIcorFactor(s1 : e1, iLAI, yId), L1_HarSamCoeff(s1 : e1, 1, 1), & ! INOUT E1
+                L1_PrieTayAlpha(s1 : e1, iLAI, 1), L1_aeroResist(s1 : e1, iLAI, yId), & ! INOUT E1
+                L1_surfResist(s1 : e1, iLAI, 1), L1_fRoots(s1 : e1, :, yId), & ! INOUT E1
+                L1_maxInter(s1 : e1, iLAI, 1), L1_karstLoss(s1 : e1, 1, 1), & ! INOUT E1
+                L1_kFastFlow(s1 : e1, 1, yId), L1_kSlowFlow(s1 : e1, 1, 1), & ! INOUT E1
+                L1_kBaseFlow(s1 : e1, 1, 1), L1_kPerco(s1 : e1, 1, 1), & ! INOUT E1
+                L1_soilMoistFC(s1 : e1, :, yId), L1_soilMoistSat(s1 : e1, :, yId), & ! INOUT E1
+                L1_soilMoistExp(s1 : e1, :, yId), L1_jarvis_thresh_c1(s1 : e1, 1, 1), & ! INOUT E1
+                L1_tempThresh(s1 : e1, 1, yId), L1_unsatThresh(s1 : e1, 1, 1), & ! INOUT E1
+                L1_sealedThresh(s1 : e1, 1, 1), & ! INOUT E1
+                L1_wiltingPoint(s1 : e1, :, yId)) ! INOUT E1
+
+        ! call mRM routing
 #ifdef MRM2MHM
-          if (processMatrix(8, 1) .gt. 0) then
-             ! set discharge timestep
-             iDischargeTS = ceiling(real(tt,dp) / real(NTSTEPDAY,dp))
-             ! determine whether mpr is to be executed
-             if( ( LCyearId(year,ii) .NE. yId) .or. (tt .EQ. 1) ) then
-                do_mpr = perform_mpr
-                Lcover_yID = LCyearId(year, ii)
-             else
-                do_mpr = .false.
-             end if
-             !
-             ! set input variables for routing
-             if (processMatrix(8, 1) .eq. 1) then
-                ! >>>
-                ! >>> original Muskingum routing, executed every time
-                ! >>>
-                do_rout         = .True.
-                tsRoutFactorIn  = 1._dp
-                timestep_rout   = timestep
-                RunToRout       = L1_total_runoff(s1:e1) ! runoff [mm TST-1] mm per timestep
-                InflowDischarge = InflowGauge%Q(iDischargeTS,:) ! inflow discharge in [m3 s-1]
-                timestep_rout   = timestep
-                !
-             else if (processMatrix(8, 1) .eq. 2) then
-                ! >>>
-                ! >>> adaptive timestep
-                ! >>>
-                do_rout = .False.
-                ! set dummy lcover_yID
-                Lcover_yID = 1_i4
-                ! calculate factor
-                tsRoutFactor = L11_tsRout(ii) / (timestep * HourSecs)
-                ! print *, 'routing factor: ', tsRoutFactor
-                ! prepare routing call
-                if (tsRoutFactor .lt. 1._dp) then
-                   ! ----------------------------------------------------------------
-                   ! routing timesteps are shorter than hydrologic time steps
-                   ! ----------------------------------------------------------------
-                   ! set all input variables
-                   tsRoutFactorIn = tsRoutFactor
-                   RunToRout = L1_total_runoff(s1:e1) ! runoff [mm TST-1] mm per timestep
-                   InflowDischarge = InflowGauge%Q(iDischargeTS,:) ! inflow discharge in [m3 s-1]
-                   timestep_rout = timestep
-                   do_rout = .True.
-                else
-                   ! ----------------------------------------------------------------
-                   ! routing timesteps are longer than hydrologic time steps
-                   ! ----------------------------------------------------------------
-                   ! set all input variables
-                   tsRoutFactorIn = tsRoutFactor
-                   RunToRout = RunToRout + L1_total_runoff(s1:e1)
-                   InflowDischarge = InflowDischarge + InflowGauge%Q(iDischargeTS, :)
-                   ! reset tsRoutFactorIn if last period did not cover full period
-                   if ((tt .eq. nTimeSteps) .and. (mod(tt, nint(tsRoutFactorIn)) .ne. 0_i4)) &
-                        tsRoutFactorIn = mod(tt, nint(tsRoutFactorIn))
-                   if ((mod(tt, nint(tsRoutFactorIn)) .eq. 0_i4) .or. (tt .eq. nTimeSteps)) then
-                      InflowDischarge = InflowDischarge / tsRoutFactorIn
-                      timestep_rout = timestep * nint(tsRoutFactor, i4)
-                      do_rout = .True.
-                   end if
-                end if
-             end if
-             ! -------------------------------------------------------------------
-             ! execute routing
-             ! -------------------------------------------------------------------
-             if (do_rout) call mRM_routing( &
+        if (processMatrix(8, 1) .gt. 0) then
+          ! set discharge timestep
+          iDischargeTS = ceiling(real(tt, dp) / real(nTstepDay, dp))
+          ! set input variables for routing
+          if (processMatrix(8, 1) .eq. 1) then
+            ! >>>
+            ! >>> original Muskingum routing, executed every time
+            ! >>>
+            do_rout = .True.
+            tsRoutFactorIn = 1._dp
+            timestep_rout = timestep
+            RunToRout = L1_total_runoff(s1 : e1) ! runoff [mm TST-1] mm per timestep
+            InflowDischarge = InflowGauge%Q(iDischargeTS, :) ! inflow discharge in [m3 s-1]
+            timestep_rout = timestep
+            !
+          else if (processMatrix(8, 1) .eq. 2) then
+            ! >>>
+            ! >>> adaptive timestep
+            ! >>>
+            do_rout = .False.
+            ! calculate factor
+            tsRoutFactor = L11_tsRout(iBasin) / (timestep * HourSecs)
+            ! print *, 'routing factor: ', tsRoutFactor
+            ! prepare routing call
+            if (tsRoutFactor .lt. 1._dp) then
+              ! ----------------------------------------------------------------
+              ! routing timesteps are shorter than hydrologic time steps
+              ! ----------------------------------------------------------------
+              ! set all input variables
+              tsRoutFactorIn = tsRoutFactor
+              RunToRout = L1_total_runoff(s1 : e1) ! runoff [mm TST-1] mm per timestep
+              InflowDischarge = InflowGauge%Q(iDischargeTS, :) ! inflow discharge in [m3 s-1]
+              timestep_rout = timestep
+              do_rout = .True.
+            else
+              ! ----------------------------------------------------------------
+              ! routing timesteps are longer than hydrologic time steps
+              ! ----------------------------------------------------------------
+              ! set all input variables
+              tsRoutFactorIn = tsRoutFactor
+              RunToRout = RunToRout + L1_total_runoff(s1 : e1)
+              InflowDischarge = InflowDischarge + InflowGauge%Q(iDischargeTS, :)
+              ! reset tsRoutFactorIn if last period did not cover full period
+              if ((tt .eq. nTimeSteps) .and. (mod(tt, nint(tsRoutFactorIn)) .ne. 0_i4)) &
+                      tsRoutFactorIn = mod(tt, nint(tsRoutFactorIn))
+              if ((mod(tt, nint(tsRoutFactorIn)) .eq. 0_i4) .or. (tt .eq. nTimeSteps)) then
+                InflowDischarge = InflowDischarge / tsRoutFactorIn
+                timestep_rout = timestep * nint(tsRoutFactor, i4)
+                do_rout = .True.
+              end if
+            end if
+          end if
+          ! -------------------------------------------------------------------
+          ! execute routing
+          ! -------------------------------------------------------------------
+          if (do_rout) call mRM_routing(&
                   ! general INPUT variables
+                  read_restart, &
                   processMatrix(8, 1), & ! parse process Case to be used
                   parameterset(processMatrix(8, 3) - processMatrix(8, 2) + 1 : processMatrix(8, 3)), & ! routing par.
                   RunToRout, & ! runoff [mm TST-1] mm per timestep old: L1_total_runoff_in(s1:e1, tt), &
-                  L1_areaCell(s1:e1), &
-                  L1_L11_Id(s1:e1), &
-                  L11_areaCell(s11:e11), &
-                  L11_L1_Id(s11:e11), &
-                  L11_netPerm(s11:e11), & ! routing order at L11
-                  L11_fromN(s11:e11), & ! link source at L11
-                  L11_toN(s11:e11), & ! link target at L11
-                  L11_nOutlets(ii), & ! number of outlets
+                  level1(iBasin)%CellArea * 1.E-6_dp, &
+                  L1_L11_Id(s1 : e1), &
+                  level11(iBasin)%CellArea * 1.E-6_dp, &
+                  L11_L1_Id(s11 : e11), &
+                  L11_netPerm(s11 : e11), & ! routing order at L11
+                  L11_fromN(s11 : e11), & ! link source at L11
+                  L11_toN(s11 : e11), & ! link target at L11
+                  L11_nOutlets(iBasin), & ! number of outlets
                   timestep_rout, & ! timestep of runoff to rout [h]
                   tsRoutFactorIn, & ! simulate timestep in [h]
-                  basin_mrm%L11_iEnd(ii) - basin_mrm%L11_iStart(ii) + 1, & ! number of Nodes
-                  basin_mrm%nInflowGauges(ii), &
-                  basin_mrm%InflowGaugeIndexList(ii,:), &
-                  basin_mrm%InflowGaugeHeadwater(ii,:), &
-                  basin_mrm%InflowGaugeNodeList(ii,:), &
+                  level11(iBasin)%nCells, & ! number of Nodes
+                  basin_mrm(iBasin)%nInflowGauges, &
+                  basin_mrm(iBasin)%InflowGaugeIndexList(:), &
+                  basin_mrm(iBasin)%InflowGaugeHeadwater(:), &
+                  basin_mrm(iBasin)%InflowGaugeNodeList(:), &
                   InflowDischarge, &
-                  basin_mrm%nGauges(ii), &
-                  basin_mrm%gaugeIndexList(ii,:), &
-                  basin_mrm%gaugeNodeList(ii,:), &
-                  ge(resolutionRouting(ii), resolutionHydrology(ii)), &
+                  basin_mrm(iBasin)%nGauges, &
+                  basin_mrm(iBasin)%gaugeIndexList(:), &
+                  basin_mrm(iBasin)%gaugeNodeList(:), &
+                  ge(resolutionRouting(iBasin), resolutionHydrology(iBasin)), &
                   ! original routing specific input variables
-                  L0_LCover_mRM(s0:e0, Lcover_yID), & ! L0 land cover
-                  L0_floodPlain(s110:e110), & ! flood plains at L0 level
-                  L0_areaCell(s0:e0), &
-                  L11_aFloodPlain(s11:e11), & ! flood plains at L11 level
-                  L11_length(s11:e11 - 1), & ! link length
-                  L11_slope(s11:e11 - 1), &
+                  L11_length(s11 : e11 - 1), & ! link length
+                  L11_slope(s11 : e11 - 1), &
+                  L11_nLinkFracFPimp(s11 : e11, yID), & ! fraction of impervious layer at L11 scale
                   ! general INPUT/OUTPUT variables
-                  L11_C1(s11:e11), & ! first muskingum parameter
-                  L11_C2(s11:e11), & ! second muskigum parameter
-                  L11_qOUT(s11:e11), & ! routed runoff flowing out of L11 cell
-                  L11_qTIN(s11:e11,:), & ! inflow water into the reach at L11
-                  L11_qTR(s11:e11,:), & !
-                  L11_qMod(s11:e11), &
-                  mRM_runoff(tt, :), &
-                  ! original routing specific input/output variables
-                  L11_FracFPimp(s11:e11), & ! fraction of impervious layer at L11 scale
-                  ! OPTIONAL INPUT variables
-                  do_mpr)
-             ! -------------------------------------------------------------------
-             ! reset variables
-             ! -------------------------------------------------------------------
-             if (processMatrix(8, 1) .eq. 1) then
+                  L11_C1(s11 : e11), & ! first muskingum parameter
+                  L11_C2(s11 : e11), & ! second muskigum parameter
+                  L11_qOUT(s11 : e11), & ! routed runoff flowing out of L11 cell
+                  L11_qTIN(s11 : e11, :), & ! inflow water into the reach at L11
+                  L11_qTR(s11 : e11, :), & !
+                  L11_qMod(s11 : e11), &
+                  mRM_runoff(tt, :) &
+                  )
+            ! -------------------------------------------------------------------
+            ! reset variables
+            ! -------------------------------------------------------------------
+            if (processMatrix(8, 1) .eq. 1) then
+              ! reset Input variables
+              InflowDischarge = 0._dp
+              RunToRout = 0._dp
+            else if (processMatrix(8, 1) .eq. 2) then
+              if ((.not. (tsRoutFactorIn .lt. 1._dp)) .and. do_rout) then
+                do jj = 1, nint(tsRoutFactorIn)
+                  mRM_runoff(tt - jj + 1, :) = mRM_runoff(tt, :)
+                end do
                 ! reset Input variables
                 InflowDischarge = 0._dp
                 RunToRout = 0._dp
-             else if (processMatrix(8, 1) .eq. 2) then
-                if ((.not. (tsRoutFactorIn .lt. 1._dp)) .and. do_rout) then
-                   do jj = 1, nint(tsRoutFactorIn)
-                      mRM_runoff(tt - jj + 1, :) = mRM_runoff(tt, :)
-                   end do
-                   ! reset Input variables
-                   InflowDischarge = 0._dp
-                   RunToRout = 0._dp
-                end if
-             end if
+              end if
+            end if
           end if
 #endif
 
-          ! update the counters
-          if (day_counter   .NE. day  ) day_counter   = day
-          if (month_counter .NE. month) month_counter = month
-          if (year_counter  .NE. year)  year_counter  = year
-
-          ! increment of timestep
-          newTime = julday(day,month,year) + real(hour+timestep,dp)/24._dp
-          ! calculate new year, month and day
-          call caldat(int(newTime), yy=year, mm=month, dd=day)
-
-          if (.not. optimize) then
+        ! prepare the date and time information for next iteration step...
+        ! TODO: turn datetime information into type with procedure "increment"
+        ! set the current year as previous
+        prev_day = day
+        prev_month = month
+        prev_year = year
+        ! set the flags to false
+        is_new_day = .false.
+        is_new_month = .false.
+        is_new_year = .false.
+
+        ! increment of timestep
+        hour = mod(hour + timestep, 24)
+        newTime = julday(day, month, year) + real(hour + timestep, dp) / 24._dp
+        ! calculate new year, month and day
+        call caldat(int(newTime), yy = year, mm = month, dd = day)
+        ! update the flags
+        if (prev_day .ne. day) is_new_day = .true.
+        if (prev_month .ne. month) is_new_month = .true.
+        if (prev_year .ne. year) is_new_year = .true.
+
+        if (.not. optimize) then
 #ifdef MRM2MHM
-             if (any(outputFlxState_mrm)) then
-                call mrm_write_output_fluxes( &
-                     ! basin id
-                     ii, &
-                     ! output specification
-                     timeStep_model_outputs_mrm, &
-                     ! time specification
-                     warmingDays_mrm(ii), newTime, nTimeSteps, nTStepDay, &
-                     tt, &
-                     ! parse previous date to mRM writer
-                     day_counter, month_counter, year_counter, &
-                     timestep, &
-                     ! mask specification
-                     mask11, &
-                     ! output variables
-                     L11_qmod(s11:e11))
-             end if
+          if (any(outputFlxState_mrm)) then
+            call mrm_write_output_fluxes(&
+                  ! basin id
+                  iBasin, &
+                  ! nCells in basin
+                  level11(iBasin)%nCells, &
+                  ! output specification
+                  timeStep_model_outputs_mrm, &
+                  ! time specification
+                  warmingDays(iBasin), newTime, nTimeSteps, nTstepDay, &
+                  tt, &
+                  ! parse previous date to mRM writer
+                  prev_day, prev_month, prev_year, &
+                  timestep, &
+                  ! mask specification
+                  mask11, &
+                  ! output variables
+                  L11_qmod(s11 : e11))
+        end if
 #endif
 
-             ! output only for evaluation period
-             tIndex_out = (tt-warmingDays(ii)*NTSTEPDAY) ! tt if write out of warming period
+        ! output only for evaluation period
+        tIndex_out = (tt - warmingDays(iBasin) * nTstepDay) ! tt if write out of warming period
 
-             if ((any(outputFlxState)) .and. (tIndex_out .gt. 0_i4)) then
+        if ((any(outputFlxState)) .and. (tIndex_out .gt. 0_i4)) then
 
-                average_counter = average_counter + 1
+          average_counter = average_counter + 1
 
-                if ( tIndex_out .EQ. 1 ) then
-                   L1_fNotSealed = 1.0_dp - L1_fSealed
+          if (tIndex_out .EQ. 1) then
 #ifdef pgiFortran154
-                   nc = newOutputDataset(ii, mask1)
+            nc = newOutputDataset(iBasin, mask1, level1(iBasin)%nCells)
 #else
-                   nc = OutputDataset(ii, mask1)
+            nc = OutputDataset(iBasin, mask1, level1(iBasin)%nCells)
 #endif
-                end if
-
-                call nc%updateDataset( &
-                     s1              , &
-                     e1              , &
-                     L1_fSealed      , &
-                     L1_fNotSealed   , &
-                     L1_inter        , &
-                     L1_snowPack     , &
-                     L1_soilMoist    , &
-                     L1_soilMoistSat , &
-                     L1_sealSTW      , &
-                     L1_unsatSTW     , &
-                     L1_satSTW       , &
-                     L1_neutrons     , &
-                     L1_pet_calc     , &
-                     L1_aETSoil      , &
-                     L1_aETCanopy    , &
-                     L1_aETSealed    , &
-                     L1_total_runoff , &
-                     L1_runoffSeal   , &
-                     L1_fastRunoff   , &
-                     L1_slowRunoff   , &
-                     L1_baseflow     , &
-                     L1_percol       , &
-                     L1_infilSoil    , &
-                     L1_preEffect      &
-                     )
-
-                ! write data
-                writeout = .false.
-                if (timeStep_model_outputs .gt. 0) then
-                   if ((mod(tIndex_out, timeStep_model_outputs) .eq. 0) .or. (tt .eq. nTimeSteps)) writeout = .true.
-                else
-                   select case(timeStep_model_outputs)
-                   case(0) ! only at last time step
-                      if (tt .eq. nTimeSteps) writeout = .true.
-                   case(-1) ! daily
-                      if (((tIndex_out .gt. 1) .and. (day_counter .ne. day)) .or. (tt .eq. nTimeSteps))     writeout = .true.
-                   case(-2) ! monthly
-                      if (((tIndex_out .gt. 1) .and. (month_counter .ne. month)) .or. (tt .eq. nTimeSteps)) writeout = .true.
-                   case(-3) ! yearly
-                      if (((tIndex_out .gt. 1) .and. (year_counter .ne. year)) .or. (tt .eq. nTimeSteps))   writeout = .true.
-                   case default ! no output at all
-                      continue
-                   end select
-                end if
-
-                if (writeout) then
-                   call nc%writeTimestep(tIndex_out*timestep-1)
-                end if
-
-                if( tt .eq. nTimeSteps ) then
-                   call nc%close()
-                end if
-
-             end if
-          end if ! <-- if (.not. optimize)
-
-          !----------------------------------------------------------------------
-          ! FOR SOIL MOISTURE
-          ! NOTE:: modeled soil moisture is averaged according to input time step
-          !        soil moisture (timeStep_sm_input)
-          !----------------------------------------------------------------------
-          if (present(sm_opti)) then
-             if ( tt .EQ. 1 ) writeout_counter = 1
-             ! only for evaluation period - ignore warming days
-             if ( (tt-warmingDays(ii)*NTSTEPDAY) .GT. 0 ) then
-                ! decide for daily, monthly or yearly aggregation
-                select case(timeStep_sm_input)
-                case(-1) ! daily
-                   if (day   .NE. day_counter)   then
-                      sm_opti(s1:e1,writeout_counter) = sm_opti(s1:e1,writeout_counter) / real(average_counter,dp)
-                      writeout_counter = writeout_counter + 1
-                      average_counter = 0
-                   end if
-                case(-2) ! monthly
-                   if (month .NE. month_counter) then
-                      sm_opti(s1:e1,writeout_counter) = sm_opti(s1:e1,writeout_counter) / real(average_counter,dp)
-                      writeout_counter = writeout_counter + 1
-                      average_counter = 0
-                   end if
-                case(-3) ! yearly
-                   if (year  .NE. year_counter)  then
-                      sm_opti(s1:e1,writeout_counter) = sm_opti(s1:e1,writeout_counter) / real(average_counter,dp)
-                      writeout_counter = writeout_counter + 1
-                      average_counter = 0
-                   end if
-                end select
-
-                ! last timestep is already done - write_counter exceeds size(sm_opti, dim=2)
-                if (.not. (tt .eq. nTimeSteps) ) then
-                   ! aggregate soil moisture to needed time step for optimization
-                   sm_opti(s1:e1,writeout_counter) = sm_opti(s1:e1,writeout_counter) + &
-                        sum(L1_soilMoist   (s1:e1, 1:nSoilHorizons_sm_input), dim=2) / &
-                        sum(L1_soilMoistSat(s1:e1, 1:nSoilHorizons_sm_input), dim=2)
-                end if
-
-                ! increase average counter by one
-                average_counter = average_counter + 1
-             end if
           end if
 
-          !----------------------------------------------------------------------
-          ! FOR TOTAL WATER STORAGE
-          if( present(basin_avg_tws) ) then
-               area_basin = sum(L1_areaCell(s1:e1) )
-               TWS_field(s1:e1) = L1_inter(s1:e1) + L1_snowPack(s1:e1) + L1_sealSTW(s1:e1) + &
-                                        L1_unsatSTW(s1:e1) + L1_satSTW(s1:e1)
-               do gg = 1, nSoilHorizons_mHM
-                  TWS_field(s1:e1) =   TWS_field(s1:e1) + L1_soilMoist (s1:e1,gg)
-                            end do
-             basin_avg_TWS_sim(tt,ii) = ( dot_product( TWS_field (s1:e1), L1_areaCell(s1:e1) ) / area_basin )
+          call nc%updateDataset(&
+                  s1, &
+                  e1, &
+                  L1_fSealed(:, 1, yId), &
+                  L1_fNotSealed(:, 1, yId), &
+                  L1_inter, &
+                  L1_snowPack, &
+                  L1_soilMoist, &
+                  L1_soilMoistSat(:, :, yId), &
+                  L1_sealSTW, &
+                  L1_unsatSTW, &
+                  L1_satSTW, &
+                  L1_neutrons, &
+                  L1_pet_calc, &
+                  L1_aETSoil, &
+                  L1_aETCanopy, &
+                  L1_aETSealed, &
+                  L1_total_runoff, &
+                  L1_runoffSeal, &
+                  L1_fastRunoff, &
+                  L1_slowRunoff, &
+                  L1_baseflow, &
+                  L1_percol, &
+                  L1_infilSoil, &
+                  L1_preEffect      &
+                  )
+
+          ! write data
+          writeout = .false.
+          if (timeStep_model_outputs .gt. 0) then
+            if ((mod(tIndex_out, timeStep_model_outputs) .eq. 0) .or. (tt .eq. nTimeSteps)) writeout = .true.
+          else
+            select case(timeStep_model_outputs)
+            case(0) ! only at last time step
+              if (tt .eq. nTimeSteps) writeout = .true.
+            case(-1) ! daily
+              if (((tIndex_out .gt. 1) .and. is_new_day) .or. (tt .eq. nTimeSteps))     writeout = .true.
+            case(-2) ! monthly
+              if (((tIndex_out .gt. 1) .and. is_new_month) .or. (tt .eq. nTimeSteps)) writeout = .true.
+            case(-3) ! yearly
+              if (((tIndex_out .gt. 1) .and. is_new_year) .or. (tt .eq. nTimeSteps))   writeout = .true.
+            case default ! no output at all
+
+            end select
           end if
-          !----------------------------------------------------------------------
-
-          !----------------------------------------------------------------------
-          ! FOR NEUTRONS
-          ! NOTE:: modeled neutrons are averaged daily
-          !----------------------------------------------------------------------
-          if (present(neutrons_opti)) then
-             if ( tt .EQ. 1 ) writeout_counter = 1
-             ! only for evaluation period - ignore warming days
-             if ( (tt-warmingDays(ii)*NTSTEPDAY) .GT. 0 ) then
-                ! decide for daily, monthly or yearly aggregation
-                ! daily
-                if (day   .NE. day_counter)   then
-                   neutrons_opti(s1:e1,writeout_counter) = neutrons_opti(s1:e1,writeout_counter) / real(average_counter,dp)
-                   writeout_counter = writeout_counter + 1
-                   average_counter = 0
-                end if
-
-                ! last timestep is already done - write_counter exceeds size(sm_opti, dim=2)
-                if (.not. (tt .eq. nTimeSteps) ) then
-                   ! aggregate neutrons to needed time step for optimization
-                   neutrons_opti(s1:e1,writeout_counter) = neutrons_opti(s1:e1,writeout_counter) + L1_neutrons(s1:e1)
-                end if
-
-                average_counter = average_counter + 1
-             end if
+
+          if (writeout) then
+            call nc%writeTimestep(tIndex_out * timestep - 1)
           end if
 
-          !----------------------------------------------------------------------
-          ! FOR EVAPOTRANSPIRATION
-          ! NOTE:: modeled evapotranspiration is averaged according to input time step
-          !        evapotranspiration (timeStep_sm_input)
-          !----------------------------------------------------------------------
-          if (present(et_opti)) then
-             if ( tt .EQ. 1 ) then
-                writeout_counter = 1
-                L1_fNotSealed = 1.0_dp - L1_fSealed
-             end if
-
-             ! only for evaluation period - ignore warming days
-             if ( (tt-warmingDays(ii)*NTSTEPDAY) .GT. 0 ) then
-                ! decide for daily, monthly or yearly aggregation
-                select case(timeStep_et_input)
-                case(-1) ! daily
-                   if (day   .NE. day_counter)   then
-                      writeout_counter = writeout_counter + 1
-                   end if
-                case(-2) ! monthly
-                   if (month .NE. month_counter) then
-                      writeout_counter = writeout_counter + 1
-                   end if
-                case(-3) ! yearly
-                   if (year  .NE. year_counter)  then
-                      writeout_counter = writeout_counter + 1
-                   end if
-                end select
-
-                ! last timestep is already done - write_counter exceeds size(et_opti, dim=2)
-                if (.not. (tt .eq. nTimeSteps) ) then
-                   ! aggregate evapotranspiration to needed time step for optimization
-                   et_opti(s1:e1,writeout_counter) = et_opti(s1:e1,writeout_counter) + &
-                        sum(L1_aETSoil(s1:e1,:), dim=2) * L1_fNotSealed(s1:e1) + &
-                        L1_aETCanopy(s1:e1) + &
-                        L1_aETSealed(s1:e1) * L1_fSealed(s1:e1)
-                end if
-             end if
+          if(tt .eq. nTimeSteps) then
+            call nc%close()
           end if
 
-       end do !<< TIME STEPS LOOP
+        end if
+        end if ! <-- if (.not. optimize)
+
+        !----------------------------------------------------------------------
+        ! FOR SOIL MOISTURE
+        ! NOTE:: modeled soil moisture is averaged according to input time step
+        !        soil moisture (timeStep_sm_input)
+        !----------------------------------------------------------------------
+        if (present(sm_opti)) then
+          if (tt .EQ. 1) writeout_counter = 1
+          ! only for evaluation period - ignore warming days
+          if ((tt - warmingDays(iBasin) * nTstepDay) .GT. 0) then
+            ! decide for daily, monthly or yearly aggregation
+            select case(timeStep_sm_input)
+            case(-1) ! daily
+              if (is_new_day)   then
+                sm_opti(s1 : e1, writeout_counter) = sm_opti(s1 : e1, writeout_counter) / real(average_counter, dp)
+                writeout_counter = writeout_counter + 1
+                average_counter = 0
+              end if
+            case(-2) ! monthly
+              if (is_new_month) then
+                sm_opti(s1 : e1, writeout_counter) = sm_opti(s1 : e1, writeout_counter) / real(average_counter, dp)
+                writeout_counter = writeout_counter + 1
+                average_counter = 0
+              end if
+            case(-3) ! yearly
+              if (is_new_year)  then
+                sm_opti(s1 : e1, writeout_counter) = sm_opti(s1 : e1, writeout_counter) / real(average_counter, dp)
+                writeout_counter = writeout_counter + 1
+                average_counter = 0
+              end if
+            end select
+
+            ! last timestep is already done - write_counter exceeds size(sm_opti, dim=2)
+            if (.not. (tt .eq. nTimeSteps)) then
+              ! aggregate soil moisture to needed time step for optimization
+              sm_opti(s1 : e1, writeout_counter) = sm_opti(s1 : e1, writeout_counter) + &
+                      sum(L1_soilMoist   (s1 : e1, 1 : nSoilHorizons_sm_input), dim = 2) / &
+                              sum(L1_soilMoistSat(s1 : e1, 1 : nSoilHorizons_sm_input, yId), dim = 2)
+            end if
+
+            ! increase average counter by one
+            average_counter = average_counter + 1
+          end if
+        end if
+
+        !----------------------------------------------------------------------
+        ! FOR TOTAL WATER STORAGE
+        if(present(basin_avg_tws)) then
+          area_basin = sum(level1(iBasin)%CellArea) * 1.E-6_dp
+          TWS_field(s1 : e1) = L1_inter(s1 : e1) + L1_snowPack(s1 : e1) + L1_sealSTW(s1 : e1) + &
+                  L1_unsatSTW(s1 : e1) + L1_satSTW(s1 : e1)
+          do gg = 1, nSoilHorizons_mHM
+            TWS_field(s1 : e1) = TWS_field(s1 : e1) + L1_soilMoist (s1 : e1, gg)
+          end do
+          basin_avg_TWS_sim(tt, iBasin) = (dot_product(TWS_field (s1 : e1), level1(iBasin)%CellArea * 1.E-6_dp) / area_basin)
+        end if
+        !----------------------------------------------------------------------
+
+        !----------------------------------------------------------------------
+        ! FOR NEUTRONS
+        ! NOTE:: modeled neutrons are averaged daily
+        !----------------------------------------------------------------------
+        if (present(neutrons_opti)) then
+          if (tt .EQ. 1) writeout_counter = 1
+          ! only for evaluation period - ignore warming days
+          if ((tt - warmingDays(iBasin) * nTstepDay) .GT. 0) then
+            ! decide for daily, monthly or yearly aggregation
+            ! daily
+            if (is_new_day)   then
+              neutrons_opti(s1 : e1, writeout_counter) = neutrons_opti(s1 : e1, writeout_counter) / real(average_counter, dp)
+              writeout_counter = writeout_counter + 1
+              average_counter = 0
+            end if
+
+            ! last timestep is already done - write_counter exceeds size(sm_opti, dim=2)
+            if (.not. (tt .eq. nTimeSteps)) then
+              ! aggregate neutrons to needed time step for optimization
+              neutrons_opti(s1 : e1, writeout_counter) = neutrons_opti(s1 : e1, writeout_counter) + L1_neutrons(s1 : e1)
+            end if
+
+            average_counter = average_counter + 1
+          end if
+        end if
+
+        !----------------------------------------------------------------------
+        ! FOR EVAPOTRANSPIRATION
+        ! NOTE:: modeled evapotranspiration is averaged according to input time step
+        !        evapotranspiration (timeStep_sm_input)
+        !----------------------------------------------------------------------
+        if (present(et_opti)) then
+          if (tt .EQ. 1) then
+            writeout_counter = 1
+          end if
+
+          ! only for evaluation period - ignore warming days
+          if ((tt - warmingDays(iBasin) * nTstepDay) .GT. 0) then
+            ! decide for daily, monthly or yearly aggregation
+            select case(timeStep_et_input)
+            case(-1) ! daily
+              if (is_new_day)   then
+                writeout_counter = writeout_counter + 1
+              end if
+            case(-2) ! monthly
+              if (is_new_month) then
+                writeout_counter = writeout_counter + 1
+              end if
+            case(-3) ! yearly
+              if (is_new_year)  then
+                writeout_counter = writeout_counter + 1
+              end if
+            end select
+
+            ! last timestep is already done - write_counter exceeds size(et_opti, dim=2)
+            if (.not. (tt .eq. nTimeSteps)) then
+              ! aggregate evapotranspiration to needed time step for optimization
+              et_opti(s1 : e1, writeout_counter) = et_opti(s1 : e1, writeout_counter) + &
+                      sum(L1_aETSoil(s1 : e1, :), dim = 2) * L1_fNotSealed(s1 : e1, 1, yId) + &
+                      L1_aETCanopy(s1 : e1) + &
+                      L1_aETSealed(s1 : e1) * L1_fSealed(s1 : e1, 1, yId)
+            end if
+          end if
+        end if
 
-       ! deallocate space for temprory LAI fields
-       deallocate(LAI)
-       ! deallocate TWS field temporal variable
-       if (allocated(TWS_field) ) deallocate(TWS_field)
+        ! update the year-dependent yID (land cover id)
+        if (is_new_year .and. tt .lt. nTimeSteps) then
+          yId = LCyearId(year, iBasin)
+        end if
 
+      end do !<< TIME STEPS LOOP
+
+      ! deallocate TWS field temporal variable
+      if (allocated(TWS_field)) deallocate(TWS_field)
 #ifdef MRM2MHM
        if (processMatrix(8, 1) .ne. 0) then
-          ! clean runoff variable
-          deallocate(RunToRout)
-       end if
+        ! clean runoff variable
+        deallocate(RunToRout)
+      end if
 #endif
 
-
     end do !<< BASIN LOOP
-
 #ifdef MRM2MHM
     ! =========================================================================
     ! SET RUNOFF OUTPUT VARIABLE
@@ -983,7 +929,7 @@ SUBROUTINE mhm_eval(parameterset, runoff, sm_opti, basin_avg_tws, neutrons_opti,
     ! =========================================================================
     ! SET TWS OUTPUT VARIABLE
     ! =========================================================================
-    if( present(basin_avg_tws) ) basin_avg_tws = basin_avg_TWS_sim
+    if(present(basin_avg_tws)) basin_avg_tws = basin_avg_TWS_sim
 
   end SUBROUTINE mhm_eval
 
diff --git a/src/mHM/mo_mhm_read_config.f90 b/src/mHM/mo_mhm_read_config.f90
new file mode 100644
index 00000000..0d61791f
--- /dev/null
+++ b/src/mHM/mo_mhm_read_config.f90
@@ -0,0 +1,398 @@
+!> \file mo_read_config.f90
+
+!> \brief Reading of main model configurations.
+
+!> \details This routine reads the configurations of mHM including, input and
+!>          output directories, module usage specification, simulation time periods,
+!>          global parameters, ...
+
+!> \authors Matthias Zink
+!> \date Dec 2012
+
+MODULE mo_mhm_read_config
+
+  USE mo_kind, ONLY : i4, dp
+
+  IMPLICIT NONE
+
+  PRIVATE
+
+  PUBLIC :: mhm_read_config ! read main directories
+
+  ! ------------------------------------------------------------------
+
+CONTAINS
+
+  ! ------------------------------------------------------------------
+
+  !     NAME
+  !         read_config
+
+  !     PURPOSE
+  !>        \brief Read main configurations for mHM
+
+  !>        \details The main configurations in mHM are read from three files:
+  !>                 
    + !>
  1. mhm.nml + !>
  2. mhm_parameters.nml + !>
  3. mhm_outputs.nml + !>
+ !> For details please refer to the above mentioned namelist files. + + ! CALLING SEQUENCE + ! None + + ! INDENT(IN) + ! None + + ! INDENT(INOUT) + ! None + + ! INDENT(OUT) + ! None + + ! INDENT(IN), OPTIONAL + ! None + + ! INDENT(INOUT), OPTIONAL + ! None + + ! INDENT(OUT), OPTIONAL + ! None + + ! RETURN + ! None + + ! RESTRICTIONS + ! None + + ! EXAMPLE + ! None + + ! LITERATURE + ! None + + ! HISTORY + !> \author Matthias Zink + !> \date Dec 2012 + ! Modified Luis Samaniego, Jan 2013 - messages + ! Rohini Kumar + ! Matthias Cuntz, Jan 2013 - namelist consolidation and positioning + ! Matthias Zink, Jan 2013 - bug fix, added gaugeinfo reading + ! Rohini Kumar, Jun 2013 - added restart flags + ! R. Kumar & + ! S. Thober, Aug. 2013 - code change to incorporate output timestep + ! during writing of the netcdf file + ! Rohini Kumar, Aug 2013 - name changed from "inputFormat" to inputFormat_meteo_forcings + ! Rohini Kumar, Aug 2013 - added dirSoil_LUT and dirGeology_LUT, and changed in + ! namelist made accordingly + ! Rohini Kumar, Aug 2013 - added new namelist for LAI related datasets, and changed in + ! within the code made accordingly + ! Matthias Zink, Aug 2013 - changed read in for land cover period + ! Juliane Mai, Oct 2013 - adding global_parameters_name + ! Matthias Zink, Nov 2013 - edited documentation and included DEFAULT cases for ptocess Matrix + ! Stephan Thober, Nov 2013 - added read of directories where latitude longitude fields are located + ! Matthias Zink, Feb 2014 - added multiple options for PET process + ! Matthias Zink, Mar 2014 - added inflow from upstream areas and gauge information as namelist + ! Rohini Kumar, May 2014 - added options for the model run coordinate system + ! Stephan Thober, May 2014 - added switch for chunk read in + ! Stephan Thober, Jun 2014 - added option for switching off mpr + ! Matthias Cuntz & Juliane Mai Nov 2014 - LAI input from daily, monthly or yearly files + ! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells + ! Matthias Zink, Mar 2015 - added optional soil moisture read in for calibration + ! Matthias Cuntz, Jul 2015 - removed adjustl from trim(adjustl()) of Geoparams for PGI compatibilty + ! Stephan Thober, Aug 2015 - added read_config_routing and read_routing_params from mRM + ! Oldrich Rakovec, Oct 2015 - added reading of the basin average TWS data + ! Rohini Kumar, Mar 2016 - options to handle different soil databases + ! Stephan Thober, Nov 2016 - moved nProcesses and processMatrix to common variables + ! Rohini Kumar, Dec 2016 - option to handle monthly mean gridded fields of LAI + ! M.Zink & M. Cuneyd Demirel Mar 2017 - Added Jarvis soil water stress function at SM process(3) + ! M.C. Demirel & Simon Stisen Apr 2017 - Added FC dependency on root fraction coefficient (ET) at SM process(3) + ! Robert Schweppe Dec 2017 - switched from fractional julian day to integer + + + subroutine mhm_read_config(file_namelist, unamelist) + + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_nml, only : open_nml, close_nml, position_nml + use mo_common_mHM_mRM_read_config, only : common_check_resolution + use mo_common_constants, only : & + maxNoBasins, & ! maximum number of allowed basins + nodata_i4 ! nodata values + use mo_mpr_constants, only : & + maxNoSoilHorizons ! maximum number of allowed soil layers + use mo_file, only : & + file_defOutput, udefOutput ! file specifying which output to write + use mo_global_variables, only : & + outputFlxState, & ! definition which output to write + dirPrecipitation, dirTemperature, & ! directory of meteo input + dirReferenceET, & ! PET input path if process 5 is 'PET is input' (case 0) + dirMinTemperature, dirMaxTemperature, & ! PET input paths if process 5 is Hargreaves-Samani (case 1) + dirNetRadiation, & ! PET input paths if process 5 is Priestely-Taylor (case 2) + dirabsVapPressure, dirwindspeed, & ! PET input paths if process 5 is Penman-Monteith (case 3) + inputFormat_meteo_forcings, & ! input format either bin or nc + timestep_model_inputs, & ! read input frequency + dirSoil_moisture, timeStep_sm_input, & ! directory and time stepping of soil moisture data + nSoilHorizons_sm_input, & ! No. of mhm soil horizons equivalent to soil moisture input + basin_avg_TWS_obs, & ! basin avg TWS data + fileTWS, & ! directory with basin average tws data + dirNeutrons, timeStep_neutrons_input, & ! directory where neutron data is located + dirEvapotranspiration, timeStep_et_input, & ! directory and time stepping of evapotranspiration data + timeStep_model_outputs, & ! timestep for writing model outputs + evap_coeff, & ! pan evaporation + read_meteo_weights, & ! flag for read meteo weights + fday_prec, fnight_prec, fday_pet, & ! day-night fraction + fnight_pet, fday_temp, fnight_temp ! day-night fraction + + use mo_mpr_global_variables, only : & + nSoilHorizons_mHM + use mo_common_mhm_mrm_variables, only : & + optimize, opti_function + use mo_common_variables, only : & + nBasins, & ! number of basins + processMatrix ! process configuration + + implicit none + + character(*), intent(in) :: file_namelist + integer, intent(in) :: unamelist + + ! LOCAL variables + integer(i4) :: iBasin + + integer(i4), dimension(maxNoBasins) :: time_step_model_inputs + character(256), dimension(maxNoBasins) :: dir_Precipitation + character(256), dimension(maxNoBasins) :: dir_Temperature + character(256), dimension(maxNoBasins) :: dir_MinTemperature + character(256), dimension(maxNoBasins) :: dir_MaxTemperature + character(256), dimension(maxNoBasins) :: dir_NetRadiation + character(256), dimension(maxNoBasins) :: dir_windspeed + character(256), dimension(maxNoBasins) :: dir_absVapPressure + character(256), dimension(maxNoBasins) :: dir_ReferenceET + character(256), dimension(maxNoBasins) :: dir_soil_moisture ! soil moisture input + character(256), dimension(maxNoBasins) :: file_TWS ! total water storage input file + character(256), dimension(maxNoBasins) :: dir_neutrons ! ground albedo neutron input + character(256), dimension(maxNoBasins) :: dir_evapotranspiration ! ground albedo neutron input + + + ! define namelists + ! namelist directories + namelist /directories_mHM/ inputFormat_meteo_forcings, & + dir_Precipitation, dir_Temperature, dir_ReferenceET, dir_MinTemperature, & + dir_MaxTemperature, dir_absVapPressure, dir_windspeed, & + dir_NetRadiation, time_step_model_inputs + ! optional data used for optimization + namelist /optional_data/ & + dir_soil_moisture, & + nSoilHorizons_sm_input, & + timeStep_sm_input, & + file_TWS, & + dir_neutrons, & + dir_evapotranspiration, & + timeStep_et_input + ! namelist for pan evaporation + namelist /panEvapo/evap_coeff + ! namelist for night-day ratio of precipitation, referenceET and temperature + namelist /nightDayRatio/read_meteo_weights, fnight_prec, fnight_pet, fnight_temp + + ! name list regarding output + namelist /NLoutputResults/timeStep_model_outputs, outputFlxState + + !=============================================================== + ! Read namelist main directories + !=============================================================== + call open_nml(file_namelist, unamelist, quiet = .true.) + + allocate(dirPrecipitation(nBasins)) + allocate(dirTemperature(nBasins)) + allocate(dirwindspeed(nBasins)) + allocate(dirabsVapPressure(nBasins)) + allocate(dirReferenceET(nBasins)) + allocate(dirMinTemperature(nBasins)) + allocate(dirMaxTemperature(nBasins)) + allocate(dirNetRadiation(nBasins)) + allocate(dirSoil_Moisture(nBasins)) + allocate(dirNeutrons(nBasins)) + allocate(fileTWS(nBasins)) + ! allocate time periods + allocate(timestep_model_inputs(nBasins)) + + !=============================================================== + ! Read namelist for mainpaths + !=============================================================== + call position_nml('directories_mHM', unamelist) + read(unamelist, nml = directories_mHM) + + dirPrecipitation = dir_Precipitation(1 : nBasins) + dirTemperature = dir_Temperature(1 : nBasins) + dirReferenceET = dir_ReferenceET(1 : nBasins) + dirMinTemperature = dir_MinTemperature(1 : nBasins) + dirMaxTemperature = dir_MaxTemperature(1 : nBasins) + dirNetRadiation = dir_NetRadiation(1 : nBasins) + dirwindspeed = dir_windspeed(1 : nBasins) + dirabsVapPressure = dir_absVapPressure(1 : nBasins) + timestep_model_inputs = time_step_model_inputs(1 : nBasins) + + ! consistency check for timestep_model_inputs + if (any(timestep_model_inputs .ne. 0) .and. & + .not. all(timestep_model_inputs .ne. 0)) then + call message() + call message('***ERROR: timestep_model_inputs either have to be all zero or all non-zero') + stop + end if + ! check for optimzation and timestep_model_inputs options + if (optimize .and. (any(timestep_model_inputs .ne. 0))) then + call message() + call message('***ERROR: optimize and chunk read is switched on! (set timestep_model_inputs to zero)') + stop + end if + + !=============================================================== + ! Read namelist of optional input data + !=============================================================== + ! read optional optional data if necessary + if (optimize) then + select case (opti_function) + case(10 : 13, 28) + ! soil moisture + call position_nml('optional_data', unamelist) + read(unamelist, nml = optional_data) + dirSoil_moisture = dir_Soil_moisture(1 : nBasins) + if (nSoilHorizons_sm_input .GT. nSoilHorizons_mHM) then + call message() + call message('***ERROR: Number of soil horizons representative for input soil moisture exceeded') + call message(' defined number of soil horizions: ', adjustl(trim(num2str(maxNoSoilHorizons))), '!') + stop + end if + case(17) + ! neutrons + call position_nml('optional_data', unamelist) + read(unamelist, nml = optional_data) + dirNeutrons = dir_neutrons(1 : nBasins) + timeStep_neutrons_input = -1 ! TODO: daily, hard-coded, to be flexibilized + case(27, 29, 30) + ! evapotranspiration + call position_nml('optional_data', unamelist) + read(unamelist, nml = optional_data) + dirEvapotranspiration = dir_evapotranspiration(1 : nBasins) + case(15) + ! basin average TWS data + call position_nml('optional_data', unamelist) + read(unamelist, nml = optional_data) + fileTWS = file_TWS (1 : nBasins) + + allocate(basin_avg_TWS_obs%basinId(nBasins)); basin_avg_TWS_obs%basinId = nodata_i4 + allocate(basin_avg_TWS_obs%fName (nBasins)); basin_avg_TWS_obs%fName(:) = num2str(nodata_i4) + + do iBasin = 1, nBasins + if (trim(fileTWS(iBasin)) .EQ. trim(num2str(nodata_i4))) then + call message() + call message('***ERROR: mhm.nml: Filename of evaluation TWS data ', & + ' for subbasin ', trim(adjustl(num2str(iBasin))), & + ' is not defined!') + call message(' Error occured in namelist: evaluation_tws') + stop 1 + end if + + basin_avg_TWS_obs%basinId(iBasin) = iBasin + basin_avg_TWS_obs%fname(iBasin) = trim(file_TWS(iBasin)) + end do + end select + end if + + !=============================================================== + ! Read night-day ratios and pan evaporation + !=============================================================== + ! Evap. coef. for free-water surfaces + call position_nml('panEvapo', unamelist) + read(unamelist, nml = panEvapo) + ! namelist for night-day ratio of precipitation, referenceET and temperature + call position_nml('nightDayRatio', unamelist) + read(unamelist, nml = nightDayRatio) + ! + fday_prec = 1.0_dp - fnight_prec + fday_pet = 1.0_dp - fnight_pet + fday_temp = -1.0_dp * fnight_temp + + call common_check_resolution(.true., .false.) + + call close_nml(unamelist) + + !=============================================================== + ! Read output specifications for mHM + !=============================================================== + call open_nml(file_defOutput, udefOutput, quiet = .true.) + outputFlxState = .FALSE. + call position_nml('NLoutputResults', udefOutput) + read(udefOutput, nml = NLoutputResults) + call close_nml(udefOutput) + + call message('') + call message('Following output will be written:') + call message(' STATES:') + if (outputFlxState(1)) then + call message(' interceptional storage (L1_inter) [mm]') + end if + if (outputFlxState(2)) then + call message(' height of snowpack (L1_snowpack) [mm]') + end if + if (outputFlxState(3)) then + call message(' soil water content in the single layers (L1_soilMoist) [mm]') + end if + if (outputFlxState(4)) then + call message(' volumetric soil moisture in the single layers [mm/mm]') + end if + if (outputFlxState(5)) then + call message(' mean volum. soil moisture averaged over all soil layers [mm/mm]') + end if + if (outputFlxState(6)) then + call message(' waterdepth in reservoir of sealed areas (L1_sealSTW) [mm]') + end if + if (outputFlxState(7)) then + call message(' waterdepth in reservoir of unsat. soil zone (L1_unsatSTW) [mm]') + end if + if (outputFlxState(8)) then + call message(' waterdepth in reservoir of sat. soil zone (L1_satSTW) [mm]') + end if + if (processMatrix(10, 1) .eq. 0) outputFlxState(18) = .false. ! suppress output if process is off + if (outputFlxState(18)) then + call message(' ground albedo neutrons (L1_neutrons) [cph]') + end if + + call message(' FLUXES:') + if (outputFlxState(9)) then + call message(' actual evapotranspiration aET (L1_pet) [mm/T]') + end if + if (outputFlxState(10)) then + call message(' total discharge generated per cell (L1_total_runoff) [mm/T]') + end if + if (outputFlxState(11)) then + call message(' direct runoff generated per cell (L1_runoffSeal) [mm/T]') + end if + if (outputFlxState(12)) then + call message(' fast interflow generated per cell (L1_fastRunoff) [mm/T]') + end if + if (outputFlxState(13)) then + call message(' slow interflow generated per cell (L1_slowRunoff) [mm/T]') + end if + if (outputFlxState(14)) then + call message(' baseflow generated per cell (L1_baseflow) [mm/T]') + end if + if (outputFlxState(15)) then + call message(' groundwater recharge (L1_percol) [mm/T]') + end if + if (outputFlxState(16)) then + call message(' infiltration (L1_infilSoil) [mm/T]') + end if + call message('') + call message('FINISHED reading config') + + ! warning message + if (any(outputFlxState) .and. optimize) then + call message('WARNING: FLUXES and STATES netCDF will be not written since optimization flag is TRUE ') + end if + + end subroutine mhm_read_config + +END MODULE mo_mhm_read_config diff --git a/src/mHM/mo_mpr_smhorizons.f90 b/src/mHM/mo_mpr_smhorizons.f90 deleted file mode 100644 index 9c0bb5ca..00000000 --- a/src/mHM/mo_mpr_smhorizons.f90 +++ /dev/null @@ -1,606 +0,0 @@ -!> \file mo_mpr_smhorizons.f90 - -!> \brief setting up the soil moisture horizons - -!> \details This module sets up the soil moisture horizons - -!> \author Stephan Thober, Rohini Kumar -!> \date Dec 2012 - -module mo_mpr_SMhorizons - - use mo_kind, only: i4, dp - - implicit none - - public :: mpr_SMhorizons - - private - -contains - - ! ---------------------------------------------------------------------------- - - ! NAME - ! mpr_SMhorizons - - !> \brief upscale soil moisture horizons - - !> \details calculate soil properties at the level 1.\n - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = rootFractionCoefficient_forest \n - !> - param(2) = rootFractionCoefficient_impervious \n - !> - param(3) = rootFractionCoefficient_pervious \n - !> - param(4) = infiltrationShapeFactor \n - - - ! INTENT(IN) - !> \param[in] "real(dp) :: param(:)" - four or six global parameters depending on SM process - !> \param[in] "integer(i4) :: processMatrix" - matrix specifying user defined processes - - !> \param[in] "real(dp) :: nodata" - no data value - !> \param[in] "integer(i4) :: iFlag_soil" - flags for handling multiple soil databases - !> \param[in] "integer(i4) :: nHorizons_mHM" - number of horizons to model - !> \param[in] "integer(i4) :: HorizonDepth(:)" - [mm] horizon depth from surface, - !> postive downwards - !> \param[in] "integer(i4) :: L0_LUC(:,:)" - land use cover at level 0 - !> \param[in] "integer(i4) :: L0_soilID(:,:)" - soil IDs at level 0 - !> \param[in] "integer(i4) :: nHorizons(:)" - horizons per soil type - !> \param[in] "integer(i4) :: nTillHorizons(:)" - Number of Tillage horizons - !> \param[in] "real(dp) :: thetaS_till(:,:,:)" - saturated water content of soil - !> horizons upto tillage depth, - !> f(OM, management) - !> \param[in] "real(dp) :: thetaFC_till(:,:,:)" - Field capacity of tillage - !> layers; LUC dependent, f(OM, management) - !> \param[in] "real(dp) :: thetaPW_till(:,:,:)" - Permament wilting point of - !> tillage layers; LUC dependent, f(OM, management) - !> \param[in] "real(dp) :: thetaS(:,:)" - saturated water content of soil - !> horizons after tillage depth - !> \param[in] "real(dp) :: thetaFC(:,:)" - Field capacity of deeper layers - !> \param[in] "real(dp) :: thetaPW(:,:)" - Permanent wilting point of deeper layers - !> \param[in] "real(dp) :: Wd(:,:,:)" - weights of mHM Horizons according to horizons provided - !> in soil database - !> \param[in] "real(dp) :: Db(:,:,:)" - Bulk density - !> \param[in] "real(dp) :: DbM(:,:)" - mineral Bulk density - !> \param[in] "real(dp) :: RZdepth(:)" - [mm] Total soil depth - !> \param[in] "integer(i4) :: L0_cellCoor(:,:)" - cell coordinates at level 0 - !> \param[in] "integer(i4) :: L0_cell_id(:,:)" - cell ids of high resolution field, - !> Number of rows times Number of columns - !> of high resolution field - !> \param[in] "integer(i4) :: upp_row_L1(:)" - Upper row id in high resolution field - !> (L0) of low resolution cell (L1 cell) - !> \param[in] "integer(i4) :: low_row_L1(:)" - Lower row id in high resolution field - !> (L0) of low resolution cell (L1 cell) - !> \param[in] "integer(i4) :: lef_col_L1(:)" - Left column id in high resolution - !> field (L0) of low resolution cell - !> \param[in] "integer(i4) :: rig_col_L1(:)" - Right column id in high resolution - !> field (L0) of low resolution cell - !> \param[in] "integer(i4) :: nL0_in_L1(:)" - Number of high resolution cells (L0) - !> in low resolution cell (L1 cell) - - ! INTENT(OUT) - !> \param[in,out] "real(dp) :: L1_beta(:,:)" - Parameter that determines the - !> relative contribution to SM, upscaled - !> Bulk density. Number of cells at L1 - !> times number of horizons in mHM - !> \param[in,out] "real(dp) :: L1_SMs(:,:)" - [10^-3 m] depth of saturated SM cont - !> Number of cells at L1 times number - !> of horizons in mHM - !> \param[in,out] "real(dp) :: L1_FC(:,:)" - [10^-3 m] field capacity. Number - !> of cells at L1 times number of horizons - !> in mHM - !> \param[in,out] "real(dp) :: L1_PW(:,:)" - [10^-3 m] permanent wilting point. - !> Number of cells at L1 times number - !> of horizons in mHM - !> \param[in,out] "real(dp) :: L1_fRoots(:,:)" - fraction of roots in soil horizons. - !> Number of cells at L1 times number - !> of horizons in mHM - - ! HISTORY - !> \author Luis Samaniego, Rohini Kumar, Stephan Thober - !> \date Dec 2012 - ! Written Stephan Thober, Dec 2012 - ! Modified, Stephan Thober, Jan 2013 - updated calling sequence for upscaling operators - ! Juliane Mai, Oct 2013 - OLD parametrization - ! --> param(1) = rootFractionCoefficient_forest - ! --> param(2) = rootFractionCoefficient_impervious - ! --> param(3) = rootFractionCoefficient_pervious - ! --> param(4) = infiltrationShapeFactor - ! ------------------------------- - ! rootFractionCoeff_perv = rootFractionCoeff_forest - delta_1 - ! ------------------------------- - ! NEW parametrization - ! --> param(1) = rootFractionCoefficient_forest - ! --> param(2) = rootFractionCoefficient_impervious - ! --> param(3) = delta_1 - ! --> param(4) = infiltrationShapeFactor - ! ! if processMatrix(3,1) = 3 additionally - ! --> param(5) = rootFractionCoefficient_sand - ! --> param(6) = rootFractionCoefficient_clay - ! Stephan Thober, Mar 2014 - added omp parallelization - ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options - ! M. Cuneyd Demirel, Simon Stisen, Apr 2017 - added FC dependency on root fraction coefficient - - - subroutine mpr_SMhorizons( & - ! Input ----------------------------------------------------------------- - param , & ! global parameters, three are required - processMatrix , & ! matrix specifying user defined processes - nodata , & ! no data value - iFlag_soil , & ! flag to handle different soil database - nHorizons_mHM , & ! number of horizons to model - HorizonDepth , & ! depth of the different horizons - LCOVER0 , & ! land use cover at L0 - soilID0 , & ! soil Ids at L0 - nHorizons , & ! Number of horizons per soilType - nTillHorizons , & ! Number of Tillage horizons - thetaS_till , & ! saturated water content of soil horizons upto tillage depth - thetaFC_till , & ! Field capacity of tillage layer - thetaPW_till , & ! Permament wilting point of tillage layer - thetaS , & ! saturated water content - thetaFC , & ! Field capacity of deeper layers - thetaPW , & ! Permanent wilting point - Wd , & ! weights of mHM Horizons according to horizons provided in soil database - Db , & ! Bulk density - DbM , & ! mineral Bulk density - RZdepth , & ! [mm] Total soil depth - mask0 , & ! mask at L0 - cell_id0 , & ! cell ids at L0 - upp_row_L1 , & ! upper row of L0 block within L1 cell - low_row_L1 , & ! lower row of L0 block within L1 cell - lef_col_L1 , & ! left column of L0 block within L1 cell - rig_col_L1 , & ! right column of L0 block within L1 cell - nL0_in_L1 , & ! Number of L0 cells in L0 block within L1 cell - ! Output ---------------------------------------------------------------- - L1_beta , & ! Parameter that determines the relative contribution to SM - L1_SMs , & ! [10^-3 m] depth of saturated SM cont - L1_FC , & ! [10^-3 m] field capacity - L1_PW , & ! [10^-3 m] permanent wilting point - L1_fRoots ) ! fraction of roots in soil horizons - - use mo_upscaling_operators, only: upscale_harmonic_mean - use mo_message, only: message - use mo_string_utils, only: num2str - - !$ use omp_lib - - implicit none - - ! Input - real(dp), dimension(:), intent(in) :: param ! parameters - integer(i4), dimension(:,:), intent(in) :: processMatrix ! matrix specifying user defined processes - real(dp), intent(in) :: nodata ! no data value - integer(i4), intent(in) :: iFlag_soil ! flag to handle different soil database - integer(i4), intent(in) :: nHorizons_mHM ! Number of Horizons in mHM - real(dp), dimension(:), intent(in) :: HorizonDepth ! [10^-3 m] horizon depth from - ! ! surface, postive downwards - integer(i4), dimension(:), intent(in) :: LCOVER0 ! Land cover at level 0 - integer(i4), dimension(:,:), intent(in) :: soilID0 ! soil ID at level 0 - integer(i4), dimension(:), intent(in) :: nHorizons ! horizons per soil type - integer(i4), dimension(:), intent(in) :: nTillHorizons ! Number of Tillage horizons - real(dp), dimension(:,:,:), intent(in) :: thetaS_till ! saturated water content of soil - ! ! horizons upto tillage depth, - ! !f(OM, management) - real(dp), dimension(:,:,:), intent(in) :: thetaFC_till ! Field capacity of tillage - ! ! layers; LUC dependent, - ! !f(OM, management) - real(dp), dimension(:,:,:), intent(in) :: thetaPW_till ! Permament wilting point of - ! ! tillage layers; LUC dependent, - ! ! f(OM, management) - real(dp), dimension(:,:), intent(in) :: thetaS ! saturated water content of soil - ! ! horizons after tillage depth - real(dp), dimension(:,:), intent(in) :: thetaFC ! Field capacity of deeper layers - real(dp), dimension(:,:), intent(in) :: thetaPW ! Permanent wilting point of - ! ! deeper layers - real(dp), dimension(:,:,:), intent(in) :: Wd ! weights of mHM Horizons - ! ! according to horizons provided - ! ! in soil database - real(dp), dimension(:,:,:), intent(in) :: Db ! Bulk density - real(dp), dimension(:,:), intent(in) :: DbM ! mineral Bulk density - real(dp), dimension(:), intent(in) :: RZdepth ! [mm] Total soil depth - - ! Ids of L0 cells beneath L1 cell - logical, dimension(:,:), intent(in) :: mask0 - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block - integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block - integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block - integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cel - - ! Output - ! The following five variables have the dimension: Number of cells at L1 times nHorizons_mHM - real(dp), dimension(:,:), intent(inout) :: L1_beta ! Parameter that determines the - ! ! relative contribution to SM, upscaled - ! ! Bulk density - real(dp), dimension(:,:), intent(inout) :: L1_SMs ! [10^-3 m] depth of saturated SM cont - real(dp), dimension(:,:), intent(inout) :: L1_FC ! [10^-3 m] field capacity - real(dp), dimension(:,:), intent(inout) :: L1_PW ! [10^-3 m] permanent wilting point - real(dp), dimension(:,:), intent(inout) :: L1_fRoots ! fraction of roots in soil horizons - - ! Local Variables - integer(i4) :: h ! loop index - integer(i4) :: k ! loop index - integer(i4) :: l ! loop index - integer(i4) :: s ! loop index - real(dp) :: dpth_f - real(dp) :: dpth_t - real(dp) :: fTotRoots - real(dp), dimension(size(LCOVER0,1)) :: beta0 ! beta 0 - real(dp), dimension(size(LCOVER0,1)) :: Bd0 ! [10^3 kg/m3] Bulk density - real(dp), dimension(size(LCOVER0,1)) :: SMs0 ! [10^-3 m] depth of saturated SM cont - real(dp), dimension(size(LCOVER0,1)) :: FC0 ! [10^-3 m] field capacity - real(dp), dimension(size(LCOVER0,1)) :: PW0 ! [10^-3 m] permanent wilting point - real(dp), dimension(size(LCOVER0,1)) :: fRoots0 ! fraction of roots in soil horizons - - real(dp) :: tmp_rootFractionCoefficient_forest - real(dp) :: tmp_rootFractionCoefficient_impervious - real(dp) :: tmp_rootFractionCoefficient_pervious - real(dp) :: tmp_rootFractionCoefficient_perviousFC ! Field capacity dependent - ! ! root frac coeffiecient - - real(dp) :: tmp_rootFractionCoefficient_sand ! Model parameter describing the threshold for - ! ! actual ET reduction for sand - real(dp) :: tmp_rootFractionCoefficient_clay ! Model parameter describing the threshold for actual - ! ! ET reduction for clay - - real(dp) :: tmp_FC0min ! Calculate FCmin at level 0 once to speed up the code - real(dp) :: tmp_FC0max ! Calculate FCmax at level 0 once to speed up the code - - - ! decide which parameterization should be used for route fraction: - ! 1:2 - dependent on land cover - tmp_rootFractionCoefficient_forest = param(1) ! min(1.0_dp, param(2) + param(3) + param(1)) - tmp_rootFractionCoefficient_impervious = param(2) - tmp_rootFractionCoefficient_pervious = param(1) - param(3) ! min(1.0_dp, param(2) + param(3)) - - ! 3 - dependent on land cover and additionally soil texture - select case (processMatrix(3,1)) - case(3) - !delta approach is used as in tmp_rootFractionCoefficient_pervious - tmp_rootFractionCoefficient_sand = param(6) - param(5) - !the value in parameter namelist is before substraction i.e. param(5) - tmp_rootFractionCoefficient_clay = param(6) - end select - - ! select case according to a given soil database flag - SELECT CASE(iFlag_soil) - ! classical mHM soil database format - CASE(0) - do h = 1, nHorizons_mHM - Bd0 = nodata - SMs0 = nodata - FC0 = nodata - PW0 = nodata - fRoots0 = nodata - tmp_rootFractionCoefficient_perviousFC = nodata - ! Initalise mHM horizon depth - ! Last layer depth is soil type dependent, and hence it assigned within the inner loop - ! by default for the first soil layer - dpth_f = 0.0_dp - dpth_t = HorizonDepth(H) - ! check for the layer (2, ... n-1 layers) update depth - if(H .gt. 1 .and. H .lt. nHorizons_mHM) then - dpth_f = HorizonDepth(H - 1) - dpth_t = HorizonDepth(H) - end if - - !$OMP PARALLEL - !$OMP DO PRIVATE( l, s ) SCHEDULE( STATIC ) - cellloop0: do k = 1, size(LCOVER0,1) - l = LCOVER0(k) - s = soilID0(k,1) !>> in this case the second dimension of soilId0 = 1 - ! depth weightage bulk density - Bd0(k) = sum( Db(s,:nTillHorizons(s), L)*Wd(S, H, 1:nTillHorizons(S) ), & - Wd(S,H, 1:nTillHorizons(S)) > 0.0_dp ) & - + sum( dbM(S,nTillHorizons(S)+1 : nHorizons(S)) & - * Wd(S,H, nTillHorizons(S)+1:nHorizons(S)), & - Wd(S,H, nTillHorizons(S)+1:nHorizons(S)) >= 0.0_dp ) - ! depth weightage thetaS - SMs0(k) = sum( thetaS_till(S,:nTillHorizons(s), L) & - * Wd(S,H, 1:nTillHorizons(S) ), & - Wd(S,H, 1:nTillHorizons(S)) > 0.0_dp ) & - + sum( thetaS(S,nTillHorizons(S)+1-minval(nTillHorizons(:)):nHorizons(s)-minval(nTillHorizons(:))) & - * Wd(S,H, nTillHorizons(S)+1:nHorizons(S)), & - Wd(S,H, nTillHorizons(S)+1:nHorizons(S)) > 0.0_dp ) - ! depth weightage FC - FC0(k) = sum( thetaFC_till(S, :nTillHorizons(s), L) & - * Wd(S, H, 1:nTillHorizons(S) ), & - Wd(S, H, 1:nTillHorizons(S)) > 0.0_dp ) & - + sum( thetaFC(S, nTillHorizons(S)+1-minval(nTillHorizons(:)):nHorizons(s)-minval(nTillHorizons(:))) & - * Wd(S, H, nTillHorizons(S)+1:nHorizons(S)), & - Wd(S, H, nTillHorizons(S)+1:nHorizons(S)) > 0.0_dp ) - ! depth weightage PWP - PW0(k) = sum( thetaPW_till(S, :nTillHorizons(s), L) & - * Wd(S, H, 1:nTillHorizons(S) ), & - Wd(S, H, 1:nTillHorizons(S)) > 0.0_dp ) & - + sum( thetaPW(S,nTillHorizons(S)+1-minval(nTillHorizons(:)) :nHorizons(s)-minval(nTillHorizons(:))) & - * Wd(S, H, nTillHorizons(S)+1:nHorizons(S)), & - Wd(S, H, nTillHorizons(S)+1:nHorizons(S)) > 0.0_dp ) - ! Horizon depths: last soil horizon is varying, and thus the depth - ! of the horizon too... - if(H .eq. nHorizons_mHM) then - dpth_f = HorizonDepth(nHorizons_mHM - 1) - dpth_t = RZdepth(S) - end if - ! other soil properties [SMs, FC, PWP in mm] - SMs0(k) = SMs0(k) * (dpth_t - dpth_f) - FC0(k) = FC0(k) * (dpth_t - dpth_f) - PW0(k) = PW0(k) * (dpth_t - dpth_f) - end do cellloop0 - !$OMP END DO - !$OMP END PARALLEL - - tmp_FC0min=minval(FC0(:)) - tmp_FC0max=maxval(FC0(:)) - - if(tmp_FC0min .lt. 0.0_dp) then - tmp_FC0min=minval(FC0(cell_id0)) - end if - - !$OMP PARALLEL - !$OMP DO PRIVATE( l, tmp_rootFractionCoefficient_perviousFC ) SCHEDULE( STATIC ) - celllloop0: do k = 1, size(LCOVER0,1) - l = LCOVER0(k) - !--------------------------------------------------------------------- - ! Effective root fractions in soil horizon... - ! as weightage sum (according to LC fraction) - !--------------------------------------------------------------------- - ! vertical root distribution = f(LC), following asymptotic equation - ! [for refrence see, Jackson et. al., Oecologia, 1996. 108(389-411)] - - ! Roots(H) = 1 - beta^d - ! where, - ! Roots(H) = cumulative root fraction [-], range: 0-1 - ! beta = fitted extinction cofficient parameter [-], as a f(LC) - ! d = soil surface to depth [cm] - - ! NOTES ** - ! sum(fRoots) for soil horions = 1.0 - - ! if [sum(fRoots) for soil horions < 1.0], then - ! normalise fRoot distribution such that all roots end up - ! in soil horizon and thus satisfying the constrain that - ! sum(fRoots) = 1 - - ! The above constrains means that there are not roots below the soil horizon. - ! This may or may not be realistic but it has been coded here to satisfy the - ! conditions of the EVT vales, otherwise which the EVT values would be lesser - ! than the acutal EVT from whole soil layers. - - ! Code could be modified in a way that a portion of EVT comes from the soil layer - ! which is in between unsaturated and saturated zone or if necessary the saturated - ! layer (i.e. Groundwater layer) can also contribute to EVT. Note that the above - ! modification should be done only if and only if [sum(fRoots) for soil horions < 1.0]. - ! In such cases, you have to judiciously decide which layers (either soil layer between - ! unsaturated and saturated zone or saturated zone) will contribute to EVT and in which - ! proportions. Also note that there are no obervations on the depth avialable ata a - ! moment on these layers. - !------------------------------------------------------------------------ - - select case(L) - case(1) - ! forest - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_f*0.1_dp) ) - case(2) - ! impervious - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_f*0.1_dp) ) - case(3) - - select case (processMatrix(3,1)) - case(1:2) - ! permeable - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_f*0.1_dp) ) - - case(3) - ! permeable - ! introducing FC dependency on root frac coef. by Simon Stisen and M. Cuneyd Demirel from GEUS.dk - tmp_rootFractionCoefficient_perviousFC=(((FC0(k) - tmp_FC0min)/ & - ((tmp_FC0max-tmp_FC0min)) * tmp_rootFractionCoefficient_clay)) & - + ((1-(FC0(k) - tmp_FC0min)/(tmp_FC0max-tmp_FC0min)) * & - tmp_rootFractionCoefficient_sand) - - if(tmp_rootFractionCoefficient_perviousFC .lt. 0.0_dp .OR. tmp_rootFractionCoefficient_perviousFC .gt. 1.0_dp) & - print*, "CHECK tmp_rootFractionCoefficient_perviousFC", tmp_rootFractionCoefficient_perviousFC - - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_f*0.1_dp) ) - - if((fRoots0(k) .lt. 0.0_dp) .OR. (fRoots0(k) .gt. 1.0_dp)) then - call message('***ERROR: Fraction of roots out of range [0,1]. Cell', & - num2str(k), ' has value ', num2str(fRoots0(k))) - ! stop - end if - end select - end select - - end do celllloop0 - !$OMP END DO - !$OMP END PARALLEL - - beta0 = Bd0*param(4) - - !--------------------------------------------- - ! Upscale the soil related parameters - !--------------------------------------------- - L1_SMs(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, SMs0 ) - L1_beta(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, beta0 ) - L1_PW(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, PW0 ) - L1_FC(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, FC0 ) - L1_fRoots(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, fRoots0 ) - - end do - ! to handle multiple soil horizons with unique soil class - CASE(1) - ! horizon wise calculation - do h = 1, nHorizons_mHM - Bd0 = nodata - SMs0 = nodata - FC0 = nodata - PW0 = nodata - fRoots0 = nodata - tmp_rootFractionCoefficient_perviousFC = nodata - ! initalise mHM horizon depth - if (h .eq. 1 ) then - dpth_f = 0.0_dp - dpth_t = HorizonDepth(h) - ! check for the layer (2, ... n-1 layers) update depth - else - dpth_f = HorizonDepth(h-1) - dpth_t = HorizonDepth(h) - end if - ! need to be done for every layer to get fRoots - !$OMP PARALLEL - !$OMP DO PRIVATE( l, s ) SCHEDULE( STATIC ) - cellloop1: do k = 1, size(LCOVER0,1) - L = LCOVER0(k) - s = soilID0(k,h) - if ( h .le. nTillHorizons(1) ) then - Bd0(k) = Db(s,1,L) - SMs0(k) = thetaS_till (s,1,L) * (dpth_t - dpth_f) ! in mm - FC0(k) = thetaFC_till(s,1,L) * (dpth_t - dpth_f) ! in mm - PW0(k) = thetaPW_till(s,1,L) * (dpth_t - dpth_f) ! in mm - else - Bd0(k) = DbM(s,1) - SMs0(k) = thetaS (s,1) * (dpth_t - dpth_f) ! in mm - FC0(k) = thetaFC(s,1) * (dpth_t - dpth_f) ! in mm - PW0(k) = thetaPW(s,1) * (dpth_t - dpth_f) ! in mm - end if - end do cellloop1 - !$OMP END DO - !$OMP END PARALLEL - - - tmp_FC0min=minval(FC0(:)) - tmp_FC0max=maxval(FC0(:)) - - if(tmp_FC0min .lt. 0.0_dp) then - print*,"CHECK FC0min, -9999s effected",tmp_FC0min - tmp_FC0min=minval(FC0(cell_id0)) - print*,"NEW FC0min is",tmp_FC0min - end if - - !$OMP PARALLEL - !$OMP DO PRIVATE( l, tmp_rootFractionCoefficient_perviousFC ) SCHEDULE( STATIC ) - celllloop1: do k = 1, size(LCOVER0,1) - l = LCOVER0(k) - !================================================================================ - ! fRoots = f[LC] --> (fRoots(H) = 1 - beta^d) - ! see below for comments and references for the use of this simple equation - ! NOTE that in this equation the unit of soil depth is in cm - !================================================================================ - - select case(L) - case(1) - ! forest - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_forest**(dpth_f*0.1_dp) ) - case(2) - ! impervious - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_impervious**(dpth_f*0.1_dp) ) - case(3) - - select case (processMatrix(3,1)) - - case(1:2) - ! permeable - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_pervious**(dpth_f*0.1_dp) ) - - case(3) - ! permeable - !introducing FC dependency on root frac coef. by Simon Stisen and M. Cuneyd Demirel from GEUS.dk - tmp_rootFractionCoefficient_perviousFC=(((FC0(k) - tmp_FC0min)/& - ((tmp_FC0max-tmp_FC0min)) * tmp_rootFractionCoefficient_clay))& - + ((1-(FC0(k) - tmp_FC0min)/(tmp_FC0max-tmp_FC0min)) * & - tmp_rootFractionCoefficient_sand) - - if(tmp_rootFractionCoefficient_perviousFC .lt. 0.0_dp .OR. tmp_rootFractionCoefficient_perviousFC .gt. 1.0_dp) & - print*, "CHECK tmp_rootFractionCoefficient_perviousFC", tmp_rootFractionCoefficient_perviousFC - - fRoots0(k) = (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_t*0.1_dp)) & - - (1.0_dp - tmp_rootFractionCoefficient_perviousFC**(dpth_f*0.1_dp) ) - - if((fRoots0(k) .lt. 0.0_dp) .OR. (fRoots0(k) .gt. 1.0_dp)) then - call message('***ERROR: Fraction of roots out of range [0,1]. Cell', & - num2str(k), ' has value ', num2str(fRoots0(k))) - ! stop - end if - end select - end select - - end do celllloop1 - !$OMP END DO - !$OMP END PARALLEL - - ! beta parameter - beta0 = Bd0*param(4) - - ! Upscale the soil related parameters - L1_SMs(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, SMs0 ) - L1_beta(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, beta0) - L1_PW(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, PW0 ) - L1_FC(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, FC0 ) - L1_fRoots(:,h) = upscale_harmonic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, fRoots0 ) - - end do - ! anything else - CASE DEFAULT - call message() - call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') - stop - END SELECT - - - ! below operations are common to all soil databases flags - !$OMP PARALLEL - !------------------------------------------------------------------------ - ! CHECK LIMITS OF PARAMETERS - ! [PW <= FC <= ThetaS] - ! units of all variables are now in [mm] - ! If by any means voilation of this rule appears (e.g. numerical errors) - ! than correct it --> threshold limit = 1% of the upper ones - !------------------------------------------------------------------------ - L1_FC = merge( L1_SMs - 0.01_dp * L1_SMs, L1_FC, L1_FC .gt. L1_SMs) - L1_PW = merge( L1_FC - 0.01_dp * L1_FC, L1_PW, L1_PW .gt. L1_FC) - ! check the physical limit - L1_SMs = merge( 0.0001_dp, L1_SMs, L1_SMs .lt. 0.0_dp ) - L1_FC = merge( 0.0001_dp, L1_FC, L1_FC .lt. 0.0_dp ) - L1_PW = merge( 0.0001_dp, L1_PW, L1_PW .lt. 0.0_dp ) - ! Normalise the vertical root distribution profile such that [sum(fRoots) = 1.0] - !$OMP DO PRIVATE( fTotRoots ) SCHEDULE( STATIC ) - do k = 1, size(L1_fRoots,1) - fTotRoots = sum(L1_fRoots(k, :), L1_fRoots(k, :) .gt. 0.0_dp) - ! This if clause is necessary for test program but may be redundant in actual program - if ( fTotRoots .gt. 0.0_dp ) then - L1_fRoots(k, :) = L1_fRoots(k,:) / fTotRoots - else - L1_fRoots(k, :) = 0.0_dp - end If - end do - - - - !$OMP END DO - !$OMP END PARALLEL - - - end subroutine mpr_SMhorizons - -end module mo_mpr_SMhorizons - - diff --git a/src/mHM/mo_mpr_soilmoist.f90 b/src/mHM/mo_mpr_soilmoist.f90 deleted file mode 100644 index a95d31a8..00000000 --- a/src/mHM/mo_mpr_soilmoist.f90 +++ /dev/null @@ -1,821 +0,0 @@ -!> \file mo_mpr_soilmoist.f90 - -!> \brief Multiscale parameter regionalization (MPR) for soil moisture - -!> \details This module contains all routines required for parametrizing -!> soil moisture processes. - -!> \author Stephan Thober, Rohini Kumar -!> \date Dec 2012 - -module mo_mpr_soilmoist - - use mo_kind, only: i4, dp - - implicit none - - public :: mpr_sm - - private - -contains - ! ---------------------------------------------------------------------------- - - ! NAME - ! mpr_sm - - !> \brief multiscale parameter regionalization for soil moisture - - !> \details This subroutine is a wrapper around all soil moisture - !> parameter routines. This subroutine requires 13 parameters. These - !> parameters have to correspond to the parameters in the original - !> parameter array at the following locations: 10-12, 13-18, 27-30.\n - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param( 1) = orgMatterContent_forest \n - !> - param( 2) = orgMatterContent_impervious \n - !> - param( 3) = orgMatterContent_pervious \n - !> - param( 4) = PTF_lower66_5_constant \n - !> - param( 5) = PTF_lower66_5_clay \n - !> - param( 6) = PTF_lower66_5_Db \n - !> - param( 7) = PTF_higher66_5_constant \n - !> - param( 8) = PTF_higher66_5_clay \n - !> - param( 9) = PTF_higher66_5_Db \n - !> - param(10) = PTF_Ks_constant \n - !> - param(11) = PTF_Ks_sand \n - !> - param(12) = PTF_Ks_clay \n - !> - param(13) = PTF_Ks_curveSlope \n - - ! INTENT(IN) - !> \param[in] "real(dp) :: param(13)" - global parameters - !> \param[in] "real(dp) :: nodata" - no data value - !> \param[in] "integer(i4) :: iFlag_soil" - flags for handling multiple soil databases - !> \param[in] "integer(i4) :: is_present(:)" - indicates whether soiltype is present - !> \param[in] "integer(i4) :: nHorizons(:)" - Number of Horizons per soiltype2 - !> \param[in] "integer(i4) :: nTillHorizons(:)" - Number of Tillage Horizons - !> \param[in] "real(dp) :: sand(:,:)" - sand content - !> \param[in] "real(dp) :: clay(:,:)" - clay content - !> \param[in] "real(dp) :: DbM(:,:)" - mineral Bulk density - !> \param[in] "integer(i4) :: L0_ID(:,:)" - cell ids at level 0 - !> \param[in] "integer(i4) :: L0_soilId(:,:)" - soil ids at level 0 - !> \param[in] "integer(i4) :: L0_LUC(:,:)" - land cover ids at level 0 - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: thetaS_till(:,:,:)" - saturated soil moisture tillage layer - !> \param[out] "real(dp) :: thetaFC_till(:,:,:)" - field capacity tillage layer - !> \param[out] "real(dp) :: thetaPW_till(:,:,:)" - permanent wilting point tillage layer - !> \param[out] "real(dp) :: thetaS(:,:)" - saturated soil moisture - !> \param[out] "real(dp) :: thetaFC(:,:)" - field capacity - !> \param[out] "real(dp) :: thetaPW(:,:)" - permanent wilting point - !> \param[out] "real(dp) :: Ks(:,:,:)" - saturated hydraulic conductivity - !> \param[out] "real(dp) :: Db(:,:,:)" - Bulk density - !> \param[out] "real(dp) :: L0_KsVar_H(:,:)" - relative variability of saturated - !> hydraulic counductivity for Horizantal flow - !> \param[out] "real(dp) :: L0_KsVar_V(:,:)" - relative variability of saturated - !> hydraulic counductivity for Vertical flow - !> \param[out] "real(dp) :: L0_SMs_FC(:,:)" - soil mositure deficit from field - !> capacity w.r.t to saturation - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written, Stephan Thober, Dec 2012 - ! Modified, Juliane Mai, Oct 2013 - OLD parametrization - ! --> param(1) = orgMatterContent_forest - ! --> param(2) = orgMatterContent_impervious - ! --> param(3) = orgMatterContent_pervious - ! --> param(4:13) = ... - ! ------------------------------- - ! orgMatterContent_forest = orgMatterContent_perv + delta_1 - ! ------------------------------- - ! NEW parametrization - ! --> param(1) = delta_1 - ! --> param(2) = orgMatterContent_impervious - ! --> param(3) = orgMatterContent_pervious - ! --> param(4:13) = ... - ! Modified, Matthias Zink, Nov 2013 - documentation, inouts --> out - ! moved constants to mhm_constants - ! Modified, Stephan Thober, Mar 2014 - separated cell loop from soil loop for better - ! scaling in parallelisation - ! Modified, David Schaefer, Mar 2015 - Added dummy variable to avoid redundant computations - ! -> Total number of instruction is reduced by ~25% - ! (tested on packaged example/gnu48/{release,debug}) - ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options - subroutine mpr_sm( param , & ! IN: global parameter set - nodata , & ! IN: nodata value - iFlag_soil , & ! IN: flag to handle different soil database - is_present , & ! IN: flag indicating presence of soil - nHorizons , & ! IN: Number of Horizons of Soiltype - nTillHorizons , & ! IN: Number of tillage Horizons - sand , & ! IN: sand content - clay , & ! IN: clay content - DbM , & ! IN: mineral Bulk density - ID0 , & ! IN: cell ids at level 0 - soilId0 , & ! IN: soil ids at level 0 - LCover0 , & ! IN: land cover ids at level 0 - thetaS_till , & ! OUT: saturated soil moisture tillage layer - thetaFC_till , & ! OUT: field capacity tillage layer - thetaPW_till , & ! OUT: permanent wilting point tillage layer - thetaS , & ! OUT: saturated soil moisture - thetaFC , & ! OUT: field capacity - thetaPW , & ! OUT: permanent wilting point - Ks , & ! OUT: saturated hydraulic conductivity - Db , & ! OUT: Bulk density - KsVar_H0 , & ! OUT: relative variability of saturated - ! ! hydraulic counductivity for Horizantal flow - KsVar_V0 , & ! OUT: relative variability of saturated - ! ! hydraulic counductivity for Horizantal flow - SMs_FC0 & ! OUT: soil moisture deficit from field capacity - ! ! w.r.t to saturation - ) - - use mo_mhm_constants, only: BulkDens_OrgMatter - use mo_message, only: message - !$ use omp_lib - - implicit none - - ! Input -------------------------------------------------------------------- - real(dp), dimension(13), intent(in) :: param ! global parameters - real(dp), intent(in) :: nodata ! no data value - integer(i4), intent(in) :: iFlag_soil ! flag to handle different soil database - - integer(i4), dimension(:), intent(in) :: is_present ! indicates whether soiltype is present - integer(i4), dimension(:), intent(in) :: nHorizons ! Number of Horizons per soiltype - integer(i4), dimension(:), intent(in) :: nTillHorizons! Number of Tillage Horizons - real(dp), dimension(:,:), intent(in) :: sand ! sand content - real(dp), dimension(:,:), intent(in) :: clay ! clay content - real(dp), dimension(:,:), intent(in) :: DbM ! mineral Bulk density - integer(i4), dimension(:), intent(in) :: ID0 ! cell ids at level 0 - integer(i4), dimension(:,:), intent(in) :: soilId0 ! soil ids at level 0 - integer(i4), dimension(:), intent(in) :: LCOVER0 ! land cover ids at level 0 - - - ! Output ------------------------------------------------------------------- - real(dp), dimension(:,:,:), intent(out) :: thetaS_till ! saturated soil moisture tillage layer - real(dp), dimension(:,:,:), intent(out) :: thetaFC_till ! field capacity tillage layer - real(dp), dimension(:,:,:), intent(out) :: thetaPW_till ! permanent wilting point tillage layer - real(dp), dimension(:,:), intent(out) :: thetaS ! saturated soil moisture - real(dp), dimension(:,:), intent(out) :: thetaFC ! field capacity - real(dp), dimension(:,:), intent(out) :: thetaPW ! permanent wilting point - real(dp), dimension(:,:,:), intent(out) :: Ks ! saturated hydraulic conductivity - real(dp), dimension(:,:,:), intent(out) :: Db ! Bulk density - real(dp), dimension(:), intent(out) :: KsVar_H0 ! rel. var. of Ks for horizontal flow - real(dp), dimension(:), intent(out) :: KsVar_V0 ! rel. var. of Ks for vertical flow - real(dp), dimension(:), intent(out) :: SMs_FC0 ! soil mositure deficit from - ! ! field cap. w.r.t to saturation - ! Local variables - integer(i4) :: i ! loop index - integer(i4) :: j ! loop index - integer(i4) :: l ! loop index - integer(i4) :: s ! dummy variable for storing soil class - integer(i4) :: tmp_minSoilHorizon - real(dp) :: pM - real(dp) :: pOM - real(dp) :: Ks_tmp ! temporal saturated hydr. cond - real(dp) :: Genu_Mual_n ! van Genuchten shape param - real(dp) :: Genu_Mual_alpha ! van Genuchten shape param - real(dp) :: tmp_orgMatterContent_forest - real(dp) :: tmp_orgMatterContent_pervious - real(dp) :: tmp_orgMatterContent_impervious - real(dp), dimension(:), allocatable :: SMs_tot0 ! total saturated soil mositure content - ! some additional variables for iFlag_soil = 1 - real(dp), dimension(:,:), allocatable :: Ks_non_till ! saturated hydraulic conductivity - - tmp_orgMatterContent_forest = param(3) + param(1) - tmp_orgMatterContent_impervious = param(2) - tmp_orgMatterContent_pervious = param(3) - tmp_minSoilHorizon = minval(nTillHorizons(:)) - - ! allocatable local variables - ! total saturated soil moisture content - allocate( SMs_tot0( size(ID0,1) ) ) - - ! some additional variables for iFlag_soil = 1 - if( iFlag_soil .eq. 1 ) then - s = size(is_present,1) - ! note: although second dimension is not required - ! we assign value 1 to be comparable to other assigned variables - allocate( Ks_non_till(s,1) ) - end if - - ! initializing soil hydraulic properties related params - KsVar_H0 = merge( 0.0_dp, nodata, ID0 .ne. int(nodata,i4) ) - KsVar_V0 = merge( 0.0_dp, nodata, ID0 .ne. int(nodata,i4) ) - SMs_tot0 = merge( 0.0_dp, nodata, ID0 .ne. int(nodata,i4) ) - SMs_FC0 = merge( 0.0_dp, nodata, ID0 .ne. int(nodata,i4) ) - - ! initialization - thetaS_till = 0.0_dp - thetaFC_till = 0.0_dp - thetaPW_till = 0.0_dp - thetaS = 0.0_dp - thetaFC = 0.0_dp - thetaPW = 0.0_dp - Ks = 0.0_dp - Db = 0.0_dp - if( allocated(Ks_non_till) ) Ks_non_till = 0.0_dp - - ! select case according to a given soil database flag - SELECT CASE(iFlag_soil) - ! classical mHM soil database format - CASE(0) - !$OMP PARALLEL default(shared) - !$OMP DO & - !$OMP PRIVATE( i, j, L, pOM, pM, Ks_tmp, Genu_Mual_alpha, Genu_Mual_n ) & - !$OMP SCHEDULE( STATIC ) - do i = 1, size(is_present) - if ( is_present(i) .lt. 1 ) cycle - horizon: do j = 1, nHorizons(i) - ! calculating vertical hydraulic conductivity - call hydro_cond( Ks_tmp, param(10:13), sand(i,j), clay(i,j) ) - Ks(i,j,:) = Ks_tmp - ! calculating other soil hydraulic properties - ! tillage horizons - if ( j .le. nTillHorizons(i) ) then - ! LC class - do L = 1, maxval( LCOVER0 ) - select case (L) - case(1) ! forest - pOM = tmp_orgMatterContent_forest - case(2) ! impervious - pOM = tmp_orgMatterContent_impervious !param(2) - case(3) ! permeable - pOM = tmp_orgMatterContent_pervious - case default - stop 'Error mpr_sm: pOM used uninitialized.' - end select - pM = 100.0_dp - pOM - ! bulk density acording to Rawl's (1982) paper - Db(i,j,L) = 100.0_dp / ( (pOM/BulkDens_OrgMatter) + (pM/DbM(i,j)) ) - ! Effect of organic matter content - ! This is taken into account in a simplified form by using - ! the ratio of(Bd / BdOM) - Ks_tmp = Ks_tmp * ( DbM(i,j)/Db(i,j,L) ) - Ks(i,j,L) = Ks_tmp - ! estimated SMs_till & van Genuchten's shape parameter (n) - call Genuchten( thetaS_till(i,j,L), Genu_Mual_n, Genu_Mual_alpha, & - param(4:9), sand(i,j), clay(i,j), Db(i,j,L) ) - ! estimating field capacity - call field_cap( thetaFC_till(i,j,L), Ks_tmp, thetaS_till(i,j,L), Genu_Mual_n ) - ! estimating permanent wilting point - call PWP( Genu_Mual_n, Genu_Mual_alpha, thetaS_till(i,j,L), thetaPW_till(i,j,L) ) - end do - ! deeper layers - else - ! estimate SMs & van Genuchten's shape parameter (n) - call Genuchten( thetaS(i, j-tmp_minSoilHorizon), Genu_Mual_n, Genu_Mual_alpha, & - param(4:9), sand(i,j), clay(i,j), DbM(i,j) ) - ! estimate field capacity - call field_cap( thetaFC(i,j-tmp_minSoilHorizon), & - Ks_tmp, thetaS(i,j-tmp_minSoilHorizon), Genu_Mual_n ) - ! estimate permanent wilting point - call PWP( Genu_Mual_n, Genu_Mual_alpha, thetaS(i, j-tmp_minSoilHorizon), & - thetaPW(i, j-tmp_minSoilHorizon) ) - end if - end do horizon - end do - !$OMP END DO - - ! calculate other soil properties at each location [L0] for regionalising model parameters - !$OMP DO PRIVATE( s, j ) SCHEDULE( STATIC ) - cellloop: do i = 1, size( soilId0, 1 ) !>> here = ncells0 - s = soilId0(i,1) !>> in this case the second dimension of soilId0 = 1 - do j = 1, nHorizons( s ) - if ( j .le. nTillHorizons( s ) ) then - ! Soil properties over the whole soil coloum depth - KsVar_H0(i) = KsVar_H0(i) + thetaS_till( s, j, LCover0(i) ) * Ks( s, j, LCover0(i) ) - KsVar_V0(i) = KsVar_V0(i) + thetaS_till( s, j, LCover0(i) ) / Ks( s, j, LCover0(i) ) - SMs_FC0(i) = SMs_FC0(i) + thetaFC_till(s, j, LCover0(i) ) - SMs_tot0(i) = SMs_tot0(i) + thetaS_till (s, j, LCover0(i) ) - else - ! soil_properties over the whole soil column - KsVar_H0(i) = KsVar_H0(i)+thetaS(s,j-tmp_minSoilHorizon)*Ks(s,j,1) - KsVar_V0(i) = KsVar_V0(i)+thetaS(s,j-tmp_minSoilHorizon)/Ks(s,j,1) - SMs_FC0(i) = SMs_FC0(i) +thetaFC(s,j-tmp_minSoilHorizon) - SMs_tot0(i) = SMs_tot0(i)+thetaS (s,j-tmp_minSoilHorizon) - end if - end do - ! ------------------------------------------------------------------ - ! DETERMINE RELATIVE VARIABILITIES OF - ! Ks FOR HORIZONTAL FLOW (KsVar_H) - ! & - ! Ks FOR VERTICAL FLOW (KsVar_V) - ! ------------------------------------------------------------------ - ! soil moisture saturation deficit relative to the field capacity soil moisture - SMs_FC0(i) = (SMs_tot0(i) - SMs_FC0(i)) / SMs_tot0(i) - ! Ks variability over the whole soil coloum depth for - ! both horizontal and vertical flows including relative variabilities - KsVar_H0(i) = KsVar_H0(i) / SMs_tot0(i) / param(13) - KsVar_V0(i) = SMs_tot0(i) / KsVar_V0(i) / param(13) - end do cellloop - !$OMP END DO - !$OMP END PARALLEL - - ! to handle multiple soil horizons with unique soil class - CASE(1) - do i = 1, size(is_present) - if ( is_present(i) .lt. 1 ) cycle - ! **** FOR THE TILLAGE TYPE OF SOIL ***** - ! there is actually no soil horizons/soil type in this case - ! but we assign of j = 1 to use variables as defined in the classical option (iFlag_soil = 0) - do j = 1, 1 - ! calculating vertical hydraulic conductivity - call hydro_cond( Ks_tmp, param(10:13), sand(i,j), clay(i,j) ) - Ks_non_till(i,j) = Ks_tmp !>> non-till - Ks(i,j,:) = Ks_tmp !>> till layers - ! calculating other soil hydraulic properties - ! tillage horizons properties depending on the LC class - do L = 1, maxval( LCOVER0 ) - select case (L) - case(1) ! forest - pOM = tmp_orgMatterContent_forest - case(2) ! impervious - pOM = tmp_orgMatterContent_impervious !param(2) - case(3) ! permeable - pOM = tmp_orgMatterContent_pervious - case default - STOP 'Error mpr_sm: pOM used is not initialized.' - end select - pM = 100.0_dp - pOM - ! bulk density acording to Rawl's (1982) paper - Db(i,j,L) = 100.0_dp / ( (pOM/BulkDens_OrgMatter) + (pM/DbM(i,j)) ) - ! Effect of organic matter content on Ks estimates - ! This is taken into account in a simplified form by using - ! the ratio of (Bd/BdOM) - Ks_tmp = Ks_tmp * ( DbM(i,j) / Db(i,j,L) ) - Ks(i,j,L) = Ks_tmp - ! estimated SMs_till & van Genuchten's shape parameter (n) - call Genuchten( thetaS_till(i,j,L), Genu_Mual_n, Genu_Mual_alpha, & - param(4:9), sand(i,j), clay(i,j), Db(i,j,L) ) - ! estimating field capacity - call field_cap( thetaFC_till(i,j,L), Ks_tmp, thetaS_till(i,j,L), Genu_Mual_n ) - ! estimating permanent wilting point - call PWP( Genu_Mual_n, Genu_Mual_alpha, thetaS_till(i,j,L), thetaPW_till(i,j,L) ) - end do - - ! *** FOR NON-TILLAGE TYPE OF SOILS *** - ! note j = 1 - ! since Ks_tmp has changed earlier ... get the original Ks once again - Ks_tmp = Ks_non_till(i,j) - ! estimate SMs & van Genuchten's shape parameter (n) - call Genuchten( thetaS(i,j), Genu_Mual_n, Genu_Mual_alpha, param(4:9), sand(i,j), clay(i,j), DbM(i,j) ) - ! estimate field capacity - call field_cap( thetaFC(i,j), Ks_tmp, thetaS(i,j), Genu_Mual_n ) - ! estimate permanent wilting point - call PWP( Genu_Mual_n, Genu_Mual_alpha, thetaS(i,j), thetaPW(i,j) ) - - end do !>> HORIZON - end do !>> SOIL TYPE - - ! calculate other soil properties at each location [L0] for regionalising model parameters - do i = 1, size(soilId0, 1) !! over all cells - do j = 1, size(soilId0, 2) !! over horizons - s = soilId0(i,j) - if ( j .le. nTillHorizons(1) ) then - ! soil properties over the whole soil coloum depth - KsVar_H0(i) = KsVar_H0(i) + thetaS_till (s,1,LCover0(i) ) * Ks(s,1,LCover0(i) ) - KsVar_V0(i) = KsVar_V0(i) + thetaS_till (s,1,LCover0(i) ) / Ks(s,1,LCover0(i) ) - SMs_FC0(i) = SMs_FC0 (i) + thetaFC_till(s,1,LCover0(i) ) - SMs_tot0(i) = SMs_tot0(i) + thetaS_till (s,1,LCover0(i) ) - else - ! soil_properties over the whole soil column - KsVar_H0(i) = KsVar_H0(i) + thetaS (s,1)*Ks_non_till(s,1) - KsVar_V0(i) = KsVar_V0(i) + thetaS (s,1)/Ks_non_till(s,1) - SMs_FC0(i) = SMs_FC0 (i) + thetaFC(s,1) - SMs_tot0(i) = SMs_tot0(i) + thetaS (s,1) - end if - end do - ! ------------------------------------------------------------------ - ! DETERMINE RELATIVE VARIABILITIES OF - ! Ks FOR HORIZONTAL FLOW (KsVar_H) & Ks FOR VERTICAL FLOW (KsVar_V) - ! ------------------------------------------------------------------ - ! soil moisture saturation deficit relative to the field capacity soil moisture - SMs_FC0(i) = (SMs_tot0(i) - SMs_FC0(i)) / SMs_tot0(i) - ! Ks variability over the whole soil coloum depth for - ! both horizontal and vertical flows including relative variabilities - KsVar_H0(i) = KsVar_H0(i) / SMs_tot0(i) / param(13) - KsVar_V0(i) = SMs_tot0(i) / KsVar_V0(i) / param(13) - end do - - CASE DEFAULT - call message() - call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') - stop - END SELECT - - ! free space ** - deallocate( SMs_tot0 ) - if( allocated(Ks_non_till) ) deallocate(Ks_non_till) - - end subroutine mpr_sm - - ! ------------------------------------------------------------------ - - ! NAME - ! PWP - - !> \brief Permanent Wilting point - - !> \details This subroutine calculates the permanent wilting - !> point according to Zacharias et al. (2007, Soil Phy.) and - !> using van Genuchten 1980's equation. For the water retention curve at - !> a matrix potential of -1500 kPa, it is assumed that thetaR = 0. - - ! INTENT(IN) - !> \param[in] "real(dp) :: Genu_Mual_n" - Genuchten shape parameter - !> \param[in] "real(dp) :: Genu_Mual_alpha" - Genuchten shape parameter - !> \param[in] "real(dp) :: thetaS" - saturated water content - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: thetaPWP" - Permanent Wilting point - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! Zacharias et al. 2007, Soil Phy. - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec, 2012 - ! Written, Stephan Thober, Dec 2012 - ! Modified, Matthias Zink, Nov 2013 - documentation, moved constants to mhm_constants - ! ------------------------------------------------------------------ - - elemental pure subroutine PWP( Genu_Mual_n, Genu_Mual_alpha , thetaS, thetaPWP ) - - use mo_mhm_constants , only: PWP_c ! constant for m, - use mo_mhm_constants , only: PWP_matPot_ThetaR ! matrix potential of 1500 kPa, assumed as thetaR = 0 - - implicit none - - ! Input - real(dp), intent(in) :: Genu_Mual_n ! Genuchten shape parameters - real(dp), intent(in) :: Genu_Mual_alpha ! Genuchten shape parameters - real(dp), intent(in) :: thetaS ! saturated water content - - ! Output - real(dp), intent(out) :: thetaPWP ! Permanent wilting point - - ! Local variable - real(dp) :: x - real(dp) :: Genu_Mual_m ! Genuchten shape parameter - - Genu_Mual_m = PWP_c - (PWP_c / Genu_Mual_n) - x = PWP_c + exp(Genu_Mual_n * log(Genu_Mual_alpha * PWP_matPot_ThetaR)) - x = exp(Genu_Mual_m * log(x)) - ! constrain - if ( x < 1.0_dp) x = 1.0_dp - thetaPWP = thetaS / x - - end subroutine PWP - - ! ---------------------------------------------------------------------------- - - ! NAME - ! field_cap - - !> \brief calculates the field capacity - - !> \details estimate Field capacity; FC -- Flux based - !> approach (Twarakavi, et. al. 2009, WRR) \n - !> According to the - !> above reference FC is defined as the soil water content at - !> which the drainage from a profile ceases under natural - !> conditions. Since drainage from a soil profile in a simulation - !> never becomes zero, we assume that drainage ceases when the - !> bottom flux from the soil reaches a value that is equivalent to - !> the minimum amount of precipitation that could be recorded - !> (i.e. 0.01 cm/d == 1 mm/d). It is assumed that ThetaR = 0.0_dp - - ! INTENT(IN) - !> \param[in] "real(dp) :: Ks" - saturated hydraulic conductivity - !> \param[in] "real(dp) :: thetaS" - saturated water content - !> \param[in] "real(dp) :: Genu_Mual_n" - Genuchten shape parameter - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: thetaFC" - Field capacity - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! Twarakavi, et. al. 2009, WRR - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written, Stephan Thober, Dec 2012 - ! Modified, Matthias Zink, Nov 2013 - documentation, moved constants to mhm_constants - - - elemental pure subroutine field_cap( thetaFC, & ! Output - Ks, thetaS, Genu_Mual_n ) ! Input - - use mo_mhm_constants , only: field_cap_c1, field_cap_c2 - - implicit none - - ! Input - real(dp), intent(in) :: Ks ! saturated hydraulic conductivity - real(dp), intent(in) :: thetaS ! saturated water content - real(dp), intent(in) :: Genu_Mual_n ! Genuchten shape parameter - - ! Output - real(dp), intent(out) :: thetaFC ! Field capacity - - ! Local variable - real(dp) :: x - - x = (field_cap_c1) * (field_cap_c2 + log10( Ks )) - thetaFC = thetaS * exp( x * log(Genu_Mual_n) ) - - end subroutine field_cap - - ! ---------------------------------------------------------------------------- - - ! NAME - ! Genuchten - - !> \brief calculates the Genuchten shape parameter - - !> \details estimate SMs_till & van Genuchten's shape parameter (n) - !> (Zacharias et al, 2007, soil Phy.)\n - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param( 1) = PTF_lower66_5_constant \n - !> - param( 2) = PTF_lower66_5_clay \n - !> - param( 3) = PTF_lower66_5_Db \n - !> - param( 4) = PTF_higher66_5_constant \n - !> - param( 5) = PTF_higher66_5_clay \n - !> - param( 6) = PTF_higher66_5_Db \n - - ! INTENT(IN) - !> \param[in] "real(dp) :: param(6)" - given parameters - !> \param[in] "real(dp) :: sand" - [%] sand content - !> \param[in] "real(dp) :: clay" - [%] clay content - !> \param[in] "real(dp) :: Db" - [10^3 kg/m3] bulk density - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: thetaS" - saturated water content - !> \param[out] "real(dp) :: Genu_Mual_n" - van Genuchten shape parameter - !> \param[out] "real(dp) :: Genu_Mual_alpha" - van Genuchten shape parameter - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! Zacharias et al, 2007, soil Phy. - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written, Stephan Thober, Dec 2012 - ! Modified, Rohini Kumar , Mar 2014 - ThetaS limit changed from 0 to 0.001 - - subroutine Genuchten(thetaS, Genu_Mual_n, Genu_Mual_alpha, & ! Output variables - param, sand, clay, Db ) ! Input variables - - use mo_mhm_constants, only: vGenuchten_sandtresh,& ! van Genuchten snad treshold - vGenuchtenN_c1 , & ! constants for van Genuchten n - vGenuchtenN_c2 , & ! constants for van Genuchten n - vGenuchtenN_c3 , & ! constants for van Genuchten n - vGenuchtenN_c4 , & ! constants for van Genuchten n - vGenuchtenN_c5 , & ! constants for van Genuchten n - vGenuchtenN_c6 , & ! constants for van Genuchten n - vGenuchtenN_c7 , & ! constants for van Genuchten n - vGenuchtenN_c8 , & ! constants for van Genuchten n - vGenuchtenN_c9 , & ! constants for van Genuchten n - vGenuchtenN_c10, & ! constants for van Genuchten n - vGenuchtenN_c11, & ! constants for van Genuchten n - vGenuchtenN_c12, & ! constants for van Genuchten n - vGenuchtenN_c13, & ! constants for van Genuchten n - vGenuchtenN_c14, & ! constants for van Genuchten n - vGenuchtenN_c15, & ! constants for van Genuchten n - vGenuchtenN_c16, & ! constants for van Genuchten n - vGenuchtenN_c17, & ! constants for van Genuchten n - vGenuchtenN_c18 ! constants for van Genuchten n - - implicit none - - ! Input - real(dp), dimension(6), intent(in) :: param ! parameters - real(dp), intent(in) :: sand ! sand content - real(dp), intent(in) :: clay ! clay content - real(dp), intent(in) :: Db ! [10^3 kg/m3] bulk density - - ! Output - real(dp), intent(out) :: thetaS ! saturated water content - real(dp), intent(out) :: Genu_Mual_n ! van Genuchten shape parameter - real(dp), intent(out) :: Genu_Mual_alpha ! van Genuchten shape parameter - - ! Local variables - real(dp) :: x ! temporal variable - - ! estimate SMs_till & van Genuchten's parameters (alpha and n) - if ( sand < vGenuchten_sandtresh ) then - thetaS = param(1) + param(2) * clay + param(3) * Db - Genu_Mual_n = vGenuchtenN_c1 - vGenuchtenN_c2 * ( sand**(vGenuchtenN_c3) ) + & - vGenuchtenN_c4 * ( clay**(vGenuchtenN_c5) ) - x = vGenuchtenN_c6 + vGenuchtenN_c7 * sand + vGenuchtenN_c8 * clay - & - vGenuchtenN_c9 * Db - else - thetaS = param(4) + param(5) * clay + param(6) * Db - Genu_Mual_n = vGenuchtenN_c10 + vGenuchtenN_c11 * (sand**(vGenuchtenN_c12) ) + & - vGenuchtenN_c13 * (clay**(vGenuchtenN_c14) ) - x = vGenuchtenN_c15 + vGenuchtenN_c16 * sand + vGenuchtenN_c17 * clay - & - vGenuchtenN_c18 * Db - end if - - ! Mualem alpha - Genu_Mual_alpha = exp(x) - - ! hard coded limits, according to (Zacharias et al, 2007, soil Phy.) - if (thetaS < 0.01_dp) then - write(*,*) 'thetaS below threshold limit 1e-2, reset.' - ! Put constrains on theta_S - thetaS = 0.01_dp - end if - if (thetaS > 1.0_dp) then - write(*,*) 'thetaS above 1, reset.' - ! Put constrains on theta_S - thetaS = 1.0_dp - end if - if (Genu_Mual_n < 1.01000_dp) then - write(*,*) 'Genu_Mual_n below threshold limit 1.01, reset.' - Genu_Mual_n = 1.01000_dp - end if - if (Genu_Mual_alpha < 0.00001_dp) then - write(*,*) 'Genu_Mual_alpha below threshold limit 1e-5, reset.' - Genu_Mual_alpha = 0.00001_dp - end if - - end subroutine Genuchten - - ! ---------------------------------------------------------------------------- - - ! NAME - ! hydro_cond - - !> \brief calculates the hydraulic conductivity Ks - - !> \details By default save this value of Ks, particularly for the - !> deeper layers where OM content plays relatively low or no role\n - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = PTF_Ks_constant \n - !> - param(2) = PTF_Ks_sand \n - !> - param(3) = PTF_Ks_clay \n - !> - param(4) = PTF_Ks_curveSlope \n - - ! INTENT(IN) - !> \param[in] "real(dp) :: param(4)" - given parameters - !> \param[in] "real(dp) :: sand" - [%] sand content - !> \param[in] "real(dp) :: clay" - [%] clay content - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: Ks" - hydraulic conductivity - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written, Stephan Thober, Dec 2012 - ! Modified, Matthias Zink, Nov 2013 - documentation, moved constants to mhm_constants - ! Matthias Cuntz, Jun 2014 - suggested to fix param(4) - - subroutine hydro_cond( KS, param, sand, clay ) - - use mo_mhm_constants, only: Ks_c - - implicit none - - ! Input - real(dp), dimension(4), intent(in) :: param - real(dp), intent(in) :: sand - real(dp), intent(in) :: clay - - ! Output - real(dp), intent(out) :: KS - - ! Local variables - real(dp) :: x ! temporal variable - - ! saturated vertical hydraulic conductivity, Ks (cm/d) - ! from Cosby et. al. (WRR 1984) Table 4 - ! param(4) is the unit conversion from inch/h to cm/d and should be a constant. - ! Fix it in the namelist, i.e. in - ! mhm_parameter.nml set the 4th value (=FLAG) to 0 and the third value to 60.96 - ! PTF_Ks_curveSlope = 60.96, 60.96, 60.96, 0, 1 - x = param(1) + param(2) * sand - param(3) * clay - Ks = param(4) * exp(X * log(Ks_c)) - - if ( Ks < 1.10_dp ) then - write(*,*) 'JMJMJM-Ks-BAD' - end if - - ! minimum value of Ks = 1.1cm/d - if (Ks < 1.10_dp) Ks = 1.10_dp - - end subroutine hydro_cond - -end module mo_mpr_soilmoist diff --git a/src/mHM/mo_multi_param_reg.f90 b/src/mHM/mo_multi_param_reg.f90 deleted file mode 100644 index 1940db5d..00000000 --- a/src/mHM/mo_multi_param_reg.f90 +++ /dev/null @@ -1,1379 +0,0 @@ -!> \file mo_multi_param_reg.f90 - -!> \brief Multiscale parameter regionalization (MPR). - -!> \details This module provides the routines for multiscale parameter regionalization (MPR). - -!> \authors Stephan Thober, Rohini Kumar -!> \date Dec 2012 - -! created Sa 16.02.2006 -! update Sa 17.09.2007 - betas new number -! update Sa 03.10.2007 - new name, land cover state -! update Ku 25.03.2008 - all parameters are regionalised -! update Ku 04.10.2010 - vector version -! update Th 20.12.2012 - modular version -! update MZ 27.11.2014 - added parameterization of PET -! update Ku Mar 2016 - changes for handling multiple soil database options -! M.C.Demirel & S.Stisen Apr 2017 - added ET reduction and FC dependency on root fraction coefficient at SM process(3) - - -MODULE mo_multi_param_reg - - use mo_kind, only: i4, dp - - implicit none - - private - - PUBLIC :: mpr ! calculates effective regionalised parameters - PUBLIC :: canopy_intercept_param ! estimate effective max. canopy interception - -contains - ! --------------------------------------------------------------------------- - - ! NAME - ! mpr - - !> \brief Regionalizing and Upscaling process parameters - - !> \details calculating process parameters at L0 scale (Regionalization), like:\n - !> - Baseflow recession parameter\n - !> - Soil moisture parameters\n - !> - PET correction for aspect\n - !> - !> and upscale these parameters to retrieve effective parameters at scale - !> L1. \n - !> Further parameter regionalizations are done for:\n - !> - snow accumulation and melting parameters\n - !> - threshold parameter for runoff generation on impervious layer\n - !> - karstic percolation loss\n - !> - setting up the Regionalized Routing Parameters\n - !> \n - - ! INTENT(IN) - !> \param[in] "integer(i4) :: tt" - simulation time step - !> \param[in] "integer(i4) :: newYear" - new year - !> \param[in] "integer(i4) :: LCyearId" - mapping of landcover scenes - !> \param[in] "integer(i4) :: proc_flag(:,:)" - indicates which process shall be run - !> the shape is number of processes times 3, the - !> first column indicates which kind of process - !> is run, 0 indicating do not run, the second - !> column indicates the number of parameters - !> required for this process and the third column - !> indicates the position of the first parameter - !> for this process in the array param - !> \param[in] "real(dp) :: param(:)" - given global parameter array - !> \param[in] "integer(i4) :: iFlag_soil" - flags for handling multiple soil databases - !> \param[in] "real(dp) :: nodata" - given nodata value - !> \param[in] "integer(i4) :: geoUnit0(:,:)" - geological units at Level 0 - !> \param[in] "integer(i4) :: geo_unit_list(:)" - index list of geological units - !> \param[in] "real(dp) :: LAILUT(:,:)" - [1] Leaf area index for LAIUnit - !> \param[in] "integer(i4) :: LAIUnitList(:)" - [1] List of ids of each LAI class in LAILUT - !> \param[in] "integer(i4) :: is_present(:)" - indicates whether soiltype exists - !> \param[in] "integer(i4) :: nHorizons(:)" - Number of Horizons per soiltype - !> \param[in] "integer(i4) :: nTillHorizons(:)" - Number of Tillage Horizons - !> \param[in] "real(dp) :: sand(:,:)" - sand content - !> \param[in] "real(dp) :: clay(:,:)" - clay content - !> \param[in] "real(dp) :: DbM(:,:)" - mineral Bulk density - !> \param[in] "real(dp) :: Wd(:,:,:)" - weights of mHM horizons - !> \param[in] "real(dp) :: RZdepth(:)" - [mm] Total soil depth - !> \param[in] "integer(i4) :: nHorizons_mHM" - Number of horizons in mHM - !> \param[in] "integer(i4) :: horizon_depth(:)" - depth of each horizon - !> \param[in] "real(dp) :: c2TSTu" - unit transformation coefficient - !> \param[in] "real(dp) :: fForest1(:)" - fraction of forest cover at scale L1 - !> \param[in] "real(dp) :: fIperm1(:)" - fraction of sealed area at scale L1 - !> \param[in] "real(dp) :: fPerm1(:)" - fraction of permeable area at scale L1 - !> \param[in] "integer(i4) :: soilID0(:,:)" - [1] soil IDs at level 0 - !> \param[in] "real(dp) :: Asp0(:,:)" - [degree] Aspect at Level 0 - !> \param[in] "real(dp) :: LCover_LAI0(:) - [1] land cover ID for LAI estimation - !> \param[in] "integer(i4) :: LCover0(:)" - [1] land use cover at level 0 - !> \param[in] "real(dp) :: length(:)" - [m] total length - !> \param[in] "real(dp) :: slope(:)" - average slope - !> \param[in] "real(dp) :: fFPimp(:)" - fraction of the flood plain with - !> impervious layer - !> \param[in] "real(dp) :: TS" - [h] time step in - !> \param[in] "integer(i4) :: cell_id0(:,:)" - cell ids of high resolution field, - !> Number of rows times Number of columns of - !> high resolution field - !> \param[in] "integer(i4) :: upp_row_L1(:)" - Upper row id in high resolution field - !> (L0) of low resolution cell (L1 cell) - !> \param[in] "integer(i4) :: low_row_L1(:)" - Lower row id in high resolution field - !> (L0) of low resolution cell (L1 cell) - !> \param[in] "integer(i4) :: lef_col_L1(:)" - Left column id in high resolution field - !> (L0) of low resolution cell (L1 cell) - !> \param[in] "integer(i4) :: rig_col_L1(:)" - Right column id in high resolution field - !> (L0) of low resolution cell (L1 cell) - !> \param[in] "integer(i4) :: nL0_in_L1(:)" - Number of high resolution cells (L0) in - !> low resolution cell (L1 cell) - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[in,out] "real(dp) :: k2_1(:,:)" - baseflow recession parameter at L1 - !> \param[in,out] "real(dp) :: KsVar_H0(:,:)" - relative variability of saturated - !> hydraulic cound. for Horizantal flow - !> \param[in,out] "real(dp) :: KsVar_V0(:,:)" - relative variability of saturated - !> hydraulic cound. for Vertical flow - !> \param[in,out] "real(dp) :: SMs_tot0(:,:)" - total saturated soil moisture content - !> \param[in,out] "real(dp) :: SMs_FC0(:,:)" - soil mositure deficit from - !> field cap. w.r.t to saturation - !> \param[in,out] "real(dp) :: beta1(:,:)" - Parameter that determines the - !> relative contribution to SM, upscaled - !> Bulk density. Number of cells at L1 - !> times number of horizons in mHM - !> \param[in,out] "real(dp) :: SMs1(:,:)" - [10^-3 m] depth of saturated SM cont - !> Number of cells at L1 times number - !> of horizons in mHM - !> \param[in,out] "real(dp) :: FC1(:,:)" - [10^-3 m] field capacity. Number - !> of cells at L1 times number of horizons - !> in mHM - !> \param[in,out] "real(dp) :: PW1(:,:)" - [10^-3 m] permanent wilting point. - !> Number of cells at L1 times number - !> of horizons in mHM - !> \param[in,out] "real(dp) :: jarvis_thresh_c1(:)"- [1] jarvis critical value for normalized - !> soil water content - !> \param[in,out] "real(dp) :: fRoots1(:,:)" - fraction of roots in soil horizons. - !> Number of cells at L1 times number - !> of horizons in mHM - !> \param[in,out] "real(dp) :: TT1(:) " - threshold temperature for snow rain - !> \param[in,out] "real(dp) :: DD1(:) " - Degree-day factor - !> \param[in,out] "real(dp) :: DDmax1(:)" - Maximum Degree-day factor - !> \param[in,out] "real(dp) :: IDDP1(:)" - increase of the degree-day factor per mm - !> of increase in precipitation - !> \param[in,out] "real(dp) :: fAsp1(:)" - [1] PET correction for Aspect at level 1 - !> \param[in,out] "real(dp) :: HarSamCoeff1(:)" - [1] PET Hargreaves Samani coefficient at level 1 - !> \param[in,out] "real(dp) :: PrieTayAlpha1(:,:)" - [1] PET Priestley Taylor coefficient at level 1 - !> \param[in,out] "real(dp) :: aeroResist1(:,:)" - [s m-1] PET aerodynamical resitance at level 1 - !> \param[in,out] "real(dp) :: surfResist1(:,:)" - [s m-1] PET bulk surface resitance at level 1 - !> \param[in,out] "real(dp) :: HL3(:)" - threshold parameter for runoff generation - !> on impervious layer - !> \param[in,out] "real(dp) :: K(:)" - [d] Muskingum travel time parameters - !> \param[in,out] "real(dp) :: xi(:)" - [1] Muskingum diffusion parameter (attenuation) - !> \param[in,out] "real(dp) :: C1(:)" - routing parameter C1 (Chow, 25-41) - !> \param[in,out] "real(dp) :: C2(:)" - routing parameter C2 (") - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written Stephan Thober, Dec 2012 - created - ! Modified, Stephan Thober, Jan 2013 - updated calling sequence for upscaling operators - ! Luis Samaniego, Feb 2013 - calling sequence, initial CHECK, call mpr_runoff - ! Stephan Thober, Feb 2013 - added subroutine for karstic percolation loss - ! removed L1_, L0_ in variable names - ! Stephan Thober, Aug 2015 - moved regionalization of routing to mRM - ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options - ! Zink M. & Demirel M.C., Mar 2017 - Added Jarvis soil water stress function at SM process(3) - ! Demirel M.C. & S. Stisen, Apr 2017 - Added FC dependency on root fraction coefficient at SM process(3) - - - !TO DOS: all variable names have to be updated as in the mHM call and the sorted. Documentation has to be updated - - - subroutine mpr( proc_Mat, & ! IN: determines which regionalization shall be done - iFlag_soil, & ! IN: flag to handle different soil database - param, & ! IN: global parameter array - nodata, & ! IN: no data value - mask0, & ! IN: mask at Level 0 - geoUnit0, & ! IN: geological units at level 0 - geoUnitList, & ! IN: List of Ids for geological units - GeoUnitKar, & ! IN: location karstic cells on level 0 - LAILUT, & ! IN: Leaf area index for LAIUnit - LAIUnitList, & ! IN: List of ids of each LAI class in LAILUT - SDB_is_present, & ! IN: indicates whether soiltype exists - SDB_nHorizons, & ! IN: Number of Horizons per soiltype - SDB_nTillHorizons, & ! IN: Number of Tillage Horizons - SDB_sand, & ! IN: sand content - SDB_clay, & ! IN: clay content - SDB_DbM, & ! IN: mineral Bulk density - SDB_Wd, & ! IN: weights of mHM - SDB_RZdepth, & ! IN: soil depth - nHorizons_mHM, & ! IN: Number of Horizons in mHM - horizon_depth, & ! IN: Depth of each horizon - c2TSTu, & ! IN: unit transformation coefficient - fForest1, & ! IN: fraction of forest cover at scale L1 - fIperm1, & ! IN: fraction of sealed area at scale L1 - fPerm1, & ! IN: fraction of permeable area at scale L1 - soilId0, & ! IN: soil Ids at level 0 - Asp0, & ! IN: [degree] Aspect at Level 0 - LCover_LAI0, & ! IN: [1] land cover ID for LAI estimation - LCover0, & ! IN: land use cover at level 0 - slope_emp0, & ! IN: Empirical quantiles of slope at Level 0 - cell_id0, & ! IN: cell Ids at level 0 - upp_row_L1, & ! IN: upper row of L0 block within L1 cell - low_row_L1, & ! IN: lower row of L0 block within L1 cell - lef_col_L1, & ! IN: left column of L0 block within L1 cell - rig_col_L1, & ! IN: right column of L0 block within L1 cell - nL0_in_L1, & ! IN: Number of L0 cells in L0 block within L1 cell - latitude, & ! IN: latitude at level 0 - alpha1, & ! INOUT: [1] Exponent for the upper reservoir - IDDP1, & ! INOUT: increase of the degree-day factor per mm of increase in precipitation - DDmax1, & ! INOUT: Maximum Degree-day factor - DD1, & ! INOUT: Degree-day factor with no precipitation - fAsp1, & ! INOUT: [1] PET correction for Aspect at level 1 - HarSamCoeff1, & ! INOUT: [1] PET Hargreaves Samani coefficient at level 1 - PrieTayAlpha1, & ! INOUT: [1] PET Priestley Taylor coefficient at level 1 - aeroResist1, & ! INOUT: [s m-1] PET aerodynamical resitance at level 1 - surfResist1, & ! INOUT: [s m-1] PET bulk surface resitance at level 1 - fRoots1, & ! INOUT: fraction of roots in soil horizons - K0_1, & ! INOUT: [10^-3 m] Recession coefficient of the upper reservoir, upper outlet - K1_1, & ! INOUT: [10^-3 m] Recession coefficient of the upper reservoir, lower outlet - K2_1, & ! INOUT: baseflow recession parameter at level 1 - Kp1, & ! INOUT: [d-1] percolation coefficient - karstic_loss, & ! INOUT: karstic percolation loss parameter - FC1, & ! INOUT: [10^-3 m] field capacity - SMs1, & ! INOUT: [10^-3 m] depth of saturated SM cont - beta1, & ! INOUT: Parameter that determines the relative contribution to SM - jarvis_thresh_c1, & ! INOUT: [1] jarvis critical value for normalized soil water content - TT1, & ! INOUT: threshold temperature for snow rain - HL1_1, & ! INOUT: [10^-3 m] Threshhold water depth in upper reservoir - ! ! (for Runoff contribution) - HL3, & ! INOUT: threshold parameter for runoff generation on impervious Layer - PW1 & ! INOUT: [10^-3 m] permanent wilting point - ) - - use mo_message, only: message - use mo_upscaling_operators, only: upscale_arithmetic_mean - use mo_mpr_soilmoist, only: mpr_sm - use mo_mpr_SMhorizons, only: mpr_SMhorizons - use mo_mpr_runoff, only: mpr_runoff - use mo_mpr_pet, only: pet_correctbyASP, priestley_taylor_alpha, & - bulksurface_resistance!, aerodynamical_resistance - - implicit none - - ! Input ---------------------------------------------------------- - integer(i4), dimension(:,:), intent(in) :: proc_Mat ! indicate processes - integer(i4), intent(in) :: iFlag_soil ! flag to handle different soil database - real(dp), dimension(:), intent(in) :: param ! array of global parameters - real(dp), intent(in) :: nodata ! nodata value - - logical, dimension(:,:), intent(in) :: mask0 ! mask at level 0 field - - ! baseflow recession - integer(i4), dimension(:), intent(in) :: geoUnit0 ! L0 geological units - integer(i4), dimension(:), intent(in) :: geoUnitList ! List of geological units - integer(i4), dimension(:), intent(in) :: GeoUnitKar ! Id of Karstic formations - - real(dp), dimension(:,:), intent(in) :: LAILUT ! Leaf area index for LAIUnit - integer(i4), dimension(:), intent(in) :: LAIUnitList ! List of ids of each LAI class in LAILUT - - ! moisture parametrization - integer(i4), dimension(:), intent(in) :: SDB_is_present ! indicates whether soiltype exists - integer(i4), dimension(:), intent(in) :: SDB_nHorizons ! Number of Horizons per soiltype - integer(i4), dimension(:), intent(in) :: SDB_nTillHorizons ! Number of Tillage Horizons - real(dp), dimension(:,:), intent(in) :: SDB_sand ! sand content - real(dp), dimension(:,:), intent(in) :: SDB_clay ! clay content - real(dp), dimension(:,:), intent(in) :: SDB_DbM ! mineral Bulk density - real(dp), dimension(:,:,:), intent(in) :: SDB_Wd ! weights of mHM horizons - real(dp), dimension(:), intent(in) :: SDB_RZdepth ! [mm] Total soil depth - integer(i4), intent(in) :: nHorizons_mHM ! Number of Horizons in mHM - real(dp), dimension(nHorizons_mHM), intent(in) :: horizon_depth ! [10^-3 m] Depth of each horizon - real(dp), intent(in) :: c2TSTu ! unit transformations - real(dp), dimension(:), intent(in) :: fForest1 ! [1] fraction of forest cover - real(dp), dimension(:), intent(in) :: fIperm1 ! [1] fraction of sealed area - real(dp), dimension(:), intent(in) :: fPerm1 ! [1] fraction of permeable area - integer(i4), dimension(:,:), intent(in) :: soilId0 ! soil Ids at level 0 - real(dp), dimension(:), intent(in) :: Asp0 ! [degree] Aspect at Level 0 - integer(i4), dimension(:), intent(in) :: LCover_LAI0 ! land cover ID for LAI estimation at level 0 - integer(i4), dimension(:), intent(in) :: LCOVER0 ! land cover at level 0 - - ! Ids of L0 cells beneath L1 cell - real(dp), dimension(:), intent(in) :: slope_emp0 ! Empirical quantiles of slope - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids at level 0 - integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of hi res block - integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of hi res block - integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of hi res block - integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of hi res block - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cell - - ! Output of baseflow recession coefficient - real(dp), dimension(size(upp_row_L1,1)), intent(inout) :: k2_1 ! Level 1 baseflow recession - - ! Output of soilmoisture parametrization - real(dp), dimension(:,:), intent(inout) :: beta1 ! Parameter that determines the rel. - ! ! contribution to SM, upscal. Bulk den. - real(dp), dimension(:), intent(inout) :: jarvis_thresh_c1 ! [1] jarvis critical value for norm SWC - - - real(dp), dimension(:,:), intent(inout) :: SMs1 ! [10^-3 m] depth of saturated SM - real(dp), dimension(:,:), intent(inout) :: FC1 ! [10^-3 m] field capacity - real(dp), dimension(:,:), intent(inout) :: PW1 ! [10^-3 m] permanent wilting point - real(dp), dimension(:,:), intent(inout) :: fRoots1 ! fraction of roots in soil horizon - real(dp), dimension(:), intent(inout) :: TT1 ! [degreeC] threshold temperature - ! ! for snow rain - real(dp), dimension(:), intent(inout) :: DD1 ! [mm-1 degreeC-1] Degree-day factor with - ! ! no precipitation - real(dp), dimension(:), intent(inout) :: DDmax1 ! [mm-1 degreeC-1] Maximum Degree-day factor - real(dp), dimension(:), intent(inout) :: IDDP1 ! [d-1 degreeC-1] Increase of the - ! ! Degree-day factor per mm of - ! ! increase in precipitation - - ! Output for PET parameterization - real(dp), dimension(:), intent(inout) :: fAsp1 ! [1] PET correction for Aspect at level 1 - real(dp), dimension(:), intent(inout) :: HarSamCoeff1 ! [1] PET Hargreaves Samani coeff. at level 1 - real(dp), dimension(:,:), intent(inout) :: PrieTayAlpha1 ! [1] PET Priestley Taylor coeff. at level 1 - real(dp), dimension(:,:), intent(inout) :: aeroResist1 ! [s m-1] PET aerodynamical resitance at level 1 - real(dp), dimension(:,:), intent(inout) :: surfResist1 ! [s m-1] PET bulk surface resitance at level 1 - - ! Output for impervious layer threshold generation - real(dp), dimension(:), intent(inout) :: HL3 ! threshold parameter - - ! Output of mpr runoff - real(dp), dimension(:), intent(inout) :: HL1_1 ! [10^-3 m] Threshhold water depth - ! ! in upper reservoir (for Runoff - ! ! contribution) - real(dp), dimension(:), intent(inout) :: K0_1 ! [10^-3 m] Recession coefficient - ! ! of the upper reservoir, upper outlet - real(dp), dimension(:), intent(inout) :: K1_1 ! [10^-3 m] Recession coefficient - ! ! of the upper reservoir, lower outlet - real(dp), dimension(:), intent(in) :: latitude ! latitude at level 0 - real(dp), dimension(:), intent(inout) :: alpha1 ! [1] Exponent for the upper reservoir - real(dp), dimension(:), intent(inout) :: Kp1 ! [d-1] percolation coefficient - - ! Output of karstic percolation loss - real(dp), dimension(:), intent(inout) :: karstic_loss - - ! Local Variables - real(dp), dimension(:,:,:), allocatable :: thetaS_till - real(dp), dimension(:,:,:), allocatable :: thetaFC_till - real(dp), dimension(:,:,:), allocatable :: thetaPW_till - real(dp), dimension(:,:,:), allocatable :: Ks ! saturated hydraulic conductivity - real(dp), dimension(:,:,:), allocatable :: Db ! Bulk density - real(dp), dimension(:,:), allocatable :: thetaS - real(dp), dimension(:,:), allocatable :: thetaFC - real(dp), dimension(:,:), allocatable :: thetaPW - real(dp), dimension(:), allocatable :: KsVar_H0 ! relative variability of saturated - ! ! hydraulic cound. for Horizantal flow - real(dp), dimension(:), allocatable :: KsVar_V0 ! relative variability of saturated - ! ! hydraulic cound. for vertical flow - real(dp), dimension(:), allocatable :: SMs_FC0 ! soil mositure deficit from - ! ! field cap. w.r.t to saturation - real(dp), dimension(size(cell_id0,1)) :: k2_0 ! L0 baseflow parameter - real(dp), dimension(size(cell_id0,1)) :: fAsp0 ! L0 Aspect - integer(i4) :: mSoil ! number of soil classes - integer(i4) :: mTill ! maximum of number of Tillage horizons - integer(i4) :: mHor ! maximum number of horizons - integer(i4) :: mLC ! number of Landcover classes - integer(i4) :: iStart ! indexing of parameter vector - start - integer(i4) :: iEnd ! indexing of parameter vector - end - integer(i4) :: iStart2 ! 2nd indexing of parameter vector - start - integer(i4) :: iEnd2 ! 2nd indexing of parameter vector - end - - ! ------------------------------------------------------------------ - ! snow parameters - ! ------------------------------------------------------------------ - select case( proc_Mat(2,1) ) - case(1) - - iStart = proc_Mat(2,3) - proc_Mat(2,2) + 1 - iEnd = proc_Mat(2,3) - - call snow_acc_melt_param( param( iStart:iEnd ), c2TSTu, & ! intent(in) - fForest1, fIperm1, fPerm1, & ! intent(in) - TT1, DD1, IDDP1, DDmax1 & ! intent(out) - ) - case DEFAULT - call message() - call message('***ERROR: Process description for process "snow pack" does not exist! mo_multi_param_reg') - stop - end select - - ! ------------------------------------------------------------------ - ! Soil moisture parametrization - ! ------------------------------------------------------------------ - msoil = size( SDB_is_present, 1 ) - mLC = maxval( LCover0, ( LCover0 .ne. int(nodata,i4) ) ) - - ! depending on which kind of soil database processing is to be performed - if( iFlag_soil .eq. 0 )then - mtill = maxval(SDB_nTillHorizons, ( SDB_nTillHorizons .ne. int(nodata,i4) ) ) - mHor = maxval(SDB_nHorizons, ( SDB_nHorizons .ne. int(nodata,i4) ) ) - else if(iFlag_soil .eq. 1) then - ! here for each soil type both till and non-till soil hydraulic properties are to be estimated - ! since a given soil type can lie in any horizon (till or non-till ones) - ! adopt it in a way that it do not break the consistency of iFlag_soil = 0 - ! ** NOTE: SDB_nTillHorizons and SDB_nHorizons are also assigned in - ! this flag option (see mo_soildatabase.f90 file - read_soil_LUT). - ! But we are not using those variables here since in this case we have not - ! varying number of soil horizons or either tillage horizons. - ! So assigning them with a value = 1 is more than enough. - mtill = 1 - mHor = 1 - end if - - allocate( thetaS_till(msoil, mtill, mLC) ) - allocate( thetaFC_till(msoil, mtill, mLC) ) - allocate( thetaPW_till(msoil, mtill, mLC) ) - allocate( thetaS(msoil, mHor ) ) - allocate( thetaFC(msoil, mHor ) ) - allocate( thetaPW(msoil, mHor ) ) - allocate( Ks(msoil, mHor, mLC ) ) - allocate( Db(msoil, mHor, mLC ) ) - - ! earlier these variables were allocated with size(soilId0,1) - ! in which the variable "soilId0" changes according to the iFlag_soil - ! so better to use other variable which is common to both soilDB (0 AND 1) flags - allocate( KsVar_H0( size(cell_id0,1) ) ) - allocate( KsVar_V0( size(cell_id0,1) ) ) - allocate( SMs_FC0( size(cell_id0,1) ) ) - - select case( proc_Mat( 3,1 ) ) - case(1) - ! first thirteen parameters go to this routine - iStart = proc_Mat(3,3) - proc_Mat(3,2) + 1 - iEnd = proc_Mat(3,3) - 4 - - ! next four parameters go here - ! (the first three for the fRoots and the fourth one for the beta) - iStart2 = proc_Mat(3,3) - 4 + 1 - iEnd2 = proc_Mat(3,3) - - case(2) - ! first thirteen parameters go to this routine - iStart = proc_Mat(3,3) - proc_Mat(3,2) + 1 - iEnd = proc_Mat(3,3) - 5 - - ! next four parameters go here - ! (the first three for the fRoots and the fourth one for the beta) - iStart2 = proc_Mat(3,3) - 5 + 1 - iEnd2 = proc_Mat(3,3) - 1 - - ! last parameter is jarvis parameter - no need to be regionalized - jarvis_thresh_c1 = param(proc_Mat(3,3)) - case(3) - ! first thirteen parameters go to this routine - iStart = proc_Mat(3,3) - proc_Mat(3,2) + 1 - iEnd = proc_Mat(3,3) - 7 - - ! next four parameters go here - ! (the first three for the fRoots and the fourth one for the beta) - iStart2 = proc_Mat(3,3) - 7 + 1 - iEnd2 = proc_Mat(3,3) - 1 - - ! last parameter is jarvis parameter - no need to be regionalized - jarvis_thresh_c1 = param(proc_Mat(3,3)) - case DEFAULT - call message() - call message('***ERROR: Process description for process "soil moisture parametrization" does not exist! mo_multi_param_reg') - stop - end select - - call mpr_sm( param(iStart:iEnd), nodata, iFlag_soil, & - SDB_is_present, SDB_nHorizons, SDB_nTillHorizons, & - SDB_sand, SDB_clay, SDB_DbM, & - cell_id0, soilId0, LCOVER0, & - thetaS_till, thetaFC_till, thetaPW_till, thetaS, & - thetaFC, thetaPW, Ks, Db, KsVar_H0, KsVar_V0, SMs_FC0) - - call mpr_SMhorizons( param(iStart2:iEnd2), proc_Mat, nodata, & - iFlag_soil, nHorizons_mHM, horizon_depth, LCOVER0, soilId0, & - SDB_nHorizons, SDB_nTillHorizons, & - thetaS_till,thetaFC_till, thetaPW_till, & - thetaS, thetaFC, thetaPW, SDB_Wd, Db, SDB_DbM, SDB_RZdepth, & - mask0, cell_id0, & - Upp_row_L1, Low_row_L1, Lef_col_L1, Rig_col_L1, nL0_in_L1, & - beta1, SMs1, FC1, PW1, fRoots1 ) - - deallocate( thetaS_till ) - deallocate( thetaFC_till ) - deallocate( thetaPW_till ) - deallocate( thetaS ) - deallocate( thetaFC ) - deallocate( thetaPW ) - deallocate( Ks ) - deallocate( Db ) - - ! ------------------------------------------------------------------ - ! sealed area threshold for runoff generation - ! ------------------------------------------------------------------ - select case( proc_Mat( 4, 1) ) - case (1) - iStart = proc_Mat(4,3) - proc_Mat(4,2) + 1 - iEnd = proc_Mat(4,3) - call iper_thres_runoff( param( iStart : iEnd ), HL3 ) - case DEFAULT - call message() - call message('***ERROR: Process description for process "runoff_generation" does not exist! mo_multi_param_reg') - stop - end select - - ! ------------------------------------------------------------------ - ! potential evapotranspiration (PET) - ! ------------------------------------------------------------------ - select case( proc_Mat( 5,1 ) ) - case(-1) ! LAI correction of input PET - iEnd = -9999 ! dummy statement - case(0) ! aspect correction of input PET - iStart = proc_Mat(5,3) - proc_Mat(5,2) + 1 - iEnd = proc_Mat(5,3) - call pet_correctbyASP( cell_id0, latitude, Asp0, param( iStart : iEnd), nodata, fAsp0 ) - fAsp1 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, fAsp0 ) - case(1) ! Hargreaves-Samani method - iStart = proc_Mat(5,3) - proc_Mat(5,2) + 1 - iEnd = proc_Mat(5,3) - call pet_correctbyASP( cell_id0, latitude, Asp0, param( iStart : iEnd - 1), nodata, fAsp0 ) - fAsp1 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, fAsp0 ) - HarSamCoeff1 = param(iEnd) - case(2) ! Priestley-Taylor Method - iStart = proc_Mat(5,3) - proc_Mat(5,2) + 1 - iEnd = proc_Mat(5,3) - call priestley_taylor_alpha(LCover_LAI0, LAILUT, LAIUnitList, param(iStart : iEnd), & - mask0, nodata, cell_id0, nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, Rig_col_L1, & - PrieTayAlpha1) - case(3) ! Penman-Monteith method - iStart = proc_Mat(5,3) - proc_Mat(5,2) + 1 - iEnd = proc_Mat(5,3) - call aerodynamical_resistance(LCover0, LAILUT, param(iStart : iEnd - 1), mask0, & - nodata, cell_id0, nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, Rig_col_L1, & - aeroResist1) - call bulksurface_resistance(LCover_LAI0, LAILUT, LAIUnitList, param(iEnd), mask0, & - nodata, cell_id0, nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, Rig_col_L1, & - surfResist1) - case default - call message() - call message('***ERROR: Process description for process "pet correction" does not exist! mo_multi_param_reg') - stop - end select - - ! ------------------------------------------------------------------ - ! interflow - ! ------------------------------------------------------------------ - select case( proc_Mat( 6, 1) ) - case (1) - ! - iStart = proc_Mat(6,3) - proc_Mat(6,2) + 1 - iEnd = proc_Mat(6,3) - call mpr_runoff( LCOVER0, mask0, nodata, SMs_FC0, slope_emp0, & - KsVar_H0, param(iStart:iEnd), cell_id0, upp_row_L1, low_row_L1, & - lef_col_L1, rig_col_L1, nL0_in_L1, c2TSTu, HL1_1, K0_1, & - K1_1 , alpha1 ) - case DEFAULT - call message() - call message('***ERROR: Process description for process "interflow" does not exist! mo_multi_param_reg') - stop - END select - - ! ------------------------------------------------------------------ - ! percolation cofficient, karstic percolation loss - ! ------------------------------------------------------------------ - select case( proc_Mat( 7, 1) ) - case(1) - - iStart = proc_Mat(7,3) - proc_Mat(7,2) + 1 - iEnd = proc_Mat(7,3) - call karstic_layer( & ! In - param( iStart : iEnd ), & ! In - geoUnitKar, geoUnit0, geoUnitList, mask0, nodata, & ! In - SMs_FC0, KsVar_V0, cell_id0, & ! In - nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, Rig_col_L1, c2TSTu, & ! In - karstic_loss, Kp1 & ! Out - ) - - deallocate( KsVar_H0 ) - deallocate( KsVar_V0 ) - deallocate( SMs_FC0 ) - - case DEFAULT - call message() - call message('***ERROR: Process description for process "percolation" does not exist! mo_multi_param_reg') - stop - end select - - ! ! ------------------------------------------------------------------ - ! ! Regionalized routing parameters - ! ! ------------------------------------------------------------------ - ! select case( proc_Mat( 8, 1) ) - ! case(0) ! routing is off - ! case(1) ! ST this part is moved to mRM - ! case(2) ! ST new routing is moved to mRM - ! case DEFAULT - ! call message() - ! call message('***ERROR: Process description for process "routing" does not exist! mo_multi_param_reg') - ! stop - ! end select - - ! ------------------------------------------------------------------ - ! baseflow recession parameter - ! ------------------------------------------------------------------ - select case( proc_Mat(9,1) ) - case(1) - - ! the number of process parameters, so the number in proc_Mat(9,2) has - ! to be equal to the size of geo_unit_list - iStart = proc_Mat(9,3) - proc_Mat(9,2) + 1 - iEnd = proc_Mat(9,3) - - call baseflow_param( param( iStart : iEnd ),& - geoUnit0, geoUnitList, nodata, k2_0) - ! - ! Upscale by arithmetic mean - k2_1 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, k2_0 ) - ! - ! correction and unit conversion - ! if percolation is ON: correct K2 such that it is at least k1 - if ( proc_Mat(7,1) .gt. 0 ) k2_1 = merge( K1_1, k2_1, k2_1 .lt. K1_1 ) - k2_1 = c2TSTu / k2_1 - ! - case DEFAULT - call message() - call message('***ERROR: Process description for process "baseflow Recession" does not exist! mo_multi_param_reg') - stop - end select - - end subroutine mpr - - ! ---------------------------------------------------------------------------- - - ! NAME - ! baseflow_param - - !> \brief baseflow recession parameter - - !> \details This subroutine calculates the baseflow recession parameter - !> based on the geological units at the Level 0 scale. For each level 0 - !> cell, it assigns the value specified in the parameter array param for the - !> geological unit in this cell.\n - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = GeoParam(1,:) \n - !> - param(2) = GeoParam(2,:) \n - !> - ...\n - - ! INTENT(IN) - !> \param[in] "real(dp) :: param(:)" - array of global baseflow recession - !> parameters - !> \param[in] "integer(i4) :: geoUnit0(:,:)" - array of geological units - !> at Level 0 - !> \param[in] "integer(i4) :: geoUnitList(:)" - array of indices for - !> geological units. - !> \param[in] "real(dp) :: nodata" - no data value - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: k2_0" - baseflow recession parameter at Level 0 - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written Stephan Thober, Dec 2012 - ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) - - subroutine baseflow_param( & - param, & ! Intent(in) - geoUnit0, & ! Intent(in) - geoUnitList, & ! Intent(in) - nodata, & ! Intent(in) - k2_0 & ! Intent(out) - ) - - !$ use omp_lib - - implicit none - - ! Input - real(dp), dimension(:), intent(in) :: param ! list of required parameters - integer(i4), dimension(:), intent(in) :: geoUnit0 ! ids of geological units at L0 - integer(i4), dimension(:), intent(in) :: geoUnitList ! list of geological units - real(dp), intent(in) :: nodata ! nodata value - - ! output - real(dp), dimension(:), intent(out):: k2_0 ! baseflow recession coefficient - - ! local variables - integer(i4) :: ii ! loop variable - integer(i4), dimension(1) :: gg ! geo unit - - if ( size(param) .ne. size( geoUnitList ) ) & - stop ' mo_multi_param_reg: baseflow_param: size mismatch, subroutine baseflow parameters ' - - k2_0 = nodata - - !$OMP PARALLEL - !$OMP DO PRIVATE(gg) SCHEDULE(STATIC) - do ii = 1, size(k2_0) - ! get parameter index in geoUnitList - gg = minloc( abs( geoUnitList - geoUnit0(ii) ) ) - k2_0(ii) = param( gg(1) ) - end do - !$OMP END DO - !$OMP END PARALLEL - - - end subroutine baseflow_param - - ! ---------------------------------------------------------------------------- - - ! NAME - ! snow_acc_melt_param - - !> \brief Calculates the snow parameters. - - !> \details This subroutine calculates the snow parameters - !> threshold temperature (TT), degree-day factor without precipitation (DD) - !> and maximum degree-day factor (DDmax) as well as increase of degree-day - !> factor per mm of increase in precipitation (IDDP).\n - !> - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = snowTreshholdTemperature \n - !> - param(2) = degreeDayFactor_forest \n - !> - param(3) = degreeDayFactor_impervious \n - !> - param(4) = degreeDayFactor_pervious \n - !> - param(5) = increaseDegreeDayFactorByPrecip \n - !> - param(6) = maxDegreeDayFactor_forest \n - !> - param(7) = maxDegreeDayFactor_impervious \n - !> - param(8) = maxDegreeDayFactor_pervious \n - - !> INTENT(IN) - !> \param[in] "real(dp) :: param(8)" - There are eight snow parameters required - !> \param[in] "real(dp) :: c2TSTu" - unit transformation coefficient - !> \param[in] "real(dp) :: fForest1(:)" - fraction of forest cover at scale L1 - !> \param[in] "real(dp) :: fIperm1(:)" - fraction of sealed area at scale L1 - !> \param[in] "real(dp) :: fPerm1(:)" - fraction of permeable area at scale L1 - - ! INTENT(OUT) - !> \param[out] "real(dp) :: TT1(:) " - threshold temperature for snow rain - !> \param[out] "real(dp) :: DD1(:) " - Degree-day factor - !> \param[out] "real(dp) :: DDmax1(:)" - Maximum Degree-day factor - !> \param[out] "real(dp) :: IDDP1(:)" - increase of the degree-day factor per mm of - !> increase in precipitation - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written Stephan Thober, Dec 2012 - ! Modified, Juliane Mai, Oct 2013 - OLD parametrization - ! --> param(1) = snowTreshholdTemperature - ! --> param(2) = degreeDayFactor_forest - ! --> param(3) = degreeDayFactor_impervious - ! --> param(4) = degreeDayFactor_pervious - ! --> param(5) = increaseDegreeDayFactorByPrecip - ! --> param(6) = maxDegreeDayFactor_forest - ! --> param(7) = maxDegreeDayFactor_impervious - ! --> param(8) = maxDegreeDayFactor_pervious - ! ------------------------------- - ! degreeDayFactor_impervious = degreeDayFactor_forest + delta_1 + delta_2 - ! degreeDayFactor_pervious = degreeDayFactor_forest + delta_1 - ! maxDegreeDayFactor_forest = degreeDayFactor_forest + delta_3 - ! maxDegreeDayFactor_impervious = degreeDayFactor_impervious + delta_5 - ! = degreeDayFactor_forest + delta_1 + delta_2 + delta_5 - ! maxDegreeDayFactor_pervious = degreeDayFactor_pervious + delta_4 - ! = degreeDayFactor_forest + delta_1 + delta_4 - ! ------------------------------- - ! NEW parametrization - ! --> param(1) = snowTreshholdTemperature - ! --> param(2) = degreeDayFactor_forest - ! --> param(3) = delta_2 - ! --> param(4) = delta_1 - ! --> param(5) = increaseDegreeDayFactorByPrecip - ! --> param(6) = delta_3 - ! --> param(7) = delta_5 - ! --> param(8) = delta_4 - ! Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) - - subroutine snow_acc_melt_param( & - param, c2TSTu, fForest1, fIperm1, fPerm1, & ! Intent(in) - TT1, DD1, IDDP1, DDmax1 & ! Intent(out) - ) - - implicit none - - ! Input - real(dp), dimension(8), intent(in) :: param ! eight global parameters - real(dp), intent(in) :: c2TSTu ! unit transformations - real(dp), dimension(:), intent(in) :: fForest1 ! [1] fraction of forest cover - real(dp), dimension(:), intent(in) :: fIperm1 ! [1] fraction of sealed area - real(dp), dimension(:), intent(in) :: fPerm1 ! [1] fraction of permeable area - - ! Output - real(dp), dimension(:), intent(out) :: TT1 ! [degreeC] threshold temperature for snow rain - real(dp), dimension(:), intent(out) :: DD1 ! [mm-1 degreeC-1] Degree-day factor with - ! no precipitation - real(dp), dimension(:), intent(out) :: DDmax1! [mm-1 degreeC-1] Maximum Degree-day factor - real(dp), dimension(:), intent(out) :: IDDP1 ! [d-1 degreeC-1] Increase of the Degree-day - ! factor per mm of increase in precipitation - - ! local - real(dp) :: tmp_degreeDayFactor_forest, tmp_degreeDayFactor_impervious, tmp_degreeDayFactor_pervious - real(dp) :: tmp_maxDegreeDayFactor_forest, tmp_maxDegreeDayFactor_impervious, tmp_maxDegreeDayFactor_pervious - - tmp_degreeDayFactor_forest = param(2) ! OLD: param(2) - tmp_degreeDayFactor_impervious = param(2) + param(4) + param(3) ! OLD: param(3) - tmp_degreeDayFactor_pervious = param(2) + param(4) ! OLD: param(4) - tmp_maxDegreeDayFactor_forest = param(2) + param(6) ! OLD: param(6) - tmp_maxDegreeDayFactor_impervious = param(2) + param(4) + param(3) + param(7) ! OLD: param(7) - tmp_maxDegreeDayFactor_pervious = param(2) + param(4) + param(8) ! OLD: param(8) - - TT1 = param(1) - IDDP1 = param(5) - - DD1 = ( & - tmp_degreeDayFactor_forest * fForest1 + & - tmp_degreeDayFactor_impervious * fIperm1 + & - tmp_degreeDayFactor_pervious * fPerm1 ) * c2TSTu - DDmax1 = ( & - tmp_maxDegreeDayFactor_forest * fForest1 + & - tmp_maxDegreeDayFactor_impervious * fIperm1 + & - tmp_maxDegreeDayFactor_pervious * fPerm1 ) * c2TSTu - - end subroutine snow_acc_melt_param - - ! ---------------------------------------------------------------------------- - - ! NAME - ! iper_thres_runoff - - !> \brief sets the impervious layer threshold parameter for runoff generation - - !> \details to be done by Kumar\n - !> .... - !> - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = imperviousStorageCapacity \n - - ! INTENT(IN) - !> \param[in] "real(dp) :: param" - given threshold parameter - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: HL3(:)" - distributed parameter field - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober, Rohini Kumar - !> \date Dec 2012 - ! Written Stephan Thober, Dec 2012 - ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) - - subroutine iper_thres_runoff( param, HL3 ) - - implicit none - - ! Input - real(dp), dimension(1), intent(in) :: param ! threshold parameters - - ! Output - real(dp), dimension(:), intent(out) :: HL3 - - HL3 = param(1) - - end subroutine iper_thres_runoff - - ! ---------------------------------------------------------------------------- - - ! NAME - ! karstic_layer - - !> \brief calculates the Karstic percolation loss - - !> \details This subroutine calls first the karstic_fraction upscaling - !> routine for determine the karstic fraction area for every Level 1 - !> cell. Then, the karstic percolation loss is estimated given two - !> shape parameters by - !> \f[ karstic_loss = 1 + ( fKarArea * param(1)) *( (-1)**INT(param(2),i4) ) \f] - !> where \f$ karstic_loss \f$ is the karstic percolation loss and \f$ fKarArea \f$ - !> ist the fraction of karstic area at level 1\n - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = rechargeCoefficient \n - !> - param(2) = rechargeFactor_karstic \n - !> - param(3) = gain_loss_GWreservoir_karstic \n - - ! INTENT(IN) - !> \param[in] "integer(i4) :: nGeoUnits" - number of geological formations - !> \param[in] "integer(i4) :: geoUnitKar(:)" - number of Karstic formation - !> \param[in] "integer(i4) :: geoUnit0(:)" - id of the Karstic formation - !> \param[in] "logical :: mask0(:,:)" - mask at level 0 - !> \param[in] "real(dp) :: nodata" - given nodata value - - !> \param[in] "integer(i4) :: nL0_in_L1(:)" - number of l0 cells within a l1 cell - !> \param[in] "integer(i4) :: Upp_row_L1(:)" - upper row of a l1 cell in l0 grid - !> \param[in] "integer(i4) :: Low_row_L1(:)" - lower row of a l1 cell in l0 grid - !> \param[in] "integer(i4) :: Lef_col_L1(:)" - left col of a l1 cell in l0 grid - !> \param[in] "integer(i4) :: Rig_col_L1(:)" - right col of a l1 cell in l0 grid - ! - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: karstic_loss(:)" [-] Karstic percolation loss - !> \param[out] "real(dp) :: L1_Kp(:)" [d-1] percolation coefficient - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Rohini Kumar, Stephan Thober - !> \date Feb 2013 - ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) - ! Modified Stephan Thober, Dec 2013 - changed intent(inout) to intent(out) - ! - subroutine karstic_layer( & - param, & ! IN: parameters - geoUnitKar, & ! IN: number of Karstic formation - geoUnit0, & ! IN: id of the Karstic formation - geoUnitlist, & ! IN: id of geo units - mask0, & ! IN: mask at level 0 - nodata, & ! IN: given nodata value - SMs_FC0, & ! IN: [-] soil mositure deficit from field - ! ! capacity w.r.t to saturation - KsVar_V0, & ! IN: [-] relative variability of saturated - cell_id0, & ! IN: cell id at Level 0 - nL0_in_L1, & ! IN: number of l0 cells within a l1 cell - Upp_row_L1, & ! IN: upper row of a l1 cell in l0 grid - Low_row_L1, & ! IN: lower row of a l1 cell in l0 grid - Lef_col_L1, & ! IN: left col of a l1 cell in l0 grid - Rig_col_L1, & ! IN: right col of a l1 cell in l0 grid - c2TSTu, & ! IN: unit transformations - karstic_loss, & ! OUT: [-] Karstic percolation loss - L1_Kp & ! OUT: [d-1] percolation coefficient - ) - - use mo_upscaling_operators, only: L0_fractionalCover_in_Lx, upscale_arithmetic_mean - !$ use omp_lib - - implicit none - - ! Input - real(dp), dimension(3), intent(in) :: param ! parameters - integer(i4), dimension(:), intent(in) :: geoUnitKar ! number of Karstic formation - integer(i4), dimension(:), intent(in) :: geoUnit0 ! id of the Karstic formation - integer(i4), dimension(:), intent(in) :: geoUnitlist ! id of geo units - - logical, dimension(:,:), intent(in) :: mask0 ! mask at level 0 - real(dp), intent(in) :: nodata ! given nodata value - real(dp), dimension(:), intent(in) :: SMs_FC0 ! [-] soil mositure deficit from field - ! ! capacity w.r.t to saturation - real(dp), dimension(:), intent(in) :: KsVar_V0 ! [-] relative variability of saturated - - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! number of l0 cells within a l1 cell - integer(i4), dimension(:), intent(in) :: Upp_row_L1 ! upper row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Low_row_L1 ! lower row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Lef_col_L1 ! left col of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Rig_col_L1 ! right col of a l1 cell in l0 grid - real(dp), intent(in) :: c2TSTu ! unit transformations - - ! Output - real(dp), dimension(:), intent(out) :: karstic_loss ! [-] Karstic percolation loss - real(dp), dimension(:), intent(out) :: L1_Kp ! [d-1] percolation coefficient - - ! Local variables - real(dp), dimension(:), allocatable :: fKarArea ! fraction of karstic area - real(dp), dimension(size(SMs_FC0,1)) :: tmp ! temporal variable - integer(i4) :: nGeoUnits - integer(i4) :: i - - - ! ------------------------------------------------------------------ - ! PERCOLATION; 1/Kp = f(Ks) - ! ------------------------------------------------------------------ - ! Regionalise Kp with variability of last soil layer property - !$OMP PARALLEL - tmp = merge( param(1) * ( 1.0_dp + SMs_FC0 ) / ( 1.0_dp + KsVar_V0 ), & - nodata, cell_id0 .ne. int(nodata, i4) ) - !$OMP END PARALLEL - - L1_Kp = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, tmp ) - - ! minimum constrains - L1_Kp = merge( 2.0_dp, L1_Kp, L1_Kp .lt. 2.0_dp ) - ! - ! Unit conversion - L1_Kp = c2TSTu / L1_Kp - - nGeoUnits = size(geoUnitlist,1) - - ! 1st calculate fraction of Karstic area - allocate( fKarArea( size(karstic_loss,1) ) ) - fKarArea = 0.0_dp - - do i = 1, nGeoUnits - if(GeoUnitKar(i) .eq. 0) cycle - fKarArea(:) = L0_fractionalCover_in_Lx( geoUnit0, geoUnitlist(i), mask0, & - Upp_row_L1, Low_row_L1, Lef_col_L1, Rig_col_L1, nL0_in_L1 ) - end do - - ! 2nd calculate karstic_loss - karstic_loss = 1.0_dp - ( fKarArea * param(2) ) - - deallocate( fKarArea ) - - end subroutine karstic_layer - - ! ---------------------------------------------------------------------------- - - ! NAME - ! canopy_intercept_param - - !> \brief estimate effective maximum interception capacity at L1 - - !> \details estimate effective maximum interception capacity at L1 for a given - !> Leaf Area Index field. \n - !> Global parameters needed (see mhm_parameter.nml):\n - !> Process Case 1:\n - !> - param(1) = canopyInterceptionFactor \n - - ! INTENT(IN) - !> \param[in] "integer(i4) :: proc_Mat(:,:)" - process matrix - !> \param[in] "real(dp) :: param(:)" - array of global parameters - !> \param[in] "real(dp) :: LAI0(:)" - LAI at level-0 - !> \param[in] "integer(i4) :: nL0_in_L1 (:)" - Number of L0 cells within a L1 cell - !> \param[in] "integer(i4) :: upp_row_L1(:)" - Upper row of high resolution block - !> \param[in] "integer(i4) :: low_row_L1(:)" - Lower row of high resolution block - !> \param[in] "integer(i4) :: lef_col_L1(:)" - Left column of high resolution block - !> \param[in] "integer(i4) :: rig_col_L1(:)" - Right column of high resolution block - !> \param[in] "integer(i4) :: cell_id0 (:)" - Cell ids at level 0 - !> \param[in] "logical :: mask0(:,:)" - mask at level 0 field - !> \param[in] "real(dp) :: nodata" - nodata value - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: max_intercept1(:)" - maximum canopy interception at Level-1 - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! EXAMPLE - ! calling sequence - ! call canopy_intercept_param(proc_Mat, param, & - ! LAI0, nL0_in_L1, upp_row_L1, & - ! low_row_L1, lef_col_L1, & - ! rig_col_L1, cell_id0, mask0, & - ! nodata, max_intercept1 ) - - ! HISTORY - !> \author Rohini Kumar - !> \date Aug. 2013 - - ! ------------------------------------------------------------------ - subroutine canopy_intercept_param(proc_Mat, param, & - LAI0, nL0_in_L1, upp_row_L1, & - low_row_L1, lef_col_L1, & - rig_col_L1, cell_id0, mask0, & - nodata, max_intercept1 ) - - use mo_upscaling_operators, only: upscale_arithmetic_mean - use mo_string_utils, only: num2str - use mo_message, only: message - - implicit none - - ! input - integer(i4), dimension(:,:), intent(in) :: proc_Mat ! indicate processes - real(dp), dimension(:), intent(in) :: param ! array of global parameters - real(dp), dimension(:), intent(in) :: LAI0 ! LAI at level-0 - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! Number of L0 cells within a L1 cell - integer(i4), dimension(:), intent(in) :: upp_row_L1 ! Upper row of high resolution block - integer(i4), dimension(:), intent(in) :: low_row_L1 ! Lower row of high resolution block - integer(i4), dimension(:), intent(in) :: lef_col_L1 ! Left column of high resolution block - integer(i4), dimension(:), intent(in) :: rig_col_L1 ! Right column of high resolution block - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids at level 0 - logical, dimension(:,:), intent(in) :: mask0 ! mask at level 0 field - real(dp), intent(in) :: nodata ! nodata value - ! output - real(dp), dimension(:), intent(out) :: max_intercept1 ! max interception at level-1 - - ! local variables - integer(i4) :: iStart, iEnd - real(dp), dimension(:), allocatable :: max_intercept0 - real(dp), dimension(:), allocatable :: gamma_intercept - - ! ------------------------------------------------------------------ - ! Maximum interception parameter - ! ------------------------------------------------------------------ - select case( proc_Mat(1,1)) - case(1) - iStart = proc_Mat(1,3) - proc_Mat(1,2) + 1 - iEnd = proc_Mat(1,3) - - ! allocate space - allocate( gamma_intercept(iEnd-iStart+1 ) ) - allocate( max_intercept0 (size(cell_id0, 1) ) ) - - ! estimate max. intercept at Level-0 - gamma_intercept(:) = param(iStart:iEnd) - !$OMP PARALLEL - max_intercept0(:) = LAI0(:) * gamma_intercept(1) - !$OMP END PARALLEL - - ! Upscale by arithmetic mean - max_intercept1 = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, Lef_col_L1, & - Rig_col_L1, cell_id0, mask0, nodata, max_intercept0 ) - - deallocate( gamma_intercept) - deallocate( max_intercept0 ) - CASE DEFAULT - call message('mo_multi_param_reg: This proc_Mat=',num2str(proc_Mat(1,1)),' is not implemented!') - stop - end select - - end subroutine canopy_intercept_param - - - ! ---------------------------------------------------------------------------- - - ! NAME - ! aerodynamical_resistance - - !> \brief Regionalization of aerodynamic resistance - - !> \details estimation of aerodynamical resistance - !> Global parameters needed (see mhm_parameter.nml):\n - !> - param(1) = canopyheigth_forest \n - !> - param(2) = canopyheigth_impervious \n - !> - param(3) = canopyheigth_pervious \n - !> - param(4) = displacementheight_coeff \n - !> - param(5) = roughnesslength_momentum_coeff \n - !> - param(6) = roughnesslength_heat_coeff \n - - ! INTENT(IN) - !> \param[in] "integer(i4) :: LCover0(:)" - land cover at level 0 - !> \param[in] "real(dp) :: LAILUT(:)" - LUT of LAi values - !> \param[in] "integer(i4) :: LAIUnitList(:)" - List of ids of each LAI class in LAILUT - !> \param[in] "real(dp) :: param(:)" - vector with global parameters - !> \param[in] "logical :: mask0(:,:)" - mask at level 0 field - !> \param[in] "real(dp) :: nodata" - nodata value - !> \param[in] "integer(i4) :: cell_id0 (:)" - Cell ids at level 0 - !> \param[in] "integer(i4) :: nL0_in_L1 (:)" - Number of L0 cells within a L1 cell - !> \param[in] "integer(i4) :: Upp_row_L1(:)" - Upper row of high resolution block - !> \param[in] "integer(i4) :: Low_row_L1(:)" - Lower row of high resolution block - !> \param[in] "integer(i4) :: Lef_col_L1(:)" - Left column of high resolution block - !> \param[in] "integer(i4) :: Rig_col_L1(:)" - Right column of high resolution block - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "real(dp) :: aerodyn_resistance1(:)" - [s m-1] aerodynamical resistance - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Matthias Zink - !> \date Apr 2013 - ! Modified Matthias Zink, Jun 2017 - moved from mo_multi_scale_param_reg.f90 to mo_mpr_pet.f90 - - subroutine aerodynamical_resistance( & - LCover0, & ! land cover at level 0 - LAILUT, & ! look up table for LAI - param, & ! parameter values (size=6) - mask0, & ! mask at level 0 - nodata, & ! given nodata value - cell_id0, & ! cell id at Level 0 - nL0_in_L1, & ! number of l0 cells within a l1 cell - Upp_row_L1, & ! upper row of a l1 cell in l0 grid - Low_row_L1, & ! lower row of a l1 cell in l0 grid - Lef_col_L1, & ! left col of a l1 cell in l0 grid - Rig_col_L1, & ! right col of a l1 cell in l0 grid - aerodyn_resistance1 & ! aerodynmaical resistance - ) - - use mo_upscaling_operators, only: upscale_arithmetic_mean - use mo_mhm_constants, only: YearMonths_i4, WindMeasHeight, karman - use mo_constants, only: eps_dp - - implicit none - - integer(i4), dimension(:), intent(in) :: LCover0 ! land cover field - real(dp), dimension(:,:), intent(in) :: LAILUT ! look up table for LAI - ! ! dim1=land cover class, dim2=month of year - real(dp), dimension(6), intent(in) :: param ! input parameter - logical, dimension(:,:), intent(in) :: mask0 ! mask at level 0 - real(dp), intent(in) :: nodata ! given nodata value - integer(i4), dimension(:), intent(in) :: cell_id0 ! Cell ids of hi res field - integer(i4), dimension(:), intent(in) :: nL0_in_L1 ! number of l0 cells within a l1 cell - integer(i4), dimension(:), intent(in) :: Upp_row_L1 ! upper row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Low_row_L1 ! lower row of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Lef_col_L1 ! left col of a l1 cell in l0 grid - integer(i4), dimension(:), intent(in) :: Rig_col_L1 ! right col of a l1 cell in l0 grid - ! Output - real(dp), dimension(:,:), intent(out) :: aerodyn_resistance1 - - ! local - integer(i4) :: iMon - real(dp) :: maxLAI - real(dp), dimension(:), allocatable :: zm - real(dp), dimension(:), allocatable :: canopy_height0 - real(dp), dimension(:), allocatable :: zm_zero, zh_zero, displace - real(dp), dimension(:,:), allocatable :: aerodyn_resistance0 ! dim 1 = number of cells on level 0, - ! ! dim2=month of year - ! ID LAI classes - ! 1 Coniferous-forest - ! 2 Deciduous-forest - ! 3 Mixed-forest - ! 4 Sparsely-populated-forest - ! 5 Sealed-Water-bodies - ! 6 Viniculture - ! 7 Intensive-orchards - ! 8 Pasture - ! 9 Fields - ! 10 Wetlands - - ! initialize some things - allocate(zm (size(LCover0, dim=1) )) ; zm = nodata - allocate(zm_zero (size(LCover0, dim=1) )) ; zm_zero = nodata - allocate(zh_zero (size(LCover0, dim=1) )) ; zh_zero = nodata - allocate(displace (size(LCover0, dim=1) )) ; displace = nodata - allocate(canopy_height0 (size(LCover0, dim=1) )) ; canopy_height0 = nodata - allocate(aerodyn_resistance0 (size(LCover0, dim=1), YearMonths_i4)) ; aerodyn_resistance0 = nodata - - ! regionalization of canopy height - ! substitute with canopy height - canopy_height0 = merge(param(1), canopy_height0, LCover0 == 1) ! forest - canopy_height0 = merge(param(2), canopy_height0, LCover0 == 2) ! impervious - - maxLAI = MAXVAL(LAILUT(7,:)) - - do iMon = 1, YearMonths_i4 - - ! pervious canopy height is scaled with LAI - canopy_height0 = merge( (param(3) * LAILUT(7,iMon) / maxLAI), canopy_height0, LCover0 == 3) ! pervious - - ! estimation of the aerodynamic resistance on the lower level - ! see FAO Irrigation and Draingae Paper No. 56 (p. 19 ff) for more information - zm = WindMeasHeight - ! correction: if wind measurement height is below canopy height loagarithm becomes negative - zm = merge(canopy_height0 + zm, zm, ((abs(zm - nodata) .GT. eps_dp) .AND. (zm .LT. canopy_height0))) - ! - ! zh = zm - displace = param(4) * canopy_height0 - zm_zero = param(5) * canopy_height0 - zh_zero = param(6) * zm_zero - ! - ! calculate aerodynamic resistance (changes monthly) - aerodyn_resistance0(:,iMon) = log((zm - displace)/zm_zero) * log((zm - displace)/zh_zero) / (karman**2.0_dp) - aerodyn_resistance1(:,iMon) = upscale_arithmetic_mean( nL0_in_L1, Upp_row_L1, Low_row_L1, & - Lef_col_L1, Rig_col_L1, cell_id0, mask0, nodata, aerodyn_resistance0(:,iMon)) - - end do - - end subroutine aerodynamical_resistance - -END MODULE mo_multi_param_reg diff --git a/src/mHM/mo_neutrons.f90 b/src/mHM/mo_neutrons.f90 index 3ce221eb..5dcbfa94 100644 --- a/src/mHM/mo_neutrons.f90 +++ b/src/mHM/mo_neutrons.f90 @@ -17,23 +17,23 @@ MODULE mo_neutrons ! Written Martin Schroen, Mar 2015 ! Modified - - USE mo_kind, ONLY: i4, dp + + USE mo_kind, ONLY : i4, dp IMPLICIT NONE ! Neutron forward model using particle transport physics, see Shuttleworth et al. 2013 - PUBLIC :: COSMIC - + PUBLIC :: COSMIC + ! inverse \theta(N) relation based on Desilets et al. 2010 - PUBLIC :: DesiletsN0 + PUBLIC :: DesiletsN0 ! integration tabular for approximating the neutron flux integral PUBLIC :: TabularIntegralAFast - + PRIVATE CONTAINS - + ! ----------------------------------------------------------------------------------- ! NAME ! DesiletsN0 @@ -95,17 +95,17 @@ MODULE mo_neutrons subroutine DesiletsN0(SoilMoisture, Horizons, N0, neutrons) - use mo_mhm_constants, only: Desilets_a0, Desilets_a1, Desilets_a2 + use mo_mhm_constants, only : Desilets_a0, Desilets_a1, Desilets_a2 implicit none - - real(dp), dimension(:), intent(in) :: SoilMoisture - real(dp), dimension(:), intent(in) :: Horizons - real(dp), intent(in) :: N0 ! from global parameters - real(dp), intent(inout) :: neutrons - + + real(dp), dimension(:), intent(in) :: SoilMoisture + real(dp), dimension(:), intent(in) :: Horizons + real(dp), intent(in) :: N0 ! from global parameters + real(dp), intent(inout) :: neutrons + ! only use first soil layer - neutrons = N0 * ( Desilets_a1 + Desilets_a0 / (SoilMoisture(1)/Horizons(1) + Desilets_a2)) - + neutrons = N0 * (Desilets_a1 + Desilets_a0 / (SoilMoisture(1) / Horizons(1) + Desilets_a2)) + end subroutine DesiletsN0 ! ----------------------------------------------------------------------------------- @@ -167,139 +167,138 @@ end subroutine DesiletsN0 ! HISTORY !> \author Martin Schroen, originally written by Rafael Rosolem !> \date Mar 2015 - + subroutine COSMIC(SoilMoisture, Horizons, params, neutron_integral_AFast, neutrons) - - use mo_mhm_constants, only: H2Odens, & - COSMIC_bd, COSMIC_vwclat, COSMIC_N, COSMIC_alpha, & - COSMIC_L1, COSMIC_L2, COSMIC_L3, COSMIC_L4 - use mo_constants, only: PI_dp + + use mo_mhm_constants, only : H2Odens, & + COSMIC_bd, COSMIC_vwclat, COSMIC_N, COSMIC_alpha, & + COSMIC_L1, COSMIC_L2, COSMIC_L3, COSMIC_L4 + use mo_constants, only : PI_dp implicit none - - real(dp), dimension(:), intent(in) :: SoilMoisture - real(dp), dimension(:), intent(in) :: Horizons - real(dp), dimension(:), intent(in) :: params ! 1: N0, 2: N1, 3: N2, 4: alpha0, 5: alpha1, 6: L30, 7. L31 - real(dp), dimension(:), intent(in) :: neutron_integral_AFast - real(dp), intent(inout) :: neutrons + + real(dp), dimension(:), intent(in) :: SoilMoisture + real(dp), dimension(:), intent(in) :: Horizons + real(dp), dimension(:), intent(in) :: params ! 1: N0, 2: N1, 3: N2, 4: alpha0, 5: alpha1, 6: L30, 7. L31 + real(dp), dimension(:), intent(in) :: neutron_integral_AFast + real(dp), intent(inout) :: neutrons ! local variables real(dp) :: lambdaHigh real(dp) :: lambdaFast real(dp) :: totflux - - real(dp), dimension(size(Horizons)) :: zthick ! Soil layer thickness (cm) - real(dp), dimension(:), allocatable :: isoimass ! Integrated dry soil mass above layer (g) - real(dp), dimension(:), allocatable :: iwatmass ! Integrated water mass above layer (g) - real(dp), dimension(:), allocatable :: hiflux ! High energy neutron flux - real(dp), dimension(:), allocatable :: xeff ! Fast neutron source strength of layer - real(dp), dimension(:), allocatable :: h2oeffdens ! "Effective" density of water in layer (g/cm3) - real(dp), dimension(:), allocatable :: fastflux ! Contribution to above-ground neutron flux + + real(dp), dimension(size(Horizons)) :: zthick ! Soil layer thickness (cm) + real(dp), dimension(:), allocatable :: isoimass ! Integrated dry soil mass above layer (g) + real(dp), dimension(:), allocatable :: iwatmass ! Integrated water mass above layer (g) + real(dp), dimension(:), allocatable :: hiflux ! High energy neutron flux + real(dp), dimension(:), allocatable :: xeff ! Fast neutron source strength of layer + real(dp), dimension(:), allocatable :: h2oeffdens ! "Effective" density of water in layer (g/cm3) + real(dp), dimension(:), allocatable :: fastflux ! Contribution to above-ground neutron flux ! - integer(i4) :: layers=1 ! Total number of soil layers - integer(i4) :: ll=1 + integer(i4) :: layers = 1 ! Total number of soil layers + integer(i4) :: ll = 1 ! - layers = size(SoilMoisture) ! 2 - - allocate(hiflux(layers),xeff(layers),& - h2oeffdens(layers),& - fastflux(layers),& - isoimass(layers),iwatmass(layers)) - - zthick(:) = 0.0_dp * params(1) ! <-- this multiplication with params(1) is not needed, only to make params USED + layers = size(SoilMoisture) ! 2 + + allocate(hiflux(layers), xeff(layers), & + h2oeffdens(layers), & + fastflux(layers), & + isoimass(layers), iwatmass(layers)) + + zthick(:) = 0.0_dp * params(1) ! <-- this multiplication with params(1) is not needed, only to make params USED ! ! PLEASE remove when possible - isoimass(:) = 0.0_dp - iwatmass(:) = 0.0_dp - hiflux(:) = 0.0_dp - xeff(:) = 0.0_dp - h2oeffdens(:) = 0.0_dp - fastflux(:) = 0.0_dp - lambdaHigh = 0.0_dp - lambdaFast = 0.0_dp - totflux = 0.0_dp - + isoimass(:) = 0.0_dp + iwatmass(:) = 0.0_dp + hiflux(:) = 0.0_dp + xeff(:) = 0.0_dp + h2oeffdens(:) = 0.0_dp + fastflux(:) = 0.0_dp + lambdaHigh = 0.0_dp + lambdaFast = 0.0_dp + totflux = 0.0_dp + ! Soil Layers and Thicknesses are constant in mHM, they could be defined outside of this function - zthick(1) = Horizons(1)/10.0_dp - 0.0_dp - do ll = 2,layers - zthick(ll) = (Horizons(ll) - Horizons(ll-1))/10.0_dp + zthick(1) = Horizons(1) / 10.0_dp - 0.0_dp + do ll = 2, layers + zthick(ll) = (Horizons(ll) - Horizons(ll - 1)) / 10.0_dp enddo - do ll = 1,layers - - ! High energy neutron downward flux - ! The integration is now performed at the node of each layer (i.e., center of the layer) - h2oeffdens(ll) = ((SoilMoisture(ll) / zthick(ll) / 10.0_dp +COSMIC_vwclat)*H2Odens)/1000.0_dp - - ! Assuming an area of 1 cm2 - if(ll > 1) then - isoimass(ll) = isoimass(ll-1) + COSMIC_bd*(0.5_dp*zthick(ll-1))*1.0_dp & - + COSMIC_bd*(0.5_dp*zthick(ll))*1.0_dp - iwatmass(ll) = iwatmass(ll-1) + h2oeffdens(ll-1)*(0.5_dp*zthick(ll-1))*1.0_dp & - + h2oeffdens(ll)*(0.5_dp*zthick(ll))*1.0_dp - else - isoimass(ll) = COSMIC_bd*(0.5_dp*zthick(ll))*1.0_dp - iwatmass(ll) = h2oeffdens(ll)*(0.5_dp*zthick(ll))*1.0_dp - end if - - lambdaHigh = isoimass(ll)/COSMIC_L1 + iwatmass(ll)/COSMIC_L2 - lambdaFast = isoimass(ll)/COSMIC_L3 + iwatmass(ll)/COSMIC_L4 - - hiflux(ll) = exp(-lambdaHigh) - xeff(ll) = zthick(ll)*(COSMIC_alpha*COSMIC_bd + h2oeffdens(ll)) - - call lookUpIntegral(fastflux(ll),neutron_integral_AFast,lambdaFast) - - ! After contribution from all directions are taken into account, - ! need to multiply fastflux by 2/pi - fastflux(ll) = (2.0_dp/PI_dp)*fastflux(ll) - - ! Low energy (fast) neutron upward flux - totflux = totflux + hiflux(ll)*xeff(ll)*fastflux(ll) + do ll = 1, layers + + ! High energy neutron downward flux + ! The integration is now performed at the node of each layer (i.e., center of the layer) + h2oeffdens(ll) = ((SoilMoisture(ll) / zthick(ll) / 10.0_dp + COSMIC_vwclat) * H2Odens) / 1000.0_dp + + ! Assuming an area of 1 cm2 + if(ll > 1) then + isoimass(ll) = isoimass(ll - 1) + COSMIC_bd * (0.5_dp * zthick(ll - 1)) * 1.0_dp & + + COSMIC_bd * (0.5_dp * zthick(ll)) * 1.0_dp + iwatmass(ll) = iwatmass(ll - 1) + h2oeffdens(ll - 1) * (0.5_dp * zthick(ll - 1)) * 1.0_dp & + + h2oeffdens(ll) * (0.5_dp * zthick(ll)) * 1.0_dp + else + isoimass(ll) = COSMIC_bd * (0.5_dp * zthick(ll)) * 1.0_dp + iwatmass(ll) = h2oeffdens(ll) * (0.5_dp * zthick(ll)) * 1.0_dp + end if + + lambdaHigh = isoimass(ll) / COSMIC_L1 + iwatmass(ll) / COSMIC_L2 + lambdaFast = isoimass(ll) / COSMIC_L3 + iwatmass(ll) / COSMIC_L4 + + hiflux(ll) = exp(-lambdaHigh) + xeff(ll) = zthick(ll) * (COSMIC_alpha * COSMIC_bd + h2oeffdens(ll)) + + call lookUpIntegral(fastflux(ll), neutron_integral_AFast, lambdaFast) + + ! After contribution from all directions are taken into account, + ! need to multiply fastflux by 2/pi + fastflux(ll) = (2.0_dp / PI_dp) * fastflux(ll) + + ! Low energy (fast) neutron upward flux + totflux = totflux + hiflux(ll) * xeff(ll) * fastflux(ll) enddo - neutrons=COSMIC_N*totflux - + neutrons = COSMIC_N * totflux + + deallocate(hiflux, & + xeff, h2oeffdens, fastflux, & + isoimass, iwatmass) - deallocate(hiflux,& - xeff, h2oeffdens, fastflux,& - isoimass, iwatmass) - end subroutine COSMIC - subroutine oldIntegration(res,c) - use mo_constants, only: PI_dp - implicit none - real(dp) :: res - real(dp), intent(in) :: c - - ! local variables - real(dp) :: zdeg - real(dp) :: zrad - real(dp) :: costheta - real(dp) :: dtheta - - integer(i4) :: angle ! loop indices for an integration interval - ! Angle distribution parameters (HARDWIRED) - ! rr: Using 0.5 deg angle intervals appears to be sufficient - ! rr: (smaller angles increase the computing time for COSMIC) - - dtheta = 0.5_dp*(PI_dp/180.0_dp) - - ! This second loop needs to be done for the distribution of angles for fast neutron release - ! the intent is to loop from 0 to 89.5 by 0.5 degrees - or similar. - ! Because Fortran loop indices are integers, we have to divide the indices by 10 - you get the idea. - - res=0.0_dp - do angle=0,179 - zdeg = real(angle,dp)*0.5_dp - zrad = (zdeg*PI_dp)/180.0_dp - costheta = cos(zrad) - - ! Angle-dependent low energy (fast) neutron upward flux - res = res + exp(-c/costheta)*dtheta - enddo + subroutine oldIntegration(res, c) + use mo_constants, only : PI_dp + implicit none + real(dp) :: res + real(dp), intent(in) :: c + + ! local variables + real(dp) :: zdeg + real(dp) :: zrad + real(dp) :: costheta + real(dp) :: dtheta + + integer(i4) :: angle ! loop indices for an integration interval + ! Angle distribution parameters (HARDWIRED) + ! rr: Using 0.5 deg angle intervals appears to be sufficient + ! rr: (smaller angles increase the computing time for COSMIC) + + dtheta = 0.5_dp * (PI_dp / 180.0_dp) + + ! This second loop needs to be done for the distribution of angles for fast neutron release + ! the intent is to loop from 0 to 89.5 by 0.5 degrees - or similar. + ! Because Fortran loop indices are integers, we have to divide the indices by 10 - you get the idea. + + res = 0.0_dp + do angle = 0, 179 + zdeg = real(angle, dp) * 0.5_dp + zrad = (zdeg * PI_dp) / 180.0_dp + costheta = cos(zrad) + + ! Angle-dependent low energy (fast) neutron upward flux + res = res + exp(-c / costheta) * dtheta + enddo end subroutine - + ! ----------------------------------------------------------------------------------- ! NAME ! TabularIntegralAFast @@ -363,25 +362,25 @@ subroutine oldIntegration(res,c) !> \author Maren Kaluza !> \date Nov 2017 - subroutine TabularIntegralAFast(integral,maxC) - use mo_constants, only: PI_dp - implicit none - real(dp), dimension(:) :: integral - real(dp), intent(in) :: maxC - - !local variables - integer(i4) :: i - real(dp) :: c - integer(i4) :: intsize - - intsize=size(integral)-2 - - do i=1,intsize+1 - c =real(i-1,dp)*maxC/real(intsize,dp) - call approx_mon_int(integral(i),& - intgrandFast,c,0.0_dp,PI_dp/2.0_dp,steps=1024,fxmax=0.0_dp) - enddo - integral(intsize+2)=maxC + subroutine TabularIntegralAFast(integral, maxC) + use mo_constants, only : PI_dp + implicit none + real(dp), dimension(:) :: integral + real(dp), intent(in) :: maxC + + !local variables + integer(i4) :: i + real(dp) :: c + integer(i4) :: intsize + + intsize = size(integral) - 2 + + do i = 1, intsize + 1 + c = real(i - 1, dp) * maxC / real(intsize, dp) + call approx_mon_int(integral(i), & + intgrandFast, c, 0.0_dp, PI_dp / 2.0_dp, steps = 1024, fxmax = 0.0_dp) + enddo + integral(intsize + 2) = maxC end subroutine ! integrate a monotonuous function f, dependend on two parameters c and phi @@ -397,165 +396,165 @@ subroutine TabularIntegralAFast(integral,maxC) ! in a less flat region. ! !For the specific given integral it is very precise with steps=1024 - subroutine approx_mon_int(res,f,c,xmin,xmax,eps,steps,fxmin,fxmax) - implicit none - real(dp) :: res - real(dp), external :: f - real(dp), intent(in) :: c - real(dp), intent(in) :: xmax - real(dp), intent(in) :: xmin - real(dp), optional :: eps - integer(i4), optional :: steps - real(dp), optional :: fxmin - real(dp), optional :: fxmax - - !locale variables - real(dp) :: epstemp - integer(i4) :: stepstemp - real(dp) :: fxmintemp - real(dp) :: fxmaxtemp - - ! init - if (.not. present(eps)) then - epstemp=0.001_dp - else - epstemp=eps - endif - - if (.not. present(steps)) then - stepstemp=0 - else - stepstemp=steps - endif - - if (.not. present(fxmin)) then - fxmintemp=f(c,xmin) - else - fxmintemp=fxmin - endif - - if (.not. present(fxmax)) then - fxmaxtemp=f(c,xmax) - else - fxmaxtemp=fxmax - endif - - res=0.0_dp - - if (stepstemp .gt. 0) then - call approx_mon_int_steps(res,f,c,xmin,xmax,epstemp,stepstemp,fxmintemp,fxmaxtemp) - else - call approx_mon_int_eps(res,f,c,xmin,xmax,epstemp,fxmintemp,fxmaxtemp) - endif + subroutine approx_mon_int(res, f, c, xmin, xmax, eps, steps, fxmin, fxmax) + implicit none + real(dp) :: res + real(dp), external :: f + real(dp), intent(in) :: c + real(dp), intent(in) :: xmax + real(dp), intent(in) :: xmin + real(dp), optional :: eps + integer(i4), optional :: steps + real(dp), optional :: fxmin + real(dp), optional :: fxmax + + !locale variables + real(dp) :: epstemp + integer(i4) :: stepstemp + real(dp) :: fxmintemp + real(dp) :: fxmaxtemp + + ! init + if (.not. present(eps)) then + epstemp = 0.001_dp + else + epstemp = eps + endif + + if (.not. present(steps)) then + stepstemp = 0 + else + stepstemp = steps + endif + + if (.not. present(fxmin)) then + fxmintemp = f(c, xmin) + else + fxmintemp = fxmin + endif + + if (.not. present(fxmax)) then + fxmaxtemp = f(c, xmax) + else + fxmaxtemp = fxmax + endif + + res = 0.0_dp + + if (stepstemp .gt. 0) then + call approx_mon_int_steps(res, f, c, xmin, xmax, epstemp, stepstemp, fxmintemp, fxmaxtemp) + else + call approx_mon_int_eps(res, f, c, xmin, xmax, epstemp, fxmintemp, fxmaxtemp) + endif end subroutine - recursive subroutine approx_mon_int_steps(res,f,c,xmin,xmax,eps,steps,fxmin,fxmax) - implicit none - real(dp) :: res - real(dp), external :: f - real(dp), intent(in) :: c - real(dp), intent(in) :: xmax - real(dp), intent(in) :: xmin - real(dp), intent(in) :: eps - integer(i4), intent(in) :: steps - real(dp), intent(in) :: fxmin - real(dp), intent(in) :: fxmax - - !locale variables - real(dp) :: xm - real(dp) :: fxm - real(dp) :: err - - xm = (xmax+xmin)/2.0_dp - fxm= f(c,xm) - - err=abs((fxmax-fxm)*(xmax-xm)) - if ((err .gt. eps).and.(steps .gt. 1)) then - call approx_mon_int_steps(res,f,c,xm,xmax,eps/2.0,steps-steps/2,fxm,fxmax) - else - res=res+(xmax-xm)*(fxmax+fxm)/2.0_dp - endif - - err=abs((fxm-fxmin)*(xm-xmin)) - if ((err .gt. eps).and.(steps .gt. 1)) then - call approx_mon_int_steps(res,f,c,xmin,xm,eps/2.0,steps/2,fxmin,fxm) - else - res=res+(xm-xmin)*(fxm+fxmin)/2.0_dp - endif + recursive subroutine approx_mon_int_steps(res, f, c, xmin, xmax, eps, steps, fxmin, fxmax) + implicit none + real(dp) :: res + real(dp), external :: f + real(dp), intent(in) :: c + real(dp), intent(in) :: xmax + real(dp), intent(in) :: xmin + real(dp), intent(in) :: eps + integer(i4), intent(in) :: steps + real(dp), intent(in) :: fxmin + real(dp), intent(in) :: fxmax + + !locale variables + real(dp) :: xm + real(dp) :: fxm + real(dp) :: err + + xm = (xmax + xmin) / 2.0_dp + fxm = f(c, xm) + + err = abs((fxmax - fxm) * (xmax - xm)) + if ((err .gt. eps).and.(steps .gt. 1)) then + call approx_mon_int_steps(res, f, c, xm, xmax, eps / 2.0, steps - steps / 2, fxm, fxmax) + else + res = res + (xmax - xm) * (fxmax + fxm) / 2.0_dp + endif + + err = abs((fxm - fxmin) * (xm - xmin)) + if ((err .gt. eps).and.(steps .gt. 1)) then + call approx_mon_int_steps(res, f, c, xmin, xm, eps / 2.0, steps / 2, fxmin, fxm) + else + res = res + (xm - xmin) * (fxm + fxmin) / 2.0_dp + endif end subroutine - recursive subroutine approx_mon_int_eps(res,f,c,xmin,xmax,eps,fxmin,fxmax) - implicit none - real(dp) :: res - real(dp), external :: f - real(dp), intent(in) :: c - real(dp), intent(in) :: xmax - real(dp), intent(in) :: xmin - real(dp), intent(in) :: eps - real(dp), intent(in) :: fxmin - real(dp), intent(in) :: fxmax - - !locale variables - real(dp) :: xm - real(dp) :: fxm - real(dp) :: err - - xm = (xmax+xmin)/2.0_dp - fxm= f(c,xm) - - err=abs((fxmax-fxm)*(xmax-xm)) - if (err .gt. eps) then - call approx_mon_int_eps(res,f,c,xm,xmax,eps/2.0,fxm,fxmax) - else - res=res+(xmax-xm)*(fxmax+fxm)/2.0_dp - endif - - err=abs((fxm-fxmin)*(xm-xmin)) - if (err .gt. eps) then - call approx_mon_int_eps(res,f,c,xmin,xm,eps/2.0,fxmin,fxm) - else - res=res+(xm-xmin)*(fxm+fxmin)/2.0_dp - endif + recursive subroutine approx_mon_int_eps(res, f, c, xmin, xmax, eps, fxmin, fxmax) + implicit none + real(dp) :: res + real(dp), external :: f + real(dp), intent(in) :: c + real(dp), intent(in) :: xmax + real(dp), intent(in) :: xmin + real(dp), intent(in) :: eps + real(dp), intent(in) :: fxmin + real(dp), intent(in) :: fxmax + + !locale variables + real(dp) :: xm + real(dp) :: fxm + real(dp) :: err + + xm = (xmax + xmin) / 2.0_dp + fxm = f(c, xm) + + err = abs((fxmax - fxm) * (xmax - xm)) + if (err .gt. eps) then + call approx_mon_int_eps(res, f, c, xm, xmax, eps / 2.0, fxm, fxmax) + else + res = res + (xmax - xm) * (fxmax + fxm) / 2.0_dp + endif + + err = abs((fxm - fxmin) * (xm - xmin)) + if (err .gt. eps) then + call approx_mon_int_eps(res, f, c, xmin, xm, eps / 2.0, fxmin, fxm) + else + res = res + (xm - xmin) * (fxm + fxmin) / 2.0_dp + endif end subroutine ! if c>1.0, the function can be fitted very nice with gnuplot ! pi/2*exp(a*x**b) - subroutine lookUpIntegral(res,integral,c) - use mo_constants, only: PI_dp - implicit none - real(dp) :: res - real(dp), dimension(:),intent(in):: integral - real(dp), intent(in) :: c - - !local variables - integer(i4) :: place - real(dp) :: mu - integer(i4) :: intsize - real(dp) :: maxC - - intsize=size(integral)-2 - maxC=integral(intsize+2) - mu=c*real(intsize,dp)/maxC - place=int(mu,i4)+1 - if (place .gt. intsize) then - !call approx_mon_int(res,intgrandFast,c,0.0_dp,PI_dp/2.0_dp,steps=1024,fxmax=0.0_dp) - !write(*,*) 'Warning: Lambda_Fast is huge. Slow integration used.' - res=(PI_dp/2.0_dp)*exp(-1.57406_dp*c**0.815488_dp) - else - mu=mu-real(place-1,dp) - res=(1.0_dp-mu)*integral(place)+mu*integral(place+1) - res=res - end if + subroutine lookUpIntegral(res, integral, c) + use mo_constants, only : PI_dp + implicit none + real(dp) :: res + real(dp), dimension(:), intent(in) :: integral + real(dp), intent(in) :: c + + !local variables + integer(i4) :: place + real(dp) :: mu + integer(i4) :: intsize + real(dp) :: maxC + + intsize = size(integral) - 2 + maxC = integral(intsize + 2) + mu = c * real(intsize, dp) / maxC + place = int(mu, i4) + 1 + if (place .gt. intsize) then + !call approx_mon_int(res,intgrandFast,c,0.0_dp,PI_dp/2.0_dp,steps=1024,fxmax=0.0_dp) + !write(*,*) 'Warning: Lambda_Fast is huge. Slow integration used.' + res = (PI_dp / 2.0_dp) * exp(-1.57406_dp * c**0.815488_dp) + else + mu = mu - real(place - 1, dp) + res = (1.0_dp - mu) * integral(place) + mu * integral(place + 1) + res = res + end if end subroutine - function intgrandFast(c,phi) - implicit none - real(dp) :: intgrandFast - real(dp), intent(in) :: c - real(dp), intent(in) :: phi - intgrandFast=exp(-c/cos(phi)) - return + function intgrandFast(c, phi) + implicit none + real(dp) :: intgrandFast + real(dp), intent(in) :: c + real(dp), intent(in) :: phi + intgrandFast = exp(-c / cos(phi)) + return end function END MODULE mo_neutrons diff --git a/src/mHM/mo_objective_function.f90 b/src/mHM/mo_objective_function.f90 index bce5ad60..cacde2a5 100644 --- a/src/mHM/mo_objective_function.f90 +++ b/src/mHM/mo_objective_function.f90 @@ -28,7 +28,8 @@ MODULE mo_objective_function ! Written Juliane Mai, Dec 2012 ! Modified Stephan Thober, Oct 2015 moved all runoff only related objectives to mRM - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp + use mo_optimization_utils, only : eval_interface IMPLICIT NONE @@ -89,50 +90,72 @@ MODULE mo_objective_function ! Modified, ! Oct 2015, Stephan Thober - moved all runoff related objective functions to mRM - FUNCTION objective(parameterset) + FUNCTION objective(parameterset, eval, arg1, arg2, arg3) - USE mo_common_variables, ONLY: opti_function + USE mo_common_mHM_mRM_variables, ONLY : opti_function + use mo_message, only : message + use mo_common_constants, only : nodata_dp IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: parameterset - REAL(dp) :: objective + REAL(dp), DIMENSION(:), INTENT(IN) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + ! these are dummy arguments for providing a common interface also encompassing + ! loglikelihood_stddev with further args in single_objective_runoff in mo_mrm_objective_function_runoff + real(dp), optional, intent(in) :: arg1 + real(dp), optional, intent(out) :: arg2 + real(dp), optional, intent(out) :: arg3 + + REAL(dp) :: objective + + if (present(arg1) .or. present(arg2) .or. present(arg3)) then + call message("Error mo_objective_function: Received unexpected argument, check optimization settings") + stop 1 + end if + + ! set these to nan so compiler does not complain + if (present(arg2)) then + arg2 = nodata_dp + end if + if (present(arg3)) then + arg3 = nodata_dp + end if - !write(*,*) 'parameterset: ',parameterset(:) select case (opti_function) case (10) - ! KGE of catchment average SM - objective = objective_sm_kge_catchment_avg(parameterset) + ! KGE of catchment average SM + objective = objective_sm_kge_catchment_avg(parameterset, eval) case (11) - ! pattern dissimilarity (PD) of SM fields - objective = objective_sm_pd(parameterset) + ! pattern dissimilarity (PD) of SM fields + objective = objective_sm_pd(parameterset, eval) case (12) - ! sum of squared errors of standard_score SM - objective = objective_sm_sse_standard_score(parameterset) + ! sum of squared errors of standard_score SM + objective = objective_sm_sse_standard_score(parameterset, eval) case (13) - ! soil moisture correlation - temporal - objective = objective_sm_corr(parameterset) + ! soil moisture correlation - temporal + objective = objective_sm_corr(parameterset, eval) case (15) - ! KGE for Q * RMSE for basin_avg TWS (standarized scored) - objective = objective_kge_q_rmse_tws(parameterset) + ! KGE for Q * RMSE for basin_avg TWS (standarized scored) + objective = objective_kge_q_rmse_tws(parameterset, eval) case (17) ! KGE of catchment average SM - objective = objective_neutrons_kge_catchment_avg(parameterset) + objective = objective_neutrons_kge_catchment_avg(parameterset, eval) case (27) - ! KGE of catchment average ET - objective = objective_et_kge_catchment_avg(parameterset) + ! KGE of catchment average ET + objective = objective_et_kge_catchment_avg(parameterset, eval) case (28) - ! KGE for Q + SSE for SM (standarized scored) - objective = objective_kge_q_sm_corr(parameterset) + ! KGE for Q + SSE for SM (standarized scored) + objective = objective_kge_q_sm_corr(parameterset, eval) case (29) - ! KGE for Q + KGE of catchment average ET - objective = objective_kge_q_et(parameterset) - case (30) - ! KGE for Q * RMSE for basin_avg ET (standarized scored) - objective = objective_kge_q_rmse_et(parameterset) + ! KGE for Q + KGE of catchment average ET + objective = objective_kge_q_et(parameterset, eval) + case (30) + ! KGE for Q * RMSE for basin_avg ET (standarized scored) + objective = objective_kge_q_rmse_et(parameterset, eval) case default - stop "Error objective: opti_function not implemented yet." + call message("Error objective: opti_function not implemented yet.") + stop 1 end select END FUNCTION objective @@ -201,98 +224,98 @@ END FUNCTION objective !> \author Matthias Zink !> \date May 2015 - FUNCTION objective_sm_kge_catchment_avg(parameterset) + FUNCTION objective_sm_kge_catchment_avg(parameterset, eval) - use mo_init_states, only : get_basin_info - use mo_mhm_eval, only : mhm_eval - use mo_message, only : message - use mo_moment, only : average - use mo_errormeasures, only : KGE - use mo_string_utils, only : num2str + use mo_message, only : message + use mo_moment, only : average + use mo_errormeasures, only : KGE + use mo_string_utils, only : num2str ! - use mo_global_variables, only: nBasins, & ! number of basins - L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) - use mo_mhm_constants, only: nodata_dp ! global nodata value + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) + use mo_common_constants, only : nodata_dp ! global nodata value implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_sm_kge_catchment_avg + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_sm_kge_catchment_avg ! local - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iTime ! time loop counter - integer(i4) :: n_time_steps ! number of time steps in simulated SM - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp) :: invalid_times ! number of invalid timesteps - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp ! for sixth root - real(dp), dimension(:), allocatable :: sm_catch_avg_basin ! spatial average of observed soil moisture - real(dp), dimension(:), allocatable :: sm_opti_catch_avg_basin ! spatial avergae of modeled soil moisture - real(dp), dimension(:,:), allocatable :: sm_opti ! simulated soil moisture + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iTime ! time loop counter + integer(i4) :: n_time_steps ! number of time steps in simulated SM + integer(i4) :: s1, e1 ! start and end index for the current basin + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp) :: invalid_times ! number of invalid timesteps + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp ! for sixth root + real(dp), dimension(:), allocatable :: sm_catch_avg_basin ! spatial average of observed soil moisture + real(dp), dimension(:), allocatable :: sm_opti_catch_avg_basin ! spatial avergae of modeled soil moisture + real(dp), dimension(:, :), allocatable :: sm_opti ! simulated soil moisture ! ! (dim1=ncells, dim2=time) - logical, dimension(:), allocatable :: mask_times ! mask for valid sm catchment avg time steps + logical, dimension(:), allocatable :: mask_times ! mask for valid sm catchment avg time steps - call mhm_eval(parameterset, sm_opti=sm_opti) + call eval(parameterset, sm_opti = sm_opti) ! initialize some variables objective_sm_kge_catchment_avg = 0.0_dp ! loop over basin - for applying power law later on - do iBasin=1, nBasins - - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - ! allocate - allocate(mask_times (size(sm_opti, dim=2))) - allocate(sm_catch_avg_basin (size(sm_opti, dim=2))) - allocate(sm_opti_catch_avg_basin(size(sm_opti, dim=2))) - - ! initalize - mask_times = .TRUE. - sm_catch_avg_basin = nodata_dp - sm_opti_catch_avg_basin = nodata_dp - - invalid_times = 0.0_dp - ! calculate catchment average soil moisture - n_time_steps = size(sm_opti, dim=2) - do iTime = 1, n_time_steps - - ! check for enough data points in timesteps for KGE calculation - ! more then 10 percent avaiable in current field - if ( count(L1_sm_mask(s1:e1,iTime)) .LE. (0.10_dp * real(nCells1,dp)) ) then - invalid_times = invalid_times + 1.0_dp - mask_times(iTime) = .FALSE. - cycle - end if - sm_catch_avg_basin(iTime) = average( L1_sm(s1:e1,iTime), mask=L1_sm_mask(s1:e1,iTime)) - sm_opti_catch_avg_basin(iTime) = average(sm_opti(s1:e1,iTime), mask=L1_sm_mask(s1:e1,iTime)) - end do - - ! user information about invalid times - if (invalid_times .GT. 0.5_dp) then - call message(' WARNING: objective_sm: Detected invalid timesteps (.LT. 10 valid data points).') - call message(' Fraction of invlauid timestpes: ', & - num2str(invalid_times/real(n_time_steps,dp),'(F4.2)')) - end if - - - ! calculate average soil moisture KGE over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_sm_kge_catchment_avg = objective_sm_kge_catchment_avg + & - ( (1.0_dp-KGE(sm_catch_avg_basin, sm_opti_catch_avg_basin, mask=mask_times)) / real(nBasins,dp) )**6 - - ! deallocate - deallocate(mask_times ) - deallocate(sm_catch_avg_basin ) - deallocate(sm_opti_catch_avg_basin) + do iBasin = 1, nBasins + + ! get basin information + ncells1 = level1(iBasin)%ncells + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + ! allocate + allocate(mask_times (size(sm_opti, dim = 2))) + allocate(sm_catch_avg_basin (size(sm_opti, dim = 2))) + allocate(sm_opti_catch_avg_basin(size(sm_opti, dim = 2))) + + ! initalize + mask_times = .TRUE. + sm_catch_avg_basin = nodata_dp + sm_opti_catch_avg_basin = nodata_dp + + invalid_times = 0.0_dp + ! calculate catchment average soil moisture + n_time_steps = size(sm_opti, dim = 2) + do iTime = 1, n_time_steps + + ! check for enough data points in timesteps for KGE calculation + ! more then 10 percent avaiable in current field + if (count(L1_sm_mask(s1 : e1, iTime)) .LE. (0.10_dp * real(nCells1, dp))) then + invalid_times = invalid_times + 1.0_dp + mask_times(iTime) = .FALSE. + cycle + end if + sm_catch_avg_basin(iTime) = average(L1_sm(s1 : e1, iTime), mask = L1_sm_mask(s1 : e1, iTime)) + sm_opti_catch_avg_basin(iTime) = average(sm_opti(s1 : e1, iTime), mask = L1_sm_mask(s1 : e1, iTime)) + end do + + ! user information about invalid times + if (invalid_times .GT. 0.5_dp) then + call message(' WARNING: objective_sm: Detected invalid timesteps (.LT. 10 valid data points).') + call message(' Fraction of invlauid timestpes: ', & + num2str(invalid_times / real(n_time_steps, dp), '(F4.2)')) + end if + + + ! calculate average soil moisture KGE over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_sm_kge_catchment_avg = objective_sm_kge_catchment_avg + & + ((1.0_dp - KGE(sm_catch_avg_basin, sm_opti_catch_avg_basin, mask = mask_times)) / real(nBasins, dp))**6 + + ! deallocate + deallocate(mask_times) + deallocate(sm_catch_avg_basin) + deallocate(sm_opti_catch_avg_basin) end do objective_sm_kge_catchment_avg = objective_sm_kge_catchment_avg**onesixth - call message(' objective_sm_kge_catchment_avg = ', num2str(objective_sm_kge_catchment_avg,'(F9.5)')) + call message(' objective_sm_kge_catchment_avg = ', num2str(objective_sm_kge_catchment_avg, '(F9.5)')) END FUNCTION objective_sm_kge_catchment_avg @@ -363,79 +386,78 @@ END FUNCTION objective_sm_kge_catchment_avg !> \author Matthias Zink !> \date March 2015 - FUNCTION objective_sm_corr(parameterset) + FUNCTION objective_sm_corr(parameterset, eval) - use mo_init_states, only : get_basin_info - use mo_mhm_eval, only : mhm_eval - use mo_message, only : message - use mo_moment, only : correlation - use mo_string_utils, only : num2str + use mo_message, only : message + use mo_moment, only : correlation + use mo_string_utils, only : num2str ! - use mo_global_variables, only: nBasins, & ! number of basins - L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) - + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_sm_corr + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_sm_corr ! local - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iCell ! cell loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp) :: invalid_cells ! number of invalid cells in catchment - real(dp) :: objective_sm_corr_basin ! basins wise objectives - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp - real(dp), dimension(:,:), allocatable :: sm_opti ! simulated soil moisture + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iCell ! cell loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp) :: invalid_cells ! number of invalid cells in catchment + real(dp) :: objective_sm_corr_basin ! basins wise objectives + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp + real(dp), dimension(:, :), allocatable :: sm_opti ! simulated soil moisture ! ! (dim1=ncells, dim2=time) - call mhm_eval(parameterset, sm_opti=sm_opti) + call eval(parameterset, sm_opti = sm_opti) ! initialize some variables - objective_sm_corr = 0.0_dp + objective_sm_corr = 0.0_dp ! loop over basin - for applying power law later on - do iBasin=1, nBasins - - ! init - objective_sm_corr_basin = 0.0_dp - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - invalid_cells = 0.0_dp - ! temporal correlation is calculated on individual gridd cells - - do iCell = s1, e1 - - ! check for enough data points in time for correlation - if ( count(L1_sm_mask(iCell,:)) .LE. 0.10_dp * real( size(L1_sm, dim=2) ,dp) ) then - invalid_cells = invalid_cells + 1.0_dp - cycle - end if - objective_sm_corr_basin = objective_sm_corr_basin + & - correlation( L1_sm(iCell,:), sm_opti(iCell,:), mask=L1_sm_mask(iCell,:)) - end do - - ! user information about invalid cells - if (invalid_cells .GT. 0.5_dp) then - call message(' WARNING: objective_sm: Detected invalid cells in study area (.LT. 10 valid data points).') - call message(' Fraction of invlauid cells: ', & - num2str(invalid_cells/real(nCells1,dp),'(F4.2)')) - end if - - - ! calculate average soil moisture correlation over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_sm_corr = objective_sm_corr + & - ( (1.0_dp-objective_sm_corr_basin/ real(nCells1,dp)) / real(nBasins,dp) )**6 + do iBasin = 1, nBasins + + ! init + objective_sm_corr_basin = 0.0_dp + ! get basin information + ncells1 = level1(iBasin)%ncells + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + invalid_cells = 0.0_dp + ! temporal correlation is calculated on individual gridd cells + + do iCell = s1, e1 + + ! check for enough data points in time for correlation + if (count(L1_sm_mask(iCell, :)) .LE. 0.10_dp * real(size(L1_sm, dim = 2), dp)) then + invalid_cells = invalid_cells + 1.0_dp + cycle + end if + objective_sm_corr_basin = objective_sm_corr_basin + & + correlation(L1_sm(iCell, :), sm_opti(iCell, :), mask = L1_sm_mask(iCell, :)) + end do + + ! user information about invalid cells + if (invalid_cells .GT. 0.5_dp) then + call message(' WARNING: objective_sm: Detected invalid cells in study area (.LT. 10 valid data points).') + call message(' Fraction of invlauid cells: ', & + num2str(invalid_cells / real(nCells1, dp), '(F4.2)')) + end if + + + ! calculate average soil moisture correlation over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_sm_corr = objective_sm_corr + & + ((1.0_dp - objective_sm_corr_basin / real(nCells1, dp)) / real(nBasins, dp))**6 end do objective_sm_corr = objective_sm_corr**onesixth - call message(' objective_sm_corr = ', num2str(objective_sm_corr,'(F9.5)')) + call message(' objective_sm_corr = ', num2str(objective_sm_corr, '(F9.5)')) END FUNCTION objective_sm_corr @@ -508,88 +530,90 @@ END FUNCTION objective_sm_corr !> \author Matthias Zink !> \date May 2015 - FUNCTION objective_sm_pd(parameterset) + FUNCTION objective_sm_pd(parameterset, eval) - use mo_init_states, only : get_basin_info - use mo_mhm_eval, only : mhm_eval - use mo_message, only : message + use mo_message, only : message use mo_spatialsimilarity, only : PD - use mo_string_utils, only : num2str + use mo_string_utils, only : num2str ! - use mo_global_variables, only: nBasins, & ! number of basins - L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) - use mo_mhm_constants, only: nodata_dp ! global nodata value + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) + use mo_common_constants, only : nodata_dp ! global nodata value implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_sm_pd ! objective function value + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_sm_pd ! objective function value ! local - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iTime ! time loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp ! for sixth root - real(dp), dimension(:,:), allocatable :: mat1, mat2 ! matrices of SM from vectorized arrays - real(dp), dimension(:), allocatable :: pd_time_series ! pattern dissimilarity (pd) at every time step - real(dp), dimension(:,:), allocatable :: sm_opti ! simulated soil moisture + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iTime ! time loop counter + integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows + integer(i4) :: s1, e1 ! start and end index for the current basin + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp ! for sixth root + real(dp), dimension(:, :), allocatable :: mat1, mat2 ! matrices of SM from vectorized arrays + real(dp), dimension(:), allocatable :: pd_time_series ! pattern dissimilarity (pd) at every time step + real(dp), dimension(:, :), allocatable :: sm_opti ! simulated soil moisture ! ! (dim1=ncells, dim2=time) - logical, dimension(:,:), allocatable :: mask1 ! mask of valid cells at level1 - logical, dimension(:,:), allocatable :: mask_sm ! mask of valid sm cells - logical, dimension(:), allocatable :: mask_times ! mask for valid sm catchment avg time steps + logical, dimension(:, :), allocatable :: mask1 ! mask of valid cells at level1 + logical, dimension(:, :), allocatable :: mask_sm ! mask of valid sm cells + logical, dimension(:), allocatable :: mask_times ! mask for valid sm catchment avg time steps - call mhm_eval(parameterset, sm_opti=sm_opti) + call eval(parameterset, sm_opti = sm_opti) ! initialize some variables objective_sm_pd = 0.0_dp ! loop over basin - for applying power law later on - do iBasin=1, nBasins - - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1, mask=mask1) - - ! allocate - allocate(mask_times (size(sm_opti, dim=2))) - allocate(pd_time_series(size(sm_opti, dim=2))) - allocate(mat1 (nrows1, ncols1)) - allocate(mat2 (nrows1, ncols1)) - allocate(mask_sm(nrows1, ncols1)) - - ! initalize - mask_times = .FALSE. - pd_time_series = 0.0_dp - - ! calculate pattern similarity criterion - do iTime = 1, size(sm_opti, dim=2) - mat1 = unpack( L1_sm(s1:e1,iTime), mask1, nodata_dp) - mat2 = unpack( sm_opti(s1:e1,iTime), mask1, nodata_dp) - mask_sm = unpack(L1_sm_mask(s1:e1,iTime), mask1, .FALSE.) - pd_time_series = PD(mat1, mat2, mask=mask_sm, valid=mask_times(itime)) - end do - - if (count(mask_times) > 0_i4) then - ! calculate avergae PD over all basins with power law -basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_sm_pd = objective_sm_pd + & - ((1.0_dp - sum(pd_time_series, mask=mask_times) / real(count(mask_times), dp)) / real(nBasins,dp) )**6 - else - call message('***ERROR: mo_objective_funtion: objective_sm_pd: No soil moisture observations available!') - stop - end if - - ! deallocate - deallocate(mask_times ) - deallocate(pd_time_series) - deallocate(mat1 ) - deallocate(mat2 ) - deallocate(mask_sm) + do iBasin = 1, nBasins + + ! get basin information + mask1 = level1(iBasin)%mask + ncols1 = level1(iBasin)%ncols + nrows1 = level1(iBasin)%nrows + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + ! allocate + allocate(mask_times (size(sm_opti, dim = 2))) + allocate(pd_time_series(size(sm_opti, dim = 2))) + allocate(mat1 (nrows1, ncols1)) + allocate(mat2 (nrows1, ncols1)) + allocate(mask_sm(nrows1, ncols1)) + + ! initalize + mask_times = .FALSE. + pd_time_series = 0.0_dp + + ! calculate pattern similarity criterion + do iTime = 1, size(sm_opti, dim = 2) + mat1 = unpack(L1_sm(s1 : e1, iTime), mask1, nodata_dp) + mat2 = unpack(sm_opti(s1 : e1, iTime), mask1, nodata_dp) + mask_sm = unpack(L1_sm_mask(s1 : e1, iTime), mask1, .FALSE.) + pd_time_series = PD(mat1, mat2, mask = mask_sm, valid = mask_times(itime)) + end do + + if (count(mask_times) > 0_i4) then + ! calculate avergae PD over all basins with power law -basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_sm_pd = objective_sm_pd + & + ((1.0_dp - sum(pd_time_series, mask = mask_times) / real(count(mask_times), dp)) / real(nBasins, dp))**6 + else + call message('***ERROR: mo_objective_funtion: objective_sm_pd: No soil moisture observations available!') + stop + end if + + ! deallocate + deallocate(mask_times) + deallocate(pd_time_series) + deallocate(mat1) + deallocate(mat2) + deallocate(mask_sm) end do objective_sm_pd = objective_sm_pd**onesixth - call message(' objective_sm_pd = ', num2str(objective_sm_pd,'(F9.5)')) + call message(' objective_sm_pd = ', num2str(objective_sm_pd, '(F9.5)')) END FUNCTION objective_sm_pd @@ -656,79 +680,79 @@ END FUNCTION objective_sm_pd !> \author Matthias Zink !> \date March 2015 - FUNCTION objective_sm_sse_standard_score(parameterset) + FUNCTION objective_sm_sse_standard_score(parameterset, eval) - use mo_init_states, only : get_basin_info - use mo_mhm_eval, only : mhm_eval - use mo_message, only : message - use mo_errormeasures, only : SSE - use mo_standard_score, only : standard_score - use mo_string_utils, only : num2str + use mo_message, only : message + use mo_errormeasures, only : SSE + use mo_standard_score, only : standard_score + use mo_string_utils, only : num2str ! - use mo_global_variables, only: nBasins, & ! number of basins - L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_sm_sse_standard_score + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_sm_sse_standard_score ! local - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iCell ! cell loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp) :: invalid_cells ! number of invalid cells in catchment - real(dp) :: objective_sm_sse_standard_score_basin ! basins wise objectives - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp - real(dp), dimension(:,:), allocatable :: sm_opti ! simulated soil moisture + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iCell ! cell loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp) :: invalid_cells ! number of invalid cells in catchment + real(dp) :: objective_sm_sse_standard_score_basin ! basins wise objectives + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp + real(dp), dimension(:, :), allocatable :: sm_opti ! simulated soil moisture ! ! (dim1=ncells, dim2=time) - call mhm_eval(parameterset, sm_opti=sm_opti) + call eval(parameterset, sm_opti = sm_opti) ! initialize some variables - objective_sm_sse_standard_score = 0.0_dp + objective_sm_sse_standard_score = 0.0_dp ! loop over basin - for applying power law later on - do iBasin=1, nBasins - - ! init - objective_sm_sse_standard_score_basin = 0.0_dp - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - invalid_cells = 0.0_dp - ! standard_score signal is calculated on individual grid cells - do iCell = s1, e1 - - ! check for enough data points in time for statistical calculations (e.g. mean, stddev) - if ( count(L1_sm_mask(iCell,:)) .LE. (0.10_dp * real(size(L1_sm, dim=2) ,dp)) ) then - invalid_cells = invalid_cells + 1.0_dp - cycle - end if - objective_sm_sse_standard_score_basin = objective_sm_sse_standard_score_basin + & - SSE( standard_score(L1_sm(iCell,:), mask=L1_sm_mask(iCell,:)), & - standard_score(sm_opti(iCell,:), mask=L1_sm_mask(iCell,:)), mask=L1_sm_mask(iCell,:)) - - end do - - ! user information about invalid cells - if (invalid_cells .GT. 0.5_dp) then - call message(' WARNING: objective_sm: Detected invalid cells in study area (.LT. 10 valid data points).') - call message(' Fraction of invlauid cells: ', & - num2str(invalid_cells/real(nCells1,dp),'(F4.2)')) - end if - - ! calculate average soil moisture correlation over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_sm_sse_standard_score = objective_sm_sse_standard_score + & - ( objective_sm_sse_standard_score_basin / real(nBasins,dp) )**6 + do iBasin = 1, nBasins + + ! init + objective_sm_sse_standard_score_basin = 0.0_dp + ! get basin information + nCells1 = level1(iBasin)%nCells + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + invalid_cells = 0.0_dp + ! standard_score signal is calculated on individual grid cells + do iCell = s1, e1 + + ! check for enough data points in time for statistical calculations (e.g. mean, stddev) + if (count(L1_sm_mask(iCell, :)) .LE. (0.10_dp * real(size(L1_sm, dim = 2), dp))) then + invalid_cells = invalid_cells + 1.0_dp + cycle + end if + objective_sm_sse_standard_score_basin = objective_sm_sse_standard_score_basin + & + SSE(standard_score(L1_sm(iCell, :), mask = L1_sm_mask(iCell, :)), & + standard_score(sm_opti(iCell, :), mask = L1_sm_mask(iCell, :)), mask = L1_sm_mask(iCell, :)) + + end do + + ! user information about invalid cells + if (invalid_cells .GT. 0.5_dp) then + call message(' WARNING: objective_sm: Detected invalid cells in study area (.LT. 10 valid data points).') + call message(' Fraction of invlauid cells: ', & + num2str(invalid_cells / real(nCells1, dp), '(F4.2)')) + end if + + ! calculate average soil moisture correlation over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_sm_sse_standard_score = objective_sm_sse_standard_score + & + (objective_sm_sse_standard_score_basin / real(nBasins, dp))**6 end do objective_sm_sse_standard_score = objective_sm_sse_standard_score**onesixth - call message(' objective_sm_sse_standard_score = ', num2str(objective_sm_sse_standard_score,'(E12.5)')) + call message(' objective_sm_sse_standard_score = ', num2str(objective_sm_sse_standard_score, '(E12.5)')) END FUNCTION objective_sm_sse_standard_score @@ -767,7 +791,7 @@ END FUNCTION objective_sm_sse_standard_score ! RESTRICTIONS !> \note Input values must be floating points. \n !> Actually, \f$ KGE \f$ will be returned such that it can be minimized. \n - !> For TWS required at least 5 years of data! + !> For TWS required at least 2 years of data! ! EXAMPLE ! para = (/ 1., 2, 3., -999., 5., 6. /) @@ -783,183 +807,187 @@ END FUNCTION objective_sm_sse_standard_score !> \date Oct. 2015 ! Modified, Oct 2015, Stephan Thober - moved tws optimization from mo_mrm_objective_function_runoff here - FUNCTION objective_kge_q_rmse_tws(parameterset) - - use mo_mhm_eval, only: mhm_eval - use mo_constants, only: eps_dp - use mo_errormeasures, only: kge, rmse - use mo_global_variables, only: nBasins, evalPer - use mo_julian, only: caldat - use mo_message, only: message - use mo_mrm_constants, only: nodata_dp - use mo_moment, only: mean - use mo_temporal_aggregation, only: day2mon_average - use mo_standard_score, only: classified_standard_score - use mo_string_utils, only: num2str + FUNCTION objective_kge_q_rmse_tws(parameterset, eval) + + use mo_common_constants, only : eps_dp + use mo_errormeasures, only : rmse + use mo_common_variables, only : nBasins + use mo_common_mhm_mrm_variables, only : evalPer + use mo_julian, only : caldat + use mo_message, only : message + use mo_common_constants, only : nodata_dp + use mo_moment, only : mean + use mo_temporal_aggregation, only : day2mon_average + use mo_standard_score, only : classified_standard_score + use mo_string_utils, only : num2str #ifdef MRM2MHM - use mo_mrm_objective_function_runoff, only: extract_runoff + use mo_mrm_objective_function_runoff, only : extract_runoff + use mo_errormeasures, only : kge + #endif implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_kge_q_rmse_tws + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_kge_q_rmse_tws ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - real(dp), allocatable, dimension(:,:) :: tws ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: tws ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg, ii, pp, mmm ! gauges counter, basin counter, month counters - integer(i4) :: year, month, day - integer(i4) :: nGaugesTotal - real(dp), dimension(nBasins) :: initTime - - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: ii, pp, mmm ! basin counter, month counters + integer(i4) :: year, month, day + real(dp), dimension(nBasins) :: initTime - real(dp), dimension(:), allocatable :: tws_sim ! simulated tws - real(dp), dimension(:), allocatable :: tws_obs ! measured tws - logical, dimension(:), allocatable :: tws_obs_mask ! mask for measured tws + real(dp), dimension(:), allocatable :: tws_sim ! simulated tws + real(dp), dimension(:), allocatable :: tws_obs ! measured tws + logical, dimension(:), allocatable :: tws_obs_mask ! mask for measured tws - integer(i4) :: nMonths ! total number of months - integer(i4), dimension(:),allocatable :: month_classes ! vector with months' classes + integer(i4) :: nMonths ! total number of months + integer(i4), dimension(:), allocatable :: month_classes ! vector with months' classes ! - real(dp), DIMENSION(:), allocatable :: tws_sim_m, tws_obs_m ! monthly values original time series - real(dp), DIMENSION(:), allocatable :: tws_sim_m_anom, tws_obs_m_anom ! monthly values anomaly time series - logical, DIMENSION(:), allocatable :: tws_obs_m_mask ! - real(dp), dimension(:), allocatable :: rmse_tws, kge_q ! rmse_tws(nBasins), kge_q(nGaugesTotal) - real(dp) :: rmse_tws_avg, kge_q_avg ! obj. functions + real(dp), DIMENSION(:), allocatable :: tws_sim_m, tws_obs_m ! monthly values original time series + real(dp), DIMENSION(:), allocatable :: tws_sim_m_anom, tws_obs_m_anom ! monthly values anomaly time series + logical, DIMENSION(:), allocatable :: tws_obs_m_mask ! + real(dp), dimension(:), allocatable :: rmse_tws ! rmse_tws(nBasins) + real(dp) :: rmse_tws_avg, kge_q_avg ! obj. functions + +#ifdef MRM2MHM + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + + real(dp), dimension(:), allocatable :: kge_q ! kge_q(nGaugesTotal) + integer(i4) :: gg ! gauges counter +#endif ! obtain hourly values of runoff and tws: - call mHM_eval(parameterset, runoff=runoff, basin_avg_tws=tws) + call eval(parameterset, runoff = runoff, basin_avg_tws = tws) !-------------------------------------------- !! TWS !-------------------------------------------- ! allocate - allocate( rmse_tws(nBasins) ) + allocate(rmse_tws(nBasins)) rmse_tws(:) = nodata_dp - do ii=1, nBasins + do ii = 1, nBasins - ! extract tws the same way as runoff using mrm - call extract_basin_avg_tws( ii, tws, tws_sim, tws_obs, tws_obs_mask ) + ! extract tws the same way as runoff using mrm + call extract_basin_avg_tws(ii, tws, tws_sim, tws_obs, tws_obs_mask) - ! check for whether to proceed with this basin or not - ! potentially 5 years of data - if (count(tws_obs_mask) .lt. 365*5 ) then - deallocate (tws_sim, tws_obs, tws_obs_mask) - call message('objective_kge_q_rmse_tws: Length of TWS data of Basin ', trim(adjustl(num2str(ii))) , & - ' less than 5 years: these data are not considered') - cycle - else - ! get initial time of the evaluation period - initTime(ii) = real(evalPer(ii)%julStart,dp) - - ! get calendar days, months, year - call caldat(int(initTime(ii)), yy=year, mm=month, dd=day) - - ! calculate monthly averages from daily values of the model - call day2mon_average(tws_sim,year,month,day,tws_sim_m, misval=nodata_dp) - - ! remove mean from modelled time series - tws_sim_m(:) = tws_sim_m(:) - mean(tws_sim_m(:)) - - ! calculate monthly averages from daily values of the observations, which already have removed the long-term mean - call day2mon_average(tws_obs,year,month,day,tws_obs_m, misval=nodata_dp) - - ! get number of months for given basin - nMonths = size(tws_obs_m) - - allocate ( month_classes( nMonths ) ) - allocate ( tws_obs_m_mask( nMonths ) ) - allocate ( tws_obs_m_anom( nMonths ) ) - allocate ( tws_sim_m_anom( nMonths ) ) - - month_classes(:) = 0 - tws_obs_m_mask(:) = .TRUE. - tws_obs_m_anom(:) = nodata_dp - tws_sim_m_anom(:) = nodata_dp - - ! define months' classes - mmm = month - do pp = 1, nMonths - month_classes(pp) = mmm - if (mmm .LT. 12) then - mmm = mmm + 1 - else - mmm = 1 - end if - end do - - ! define mask for missing data in observations (there are always data for simulations) - where( abs( tws_obs_m - nodata_dp) .lt. eps_dp ) tws_obs_m_mask = .FALSE. - - ! calculate standard score - tws_obs_m_anom = classified_standard_score(tws_obs_m, month_classes, mask = tws_obs_m_mask) - tws_sim_m_anom = classified_standard_score(tws_sim_m, month_classes, mask = tws_obs_m_mask) - rmse_tws(ii) = rmse(tws_sim_m_anom,tws_obs_m_anom, mask = tws_obs_m_mask) - - deallocate ( month_classes ) - deallocate ( tws_obs_m ) - deallocate ( tws_sim_m ) - deallocate ( tws_obs_m_mask ) - deallocate ( tws_sim_m_anom ) - deallocate ( tws_obs_m_anom ) - deallocate (tws_sim, tws_obs, tws_obs_mask) - end if + ! check for potentially 2 years of data + if (count(tws_obs_mask) .lt. 365 * 2) then + call message('objective_kge_q_rmse_tws: Length of TWS data of Basin ', trim(adjustl(num2str(ii))), & + ' less than 2 years: this is not recommended') + end if + + ! get initial time of the evaluation period + initTime(ii) = real(evalPer(ii)%julStart, dp) + + ! get calendar days, months, year + call caldat(int(initTime(ii)), yy = year, mm = month, dd = day) + + ! calculate monthly averages from daily values of the model + call day2mon_average(tws_sim, year, month, day, tws_sim_m, misval = nodata_dp) + + ! remove mean from modelled time series + tws_sim_m(:) = tws_sim_m(:) - mean(tws_sim_m(:)) + + ! calculate monthly averages from daily values of the observations, which already have removed the long-term mean + call day2mon_average(tws_obs, year, month, day, tws_obs_m, misval = nodata_dp) + + ! get number of months for given basin + nMonths = size(tws_obs_m) + + allocate (month_classes(nMonths)) + allocate (tws_obs_m_mask(nMonths)) + allocate (tws_obs_m_anom(nMonths)) + allocate (tws_sim_m_anom(nMonths)) + + month_classes(:) = 0 + tws_obs_m_mask(:) = .TRUE. + tws_obs_m_anom(:) = nodata_dp + tws_sim_m_anom(:) = nodata_dp + + ! define months' classes + mmm = month + do pp = 1, nMonths + month_classes(pp) = mmm + if (mmm .LT. 12) then + mmm = mmm + 1 + else + mmm = 1 + end if + end do + + ! define mask for missing data in observations (there are always data for simulations) + where(abs(tws_obs_m - nodata_dp) .lt. eps_dp) tws_obs_m_mask = .FALSE. + + ! calculate standard score + tws_obs_m_anom = classified_standard_score(tws_obs_m, month_classes, mask = tws_obs_m_mask) + tws_sim_m_anom = classified_standard_score(tws_sim_m, month_classes, mask = tws_obs_m_mask) + rmse_tws(ii) = rmse(tws_sim_m_anom, tws_obs_m_anom, mask = tws_obs_m_mask) + + deallocate (month_classes) + deallocate (tws_obs_m) + deallocate (tws_sim_m) + deallocate (tws_obs_m_mask) + deallocate (tws_sim_m_anom) + deallocate (tws_obs_m_anom) + deallocate (tws_sim, tws_obs, tws_obs_mask) end do - rmse_tws_avg = sum( rmse_tws(:), abs( rmse_tws - nodata_dp) .gt. eps_dp ) / & - real(count( abs( rmse_tws - nodata_dp) .gt. eps_dp),dp) + rmse_tws_avg = sum(rmse_tws(:), abs(rmse_tws - nodata_dp) .gt. eps_dp) / & + real(count(abs(rmse_tws - nodata_dp) .gt. eps_dp), dp) deallocate(rmse_tws) !-------------------------------------------- !! RUNOFF !-------------------------------------------- + kge_q_avg = 0_dp #ifdef MRM2MHM - nGaugesTotal = size(runoff, dim=2) - allocate( kge_q(nGaugesTotal)) + nGaugesTotal = size(runoff, dim = 2) + allocate(kge_q(nGaugesTotal)) kge_q(:) = nodata_dp - do gg=1, nGaugesTotal + do gg = 1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) - ! check for whether to proceed with this basin or not - ! potentially 5 years of data - pp = count(runoff_agg .ge. 0.0_dp ) - if (pp .lt. 365*5 ) then - deallocate (runoff_agg, runoff_obs, runoff_obs_mask) - cycle - else - ! calculate KGE for each basin: - kge_q(gg) = kge( runoff_obs, runoff_agg, mask=runoff_obs_mask) - deallocate (runoff_agg, runoff_obs, runoff_obs_mask) - end if + ! check for potentially 2 years of data + pp = count(runoff_agg .ge. 0.0_dp) + if (pp .lt. 365 * 2) then + call message('objective_kge_q_rmse_tws: Length of TWS data of Basin ', trim(adjustl(num2str(ii))), & + ' less than 2 years: this is not recommended') + end if + ! calculate KGE for each basin: + kge_q(gg) = kge(runoff_obs, runoff_agg, mask = runoff_obs_mask) + deallocate (runoff_agg, runoff_obs, runoff_obs_mask) end do ! calculate average KGE value for runoff - kge_q_avg = sum( kge_q(:), abs( kge_q - nodata_dp) .gt. eps_dp ) / & - real(count( abs( kge_q - nodata_dp) .gt. eps_dp ),dp) + kge_q_avg = sum(kge_q(:), abs(kge_q - nodata_dp) .gt. eps_dp) / & + real(count(abs(kge_q - nodata_dp) .gt. eps_dp), dp) deallocate(kge_q) #else call message('***ERROR: objective_kge_q_rmse_tws: missing routing module for optimization') - stop + stop 1 #endif ! - objective_kge_q_rmse_tws = rmse_tws_avg * ( 1._dp - kge_q_avg ) + objective_kge_q_rmse_tws = rmse_tws_avg * (1._dp - kge_q_avg) - call message(' objective_kge_q_rmse_tws = ', num2str(objective_kge_q_rmse_tws,'(F9.5)')) + call message(' objective_kge_q_rmse_tws = ', num2str(objective_kge_q_rmse_tws, '(F9.5)')) END FUNCTION objective_kge_q_rmse_tws @@ -1025,91 +1053,91 @@ END FUNCTION objective_kge_q_rmse_tws ! HISTORY !> \author Martin Schroen - ! Modified Maren Kaluza, Mar 2018 changed format string to '(I10)' !> \date Jun 2015 + ! Modified Maren Kaluza, Mar 2018 changed format string to '(I10)' + - FUNCTION objective_neutrons_kge_catchment_avg(parameterset) + FUNCTION objective_neutrons_kge_catchment_avg(parameterset, eval) - use mo_init_states, only : get_basin_info - use mo_mhm_eval, only : mhm_eval - use mo_message, only : message - use mo_moment, only : average - use mo_errormeasures, only : KGE - use mo_string_utils, only : num2str + use mo_message, only : message + use mo_moment, only : average + use mo_errormeasures, only : KGE + use mo_string_utils, only : num2str ! - use mo_global_variables, only: nBasins, & ! number of basins - L1_neutronsdata, L1_neutronsdata_mask ! packed measured neutrons, neutrons-mask (dim1=ncells, dim2=time) - use mo_mhm_constants, only: nodata_dp ! global nodata value + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : & + L1_neutronsdata, L1_neutronsdata_mask ! packed measured neutrons, neutrons-mask (dim1=ncells, dim2=time) + use mo_common_constants, only : nodata_dp ! global nodata value implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_neutrons_kge_catchment_avg + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_neutrons_kge_catchment_avg ! local - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iTime ! time loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp ! for sixth root - real(dp), dimension(:), allocatable :: neutrons_catch_avg_basin ! spatial average of observed neutrons - real(dp), dimension(:), allocatable :: neutrons_opti_catch_avg_basin ! spatial avergae of modeled neutrons - real(dp), dimension(:,:), allocatable :: neutrons_opti ! simulated neutrons + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iTime ! time loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp ! for sixth root + real(dp), dimension(:), allocatable :: neutrons_catch_avg_basin ! spatial average of observed neutrons + real(dp), dimension(:), allocatable :: neutrons_opti_catch_avg_basin ! spatial avergae of modeled neutrons + real(dp), dimension(:, :), allocatable :: neutrons_opti ! simulated neutrons ! ! (dim1=ncells, dim2=time) - logical, dimension(:), allocatable :: mask_times ! mask for valid neutrons catchment avg time steps + logical, dimension(:), allocatable :: mask_times ! mask for valid neutrons catchment avg time steps - call mhm_eval(parameterset, neutrons_opti=neutrons_opti) + call eval(parameterset, neutrons_opti = neutrons_opti) ! initialize some variables objective_neutrons_kge_catchment_avg = 0.0_dp ! loop over basin - for applying power law later on - do iBasin=1, nBasins - - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - ! allocate - allocate(mask_times (size(neutrons_opti, dim=2))) - allocate(neutrons_catch_avg_basin (size(neutrons_opti, dim=2))) - allocate(neutrons_opti_catch_avg_basin(size(neutrons_opti, dim=2))) - - ! initalize - mask_times = .TRUE. - neutrons_catch_avg_basin = nodata_dp - neutrons_opti_catch_avg_basin = nodata_dp - - ! calculate catchment average soil moisture - do iTime = 1, size(neutrons_opti, dim=2) - - ! check for enough data points in time for correlation - if ( all(.NOT. L1_neutronsdata_mask(s1:e1,iTime))) then - call message('WARNING: neutrons data at time ', num2str(iTime, '(I10)'), ' is empty.') - !call message('WARNING: objective_neutrons_kge_catchment_avg: ignored currrent time step since less than') - !call message(' 10 valid cells available in soil moisture observation') - mask_times(iTime) = .FALSE. - cycle - end if - neutrons_catch_avg_basin(iTime) = average( L1_neutronsdata(s1:e1,iTime), mask=L1_neutronsdata_mask(s1:e1,iTime)) - neutrons_opti_catch_avg_basin(iTime) = average(neutrons_opti(s1:e1,iTime), mask=L1_neutronsdata_mask(s1:e1,iTime)) - end do - - ! calculate average neutrons KGE over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_neutrons_kge_catchment_avg = objective_neutrons_kge_catchment_avg + & - ( (1.0_dp-KGE(neutrons_catch_avg_basin, neutrons_opti_catch_avg_basin, mask=mask_times)) / real(nBasins,dp) )**6 - - ! deallocate - deallocate(mask_times ) - deallocate(neutrons_catch_avg_basin) - deallocate(neutrons_opti_catch_avg_basin) + do iBasin = 1, nBasins + + ! get basin information + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + ! allocate + allocate(mask_times (size(neutrons_opti, dim = 2))) + allocate(neutrons_catch_avg_basin (size(neutrons_opti, dim = 2))) + allocate(neutrons_opti_catch_avg_basin(size(neutrons_opti, dim = 2))) + + ! initalize + mask_times = .TRUE. + neutrons_catch_avg_basin = nodata_dp + neutrons_opti_catch_avg_basin = nodata_dp + + ! calculate catchment average soil moisture + do iTime = 1, size(neutrons_opti, dim = 2) + + ! check for enough data points in time for correlation + if (all(.NOT. L1_neutronsdata_mask(s1 : e1, iTime))) then + call message('WARNING: neutrons data at time ', num2str(iTime, '(I10)'), ' is empty.') + !call message('WARNING: objective_neutrons_kge_catchment_avg: ignored currrent time step since less than') + !call message(' 10 valid cells available in soil moisture observation') + mask_times(iTime) = .FALSE. + cycle + end if + neutrons_catch_avg_basin(iTime) = average(L1_neutronsdata(s1 : e1, iTime), mask = L1_neutronsdata_mask(s1 : e1, iTime)) + neutrons_opti_catch_avg_basin(iTime) = average(neutrons_opti(s1 : e1, iTime), mask = L1_neutronsdata_mask(s1 : e1, iTime)) + end do + + ! calculate average neutrons KGE over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_neutrons_kge_catchment_avg = objective_neutrons_kge_catchment_avg + & + ((1.0_dp - KGE(neutrons_catch_avg_basin, neutrons_opti_catch_avg_basin, mask = mask_times)) / real(nBasins, dp))**6 + + ! deallocate + deallocate(mask_times) + deallocate(neutrons_catch_avg_basin) + deallocate(neutrons_opti_catch_avg_basin) end do objective_neutrons_kge_catchment_avg = objective_neutrons_kge_catchment_avg**onesixth - call message(' objective_neutrons_kge_catchment_avg = ', num2str(objective_neutrons_kge_catchment_avg,'(F9.5)')) + call message(' objective_neutrons_kge_catchment_avg = ', num2str(objective_neutrons_kge_catchment_avg, '(F9.5)')) END FUNCTION objective_neutrons_kge_catchment_avg @@ -1177,96 +1205,94 @@ END FUNCTION objective_neutrons_kge_catchment_avg !> \author Johannes Brenner !> \date Feb 2017 - FUNCTION objective_et_kge_catchment_avg(parameterset) + FUNCTION objective_et_kge_catchment_avg(parameterset, eval) - use mo_init_states, only : get_basin_info - use mo_mhm_eval, only : mhm_eval - use mo_message, only : message - use mo_moment, only : average - use mo_errormeasures, only : KGE - use mo_string_utils, only : num2str + use mo_message, only : message + use mo_moment, only : average + use mo_errormeasures, only : KGE + use mo_string_utils, only : num2str ! - use mo_global_variables, only: nBasins, & ! number of basins - L1_et, L1_et_mask ! packed measured et, et-mask (dim1=ncells, dim2=time) - use mo_mhm_constants, only: nodata_dp ! global nodata value + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_et_mask, L1_et ! packed measured sm, sm-mask (dim1=ncells, dim2=time) + use mo_common_constants, only : nodata_dp ! global nodata value implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_et_kge_catchment_avg + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_et_kge_catchment_avg ! local - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iTime ! time loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp ! for sixth root - real(dp), dimension(:), allocatable :: et_catch_avg_basin ! spatial average of observed et - real(dp), dimension(:), allocatable :: et_opti_catch_avg_basin ! spatial avergae of modeled et - real(dp), dimension(:,:), allocatable :: et_opti ! simulated et + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iTime ! time loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp ! for sixth root + real(dp), dimension(:), allocatable :: et_catch_avg_basin ! spatial average of observed et + real(dp), dimension(:), allocatable :: et_opti_catch_avg_basin ! spatial avergae of modeled et + real(dp), dimension(:, :), allocatable :: et_opti ! simulated et ! ! (dim1=ncells, dim2=time) - logical, dimension(:), allocatable :: mask_times ! mask for valid et catchment avg time steps + logical, dimension(:), allocatable :: mask_times ! mask for valid et catchment avg time steps - call mhm_eval(parameterset, et_opti=et_opti) + call eval(parameterset, et_opti = et_opti) ! initialize some variables objective_et_kge_catchment_avg = 0.0_dp ! loop over basin - for applying power law later on - do iBasin=1, nBasins - - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - ! allocate - allocate(mask_times (size(et_opti, dim=2))) - allocate(et_catch_avg_basin (size(et_opti, dim=2))) - allocate(et_opti_catch_avg_basin(size(et_opti, dim=2))) - - ! initalize - mask_times = .TRUE. - et_catch_avg_basin = nodata_dp - et_opti_catch_avg_basin = nodata_dp - - ! calculate catchment average evapotranspiration - do iTime = 1, size(et_opti, dim=2) - - ! check for enough data points in time for correlation - if ( all(.NOT. L1_et_mask(s1:e1,iTime))) then - !write (*,*) 'WARNING: et data at time ', iTime, ' is empty.' - !call message('WARNING: objective_et_kge_catchment_avg: ignored currrent time step since less than') - !call message(' 10 valid cells available in evapotranspiration observation') - mask_times(iTime) = .FALSE. - cycle - end if - - et_catch_avg_basin(iTime) = average( L1_et(s1:e1,iTime), mask=L1_et_mask(s1:e1,iTime)) - et_opti_catch_avg_basin(iTime) = average(et_opti(s1:e1,iTime), mask=L1_et_mask(s1:e1,iTime)) - end do - - ! calculate average ET KGE over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - - objective_et_kge_catchment_avg = objective_et_kge_catchment_avg + & - ( (1.0_dp-KGE(et_catch_avg_basin, et_opti_catch_avg_basin, mask=mask_times)) / real(nBasins,dp) )**6 - - ! deallocate - deallocate(mask_times ) - deallocate(et_catch_avg_basin ) - deallocate(et_opti_catch_avg_basin) + do iBasin = 1, nBasins + + ! get basin information + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + ! allocate + allocate(mask_times (size(et_opti, dim = 2))) + allocate(et_catch_avg_basin (size(et_opti, dim = 2))) + allocate(et_opti_catch_avg_basin(size(et_opti, dim = 2))) + + ! initalize + mask_times = .TRUE. + et_catch_avg_basin = nodata_dp + et_opti_catch_avg_basin = nodata_dp + + ! calculate catchment average evapotranspiration + do iTime = 1, size(et_opti, dim = 2) + + ! check for enough data points in time for correlation + if (all(.NOT. L1_et_mask(s1 : e1, iTime))) then + !write (*,*) 'WARNING: et data at time ', iTime, ' is empty.' + !call message('WARNING: objective_et_kge_catchment_avg: ignored currrent time step since less than') + !call message(' 10 valid cells available in evapotranspiration observation') + mask_times(iTime) = .FALSE. + cycle + end if + + et_catch_avg_basin(iTime) = average(L1_et(s1 : e1, iTime), mask = L1_et_mask(s1 : e1, iTime)) + et_opti_catch_avg_basin(iTime) = average(et_opti(s1 : e1, iTime), mask = L1_et_mask(s1 : e1, iTime)) + end do + + ! calculate average ET KGE over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + + objective_et_kge_catchment_avg = objective_et_kge_catchment_avg + & + ((1.0_dp - KGE(et_catch_avg_basin, et_opti_catch_avg_basin, mask = mask_times)) / real(nBasins, dp))**6 + + ! deallocate + deallocate(mask_times) + deallocate(et_catch_avg_basin) + deallocate(et_opti_catch_avg_basin) end do objective_et_kge_catchment_avg = objective_et_kge_catchment_avg**onesixth - call message(' objective_et_kge_catchment_avg = ', num2str(objective_et_kge_catchment_avg,'(F9.5)')) + call message(' objective_et_kge_catchment_avg = ', num2str(objective_et_kge_catchment_avg, '(F9.5)')) END FUNCTION objective_et_kge_catchment_avg ! ----------------------------------------------------------------- ! NAME - ! objective_kge_q_sse_sm(parameterset) + ! objective_kge_q_sse_sm(parameterset, eval) !> \brief Objective function of KGE for runoff and correlation for SM @@ -1301,7 +1327,7 @@ END FUNCTION objective_et_kge_catchment_avg ! EXAMPLE ! para = (/ 1., 2, 3., -999., 5., 6. /) - ! obj_value = objective_kge_q_sse_sm(parameterset) + ! obj_value = objective_kge_q_sse_sm(parameterset, eval) ! LITERATURE ! None @@ -1310,94 +1336,98 @@ END FUNCTION objective_et_kge_catchment_avg !> \author Matthias Zink !> \date Mar. 2017 - FUNCTION objective_kge_q_sm_corr(parameterset) + FUNCTION objective_kge_q_sm_corr(parameterset, eval) - use mo_init_states, only: get_basin_info - use mo_mhm_eval, only: mhm_eval - use mo_errormeasures, only: kge !, sse, rmse ! MZMZMZMZ - use mo_moment, only: correlation ! mean ! MZMZMZMZ - use mo_message, only: message + use mo_moment, only : correlation ! mean ! MZMZMZMZ + use mo_message, only : message ! use mo_standard_score, only: standard_score ! MZMZMZM - use mo_string_utils, only: num2str - use mo_global_variables, only: nBasins, & - L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) + use mo_string_utils, only : num2str + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_sm, L1_sm_mask ! packed measured sm, sm-mask (dim1=ncells, dim2=time) #ifdef MRM2MHM - use mo_mrm_objective_function_runoff, only: extract_runoff + use mo_errormeasures, only : kge !, sse, rmse ! MZMZMZMZ + use mo_mrm_objective_function_runoff, only : extract_runoff #endif implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_kge_q_sm_corr + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_kge_q_sm_corr ! local - real(dp) :: objective_sm - real(dp) :: objective_kge - real(dp) :: invalid_cells ! number of invalid cells in catchment - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp) :: objective_sm + real(dp) :: objective_kge + real(dp) :: invalid_cells ! number of invalid cells in catchment + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iCell ! cell loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp) :: objective_sm_basin ! basins wise objectives - ! runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iCell ! cell loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp) :: objective_sm_basin ! basins wise objectives ! SM - real(dp), dimension(:,:), allocatable :: sm_opti ! simulated soil moisture + real(dp), dimension(:, :), allocatable :: sm_opti ! simulated soil moisture ! ! (dim1=ncells, dim2=time) - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp + +#ifdef MRM2MHM + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + ! runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff +#endif ! run mHM - call mHM_eval(parameterset, runoff=runoff, sm_opti=sm_opti) + call eval(parameterset, runoff = runoff, sm_opti = sm_opti) ! ----------------------------- ! SOIL MOISTURE ! ----------------------------- ! initialize some variables - objective_sm = 0.0_dp + objective_sm = 0.0_dp ! loop over basin - for applying power law later on do iBasin = 1, nBasins - ! init - objective_sm_basin = 0.0_dp - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - ! correlation signal is calculated on individual grid cells - invalid_cells = 0.0_dp - do iCell = s1, e1 - - ! check for enough data points in time for statistical calculations (e.g. mean, stddev) - if ( count(L1_sm_mask(iCell,:)) .LE. (0.10_dp * real(size(L1_sm, dim=2) ,dp)) ) then - invalid_cells = invalid_cells + 1.0_dp - cycle - end if - - ! calculate ojective function - objective_sm_basin = objective_sm_basin + & - correlation( L1_sm(iCell,:), sm_opti(iCell,:), mask=L1_sm_mask(iCell,:)) - end do - - ! user information about invalid cells - if (invalid_cells .GT. 0.5_dp) then - call message(' WARNING: objective_sm: Detected invalid cells in study area (.LT. 10 valid data points).') - call message(' Fraction of invlauid cells: ', & - num2str(invalid_cells/real(nCells1,dp),'(F4.2)')) - end if - - ! calculate average soil moisture objective over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_sm = objective_sm + & - ( (1.0_dp - objective_sm_basin / real(nCells1,dp)) / real(nBasins,dp) )**6 + ! init + objective_sm_basin = 0.0_dp + ! get basin information + nCells1 = level1(iBasin)%nCells + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + + ! correlation signal is calculated on individual grid cells + invalid_cells = 0.0_dp + do iCell = s1, e1 + + ! check for enough data points in time for statistical calculations (e.g. mean, stddev) + if (count(L1_sm_mask(iCell, :)) .LE. (0.10_dp * real(size(L1_sm, dim = 2), dp))) then + invalid_cells = invalid_cells + 1.0_dp + cycle + end if + + ! calculate ojective function + objective_sm_basin = objective_sm_basin + & + correlation(L1_sm(iCell, :), sm_opti(iCell, :), mask = L1_sm_mask(iCell, :)) + end do + + ! user information about invalid cells + if (invalid_cells .GT. 0.5_dp) then + call message(' WARNING: objective_sm: Detected invalid cells in study area (.LT. 10 valid data points).') + call message(' Fraction of invlauid cells: ', & + num2str(invalid_cells / real(nCells1, dp), '(F4.2)')) + end if + + ! calculate average soil moisture objective over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_sm = objective_sm + & + ((1.0_dp - objective_sm_basin / real(nCells1, dp)) / real(nBasins, dp))**6 end do ! compromise solution - sixth root @@ -1406,22 +1436,22 @@ FUNCTION objective_kge_q_sm_corr(parameterset) ! ----------------------------- ! RUNOFF ! ----------------------------- + objective_kge = 0.0_dp #ifdef MRM2MHM - nGaugesTotal = size(runoff, dim=2) + nGaugesTotal = size(runoff, dim = 2) - objective_kge = 0.0_dp - do gg=1, nGaugesTotal + do gg = 1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) - ! KGE - objective_kge = objective_kge + & - ( (1.0_dp - kge(runoff_obs, runoff_agg, mask=runoff_obs_mask) )/ real(nGaugesTotal,dp) )**6 + ! KGE + objective_kge = objective_kge + & + ((1.0_dp - kge(runoff_obs, runoff_agg, mask = runoff_obs_mask)) / real(nGaugesTotal, dp))**6 end do - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) ! compromise solution - sixth root objective_kge = objective_kge**onesixth @@ -1432,10 +1462,10 @@ FUNCTION objective_kge_q_sm_corr(parameterset) #endif ! equal weighted compromise objective functions for discharge and soilmoisture - objective_kge_q_sm_corr = (objective_sm**6 + objective_kge**6 )**onesixth -! print*, "1-SM 2-Q : ", 1.0_dp-objective_sm, 1.0_dp-objective_kge ! MZMZMZMZ + objective_kge_q_sm_corr = (objective_sm**6 + objective_kge**6)**onesixth + ! print*, "1-SM 2-Q : ", 1.0_dp-objective_sm, 1.0_dp-objective_kge ! MZMZMZMZ - call message(' objective_kge_q_sm_corr = ', num2str(objective_kge_q_sm_corr,'(F9.5)')) + call message(' objective_kge_q_sm_corr = ', num2str(objective_kge_q_sm_corr, '(F9.5)')) END FUNCTION objective_kge_q_sm_corr @@ -1443,7 +1473,7 @@ END FUNCTION objective_kge_q_sm_corr ! ----------------------------------------------------------------- ! NAME - ! objective_kge_q_et(parameterset) + ! objective_kge_q_et(parameterset, eval) !> \brief Objective function of KGE for runoff and KGE for ET @@ -1478,7 +1508,7 @@ END FUNCTION objective_kge_q_sm_corr ! EXAMPLE ! para = (/ 1., 2, 3., -999., 5., 6. /) - ! obj_value = objective_kge_q_et(parameterset) + ! obj_value = objective_kge_q_et(parameterset, eval) ! LITERATURE ! None @@ -1487,94 +1517,98 @@ END FUNCTION objective_kge_q_sm_corr !> \author Johannes Brenner !> \date July 2017 - FUNCTION objective_kge_q_et(parameterset) + FUNCTION objective_kge_q_et(parameterset, eval) - use mo_init_states, only: get_basin_info - use mo_mhm_eval, only: mhm_eval - use mo_errormeasures, only: kge !, sse, rmse + use mo_errormeasures, only : kge !, sse, rmse ! use mo_moment, only: correlation ! mean ! JBJBJBJB - use mo_message, only: message + use mo_message, only : message ! use mo_standard_score, only: standard_score ! JBJBJBJB - use mo_string_utils, only: num2str - use mo_global_variables, only: nBasins, & - L1_et, L1_et_mask ! packed measured et, et-mask (dim1=ncells, dim2=time) + use mo_string_utils, only : num2str + use mo_common_variables, only : nBasins, level1 ! number of basins + use mo_global_variables, only : L1_et_mask, L1_et ! packed measured sm, sm-mask (dim1=ncells, dim2=time) #ifdef MRM2MHM - use mo_mrm_objective_function_runoff, only: extract_runoff + use mo_mrm_objective_function_runoff, only : extract_runoff #endif implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_kge_q_et + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_kge_q_et ! local - real(dp) :: objective_et - real(dp) :: objective_q - real(dp) :: invalid_cells ! number of invalid cells in catchment - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp) :: objective_et + real(dp) :: objective_q + real(dp) :: invalid_cells ! number of invalid cells in catchment + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - integer(i4) :: iBasin ! basin loop counter - integer(i4) :: iCell ! cell loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: nCells1 ! ncells1 of level 1 - real(dp) :: objective_et_basin ! basins wise objectives - ! runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: iBasin ! basin loop counter + integer(i4) :: iCell ! cell loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + integer(i4) :: nCells1 ! ncells1 of level 1 + real(dp) :: objective_et_basin ! basins wise objectives ! SM - real(dp), dimension(:,:), allocatable :: et_opti ! simulated evapotranspiration + real(dp), dimension(:, :), allocatable :: et_opti ! simulated evapotranspiration ! ! (dim1=ncells, dim2=time) - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp + +#ifdef MRM2MHM + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + ! runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff +#endif ! run mHM - call mHM_eval(parameterset, runoff=runoff, et_opti=et_opti) + call eval(parameterset, runoff = runoff, et_opti = et_opti) ! ----------------------------- ! EVAPOTRANSPIRATION ! ----------------------------- ! initialize some variables - objective_et = 0.0_dp + objective_et = 0.0_dp ! loop over basin - for applying power law later on do iBasin = 1, nBasins - ! init - objective_et_basin = 0.0_dp - ! get basin information - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - ! correlation signal is calculated on individual grid cells - invalid_cells = 0.0_dp - do iCell = s1, e1 - - ! check for enough data points in time for statistical calculations (e.g. mean, stddev) - if ( count(L1_et_mask(iCell,:)) .LE. (0.10_dp * real(size(L1_et, dim=2) ,dp)) ) then - invalid_cells = invalid_cells + 1.0_dp - cycle - end if - - ! calculate ojective function - objective_et_basin = objective_et_basin + & - kge( L1_et(iCell,:), et_opti(iCell,:), mask=L1_et_mask(iCell,:)) - end do - - ! user information about invalid cells - if (invalid_cells .GT. 0.5_dp) then - call message(' WARNING: objective_et: Detected invalid cells in study area (.LT. 10 valid data points).') - call message(' Fraction of invlauid cells: ', & - num2str(invalid_cells/real(nCells1,dp),'(F4.2)')) - end if - - ! calculate average soil moisture objective over all basins with power law - ! basins are weighted equally ( 1 / real(nBasin,dp))**6 - objective_et = objective_et + & - ( (1.0_dp - objective_et_basin / real(nCells1,dp)) / real(nBasins,dp) )**6 + ! init + objective_et_basin = 0.0_dp + ! get basin information + nCells1 = level1(iBasin)%nCells + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + + ! correlation signal is calculated on individual grid cells + invalid_cells = 0.0_dp + do iCell = s1, e1 + + ! check for enough data points in time for statistical calculations (e.g. mean, stddev) + if (count(L1_et_mask(iCell, :)) .LE. (0.10_dp * real(size(L1_et, dim = 2), dp))) then + invalid_cells = invalid_cells + 1.0_dp + cycle + end if + + ! calculate ojective function + objective_et_basin = objective_et_basin + & + kge(L1_et(iCell, :), et_opti(iCell, :), mask = L1_et_mask(iCell, :)) + end do + + ! user information about invalid cells + if (invalid_cells .GT. 0.5_dp) then + call message(' WARNING: objective_et: Detected invalid cells in study area (.LT. 10 valid data points).') + call message(' Fraction of invlauid cells: ', & + num2str(invalid_cells / real(nCells1, dp), '(F4.2)')) + end if + + ! calculate average soil moisture objective over all basins with power law + ! basins are weighted equally ( 1 / real(nBasin,dp))**6 + objective_et = objective_et + & + ((1.0_dp - objective_et_basin / real(nCells1, dp)) / real(nBasins, dp))**6 end do ! compromise solution - sixth root @@ -1583,22 +1617,22 @@ FUNCTION objective_kge_q_et(parameterset) ! ----------------------------- ! RUNOFF ! ----------------------------- + objective_q = 0.0_dp #ifdef MRM2MHM - nGaugesTotal = size(runoff, dim=2) + nGaugesTotal = size(runoff, dim = 2) - objective_q = 0.0_dp - do gg=1, nGaugesTotal + do gg = 1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) - ! KGE - objective_q = objective_q + & - ( (1.0_dp - kge(runoff_obs, runoff_agg, mask=runoff_obs_mask) )/ real(nGaugesTotal,dp) )**6 + ! KGE + objective_q = objective_q + & + ((1.0_dp - kge(runoff_obs, runoff_agg, mask = runoff_obs_mask)) / real(nGaugesTotal, dp))**6 end do - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) ! compromise solution - sixth root objective_q = objective_q**onesixth @@ -1609,10 +1643,10 @@ FUNCTION objective_kge_q_et(parameterset) #endif ! equal weighted compromise objective functions for discharge and soilmoisture - objective_kge_q_et = (objective_et**6 + objective_q**6 )**onesixth -! print*, "1-SM 2-Q : ", 1.0_dp-objective_sm, 1.0_dp-objective_kge ! MZMZMZMZ + objective_kge_q_et = (objective_et**6 + objective_q**6)**onesixth + ! print*, "1-SM 2-Q : ", 1.0_dp-objective_sm, 1.0_dp-objective_kge ! MZMZMZMZ - call message(' objective_kge_q_et = ', num2str(objective_kge_q_et,'(F9.5)')) + call message(' objective_kge_q_et = ', num2str(objective_kge_q_et, '(F9.5)')) END FUNCTION objective_kge_q_et @@ -1650,7 +1684,6 @@ END FUNCTION objective_kge_q_et ! RESTRICTIONS !> \note Input values must be floating points. \n !> Actually, \f$ KGE \f$ will be returned such that it can be minimized. \n - !> For TWS required at least 5 years of data! ! EXAMPLE ! para = (/ 1., 2, 3., -999., 5., 6. /) @@ -1665,223 +1698,222 @@ END FUNCTION objective_kge_q_et !> \author Johannes Brenner !> \date July 2017 - FUNCTION objective_kge_q_rmse_et(parameterset) - - use mo_init_states, only: get_basin_info - use mo_mhm_eval, only: mhm_eval - use mo_constants, only: eps_dp - use mo_errormeasures, only: kge, rmse - use mo_global_variables, only: nBasins, evalPer, timeStep_et_input, & - L1_et, L1_et_mask ! packed measured et, et-mask (dim1=ncells, dim2=time) - use mo_julian, only: caldat - use mo_message, only: message - use mo_mrm_constants, only: nodata_dp - use mo_moment, only: mean, average - use mo_temporal_aggregation, only: day2mon_average - use mo_standard_score, only: classified_standard_score - use mo_string_utils, only: num2str + FUNCTION objective_kge_q_rmse_et(parameterset, eval) + + use mo_errormeasures, only : rmse + use mo_common_variables, only : nBasins, level1 + use mo_common_mhm_mrm_variables, only : evalPer + use mo_global_variables, only : timeStep_et_input, & + L1_et, L1_et_mask ! packed measured et, et-mask (dim1=ncells, dim2=time) + use mo_julian, only : caldat + use mo_message, only : message + use mo_common_constants, only : nodata_dp, eps_dp + use mo_moment, only : mean, average + use mo_temporal_aggregation, only : day2mon_average + use mo_standard_score, only : classified_standard_score + use mo_string_utils, only : num2str #ifdef MRM2MHM - use mo_mrm_objective_function_runoff, only: extract_runoff + use mo_errormeasures, only : kge + use mo_mrm_objective_function_runoff, only : extract_runoff #endif implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_kge_q_rmse_et + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp) :: objective_kge_q_rmse_et ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - real(dp), allocatable, dimension(:,:) :: et_opti !JBJBJB ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: et_opti !JBJBJB ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: iTime ! time loop counter - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - integer(i4) :: s1, e1 ! start and end index for the current basin - integer(i4) :: nCells1 ! ncells1 of level 1 - integer(i4) :: gg, iBasin, pp, mmm ! gauges counter, basin counter, month counters - integer(i4) :: year, month, day - integer(i4) :: nGaugesTotal - real(dp), dimension(nBasins) :: initTime - - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff - - integer(i4) :: nMonths ! total number of months - integer(i4), dimension(:),allocatable :: month_classes ! vector with months' classes + integer(i4) :: iTime ! time loop counter + integer(i4) :: s1, e1 ! start and end index for the current basin + integer(i4) :: iBasin, pp, mmm ! basin counter, month counters + integer(i4) :: year, month, day + real(dp), dimension(nBasins) :: initTime + + integer(i4) :: nMonths ! total number of months + integer(i4), dimension(:), allocatable :: month_classes ! vector with months' classes ! - real(dp), dimension(:), allocatable :: et_sim_m, et_obs_m ! monthly values original time series - real(dp), dimension(:), allocatable :: et_sim_m_anom, et_obs_m_anom ! monthly values anomaly time series - logical, dimension(:), allocatable :: et_obs_m_mask ! - real(dp), dimension(:), allocatable :: rmse_et, kge_q ! rmse_et(nBasins), kge_q(nGaugesTotal) - real(dp) :: rmse_et_avg, kge_q_avg ! obj. functions - - real(dp), dimension(:), allocatable :: et_catch_avg_basin ! spatial average of observed et - real(dp), dimension(:), allocatable :: et_opti_catch_avg_basin ! spatial avergae of modeled et + real(dp), dimension(:), allocatable :: et_sim_m, et_obs_m ! monthly values original time series + real(dp), dimension(:), allocatable :: et_sim_m_anom, et_obs_m_anom ! monthly values anomaly time series + logical, dimension(:), allocatable :: et_obs_m_mask ! + real(dp), dimension(:), allocatable :: rmse_et ! kge_q(nGaugesTotal) + real(dp) :: rmse_et_avg, kge_q_avg ! obj. functions + + real(dp), dimension(:), allocatable :: et_catch_avg_basin ! spatial average of observed et + real(dp), dimension(:), allocatable :: et_opti_catch_avg_basin ! spatial avergae of modeled et !real(dp), dimension(:,:), allocatable :: et_opti ! simulated et ! ! (dim1=ncells, dim2=time) - logical, dimension(:), allocatable :: mask_times ! mask for valid et catchment avg time steps + logical, dimension(:), allocatable :: mask_times ! mask for valid et catchment avg time steps + +#ifdef MRM2MHM + real(dp), dimension(:), allocatable :: kge_q ! rmse_et(nBasins) + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + +#endif ! obtain simulation values of runoff (hourly) and ET ! for ET only valid cells (basins concatenated) ! et_opti: aggregate ET to needed time step for optimization (see timeStep_et_input) - call mHM_eval(parameterset, runoff=runoff, et_opti=et_opti) + call eval(parameterset, runoff = runoff, et_opti = et_opti) !-------------------------------------------- !! EVAPOTRANSPIRATION !-------------------------------------------- ! allocate - allocate( rmse_et(nBasins) ) + allocate(rmse_et(nBasins)) rmse_et(:) = nodata_dp do iBasin = 1, nBasins - ! get basin info - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, iStart=s1, iEnd=e1 ) - - ! allocate - allocate(mask_times (size(et_opti, dim=2))) - allocate(et_catch_avg_basin (size(et_opti, dim=2))) - allocate(et_opti_catch_avg_basin(size(et_opti, dim=2))) - - ! initalize - mask_times = .TRUE. - et_catch_avg_basin = nodata_dp - et_opti_catch_avg_basin = nodata_dp - - ! calculate catchment average evapotranspiration - do iTime = 1, size(et_opti, dim=2) - ! check for enough data points in time for correlation - if ( all(.NOT. L1_et_mask(s1:e1,iTime))) then - !write (*,*) 'WARNING: et data at time ', iTime, ' is empty.' - !call message('WARNING: objective_et_kge_catchment_avg: ignored currrent time step since less than') - !call message(' 10 valid cells available in evapotranspiration observation') - mask_times(iTime) = .FALSE. - cycle - end if - ! spatial average of observed ET - et_catch_avg_basin(iTime) = average( L1_et(s1:e1,iTime), mask=L1_et_mask(s1:e1,iTime)) - ! spatial avergae of modeled ET - et_opti_catch_avg_basin(iTime) = average(et_opti(s1:e1,iTime), mask=L1_et_mask(s1:e1,iTime)) - end do - - ! check for whether to proceed with this basin or not - ! potentially 3 years of data - !if (count(L1_et_mask) .lt. 365*3 ) then - ! call message('objective_kge_q_rmse_et: Length of et data of Basin ', trim(adjustl(num2str(iBasin))) , & - ! ' less than 3 years: these data are not considered') - ! cycle - ! else - ! get initial time of the evaluation period - initTime(iBasin) = real(evalPer(iBasin)%julStart,dp) - - ! get calendar days, months, year - call caldat(int(initTime(iBasin)), yy=year, mm=month, dd=day) - - ! if evapotranspiration input daily - select case(timeStep_et_input) - ! JBJBJB - ! daily: aggregate to monthly mean - case(-1) - ! calculate monthly averages from daily values of the model - call day2mon_average(et_opti_catch_avg_basin,year,month,day,et_sim_m, misval=nodata_dp) - ! calculate monthly averages from daily values of the observations - call day2mon_average(et_catch_avg_basin,year,month,day,et_obs_m, misval=nodata_dp) - ! - ! monthly: proceed without action - case(-2) - ! simulation - allocate( et_sim_m( size(et_opti, dim=2) ) ) - et_sim_m = et_opti_catch_avg_basin - ! observation - allocate( et_obs_m( size(et_opti, dim=2) ) ) - et_obs_m = et_catch_avg_basin - - ! yearly: ERROR stop program - case(-3) - call message('***ERROR: objective_kge_q_rmse_et: time step of evapotranspiration yearly.') - stop - end select - ! remove mean from modelled time series - et_sim_m(:) = et_sim_m(:) - mean(et_sim_m(:)) - ! remove mean from observed time series - et_obs_m(:) = et_obs_m(:) - mean(et_obs_m(:)) - ! get number of months for given basin - nMonths = size(et_obs_m) - allocate ( month_classes(nMonths) ) - allocate ( et_obs_m_mask(nMonths) ) - allocate ( et_obs_m_anom(nMonths) ) - allocate ( et_sim_m_anom(nMonths) ) - - month_classes(:) = 0 - et_obs_m_mask(:) = .TRUE. - et_obs_m_anom(:) = nodata_dp - et_sim_m_anom(:) = nodata_dp - - ! define months' classes - mmm = month - do pp = 1, nMonths - month_classes(pp) = mmm - if (mmm .LT. 12) then - mmm = mmm + 1 - else - mmm = 1 - end if - end do - ! double check missing data - ! define mask for missing data in observations (there are always data for simulations) - where( abs( et_obs_m - nodata_dp) .lt. eps_dp ) et_obs_m_mask = .FALSE. - - ! calculate standard score - et_obs_m_anom = classified_standard_score(et_obs_m, month_classes, mask = et_obs_m_mask) - et_sim_m_anom = classified_standard_score(et_sim_m, month_classes, mask = et_obs_m_mask) - rmse_et(iBasin) = rmse(et_sim_m_anom,et_obs_m_anom, mask = et_obs_m_mask) - - deallocate ( month_classes ) - deallocate ( et_obs_m ) - deallocate ( et_sim_m ) - deallocate ( et_obs_m_mask ) - deallocate ( et_sim_m_anom ) - deallocate ( et_obs_m_anom ) - !end if + ! get basin info + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + ! allocate + allocate(mask_times (size(et_opti, dim = 2))) + allocate(et_catch_avg_basin (size(et_opti, dim = 2))) + allocate(et_opti_catch_avg_basin(size(et_opti, dim = 2))) + + ! initalize + mask_times = .TRUE. + et_catch_avg_basin = nodata_dp + et_opti_catch_avg_basin = nodata_dp + + ! calculate catchment average evapotranspiration + do iTime = 1, size(et_opti, dim = 2) + ! check for enough data points in time for correlation + if (all(.NOT. L1_et_mask(s1 : e1, iTime))) then + !write (*,*) 'WARNING: et data at time ', iTime, ' is empty.' + !call message('WARNING: objective_et_kge_catchment_avg: ignored currrent time step since less than') + !call message(' 10 valid cells available in evapotranspiration observation') + mask_times(iTime) = .FALSE. + cycle + end if + ! spatial average of observed ET + et_catch_avg_basin(iTime) = average(L1_et(s1 : e1, iTime), mask = L1_et_mask(s1 : e1, iTime)) + ! spatial avergae of modeled ET + et_opti_catch_avg_basin(iTime) = average(et_opti(s1 : e1, iTime), mask = L1_et_mask(s1 : e1, iTime)) + end do + + ! get initial time of the evaluation period + initTime(iBasin) = real(evalPer(iBasin)%julStart, dp) + + ! get calendar days, months, year + call caldat(int(initTime(iBasin)), yy = year, mm = month, dd = day) + + ! if evapotranspiration input daily + select case(timeStep_et_input) + ! JBJBJB + ! daily: aggregate to monthly mean + case(-1) + ! calculate monthly averages from daily values of the model + call day2mon_average(et_opti_catch_avg_basin, year, month, day, et_sim_m, misval = nodata_dp) + ! calculate monthly averages from daily values of the observations + call day2mon_average(et_catch_avg_basin, year, month, day, et_obs_m, misval = nodata_dp) + ! + ! monthly: proceed without action + case(-2) + ! simulation + allocate(et_sim_m(size(et_opti, dim = 2))) + et_sim_m = et_opti_catch_avg_basin + ! observation + allocate(et_obs_m(size(et_opti, dim = 2))) + et_obs_m = et_catch_avg_basin + + ! yearly: ERROR stop program + case(-3) + call message('***ERROR: objective_kge_q_rmse_et: time step of evapotranspiration yearly.') + stop + end select + ! remove mean from modelled time series + et_sim_m(:) = et_sim_m(:) - mean(et_sim_m(:)) + ! remove mean from observed time series + et_obs_m(:) = et_obs_m(:) - mean(et_obs_m(:)) + ! get number of months for given basin + nMonths = size(et_obs_m) + allocate (month_classes(nMonths)) + allocate (et_obs_m_mask(nMonths)) + allocate (et_obs_m_anom(nMonths)) + allocate (et_sim_m_anom(nMonths)) + + month_classes(:) = 0 + et_obs_m_mask(:) = .TRUE. + et_obs_m_anom(:) = nodata_dp + et_sim_m_anom(:) = nodata_dp + + ! define months' classes + mmm = month + do pp = 1, nMonths + month_classes(pp) = mmm + if (mmm .LT. 12) then + mmm = mmm + 1 + else + mmm = 1 + end if + end do + ! double check missing data + ! define mask for missing data in observations (there are always data for simulations) + where(abs(et_obs_m - nodata_dp) .lt. eps_dp) et_obs_m_mask = .FALSE. + + ! calculate standard score + et_obs_m_anom = classified_standard_score(et_obs_m, month_classes, mask = et_obs_m_mask) + et_sim_m_anom = classified_standard_score(et_sim_m, month_classes, mask = et_obs_m_mask) + rmse_et(iBasin) = rmse(et_sim_m_anom, et_obs_m_anom, mask = et_obs_m_mask) + + deallocate (month_classes) + deallocate (et_obs_m) + deallocate (et_sim_m) + deallocate (et_obs_m_mask) + deallocate (et_sim_m_anom) + deallocate (et_obs_m_anom) + !end if end do - rmse_et_avg = sum( rmse_et(:), abs( rmse_et - nodata_dp) .gt. eps_dp ) / & - real(count( abs( rmse_et - nodata_dp) .gt. eps_dp),dp) + rmse_et_avg = sum(rmse_et(:), abs(rmse_et - nodata_dp) .gt. eps_dp) / & + real(count(abs(rmse_et - nodata_dp) .gt. eps_dp), dp) deallocate(rmse_et) !-------------------------------------------- !! RUNOFF !-------------------------------------------- + kge_q_avg = 0_dp #ifdef MRM2MHM - nGaugesTotal = size(runoff, dim=2) - allocate( kge_q(nGaugesTotal)) + nGaugesTotal = size(runoff, dim = 2) + allocate(kge_q(nGaugesTotal)) kge_q(:) = nodata_dp - do gg=1, nGaugesTotal - - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - - ! check for whether to proceed with this basin or not - ! potentially 3 years of data - !pp = count(runoff_agg .ge. 0.0_dp ) - !if (pp .lt. 365*3 ) then - ! deallocate (runoff_agg, runoff_obs, runoff_obs_mask) - ! cycle - ! else - ! calculate KGE for each basin: - kge_q(gg) = kge( runoff_obs, runoff_agg, mask=runoff_obs_mask) - deallocate (runoff_agg, runoff_obs, runoff_obs_mask) + do gg = 1, nGaugesTotal + + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + + ! check for whether to proceed with this basin or not + ! potentially 3 years of data + !pp = count(runoff_agg .ge. 0.0_dp ) + !if (pp .lt. 365*3 ) then + ! deallocate (runoff_agg, runoff_obs, runoff_obs_mask) + ! cycle + ! else + ! calculate KGE for each basin: + kge_q(gg) = kge(runoff_obs, runoff_agg, mask = runoff_obs_mask) + deallocate (runoff_agg, runoff_obs, runoff_obs_mask) ! end if end do ! calculate average KGE value for runoff - kge_q_avg = sum( kge_q(:), abs( kge_q - nodata_dp) .gt. eps_dp ) / & - real(count( abs( kge_q - nodata_dp) .gt. eps_dp ),dp) + kge_q_avg = sum(kge_q(:), abs(kge_q - nodata_dp) .gt. eps_dp) / & + real(count(abs(kge_q - nodata_dp) .gt. eps_dp), dp) deallocate(kge_q) #else call message('***ERROR: objective_kge_q_rmse_et: missing routing module for optimization') @@ -1889,9 +1921,9 @@ FUNCTION objective_kge_q_rmse_et(parameterset) #endif ! - objective_kge_q_rmse_et = rmse_et_avg * ( 1._dp - kge_q_avg ) + objective_kge_q_rmse_et = rmse_et_avg * (1._dp - kge_q_avg) - call message(' objective_kge_q_rmse_et = ', num2str(objective_kge_q_rmse_et,'(F9.5)')) + call message(' objective_kge_q_rmse_et = ', num2str(objective_kge_q_rmse_et, '(F9.5)')) END FUNCTION objective_kge_q_rmse_et @@ -1948,18 +1980,18 @@ END FUNCTION objective_kge_q_rmse_et ! Modified, Oct 2015, Stephan Thober - moved subroutine to objective_function_sm ! ------------------------------------------------------------------ - subroutine extract_basin_avg_tws( basinId, tws, tws_sim, tws_obs, tws_obs_mask ) + subroutine extract_basin_avg_tws(basinId, tws, tws_sim, tws_obs, tws_obs_mask) - use mo_global_variables, only: basin_avg_TWS_obs, nMeasPerDay_TWS, evalPer, warmingDays, nTstepDay - use mo_message, only: message - use mo_constants, only: eps_dp - use mo_mrm_constants, only: nodata_dp + use mo_global_variables, only : basin_avg_TWS_obs, nMeasPerDay_TWS + use mo_common_mhm_mrm_variables, only : evalPer, warmingDays, nTstepDay + use mo_message, only : message + use mo_common_constants, only : nodata_dp, eps_dp implicit none ! input variables - integer(i4), intent(in) :: basinId ! current basin Id - real(dp), dimension(:,:), intent(in) :: tws ! simulated basin average tws + integer(i4), intent(in) :: basinId ! current basin Id + real(dp), dimension(:, :), intent(in) :: tws ! simulated basin average tws ! output variables real(dp), dimension(:), allocatable, intent(out) :: tws_sim ! aggregated simulated @@ -1968,16 +2000,16 @@ subroutine extract_basin_avg_tws( basinId, tws, tws_sim, tws_obs, tws_obs_mask ) real(dp), dimension(:), allocatable, intent(out) :: tws_obs ! extracted measured ! tws to exactly the ! evaluation period - logical, dimension(:), allocatable, intent(out) :: tws_obs_mask ! mask of no data values + logical, dimension(:), allocatable, intent(out) :: tws_obs_mask ! mask of no data values ! in tws_obs ! local variables - integer(i4) :: iBasin ! basin id - integer(i4) :: tt ! timestep counter - integer(i4) :: length ! length of extracted time series - integer(i4) :: factor ! between simulated and measured time scale - integer(i4) :: TPD_sim ! simulated Timesteps per Day - integer(i4) :: TPD_obs ! observed Timesteps per Day + integer(i4) :: iBasin ! basin id + integer(i4) :: tt ! timestep counter + integer(i4) :: length ! length of extracted time series + integer(i4) :: factor ! between simulated and measured time scale + integer(i4) :: TPD_sim ! simulated Timesteps per Day + integer(i4) :: TPD_obs ! observed Timesteps per Day real(dp), dimension(:), allocatable :: dummy ! copy time resolution to local variables @@ -1985,46 +2017,45 @@ subroutine extract_basin_avg_tws( basinId, tws, tws_sim, tws_obs, tws_obs_mask ) TPD_obs = nMeasPerDay_TWS ! check if modelled timestep is an integer multiple of measured timesteps - if ( modulo( TPD_sim, TPD_obs) .eq. 0 ) then - factor = TPD_sim / TPD_obs + if (modulo(TPD_sim, TPD_obs) .eq. 0) then + factor = TPD_sim / TPD_obs else - call message(' Error: Number of modelled datapoints is no multiple of measured datapoints per day') - stop + call message(' Error: Number of modelled datapoints is no multiple of measured datapoints per day') + stop end if ! extract basin Id - iBasin = basin_avg_TWS_obs%basinId( basinId ) + iBasin = basin_avg_TWS_obs%basinId(basinId) ! get length of evaluation period times TPD_obs - length = ( evalPer( iBasin )%julEnd - evalPer( iBasin )%julStart + 1 ) * TPD_obs + length = (evalPer(iBasin)%julEnd - evalPer(iBasin)%julStart + 1) * TPD_obs ! extract measurements - if ( allocated( tws_obs ) ) deallocate( tws_obs ) - allocate( tws_obs( length ) ) - tws_obs = basin_avg_TWS_obs%TWS( 1 : length, basinId ) + if (allocated(tws_obs)) deallocate(tws_obs) + allocate(tws_obs(length)) + tws_obs = basin_avg_TWS_obs%TWS(1 : length, basinId) ! create mask of observed tws - if ( allocated( tws_obs_mask ) ) deallocate( tws_obs_mask ) - allocate( tws_obs_mask( length ) ) + if (allocated(tws_obs_mask)) deallocate(tws_obs_mask) + allocate(tws_obs_mask(length)) tws_obs_mask = .TRUE. - where( abs( tws_obs - nodata_dp) .lt. eps_dp ) tws_obs_mask = .FALSE. + where(abs(tws_obs - nodata_dp) .lt. eps_dp) tws_obs_mask = .FALSE. ! extract and aggregate simulated tws - if ( allocated( tws_sim ) ) deallocate( tws_sim ) - allocate( tws_sim( length ) ) + if (allocated(tws_sim)) deallocate(tws_sim) + allocate(tws_sim(length)) ! remove warming days - length = ( evalPer( iBasin )%julEnd - evalPer( iBasin )%julStart + 1 ) * TPD_sim - allocate( dummy( length ) ) - dummy = tws( warmingDays(iBasin)*TPD_sim + 1:warmingDays(iBasin)*TPD_sim + length, basinId ) + length = (evalPer(iBasin)%julEnd - evalPer(iBasin)%julStart + 1) * TPD_sim + allocate(dummy(length)) + dummy = tws(warmingDays(iBasin) * TPD_sim + 1 : warmingDays(iBasin) * TPD_sim + length, basinId) ! aggregate tws - length = ( evalPer( iBasin )%julEnd - evalPer( iBasin )%julStart + 1 ) * TPD_obs - forall(tt=1:length) tws_sim(tt) = sum( dummy( (tt-1)*factor+1: tt*factor ) ) / & - real(factor,dp) + length = (evalPer(iBasin)%julEnd - evalPer(iBasin)%julStart + 1) * TPD_obs + forall(tt = 1 : length) tws_sim(tt) = sum(dummy((tt - 1) * factor + 1 : tt * factor)) / & + real(factor, dp) ! clean up - deallocate( dummy ) + deallocate(dummy) end subroutine extract_basin_avg_tws - END MODULE mo_objective_function diff --git a/src/mHM/mo_pet.f90 b/src/mHM/mo_pet.f90 index bd354146..2e5cea10 100644 --- a/src/mHM/mo_pet.f90 +++ b/src/mHM/mo_pet.f90 @@ -14,7 +14,7 @@ MODULE mo_pet ! This module is for the UFZ CHS mesoscale hydrologic model mHM. - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE @@ -87,32 +87,32 @@ MODULE mo_pet elemental pure FUNCTION pet_hargreaves(HarSamCoeff, HarSamConst, tavg, tmax, tmin, latitude, doy) - use mo_constants, only: deg2rad_dp - use mo_utils, only: LE + use mo_constants, only : deg2rad_dp + use mo_utils, only : LE implicit none - real(dp), intent(in) :: HarSamCoeff ! coefficient of Hargreaves-Samani equation - real(dp), intent(in) :: HarSamConst ! constatnt of Hargreaves-Samani equation - real(dp), intent(in) :: tavg ! daily men temperature - real(dp), intent(in) :: tmax ! daily maximum of temp. - real(dp), intent(in) :: tmin ! daily minimum of temp. - real(dp), intent(in) :: latitude ! latitude of the cell for Ra estimation + real(dp), intent(in) :: HarSamCoeff ! coefficient of Hargreaves-Samani equation + real(dp), intent(in) :: HarSamConst ! constatnt of Hargreaves-Samani equation + real(dp), intent(in) :: tavg ! daily men temperature + real(dp), intent(in) :: tmax ! daily maximum of temp. + real(dp), intent(in) :: tmin ! daily minimum of temp. + real(dp), intent(in) :: latitude ! latitude of the cell for Ra estimation integer(i4), intent(in) :: doy ! day of year for Ra estimation - real(dp) :: pet_hargreaves ! reference evapotranspiration in [mm s-1] + real(dp) :: pet_hargreaves ! reference evapotranspiration in [mm s-1] ! local - real(dp) :: delta_temp ! tmax-Tmin + real(dp) :: delta_temp ! tmax-Tmin ! correction for shity input data (tmax \date Apr 2014 elemental pure FUNCTION pet_priestly(PrieTayParam, Rn, tavg) -! FUNCTION pet_priestly(PrieTayParam, Rn, tavg) + ! FUNCTION pet_priestly(PrieTayParam, Rn, tavg) - use mo_mhm_constants, only: DaySecs - use mo_constants, only: Psychro_dp, SpecHeatET_dp + use mo_common_constants, only : DaySecs + use mo_constants, only : Psychro_dp, SpecHeatET_dp implicit none real(dp), intent(in) :: PrieTayParam ! Priestley-Taylor coefficient real(dp), intent(in) :: Rn real(dp), intent(in) :: Tavg - real(dp) :: pet_priestly ! reference evapotranspiration in [mm s-1] + real(dp) :: pet_priestly ! reference evapotranspiration in [mm s-1] - real(dp) :: delta ! save slope of saturation vapor pressure curve + real(dp) :: delta ! save slope of saturation vapor pressure curve - delta = slope_satpressure(Tavg) ! slope of saturation vapor pressure curve + delta = slope_satpressure(Tavg) ! slope of saturation vapor pressure curve ! in [mm d-1] - pet_priestly = PrieTayParam * delta / (Psychro_dp + delta) * ( Rn * DaySecs / SpecHeatET_dp ) - - END FUNCTION pet_priestly + pet_priestly = PrieTayParam * delta / (Psychro_dp + delta) * (Rn * DaySecs / SpecHeatET_dp) + END FUNCTION pet_priestly ! ------------------------------------------------------------------ @@ -275,8 +274,8 @@ END FUNCTION pet_priestly elemental pure FUNCTION pet_penman(net_rad, tavg, act_vap_pressure, aerodyn_resistance, bulksurface_resistance, a_s, a_sh) - use mo_mhm_constants, only: DaySecs - use mo_constants, only: Psychro_dp, SpecHeatET_dp, rho0_dp, cp0_dp + use mo_common_constants, only : DaySecs + use mo_constants, only : Psychro_dp, SpecHeatET_dp, rho0_dp, cp0_dp implicit none @@ -287,13 +286,13 @@ elemental pure FUNCTION pet_penman(net_rad, tavg, act_vap_pressure, aerodyn_resi real(dp), intent(in) :: bulksurface_resistance ! bulk surface resistance real(dp), intent(in) :: a_s ! fraction of one-sided leaf area covered by stomata real(dp), intent(in) :: a_sh ! bulk surface resistance - real(dp) :: pet_penman ! reference evapotranspiration in [mm s-1] + real(dp) :: pet_penman ! reference evapotranspiration in [mm s-1] + + pet_penman = DaySecs / SpecHeatET_dp * & ! conversion factor [W m-2] to [mm d-1] + (slope_satpressure(tavg) * net_rad + & + rho0_dp * cp0_dp * (sat_vap_pressure(tavg) - act_vap_pressure) * a_sh / aerodyn_resistance) / & + (slope_satpressure(tavg) + Psychro_dp * a_sh / a_s * (1.0_dp + bulksurface_resistance / aerodyn_resistance)) - pet_penman = DaySecs / SpecHeatET_dp * & ! conversion factor [W m-2] to [mm d-1] - (slope_satpressure(tavg) * net_rad + & - rho0_dp * cp0_dp * (sat_vap_pressure(tavg) - act_vap_pressure ) * a_sh / aerodyn_resistance) / & - (slope_satpressure(tavg) + Psychro_dp * a_sh / a_s * (1.0_dp + bulksurface_resistance/aerodyn_resistance)) - END FUNCTION pet_penman ! ------------------------------------------------------------------ @@ -357,39 +356,40 @@ END FUNCTION pet_penman !> \date Apr 2014 ! Modified R. Kumar and M. Zink, June 2016 - correction to include NaN in acos(arg) - elemental pure FUNCTION extraterr_rad_approx(doy, latitude) + elemental pure FUNCTION extraterr_rad_approx(doy, latitude) - use mo_constants, only: SolarConst_dp, SpecHeatET_dp, PI_D, TWOPI_D - use mo_mhm_constants, only: DuffieDr, DuffieDelta1, DuffieDelta2, YearDays, DaySecs + use mo_constants, only : SolarConst_dp, SpecHeatET_dp, PI_D, TWOPI_D + use mo_common_constants, only : YearDays, DaySecs + use mo_mhm_constants, only : DuffieDr, DuffieDelta1, DuffieDelta2 - implicit none + implicit none - integer(i4), intent(in) :: doy - real(dp), intent(in) :: latitude ! latitude [rad] - real(dp) :: extraterr_rad_approx ! extraterrestrial radiation + integer(i4), intent(in) :: doy + real(dp), intent(in) :: latitude ! latitude [rad] + real(dp) :: extraterr_rad_approx ! extraterrestrial radiation ! local - real(dp) :: dr, delta - real(dp) :: omega - real(dp) :: arg - + real(dp) :: dr, delta + real(dp) :: omega + real(dp) :: arg + ! inverse relative distance Earth-Sun - correction for eccentricity of Earths orbit around the sun - dr = 1.0_dp + DuffieDr * cos( TWOPI_D * doy / YearDays ) + dr = 1.0_dp + DuffieDr * cos(TWOPI_D * doy / YearDays) ! declination of the sun above the celestial equator in radians - delta = DuffieDelta1 * sin( TWOPI_D * doy / YearDays - DuffieDelta2 ) + delta = DuffieDelta1 * sin(TWOPI_D * doy / YearDays - DuffieDelta2) ! arccos(x) is only defined between PI and 0 (for x between -1 and 1) ! check limits arg = - tan(latitude) * tan(delta) - if( arg .lt. -1.0_dp ) arg = -1.0_dp - if( arg .gt. 1.0_dp ) arg = 1.0_dp + if(arg .lt. -1.0_dp) arg = -1.0_dp + if(arg .gt. 1.0_dp) arg = 1.0_dp ! sunrise hour angle in radians - omega = acos( arg ) - + omega = acos(arg) + ! Ra - converted from [J m-2 d-1] in [mm d-1] - extraterr_rad_approx = DaySecs / PI_D / SpecHeatET_dp * SolarConst_dp * & - dr * (omega * sin(latitude) * sin(delta) + cos(latitude) * cos(delta) * sin(omega)) + extraterr_rad_approx = DaySecs / PI_D / SpecHeatET_dp * SolarConst_dp * & + dr * (omega * sin(latitude) * sin(delta) + cos(latitude) * cos(delta) * sin(omega)) end FUNCTION extraterr_rad_approx @@ -442,19 +442,18 @@ end FUNCTION extraterr_rad_approx !> \author Matthias Zink !> \date Apr 2014 ! - + elemental pure FUNCTION slope_satpressure(tavg) - use mo_mhm_constants, only: satpressureslope1, tetens_c3 + use mo_mhm_constants, only : satpressureslope1, tetens_c3 implicit none real(dp), intent(in) :: tavg ! average daily temperature - real(dp) :: slope_satpressure ! slope of saturation vapour pressure curve + real(dp) :: slope_satpressure ! slope of saturation vapour pressure curve + slope_satpressure = satpressureslope1 * sat_vap_pressure(tavg) / exp(2.0_dp * log(Tavg + tetens_c3)) - slope_satpressure = satpressureslope1 * sat_vap_pressure(tavg) / exp(2.0_dp*log(Tavg + tetens_c3)) - END FUNCTION slope_satpressure ! ------------------------------------------------------------------ @@ -505,12 +504,12 @@ END FUNCTION slope_satpressure elemental pure FUNCTION sat_vap_pressure(tavg) - use mo_mhm_constants, only: tetens_c1, tetens_c2, tetens_c3 + use mo_mhm_constants, only : tetens_c1, tetens_c2, tetens_c3 implicit none real(dp), intent(in) :: tavg ! temperature [degC] - real(dp) :: sat_vap_pressure ! saturation vapour pressure [kPa] + real(dp) :: sat_vap_pressure ! saturation vapour pressure [kPa] sat_vap_pressure = tetens_c1 * exp(tetens_c2 * tavg / (tavg + tetens_c3)) diff --git a/src/mHM/mo_prepare_gridded_lai.f90 b/src/mHM/mo_prepare_gridded_lai.f90 deleted file mode 100644 index 30b0a806..00000000 --- a/src/mHM/mo_prepare_gridded_lai.f90 +++ /dev/null @@ -1,285 +0,0 @@ -!> \file mo_prepare_gridded_LAI.f90 - -!> \brief Prepare daily LAI fields (e.g., MODIS data) for mHM - -!> \details Prepare daily LAI fields(e.g., MODIS data) for mHM - -!> \authors John Craven & Rohini Kumar -!> \date Aug 2013 - -MODULE mo_prepare_gridded_LAI - - ! This module provides routines to read daily gridded LAI data. - - ! Written John Craven & Rohini Kumar, August 2013 - ! Modified from mo_meteo_forcings - - USE mo_kind, ONLY: i4, dp - - IMPLICIT NONE - - PRIVATE - - PUBLIC :: prepare_gridded_daily_LAI_data - PUBLIC :: prepare_gridded_mean_monthly_LAI_data - - ! ------------------------------------------------------------------ - -CONTAINS - - ! ------------------------------------------------------------------ - - ! NAME - ! prepare_gridded_daily_LAI_data - - ! PURPOSE - !> \brief Prepare gridded daily LAI data - - !> \details Prepare gridded daily LAI data at Level-0 (e.g., using MODIS datasets) - - ! CALLING SEQUENCE - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" Basin Id - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - - ! EXAMPLE - - ! LITERATURE - ! None - - ! HISTORY - !> \author John Craven & Rohini Kumar - !> \date Aug 2013 - ! Modified Matthias Cuntz & Juliane Mai, Nov 2014 - use meteo reading routines - ! - subroutine prepare_gridded_daily_LAI_data(iBasin) - - use mo_global_variables, only: dirgridded_LAI, inputFormat_gridded_LAI, & - simPer, L0_gridded_LAI, timeStep_LAI_input - use mo_init_states, only: get_basin_info ! get basin information - use mo_append, only: append ! append vector - use mo_read_meteo, only: read_meteo_bin ! Read binary files - use mo_read_forcing_nc, only: read_forcing_nc ! Read netCDF files - - implicit none - ! input - integer(i4), intent(in) :: iBasin ! Basin Id - !local variables - ! basin info. - integer(i4) :: nrows0, ncols0 - logical, dimension(:,:), allocatable :: mask0 - integer(i4) :: ncells0 - ! - real(dp), dimension(:,:,:), allocatable :: LAI0_3D !data at level-0 [nRow X nCols X nTimeSteps] - real(dp), dimension(:,:), allocatable :: LAI0_2D !data at level-0 [nCells X nTimeSteps] - - integer(i4) :: nTimeSteps - integer(i4) :: t - - ! get basic basin information at level-0 - call get_basin_info( iBasin, 0, nRows0, nCols0, nCells=nCells0, mask=mask0 ) - - ! select case depending on input data format - SELECT CASE( trim(inputFormat_gridded_LAI) ) - - ! netcdf file input option - CASE('nc') - CALL read_forcing_nc( dirgridded_LAI(iBasin), nRows0, nCols0, simPer(iBasin), & - 'lai', LAI0_3D, mask0, lower=0.0_dp, upper=30.0_dp, nctimestep=timeStep_LAI_input) - ! bin file input option - CASE('bin') - CALL read_meteo_bin( dirgridded_LAI(iBasin), nRows0, nCols0, simPer(iBasin), & - LAI0_3D, mask0, lower=0.0_dp, upper=30.0_dp) - CASE DEFAULT - stop '***ERROR: Not recognized input format' - - END SELECT - - ! pack variables - nTimeSteps = size(LAI0_3D, 3) - allocate( LAI0_2D(nCells0, nTimeSteps)) - - do t = 1, nTimeSteps - LAI0_2D(:,t) = pack( LAI0_3D(:,:,t), MASK=mask0(:,:) ) - end do - - ! append to Global variable - call append(L0_gridded_LAI, LAI0_2D(:,:) ) - - !free space - deallocate(LAI0_2D, LAI0_3D) - - -end subroutine prepare_gridded_daily_LAI_data - - ! ------------------------------------------------------------------ - - ! NAME - ! prepare_gridded_mean_monthly_LAI_data - - ! PURPOSE - !> \brief prepare_gridded_mean_monthly_LAI_data - - !> \details Long term mean monthly gridded LAI data at Level-0 (e.g., using MODIS datasets)\n - !> The netcdf file should contain 12 (calender months) gridded fields of climatological \n - !> LAI data at the input L0 data resolution. - - ! CALLING SEQUENCE - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" Basin Id - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - - ! EXAMPLE - - ! LITERATURE - ! None - - ! HISTORY - !> \author Rohini Kumar - !> \date Dec 2016 - ! - subroutine prepare_gridded_mean_monthly_LAI_data(iBasin) - - use mo_global_variables, only: dirgridded_LAI, L0_gridded_LAI - use mo_init_states, only: get_basin_info ! get basin information - use mo_append, only: append ! append vector - use mo_ncread, only: Get_NcDim, Get_NcVar, Get_NcVarAtt - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_utils, only: eq - - implicit none - ! input - integer(i4), intent(in) :: iBasin ! Basin Id - !local variables - ! basin info. - integer(i4) :: nrows0, ncols0 - logical, dimension(:,:), allocatable :: mask0 - integer(i4) :: ncells0 - ! - real(dp), dimension(:,:,:), allocatable :: LAI0_3D !data at level-0 [nRow X nCols X nTimeSteps] - real(dp), dimension(:,:), allocatable :: LAI0_2D !data at level-0 [nCells X nTimeSteps] - - integer(i4) :: nTimeSteps - integer(i4) :: t - - ! - character(256) :: fName ! name of NetCDF file - character(256) :: AttValues ! netcdf attribute values - integer(i4) :: datatype ! datatype of attribute - integer(i4), dimension(5) :: dimen ! dimension for NetCDF file - real(dp) :: nodata_value ! data nodata value - - - - ! get basic basin information at level-0 - call get_basin_info( iBasin, 0, nRows0, nCols0, nCells=nCells0, mask=mask0 ) - - fName = trim( dirgridded_LAI(iBasin) ) // trim('lai.nc') - - ! get dimensions - dimen = Get_NcDim( trim(fName), 'lai' ) - if ( (dimen(1) .ne. nRows0) .or. (dimen(2) .ne. nCols0) ) then - stop '***ERROR: read_forcing_nc: mHM generated x and y are not matching NetCDF dimensions' - end if - if ( dimen(3) .ne. 12 ) then - stop '***ERROR: read_forcing_nc: the time dimenion of LAI NetCDF file under the option-1 is not 12' - end if - - - ! determine no data value - call Get_NcVarAtt( trim(fName), 'lai', '_FillValue', AttValues, dtype=datatype) - ! convert to number - read(AttValues, *) nodata_value - - call Get_NcVar( trim(fName), 'lai', LAI0_3D ) - - ! start checking values - do t = 1, dimen(3) - ! checking for naodata values if optional nocheck is given - if (any(eq(LAI0_3D(:,:,t),nodata_value) .and. (mask0))) then - call message('***ERROR: read_forcing_nc: nodata value within basin ') - call message(' boundary in variable: ', 'lai') - call message(' at timestep : ', trim(num2str(t))) - stop - end if - ! optional check - if ( any( (LAI0_3D(:,:,t) .lt. 0.0_dp) .AND. mask0(:,:) ) ) then - call message('***ERROR: read_forcing_nc: values in variable lai are lower than ', trim(num2str(0,'(F7.2)')) ) - call message(' at timestep : ', trim(num2str(t))) - call message('File: ', trim(fName)) - call message('Minval at timestep: ', trim(num2str(minval(LAI0_3D(:,:,t)),'(F7.2)'))) - call message('Total minval: ', trim(num2str(minval(LAI0_3D(:,:,:)),'(F7.2)'))) - stop - end if - - if ( any( (LAI0_3D(:,:,t) .gt. 30.0_dp) .AND. mask0(:,:) ) ) then - call message('***ERROR: read_forcing_nc: values in variable lai are greater than ', trim(num2str(30,'(F7.2)')) ) - call message(' at timestep : ', trim(num2str(t))) - call message('File: ', trim(fName)) - call message('Maxval at timestep: ', trim(num2str(maxval(LAI0_3D(:,:,t)),'(F7.2)'))) - call message('Total maxval: ', trim(num2str(maxval(LAI0_3D(:,:,:)),'(F7.2)'))) - stop - end if - end do - - ! pack variables - nTimeSteps = size(LAI0_3D, 3) - allocate( LAI0_2D(nCells0, nTimeSteps)) - do t = 1, nTimeSteps - LAI0_2D(:,t) = pack( LAI0_3D(:,:,t), MASK=mask0(:,:) ) - end do - - ! append to Global variable - call append(L0_gridded_LAI, LAI0_2D(:,:) ) - - !free space - deallocate(LAI0_2D, LAI0_3D) - - -end subroutine prepare_gridded_mean_monthly_LAI_data - - -END MODULE mo_prepare_gridded_LAI diff --git a/src/mHM/mo_read_config.f90 b/src/mHM/mo_read_config.f90 deleted file mode 100644 index e293b4c5..00000000 --- a/src/mHM/mo_read_config.f90 +++ /dev/null @@ -1,1551 +0,0 @@ -!> \file mo_read_config.f90 - -!> \brief Reading of main model configurations. - -!> \details This routine reads the configurations of mHM including, input and -!> output directories, module usage specification, simulation time periods, -!> global parameters, ... - -!> \authors Matthias Zink -!> \date Dec 2012 - -MODULE mo_read_config - - USE mo_kind, ONLY: i4, dp - - IMPLICIT NONE - - PRIVATE - - PUBLIC :: read_config ! read main directories - - ! ------------------------------------------------------------------ - -CONTAINS - - ! ------------------------------------------------------------------ - - ! NAME - ! read_config - - ! PURPOSE - !> \brief Read main configurations for mHM - - !> \details The main configurations in mHM are read from three files: - !>
    - !>
  1. mhm.nml - !>
  2. mhm_parameters.nml - !>
  3. mhm_outputs.nml - !>
- !> For details please refer to the above mentioned namelist files. - - ! CALLING SEQUENCE - ! None - - ! INDENT(IN) - ! None - - ! INDENT(INOUT) - ! None - - ! INDENT(OUT) - ! None - - ! INDENT(IN), OPTIONAL - ! None - - ! INDENT(INOUT), OPTIONAL - ! None - - ! INDENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Matthias Zink - !> \date Dec 2012 - ! Modified Luis Samaniego, Jan 2013 - messages - ! Rohini Kumar - ! Matthias Cuntz, Jan 2013 - namelist consolidation and positioning - ! Matthias Zink, Jan 2013 - bug fix, added gaugeinfo reading - ! Rohini Kumar, Jun 2013 - added restart flags - ! R. Kumar & - ! S. Thober, Aug. 2013 - code change to incorporate output timestep - ! during writing of the netcdf file - ! Rohini Kumar, Aug 2013 - name changed from "inputFormat" to inputFormat_meteo_forcings - ! Rohini Kumar, Aug 2013 - added dirSoil_LUT and dirGeology_LUT, and changed in - ! namelist made accordingly - ! Rohini Kumar, Aug 2013 - added new namelist for LAI related datasets, and changed in - ! within the code made accordingly - ! Matthias Zink, Aug 2013 - changed read in for land cover period - ! Juliane Mai, Oct 2013 - adding global_parameters_name - ! Matthias Zink, Nov 2013 - edited documentation and included DEFAULT cases for ptocess Matrix - ! Stephan Thober, Nov 2013 - added read of directories where latitude longitude fields are located - ! Matthias Zink, Feb 2014 - added multiple options for PET process - ! Matthias Zink, Mar 2014 - added inflow from upstream areas and gauge information as namelist - ! Rohini Kumar, May 2014 - added options for the model run coordinate system - ! Stephan Thober, May 2014 - added switch for chunk read in - ! Stephan Thober, Jun 2014 - added option for switching off mpr - ! Matthias Cuntz & Juliane Mai Nov 2014 - LAI input from daily, monthly or yearly files - ! Matthias Zink, Dec 2014 - adopted inflow gauges to ignore headwater cells - ! Matthias Zink, Mar 2015 - added optional soil moisture read in for calibration - ! Matthias Cuntz, Jul 2015 - removed adjustl from trim(adjustl()) of Geoparams for PGI compatibilty - ! Stephan Thober, Aug 2015 - added read_config_routing and read_routing_params from mRM - ! Oldrich Rakovec, Oct 2015 - added reading of the basin average TWS data - ! Rohini Kumar, Mar 2016 - options to handle different soil databases - ! Stephan Thober, Nov 2016 - moved nProcesses and processMatrix to common variables - ! Rohini Kumar, Dec 2016 - option to handle monthly mean gridded fields of LAI - ! M.Zink & M. Cuneyd Demirel Mar 2017 - Added Jarvis soil water stress function at SM process(3) - ! M.C. Demirel & Simon Stisen Apr 2017 - Added FC dependency on root fraction coefficient (ET) at SM process(3) - ! Robert Schweppe Dec 2017 - switched from fractional julian day to integer - - - subroutine read_config() - - use mo_julian, only: julday, caldat - use mo_append, only: append - use mo_message, only: message - use mo_utils, only: EQ - use mo_string_utils, only: num2str - use mo_nml, only: open_nml, close_nml, position_nml - use mo_constants, only: eps_dp ! epsilon(1.0) in double precision - use mo_mhm_constants, only: & - nodata_i4, nodata_dp, & ! nodata values - nColPars, & ! number of properties of the global variables - maxNoSoilHorizons, & ! maximum number of allowed soil layers - maxNoBasins, & ! maximum number of allowed basins - maxNLcovers, & ! maximum number of allowed LCover scenes - maxGeoUnit ! maximum number of allowed geological classes - use mo_file, only: & - file_namelist, unamelist, & ! file containing main configurations - file_namelist_param, unamelist_param, & ! file containing parameter values - file_defOutput, udefOutput ! file specifying which output to write - use mo_global_variables, only: & - timestep, & ! model time step - period, & ! data structure for period - timestep_model_inputs, & ! read input frequency - resolutionHydrology, & ! resolutions of hydrology - resolutionRouting, & ! resolution of routing - L0_Basin, & ! L0_Basin ID - dirMorpho, dirLCover, & ! input directory of morphological - dirPrecipitation, dirTemperature, & ! directory of meteo input - dirReferenceET, & ! PET input path if process 5 is 'PET is input' (case 0) - dirMinTemperature, dirMaxTemperature, & ! PET input paths if process 5 is Hargreaves-Samani (case 1) - dirNetRadiation, & ! PET input paths if process 5 is Priestely-Taylor (case 2) - dirabsVapPressure, dirwindspeed, & ! PET input paths if process 5 is Penman-Monteith (case 3) - inputFormat_meteo_forcings, & ! input format either bin or nc - fileLatLon, & ! directory of latitude and longitude files - dirConfigOut, & ! configuration run output directory - dirCommonFiles, & ! directory where common files are located - dirOut, & ! output directory basin wise - dirRestartOut, & ! output directory of restart file basin wise - dirRestartIn, & ! input directory of restart file basin wise - dirgridded_LAI, & ! directory where gridded LAI is located - dirSoil_moisture, timeStep_sm_input, & ! directory and time stepping of soil moisture data - nSoilHorizons_sm_input, & ! No. of mhm soil horizons equivalent to soil moisture input - basin_avg_TWS_obs, & ! basin avg TWS data - fileTWS, & ! directory with basin average tws data - dirNeutrons, timeStep_neutrons_input, & ! directory where neutron data is located - dirEvapotranspiration, timeStep_et_input, & ! directory and time stepping of evapotranspiration data - iFlag_soilDB, & ! options to handle different types of soil databases - HorizonDepth_mHM, nSoilHorizons_mHM, tillageDepth, & ! soil horizons info for mHM - fracSealed_cityArea, nLcoverScene, & ! land cover information - LCfilename, LCyearId, & ! - nBasins, & ! number of basins - read_restart, & ! flag reading restart - write_restart, & ! flag writing restart - perform_mpr, & ! switch for performing mpr - warmingDays, warmPer, & ! warming days and warming period - evalPer, simPer, & ! model eval. & sim. periods - ! ! (sim. = wrm. + eval.) - evap_coeff, & ! pan evaporation - read_meteo_weights, & ! flag for read meteo weights - fday_prec, fnight_prec, fday_pet, & ! day-night fraction - fnight_pet, fday_temp, fnight_temp, & ! day-night fraction - timeStep_model_outputs, & ! timestep for writing model outputs - outputFlxState, & ! definition which output to write - inputFormat_gridded_LAI, & ! format of gridded LAI data(bin or nc) - timeStep_LAI_input, & ! time step of gridded LAI input - iFlag_cordinate_sys, & ! model run cordinate system - project_details, & ! project including funding instituion., PI, etc. - setup_description, & ! any specific description of simulation - simulation_type, & ! e.g. seasonal forecast, climate projection, ... - Conventions, & ! convention used for dataset - contact, & ! contact details, incl. PI name, modellers - mHM_details, & ! developing institution, version, specific mHM revision - history ! details on version/creation date - - use mo_common_variables, only: & - nProcesses, processMatrix, & ! process configuration - global_parameters, & ! global parameters - global_parameters_name, & ! clear names of global parameters - optimize, & ! if mhm runs in optimization mode or not - optimize_restart, & ! Optimization will be restarted from - ! ! mo_.restart file (.true.) - opti_method, & ! optimization algorithm used - opti_function, & ! objective function to be optimized - nIterations, & ! number of iterations in optimization - seed, & ! seed used for optimization - dds_r, & ! DDS: perturbation rate - sa_temp, & ! SA: initial temperature - sce_ngs, sce_npg, sce_nps, & ! SCE: # complexes, # points per complex, - ! ! # points per subcomplex - mcmc_opti, & ! MCMC: if optimization mode of MCMC or only uncertainty estimation - mcmc_error_params ! parameters of error model used in likelihood - - implicit none - ! LOCAL variables - ! PARAMETERS - integer(i4), dimension(nProcesses) :: processCase ! Choosen process description number - real(dp), dimension(5, nColPars) :: dummy_2d_dp = nodata_dp ! space holder for routing parameters - real(dp), dimension(1, nColPars) :: dummy_2d_dp_2 = nodata_dp ! space holder for routing parameters - ! interception - real(dp), dimension(nColPars) :: canopyInterceptionFactor - ! snow - real(dp), dimension(nColPars) :: snowTreshholdTemperature - real(dp), dimension(nColPars) :: degreeDayFactor_forest - real(dp), dimension(nColPars) :: degreeDayFactor_impervious - real(dp), dimension(nColPars) :: degreeDayFactor_pervious - real(dp), dimension(nColPars) :: increaseDegreeDayFactorByPrecip - real(dp), dimension(nColPars) :: maxDegreeDayFactor_forest - real(dp), dimension(nColPars) :: maxDegreeDayFactor_impervious - real(dp), dimension(nColPars) :: maxDegreeDayFactor_pervious - ! soilmoisture - real(dp), dimension(nColPars) :: orgMatterContent_forest - real(dp), dimension(nColPars) :: orgMatterContent_impervious - real(dp), dimension(nColPars) :: orgMatterContent_pervious - real(dp), dimension(nColPars) :: PTF_lower66_5_constant - real(dp), dimension(nColPars) :: PTF_lower66_5_clay - real(dp), dimension(nColPars) :: PTF_lower66_5_Db - real(dp), dimension(nColPars) :: PTF_higher66_5_constant - real(dp), dimension(nColPars) :: PTF_higher66_5_clay - real(dp), dimension(nColPars) :: PTF_higher66_5_Db - real(dp), dimension(nColPars) :: infiltrationShapeFactor - real(dp), dimension(nColPars) :: PTF_Ks_constant - real(dp), dimension(nColPars) :: PTF_Ks_sand - real(dp), dimension(nColPars) :: PTF_Ks_clay - real(dp), dimension(nColPars) :: PTF_Ks_curveSlope - real(dp), dimension(nColPars) :: rootFractionCoefficient_forest - real(dp), dimension(nColPars) :: rootFractionCoefficient_impervious - real(dp), dimension(nColPars) :: rootFractionCoefficient_pervious - real(dp), dimension(nColPars) :: jarvis_sm_threshold_c1 - real(dp), dimension(nColPars) :: rootFractionCoefficient_sand - real(dp), dimension(nColPars) :: rootFractionCoefficient_clay - - ! directRunoff - real(dp), dimension(nColPars) :: imperviousStorageCapacity - ! PET0 - real(dp), dimension(nColPars) :: PET_a_forest - real(dp), dimension(nColPars) :: PET_a_impervious - real(dp), dimension(nColPars) :: PET_a_pervious - real(dp), dimension(nColPars) :: PET_b - real(dp), dimension(nColPars) :: PET_c - real(dp), dimension(nColPars) :: minCorrectionFactorPET - real(dp), dimension(nColPars) :: maxCorrectionFactorPET - real(dp), dimension(nColPars) :: aspectTresholdPET - real(dp), dimension(nColPars) :: HargreavesSamaniCoeff - real(dp), dimension(nColPars) :: PriestleyTaylorCoeff - real(dp), dimension(nColPars) :: PriestleyTaylorLAIcorr - real(dp), dimension(nColPars) :: canopyheigth_forest - real(dp), dimension(nColPars) :: canopyheigth_impervious - real(dp), dimension(nColPars) :: canopyheigth_pervious - real(dp), dimension(nColPars) :: displacementheight_coeff - real(dp), dimension(nColPars) :: roughnesslength_momentum_coeff - real(dp), dimension(nColPars) :: roughnesslength_heat_coeff - real(dp), dimension(nColPars) :: stomatal_resistance - ! interflow - real(dp), dimension(nColPars) :: interflowStorageCapacityFactor - real(dp), dimension(nColPars) :: interflowRecession_slope - real(dp), dimension(nColPars) :: fastInterflowRecession_forest - real(dp), dimension(nColPars) :: slowInterflowRecession_Ks - real(dp), dimension(nColPars) :: exponentSlowInterflow - ! percolation - real(dp), dimension(nColPars) :: rechargeCoefficient - real(dp), dimension(nColPars) :: rechargeFactor_karstic - real(dp), dimension(nColPars) :: gain_loss_GWreservoir_karstic - ! routing moved to mRM - ! neutrons - real(dp), dimension(nColPars) :: Desilets_N0 - real(dp), dimension(nColPars) :: COSMIC_N0 - real(dp), dimension(nColPars) :: COSMIC_N1 - real(dp), dimension(nColPars) :: COSMIC_N2 - real(dp), dimension(nColPars) :: COSMIC_alpha0 - real(dp), dimension(nColPars) :: COSMIC_alpha1 - real(dp), dimension(nColPars) :: COSMIC_L30 - real(dp), dimension(nColPars) :: COSMIC_L31 - - integer(i4) :: ii, iBasin, n_true_pars - integer(i4) :: nGeoUnits ! number of geological classes for parameter read-in - real(dp) :: cellFactorRbyH ! conversion factor L11 to L1 - - ! some dummy arrays for namelist read in (allocatables not allowed in namelists) - character(256) :: dummy - - integer(i4),dimension(maxNoSoilHorizons) :: soil_Depth ! depth of the single horizons - character(256), dimension(maxNoBasins) :: dir_Morpho - character(256), dimension(maxNoBasins) :: dir_LCover - character(256), dimension(maxNoBasins) :: dir_Precipitation - character(256), dimension(maxNoBasins) :: dir_Temperature - character(256), dimension(maxNoBasins) :: dir_MinTemperature - character(256), dimension(maxNoBasins) :: dir_MaxTemperature - character(256), dimension(maxNoBasins) :: dir_NetRadiation - character(256), dimension(maxNoBasins) :: dir_windspeed - character(256), dimension(maxNoBasins) :: dir_absVapPressure - character(256), dimension(maxNoBasins) :: dir_ReferenceET - character(256), dimension(maxNoBasins) :: dir_Out - character(256), dimension(maxNoBasins) :: dir_RestartOut - character(256), dimension(maxNoBasins) :: dir_RestartIn - character(256), dimension(maxNoBasins) :: file_LatLon - character(256), dimension(maxNoBasins) :: dir_gridded_LAI ! directory of gridded LAI data - ! ! used when timeStep_LAI_input<0 - character(256), dimension(maxNoBasins) :: dir_soil_moisture ! soil moisture input - character(256), dimension(maxNoBasins) :: file_TWS ! total water storage input file - character(256), dimension(maxNoBasins) :: dir_neutrons ! ground albedo neutron input - character(256), dimension(maxNoBasins) :: dir_evapotranspiration ! ground albedo neutron input - - ! - integer(i4) :: nLCover_scene ! given number of land cover scenes - integer(i4), dimension(maxNLCovers) :: LCoverYearStart ! starting year LCover - integer(i4), dimension(maxNLCovers) :: LCoverYearEnd ! ending year LCover - character(256), dimension(maxNLCovers) :: LCoverfName ! filename of Lcover file - real(dp), dimension(maxGeoUnit, nColPars) :: GeoParam ! geological parameters - ! - integer(i4) :: jday - integer(i4), dimension(maxNoBasins) :: warming_Days - type(period), dimension(maxNoBasins) :: eval_Per - integer(i4), dimension(maxNoBasins) :: time_step_model_inputs - ! - real(dp), dimension(maxNoBasins) :: resolution_Hydrology - real(dp), dimension(maxNoBasins) :: resolution_Routing - integer(i4), dimension(maxNoBasins) :: L0Basin - - ! define namelists - ! namelist directories - namelist /project_description/ project_details, setup_description, simulation_type, & - Conventions, contact, mHM_details, history - namelist /directories_general/ dirConfigOut, dirCommonFiles, & - dir_Morpho, dir_LCover, & - dir_Out, dir_RestartOut, & - dir_RestartIn, file_LatLon - namelist /directories_mHM/ inputFormat_meteo_forcings, & - dir_Precipitation, dir_Temperature, dir_ReferenceET, dir_MinTemperature, & - dir_MaxTemperature, dir_absVapPressure, dir_windspeed, & - dir_NetRadiation, dir_gridded_LAI - ! optional data used for optimization - namelist /optional_data/ & - dir_soil_moisture, & - nSoilHorizons_sm_input, & - timeStep_sm_input, & - file_TWS, & - dir_neutrons, & - dir_evapotranspiration, & - timeStep_et_input - ! namelist spatial & temporal resolution, otmization information - namelist /mainconfig/ timestep, iFlag_cordinate_sys, resolution_Hydrology, resolution_Routing, & - L0Basin, optimize, optimize_restart, opti_method, opti_function, nBasins, read_restart, & - write_restart, perform_mpr - ! namelist for time settings - namelist /time_periods/ warming_Days, eval_Per, time_step_model_inputs - ! namelist soil layering - namelist /soilLayer/ iFlag_soilDB, tillageDepth, nSoilHorizons_mHM, soil_Depth - ! namelist for land cover scenes - namelist/LCover/fracSealed_cityArea,nLcover_scene,LCoverYearStart,LCoverYearEnd,LCoverfName - ! namelist for LAI related data - namelist /LAI_data_information/ inputFormat_gridded_LAI, timeStep_LAI_input - ! namelist for pan evaporation - namelist/panEvapo/evap_coeff - ! namelist for night-day ratio of precipitation, referenceET and temperature - namelist/nightDayRatio/read_meteo_weights,fnight_prec,fnight_pet,fnight_temp - ! namelsit process selection - namelist /processSelection/ processCase - ! namelist parameters - namelist /interception1/ canopyInterceptionFactor - namelist /snow1/snowTreshholdTemperature, degreeDayFactor_forest, degreeDayFactor_impervious, & - degreeDayFactor_pervious, increaseDegreeDayFactorByPrecip, maxDegreeDayFactor_forest, & - maxDegreeDayFactor_impervious, maxDegreeDayFactor_pervious - namelist/soilmoisture1/ orgMatterContent_forest, orgMatterContent_impervious, orgMatterContent_pervious, & - PTF_lower66_5_constant, PTF_lower66_5_clay, PTF_lower66_5_Db, PTF_higher66_5_constant, & - PTF_higher66_5_clay, PTF_higher66_5_Db, PTF_Ks_constant, & - PTF_Ks_sand, PTF_Ks_clay, PTF_Ks_curveSlope, & - rootFractionCoefficient_forest, rootFractionCoefficient_impervious, & - rootFractionCoefficient_pervious, infiltrationShapeFactor - namelist/soilmoisture2/ orgMatterContent_forest, orgMatterContent_impervious, orgMatterContent_pervious, & - PTF_lower66_5_constant, PTF_lower66_5_clay, PTF_lower66_5_Db, PTF_higher66_5_constant, & - PTF_higher66_5_clay, PTF_higher66_5_Db, PTF_Ks_constant, & - PTF_Ks_sand, PTF_Ks_clay, PTF_Ks_curveSlope, & - rootFractionCoefficient_forest, rootFractionCoefficient_impervious, & - rootFractionCoefficient_pervious, infiltrationShapeFactor, jarvis_sm_threshold_c1 - namelist/soilmoisture3/ orgMatterContent_forest, orgMatterContent_impervious, orgMatterContent_pervious, & - PTF_lower66_5_constant, PTF_lower66_5_clay, PTF_lower66_5_Db, PTF_higher66_5_constant, & - PTF_higher66_5_clay, PTF_higher66_5_Db, PTF_Ks_constant, & - PTF_Ks_sand, PTF_Ks_clay, PTF_Ks_curveSlope, & - rootFractionCoefficient_forest, rootFractionCoefficient_impervious, & - rootFractionCoefficient_pervious, infiltrationShapeFactor, jarvis_sm_threshold_c1, & - rootFractionCoefficient_sand, rootFractionCoefficient_clay - - namelist /directRunoff1/ imperviousStorageCapacity - ! PET is input, LAI driven correction - namelist /PETminus1/ PET_a_forest, PET_a_impervious, PET_a_pervious, PET_b, PET_c - ! PET is input, aspect driven correction - namelist /PET0/ minCorrectionFactorPET, maxCorrectionFactorPET, aspectTresholdPET - ! Hargreaves-Samani - namelist /PET1/ minCorrectionFactorPET, maxCorrectionFactorPET, aspectTresholdPET, HargreavesSamaniCoeff - ! Priestely-Taylor - namelist /PET2/ PriestleyTaylorCoeff, PriestleyTaylorLAIcorr - ! Penman-Monteith - namelist /PET3/ canopyheigth_forest, canopyheigth_impervious, canopyheigth_pervious, displacementheight_coeff, & - roughnesslength_momentum_coeff, roughnesslength_heat_coeff, stomatal_resistance - namelist /interflow1/ interflowStorageCapacityFactor, interflowRecession_slope, fastInterflowRecession_forest, & - slowInterflowRecession_Ks, exponentSlowInterflow - namelist /percolation1/ rechargeCoefficient, rechargeFactor_karstic, gain_loss_GWreservoir_karstic - namelist /neutrons1/ Desilets_N0, COSMIC_N0, COSMIC_N1, COSMIC_N2, COSMIC_alpha0, COSMIC_alpha1, COSMIC_L30, COSMIC_L31 - ! - namelist /geoparameter/ GeoParam - ! name list regarding output - namelist/NLoutputResults/timeStep_model_outputs, outputFlxState - ! namelist for optimization settings - namelist/Optimization/ nIterations, seed, dds_r, sa_temp, sce_ngs, sce_npg, sce_nps, mcmc_opti, mcmc_error_params - - !=============================================================== - ! Read namelist main directories - !=============================================================== - call open_nml(file_namelist, unamelist, quiet=.true.) - - !=============================================================== - ! Read namelist specifying the project description - !=============================================================== - call position_nml('project_description', unamelist) - read(unamelist, nml=project_description) - - !=============================================================== - ! Read namelist specifying the model configuration - !=============================================================== - call position_nml('mainconfig', unamelist) - read(unamelist, nml=mainconfig) - - if (nBasins .GT. maxNoBasins) then - call message() - call message('***ERROR: Number of basins is resticted to ', trim(num2str(maxNoBasins)),'!') - stop - end if - ! allocate patharray sizes - allocate(resolutionHydrology(nBasins)) - allocate(resolutionRouting(nBasins)) - allocate(L0_Basin(nBasins)) - allocate(dirMorpho(nBasins)) - allocate(dirLCover(nBasins)) - allocate(dirPrecipitation(nBasins)) - allocate(dirTemperature(nBasins)) - allocate(dirwindspeed(nBasins)) - allocate(dirabsVapPressure(nBasins)) - allocate(dirReferenceET(nBasins)) - allocate(dirMinTemperature(nBasins)) - allocate(dirMaxTemperature(nBasins)) - allocate(dirNetRadiation(nBasins)) - allocate(dirOut(nBasins)) - allocate(dirRestartOut(nBasins)) - allocate(dirRestartIn(nBasins)) - allocate(fileLatLon(nBasins)) - allocate(dirgridded_LAI(nBasins)) - allocate(dirSoil_Moisture(nBasins)) - allocate(dirNeutrons(nBasins)) - allocate(fileTWS(nBasins)) - ! - resolutionHydrology = resolution_Hydrology(1:nBasins) - resolutionRouting = resolution_Routing(1:nBasins) - L0_Basin = L0Basin(1:nBasins) - ! - ! check for possible options - if( .NOT. (iFlag_cordinate_sys == 0 .OR. iFlag_cordinate_sys == 1) ) then - call message() - call message('***ERROR: coordinate system for the model run should be 0 or 1') - stop - end if - ! check for optimize and read restart - if ( ( read_restart ) .and. ( optimize ) ) then - call message() - call message('***ERROR: cannot read states from restart file when optimizing') - stop - end if - ! check for perform_mpr and read restart - if ( ( read_restart ) .and. ( perform_mpr ) ) then - call message() - call message('***WARNING: MPR has no effect when reading states from restart file') - call message(' MPR should only be activated if a land cover change occurs.') - end if - if ( ( .not. read_restart ) .and. ( .not. perform_mpr ) ) then - call message() - call message('***ERROR: cannot omit mpr when read_restart is set to .false.') - stop - end if - - ! allocate time periods - allocate(simPer(nBasins)) - allocate(evalPer(nBasins)) - allocate(warmingDays(nBasins)) - allocate(warmPer(nBasins)) - allocate(timestep_model_inputs(nBasins)) - - !=============================================================== - ! read simulation time periods incl. warming days - !=============================================================== - call position_nml('time_periods', unamelist) - read(unamelist, nml=time_periods) - warmingDays = warming_Days(1:nBasins) - evalPer = eval_Per(1:nBasins) - timestep_model_inputs = time_step_model_inputs(1:nBasins) - - ! consistency check for timestep_model_inputs - if ( any( timestep_model_inputs .ne. 0 ) .and. & - .not. all( timestep_model_inputs .ne. 0 ) ) then - call message() - call message('***ERROR: timestep_model_inputs either have to be all zero or all non-zero') - stop - end if - ! check for optimzation and timestep_model_inputs options - if ( optimize .and. ( any(timestep_model_inputs .ne. 0) ) ) then - call message() - call message('***ERROR: optimize and chunk read is switched on! (set timestep_model_inputs to zero)') - stop - end if - - !=============================================================== - ! determine simulation time period incl. warming days for each - ! basin - !=============================================================== - do ii = 1, nBasins - ! julian days for evaluation period - jday = julday(dd=evalPer(ii)%dStart, mm=evalPer(ii)%mStart, yy=evalPer(ii)%yStart) - evalPer(ii)%julStart = jday - - jday = julday(dd=evalPer(ii)%dEnd, mm=evalPer(ii)%mEnd, yy=evalPer(ii)%yEnd) - evalPer(ii)%julEnd = jday - - ! determine warming period - warmPer(ii)%julStart = evalPer(ii)%julStart - warmingDays(ii) - warmPer(ii)%julEnd = evalPer(ii)%julStart - 1 - - call caldat(warmPer(ii)%julStart, dd=warmPer(ii)%dStart, mm=warmPer(ii)%mStart, yy=warmPer(ii)%yStart) - call caldat(warmPer(ii)%julEnd, dd=warmPer(ii)%dEnd, mm=warmPer(ii)%mEnd, yy=warmPer(ii)%yEnd) - - ! sumulation Period = warming Period + evaluation Period - simPer(ii)%dStart = warmPer(ii)%dStart - simPer(ii)%mStart = warmPer(ii)%mStart - simPer(ii)%yStart = warmPer(ii)%yStart - simPer(ii)%julStart = warmPer(ii)%julStart - simPer(ii)%dEnd = evalPer(ii)%dEnd - simPer(ii)%mEnd = evalPer(ii)%mEnd - simPer(ii)%yEnd = evalPer(ii)%yEnd - simPer(ii)%julEnd = evalPer(ii)%julEnd - end do - - !=============================================================== - ! Read namelist for mainpaths - !=============================================================== - call position_nml('directories_general', unamelist) - read(unamelist, nml=directories_general) - call position_nml('directories_mHM', unamelist) - read(unamelist, nml=directories_mHM) - - dirMorpho = dir_Morpho(1:nBasins) - dirLCover = dir_LCover(1:nBasins) - dirPrecipitation = dir_Precipitation(1:nBasins) - dirTemperature = dir_Temperature(1:nBasins) - dirReferenceET = dir_ReferenceET(1:nBasins) - dirMinTemperature = dir_MinTemperature(1:nBasins) - dirMaxTemperature = dir_MaxTemperature(1:nBasins) - dirNetRadiation = dir_NetRadiation(1:nBasins) - dirwindspeed = dir_windspeed(1:nBasins) - dirabsVapPressure = dir_absVapPressure(1:nBasins) - dirOut = dir_Out(1:nBasins) - dirRestartOut = dir_RestartOut(1:nBasins) - dirRestartIn = dir_RestartIn(1:nBasins) - fileLatLon = file_LatLon(1:nBasins) - dirgridded_LAI = dir_gridded_LAI(1:nBasins) - - ! counter checks -- soil horizons - if (nSoilHorizons_mHM .GT. maxNoSoilHorizons) then - call message() - call message('***ERROR: Number of soil horizons is resticted to ', trim(num2str(maxNoSoilHorizons)),'!') - stop - end if - - !=============================================================== - ! Read soil layering information - !=============================================================== - call position_nml('soillayer', unamelist) - read(unamelist, nml=soillayer) - - allocate( HorizonDepth_mHM(nSoilHorizons_mHM) ) - HorizonDepth_mHM(:) = 0.0_dp - - if( iFlag_soilDB .eq. 0 ) then - ! classical mhm soil database - HorizonDepth_mHM(1:nSoilHorizons_mHM-1) = soil_Depth(1:nSoilHorizons_mHM-1) - else if( iFlag_soilDB .eq. 1 ) then - ! for option-1 where horizon specific information are taken into consideration - HorizonDepth_mHM(1:nSoilHorizons_mHM) = soil_Depth(1:nSoilHorizons_mHM) - else - call message() - call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') - stop - end if - - ! some consistency checks for the specification of the tillage depth - if(iFlag_soilDB .eq. 1) then - if( count( abs(HorizonDepth_mHM(:) - tillageDepth) .lt. eps_dp ) .eq. 0 ) then - call message() - call message('***ERROR: Soil tillage depth must conform with one of the specified horizon (lower) depth.') - stop - end if - end if - - !=============================================================== - ! Read namelist of optional input data - !=============================================================== - call position_nml('optional_data', unamelist) - read(unamelist, nml=optional_data) - ! soil moisture - dirSoil_moisture = dir_Soil_moisture(1:nBasins) - if ( nSoilHorizons_sm_input .GT. nSoilHorizons_mHM ) then - call message() - call message('***ERROR: Number of soil horizons representative for input soil moisture exceeded') - call message(' defined number of soil horizions: ', adjustl(trim(num2str(maxNoSoilHorizons))),'!') - stop - end if - ! neutrons - dirNeutrons = dir_neutrons(1:nBasins) - timeStep_neutrons_input = -1 ! daily, hard-coded, to be flexibilized - ! evapotranspiration - dirEvapotranspiration = dir_evapotranspiration(1:nBasins) - - !=============================================================== - ! Read evaluation basin average TWS data - !=============================================================== - fileTWS = file_TWS (1:nBasins) - - allocate(basin_avg_TWS_obs%basinId(nBasins)); basin_avg_TWS_obs%basinId = nodata_i4 - allocate(basin_avg_TWS_obs%fName (nBasins)); basin_avg_TWS_obs%fName(:)= num2str(nodata_i4) - - do iBasin = 1, nBasins - if (trim(fileTWS(iBasin)) .EQ. trim(num2str(nodata_i4))) then - call message() - call message('***ERROR: mhm.nml: Filename of evaluation TWS data ', & - ' for subbasin ', trim(adjustl(num2str(iBasin))), & - ' is not defined!') - call message(' Error occured in namelist: evaluation_tws') - stop - end if - - basin_avg_TWS_obs%basinId(iBasin) = iBasin - basin_avg_TWS_obs%fname(iBasin) = trim(file_TWS(iBasin)) - end do - - !=============================================================== - ! Read process selection list - !=============================================================== - call position_nml('processselection', unamelist) - read(unamelist, nml=processSelection) - - !=============================================================== - ! Read land cover information - !=============================================================== - call position_nml('LCover', unamelist) - read(unamelist, nml=LCover) - - !=============================================================== - ! Read LAI related information - !=============================================================== - call position_nml('LAI_data_information', unamelist) - read(unamelist, nml=LAI_data_information) - - if (timeStep_LAI_input .ne. 0) then - if ( (timeStep_LAI_input .ne. -1) .and. (trim(inputFormat_gridded_LAI) .eq. 'bin') ) then - call message() - call message('***ERROR: Gridded LAI input in bin format must be daily.') - stop - end if - if (timeStep_LAI_input .GT. 1) then - call message() - call message('***ERROR: option for selected timeStep_LAI_input not coded yet') - stop - end if - end if - - !=============================================================== - ! Read night-day ratios and pan evaporation - !=============================================================== - ! Evap. coef. for free-water surfaces - call position_nml('panEvapo', unamelist) - read(unamelist, nml=panEvapo) - ! namelist for night-day ratio of precipitation, referenceET and temperature - call position_nml('nightDayRatio', unamelist) - read(unamelist, nml=nightDayRatio) - ! - fday_prec = 1.0_dp - fnight_prec - fday_pet = 1.0_dp - fnight_pet - fday_temp = -1.0_dp * fnight_temp - - !=============================================================== - ! determine land cover periods - !=============================================================== - ! countercheck if land cover covers simulation period - if (LCoverYearStart(1) .GT. minval(evalPer(1:nBasins)%yStart) ) then - call message() - call message('***ERROR: Land cover for warming period is missing!') - call message(' FILE: mhm.nml, namelist: LCover') - call message(' SimStart : ', trim(num2str(minval(evalPer(1:nBasins)%yStart)))) - call message(' LCoverStart: ', trim(num2str(LCoverYearStart(1)))) - stop - end if - if (LCoverYearEnd(nLcover_scene) .LT. maxval(evalPer(1:nBasins)%yEnd) ) then - call message() - call message('***ERROR: Land cover period shorter than modelling period!') - call message(' FILE: mhm.nml, namelist: LCover') - call message(' SimEnd : ', trim(num2str(maxval(evalPer(1:nBasins)%yEnd)))) - call message(' LCoverEnd: ', trim(num2str(LCoverYearEnd(nLcover_scene)))) - stop - end if - ! - allocate(LCYearId(minval(simPer(1:nBasins)%yStart):maxval(simPer(1:nBasins)%yEnd),nBasins)) - LCYearId = nodata_i4 - do iBasin = 1, nBasins - do ii = 1, nLcover_scene - ! land cover before model period ! land cover after model period - if ((LCoverYearEnd(ii) .LT. evalPer(iBasin)%yStart) .OR. & - (LCoverYearStart(ii) .GT. evalPer(iBasin)%yEnd)) then - cycle - else if ((LCoverYearStart(ii) .LE. evalPer(iBasin)%yStart) .AND. & - (LCoverYearEnd(ii) .GE. evalPer(iBasin)%yEnd)) then - LCyearId(simPer(iBasin)%yStart:simPer(iBasin)%yEnd, iBasin) = ii - exit - else if ((LCoverYearStart(ii) .LE. evalPer(iBasin)%yStart) .AND. & - (LCoverYearEnd(ii) .LT. evalPer(iBasin)%yEnd)) then - LCyearId(simPer(iBasin)%yStart:LCoverYearEnd(ii), iBasin) = ii - else if ((LCoverYearStart(ii) .GT. evalPer(iBasin)%yStart) .AND. & - (LCoverYearEnd(ii) .GE. evalPer(iBasin)%yEnd)) then - LCyearId(LCoverYearStart(ii):simPer(iBasin)%yEnd, iBasin) = ii - else - LCyearId(LCoverYearStart(ii):LCoverYearEnd(ii), iBasin) = ii - end if - end do - end do - ! - ! correct number of input land cover scenes to number of needed scenes - nLCoverScene = maxval(LCyearId, mask = (LCyearId .gt. nodata_i4) ) - & - minval(LCyearId, mask = (LCyearId .gt. nodata_i4) ) + 1 - ! put land cover scenes to corresponding file name and LuT - allocate(LCfilename(nLCoverScene)) - LCfilename(:) = LCoverfName( minval(LCyearId, mask = ( LCyearId .gt. nodata_i4 ) ) : & - maxval(LCyearId)) - ! update the ID's - ! use next line because of Intel11 bug: LCyearId = LCyearId - minval(LCyearId) + 1 - LCyearId(:,:) = LCyearId(:,:) - minval(LCyearId, mask = ( LCyearId .gt. nodata_i4 ) ) + 1 - ! - if ( maxval( simPer(1:nBasins)%julStart ) .eq. minval( simPer(1:nBasins)%julStart) .and. & - maxval( simPer(1:nBasins)%julEnd ) .eq. minval( simPer(1:nBasins)%julEnd ) ) then - if (any(LCyearId .EQ. nodata_i4)) then - call message() - call message('***ERROR: Intermidiate land cover period is missing!') - call message(' FILE: mhm.nml, namelist: LCover') - stop - end if - else - call message() - call message('***WARNING: No check on missing land cover period is performed!') - end if - ! - !=============================================================== - ! check matching of resolutions: hydrology, forcing and routing - !=============================================================== - ! - do ii = 1, nBasins - cellFactorRbyH = resolutionRouting(ii) / resolutionHydrology(ii) - call message() - call message('Basin ', trim(adjustl(num2str(ii))), ': ') - call message('resolution Hydrology (basin ', trim(adjustl(num2str(ii))), ') = ', & - trim(adjustl(num2str(resolutionHydrology(ii))))) - call message('resolution Routing (basin ', trim(adjustl(num2str(ii))), ') = ', & - trim(adjustl(num2str(resolutionRouting(ii))))) - ! - if( nint(cellFactorRbyH * 100.0_dp) .eq. 100) then - call message() - call message('Resolution of routing and hydrological modeling are equal!') - - else if ( nint(cellFactorRbyH * 100.0_dp) .lt. 100) then - call message() - call message('***ERROR: Resolution of routing is smaller than hydrological model resolution!') - call message(' FILE: mhm.nml, namelist: mainconfig, variable: resolutionRouting') - STOP - - else if ( nint(cellFactorRbyH * 100.0_dp) .gt. 100) then - if( nint(mod(cellFactorRbyH, 2.0_dp) * 100.0_dp) .ne. 0) then - call message() - call message('***ERROR: Resolution of routing is not a multiple of hydrological model resolution!') - call message(' FILE: mhm.nml, namelist: mainconfig, variable: resolutionRouting') - STOP - end if - ! - call message() - call message('Resolution of routing is bigger than hydrological model resolution by ', & - trim(adjustl(num2str(nint(cellFactorRbyH)))), ' times !') - end if - ! - end do - !=============================================================== - ! Read namelist global parameters - !=============================================================== - call open_nml(file_namelist_param, unamelist_param, quiet=.true.) - processMatrix = 0_i4 - ! decide which parameters to read depending on specified processes - - ! Process 1 - interception - select case (processCase(1)) - ! 1 - maximum Interception - case(1) - call position_nml('interception1', unamelist_param) - read(unamelist_param, nml=interception1) - - processMatrix(1, 1) = processCase(1) - processMatrix(1, 2) = 1_i4 - processMatrix(1, 3) = 1_i4 - call append(global_parameters, reshape(canopyInterceptionFactor,(/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'canopyInterceptionFactor'/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "interception1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "interception" does not exist!') - stop - end select - - ! Process 2 - snow - select case (processCase(2)) - ! 1 - degree-day approach - case(1) - call position_nml('snow1', unamelist_param) - read(unamelist_param, nml=snow1) - - processMatrix(2, 1) = processCase(2) - processMatrix(2, 2) = 8_i4 - processMatrix(2, 3) = sum(processMatrix(1:2, 2)) - call append(global_parameters, reshape(snowTreshholdTemperature, (/1, nColPars/))) - call append(global_parameters, reshape(degreeDayFactor_forest, (/1, nColPars/))) - call append(global_parameters, reshape(degreeDayFactor_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(degreeDayFactor_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(increaseDegreeDayFactorByPrecip, (/1, nColPars/))) - call append(global_parameters, reshape(maxDegreeDayFactor_forest, (/1, nColPars/))) - call append(global_parameters, reshape(maxDegreeDayFactor_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(maxDegreeDayFactor_pervious, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'snowTreshholdTemperature ', & - 'degreeDayFactor_forest ', & - 'degreeDayFactor_impervious ', & - 'degreeDayFactor_pervious ', & - 'increaseDegreeDayFactorByPrecip', & - 'maxDegreeDayFactor_forest ', & - 'maxDegreeDayFactor_impervious ', & - 'maxDegreeDayFactor_pervious '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "snow1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "snow" does not exist!') - stop - end select - - ! Process 3 - soilmoisture - select case (processCase(3)) - - ! 1 - Feddes equation for PET reduction, bucket approach, Brooks-Corey like - case(1) - call position_nml('soilmoisture1', unamelist_param) - read(unamelist_param, nml=soilmoisture1) - processMatrix(3, 1) = processCase(3) - processMatrix(3, 2) = 17_i4 - processMatrix(3, 3) = sum(processMatrix(1:3, 2)) - call append(global_parameters, reshape(orgMatterContent_forest, (/1, nColPars/))) - call append(global_parameters, reshape(orgMatterContent_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(orgMatterContent_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_Db, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_Db, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_sand, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_curveSlope, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_forest, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(infiltrationShapeFactor, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'orgMatterContent_forest ', & - 'orgMatterContent_impervious ', & - 'orgMatterContent_pervious ', & - 'PTF_lower66_5_constant ', & - 'PTF_lower66_5_clay ', & - 'PTF_lower66_5_Db ', & - 'PTF_higher66_5_constant ', & - 'PTF_higher66_5_clay ', & - 'PTF_higher66_5_Db ', & - 'PTF_Ks_constant ', & - 'PTF_Ks_sand ', & - 'PTF_Ks_clay ', & - 'PTF_Ks_curveSlope ', & - 'rootFractionCoefficient_forest ', & - 'rootFractionCoefficient_impervious', & - 'rootFractionCoefficient_pervious ', & - 'infiltrationShapeFactor '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "soilmoisture1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - ! 2- Jarvis equation for PET reduction, bucket approach, Brooks-Corey like - case(2) - call position_nml('soilmoisture2', unamelist_param) - read(unamelist_param, nml=soilmoisture2) - processMatrix(3, 1) = processCase(3) - processMatrix(3, 2) = 18_i4 - processMatrix(3, 3) = sum(processMatrix(1:3, 2)) - call append(global_parameters, reshape(orgMatterContent_forest, (/1, nColPars/))) - call append(global_parameters, reshape(orgMatterContent_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(orgMatterContent_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_Db, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_Db, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_sand, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_curveSlope, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_forest, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(infiltrationShapeFactor, (/1, nColPars/))) - call append(global_parameters, reshape(jarvis_sm_threshold_c1, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'orgMatterContent_forest ', & - 'orgMatterContent_impervious ', & - 'orgMatterContent_pervious ', & - 'PTF_lower66_5_constant ', & - 'PTF_lower66_5_clay ', & - 'PTF_lower66_5_Db ', & - 'PTF_higher66_5_constant ', & - 'PTF_higher66_5_clay ', & - 'PTF_higher66_5_Db ', & - 'PTF_Ks_constant ', & - 'PTF_Ks_sand ', & - 'PTF_Ks_clay ', & - 'PTF_Ks_curveSlope ', & - 'rootFractionCoefficient_forest ', & - 'rootFractionCoefficient_impervious', & - 'rootFractionCoefficient_pervious ', & - 'infiltrationShapeFactor ', & - 'jarvis_sm_threshold_c1 '/)) - - - ! 3- Jarvis equation for ET reduction and FC dependency on root fraction coefficient - case(3) - call position_nml('soilmoisture3', unamelist_param) - read(unamelist_param, nml=soilmoisture3) - processMatrix(3, 1) = processCase(3) - processMatrix(3, 2) = 20_i4 - processMatrix(3, 3) = sum(processMatrix(1:3, 2)) - call append(global_parameters, reshape(orgMatterContent_forest, (/1, nColPars/))) - call append(global_parameters, reshape(orgMatterContent_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(orgMatterContent_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_lower66_5_Db, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_higher66_5_Db, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_constant, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_sand, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_clay, (/1, nColPars/))) - call append(global_parameters, reshape(PTF_Ks_curveSlope, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_forest, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(infiltrationShapeFactor, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_sand, (/1, nColPars/))) - call append(global_parameters, reshape(rootFractionCoefficient_clay, (/1, nColPars/))) - call append(global_parameters, reshape(jarvis_sm_threshold_c1, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'orgMatterContent_forest ', & - 'orgMatterContent_impervious ', & - 'orgMatterContent_pervious ', & - 'PTF_lower66_5_constant ', & - 'PTF_lower66_5_clay ', & - 'PTF_lower66_5_Db ', & - 'PTF_higher66_5_constant ', & - 'PTF_higher66_5_clay ', & - 'PTF_higher66_5_Db ', & - 'PTF_Ks_constant ', & - 'PTF_Ks_sand ', & - 'PTF_Ks_clay ', & - 'PTF_Ks_curveSlope ', & - 'rootFractionCoefficient_forest ', & - 'rootFractionCoefficient_impervious', & - 'rootFractionCoefficient_pervious ', & - 'infiltrationShapeFactor ', & - 'rootFractionCoefficient_sand ', & - 'rootFractionCoefficient_clay ', & - 'jarvis_sm_threshold_c1 '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "soilmoisture1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "soilmoisture" does not exist!') - stop - end select - - ! Process 4 - sealed area directRunoff - select case (processCase(4)) - ! 1 - bucket exceedance approach - case(1) - call position_nml('directRunoff1', unamelist_param) - read(unamelist_param, nml=directRunoff1) - processMatrix(4, 1) = processCase(4) - processMatrix(4, 2) = 1_i4 - processMatrix(4, 3) = sum(processMatrix(1:4, 2)) - call append(global_parameters, reshape(imperviousStorageCapacity, (/1, nColPars/))) - - call append(global_parameters_name, (/'imperviousStorageCapacity'/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "directRunoff1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "directRunoff" does not exist!') - stop - end select - - ! Process 5 - potential evapotranspiration (PET) - select case (processCase(5)) - case(-1) ! 0 - PET is input, correct PET by LAI - call position_nml('PETminus1', unamelist_param) - read(unamelist_param, nml=PETminus1) - processMatrix(5, 1) = processCase(5) - processMatrix(5, 2) = 5_i4 - processMatrix(5, 3) = sum(processMatrix(1:5, 2)) - call append(global_parameters, reshape(PET_a_forest, (/1, nColPars/))) - call append(global_parameters, reshape(PET_a_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(PET_a_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(PET_b, (/1, nColPars/))) - call append(global_parameters, reshape(PET_c, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'PET_a_forest ', & - 'PET_a_impervious ', & - 'PET_a_pervious ', & - 'PET_b ', & - 'PET_c '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "PETminus1" out of bound n ', & - trim(adjustl(file_namelist_param))) - stop - end if - - - case(0) ! 0 - PET is input, correct PET by aspect - call position_nml('PET0', unamelist_param) - read(unamelist_param, nml=PET0) - processMatrix(5, 1) = processCase(5) - processMatrix(5, 2) = 3_i4 - processMatrix(5, 3) = sum(processMatrix(1:5, 2)) - call append(global_parameters, reshape(minCorrectionFactorPET, (/1, nColPars/))) - call append(global_parameters, reshape(maxCorrectionFactorPET, (/1, nColPars/))) - call append(global_parameters, reshape(aspectTresholdPET, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'minCorrectionFactorPET ', & - 'maxCorrectionFactorPET ', & - 'aspectTresholdPET '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "PET0" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case(1) ! 1 - Hargreaves-Samani method (HarSam) - additional input needed: Tmin, Tmax - call position_nml('PET1', unamelist_param) - read(unamelist_param, nml=PET1) - processMatrix(5, 1) = processCase(5) - processMatrix(5, 2) = 4_i4 - processMatrix(5, 3) = sum(processMatrix(1:5, 2)) - call append(global_parameters, reshape(minCorrectionFactorPET, (/1, nColPars/))) - call append(global_parameters, reshape(maxCorrectionFactorPET, (/1, nColPars/))) - call append(global_parameters, reshape(aspectTresholdPET, (/1, nColPars/))) - call append(global_parameters, reshape(HargreavesSamaniCoeff, (/1, nColPars/))) - call append(global_parameters_name, (/ & - 'minCorrectionFactorPET', & - 'maxCorrectionFactorPET', & - 'aspectTresholdPET ', & - 'HargreavesSamaniCoeff '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "PET1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case(2) ! 2 - Priestley-Taylor method (PrieTay) - additional input needed: net_rad - ! check which LAI input is specified - if (timeStep_LAI_input .NE. 0) then - call message('***ERROR: The specified option of process 5 does only work with LAI from LUT.') - call message(' For process 5 the options 0 and 1 work with timeStep_LAI_input unequal to 0.') - stop - end if - - call position_nml('PET2', unamelist_param) - read(unamelist_param, nml=PET2) - processMatrix(5, 1) = processCase(5) - processMatrix(5, 2) = 2_i4 - processMatrix(5, 3) = sum(processMatrix(1:5, 2)) - call append(global_parameters, reshape(PriestleyTaylorCoeff, (/1, nColPars/))) - call append(global_parameters, reshape(PriestleyTaylorLAIcorr, (/1, nColPars/))) - call append(global_parameters_name, (/ & - 'PriestleyTaylorCoeff ', & - 'PriestleyTaylorLAIcorr'/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "PET2" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case(3) ! 3 - Penman-Monteith method - additional input needed: net_rad, abs. vapour pressue, windspeed - ! check which LAI input is specified - if (timeStep_LAI_input .NE. 0) then - call message('***ERROR: The specified option of process 5 does only work with LAI from LUT.') - call message(' For process 5 the options 0 and 1 work with timeStep_LAI_input unequal to 0.') - stop - end if - - call position_nml('PET3', unamelist_param) - read(unamelist_param, nml=PET3) - processMatrix(5, 1) = processCase(5) - processMatrix(5, 2) = 7_i4 - processMatrix(5, 3) = sum(processMatrix(1:5, 2)) - - call append(global_parameters, reshape(canopyheigth_forest, (/1, nColPars/))) - call append(global_parameters, reshape(canopyheigth_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(canopyheigth_pervious, (/1, nColPars/))) - call append(global_parameters, reshape(displacementheight_coeff, (/1, nColPars/))) - call append(global_parameters, reshape(roughnesslength_momentum_coeff, (/1, nColPars/))) - call append(global_parameters, reshape(roughnesslength_heat_coeff, (/1, nColPars/))) - call append(global_parameters, reshape(stomatal_resistance, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'canopyheigth_forest ', & - 'canopyheigth_impervious ', & - 'canopyheigth_pervious ', & - 'displacementheight_coeff ', & - 'roughnesslength_momentum_coeff', & - 'roughnesslength_heat_coeff ', & - 'stomatal_resistance '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "PET3" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "actualET" does not exist!') - stop - end select - - - ! Process 6 - interflow - select case (processCase(6)) - ! 1 - parallel soil reservoir approach - case(1) - call position_nml('interflow1', unamelist_param) - read(unamelist_param, nml=interflow1) - processMatrix(6, 1) = processCase(6) - processMatrix(6, 2) = 5_i4 - processMatrix(6, 3) = sum(processMatrix(1:6, 2)) - call append(global_parameters, reshape(interflowStorageCapacityFactor, (/1, nColPars/))) - call append(global_parameters, reshape(interflowRecession_slope, (/1, nColPars/))) - call append(global_parameters, reshape(fastInterflowRecession_forest, (/1, nColPars/))) - call append(global_parameters, reshape(slowInterflowRecession_Ks, (/1, nColPars/))) - call append(global_parameters, reshape(exponentSlowInterflow, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'interflowStorageCapacityFactor', & - 'interflowRecession_slope ', & - 'fastInterflowRecession_forest ', & - 'slowInterflowRecession_Ks ', & - 'exponentSlowInterflow '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "interflow1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "interflow" does not exist!') - stop - end select - - ! Process 7 - percolation - select case (processCase(7)) - ! 1 - GW layer is assumed as bucket - case(1) - call position_nml('percolation1', unamelist_param) - read(unamelist_param, nml=percolation1) - processMatrix(7, 1) = processCase(7) - processMatrix(7, 2) = 3_i4 - processMatrix(7, 3) = sum(processMatrix(1:7, 2)) - call append(global_parameters, reshape(rechargeCoefficient, (/1, nColPars/))) - call append(global_parameters, reshape(rechargeFactor_karstic, (/1, nColPars/))) - call append(global_parameters, reshape(gain_loss_GWreservoir_karstic, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'rechargeCoefficient ', & - 'rechargeFactor_karstic ', & - 'gain_loss_GWreservoir_karstic'/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "percolation1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "percolation" does not exist!') - stop - end select - - ! Process 8 - routing - select case (processCase(8)) - case(0) - ! 0 - deactivated - call message() - call message('***CAUTION: Routing is deativated! ') - - processMatrix(8, 1) = processCase(8) - processMatrix(8, 2) = 0_i4 - processMatrix(8, 3) = sum(processMatrix(1:8, 2)) - case(1) - ! parameter values and names are set in mRM - ! 1 - Muskingum approach -#ifndef MRM2MHM - call message('***ERROR processCase(8) equals 1, but MRM2MHM preprocessor flag is not given in Makefile') - stop -#endif - processMatrix(8, 1) = processCase(8) - processMatrix(8, 2) = 5_i4 - processMatrix(8, 3) = sum(processMatrix(1:8, 2)) - call append(global_parameters, dummy_2d_dp) - call append(global_parameters_name, (/'dummy', 'dummy', 'dummy', 'dummy', 'dummy'/)) - case(2) -#ifndef MRM2MHM - call message('***ERROR processCase(8) equals 1, but MRM2MHM preprocessor flag is not given in Makefile') - stop -#endif - processMatrix(8, 1) = processCase(8) - processMatrix(8, 2) = 1_i4 - processMatrix(8, 3) = sum(processMatrix(1:8, 2)) - call append(global_parameters, dummy_2d_dp_2) - call append(global_parameters_name, (/'dummy'/)) - case DEFAULT - call message() - call message('***ERROR: Process description for process "routing" does not exist!') - stop - end select - - !=============================================================== - ! Geological formations - !=============================================================== - dummy = dummy//'' ! only to avoid warning - - ! Process 9 - geoparameter - select case (processCase(9)) - case(1) - ! read in global parameters (NOT REGIONALIZED, i.e. these are and not ) for each geological formation used - call position_nml('geoparameter', unamelist_param) - GeoParam = nodata_dp - read(unamelist_param, nml=geoparameter) - - ! search number of geological parameters - do ii = 1, size(GeoParam, 1) ! no while loop to avoid risk of endless loop - if ( EQ(GeoParam(ii,1), nodata_dp) ) then - nGeoUnits = ii - 1 - exit - end if - end do - - ! for geology parameters - processMatrix(9,1) = processCase(9) - processMatrix(9,2) = nGeoUnits - processMatrix(9,3) = sum(processMatrix(1:9, 2)) - - call append(global_parameters, GeoParam(1:nGeoUnits,:)) - - ! create names - do ii=1, nGeoUnits - dummy = 'GeoParam('//trim(adjustl(num2str(ii)))//',:)' - call append(global_parameters_name, (/ trim(dummy) /)) - end do - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "geoparameter" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - - case DEFAULT - call message() - call message('***ERROR: Process description for process "geoparameter" does not exist!') - stop - end select - - ! Process 10 - neutrons - ! 0 - deactivated - ! 1 - inverse N0 based on Desilets et al. 2010 - ! 2 - COSMIC forward operator by Shuttlworth et al. 2013 - if (processCase(10) .gt. 0) then - - call position_nml('neutrons1', unamelist_param) - read(unamelist_param, nml=neutrons1) - - processMatrix(10, 1) = processCase(10) - processMatrix(10, 2) = 8_i4 - processMatrix(10, 3) = sum(processMatrix(1:10, 2)) - call append(global_parameters, reshape(Desilets_N0, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_N0, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_N1, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_N2, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_alpha0, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_alpha1, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_L30, (/1, nColPars/))) - call append(global_parameters, reshape(COSMIC_L31, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'Desilets_N0 ', & - 'COSMIC_N0 ', & - 'COSMIC_N1 ', & - 'COSMIC_N2 ', & - 'COSMIC_alpha0 ', & - 'COSMIC_alpha1 ', & - 'COSMIC_L30 ', & - 'COSMIC_L31 '/)) - - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "neutrons1" out of bound in ', & - trim(adjustl(file_namelist_param))) - stop - end if - else - call message(' INFO: Process (10, neutrons) is deactivated, so output will be suppressed.') - ! this is done below, where nml_output is read - processMatrix(10, 1) = processCase(10) - processMatrix(10, 2) = 0_i4 - processMatrix(10, 3) = sum(processMatrix(1:10, 2)) - end if - - call close_nml(unamelist_param) - - !=============================================================== - ! Settings for Optimization - !=============================================================== - call open_nml(file_namelist, unamelist, quiet=.true.) - ! namelist for Optimization settings - call position_nml('Optimization', unamelist) - read(unamelist, nml=Optimization) - call close_nml(unamelist) - ! check and set default values - if (nIterations .le. 0_i4) then - call message('Number of iterations for Optimization (nIterations) must be greater than zero') - stop - end if - if (dds_r .lt. 0.0_dp .or. dds_r .gt. 1.0_dp) then - call message('dds_r must be between 0.0 and 1.0') - stop - end if - if (sce_ngs .lt. 1_i4) then - call message ('number of complexes in SCE (sce_ngs) must be at least 1') - stop - end if - ! number of points in each complex: default = 2n+1 - if (sce_npg .lt. 0_i4) then - n_true_pars = count(nint(global_parameters(:,4)) .eq. 1) - sce_npg = 2 * n_true_pars + 1_i4 - end if - ! number of points in each sub-complex: default = n+1 - if (sce_nps .lt. 0_i4) then - n_true_pars = count(nint(global_parameters(:,4)) .eq. 1) - sce_nps = n_true_pars + 1_i4 - end if - if (sce_npg .lt. sce_nps) then - call message ('number of points per complex (sce_npg) must be greater or') - call message ('equal number of points per sub-complex (sce_nps)') - stop - end if - - call close_nml(unamelist) - - !=============================================================== - ! Read output specifications for mHM - !=============================================================== - call open_nml(file_defOutput, udefOutput, quiet=.true.) - outputFlxState = .FALSE. - call position_nml('NLoutputResults', udefOutput) - read(udefOutput, nml=NLoutputResults) - call close_nml(udefOutput) - - call message( '' ) - call message( 'Following output will be written:' ) - call message( ' STATES:' ) - if (outputFlxState(1)) then - call message( ' interceptional storage (L1_inter) [mm]') - end if - if (outputFlxState(2)) then - call message( ' height of snowpack (L1_snowpack) [mm]') - end if - if (outputFlxState(3)) then - call message( ' soil water content in the single layers (L1_soilMoist) [mm]') - end if - if (outputFlxState(4)) then - call message( ' volumetric soil moisture in the single layers [mm/mm]') - end if - if (outputFlxState(5)) then - call message( ' mean volum. soil moisture averaged over all soil layers [mm/mm]') - end if - if (outputFlxState(6)) then - call message( ' waterdepth in reservoir of sealed areas (L1_sealSTW) [mm]') - end if - if (outputFlxState(7)) then - call message( ' waterdepth in reservoir of unsat. soil zone (L1_unsatSTW) [mm]') - end if - if (outputFlxState(8)) then - call message( ' waterdepth in reservoir of sat. soil zone (L1_satSTW) [mm]') - end if - if (processCase(10) .eq. 0) outputFlxState(18) = .false. ! suppress output if process is off - if (outputFlxState(18)) then - call message( ' ground albedo neutrons (L1_neutrons) [cph]') - end if - - call message( ' FLUXES:' ) - if (outputFlxState(9)) then - call message( ' actual evapotranspiration aET (L1_pet) [mm/T]') - end if - if (outputFlxState(10)) then - call message( ' total discharge generated per cell (L1_total_runoff) [mm/T]') - end if - if (outputFlxState(11)) then - call message( ' direct runoff generated per cell (L1_runoffSeal) [mm/T]') - end if - if (outputFlxState(12)) then - call message( ' fast interflow generated per cell (L1_fastRunoff) [mm/T]') - end if - if (outputFlxState(13)) then - call message( ' slow interflow generated per cell (L1_slowRunoff) [mm/T]') - end if - if (outputFlxState(14)) then - call message( ' baseflow generated per cell (L1_baseflow) [mm/T]') - end if - if (outputFlxState(15)) then - call message( ' groundwater recharge (L1_percol) [mm/T]') - end if - if (outputFlxState(16)) then - call message( ' infiltration (L1_infilSoil) [mm/T]') - end if - call message( '' ) - call message( 'FINISHED reading config' ) - - ! warning message - if ( any(outputFlxState) .and. optimize ) then - call message( 'WARNING: FLUXES and STATES netCDF will be not written since optimization flag is TRUE ' ) - end if - - end subroutine read_config - - ! -------------------------------------------------------------------------------- - ! private funtions and subroutines - ! -------------------------------------------------------------------------------- - - function in_bound(params) - real(dp), dimension(:,:), intent(in) :: params ! parameter: - ! ! col_1=Lower bound, - ! ! col_2=Upper bound - ! ! col_3=initial - logical :: in_bound - - if ( any(params(:,3) .lt. params(:,1)) .or. any(params(:,3) .gt. params(:,2)) ) then - in_bound=.false. - else - in_bound=.true. - end if - - end function in_bound - - -END MODULE mo_read_config diff --git a/src/mHM/mo_read_latlon.f90 b/src/mHM/mo_read_latlon.f90 deleted file mode 100644 index c4262913..00000000 --- a/src/mHM/mo_read_latlon.f90 +++ /dev/null @@ -1,183 +0,0 @@ -!> \file mo_read_latlon.f90 - -!> \brief reading latitude and longitude coordinates for each basin - -!> \authors Stephan Thober -!> \date Nov 2013 - -MODULE mo_read_latlon - - ! This module provides routines for reading latitude and longitude coordinates - ! from file. - - ! Written Stephan Thober, Nov 2013 - - USE mo_kind, ONLY: i4, dp - - ! Of course - IMPLICIT NONE - - PUBLIC :: read_latlon - - PRIVATE - -CONTAINS - - ! ------------------------------------------------------------------ - - ! NAME - ! read_latlon - - ! PURPOSE - !> \brief reads latitude and longitude coordinates - - !> \details reads latitude and longitude coordinates from - !> netcdf file for each basin and appends it to the global - !> variables latitude and longitude. - - ! CALLING SEQUENCE - ! call read_latlon(ii) - - ! INTENT(IN) - !> \param[in] "integer(i4) :: ii" basin index - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - !> File name of the basins must be xxx_latlon.nc, where - !> xxx is the basin id. Variable names in the netcdf file - !> have to be 'lat' for latitude and 'lon' for longitude. - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober - !> \date Nov 2013 - ! modified, Stephan Thober, Sep 2015 - added latitude and longitude for level 0 - ! Stephan Thober, Oct 2015 - added L1_rect_latitude and L1_rect_longitude - ! David Schaefer, May 2016 - removed ncread dependency - - subroutine read_latlon(ii) - - USE mo_global_variables, ONLY: fileLatLon, L1_latitude, L1_longitude, level1, & - L0_latitude, L0_longitude, level0, basin, L1_rect_latitude, L1_rect_longitude - USE mo_append, ONLY: append - USE mo_message, ONLY: message - use mo_netcdf, only: NcDataset, NcVariable - use mo_string_utils, only: num2str - - implicit none - - integer(i4), intent(in) :: ii ! basin index - integer(i4), save :: last_basin = 0 - ! local variables - character(256) :: fname ! file name - real(dp), dimension(:,:), allocatable :: dummy ! dummy variable - logical, dimension(:,:), allocatable :: mask - type(NcDataset) :: nc - type(NcVariable) :: var - - ! construct filename - fname = trim(fileLatLon(ii)) - - nc = NcDataset(fname, "r") - - ! ------------------------------------------------------------------------- - ! READ LEVEL 0 LATITUDE / LONGITUDE - ! ------------------------------------------------------------------------- - if (ii .ne. last_basin) then - ! create mask for level 0 - mask = reshape(basin%L0_mask(basin%L0_iStartMask(ii):basin%L0_iEndMask(ii)), & - (/level0%nrows(ii), level0%ncols(ii)/)) - - var = nc%getVariable("lat_l0") - call var%getData(dummy) - ! consistency check - if ((size(dummy, dim=1) .NE. level0%nrows(ii)) .or. & - (size(dummy, dim=2) .NE. level0%ncols(ii))) then - call message(' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message(' Latlon expected to have following dimensions ... level0%nrows(ii):', & - trim(adjustl(num2str(level0%nrows(ii)))),', level0%ncols(ii):', trim(adjustl(num2str(level0%ncols(ii))))) - call message(' Latlon provided ... level0%nrows(ii):', & - trim(adjustl(num2str(size(dummy, dim=1)))),', level0%ncols(ii):', trim(adjustl(num2str(size(dummy, dim=2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - call append(L0_latitude, pack(dummy, mask)) - - var = nc%getVariable("lon_l0") - call var%getData(dummy) - ! consistency check - if ((size(dummy, dim=1) .NE. level0%nrows(ii)) .or. & - (size(dummy, dim=2) .NE. level0%ncols(ii))) then - call message(' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message(' Latlon expected to have following dimensions ... level0%nrows(ii):', & - trim(adjustl(num2str(level0%nrows(ii)))),', level0%ncols(ii):', trim(adjustl(num2str(level0%ncols(ii))))) - call message(' Latlon provided ... level0%nrows(ii):', & - trim(adjustl(num2str(size(dummy, dim=1)))),', level0%ncols(ii):', trim(adjustl(num2str(size(dummy, dim=2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - call append(L0_longitude, pack(dummy, .true.)) - last_basin = ii - end if - - if (allocated(mask)) deallocate(mask) - mask = reshape(basin%L1_mask(basin%L1_iStartMask(ii):basin%L1_iEndMask(ii)), & - (/level1%nrows(ii), level1%ncols(ii)/)) - - ! ------------------------------------------------------------------------- - ! READ LEVEL 1 LATITUDE / LONGITUDE - ! ------------------------------------------------------------------------- - ! read dimension length of variable in netcdf File - var = nc%getVariable("lat") - call var%getData(dummy) - ! consistency check - if ((size(dummy, dim=1) .NE. level1%nrows(ii)) .or. & - (size(dummy, dim=2) .NE. level1%ncols(ii))) then - call message(' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message(' Latlon expected to have following dimensions ... level1%nrows(ii):', & - trim(adjustl(num2str(level1%nrows(ii)))),', level1%ncols(ii):', trim(adjustl(num2str(level1%ncols(ii))))) - call message(' Latlon provided ... level1%nrows(ii):', & - trim(adjustl(num2str(size(dummy, dim=1)))),', level1%ncols(ii):', trim(adjustl(num2str(size(dummy, dim=2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - call append(L1_rect_latitude, pack(dummy, .true.)) - call append(L1_latitude, pack(dummy, mask)) - - var = nc%getVariable("lon") - call var%getData(dummy) - ! consistency check - if ((size(dummy, dim=1) .NE. level1%nrows(ii)) .or. & - (size(dummy, dim=2) .NE. level1%ncols(ii))) then - call message(' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message(' Latlon expected to have following dimensions ... level1%nrows(ii):', & - trim(adjustl(num2str(level1%nrows(ii)))),', level1%ncols(ii):', trim(adjustl(num2str(level1%ncols(ii))))) - call message(' Latlon provided ... level1%nrows(ii):', & - trim(adjustl(num2str(size(dummy, dim=1)))),', level1%ncols(ii):', trim(adjustl(num2str(size(dummy, dim=2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - call append(L1_rect_longitude, pack(dummy, .true.)) - call append(L1_longitude, pack(dummy, mask)) - - end subroutine read_latlon - -END MODULE mo_read_latlon diff --git a/src/mHM/mo_read_optional_data.f90 b/src/mHM/mo_read_optional_data.f90 index 1b6ec429..5d09b6bf 100644 --- a/src/mHM/mo_read_optional_data.f90 +++ b/src/mHM/mo_read_optional_data.f90 @@ -9,7 +9,7 @@ MODULE mo_read_optional_data - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE @@ -71,54 +71,59 @@ MODULE mo_read_optional_data !> \date Mar 2015 subroutine read_soil_moisture(iBasin) - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_init_states, only: get_basin_info - use mo_read_forcing_nc, only: read_forcing_nc - use mo_timer, only: & - timer_start, timer_stop, timer_get ! Timing of processes - use mo_append, only: append ! append data - use mo_mhm_constants, only: nodata_dp - use mo_global_variables, only: & - dirSoil_moisture, & ! directory of meteo input - evalPer, & ! evaluation period - L1_sm, L1_sm_mask, & ! soil mositure data and mask - timeStep_sm_input, nTimeSteps_L1_sm ! input time step (d,m,y), number of time steps + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_read_forcing_nc, only : read_forcing_nc + use mo_timer, only : & + timer_start, timer_stop, timer_get ! Timing of processes + use mo_append, only : append ! append data + use mo_common_constants, only : nodata_dp + use mo_global_variables, only : & + dirSoil_moisture, & ! directory of meteo input + L1_sm, L1_sm_mask, & ! soil mositure data and mask + timeStep_sm_input, nTimeSteps_L1_sm ! input time step (d,m,y), number of time steps + use mo_common_variables, only : & + level1 + use mo_common_mhm_mrm_variables, only : & + evalPer ! evaluation period + implicit none - integer(i4), intent(in) :: iBasin ! Basin Id + integer(i4), intent(in) :: iBasin ! Basin Id ! local variables - integer(i4) :: t ! loop vars packing L1_data to L1_data_packed - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - logical, dimension(:,:), allocatable :: mask1 ! mask of level 1 for packing - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp), dimension(:,:,:), allocatable :: L1_data ! data at level-1 - real(dp), dimension(:,:), allocatable :: L1_data_packed ! packed data at level-1 from 3D to 2D - logical, dimension(:,:,:), allocatable :: L1_mask ! mask at level-1 - logical, dimension(:,:), allocatable :: L1_mask_packed ! packed mask at level-1 from 3D to 2D + integer(i4) :: t ! loop vars packing L1_data to L1_data_packed + integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows + logical, dimension(:, :), allocatable :: mask1 ! mask of level 1 for packing + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp), dimension(:, :, :), allocatable :: L1_data ! data at level-1 + real(dp), dimension(:, :), allocatable :: L1_data_packed ! packed data at level-1 from 3D to 2D + logical, dimension(:, :, :), allocatable :: L1_mask ! mask at level-1 + logical, dimension(:, :), allocatable :: L1_mask_packed ! packed mask at level-1 from 3D to 2D ! get basic basin information at level-1 - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, mask=mask1 ) + nrows1 = level1(iBasin)%nrows + ncols1 = level1(iBasin)%ncols + ncells1 = level1(iBasin)%ncells + mask1 = level1(iBasin)%mask ! basin characteristics and read meteo header - call message(' Reading soil moisture for basin: ', trim(adjustl(num2str(iBasin))),' ...') + call message(' Reading soil moisture for basin: ', trim(adjustl(num2str(iBasin))), ' ...') call timer_start(1) - call read_forcing_nc( dirSoil_moisture(iBasin), nRows1, nCols1, evalPer(iBasin), trim('sm'), L1_data, mask1, & - nctimestep=timeStep_sm_input, nocheck=.TRUE., maskout=L1_mask) - + call read_forcing_nc(dirSoil_moisture(iBasin), nRows1, nCols1, 'sm', mask1, L1_data, & + target_period = evalPer(iBasin), nctimestep = timeStep_sm_input, nocheck = .TRUE., maskout = L1_mask) ! pack variables nTimeSteps_L1_sm = size(L1_data, 3) - allocate( L1_data_packed(nCells1, nTimeSteps_L1_sm)) - allocate( L1_mask_packed(nCells1, nTimeSteps_L1_sm)) + allocate(L1_data_packed(nCells1, nTimeSteps_L1_sm)) + allocate(L1_mask_packed(nCells1, nTimeSteps_L1_sm)) do t = 1, nTimeSteps_L1_sm - L1_data_packed(:,t) = pack( L1_data(:,:,t), MASK=mask1(:,:) ) - L1_mask_packed(:,t) = pack( L1_mask(:,:,t), MASK=mask1(:,:) ) + L1_data_packed(:, t) = pack(L1_data(:, :, t), MASK = mask1(:, :)) + L1_mask_packed(:, t) = pack(L1_mask(:, :, t), MASK = mask1(:, :)) end do ! append - call append( L1_sm, L1_data_packed(:,:), fill_value=nodata_dp ) - call append( L1_sm_mask, L1_mask_packed(:,:), fill_value=.FALSE. ) + call append(L1_sm, L1_data_packed(:, :), fill_value = nodata_dp) + call append(L1_sm_mask, L1_mask_packed(:, :), fill_value = .FALSE.) ! for multi basin calibration number of time steps may vary for different basins if (iBasin .GT. 1) nTimeSteps_L1_sm = size(L1_sm, 2) @@ -127,7 +132,7 @@ subroutine read_soil_moisture(iBasin) deallocate(L1_data, L1_data_packed) call timer_stop(1) - call message(' in ', trim(num2str(timer_get(1),'(F9.3)')), ' seconds.') + call message(' in ', trim(num2str(timer_get(1), '(F9.3)')), ' seconds.') end subroutine read_soil_moisture @@ -176,21 +181,24 @@ end subroutine read_soil_moisture ! \date Oct 2015 ! subroutine read_basin_avg_TWS() - use mo_message, only: message - use mo_append, only: paste - use mo_string_utils, only: num2str - use mo_read_timeseries, only: read_timeseries - use mo_file, only: utws - use mo_mhm_constants, only: nodata_dp - use mo_global_variables, only: & - nBasins, & - basin_avg_TWS_sim, basin_avg_TWS_obs, & ! variable storing tws simulated and data per each basin - nMeasPerDay_TWS, & ! nMeasPerDay for tws data - evalPer, & ! model evaluation period (for tws read in) - nTstepDay, & - simPer ! model simulation period (for inflow read in) - use mo_common_variables, only: optimize, & ! optimization flag for some error checks - opti_function ! opti_function that determines to what data to calibrate + use mo_message, only : message + use mo_append, only : paste + use mo_string_utils, only : num2str + use mo_read_timeseries, only : read_timeseries + use mo_file, only : utws + use mo_common_constants, only : nodata_dp + use mo_global_variables, only : & + basin_avg_TWS_sim, basin_avg_TWS_obs, & ! variable storing tws simulated and data per each basin + nMeasPerDay_TWS ! nMeasPerDay for tws data + use mo_common_variables, only : & + nBasins + use mo_common_mHM_mRM_variables, only : & + evalPer, & ! model evaluation period (for tws read in) + simPer, & ! model simulation period (for inflow read in) + optimize, & ! optimization flag for some error checks + opti_function, & ! opti_function that determines to what data to calibrate + nTstepDay + ! implicit none ! input variables @@ -206,8 +214,8 @@ subroutine read_basin_avg_TWS() ! ************************************************ ! INITIALIZE TWS ! ************************************************ - maxTimeSteps = maxval( simPer(1:nBasins)%julEnd - simPer(1:nBasins)%julStart + 1 ) * nTstepDay - allocate( basin_avg_TWS_sim(maxTimeSteps, nBasins) ) + maxTimeSteps = maxval(simPer(1 : nBasins)%julEnd - simPer(1 : nBasins)%julStart + 1) * nTstepDay + allocate(basin_avg_TWS_sim(maxTimeSteps, nBasins)) basin_avg_TWS_sim = nodata_dp ! ************************************************ @@ -215,18 +223,18 @@ subroutine read_basin_avg_TWS() ! ************************************************ ! do iBasin = 1, nBasins - call message(' Reading basin average TWS for basin: ', trim(adjustl(num2str(iBasin))),' ...') - - ! get start and end dates - start_tmp = (/evalPer(iBasin)%yStart, evalPer(iBasin)%mStart, evalPer(iBasin)%dStart/) - end_tmp = (/evalPer(iBasin)%yEnd, evalPer(iBasin)%mEnd, evalPer(iBasin)%dEnd /) - fName = trim(adjustl(basin_avg_TWS_obs%fname(iBasin))) - call read_timeseries(trim(fName), utws, & - start_tmp, end_tmp,optimize, opti_function, & - data_dp_1d, mask=mask_1d, nMeasPerDay=nMeasPerDay_TWS) - data_dp_1d = merge(data_dp_1d, nodata_dp, mask_1d) - call paste(basin_avg_TWS_obs%TWS, data_dp_1d, nodata_dp) - deallocate (data_dp_1d) + call message(' Reading basin average TWS for basin: ', trim(adjustl(num2str(iBasin))), ' ...') + + ! get start and end dates + start_tmp = (/evalPer(iBasin)%yStart, evalPer(iBasin)%mStart, evalPer(iBasin)%dStart/) + end_tmp = (/evalPer(iBasin)%yEnd, evalPer(iBasin)%mEnd, evalPer(iBasin)%dEnd /) + fName = trim(adjustl(basin_avg_TWS_obs%fname(iBasin))) + call read_timeseries(trim(fName), utws, & + start_tmp, end_tmp, optimize, opti_function, & + data_dp_1d, mask = mask_1d, nMeasPerDay = nMeasPerDay_TWS) + data_dp_1d = merge(data_dp_1d, nodata_dp, mask_1d) + call paste(basin_avg_TWS_obs%TWS, data_dp_1d, nodata_dp) + deallocate (data_dp_1d) end do end subroutine read_basin_avg_TWS @@ -281,54 +289,58 @@ end subroutine read_basin_avg_TWS !> \date Jul 2015 subroutine read_neutrons(iBasin) - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_init_states, only: get_basin_info - use mo_read_forcing_nc, only: read_forcing_nc - use mo_timer, only: & - timer_start, timer_stop, timer_get ! Timing of processes - use mo_append, only: append ! append data - use mo_mhm_constants, only: nodata_dp - use mo_global_variables, only: & - dirNeutrons, & ! directory of meteo input - evalPer, & ! evaluation period - L1_neutronsdata, L1_neutronsdata_mask, & ! soil mositure data and mask - timeStep_neutrons_input, nTimeSteps_L1_neutrons ! input time step (d,m,y), number of time steps + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_read_forcing_nc, only : read_forcing_nc + use mo_timer, only : & + timer_start, timer_stop, timer_get ! Timing of processes + use mo_append, only : append ! append data + use mo_common_constants, only : nodata_dp + use mo_global_variables, only : & + dirNeutrons, & ! directory of meteo input + L1_neutronsdata, L1_neutronsdata_mask, & ! soil mositure data and mask + timeStep_neutrons_input, nTimeSteps_L1_neutrons ! input time step (d,m,y), number of time steps + use mo_common_mhm_mrm_variables, only : & + evalPer ! evaluation period + use mo_common_variables, only : & + level1 implicit none - integer(i4), intent(in) :: iBasin ! Basin Id + integer(i4), intent(in) :: iBasin ! Basin Id ! local variables - integer(i4) :: t ! loop vars packing L1_data to L1_data_packed - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - logical, dimension(:,:), allocatable :: mask1 ! mask of level 1 for packing - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp), dimension(:,:,:), allocatable :: L1_data ! data at level-1 - real(dp), dimension(:,:), allocatable :: L1_data_packed ! packed data at level-1 from 3D to 2D - logical, dimension(:,:,:), allocatable :: L1_mask ! mask at level-1 - logical, dimension(:,:), allocatable :: L1_mask_packed ! packed mask at level-1 from 3D to 2D + integer(i4) :: t ! loop vars packing L1_data to L1_data_packed + integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows + logical, dimension(:, :), allocatable :: mask1 ! mask of level 1 for packing + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp), dimension(:, :, :), allocatable :: L1_data ! data at level-1 + real(dp), dimension(:, :), allocatable :: L1_data_packed ! packed data at level-1 from 3D to 2D + logical, dimension(:, :, :), allocatable :: L1_mask ! mask at level-1 + logical, dimension(:, :), allocatable :: L1_mask_packed ! packed mask at level-1 from 3D to 2D ! get basic basin information at level-1 - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, mask=mask1 ) + nrows1 = level1(iBasin)%nrows + ncols1 = level1(iBasin)%ncols + ncells1 = level1(iBasin)%ncells + mask1 = level1(iBasin)%mask ! basin characteristics and read meteo header - call message(' Reading neutrons for basin: ', trim(adjustl(num2str(iBasin))),' ...') + call message(' Reading neutrons for basin: ', trim(adjustl(num2str(iBasin))), ' ...') call timer_start(1) - call read_forcing_nc( dirNeutrons(iBasin), nRows1, nCols1, evalPer(iBasin), trim('neutrons'), L1_data, mask1, & - nctimestep=timeStep_neutrons_input, nocheck=.TRUE., maskout=L1_mask) - + call read_forcing_nc(dirNeutrons(iBasin), nRows1, nCols1, 'neutrons', mask1, L1_data, & + target_period = evalPer(iBasin), nctimestep = timeStep_neutrons_input, nocheck = .TRUE., maskout = L1_mask) ! pack variables nTimeSteps_L1_neutrons = size(L1_data, 3) - allocate( L1_data_packed(nCells1, nTimeSteps_L1_neutrons)) - allocate( L1_mask_packed(nCells1, nTimeSteps_L1_neutrons)) + allocate(L1_data_packed(nCells1, nTimeSteps_L1_neutrons)) + allocate(L1_mask_packed(nCells1, nTimeSteps_L1_neutrons)) do t = 1, nTimeSteps_L1_neutrons - L1_data_packed(:,t) = pack( L1_data(:,:,t), MASK=mask1(:,:) ) - L1_mask_packed(:,t) = pack( L1_mask(:,:,t), MASK=mask1(:,:) ) + L1_data_packed(:, t) = pack(L1_data(:, :, t), MASK = mask1(:, :)) + L1_mask_packed(:, t) = pack(L1_mask(:, :, t), MASK = mask1(:, :)) end do ! append - call append( L1_neutronsdata, L1_data_packed(:,:), fill_value=nodata_dp ) - call append( L1_neutronsdata_mask, L1_mask_packed(:,:), fill_value=.FALSE. ) + call append(L1_neutronsdata, L1_data_packed(:, :), fill_value = nodata_dp) + call append(L1_neutronsdata_mask, L1_mask_packed(:, :), fill_value = .FALSE.) ! for multi basin calibration number of time steps may vary for different basins if (iBasin .GT. 1) nTimeSteps_L1_neutrons = size(L1_neutronsdata, 2) @@ -337,11 +349,11 @@ subroutine read_neutrons(iBasin) deallocate(L1_data, L1_data_packed) call timer_stop(1) - call message(' in ', trim(num2str(timer_get(1),'(F9.3)')), ' seconds.') + call message(' in ', trim(num2str(timer_get(1), '(F9.3)')), ' seconds.') end subroutine read_neutrons -! ------------------------------------------------------------------ + ! ------------------------------------------------------------------ ! NAME ! read_evapotranspiration @@ -391,54 +403,59 @@ end subroutine read_neutrons !> \date Feb 2017 subroutine read_evapotranspiration(iBasin) - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_init_states, only: get_basin_info - use mo_read_forcing_nc, only: read_forcing_nc - use mo_timer, only: & - timer_start, timer_stop, timer_get ! Timing of processes - use mo_append, only: append ! append data - use mo_mhm_constants, only: nodata_dp - use mo_global_variables, only: & - dirEvapotranspiration, & ! directory of meteo input - evalPer, & ! evaluation period - L1_et, L1_et_mask, & ! soil mositure data and mask - timeStep_et_input, nTimeSteps_L1_et ! input time step (d,m,y), number of time steps + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_read_forcing_nc, only : read_forcing_nc + use mo_timer, only : & + timer_start, timer_stop, timer_get ! Timing of processes + use mo_append, only : append ! append data + use mo_common_constants, only : nodata_dp + use mo_global_variables, only : & + dirEvapotranspiration, & ! directory of meteo input + L1_et, L1_et_mask, & ! soil mositure data and mask + timeStep_et_input, nTimeSteps_L1_et ! input time step (d,m,y), number of time steps + use mo_common_mhm_mrm_variables, only : & + evalPer ! evaluation period + use mo_common_variables, only : & + level1 implicit none - integer(i4), intent(in) :: iBasin ! Basin Id + integer(i4), intent(in) :: iBasin ! Basin Id ! local variables - integer(i4) :: t ! loop vars packing L1_data to L1_data_packed - integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows - logical, dimension(:,:), allocatable :: mask1 ! mask of level 1 for packing - integer(i4) :: ncells1 ! ncells1 of level 1 - real(dp), dimension(:,:,:), allocatable :: L1_data ! data at level-1 - real(dp), dimension(:,:), allocatable :: L1_data_packed ! packed data at level-1 from 3D to 2D - logical, dimension(:,:,:), allocatable :: L1_mask ! mask at level-1 - logical, dimension(:,:), allocatable :: L1_mask_packed ! packed mask at level-1 from 3D to 2D + integer(i4) :: t ! loop vars packing L1_data to L1_data_packed + integer(i4) :: nrows1, ncols1 ! level 1 number of culomns and rows + logical, dimension(:, :), allocatable :: mask1 ! mask of level 1 for packing + integer(i4) :: ncells1 ! ncells1 of level 1 + real(dp), dimension(:, :, :), allocatable :: L1_data ! data at level-1 + real(dp), dimension(:, :), allocatable :: L1_data_packed ! packed data at level-1 from 3D to 2D + logical, dimension(:, :, :), allocatable :: L1_mask ! mask at level-1 + logical, dimension(:, :), allocatable :: L1_mask_packed ! packed mask at level-1 from 3D to 2D ! get basic basin information at level-1 - call get_basin_info( iBasin, 1, nrows1, ncols1, nCells=nCells1, mask=mask1 ) + nrows1 = level1(iBasin)%nrows + ncols1 = level1(iBasin)%ncols + ncells1 = level1(iBasin)%ncells + mask1 = level1(iBasin)%mask ! basin characteristics and read meteo header - call message(' Reading evapotranspiration for basin: ', trim(adjustl(num2str(iBasin))),' ...') + call message(' Reading evapotranspiration for basin: ', trim(adjustl(num2str(iBasin))), ' ...') call timer_start(1) - call read_forcing_nc( dirEvapotranspiration(iBasin), nRows1, nCols1, evalPer(iBasin), trim('et'), L1_data, mask1, & - nctimestep=timeStep_et_input, nocheck=.TRUE., maskout=L1_mask) + call read_forcing_nc(dirEvapotranspiration(iBasin), nRows1, nCols1, 'et', mask1, L1_data, & + target_period = evalPer(iBasin), nctimestep = timeStep_et_input, nocheck = .TRUE., maskout = L1_mask) ! pack variables nTimeSteps_L1_et = size(L1_data, 3) - allocate( L1_data_packed(nCells1, nTimeSteps_L1_et)) - allocate( L1_mask_packed(nCells1, nTimeSteps_L1_et)) + allocate(L1_data_packed(nCells1, nTimeSteps_L1_et)) + allocate(L1_mask_packed(nCells1, nTimeSteps_L1_et)) do t = 1, nTimeSteps_L1_et - L1_data_packed(:,t) = pack( L1_data(:,:,t), MASK=mask1(:,:) ) - L1_mask_packed(:,t) = pack( L1_mask(:,:,t), MASK=mask1(:,:) ) + L1_data_packed(:, t) = pack(L1_data(:, :, t), MASK = mask1(:, :)) + L1_mask_packed(:, t) = pack(L1_mask(:, :, t), MASK = mask1(:, :)) end do ! append - call append( L1_et, L1_data_packed(:,:), fill_value=nodata_dp ) - call append( L1_et_mask, L1_mask_packed(:,:), fill_value=.FALSE. ) + call append(L1_et, L1_data_packed(:, :), fill_value = nodata_dp) + call append(L1_et_mask, L1_mask_packed(:, :), fill_value = .FALSE.) ! for multi basin calibration number of time steps may vary for different basins if (iBasin .GT. 1) nTimeSteps_L1_et = size(L1_et, 2) @@ -447,8 +464,8 @@ subroutine read_evapotranspiration(iBasin) deallocate(L1_data, L1_data_packed) call timer_stop(1) - call message(' in ', trim(num2str(timer_get(1),'(F9.3)')), ' seconds.') + call message(' in ', trim(num2str(timer_get(1), '(F9.3)')), ' seconds.') end subroutine read_evapotranspiration - END MODULE mo_read_optional_data +END MODULE mo_read_optional_data diff --git a/src/mHM/mo_read_wrapper.f90 b/src/mHM/mo_read_wrapper.f90 deleted file mode 100644 index 67472fe0..00000000 --- a/src/mHM/mo_read_wrapper.f90 +++ /dev/null @@ -1,579 +0,0 @@ -!> \file mo_read_wrapper.f90 - -!> \brief Wrapper for all reading routines. - -!> \details This module is to wrap up all reading routines.\n -!> The general written reading routines are used to store now the read data into global variables. - -!> \authors Juliane Mai, Matthias Zink -!> \date Jan 2013 - -MODULE mo_read_wrapper - - ! Written Juliane Mai & Matthias Zink, Jan 2013 - ! Modified - ! Luis Samaniego, Feb 2013 ! rotate fdir variable to the new coordinate system - - USE mo_kind, ONLY: i4, dp - - IMPLICIT NONE - - PUBLIC :: read_data ! reads all available data - -CONTAINS - - ! ------------------------------------------------------------------ - - ! NAME - ! read_data - - ! PURPOSE - !> \brief Reads data. - - !> \details The namelists are already read by read_config call./n - !> All LUTs are read from their respective directory and information within those - !> files are shared across all basins to be modeled. - ! INTENT(IN) - ! None - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - !> \note read_config has to be called before - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Juliane Mai & Matthias Zink - !> \date Feb 2013 - ! Modified, - ! Luis Samaniego, Feb 2013 - rotate fdir variable to the new coordinate system - ! Rohini Kumar, Aug 2013 - name changed from "L0_LAI" to "L0_LCover_LAI" - ! Rohini Kumar, Aug 2013 - added dirSoil_LUT and dirGeology_LUT, and changed to - ! read datapaths and variables made accordingly - ! Rohini Kumar, Aug 2013 - added iFlag_LAI_data_format to handle LAI options, - ! and changed within the code made accordingly - ! Rohini Kumar, Sep 2013 - read input data for routing processes according - ! Stephan Thober to process_matrix flag - ! Matthias Zink Mar 2014 added inflow gauge - ! Kumar & Schroen Apr 2014 - added check for consistency of L0 and L1 spatial resolution - ! Stephan Thober Jun 2014 - added perform_mpr for omitting L0 read - ! Matthias Cuntz & - ! Juliane Mai Nov 2014 - LAI input from daily, monthly or yearly files - ! Stephan Thober Aug 2015 - moved routing related variables and routines to mRM - ! Rohini Kumar, Mar 2016 - options to handle different soil databases - ! Matthias Zink Mar 2014 - added subroutine for consistency check - ! Stephan Thober, Nov 2016 - moved processMatrix to common variables - ! Rohini Kuamr, Dec 2016 - option to handle monthly mean gridded fields of LAI - ! ------------------------------------------------------------------ - - subroutine read_data - ! - USE mo_read_lut, ONLY: read_lai_lut, & - read_geoformation_lut - USE mo_soil_database, ONLY: read_soil_LUT - USE mo_read_spatial_data, ONLY: read_header_ascii, & - read_spatial_data_ascii - USE mo_append, ONLY: append, paste - USE mo_string_utils, ONLY: num2str - USE mo_message, ONLY: message - ! - USE mo_file, ONLY: file_geolut , ugeolut, & ! file name and unit of hydrogeology LuT - file_lailut , ulailut, & ! file name and unit of LAI LuT - file_dem , udem, & ! file name and unit of elevation map - file_slope , uslope, & ! file name and unit of slope map - file_aspect , uaspect, & ! file name and unit of aspect map - file_soilclass , usoilclass, & ! file name and unit of soil class map - file_hydrogeoclass , uhydrogeoclass, & ! file name and unit of hydrogeo class map - file_laiclass , ulaiclass, & ! file name and unit of lai class map - file_soil_database , & ! file name of soil class map (iFlag_soilDB = 0) - file_soil_database_1, & ! file name of soil class map (iFlag_soilDB = 1) - ulcoverclass, & ! unit of land cover class map - file_namelist_param ! file name of parameter list - USE mo_global_variables, ONLY: nGeoUnits, GeoUnitList, GeoUnitKar, & ! geological class information - L0_Basin, & ! L0_Basin ID - L0_mask, & ! global mask variable - L0_elev, & ! elevation on input resolution (L0) - L0_slope, & ! slope on input resolution (L0) - L0_asp, & ! aspect on input resolution (L0) - L0_soilId, & ! soil ID on L0 resolution - L0_geoUnit, & ! hydrogeological class ID on input resolution (L0) - L0_LCover_LAI, & ! LAI class ID on input resolution (L0) - L0_LCover, & ! classical mHM land cover class (L0) - dirMorpho, dirLCover, & ! directories - dirCommonFiles, & ! directory of common files - LCfilename, nLCoverScene, & ! file names and number of land cover scenes - level0, & ! grid information (ncols, nrows, ..) - nBasins, & ! number of basins - basin, & ! basin information for single basins - perform_mpr, & ! flag indicating whether L0 is read - timeStep_LAI_input, & ! flag on how LAI data has to be read - iFlag_soilDB, & ! options to handle different types of soil databases - nSoilHorizons_mHM, & ! soil horizons info for mHM - resolutionHydrology, & ! hydrology resolution (L1 scale) - nLAIclass, LAIUnitList, LAILUT,soilDB - use mo_common_variables, ONLY: processMatrix, & ! Info about which process runs in which option - global_parameters, & ! global parameters - optimize ! optimization on/off - USE mo_mhm_constants, ONLY: nodata_i4, nodata_dp ! mHM's global nodata vales - - implicit none - - ! local variables - integer(i4) :: iBasin, iVar, iHorizon ! loop variables - integer(i4) :: nH ! dummy variable - integer(i4) :: nunit ! file unit of file to read - integer(i4) :: nCells ! number of cells in global_mask - character(256) :: fName ! file name of file to read - real(dp), dimension(:,:), allocatable :: data_dp_2d - integer(i4), dimension(:,:), allocatable :: data_i4_2d - integer(i4), dimension(:,:), allocatable :: dataMatrix_i4 - logical, dimension(:,:), allocatable :: mask_2d - logical, dimension(:,:), allocatable :: mask_global - integer(i4), dimension(:), allocatable :: dummy_i4 - real(dp), dimension(:), allocatable :: dummy_dp - - ! min. value of slope and aspect - real(dp), parameter :: slope_minVal = 0.01_dp - real(dp), parameter :: aspect_minVal = 1.00_dp - - ! ************************************************ - ! READ LOOKUP TABLES - ! ************************************************ - ! - ! Soil LUT - if( iFlag_soilDB .eq. 0 ) then - fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_soil_database)) - else if( iFlag_soilDB .eq. 1) then - fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_soil_database_1)) - end if - call read_soil_LUT( trim(fName), iFlag_soilDB, soilDB) - - ! Geological formation LUT - fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_geolut)) - call read_geoformation_lut(trim(fName), ugeolut, nGeoUnits, GeoUnitList, GeoUnitKar) - - ! LAI LUT - if( timeStep_LAI_input .EQ. 0 ) then - fName = trim(adjustl(dirCommonFiles)) // trim(adjustl(file_lailut)) - call read_lai_lut(trim(fName), ulailut, nLAIclass, LAIUnitList, LAILUT) - else - !! just a dummy allocation for passing through the mo_mhm_eval call - allocate( LAIUnitList(1), LAILUT(1,1) ) - LAIUnitList(:) = nodata_i4 - LAILUT(:,:) = nodata_dp - end if - - - - - ! ************************************************ - ! READ SPATIAL DATA FOR EACH BASIN - ! ************************************************ - ! allocate necessary variables at Level0 - allocate(level0%nrows (nBasins)) - allocate(level0%ncols (nBasins)) - allocate(level0%xllcorner (nBasins)) - allocate(level0%yllcorner (nBasins)) - allocate(level0%cellsize (nBasins)) - allocate(level0%nodata_value(nBasins)) - ! - allocate(basin%L0_iStart (nBasins)) - allocate(basin%L0_iEnd (nBasins)) - allocate(basin%L0_iStartMask(nBasins)) - allocate(basin%L0_iEndMask (nBasins)) - ! - basins: do iBasin = 1, nBasins - ! - ! Header (to check consistency) - fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_dem)) - call read_header_ascii(trim(fName), udem, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), level0%nodata_value(iBasin)) - - ! check for L0 and L1 scale consistency - if( resolutionHydrology(iBasin) .LT. level0%cellsize(iBasin)) then - call message() - call message('***ERROR: resolutionHydrology (L1) should be smaller than the input data resolution (L0)') - call message(' check set-up (in mhm.nml) for basin: ', trim(adjustl(num2str(iBasin))),' ...') - stop - end if - - ! DEM + overall mask creation - fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_dem)) - call read_spatial_data_ascii(trim(fName), udem, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin),& - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_dp_2d, mask_global) - - ! check whether L0 data is shared - if (iBasin .gt. 1) then - if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then - ! - call message(' Using data of previous basin: ', trim(adjustl(num2str(iBasin))),' ...') - basin%L0_iStart(iBasin) = basin%L0_iStart(iBasin - 1) - basin%L0_iEnd (iBasin) = basin%L0_iEnd(iBasin - 1) - ! - basin%L0_iStartMask(iBasin) = basin%L0_iStartMask(iBasin - 1 ) - basin%L0_iEndMask (iBasin) = basin%L0_iEndMask(iBasin - 1 ) - - ! DO NOT read L0 data - cycle - - end if - end if - - call message(' Reading data for basin: ', trim(adjustl(num2str(iBasin))),' ...') - - ! create overall mHM mask on L0 and save indices - nCells = size(mask_global, dim=1)*size(mask_global, dim=2) - call append( L0_mask, reshape(mask_global, (/nCells/))) - ! - ! Saving indices of mask and packed data - if(iBasin .eq. 1) then - basin%L0_iStart(iBasin) = 1 - basin%L0_iEnd (iBasin) = basin%L0_iStart(iBasin) + count(mask_global) - 1 - ! - basin%L0_iStartMask(iBasin) = 1 - basin%L0_iEndMask (iBasin) = basin%L0_iStartMask(iBasin) + nCells - 1 - else - basin%L0_iStart(iBasin) = basin%L0_iEnd(iBasin-1) + 1 - basin%L0_iEnd (iBasin) = basin%L0_iStart(iBasin) + count(mask_global) - 1 - ! - basin%L0_iStartMask(iBasin) = basin%L0_iEndMask(iBasin-1) + 1 - basin%L0_iEndMask (iBasin) = basin%L0_iStartMask(iBasin) + nCells - 1 - end if - - ! Read L0 data, if restart is false - read_L0_data: if ( perform_mpr ) then - - ! put global nodata value into array (probably not all grid cells have values) - data_dp_2d = merge(data_dp_2d, nodata_dp, mask_global) - ! put data in variable - call append( L0_elev, pack(data_dp_2d, mask_global) ) - ! deallocate arrays - deallocate(data_dp_2d) - - ! read slope and aspect - datatype real - nVars_real: do iVar = 1, 2 - select case (iVar) - case(1) ! slope - fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_slope)) - nunit = uslope - case(2) ! aspect - fName = trim(adjustl(dirMorpho(iBasin)))// trim(adjustl(file_aspect)) - nunit = uaspect - end select - - ! reading - call read_spatial_data_ascii(trim(fName), nunit, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_dp_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_dp_2d = merge(data_dp_2d, nodata_dp, mask_2d) - ! put data in variable - select case (iVar) - case(1) ! slope - call append( L0_slope, pack(data_dp_2d, mask_global) ) - case(2) ! aspect - call append( L0_asp, pack(data_dp_2d, mask_global) ) - end select - ! deallocate arrays - deallocate(data_dp_2d, mask_2d) - - end do nVars_real - - ! read datatype integer - ! ***** CHANGE IS MADE HERE TO ACCOMODATE READ SEVERAL TYPES OF SOIL DATABASES - ! change from the earlier code where everything was done in the DO loop (**see below **) - ! here everything is more explicit and no do loop appears as was the case in previous version - - ! read soilID in both options - nH = 1 !> by default; when iFlag_soilDB = 0 - if(iFlag_soilDB .eq. 1) nH = nSoilHorizons_mHM - ! modified way to read multiple horizons specific soil class - do iHorizon = 1, nH - if( iFlag_soilDB .eq. 0 ) then - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_soilclass)) - else if( iFlag_soilDB .eq. 1 ) then - write(fName, 172) iHorizon -172 format('soil_class_horizon_',i2.2,'.asc') - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(fName)) - end if - call read_spatial_data_ascii(trim(fName), usoilclass, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - call paste(dataMatrix_i4, pack(data_i4_2d, mask_global), nodata_i4) - deallocate(data_i4_2d) - end do - call append( L0_soilId, dataMatrix_i4 ) - deallocate(dataMatrix_i4) - - ! read geoUnit - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_hydrogeoclass)) - ! reading and transposing - call read_spatial_data_ascii(trim(fName), uhydrogeoclass, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - call append( L0_geoUnit, pack(data_i4_2d, mask_global) ) - deallocate(data_i4_2d, mask_2d) - - ! read LAI related land cover class - if( timeStep_LAI_input .EQ. 0 ) then - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_laiclass)) - ! reading and transposing - call read_spatial_data_ascii(trim(fName), ulaiclass, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - call append( L0_LCover_LAI, pack(data_i4_2d, mask_global) ) - deallocate(data_i4_2d, mask_2d) - else - !! dummy allocation for passing through the mo_mhm_eval - allocate( dummy_i4( count(mask_global) ) ) - dummy_i4(:) = nodata_i4 - call append( L0_LCover_LAI, dummy_i4 ) - deallocate( dummy_i4 ) - end if - - else - - ! if restart is switched on, perform dummy allocation of - allocate( dummy_dp( count(mask_global) ) ) - allocate( dummy_i4( count(mask_global) ) ) - dummy_dp(:) = nodata_dp - dummy_i4(:) = dummy_i4 - call append( L0_elev, dummy_dp ) - call append( L0_slope, dummy_dp ) - call append( L0_asp, dummy_dp ) - ! for soil class - nH = 1 !> by default; when iFlag_soilDB = 0 - if ( iFlag_soilDB .eq. 1 ) nH = nSoilHorizons_mHM - do iHorizon = 1, nH - call paste(dataMatrix_i4, dummy_i4) - end do - call append( L0_soilId, dataMatrix_i4 ) - deallocate(dataMatrix_i4) - ! - call append( L0_geoUnit, dummy_i4 ) - deallocate( dummy_dp, dummy_i4 ) - - ! read L0_LCover_LAI - if( timeStep_LAI_input .EQ. 0 ) then - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_laiclass)) - call read_spatial_data_ascii(trim(fName), ulaiclass, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - call append( L0_LCover_LAI, pack(data_i4_2d, mask_global) ) - else - !! dummy allocation for passing through the mo_mhm_eval - allocate( dummy_i4( count(mask_global) ) ) - dummy_i4(:) = nodata_i4 - call append( L0_LCover_LAI, dummy_i4 ) - deallocate( dummy_i4 ) - end if - - end if read_L0_data - - ! LCover read in is realized seperated because of unknown number of scenes - do iVar = 1, nLCoverScene - fName = trim(adjustl(dirLCover(iBasin)))//trim(adjustl(LCfilename(iVar))) - call read_spatial_data_ascii(trim(fName), ulcoverclass, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - call paste(dataMatrix_i4, pack(data_i4_2d, mask_global), nodata_i4) - deallocate(data_i4_2d) - end do - call append( L0_LCover, dataMatrix_i4 ) - deallocate(dataMatrix_i4) - - ! deallocate mask - deallocate(mask_global) - - end do basins - - ! check consitency between look up tables and input map (soil, LAI, geology) - ! consistency is only checked if data are read - if perform_mpr is deactivated data come from restart files - if ( perform_mpr ) then - !Soil - ! determine name od soil class definition file based on input option iFlag_soilDB - if( iFlag_soilDB .eq. 0 ) then - fName =file_soil_database - else if( iFlag_soilDB .eq. 1) then - fName = file_soil_database_1 - end if - ! If you are getting segmentation fault with intel on large file (e.g. here on soils), then - ! make sure to include following into your Marefile: INTEL_EXCLUDE := mo_read_wrapper.f90 - call check_consistency_lut_map( reshape(L0_soilId, (/ size( L0_soilId, 1) * size( L0_soilId, 2) /)), & - soilDB%id(:), fName) - ! LAI - if( timeStep_LAI_input .EQ. 0 ) then - call check_consistency_lut_map( L0_LCover_LAI, LAIUnitList, file_laiclass) - end if - ! Geology - call check_consistency_lut_map( L0_geoUnit, GeoUnitList, file_hydrogeoclass, dummy_i4) - - ! check if enough geoparameter are defined in mhm_parameter.nml - if ( ( processMatrix(9,2) ) .NE. size(GeoUnitList, 1)) then - call message() - call message('***ERROR: Mismatch: Number of geological units in ', trim(adjustl(file_hydrogeoclass)), & - ' is ', trim(adjustl(num2str(size(GeoUnitList, 1))))) - call message(' while it is ', trim(adjustl(num2str(processMatrix(9,2)))), & - ' in ' , trim(adjustl(file_namelist_param)), '!') - stop - end if - - ! deactivate parameters of non existing geological classes in study domain for optimization - if (optimize) then - ! loop over geological units in look up list - do iVar = 1 , size(GeoUnitList, 1) - ! check if unit appears in geological map (dummy_i4 is unique number in L0_geoUnit) - if (.not. ANY(dummy_i4 .EQ. GeoUnitList(iVar)) ) then - ! deactivate optimization flag (dim=4 from global_parameters) - global_parameters( processMatrix(9,3) - processMatrix(9,2) + iVar , 4) = 0 - call message('***WARNING: Deactivated geological unit ', trim(adjustl(num2str(GeoUnitList(iVar))))) - call message(' for optimization because it is not appearing in study domain.') - end if - end do - end if - - deallocate(dummy_i4) ! is allocated in subroutine check_consistency_lut_map - geology - - end if - - !---------------------------------------------------------------- - ! assign L0_mask to basin - !---------------------------------------------------------------- - basin%L0_mask => L0_mask - - !---------------------------------------------------------------- - ! Correction for slope and aspect -- min value set above - !---------------------------------------------------------------- - if ( perform_mpr ) then - ! keep the colons (:) in the statements because of Intel's reallocation lhs problem - L0_slope(:) = merge( slope_minVal, L0_slope(:), (L0_slope(:) .lt. slope_minVal) ) - L0_asp(:) = merge( aspect_minVal, L0_asp(:), (L0_asp(:) .lt. aspect_minVal) ) - end if - - end subroutine read_data - - ! ------------------------------------------------------------------ - - ! NAME - ! check_consistency_lut_map - - ! PURPOSE - !> \brief Checks if classes in input maps appear in look up tables. - - !> \details Determines wether a class appearing in the morphological input - !> is occuring in the respective look up table. mHM breaks if inconsistencies - !> are discovered. - ! INTENT(IN) - !> \param[in] " integer(i4), dimension(:) :: data" map of study domain - !> \param[in] "integer(i4), dimension(:) :: lookuptable" look up table corresponding to map - !> \param[in] "character(*) :: filename" name of the lut file - ERORR warn - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - !> \param[out] "integer(i4), dimension(:), allocatable :: unique_values" array of unique values in data - - ! RETURN - ! None - - ! RESTRICTIONS - !> \none - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Matthias Zink - !> \date Nov 2016 - ! ------------------------------------------------------------------ - - subroutine check_consistency_lut_map(data, lookuptable, filename, unique_values) - - USE mo_orderpack, ONLY: unista - USE mo_string_utils, ONLY: num2str - USE mo_message, ONLY: message - - implicit none - - integer(i4), dimension(:), intent(in) :: data ! map of study domain - integer(i4), dimension(:), intent(in) :: lookuptable ! look up table corresponding to map - character(*), intent(in) :: filename ! name of the lut file - ERORR warn - integer(i4), dimension(:), allocatable, intent(out), optional :: unique_values ! array of unique values in data - - ! local variables - integer(i4) :: n_unique_elements - integer(i4) :: ielement - integer(i4), dimension(:), allocatable :: temp - - allocate( temp( size( data, 1)) ) - ! copy L0_geoUnit because subroutine unista overwrites the nunit entries of the - ! input array with the unique array values - temp = data - ! retrieve unique values of data - call unista( temp, n_unique_elements) - ! check if unit exists in look up table - do ielement = 1 , n_unique_elements - if (.not. ANY( lookuptable .EQ. temp(ielement) )) then - call message() - call message('***ERROR: Class ', trim(adjustl(num2str(temp(ielement)))),' is missing') - call message(' in input file ', trim(adjustl(filename)),' ...') - stop - end if - end do - - ! pass unique values if optional argument unique_values is given - if (present(unique_values)) then - allocate(unique_values(n_unique_elements)) - unique_values(:) = temp(1:n_unique_elements) - end if - deallocate(temp) - - end subroutine check_consistency_lut_map - -END MODULE mo_read_wrapper diff --git a/src/mHM/mo_restart.f90 b/src/mHM/mo_restart.f90 index 91b0750a..122dc220 100644 --- a/src/mHM/mo_restart.f90 +++ b/src/mHM/mo_restart.f90 @@ -19,15 +19,22 @@ MODULE mo_restart IMPLICIT NONE + PRIVATE + PUBLIC :: read_restart_states ! read restart files for state variables from a given path - PUBLIC :: read_restart_config ! read restart files for configuration from a given path PUBLIC :: write_restart_files ! write restart files for configuration to a given path - PRIVATE + INTERFACE unpack_field_and_write + MODULE PROCEDURE unpack_field_and_write_1d_i4, & + unpack_field_and_write_1d_dp, & + unpack_field_and_write_2d_dp, & + unpack_field_and_write_3d_dp + end interface unpack_field_and_write + CONTAINS ! ------------------------------------------------------------------ - + ! NAME ! write_restart @@ -77,837 +84,216 @@ MODULE mo_restart ! David Schaefer Nov 2015 - mo_netcdf ! Stephan Thober Nov 2016 - moved processMatrix to common variables ! Zink M. Demirel C.,Mar 2017 - Added Jarvis soil water stress function at SM process(3) + ! Robert Schweppe, Feb 2018 - Removed all L0 references ! ------------------------------------------------------------------ - subroutine write_restart_files( OutPath ) - - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_init_states, only: get_basin_info - use mo_string_utils, only: num2str - use mo_netcdf, only: NcDataset, NcDimension, NcVariable - use mo_mhm_constants, only: nodata_dp, nodata_i4 - use mo_global_variables, only: & - L1_fSealed, & - L1_fForest, & - L1_fPerm, & - L1_Inter, & - L1_snowPack, & - L1_sealSTW, & - L1_soilMoist, & - L1_unsatSTW, & - L1_satSTW, & - L1_aETSoil, & - L1_aETCanopy, & - L1_aETSealed, & - L1_baseflow, & - L1_infilSoil, & - L1_fastRunoff, & - L1_melt, & - L1_percol, & - L1_preEffect, & - L1_rain, & - L1_runoffSeal, & - L1_slowRunoff, & - L1_snow, & - L1_Throughfall, & - L1_total_runoff, & - L1_alpha, & - L1_degDayInc, & - L1_degDayMax, & - L1_degDayNoPre, & - L1_degDay, & - L1_karstLoss, & - L1_fAsp, & - L1_HarSamCoeff, & - L1_PrieTayAlpha, & - L1_aeroResist, & - L1_surfResist, & - L1_fRoots, & - L1_maxInter, & - L1_kfastFlow, & - L1_kSlowFlow, & - L1_kBaseFlow, & - L1_kPerco, & - L1_soilMoistFC, & - L1_soilMoistSat, & - L1_soilMoistExp, & - L1_jarvis_thresh_c1, & - L1_petLAIcorFactor, & - L1_tempThresh, & - L1_unsatThresh, & - L1_sealedThresh, & - L1_wiltingPoint, & - basin, & - L0_cellCoor , & - L0_Id , & ! Ids of grid at level-0 - L0_slope_emp , & ! Empirical quantiles of slope - L0_areaCell, & ! Ids of grid at level-0 - L1_areaCell, & ! [km2] Effective area of cell at this level - L1_Id , & ! Ids of grid at level-1 - L1_cellCoor , & - L1_upBound_L0 , & ! Row start at finer level-0 scale - L1_downBound_L0, & ! Row end at finer level-0 scale - L1_leftBound_L0, & ! Col start at finer level-0 scale - L1_rightBound_L0, & ! Col end at finer level-0 scale - L1_nTCells_L0 ! Total number of valid L0 cells in a given L1 cell - use mo_common_variables, only: & - processMatrix ! process configuration + subroutine write_restart_files(OutPath) + + use mo_kind, only : i4, dp + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + use mo_common_constants, only : nodata_dp + use mo_global_variables, only : & + L1_Inter, & + L1_snowPack, & + L1_sealSTW, & + L1_soilMoist, & + L1_unsatSTW, & + L1_satSTW, & + L1_aETSoil, & + L1_aETCanopy, & + L1_aETSealed, & + L1_baseflow, & + L1_infilSoil, & + L1_fastRunoff, & + L1_melt, & + L1_percol, & + L1_preEffect, & + L1_rain, & + L1_runoffSeal, & + L1_slowRunoff, & + L1_snow, & + L1_Throughfall, & + L1_total_runoff + use mo_mpr_global_variables, only : & + nSoilHorizons_mHM, & ! number of soil horizons + nLAI + use mo_common_variables, only : & + level1, & + nLCoverScene ! number of land cover scenes + use mo_mpr_restart, only : write_eff_params + use mo_common_restart, only : write_grid_info implicit none - character(256) :: Fname + character(256) :: Fname character(256), dimension(:), intent(in) :: OutPath ! list of Output paths per Basin - integer(i4) :: iBasin - integer(i4) :: ii - integer(i4) :: s0 ! start index at level 0 - integer(i4) :: e0 ! end index at level 0 - integer(i4) :: ncols0 ! number of colums at level 0 - integer(i4) :: nrows0 ! number of rows at level 0 - logical, dimension(:,:), allocatable :: mask0 ! mask at level 0 - integer(i4) :: s1 ! start index at level 1 - integer(i4) :: e1 ! end index at level 1 - integer(i4) :: ncols1 ! number of colums at level 1 - integer(i4) :: nrows1 ! number of rows at level 1 - logical, dimension(:,:), allocatable :: mask1 ! mask at level 1 - real(dp), dimension(:,:,:), allocatable :: dummy_d3 ! dummy variable - - type(NcDataset) :: nc - type(NcDimension) :: rows0, cols0, rows1, cols1, soil1, months - type(NcVariable) :: var - - basin_loop: do iBasin = 1, size(OutPath) - - ! get Level0 information about the basin - call get_basin_info( iBasin, 0, nrows0, ncols0, iStart=s0, iEnd=e0, mask=mask0 ) - - ! get Level1 information about the basin - call get_basin_info( iBasin, 1, nrows1, ncols1, iStart=s1, iEnd=e1, mask=mask1 ) - - ! write restart file for iBasin - Fname = trim(OutPath(iBasin)) // "mHM_restart_" // trim(num2str(iBasin, "(i3.3)")) // ".nc" - ! print a message - call message(" Writing Restart-file: ", trim(adjustl(Fname))," ...") - - nc = NcDataset(fname, "w") - rows0 = nc%setDimension("nrows0", nrows0) - cols0 = nc%setDimension("ncols0", ncols0) - rows1 = nc%setDimension("nrows1", nrows1) - cols1 = nc%setDimension("ncols1", ncols1) - soil1 = nc%setDimension("L1_soilhorizons", size( L1_soilMoist, 2)) - months = nc%setDimension("MonthsPerYear", size( L1_PrieTayAlpha, 2)) - - var = nc%setVariable("L1_fSealed","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_fSealed(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","fraction of Sealed area at level 1") - - var = nc%setVariable("L1_fForest","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_fForest(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","fraction of Forest area at level 1") - - var = nc%setVariable("L1_fPerm","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_fPerm(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","fraction of permeable area at level 1") - - var = nc%setVariable("L1_Inter","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_inter(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Interception storage at level 1") - - var = nc%setVariable("L1_snowPack","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_snowPack(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Snowpack at level 1") - - var = nc%setVariable("L1_sealSTW","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_sealSTW(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Retention storage of impervious areas at level 1") - - allocate( dummy_d3( nrows1, ncols1, size( L1_soilMoist, 2) ) ) - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_soilMoist(s1:e1,ii), mask1, nodata_dp ) - end do - - var = nc%setVariable("L1_soilMoist","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","soil moisture at level 1") - - var = nc%setVariable("L1_unsatSTW","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_unsatSTW(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","upper soil storage at level 1") - - var = nc%setVariable("L1_satSTW","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_satSTW(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","groundwater storage at level 1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_aETSoil(s1:e1,ii), mask1, nodata_dp ) - end do - - var = nc%setVariable("L1_aETSoil","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","soil actual ET at level 1") - - var = nc%setVariable("L1_aETCanopy","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_aETCanopy(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","canopy actual ET at level 1") - - var = nc%setVariable("L1_aETSealed","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_aETSealed(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","sealed actual ET at level 1") - - var = nc%setVariable("L1_baseflow","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_baseflow(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","baseflow at level 1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_infilSoil(s1:e1,ii), mask1, nodata_dp ) - end do - - var = nc%setVariable("L1_infilSoil","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","soil in-exfiltration at level 1") - - var = nc%setVariable("L1_fastRunoff","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_fastRunoff(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","fast runoff") - - var = nc%setVariable("L1_percol","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_percol(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","percolation at level 1") - - var = nc%setVariable("L1_melt","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_melt(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","snow melt at level 1") - - var = nc%setVariable("L1_preEffect","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_preEffect(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","effective precip. depth (snow melt + rain) at level 1") - - var = nc%setVariable("L1_rain","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_rain(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","rain (liquid water) at level 1") - - var = nc%setVariable("L1_runoffSeal","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_runoffSeal(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","runoff from impervious area at level 1") - - var = nc%setVariable("L1_slowRunoff","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_slowRunoff(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","slow runoff at level 1") - - var = nc%setVariable("L1_snow","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_snow(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","snow (solid water) at level 1") - - var = nc%setVariable("L1_Throughfall","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_Throughfall(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","throughfall at level 1") - - var = nc%setVariable("L1_total_runoff","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_total_runoff(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","total runoff at level 1") - - !------------------------------------------- - ! EFFECTIVE PARAMETERS - !------------------------------------------- - var = nc%setVariable("L1_alpha","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_alpha(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","exponent for the upper reservoir at level 1") - - var = nc%setVariable("L1_degDayInc","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_degDayInc(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","increase of the Degree-day factor per mm of increase in precipitation at level 1") - - var = nc%setVariable("L1_degDayMax","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_degDayMax(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","maximum degree-day factor at level 1") - - var = nc%setVariable("L1_degDayNoPre","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_degDayNoPre(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","degree-day factor with no precipitation at level 1") - - var = nc%setVariable("L1_degDay","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_degDay(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","degree-day factor at level 1") - - var = nc%setVariable("L1_karstLoss","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_karstLoss(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Karstic percolation loss at level 1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_fRoots(s1:e1,ii), mask1, nodata_dp ) - end do - var = nc%setVariable("L1_fRoots","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","Fraction of roots in soil horizons at level 1") - - var = nc%setVariable("L1_maxInter","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_maxInter(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Maximum interception at level 1") - - var = nc%setVariable("L1_kfastFlow","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_kfastFlow(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","fast interflow recession coefficient at level 1") - - var = nc%setVariable("L1_kSlowFlow","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_kSlowFlow(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","slow interflow recession coefficient at level 1") - - var = nc%setVariable("L1_kBaseFlow","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_kBaseFlow(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","baseflow recession coefficient at level 1") - - var = nc%setVariable("L1_kPerco","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_kPerco(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","percolation coefficient at level 1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_soilMoistFC(s1:e1,ii), mask1, nodata_dp ) - end do - var = nc%setVariable("L1_soilMoistFC","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","SM below which actual ET is reduced linearly till PWP at level 1 for processCase(3)=1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_soilMoistSat(s1:e1,ii), mask1, nodata_dp ) - end do - var = nc%setVariable("L1_soilMoistSat","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","Saturation soil moisture for each horizon [mm] at level 1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_soilMoistExp(s1:e1,ii), mask1, nodata_dp ) - end do - var = nc%setVariable("L1_soilMoistExp","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","Exponential parameter to how non-linear is the soil water retention at level 1") - - if (processMatrix(3,1) == 2) then - var = nc%setVariable("L1_jarvis_thresh_c1","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_jarvis_thresh_c1(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","jarvis critical value for normalized soil water content") - end if - - if (processMatrix(5,1) == -1) then - var = nc%setVariable("L1_petLAIcorFactor","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_petLAIcorFactor(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","PET correction factor based on LAI") - end if - - var = nc%setVariable("L1_tempThresh","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_tempThresh(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Threshold temperature for snow/rain at level 1") - - var = nc%setVariable("L1_unsatThresh","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_unsatThresh(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Threshhold water depth controlling fast interflow at level 1") - - var = nc%setVariable("L1_sealedThresh","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_sealedThresh(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Threshhold water depth for surface runoff in sealed surfaces at level 1") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_wiltingPoint(s1:e1,ii), mask1, nodata_dp ) - end do - var = nc%setVariable("L1_wiltingPoint","f64",(/rows1,cols1,soil1/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","Permanent wilting point at level 1") - - deallocate( dummy_d3 ) - - select case (processMatrix(5,1)) - case(-1:0) ! PET is input - - var = nc%setVariable("L1_fAsp","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_fAsp(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","PET correction factor due to terrain aspect at level 1") - - case(1) ! Hargreaves-Samani - - var = nc%setVariable("L1_fAsp","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_fAsp(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","PET correction factor due to terrain aspect at level 1") - - var = nc%setVariable("L1_HarSamCoeff","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_HarSamCoeff(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Hargreaves-Samani coefficient") - - case(2) ! Priestley-Taylor - - allocate( dummy_d3( nrows1, ncols1, size( L1_PrieTayAlpha, 2) ) ) - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_PrieTayAlpha(s1:e1,ii), mask1, nodata_dp ) - end do - - var = nc%setVariable("L1_PrieTayAlpha","f64",(/rows1,cols1,months/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","Priestley Taylor coeffiecient (alpha)") - - deallocate( dummy_d3 ) - - case(3) ! Penman-Monteith - - allocate( dummy_d3( nrows1, ncols1, size( L1_aeroResist, 2) ) ) - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_aeroResist(s1:e1,ii), mask1, nodata_dp ) - end do - - var = nc%setVariable("L1_aeroResist","f64",(/rows1,cols1,months/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","aerodynamical resitance") - - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L1_surfResist(s1:e1,ii), mask1, nodata_dp ) - end do - - var = nc%setVariable("L1_surfResist","f64",(/rows1,cols1,months/)) - call var%setFillValue(nodata_dp) - call var%setData(dummy_d3) - call var%setAttribute("long_name","bulk surface resitance") - - deallocate( dummy_d3 ) - - end select - - var = nc%setVariable("L0_rowCoor","i32",(/rows0,cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_cellCoor(s0:e0,1), mask0, nodata_i4)) - call var%setAttribute("long_name","row coordinates at Level 0") - - var = nc%setVariable("L0_colCoor","i32",(/rows0,cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_cellCoor(s0:e0,2), mask0, nodata_i4)) - call var%setAttribute("long_name","col coordinates at Level 0") - - var = nc%setVariable("L0_Id","i32",(/rows0,cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_Id(s0:e0), mask0, nodata_i4)) - call var%setAttribute("long_name","cell IDs at level 0") - - var = nc%setVariable("L0_areaCell","f64",(/rows0,cols0/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L0_areaCell(s0:e0), mask0, nodata_dp)) - call var%setAttribute("long_name","Area of a cell at level-0 [m2]") - - var = nc%setVariable("L0_slope_emp","f64",(/rows0,cols0/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L0_slope_emp(s0:e0), mask0, nodata_dp)) - call var%setAttribute("long_name","Empirical quantiles of slope") - - var = nc%setVariable("L1_basin_Mask","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(merge(1_i4, 0_i4, & - reshape(basin%L1_Mask(basin%L1_iStartMask(iBasin):basin%L1_iEndMask(iBasin)),& - (/nrows1,ncols1/)))) - call var%setAttribute("long_name","Mask at Level 1") - - var = nc%setVariable("L1_Id","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_Id(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name","cell IDs at level 1") - - var = nc%setVariable("L1_rowCoor","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_cellCoor(s1:e1,1), mask1, nodata_i4)) - call var%setAttribute("long_name","row cell Coordinates at Level 1") - - var = nc%setVariable("L1_colCoor","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_cellCoor(s1:e1,2), mask1, nodata_i4)) - call var%setAttribute("long_name","col cell Coordinates at Level 1") - - var = nc%setVariable("L1_upBound_L0","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_upBound_L0(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name","Row start at finer level-0 scale") - - var = nc%setVariable("L1_downBound_L0","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_downBound_L0(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name","Row end at finer level-0 scale") - - var = nc%setVariable("L1_leftBound_L0","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_leftBound_L0(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name","Col start at finer level-0 scale") - - var = nc%setVariable("L1_rightBound_L0","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_rightBound_L0(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name","Col end at finer level-0 scal") - - var = nc%setVariable("L1_nTCells_L0","i32",(/rows1,cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_nTCells_L0(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name","Total number of valid L0 cells in a given L1 cell") - - var = nc%setVariable("L1_areaCell","f64",(/rows1,cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_areaCell(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name","Effective area of cell at this level [km2]") - - call nc%close() - - end do basin_loop - - end subroutine write_restart_files - - ! ------------------------------------------------------------------ - - ! NAME - ! read_restart_config - - ! PURPOSE - !> \brief reads configuration apart from Level 11 configuration - !> from a restart directory - - !> \details read configuration variables from a given restart - !> directory and initializes all configuration variables, - !> that are initialized in the subroutine initialise, - !> contained in module mo_startup. - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" number of basin - !> \param[in] "character(256) :: InPath" Input Path including trailing slash - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - - ! RESTRICTIONS - !> \note Restart Files must have the format, as if - !> it would have been written by subroutine write_restart_files - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober - !> \date Apr 2013 - ! Modified David Schaefer Nov 2015 - mo_netcdf - ! Zink M. Demirel C.,Mar 2017 - Added Jarvis soil water stress function at SM process(3) + integer(i4) :: iBasin + integer(i4) :: ii + integer(i4) :: s1 ! start index at level 1 + integer(i4) :: e1 ! end index at level 1 + logical, dimension(:, :), allocatable :: mask1 ! mask at level 1 + real(dp), dimension(:, :, :), allocatable :: dummy_3D ! dummy variable + integer(i4) :: max_extent - subroutine read_restart_config( iBasin, soilId_isPresent, InPath ) - - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_init_states, only: get_basin_info - use mo_append, only: append - use mo_netcdf, only: NcDataset, NcVariable - use mo_mhm_constants, only: nodata_dp - use mo_init_states, only: calculate_grid_properties - use mo_global_variables, only: L0_Basin, & ! check whether L0_Basin should be read - perform_mpr, & ! switch that controls whether mpr is performed or not - L0_soilId, & ! soil IDs at lower level - iFlag_soilDB, & ! options to handle different types of soil databases - nSoilHorizons_mHM, & ! soil horizons info for mHM - L0_cellCoor , & - L0_Id , & ! Ids of grid at level-0 - L0_slope_emp , & ! Empirical quantiles of slope - basin, & - nBasins, & - level1, & - L0_nCells, & - L0_areaCell, & ! Ids of grid at level-0 - L1_areaCell, & ! [km2] Effective area of cell at this level - nSoilTypes, & - resolutionHydrology, & - L1_nCells, & - L1_Id , & ! Ids of grid at level-1 - L1_cellCoor , & - L1_upBound_L0 , & ! Row start at finer level-0 scale - L1_downBound_L0, & ! Row end at finer level-0 scale - L1_leftBound_L0, & ! Col start at finer level-0 scale - L1_rightBound_L0, & ! Col end at finer level-0 scale - L1_nTCells_L0 ! Total number of valid L0 cells in a given L1 cell - - implicit none - - ! - integer(i4), intent(in) :: iBasin - integer(i4), dimension(:), allocatable, intent(inout) :: soilId_isPresent - character(256), intent(in) :: InPath ! list of Output paths per Basin - - ! - integer(i4) :: nrows0 ! Number of rows at level 0 - integer(i4) :: ncols0 ! Number of cols at level - integer(i4) :: iStart0, iEnd0 - logical, dimension(:,:), allocatable :: mask0 ! Mask at Level 0 - integer(i4) :: nrows1 ! Number of rows at level 1 - integer(i4) :: ncols1 ! Number of cols at level 1 - logical, dimension(:,:), allocatable :: mask1 ! Mask at Level 1 - real(dp) :: xllcorner0, yllcorner0 - real(dp) :: cellsize0 - ! - ! Dummy Variables - integer(i4) :: ii, kk, nH - integer(i4), dimension(:,:), allocatable :: dummyI2 ! dummy, 2 dimension I4 - integer(i4), dimension(:,:), allocatable :: dummyI22 ! 2nd dummy, 2 dimension I4 - real(dp), dimension(:,:), allocatable :: dummyD2 ! dummy, 2 dimension DP - - ! local variables - character(256) :: Fname - type(NcDataset) :: nc + type(NcDataset) :: nc + type(NcDimension) :: rows1, cols1, soil1, lcscenes, lais type(NcVariable) :: var - - ! read config - Fname = trim(InPath) // 'mHM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' ! '_restart.nc' - call message(' Reading config from ', trim(adjustl(Fname)),' ...') - - ! - ! level-0 information - call get_basin_info( iBasin, 0, nrows0, ncols0, iStart= iStart0, iEnd=iEnd0, mask=mask0, & - xllcorner=xllcorner0, yllcorner=yllcorner0, cellsize=cellsize0 ) - ! - if (iBasin .eq. 1) then - allocate( level1%nrows (nBasins) ) - allocate( level1%ncols (nBasins) ) - allocate( level1%xllcorner (nBasins) ) - allocate( level1%yllcorner (nBasins) ) - allocate( level1%cellsize (nBasins) ) - allocate( level1%nodata_value (nBasins) ) - end if - ! grid properties - call calculate_grid_properties( nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - resolutionHydrology(iBasin) , & - level1%nrows(iBasin), level1%ncols(iBasin), level1%xllcorner(iBasin), & - level1%yllcorner(iBasin), level1%cellsize(iBasin), level1%nodata_value(iBasin) ) - ! - ! level-1 information - call get_basin_info( iBasin, 1, nrows1, ncols1 ) - - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! Read L0 variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - nc = NcDataset(fname,"r") - ! check whether L0 data should be read - if ( iBasin .eq. 1 ) then - ! read L0 cellCoor - allocate( dummyI22( count(mask0), 2 )) - - var = nc%getVariable("L0_rowCoor") - call var%getData(dummyI2) - dummyI22(:,1) = pack( dummyI2, mask0 ) - - var = nc%getVariable("L0_colCoor") - call var%getData(dummyI2) - dummyI22(:,2) = pack( dummyI2, mask0 ) - - call append( L0_cellCoor, dummyI22) - deallocate( dummyI22 ) - ! - var = nc%getVariable("L0_Id") - call var%getData(dummyI2) - call append( L0_Id, pack(dummyI2, mask0) ) - ! - var = nc%getVariable("L0_areaCell") - call var%getData(dummyD2) - call append( L0_areaCell, pack(dummyD2, mask0) ) - ! - var = nc%getVariable("L0_slope_emp") - call var%getData(dummyD2) - call append( L0_slope_emp, pack(dummyD2, mask0) ) - else - if ( L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1) ) then - ! read L0 cellCoor - allocate( dummyI22( count(mask0), 2 )) - - var = nc%getVariable("L0_rowCoor") - call var%getData(dummyI2) - dummyI22(:,1) = pack( dummyI2, mask0 ) - - var = nc%getVariable("L0_colCoor") - call var%getData(dummyI2) - dummyI22(:,2) = pack( dummyI2, mask0 ) - - call append( L0_cellCoor, dummyI22) - deallocate( dummyI22 ) - ! - var = nc%getVariable("L0_Id") - call var%getData(dummyI2) - call append( L0_Id, pack(dummyI2, mask0) ) - ! - var = nc%getVariable("L0_areaCell") - call var%getData(dummyD2) - call append( L0_areaCell, pack(dummyD2, mask0) ) - ! - var = nc%getVariable("L0_slope_emp") - call var%getData(dummyD2) - call append( L0_slope_emp, pack(dummyD2, mask0) ) - end if - end if - - ! update L0_nCells - L0_nCells = size(L0_Id,1) - - !------------------------------------------------------ - ! Assign whether a given soil type is present or not - !------------------------------------------------------ - if ( iBasin .eq. 1 ) then - allocate( soilId_isPresent(nSoilTypes) ) - soilId_isPresent(:) = 0 - end if - !------------------------------------------------------ - ! set soil types when mpr should be performed - !------------------------------------------------------ - if ( perform_mpr ) then - nH = 1 !> by default; when iFlag_soilDB = 0 - if ( iFlag_soilDB .eq. 1 ) nH = nSoilHorizons_mHM - do ii = 1, nH - do kk = iStart0, iEnd0 - soilId_isPresent( L0_soilId(kk,ii) ) = 1 - end do - end do - end if - ! - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! Read L1 variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! read L1 mask - allocate( mask1( nrows1, ncols1) ) - var = nc%getVariable("L1_basin_Mask") - call var%getData(dummyI2) - mask1 = (dummyI2 .eq. 1_i4) - call append( basin%L1_Mask, reshape( mask1, (/nrows1*ncols1/))) - ! - ! update basin database - if( iBasin .eq. 1 ) then - - allocate(basin%L1_iStart(nBasins)) - allocate(basin%L1_iEnd (nBasins)) - allocate(basin%L1_iStartMask(nBasins)) - allocate(basin%L1_iEndMask (nBasins)) - - ! basin information - basin%L1_iStart(iBasin) = 1 - basin%L1_iEnd (iBasin) = basin%L1_iStart(iBasin) + count(mask1) - 1 - - basin%L1_iStartMask(iBasin) = 1 - basin%L1_iEndMask (iBasin) = basin%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - - else - - ! basin information - basin%L1_iStart(iBasin) = basin%L1_iEnd(iBasin-1) + 1 - basin%L1_iEnd (iBasin) = basin%L1_iStart(iBasin) + count(mask1) - 1 - - basin%L1_iStartMask(iBasin) = basin%L1_iEndMask(iBasin-1) + 1 - basin%L1_iEndMask (iBasin) = basin%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - end if - ! - ! L1 cell Ids - var = nc%getVariable("L1_Id") - call var%getData(dummyI2) - call append( L1_Id, pack(dummyI2, mask1) ) - - ! L1 cell coordinates - allocate( dummyI22( count(mask1), 2 )) - var = nc%getVariable("L1_rowCoor") - call var%getData(dummyI2) - dummyI22(:,1) = pack( dummyI2, mask1 ) - var = nc%getVariable("L1_colCoor") - call var%getData(dummyI2) - dummyI22(:,2) = pack( dummyI2, mask1 ) - call append( L1_cellCoor, dummyI22) - deallocate( dummyI22 ) - ! - var = nc%getVariable("L1_upBound_L0") - call var%getData(dummyI2) - call append( L1_upBound_L0 , pack( dummyI2, mask1) ) - ! - var = nc%getVariable("L1_downBound_L0") - call var%getData(dummyI2) - call append( L1_downBound_L0 , pack( dummyI2, mask1) ) - ! - var = nc%getVariable("L1_leftBound_L0") - call var%getData(dummyI2) - call append( L1_leftBound_L0 , pack( dummyI2, mask1) ) - ! - var = nc%getVariable("L1_rightBound_L0") - call var%getData(dummyI2) - call append( L1_rightBound_L0, pack( dummyI2, mask1) ) - ! - var = nc%getVariable("L1_nTCells_L0") - call var%getData(dummyI2) - call append( L1_nTCells_L0 , pack( dummyI2, mask1) ) - ! - var = nc%getVariable("L1_areaCell") - call var%getData(dummyD2) - call append( L1_areaCell , pack( dummyD2, mask1) ) - - L1_nCells = size( L1_Id, 1 ) - - call nc%close() + ! get maximum extent of one dimension 2 or 3 + max_extent = max(nSoilHorizons_mHM, nLCoverScene, nLAI) + + basin_loop : do iBasin = 1, size(OutPath) + + ! write restart file for iBasin + Fname = trim(OutPath(iBasin)) // "mHM_restart_" // trim(num2str(iBasin, "(i3.3)")) // ".nc" + ! print a message + call message(" Writing Restart-file: ", trim(adjustl(Fname)), " ...") + + nc = NcDataset(fname, "w") + + call write_grid_info(level1(iBasin), "1", nc) + + rows1 = nc%getDimension("nrows1") + cols1 = nc%getDimension("ncols1") + + soil1 = nc%setDimension("L1_soilhorizons", nSoilHorizons_mHM) + lcscenes = nc%setDimension("LCoverScenes", nLCoverScene) + lais = nc%setDimension("LAI_timesteps", nLAI) + + ! for appending and intialization + allocate(dummy_3D(rows1%getLength(), cols1%getLength(), max_extent)) + allocate(mask1(rows1%getLength(), cols1%getLength())) + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + mask1 = level1(iBasin)%mask + + var = nc%setVariable("L1_Inter", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_inter(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "Interception storage at level 1") + + var = nc%setVariable("L1_snowPack", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_snowPack(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "Snowpack at level 1") + + var = nc%setVariable("L1_sealSTW", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_sealSTW(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "Retention storage of impervious areas at level 1") + + do ii = 1, nSoilHorizons_mHM + dummy_3D(:, :, ii) = unpack(L1_soilMoist(s1 : e1, ii), mask1, nodata_dp) + end do + + var = nc%setVariable("L1_soilMoist", "f64", (/rows1, cols1, soil1/)) + call var%setFillValue(nodata_dp) + call var%setData(dummy_3D(:, :, 1 : nSoilHorizons_mHM)) + call var%setAttribute("long_name", "soil moisture at level 1") + + var = nc%setVariable("L1_unsatSTW", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_unsatSTW(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "upper soil storage at level 1") + + var = nc%setVariable("L1_satSTW", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_satSTW(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "groundwater storage at level 1") + + do ii = 1, nSoilHorizons_mHM + dummy_3D(:, :, ii) = unpack(L1_aETSoil(s1 : e1, ii), mask1, nodata_dp) + end do + + var = nc%setVariable("L1_aETSoil", "f64", (/rows1, cols1, soil1/)) + call var%setFillValue(nodata_dp) + call var%setData(dummy_3D(:, :, 1 : nSoilHorizons_mHM)) + call var%setAttribute("long_name", "soil actual ET at level 1") + + var = nc%setVariable("L1_aETCanopy", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_aETCanopy(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "canopy actual ET at level 1") + + var = nc%setVariable("L1_aETSealed", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_aETSealed(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "sealed actual ET at level 1") + + var = nc%setVariable("L1_baseflow", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_baseflow(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "baseflow at level 1") + + do ii = 1, nSoilHorizons_mHM + dummy_3D(:, :, ii) = unpack(L1_infilSoil(s1 : e1, ii), mask1, nodata_dp) + end do + + var = nc%setVariable("L1_infilSoil", "f64", (/rows1, cols1, soil1/)) + call var%setFillValue(nodata_dp) + call var%setData(dummy_3D(:, :, 1 : nSoilHorizons_mHM)) + call var%setAttribute("long_name", "soil in-exfiltration at level 1") + + var = nc%setVariable("L1_fastRunoff", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_fastRunoff(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "fast runoff") + + var = nc%setVariable("L1_percol", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_percol(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "percolation at level 1") + + var = nc%setVariable("L1_melt", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_melt(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "snow melt at level 1") + + var = nc%setVariable("L1_preEffect", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_preEffect(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "effective precip. depth (snow melt + rain) at level 1") + + var = nc%setVariable("L1_rain", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_rain(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "rain (liquid water) at level 1") + + var = nc%setVariable("L1_runoffSeal", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_runoffSeal(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "runoff from impervious area at level 1") + + var = nc%setVariable("L1_slowRunoff", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_slowRunoff(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "slow runoff at level 1") + + var = nc%setVariable("L1_snow", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_snow(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "snow (solid water) at level 1") + + var = nc%setVariable("L1_Throughfall", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_Throughfall(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "throughfall at level 1") + + var = nc%setVariable("L1_total_runoff", "f64", (/rows1, cols1/)) + call var%setFillValue(nodata_dp) + call var%setData(unpack(L1_total_runoff(s1 : e1), mask1, nodata_dp)) + call var%setAttribute("long_name", "total runoff at level 1") + + call write_eff_params(mask1, s1, e1, rows1, cols1, soil1, lcscenes, lais, nc) + + call nc%close() + + deallocate(dummy_3D, mask1) + end do basin_loop - end subroutine read_restart_config + end subroutine write_restart_files ! ------------------------------------------------------------------ @@ -961,411 +347,441 @@ end subroutine read_restart_config ! Modified Stephan Thober Aug 2015 - moved read of routing states to mRM ! Modified David Schaefer Nov 2015 - mo_netcdf ! Stephan Thober Nov 2016 - moved processMatrix to common variables - subroutine read_restart_states( iBasin, InPath ) + subroutine read_restart_states(iBasin, InPath) - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp ! use mo_message, only: message - use mo_netcdf, only: NcDataset, NcVariable - use mo_string_utils, only: num2str - use mo_init_states, only: get_basin_info - use mo_mhm_constants, only: YearMonths_i4 - use mo_global_variables, only: & - L1_fSealed, & - L1_fForest, & - L1_fPerm, & - L1_Inter, & - L1_snowPack, & - L1_sealSTW, & - L1_soilMoist, & - L1_unsatSTW, & - L1_satSTW, & - L1_aETSoil, & - L1_aETCanopy, & - L1_aETSealed, & - L1_baseflow, & - L1_infilSoil, & - L1_fastRunoff, & - L1_melt, & - L1_percol, & - L1_preEffect, & - L1_rain, & - L1_runoffSeal, & - L1_slowRunoff, & - L1_snow, & - L1_Throughfall, & - L1_total_runoff, & - L1_alpha, & - L1_degDayInc, & - L1_degDayMax, & - L1_degDayNoPre, & - L1_degDay, & - L1_karstLoss, & - L1_fAsp, & - L1_petLAIcorFactor, & - L1_HarSamCoeff, & - L1_PrieTayAlpha, & - L1_aeroResist, & - L1_surfResist, & - L1_fRoots, & - L1_maxInter, & - L1_kfastFlow, & - L1_kSlowFlow, & - L1_kBaseFlow, & - L1_kPerco, & - L1_soilMoistFC, & - L1_soilMoistSat, & - L1_soilMoistExp, & - L1_jarvis_thresh_c1, & - L1_petLAIcorFactor, & - L1_tempThresh, & - L1_unsatThresh, & - L1_sealedThresh, & - L1_wiltingPoint, & - nSoilHorizons_mHM - use mo_common_variables, only: & - processMatrix ! process configuration + use mo_netcdf, only : NcDataset, NcVariable, NcDimension + use mo_string_utils, only : num2str + use mo_global_variables, only : & + L1_Inter, & + L1_snowPack, & + L1_sealSTW, & + L1_soilMoist, & + L1_unsatSTW, & + L1_satSTW, & + L1_aETSoil, & + L1_aETCanopy, & + L1_aETSealed, & + L1_baseflow, & + L1_infilSoil, & + L1_fastRunoff, & + L1_melt, & + L1_percol, & + L1_preEffect, & + L1_rain, & + L1_runoffSeal, & + L1_slowRunoff, & + L1_snow, & + L1_Throughfall, & + L1_total_runoff + use mo_mpr_global_variables, only : & + L1_fSealed, & + L1_alpha, & + L1_degDayInc, & + L1_degDayMax, & + L1_degDayNoPre, & + L1_degDay, & + L1_karstLoss, & + L1_fAsp, & + L1_HarSamCoeff, & + L1_PrieTayAlpha, & + L1_aeroResist, & + L1_surfResist, & + L1_fRoots, & + L1_maxInter, & + L1_kfastFlow, & + L1_kSlowFlow, & + L1_kBaseFlow, & + L1_kPerco, & + L1_soilMoistFC, & + L1_soilMoistSat, & + L1_soilMoistExp, & + L1_jarvis_thresh_c1, & + L1_petLAIcorFactor, & + L1_tempThresh, & + L1_unsatThresh, & + L1_sealedThresh, & + L1_wiltingPoint, & + nSoilHorizons_mHM, & + nLAI + use mo_common_variables, only : & + LC_year_start, LC_year_end, & + nLCoverScene, & + processMatrix, & ! process configuration + level1 implicit none - integer(i4), intent(in) :: iBasin + integer(i4), intent(in) :: iBasin character(256), intent(in) :: InPath ! list of Output paths per Basin - character(256) :: Fname - integer(i4) :: ii ! loop index - integer(i4) :: s1 ! start index at level 1 - integer(i4) :: e1 ! end index at level 1 - integer(i4) :: ncols1 ! number of colums at level 1 - integer(i4) :: nrows1 ! number of rows at level 1 - integer(i4) :: ncells1 ! number of cells at level 1 - logical, dimension(:,:), allocatable :: mask1 ! mask at level 1 + character(256) :: Fname + integer(i4) :: ii, jj ! loop index + integer(i4) :: s1 ! start index at level 1 + integer(i4) :: e1 ! end index at level 1 + logical, dimension(:, :), allocatable :: mask1 ! mask at level 1 - real(dp), dimension(:,:), allocatable :: dummyD2 ! dummy, 2 dimension - real(dp), dimension(:,:,:), allocatable :: dummyD3 ! dummy, 3 dimension + real(dp), dimension(:, :), allocatable :: dummyD2 ! dummy, 2 dimension + real(dp), dimension(:, :, :), allocatable :: dummyD3 ! dummy, 3 dimension + real(dp), dimension(:, :, :, :), allocatable :: dummyD4 ! dummy, 3 dimension type(NcDataset) :: nc type(NcVariable) :: var - + type(NcDimension) :: nc_dim + Fname = trim(InPath) // 'mHM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' ! call message(' Reading states from ', trim(adjustl(Fname)),' ...') - ! get basin information at level 1 - call get_basin_info( iBasin, 1, nrows1, ncols1, ncells=ncells1, & - iStart=s1, iEnd=e1, mask=mask1 ) - - nc = NcDataset(fname,"r") - - !------------------------------------------- - ! LAND COVER variables - !------------------------------------------- + allocate(mask1 (level1(iBasin)%nrows, level1(iBasin)%ncols)) + mask1 = level1(iBasin)%mask + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + + nc = NcDataset(fname, "r") + + ! get the dimensions + nc_dim = nc%getDimension("LAI_timesteps") + nLAI = nc_dim%getLength() + nc_dim = nc%getDimension("LCoverScenes") + nLCoverScene = nc_dim%getLength() + nc_dim = nc%getDimension("L1_soilhorizons") + nSoilHorizons_mHM = nc_dim%getLength() + + if (nc%hasVariable('L1_Inter')) then + !------------------------------------------- + ! STATE VARIABLES (optionally) + !------------------------------------------- + + ! Interception + var = nc%getVariable("L1_Inter") + call var%getData(dummyD2) + L1_inter(s1 : e1) = pack(dummyD2, mask1) + + ! Snowpack + var = nc%getVariable("L1_snowPack") + call var%getData(dummyD2) + L1_snowPack(s1 : e1) = pack(dummyD2, mask1) + + ! Retention storage of impervious areas + var = nc%getVariable("L1_sealSTW") + call var%getData(dummyD2) + L1_sealSTW(s1 : e1) = pack(dummyD2, mask1) + + ! upper soil storage + var = nc%getVariable("L1_unsatSTW") + call var%getData(dummyD2) + L1_unsatSTW(s1 : e1) = pack(dummyD2, mask1) + + ! groundwater storage + var = nc%getVariable("L1_satSTW") + call var%getData(dummyD2) + L1_satSTW(s1 : e1) = pack(dummyD2, mask1) + + ! Soil moisture of each horizon + var = nc%getVariable("L1_soilMoist") + call var%getData(dummyD3) + do ii = 1, nSoilHorizons_mHM + L1_soilMoist(s1 : e1, ii) = pack(dummyD3(:, :, ii), mask1) + end do + + !------------------------------------------- + ! FLUXES (optionally) + !------------------------------------------- + + ! soil actual ET + var = nc%getVariable("L1_aETSoil") + call var%getData(dummyD3) + do ii = 1, nSoilHorizons_mHM + L1_aETSoil(s1 : e1, ii) = pack(dummyD3(:, :, ii), mask1) + end do + + ! canopy actual ET + var = nc%getVariable("L1_aETCanopy") + call var%getData(dummyD2) + L1_aETCanopy(s1 : e1) = pack(dummyD2, mask1) + + ! sealed area actual ET + var = nc%getVariable("L1_aETSealed") + call var%getData(dummyD2) + L1_aETSealed(s1 : e1) = pack(dummyD2, mask1) + + ! baseflow + var = nc%getVariable("L1_baseflow") + call var%getData(dummyD2) + L1_baseflow(s1 : e1) = pack(dummyD2, mask1) + + ! soil in-exfiltration + var = nc%getVariable("L1_infilSoil") + call var%getData(dummyD3) + do ii = 1, nSoilHorizons_mHM + L1_infilSoil(s1 : e1, ii) = pack(dummyD3(:, :, ii), mask1) + end do + + ! fast runoff + var = nc%getVariable("L1_fastRunoff") + call var%getData(dummyD2) + L1_fastRunoff(s1 : e1) = pack(dummyD2, mask1) + + ! snow melt + var = nc%getVariable("L1_melt") + call var%getData(dummyD2) + L1_melt(s1 : e1) = pack(dummyD2, mask1) + + ! percolation + var = nc%getVariable("L1_percol") + call var%getData(dummyD2) + L1_percol(s1 : e1) = pack(dummyD2, mask1) + + ! effective precip. depth (snow melt + rain) + var = nc%getVariable("L1_preEffect") + call var%getData(dummyD2) + L1_preEffect(s1 : e1) = pack(dummyD2, mask1) + + ! rain (liquid water) + var = nc%getVariable("L1_rain") + call var%getData(dummyD2) + L1_rain(s1 : e1) = pack(dummyD2, mask1) + + ! runoff from impervious area + var = nc%getVariable("L1_runoffSeal") + call var%getData(dummyD2) + L1_runoffSeal(s1 : e1) = pack(dummyD2, mask1) + + ! slow runoff + var = nc%getVariable("L1_slowRunoff") + call var%getData(dummyD2) + L1_slowRunoff(s1 : e1) = pack(dummyD2, mask1) + + ! snow (solid water) + var = nc%getVariable("L1_snow") + call var%getData(dummyD2) + L1_snow(s1 : e1) = pack(dummyD2, mask1) + + ! throughfall + var = nc%getVariable("L1_Throughfall") + call var%getData(dummyD2) + L1_Throughfall(s1 : e1) = pack(dummyD2, mask1) + + ! total runoff + var = nc%getVariable("L1_total_runoff") + call var%getData(dummyD2) + L1_total_runoff(s1 : e1) = pack(dummyD2, mask1) + end if - var = nc%getVariable("L1_fSealed") - call var%getData(dummyD2) - L1_fSealed(s1:e1) = pack( dummyD2, mask1 ) + ! read the LCscene information + ! it is inside a basin loop, but is global information + var = nc%getVariable("LC_year_start") + call var%getData(LC_year_start) - var = nc%getVariable("L1_fForest") - call var%getData(dummyD2) - L1_fForest(s1:e1) = pack( dummyD2, mask1 ) + var = nc%getVariable("LC_year_end") + call var%getData(LC_year_end) - var = nc%getVariable("L1_fPerm") - call var%getData(dummyD2) - L1_fPerm(s1:e1) = pack( dummyD2, mask1 ) - - !------------------------------------------- - ! STATE VARIABLES !------------------------------------------- - - ! Interception - var = nc%getVariable("L1_Inter") - call var%getData(dummyD2) - L1_inter(s1:e1) = pack( dummyD2, mask1 ) - - ! Snowpack - var = nc%getVariable("L1_snowPack") - call var%getData(dummyD2) - L1_snowPack(s1:e1) = pack( dummyD2, mask1 ) - - ! Retention storage of impervious areas - var = nc%getVariable("L1_sealSTW") - call var%getData(dummyD2) - L1_sealSTW(s1:e1) = pack( dummyD2, mask1 ) - - ! upper soil storage - var = nc%getVariable("L1_unsatSTW") - call var%getData(dummyD2) - L1_unsatSTW(s1:e1) = pack( dummyD2, mask1 ) - - ! groundwater storage - var = nc%getVariable("L1_satSTW") - call var%getData(dummyD2) - L1_satSTW(s1:e1) = pack( dummyD2, mask1 ) - - ! Soil moisture of each horizon - var = nc%getVariable("L1_soilMoist") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_soilMoist(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) - end do - + ! EFFECTIVE PARAMETERS !------------------------------------------- - ! FLUXES - !------------------------------------------- - - ! soil actual ET - var = nc%getVariable("L1_aETSoil") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_aETSoil(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) - end do - - ! canopy actual ET - var = nc%getVariable("L1_aETCanopy") - call var%getData(dummyD2) - L1_aETCanopy(s1:e1) = pack( dummyD2, mask1 ) - - ! sealed area actual ET - var = nc%getVariable("L1_aETSealed") - call var%getData(dummyD2) - L1_aETSealed(s1:e1) = pack( dummyD2, mask1 ) - - ! baseflow - var = nc%getVariable("L1_baseflow") - call var%getData(dummyD2) - L1_baseflow(s1:e1) = pack( dummyD2, mask1 ) - - ! soil in-exfiltration - var = nc%getVariable("L1_infilSoil") + var = nc%getVariable("L1_fSealed") call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_infilSoil(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) + do ii = 1, nLCoverScene + L1_fSealed(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) end do - ! fast runoff - var = nc%getVariable("L1_fastRunoff") - call var%getData(dummyD2) - L1_fastRunoff(s1:e1) = pack( dummyD2, mask1 ) - - ! snow melt - var = nc%getVariable("L1_melt") - call var%getData(dummyD2) - L1_melt(s1:e1) = pack( dummyD2, mask1 ) - - ! percolation - var = nc%getVariable("L1_percol") - call var%getData(dummyD2) - L1_percol(s1:e1) = pack( dummyD2, mask1 ) - - ! effective precip. depth (snow melt + rain) - var = nc%getVariable("L1_preEffect") - call var%getData(dummyD2) - L1_preEffect(s1:e1) = pack( dummyD2, mask1 ) - - ! rain (liquid water) - var = nc%getVariable("L1_rain") - call var%getData(dummyD2) - L1_rain(s1:e1) = pack( dummyD2, mask1 ) - - ! runoff from impervious area - var = nc%getVariable("L1_runoffSeal") - call var%getData(dummyD2) - L1_runoffSeal(s1:e1) = pack( dummyD2, mask1 ) - - ! slow runoff - var = nc%getVariable("L1_slowRunoff") - call var%getData(dummyD2) - L1_slowRunoff(s1:e1) = pack( dummyD2, mask1 ) - - ! snow (solid water) - var = nc%getVariable("L1_snow") - call var%getData(dummyD2) - L1_snow(s1:e1) = pack( dummyD2, mask1 ) - - ! throughfall - var = nc%getVariable("L1_Throughfall") - call var%getData(dummyD2) - L1_Throughfall(s1:e1) = pack( dummyD2, mask1 ) - - ! total runoff - var = nc%getVariable("L1_total_runoff") - call var%getData(dummyD2) - L1_total_runoff(s1:e1) = pack( dummyD2, mask1 ) - - !------------------------------------------- - ! EFFECTIVE PARAMETERS - !------------------------------------------- - ! exponent for the upper reservoir var = nc%getVariable("L1_alpha") call var%getData(dummyD2) - L1_alpha(s1:e1) = pack( dummyD2, mask1 ) + L1_alpha(s1 : e1, 1, 1) = pack(dummyD2, mask1) ! increase of the Degree-day factor per mm of increase in precipitation var = nc%getVariable("L1_degDayInc") - call var%getData(dummyD2) - L1_degDayInc(s1:e1) = pack( dummyD2, mask1 ) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L1_degDayInc(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) + end do ! maximum degree-day factor var = nc%getVariable("L1_degDayMax") - call var%getData(dummyD2) - L1_degDayMax(s1:e1) = pack( dummyD2, mask1 ) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L1_degDayMax(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) + end do ! degree-day factor with no precipitation var = nc%getVariable("L1_degDayNoPre") - call var%getData(dummyD2) - L1_degDayNoPre(s1:e1) = pack( dummyD2, mask1 ) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L1_degDayNoPre(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) + end do ! degree-day factor var = nc%getVariable("L1_degDay") - call var%getData(dummyD2) - L1_degDay(s1:e1) = pack( dummyD2, mask1 ) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L1_degDay(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) + end do ! Karstic percolation loss var = nc%getVariable("L1_karstLoss") call var%getData(dummyD2) - L1_karstLoss(s1:e1) = pack( dummyD2, mask1 ) + L1_karstLoss(s1 : e1, 1, 1) = pack(dummyD2, mask1) ! Fraction of roots in soil horizons var = nc%getVariable("L1_fRoots") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_fRoots(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nSoilHorizons_mHM + L1_fRoots(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do end do ! Maximum interception var = nc%getVariable("L1_maxInter") - call var%getData(dummyD2) - L1_maxInter(s1:e1) = pack(dummyD2, mask1) + call var%getData(dummyD3) + do ii = 1, nLAI + L1_maxInter(s1 : e1, ii, 1) = pack(dummyD3(:, :, ii), mask1) + end do ! fast interflow recession coefficient var = nc%getVariable("L1_kfastFlow") - call var%getData(dummyD2) - L1_kfastFlow(s1:e1) = pack( dummyD2, mask1 ) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L1_kfastFlow(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) + end do ! slow interflow recession coefficient var = nc%getVariable("L1_kSlowFlow") call var%getData(dummyD2) - L1_kSlowFlow(s1:e1) = pack( dummyD2, mask1 ) + L1_kSlowFlow(s1 : e1, 1, 1) = pack(dummyD2, mask1) ! baseflow recession coefficient var = nc%getVariable("L1_kBaseFlow") call var%getData(dummyD2) - L1_kBaseFlow(s1:e1) = pack( dummyD2, mask1 ) + L1_kBaseFlow(s1 : e1, 1, 1) = pack(dummyD2, mask1) ! percolation coefficient var = nc%getVariable("L1_kPerco") call var%getData(dummyD2) - L1_kPerco(s1:e1) = pack( dummyD2, mask1 ) + L1_kPerco(s1 : e1, 1, 1) = pack(dummyD2, mask1) ! Soil moisture below which actual ET is reduced linearly till PWP ! for processCase(3) = 1 var = nc%getVariable("L1_soilMoistFC") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_soilMoistFC(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nSoilHorizons_mHM + L1_soilMoistFC(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do end do ! Saturation soil moisture for each horizon [mm] var = nc%getVariable("L1_soilMoistSat") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_soilMoistSat(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nSoilHorizons_mHM + L1_soilMoistSat(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do end do ! Exponential parameter to how non-linear is the soil water retention var = nc%getVariable("L1_soilMoistExp") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_soilMoistExp(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nSoilHorizons_mHM + L1_soilMoistExp(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do end do - if (processMatrix(3,1) == 2) then - ! jarvis critical value for normalized soil water content - var = nc%getVariable("L1_jarvis_thresh_c1") - call var%getData(dummyD2) - L1_jarvis_thresh_c1(s1:e1) = pack( dummyD2, mask1 ) + if (processMatrix(3, 1) == 2) then + ! jarvis critical value for normalized soil water content + var = nc%getVariable("L1_jarvis_thresh_c1") + call var%getData(dummyD2) + L1_jarvis_thresh_c1(s1 : e1, 1, 1) = pack(dummyD2, mask1) end if - - if (processMatrix(5,1) == -1) then - ! PET correction factor based on LAI - var = nc%getVariable("L1_petLAIcorFactor") - call var%getData(dummyD2) - L1_petLAIcorFactor(s1:e1) = pack( dummyD2, mask1 ) - end if - - ! Threshold temperature for snow/rain + + ! Threshold temperature for snow/rain var = nc%getVariable("L1_tempThresh") - call var%getData(dummyD2) - L1_tempThresh(s1:e1) = pack( dummyD2, mask1 ) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L1_tempThresh(s1 : e1, 1, ii) = pack(dummyD3(:, :, ii), mask1) + end do - ! Threshhold water depth controlling fast interflow + ! Threshold water depth controlling fast interflow var = nc%getVariable("L1_unsatThresh") call var%getData(dummyD2) - L1_unsatThresh(s1:e1) = pack( dummyD2, mask1 ) + L1_unsatThresh(s1 : e1, 1, 1) = pack(dummyD2, mask1) - ! Threshhold water depth for surface runoff in sealed surfaces + ! Threshold water depth for surface runoff in sealed surfaces var = nc%getVariable("L1_sealedThresh") call var%getData(dummyD2) - L1_sealedThresh(s1:e1) = pack( dummyD2, mask1 ) + L1_sealedThresh(s1 : e1, 1, 1) = pack(dummyD2, mask1) ! Permanent wilting point var = nc%getVariable("L1_wiltingPoint") - call var%getData(dummyD3) - do ii = 1, nSoilHorizons_mHM - L1_wiltingPoint(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nSoilHorizons_mHM + L1_wiltingPoint(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do end do ! different parameters dependent on PET formulation - select case (processMatrix(5,1)) + select case (processMatrix(5, 1)) case(-1) ! PET is input - ! PET correction factor due to LAI - var = nc%getVariable("L1_petLAIcorFactor") - call var%getData(dummyD2) - L1_petLAIcorFactor(s1:e1) = pack( dummyD2, mask1 ) - + ! PET correction factor due to LAI + var = nc%getVariable("L1_petLAIcorFactor") + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nLAI + L1_petLAIcorFactor(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do + end do + case(0) ! PET is input - ! PET correction factor due to terrain aspect - var = nc%getVariable("L1_fAsp") - call var%getData(dummyD2) - L1_fAsp(s1:e1) = pack( dummyD2, mask1 ) + ! PET correction factor due to terrain aspect + var = nc%getVariable("L1_fAsp") + call var%getData(dummyD2) + L1_fAsp(s1 : e1, 1, 1) = pack(dummyD2, mask1) case(1) ! Hargreaves-Samani - ! PET correction factor due to terrain aspect - var = nc%getVariable("L1_fAsp") - call var%getData(dummyD2) - L1_fAsp(s1:e1) = pack( dummyD2, mask1 ) + ! PET correction factor due to terrain aspect + var = nc%getVariable("L1_fAsp") + call var%getData(dummyD2) + L1_fAsp(s1 : e1, 1, 1) = pack(dummyD2, mask1) - ! Hargreaves Samani coeffiecient - var = nc%getVariable("L1_HarSamCoeff") - call var%getData(dummyD2) - L1_HarSamCoeff(s1:e1) = pack( dummyD2, mask1 ) + ! Hargreaves Samani coeffiecient + var = nc%getVariable("L1_HarSamCoeff") + call var%getData(dummyD2) + L1_HarSamCoeff(s1 : e1, 1, 1) = pack(dummyD2, mask1) case(2) ! Priestely-Taylor - ! Priestley Taylor coeffiecient (alpha) - var = nc%getVariable("L1_PrieTayAlpha") - call var%getData(dummyD3) - do ii = 1, YearMonths_i4 - L1_PrieTayAlpha(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) - end do + ! Priestley Taylor coeffiecient (alpha) + var = nc%getVariable("L1_PrieTayAlpha") + call var%getData(dummyD3) + do ii = 1, nLAI + L1_PrieTayAlpha(s1 : e1, ii, 1) = pack(dummyD3(:, :, ii), mask1) + end do case(3) ! Penman-Monteith - ! aerodynamical resitance - var = nc%getVariable("L1_aeroResist") - call var%getData(dummyD3) - do ii = 1, YearMonths_i4 - L1_aeroResist(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) - end do - - ! bulk surface resitance - var = nc%getVariable("L1_surfResist") - call var%getData(dummyD3) - do ii = 1, YearMonths_i4 - L1_surfResist(s1:e1, ii) = pack( dummyD3( :,:,ii), mask1) - end do + ! aerodynamical resitance + var = nc%getVariable("L1_aeroResist") + call var%getData(dummyD4) + do jj = 1, nLCoverScene + do ii = 1, nLAI + L1_aeroResist(s1 : e1, ii, jj) = pack(dummyD4(:, :, ii, jj), mask1) + end do + end do + + ! bulk surface resitance + var = nc%getVariable("L1_surfResist") + call var%getData(dummyD3) + do ii = 1, nLAI + L1_surfResist(s1 : e1, ii, 1) = pack(dummyD3(:, :, ii), mask1) + end do end select @@ -1373,4 +789,152 @@ subroutine read_restart_states( iBasin, InPath ) end subroutine read_restart_states + subroutine unpack_field_and_write_1d_i4 (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + integer(i4), intent(in) :: fill_value ! fill value used for missing values + integer(i4), dimension(:), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + + ! set variable + var = nc%setVariable(var_name, "i32", var_dims) + call var%setFillValue(fill_value) + + ! set the unpacked data + call var%setData(unpack(data, mask, fill_value)) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + + subroutine unpack_field_and_write_1d_dp (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : dp + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + real(dp), intent(in) :: fill_value ! fill value used for missing values + real(dp), dimension(:), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + + ! set variable + var = nc%setVariable(var_name, "f64", var_dims) + call var%setFillValue(fill_value) + + ! set the unpacked data + call var%setData(unpack(data, mask, fill_value)) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + + subroutine unpack_field_and_write_2d_dp (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : dp, i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + real(dp), intent(in) :: fill_value ! fill value used for missing values + real(dp), dimension(:, :), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + real(dp), dimension(:, :, :), allocatable :: dummy_arr + integer(i4), dimension(3) :: dim_length + integer(i4) :: ii + + ! set variable + var = nc%setVariable(var_name, "f64", var_dims) + call var%setFillValue(fill_value) + + dim_length = var%getShape() + allocate(dummy_arr(dim_length(1), dim_length(2), dim_length(3))) + do ii = 1, size(data, 2) + dummy_arr(:, :, ii) = unpack(data(:, ii), mask, fill_value) + end do + + ! set the unpacked data + call var%setData(dummy_arr) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + + subroutine unpack_field_and_write_3d_dp (nc, var_name, var_dims, fill_value, data, mask, var_long_name) + + use mo_kind, only : dp, i4 + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + + implicit none + ! intent inout + type(NcDataset), intent(inout) :: nc ! NcDataset to add variable to + ! intent in + character(*), intent(in) :: var_name ! variable name + type(NcDimension), dimension(:), intent(in) :: var_dims ! vector of Variable dimensions + real(dp), intent(in) :: fill_value ! fill value used for missing values + real(dp), dimension(:, :, :), intent(in) :: data ! packed data to be set to variable + logical, dimension(:, :), intent(in) :: mask ! mask used for unpacking + character(*), optional, intent(in) :: var_long_name ! variable long name attribute + ! local variables + type(NcVariable) :: var + real(dp), dimension(:, :, :, :), allocatable :: dummy_arr + integer(i4), dimension(4) :: dim_length + integer(i4) :: ii, jj + + ! set variable + var = nc%setVariable(var_name, "f64", var_dims) + call var%setFillValue(fill_value) + + dim_length = var%getShape() + allocate(dummy_arr(dim_length(1), dim_length(2), dim_length(3), dim_length(4))) + do ii = 1, size(data, 2) + do jj = 1, size(data, 3) + dummy_arr(:, :, ii, jj) = unpack(data(:, ii, jj), mask, fill_value) + end do + end do + + ! set the unpacked data + call var%setData(dummy_arr) + + ! optionally set attributes + if (present(var_long_name)) then + call var%setAttribute("long_name", trim(var_long_name)) + end if + + end subroutine + END MODULE mo_restart diff --git a/src/mHM/mo_runoff.f90 b/src/mHM/mo_runoff.f90 index 6f5e7736..0743cdec 100644 --- a/src/mHM/mo_runoff.f90 +++ b/src/mHM/mo_runoff.f90 @@ -10,15 +10,15 @@ !> \date Dec 2012 MODULE mo_runoff - - USE mo_kind, ONLY: dp - USE mo_constants, ONLY: eps_dp + + USE mo_kind, ONLY : dp + USE mo_common_constants, ONLY : eps_dp IMPLICIT NONE - PUBLIC :: runoff_unsat_zone - PUBLIC :: runoff_sat_zone - PUBLIC :: L1_total_runoff + PUBLIC :: runoff_unsat_zone + PUBLIC :: runoff_sat_zone + PUBLIC :: L1_total_runoff ! PUBLIC :: L11_runoff_acc PRIVATE @@ -99,25 +99,25 @@ MODULE mo_runoff ! JM, Aug 2013 - ordering of arguments changed ! ------------------------------------------------------------------ - SUBROUTINE runoff_unsat_zone(k1, kp, k0, alpha, & ! Intent IN - karst_loss, pefec_soil, unsat_thresh, & ! Intent IN - sat_storage, unsat_storage, & ! Intent INOUT - slow_interflow, fast_interflow, perc) ! Intent OUT + SUBROUTINE runoff_unsat_zone(k1, kp, k0, alpha, & ! Intent IN + karst_loss, pefec_soil, unsat_thresh, & ! Intent IN + sat_storage, unsat_storage, & ! Intent INOUT + slow_interflow, fast_interflow, perc) ! Intent OUT IMPLICIT NONE - REAL(dp), INTENT(IN) :: k1 - REAL(dp), INTENT(IN) :: kp - REAL(dp), INTENT(IN) :: k0 - REAL(dp), INTENT(IN) :: alpha - REAL(dp), INTENT(IN) :: karst_loss - REAL(dp), INTENT(IN) :: pefec_soil - REAL(dp), INTENT(IN) :: unsat_thresh - REAL(dp), INTENT(INOUT) :: sat_storage - REAL(dp), INTENT(INOUT) :: unsat_storage - REAL(dp), INTENT(OUT) :: slow_interflow - REAL(dp), INTENT(OUT) :: fast_interflow - REAL(dp), INTENT(OUT) :: perc + REAL(dp), INTENT(IN) :: k1 + REAL(dp), INTENT(IN) :: kp + REAL(dp), INTENT(IN) :: k0 + REAL(dp), INTENT(IN) :: alpha + REAL(dp), INTENT(IN) :: karst_loss + REAL(dp), INTENT(IN) :: pefec_soil + REAL(dp), INTENT(IN) :: unsat_thresh + REAL(dp), INTENT(INOUT) :: sat_storage + REAL(dp), INTENT(INOUT) :: unsat_storage + REAL(dp), INTENT(OUT) :: slow_interflow + REAL(dp), INTENT(OUT) :: fast_interflow + REAL(dp), INTENT(OUT) :: perc !--------------------------------------------------------------- ! SOIL LAYER BETWEEN UNSATURATED AND SATURATED ZONE @@ -126,39 +126,39 @@ SUBROUTINE runoff_unsat_zone(k1, kp, k0, alpha, & ! Intent IN !pefec_soil = Cell1_soil(k, nHorizons_mHM)%infil unsat_storage = unsat_storage + pefec_soil - + ! FAST INTERFLOW WITH THRESHOLD BEHAVIOUR - fast_interflow = 0.0_dp + fast_interflow = 0.0_dp if(unsat_storage > unsat_thresh) then - fast_interflow = MIN( (k0*(unsat_storage - unsat_thresh)), & - (unsat_storage - eps_dp)) + fast_interflow = MIN((k0 * (unsat_storage - unsat_thresh)), & + (unsat_storage - eps_dp)) end if - unsat_storage = unsat_storage - fast_interflow - + unsat_storage = unsat_storage - fast_interflow + ! SLOW PERMANENT INTERFLOW - slow_interflow= 0.0_dp - - if( unsat_storage > eps_dp ) then - slow_interflow= min( (k1*(unsat_storage**(1.0_dp + alpha) )), & - (unsat_storage - eps_dp)) + slow_interflow = 0.0_dp + + if(unsat_storage > eps_dp) then + slow_interflow = min((k1 * (unsat_storage**(1.0_dp + alpha))), & + (unsat_storage - eps_dp)) end if unsat_storage = unsat_storage - slow_interflow - + !-------------------------------------------------------- ! PERCOLATION FROM SOIL LAYER TO THE SATURATED ZONE !-------------------------------------------------------- - perc = kp * unsat_storage - + perc = kp * unsat_storage + ! Taking into account for the KARSTIC aquifers !*** karstic loss gain or loss if Karstic aquifer is present... - if(unsat_storage > perc ) then - unsat_storage = unsat_storage - perc - sat_storage = sat_storage + perc * karst_loss + if(unsat_storage > perc) then + unsat_storage = unsat_storage - perc + sat_storage = sat_storage + perc * karst_loss else - sat_storage = sat_storage + unsat_storage * karst_loss - unsat_storage = 0.0_dp - end if - + sat_storage = sat_storage + unsat_storage * karst_loss + unsat_storage = 0.0_dp + end if + END SUBROUTINE runoff_unsat_zone ! ------------------------------------------------------------------ @@ -222,16 +222,16 @@ SUBROUTINE runoff_sat_zone(k2, sat_storage, baseflow) IMPLICIT NONE - REAL(dp), INTENT(IN) :: k2 + REAL(dp), INTENT(IN) :: k2 REAL(dp), INTENT(INOUT) :: sat_storage - REAL(dp), INTENT(OUT) :: baseflow + REAL(dp), INTENT(OUT) :: baseflow if (sat_storage > 0.0_dp) then - baseflow = k2 * sat_storage - sat_storage = sat_storage - baseflow + baseflow = k2 * sat_storage + sat_storage = sat_storage - baseflow else - baseflow = 0.0_dp - sat_storage = 0.0_dp + baseflow = 0.0_dp + sat_storage = 0.0_dp end if END SUBROUTINE runoff_sat_zone @@ -294,20 +294,20 @@ END SUBROUTINE runoff_sat_zone ! ST, May 2015 - updated equation in the documentation SUBROUTINE L1_total_runoff(fSealed_area_fraction, fast_interflow, slow_interflow, & - baseflow, direct_runoff, total_runoff) + baseflow, direct_runoff, total_runoff) IMPLICIT NONE - REAL(dp), INTENT(IN) :: fSealed_area_fraction - REAL(dp), INTENT(IN) :: fast_interflow - REAL(dp), INTENT(IN) :: slow_interflow - REAL(dp), INTENT(IN) :: baseflow - REAL(dp), INTENT(IN) :: direct_runoff - REAL(dp), INTENT(OUT) :: total_runoff + REAL(dp), INTENT(IN) :: fSealed_area_fraction + REAL(dp), INTENT(IN) :: fast_interflow + REAL(dp), INTENT(IN) :: slow_interflow + REAL(dp), INTENT(IN) :: baseflow + REAL(dp), INTENT(IN) :: direct_runoff + REAL(dp), INTENT(OUT) :: total_runoff - total_runoff = ( (baseflow + slow_interflow + fast_interflow)*(1.0_dp-fSealed_area_fraction) ) + & - ( direct_runoff*fSealed_area_fraction ) + total_runoff = ((baseflow + slow_interflow + fast_interflow) * (1.0_dp - fSealed_area_fraction)) + & + (direct_runoff * fSealed_area_fraction) END SUBROUTINE L1_total_runoff - + END MODULE mo_runoff diff --git a/src/mHM/mo_set_netcdf_outputs.f90 b/src/mHM/mo_set_netcdf_outputs.f90 index 1588e70c..ef41f4e6 100644 --- a/src/mHM/mo_set_netcdf_outputs.f90 +++ b/src/mHM/mo_set_netcdf_outputs.f90 @@ -13,7 +13,7 @@ MODULE mo_set_netcdf_outputs ! Written Matthias Zink, Apr 2013 - USE mo_kind, ONLY: i4 + USE mo_kind, ONLY : i4 IMPLICIT NONE @@ -69,189 +69,189 @@ MODULE mo_set_netcdf_outputs ! Modified, subroutine set_netCDF(NoNetcdfVars, nrows, ncols) ! - use mo_NCWrite , only: V, Dnc, ndims, nVars - use netcdf , only: NF90_UNLIMITED, NF90_CHAR, NF90_INT, NF90_DOUBLE + use mo_NCWrite, only : V, Dnc, ndims, nVars + use netcdf, only : NF90_UNLIMITED, NF90_CHAR, NF90_INT, NF90_DOUBLE implicit none ! - integer(i4), intent(in) :: NoNetcdfVars - integer(i4), intent(in) :: nrows - integer(i4), intent(in) :: ncols + integer(i4), intent(in) :: NoNetcdfVars + integer(i4), intent(in) :: nrows + integer(i4), intent(in) :: ncols ! - integer(i4) :: i + integer(i4) :: i ! ! define output file ! ! define parameters - nDims = 3 ! nr. dim types - nVars = 5 + NoNetcdfVars ! total nr. var to print + nDims = 3 ! nr. dim types + nVars = 5 + NoNetcdfVars ! total nr. var to print ! ! allocate arrays - if (allocated(Dnc) ) deallocate ( Dnc) - if (allocated(V) ) deallocate ( V ) - allocate ( Dnc(nDims) ) - allocate ( V(nVars) ) + if (allocated(Dnc)) deallocate (Dnc) + if (allocated(V)) deallocate (V) + allocate (Dnc(nDims)) + allocate (V(nVars)) ! ! define dimensions (coordinates) => corresponding variable must be created - i = 1 - Dnc(i)%name = "easting" - Dnc(i)%len = nrows + i = 1 + Dnc(i)%name = "easting" + Dnc(i)%len = nrows ! - i = 2 - Dnc(i)%name = "northing" - Dnc(i)%len = ncols + i = 2 + Dnc(i)%name = "northing" + Dnc(i)%len = ncols ! - i = 3 - Dnc(i)%name = "time" - Dnc(i)%len = NF90_UNLIMITED + i = 3 + Dnc(i)%name = "time" + Dnc(i)%len = NF90_UNLIMITED ! ! ! DIMENSION VARIABLES - i = 1 - V(i)%name = Dnc(i)%name - V(i)%xType = NF90_DOUBLE - V(i)%nLvls = 0 - V(i)%nSubs = 0 - V(i)%nDims = 1 - V(i)%dimTypes = (/i,0,0,0,0/) - V(i)%wFlag = .true. + i = 1 + V(i)%name = Dnc(i)%name + V(i)%xType = NF90_DOUBLE + V(i)%nLvls = 0 + V(i)%nSubs = 0 + V(i)%nDims = 1 + V(i)%dimTypes = (/i, 0, 0, 0, 0/) + V(i)%wFlag = .true. ! attributes (other possibilities: add_offset, valid_min, valid_max) - V(i)%nAtt = 2 + V(i)%nAtt = 2 ! - V(i)%att(1)%name = "units" - V(i)%att(1)%xType = NF90_CHAR - V(i)%att(1)%nValues= 1 - V(i)%att(1)%values = "m" + V(i)%att(1)%name = "units" + V(i)%att(1)%xType = NF90_CHAR + V(i)%att(1)%nValues = 1 + V(i)%att(1)%values = "m" ! - V(i)%att(2)%name = "long_name" - V(i)%att(2)%xType = NF90_CHAR - V(i)%att(2)%nValues= 1 - V(i)%att(2)%values = "x-coordinate in the given coordinate system" + V(i)%att(2)%name = "long_name" + V(i)%att(2)%xType = NF90_CHAR + V(i)%att(2)%nValues = 1 + V(i)%att(2)%values = "x-coordinate in the given coordinate system" ! - i = 2 - V(i)%name = Dnc(i)%name - V(i)%xType = NF90_DOUBLE - V(i)%nLvls = 0 - V(i)%nSubs = 0 - V(i)%nDims = 1 - V(i)%dimTypes = (/i,0,0,0,0/) + i = 2 + V(i)%name = Dnc(i)%name + V(i)%xType = NF90_DOUBLE + V(i)%nLvls = 0 + V(i)%nSubs = 0 + V(i)%nDims = 1 + V(i)%dimTypes = (/i, 0, 0, 0, 0/) ! printing - V(i)%wFlag = .true. + V(i)%wFlag = .true. ! attributes - V(i)%nAtt = 2 + V(i)%nAtt = 2 ! - V(i)%att(1)%name = "units" - V(i)%att(1)%xType = NF90_CHAR - V(i)%att(1)%nValues= 1 - V(i)%att(1)%values = "m" + V(i)%att(1)%name = "units" + V(i)%att(1)%xType = NF90_CHAR + V(i)%att(1)%nValues = 1 + V(i)%att(1)%values = "m" ! - V(i)%att(2)%name = "long_name" - V(i)%att(2)%xType = NF90_CHAR - V(i)%att(2)%nValues= 1 + V(i)%att(2)%name = "long_name" + V(i)%att(2)%xType = NF90_CHAR + V(i)%att(2)%nValues = 1 V(i)%att(2)%values = "y-coordinate in the given coordinate system" ! - i = 3 - V(i)%name = Dnc(i)%name - V(i)%xType = NF90_INT - V(i)%nLvls = 0 - V(i)%nSubs = 0 - V(i)%nDims = 1 - V(i)%dimTypes = (/i,0,0,0,0/) - V(i)%wFlag = .true. + i = 3 + V(i)%name = Dnc(i)%name + V(i)%xType = NF90_INT + V(i)%nLvls = 0 + V(i)%nSubs = 0 + V(i)%nDims = 1 + V(i)%dimTypes = (/i, 0, 0, 0, 0/) + V(i)%wFlag = .true. ! attributes - V(i)%nAtt = 2 + V(i)%nAtt = 2 ! - V(i)%att(1)%name = "units" - V(i)%att(1)%xType = NF90_CHAR - V(i)%att(1)%nValues= 1 + V(i)%att(1)%name = "units" + V(i)%att(1)%xType = NF90_CHAR + V(i)%att(1)%nValues = 1 ! - V(i)%att(2)%name = "long_name" - V(i)%att(2)%xType = NF90_CHAR - V(i)%att(2)%nValues= 1 + V(i)%att(2)%name = "long_name" + V(i)%att(2)%xType = NF90_CHAR + V(i)%att(2)%nValues = 1 V(i)%att(2)%values = "time" ! - i = 4 - V(i)%name = "lon" - V(i)%xType = NF90_DOUBLE - V(i)%nLvls = 1 - V(i)%nSubs = 1 - V(i)%nDims = 2 - V(i)%dimTypes = (/1,2,0,0,0/) - V(i)%wFlag = .true. + i = 4 + V(i)%name = "lon" + V(i)%xType = NF90_DOUBLE + V(i)%nLvls = 1 + V(i)%nSubs = 1 + V(i)%nDims = 2 + V(i)%dimTypes = (/1, 2, 0, 0, 0/) + V(i)%wFlag = .true. ! attributes - V(i)%nAtt = 2 + V(i)%nAtt = 2 ! - V(i)%att(1)%name = "units" - V(i)%att(1)%xType = NF90_CHAR - V(i)%att(1)%nValues= 1 + V(i)%att(1)%name = "units" + V(i)%att(1)%xType = NF90_CHAR + V(i)%att(1)%nValues = 1 V(i)%att(1)%values = "degrees_east" ! - V(i)%att(2)%name = "long_name" - V(i)%att(2)%xType = NF90_CHAR - V(i)%att(2)%nValues= 1 + V(i)%att(2)%name = "long_name" + V(i)%att(2)%xType = NF90_CHAR + V(i)%att(2)%nValues = 1 V(i)%att(2)%values = "longitude" ! - i = 5 - V(i)%name = "lat" - V(i)%xType = NF90_DOUBLE - V(i)%nLvls = 1 - V(i)%nSubs = 1 - V(i)%nDims = 2 - V(i)%dimTypes = (/1,2,0,0,0/) - V(i)%wFlag = .true. + i = 5 + V(i)%name = "lat" + V(i)%xType = NF90_DOUBLE + V(i)%nLvls = 1 + V(i)%nSubs = 1 + V(i)%nDims = 2 + V(i)%dimTypes = (/1, 2, 0, 0, 0/) + V(i)%wFlag = .true. ! attributes - V(i)%nAtt = 2 + V(i)%nAtt = 2 ! - V(i)%att(1)%name = "units" - V(i)%att(1)%xType = NF90_CHAR - V(i)%att(1)%nValues= 1 + V(i)%att(1)%name = "units" + V(i)%att(1)%xType = NF90_CHAR + V(i)%att(1)%nValues = 1 V(i)%att(1)%values = "degrees_north" ! - V(i)%att(2)%name = "long_name" - V(i)%att(2)%xType = NF90_CHAR - V(i)%att(2)%nValues= 1 + V(i)%att(2)%name = "long_name" + V(i)%att(2)%xType = NF90_CHAR + V(i)%att(2)%nValues = 1 V(i)%att(2)%values = "latitude" ! ! ****************************** ! dynamic variables data ! ****************************** - do i = 6, NoNetcdfVars + 5 - V(i)%xType = NF90_DOUBLE - V(i)%nLvls = 1 - V(i)%nSubs = 1 - V(i)%nDims = 3 - V(i)%dimTypes = (/1,2,3,0,0/) - ! printing - V(i)%wFlag = .true. - ! pointer - ! during running time - ! attributes - V(i)%nAtt = 6 - ! - V(i)%att(1)%name = "units" - V(i)%att(1)%xType = NF90_CHAR - V(i)%att(1)%nValues= 1 - ! - V(i)%att(2)%name = "long_name" - V(i)%att(2)%xType = NF90_CHAR - V(i)%att(2)%nValues= 1 - ! - V(i)%att(3)%name = "scale_factor" - V(i)%att(3)%xType = NF90_DOUBLE - V(i)%att(3)%nValues= 1 - ! - V(i)%att(4)%name = "_FillValue" - V(i)%att(4)%xType = NF90_DOUBLE - V(i)%att(4)%nValues= 1 - ! - V(i)%att(5)%name = "missing_value" - V(i)%att(5)%xType = NF90_DOUBLE - V(i)%att(5)%nValues= 1 - ! ! - V(i)%att(6)%name = "coordinates" - V(i)%att(6)%xType = NF90_CHAR - V(i)%att(6)%nValues= 1 + do i = 6, NoNetcdfVars + 5 + V(i)%xType = NF90_DOUBLE + V(i)%nLvls = 1 + V(i)%nSubs = 1 + V(i)%nDims = 3 + V(i)%dimTypes = (/1, 2, 3, 0, 0/) + ! printing + V(i)%wFlag = .true. + ! pointer + ! during running time + ! attributes + V(i)%nAtt = 6 + ! + V(i)%att(1)%name = "units" + V(i)%att(1)%xType = NF90_CHAR + V(i)%att(1)%nValues = 1 + ! + V(i)%att(2)%name = "long_name" + V(i)%att(2)%xType = NF90_CHAR + V(i)%att(2)%nValues = 1 + ! + V(i)%att(3)%name = "scale_factor" + V(i)%att(3)%xType = NF90_DOUBLE + V(i)%att(3)%nValues = 1 + ! + V(i)%att(4)%name = "_FillValue" + V(i)%att(4)%xType = NF90_DOUBLE + V(i)%att(4)%nValues = 1 + ! + V(i)%att(5)%name = "missing_value" + V(i)%att(5)%xType = NF90_DOUBLE + V(i)%att(5)%nValues = 1 + ! ! + V(i)%att(6)%name = "coordinates" + V(i)%att(6)%xType = NF90_CHAR + V(i)%att(6)%nValues = 1 end do ! ! diff --git a/src/mHM/mo_snow_accum_melt.f90 b/src/mHM/mo_snow_accum_melt.f90 index cd742ae5..c955d749 100644 --- a/src/mHM/mo_snow_accum_melt.f90 +++ b/src/mHM/mo_snow_accum_melt.f90 @@ -9,13 +9,13 @@ MODULE mo_snow_accum_melt - USE mo_kind, ONLY: dp + USE mo_kind, ONLY : dp IMPLICIT NONE PRIVATE - PUBLIC :: snow_accum_melt + PUBLIC :: snow_accum_melt ! ------------------------------------------------------------------ @@ -88,64 +88,64 @@ MODULE mo_snow_accum_melt ! Modified JM, Aug 2013 - ordering of arguments changed SUBROUTINE snow_accum_melt(deg_day_incr, deg_day_max, deg_day_noprec, prec, & - temperature, temperature_thresh, thrfall, & - snow_pack, deg_day, melt, prec_effect, rain, snow) + temperature, temperature_thresh, thrfall, & + snow_pack, deg_day, melt, prec_effect, rain, snow) IMPLICIT NONE - REAL(dp), INTENT(IN) :: deg_day_incr - REAL(dp), INTENT(IN) :: deg_day_max - REAL(dp), INTENT(IN) :: deg_day_noprec - REAL(dp), INTENT(IN) :: prec - REAL(dp), INTENT(IN) :: temperature - REAL(dp), INTENT(IN) :: temperature_thresh - REAL(dp), INTENT(IN) :: thrfall - REAL(dp), INTENT(INOUT) :: snow_pack - REAL(dp), INTENT(OUT) :: deg_day - REAL(dp), INTENT(OUT) :: melt - REAL(dp), INTENT(OUT) :: prec_effect - REAL(dp), INTENT(OUT) :: rain - REAL(dp), INTENT(OUT) :: snow + REAL(dp), INTENT(IN) :: deg_day_incr + REAL(dp), INTENT(IN) :: deg_day_max + REAL(dp), INTENT(IN) :: deg_day_noprec + REAL(dp), INTENT(IN) :: prec + REAL(dp), INTENT(IN) :: temperature + REAL(dp), INTENT(IN) :: temperature_thresh + REAL(dp), INTENT(IN) :: thrfall + REAL(dp), INTENT(INOUT) :: snow_pack + REAL(dp), INTENT(OUT) :: deg_day + REAL(dp), INTENT(OUT) :: melt + REAL(dp), INTENT(OUT) :: prec_effect + REAL(dp), INTENT(OUT) :: rain + REAL(dp), INTENT(OUT) :: snow ! local variables - REAL(dp) :: aux_help !Auxiliary helping variable [-] + REAL(dp) :: aux_help !Auxiliary helping variable [-] !separate throughfall into rain and snow if(temperature > temperature_thresh) then - snow = 0.0_dp - rain = thrfall + snow = 0.0_dp + rain = thrfall else - snow = thrfall - rain = 0.0_dp + snow = thrfall + rain = 0.0_dp end if ! calculate degree daily factor - if ( prec <= (deg_day_max - deg_day_noprec) / deg_day_incr ) then - deg_day = deg_day_noprec + deg_day_incr * prec + if (prec <= (deg_day_max - deg_day_noprec) / deg_day_incr) then + deg_day = deg_day_noprec + deg_day_incr * prec else - deg_day = deg_day_max + deg_day = deg_day_max end if ! melting/snow accumulation if (temperature > temperature_thresh) then - ! melting - if ( snow_pack > 0.0_dp ) then - aux_help = deg_day * ( temperature - temperature_thresh ) - if ( aux_help > snow_pack ) then - melt = snow_pack - snow_pack = 0.0_dp - else - melt = aux_help - snow_pack = snow_pack - aux_help - end if - else - melt = 0.0_dp + ! melting + if (snow_pack > 0.0_dp) then + aux_help = deg_day * (temperature - temperature_thresh) + if (aux_help > snow_pack) then + melt = snow_pack snow_pack = 0.0_dp - end if + else + melt = aux_help + snow_pack = snow_pack - aux_help + end if + else + melt = 0.0_dp + snow_pack = 0.0_dp + end if else - ! snow accumulation - melt = 0.0_dp - snow_pack = snow_pack + snow + ! snow accumulation + melt = 0.0_dp + snow_pack = snow_pack + snow end if ! effective precipitation diff --git a/src/mHM/mo_soil_database.f90 b/src/mHM/mo_soil_database.f90 deleted file mode 100644 index 5448a097..00000000 --- a/src/mHM/mo_soil_database.f90 +++ /dev/null @@ -1,544 +0,0 @@ -!> \file mo_soil_database.f90 - -!> \brief Generating soil database from input file. - -!> \details This module provides the routines for generating the soil database for mHM from an ASCII input file.\n -!> One routine \e read_soil_LUT reads a soil LookUpTable, performs some consistency checks and returns an initial soil database. -!> The second routine \e generate_soil_database calculates based on the initial one the proper soil database. - -!> \authors Juliane Mai -!> \date Dec 2012 - -MODULE mo_soil_database - - ! This module to provide a soil database for mHM. - - ! Written Juliane Mai, Dec 2012 - - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_string_utils, only: num2str - - IMPLICIT NONE - - PRIVATE - - PUBLIC :: read_soil_LUT ! Reads the soil LUT file - PUBLIC :: generate_soil_database ! Generates the soil database - - ! ------------------------------------------------------------------ - -CONTAINS - - ! ------------------------------------------------------------------ - - ! NAME - ! read_soil_LUT - - !> \brief Reads the soil LUT file. - - !> \details Reads the soil LookUpTable file and checks for consistency. - - ! INDENT(IN) - !> \param[in] "character(len=*) :: filename" filename of the soil LUT - !> \param[in] "integer(i4) :: iFlag_option" option for which kind of database to read - - - ! INDENT(INOUT) - ! None - - ! INDENT(OUT) - !> \param[out] "type(soilType) :: soilDB" initialized soil database - - ! INDENT(IN), OPTIONAL - ! None - - ! INDENT(INOUT), OPTIONAL - ! None - - ! INDENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - !> \note Soil LUT is an ASCII file. - - ! EXAMPLE - ! call read_soil_LUT('soil_BUEK_1000_LUT.txt', soilDB) - - ! LITERATURE - ! None - - ! HISTORY - !> \author Juliane Mai - !> \date Dec 2012 - ! Modified: Luis Samaniego, Nov 2013, transform relation op. == -> .eq. etc - ! Rohini Kumar, Mar 2016 - new variables for handling different soil databases - - subroutine read_soil_LUT(filename, iFlag_option, soilDB) - use mo_constants, only: eps_dp ! epsilon(1.0) in double precision - use mo_global_variables, only: soilType ! Type definition - use mo_global_variables, only: tillageDepth ! value is used - use mo_global_variables, only: nSoilTypes ! value is set - use mo_global_variables, only: nSoilHorizons_mHM, HorizonDepth_mHM ! value is used - use mo_file, only: usoil_database - use mo_mhm_constants, only: nLCover_class ! number of land cover classes - use mo_mhm_constants, only: nodata_i4 ! global nodata value (i4) - use mo_mhm_constants, only: nodata_dp ! global nodata value (dp) - - implicit none - - character(len=*), intent(in) :: filename ! filename of the soil LUT - integer(i4), intent(in) :: iFlag_option ! option for which kind of soil database to read - type(soilType), intent(out) :: soilDB ! initial soil database --> ready for further processing - - ! local variables - character(len=10) :: dummy - integer(i4) :: ios - integer(i4) :: ii, jj, kk - integer(i4) :: nR, nH - real(dp) :: up, down - real(dp) :: cly, snd, bd - real(dp) :: dmin - integer(i4) :: maxNumberHorizons - integer(i4) :: minNumberTillHorizons, maxNumberTillHorizons - - SELECT CASE (iFlag_option) - ! classical mHM soil database - CASE(0) - ios = 0_i4 - open(usoil_database, file=filename, status = 'old', iostat = ios) - read(usoil_database, *) dummy, nSoilTypes - dummy = dummy//'' ! only to avoid warning - - ! allocate space - allocate(soilDB%Id(nSoilTypes)) - allocate(soilDB%nHorizons(nSoilTypes)) - allocate(soilDB%nTillHorizons(nSoilTypes)) - allocate(soilDB%RZdepth(nSoilTypes)) - ! initialize - soilDB%Id(:) = nodata_i4 - soilDB%nHorizons(:) = nodata_i4 - soilDB%nTillHorizons(:) = nodata_i4 - soilDB%RZdepth(:) = nodata_dp - - ! initalise total rows to read - nR = 0_i4 - read(usoil_database, *) dummy - do while (.NOT. ( ios .ne. 0 ) ) - read(usoil_database, *, IOSTAT=ios ) ii, jj, up, down, cly, snd, bd - - ! Checks - if(up .ge. down) then - call message('read_soil_LUT: ERROR occurred: Mixed horizon depths in soil type', & - num2str(ii,'(I3)'), ' and horizon no.', num2str(jj,'(I3)')) - stop - end if - if( cly .lt. 0.0_dp .OR. cly .gt. 100.0_dp .OR. & - snd .lt. 0.0_dp .OR. snd .gt. 100.0_dp .OR. & - bd .lt. 0.0_dp .OR. bd .gt. 5.0_dp ) then - call message('read_soil_LUT: ERROR occurred: Inappropriate soil properties in soil type', & - num2str(ii,'(I3)'), ' and horizon no.', num2str(jj,'(I3)')) - stop - end if - - ! initalise soil id - soilDB%Id(ii) = ii - soilDB%nHorizons(ii) = jj - if( anint(down, dp) .gt. soilDB%RZdepth(ii) ) soilDB%RZdepth(ii) = anint(down, dp) - - nR = nR + 1_i4 - - end do - - ! initalise minimum root zone depth among all soil types - dMin = minval(soilDB%RZdepth(:), soilDB%RZdepth(:) .gt. 0.0_dp) - - ! check the tillage depth...(if possible adjust it..) - if(tillageDepth .gt. dMin) then - call message('read_soil_LUT: ERROR occurred: ') - call message(' Tillage depth is greater than overall minimum total soil depth ') - call message(' So tillage depth should be at least', num2str(dMin,'(F7.2)')) - call message(' Please adjust!') - stop - end if - - ! insert a new tillage soil layer, only in those soil types, in which it is not present - rewind(usoil_database) - read(usoil_database, *) dummy - read(usoil_database, *) dummy - - ! Last row is read twice so, read only upto (nR - 1) - do ii = 1, nR - 1 - read(usoil_database, *) jj, nH, up, down, cly, snd, bd - if(tillageDepth .gt. anint(up, dp) .and. tillageDepth .lt. anint(down,dp) ) then - soilDB%nHorizons(jj) = soilDB%nHorizons(jj) + 1_i4 - end if - - ! identify upto which soil horizon does the tillage depth goes in - if(tillageDepth .gt. anint(up, dp) .and. tillageDepth .le. anint(down, dp) ) then - soilDB%nTillHorizons(jj) = nH - end if - end do - - maxNumberHorizons = maxval(soilDB%nHorizons(:)) - - ! the variables of soilType are all allocated with maximal number of Horizons although not for each of the - ! nSoilTypes the array will be used - ! loops for array(i,j) should be: j=1, nHorizons(i), otherwise a nodata_dp will appear - allocate(soilDB%UD( nSoilTypes, maxNumberHorizons ) ) - allocate(soilDB%LD( nSoilTypes, maxNumberHorizons ) ) - allocate(soilDB%depth( nSoilTypes, maxNumberHorizons ) ) - allocate(soilDB%clay( nSoilTypes, maxNumberHorizons ) ) - allocate(soilDB%sand( nSoilTypes, maxNumberHorizons ) ) - allocate(soilDB%dbM( nSoilTypes, maxNumberHorizons ) ) - - soilDB%UD(:,:) = nodata_dp - soilDB%LD(:,:) = nodata_dp - soilDB%depth(:,:) = nodata_dp - soilDB%clay(:,:) = nodata_dp - soilDB%sand(:,:) = nodata_dp - soilDB%dbM(:,:) = nodata_dp - - ! allocate space for other derived soil hydraulic properties ... - minNumberTillHorizons = minval(soilDB%nTillHorizons(:)) - maxNumberTillHorizons = maxval(soilDB%nTillHorizons(:)) - - allocate(soilDB%thetaS_till( nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class ) ) - allocate(soilDB%thetaS( nSoilTypes, minNumberTillHorizons+1 : maxNumberHorizons ) ) - - allocate(soilDB%thetaFC_till( nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class ) ) - allocate(soilDB%thetaFC( nSoilTypes, minNumberTillHorizons+1 : maxNumberHorizons ) ) - - allocate(soilDB%thetaPW_till( nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class ) ) - allocate(soilDB%thetaPW( nSoilTypes, minNumberTillHorizons+1 : maxNumberHorizons ) ) - - allocate(soilDB%Db( nSoilTypes, 1 : maxNumberTillHorizons, nLCover_class ) ) - - allocate(soilDB%Ks( nSoilTypes, 1 : maxNumberHorizons, nLCover_class ) ) - - ! Initialize with default nodata_dp - soilDB%thetaS_till(:,:,:) = nodata_dp - soilDB%thetaS(:,:) = nodata_dp - - soilDB%thetaFC_till(:,:,:) = nodata_dp - soilDB%thetaFC(:,:) = nodata_dp - - soilDB%thetaPW_till(:,:,:) = nodata_dp - soilDB%thetaPW(:,:) = nodata_dp - - soilDB%Db(:,:,:) = nodata_dp - soilDB%Ks(:,:,:) = nodata_dp - - ! Read again soil properties from the data base - rewind(usoil_database) - read(usoil_database, *) dummy - read(usoil_database, *) dummy - - ! Last row is read twice so, read only upto (nR - 1) - kk = 0_i4 - do ii = 1, nR - 1_i4 - read(usoil_database, *) jj, nH, up, down, cly, snd, bd - - ! to avoid numerical errors in PTF - if(cly .lt. 1.0_dp) cly = 1.0_dp - if(snd .lt. 1.0_dp) snd = 1.0_dp - - ! Physical consistency - if((cly + snd) .gt. 100.0_dp) then - cly = cly / (cly + snd) - snd = snd / (cly + snd) - end if - - ! check for an extra tillage horizon (if not exists create a layer) - if(tillageDepth .gt. anint(up, dp) .and. tillageDepth .lt. anint(down, dp) ) then - - soilDB%UD(jj,nH) = anint(up, dp) - soilDB%LD(jj,nH) = tillageDepth - soilDB%depth(jj,nH) = soilDB%LD(jj,nH) - soilDB%UD(jj,nH) - soilDB%clay(jj,nH) = cly - soilDB%sand(jj,nH) = snd - soilDB%dbM(jj,nH) = bd - - ! initalise the upper depth to new value... and the increment counter - up = tillageDepth - kk = 1_i4 - end if - - ! increment nH by one once it encounter the upper loop.. - if(kk .eq. 1_i4) nH = nH + 1_i4 - - soilDB%UD(jj,nH) = anint(up, dp) - soilDB%LD(jj,nH) = anint(down, dp) - soilDB%depth(jj,nH) = soilDB%LD(jj,nH) - soilDB%UD(jj,nH) - soilDB%clay(jj,nH) = cly - soilDB%sand(jj,nH) = snd - soilDB%dbM(jj,nH) = bd - - ! check for number of soil horizons... - if(nH .gt. soilDB%nHorizons(jj) ) then - call message('read_soil_LUT: ERROR occurred: ') - call message(' There is something wrong in allocating horizons in soil data base.') - call message(' Please check in code !') - STOP - end if - - ! initalise the increment counter to zero - if(nH .eq. soilDB%nHorizons(jj) ) kk = 0_i4 - - end do - close(usoil_database) - - ! soil database for the horizon specific case - CASE(1) - open(usoil_database, file=filename, status = 'old', action = 'read') - read(usoil_database, *) dummy, nSoilTypes - dummy = dummy//'' ! only to avoid warning - allocate( soilDB%Id (nSoilTypes ) ) - allocate( soilDB%clay(nSoilTypes, 1) ) - allocate( soilDB%sand(nSoilTypes, 1) ) - allocate( soilDB%dbM (nSoilTypes, 1) ) - soilDB%clay(:,:) = nodata_dp - soilDB%sand(:,:) = nodata_dp - soilDB%dbM (:,:) = nodata_dp - read(usoil_database, *) dummy - do kk = 1, nSoilTypes - read(usoil_database, *) jj, cly, snd, bd - ! to avoid numerical errors in PTF - if(cly .lt. 1.0_dp) cly = 1.0_dp - if(snd .lt. 1.0_dp) snd = 1.0_dp - soilDB%Id(kk) = jj - soilDB%clay(kk,1) = cly - soilDB%sand(kk,1) = snd - soilDB%dbM (kk,1) = bd - end do - close(usoil_database) - - ! assign up to which horizon layer a soil is treated as tillage layer - ! since our horizon information is well defined for modeling too - ! this information is uniform across all soils/modeling cells - ! for compatibility with iFlag_option == 0, assign - ! both nHorizons & tillage horizons - allocate( soilDB%nHorizons(1) ) - allocate( soilDB%nTillHorizons(1) ) - soilDB%nHorizons(:) = nSoilHorizons_mHM - soilDB%nTillHorizons(:) = -9 - do kk = 1, nSoilHorizons_mHM - if( abs( HorizonDepth_mHM(kk) - tillageDepth ) .lt. eps_dp ) then - soilDB%nTillHorizons(1) = kk - end if - end do - - ! check - if( soilDB%nTillHorizons(1) .eq. -9 ) then - ! rarely could happen *** since this is checked in reading of horizons depths only - ! but is checked here for double confirmation - call message() - call message('***ERROR: specification of tillage depths is not confirming') - call message(' with given depths of soil horizons to be modeled.') - stop - else - call message() - call message('Tillage layers: the tillage horizons are modelled ') - call message(' upto mHM layers: ', trim(num2str(soilDB%nTillHorizons(1)))) - end if - - CASE DEFAULT - call message() - call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') - stop - - END SELECT - - end subroutine read_soil_LUT - - ! ------------------------------------------------------------------ - - ! NAME - ! generate_soil_database - - !> \brief Generates soil database. - - !> \details Calculates the proper soil database using the initialized soil database from read_soil_LUT. - - ! INDENT(IN) - ! None - - ! INDENT(INOUT) - !> \param[in,out] "type(soilType) :: soilDB" initialized/ proper soil database - !> \param[in] "integer(i4) :: iFlag_option" option for which kind of database to read - ! INDENT(OUT) - ! None - - ! INDENT(IN), OPTIONAL - ! None - - ! INDENT(INOUT), OPTIONAL - ! None - - ! INDENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! call generate_soil_database(soilDB) - - ! LITERATURE - ! None - - ! HISTORY - !> \author Juliane Mai - !> \date Dec 2012 - ! Modified, Rohini Kumar & - ! Juliane Mai, Apr, 2013 - wieght for no-contributing soil horizons are intialized with nodata value - ! Rohini Kumar, Mar, 2016 - new variables for handling different soil databases - - ! ------------------------------------------------------------------ - - subroutine generate_soil_database(soilDB, iFlag_option) - - use mo_global_variables, only: soilType ! Type definition - use mo_global_variables, only: nSoilHorizons_mHM, HorizonDepth_mHM, nSoilTypes ! value is used - use mo_mhm_constants, only: nodata_i4 ! global nodata value (i4) - use mo_mhm_constants, only: nodata_dp ! global nodata value (dp) - - implicit none - - type(soilType), intent(inout) :: soilDB - integer(i4), intent(in) :: iFlag_option ! option for which kind of soil database to read - - ! local variables - integer(i4) :: ii, jj, kk - real(dp) :: dmin - real(dp) :: dpth_f, dpth_t - integer(i4) :: layer_f, layer_t - real(dp), parameter :: small= 0.000001_dp - real(dp), parameter :: soil_dAccuracy=0.5_dp ! [mm] soil depth accuracy - - SELECT CASE (iFlag_option) - ! classical mHM soil database - CASE(0) - ! initalise minimum root zone depth among all soil types - dMin = minval(soilDB%RZdepth(:), soilDB%RZdepth(:) > 0.0_dp) - - ! check - if (HorizonDepth_mHM(nSoilHorizons_mHM -1) .ge. dMin) then - call message('generate_soil_database: ERROR occurred: ') - call message(' The depth of soil Horizons provided for modelling is not appropriate') - call message(' The global minimum of total soil horizon depth among all soil type is ', num2str(dMin,'(F7.2)')) - call message(' Adjust your modeling soil horizon depth in this range') - call message(' OR Increase the soil depth in data base for only those soil types') - call message(' whose total depth is smaller than your given modeling depth.') - STOP - end if - - ! allocate and initalise depth weight - allocate(soilDB%Wd(nSoilTypes, nSoilHorizons_mHM, maxval(soilDB%nHorizons(:)) )) - soilDB%Wd(:,:,:) = 0.0_dp - - ! Process further to estimate weight of each horizons - ! weightage according to soil depths - do ii = 1, nSoilTypes - soilDB%Wd(ii,:,soilDB%nHorizons(ii)+1_i4:maxval(soilDB%nHorizons(:))) = nodata_dp - - ! initalise last horizon depth to model w.r.t to surface - ! NOTE:: it is different for each soil - HorizonDepth_mHM(nSoilHorizons_mHM) = soilDB%RZdepth(ii) - - ! Estimate soil properties for each modeling layers - do jj = 1, nSoilHorizons_mHM - - ! modeling depth ( **from --> to ** ) - ! take into account the depth accuracy [0.5mm, defined in module..] - dpth_f = 0.0_dp - if(jj .ne. 1_i4 ) dpth_f = HorizonDepth_mHM(jj-1) - dpth_t = HorizonDepth_mHM(jj) - soil_dAccuracy - - ! identify to which layer of batabase this mHM horizon lies - layer_f = nodata_i4 - layer_t = nodata_i4 - do kk = 1, soilDB%nHorizons(ii) - if( dpth_f .ge. soilDB%UD(ii,kk) .and. dpth_f .le. (soilDB%LD(ii,kk) - soil_dAccuracy) ) layer_f = kk - if( dpth_t .ge. soilDB%UD(ii,kk) .and. dpth_t .le. (soilDB%LD(ii,kk) - soil_dAccuracy) ) layer_t = kk - end do - - ! Check - if(layer_f .le. 0_i4 .or. layer_t .le. 0_i4) then - call message('generate_soil_database: ERROR occurred: ') - call message(' Horizon depths to model do not lie in database for soil type', num2str(ii,'(I3)')) - call message(' Please check!') - STOP - end if - if(layer_f .gt. layer_t) then - call message('generate_soil_database: ERROR occurred: ') - call message(' Something is wrong in assignment of modeling soil horizons or') - call message(' database of soil type ', num2str(ii,'(I3)')) - call message(' Please check!') - STOP - end if - - ! iF modeling depth of a given horizon falls in a same soil layer - if(layer_f .eq. layer_t) then - soilDB%Wd(ii, jj, layer_f) = 1.0_dp - - ! else estimate depth weightage... - else - - ! for starting layer... - soilDB%Wd(ii, jj, layer_f) = soilDB%LD(ii, layer_f) - dpth_f - - ! for ending layer - soilDB%Wd(ii,jj, layer_t) = (dpth_t + soil_dAccuracy) - soilDB%UD(ii,layer_t) - - ! other intermediate layers weight, if exit - if(layer_t - layer_f .gt. 1_i4) then - do kk = layer_f + 1, layer_t - 1 - soilDB%Wd(ii, jj, kk) = soilDB%LD(ii, kk) - soilDB%UD(ii, kk) - end do - end if - - ! Estimate depth weightage - if(jj .ne. 1_i4) then - soilDB%Wd(ii, jj, 1:soilDB%nHorizons(ii)) = soilDB%Wd(ii, jj,1:soilDB%nHorizons(ii)) / & - ( HorizonDepth_mHM(jj) - HorizonDepth_mHM(jj-1_i4) ) - else - soilDB%Wd(ii, jj, 1:soilDB%nHorizons(ii)) = soilDB%Wd(ii, jj,1:soilDB%nHorizons(ii)) / & - HorizonDepth_mHM(jj) - end if - - ! Check (small margin for numerical errors) - if( sum(soilDB%Wd(ii, jj, :), soilDB%Wd(ii, jj, :) .gt. 0.0_dp) .le. 1.0_dp-small .or. & - sum(soilDB%Wd(ii, jj, :), soilDB%Wd(ii, jj, :) .gt. 0.0_dp) .ge. 1.0_dp+small ) then - call message('generate_soil_database: ERROR occurred: ') - call message(' Weight assigned for each soil horizons are not correct.') - call message(' Please check!') - STOP - end if - - end if - - end do - end do - ! soil database for the horizon specific case - CASE(1) - ! right now nothing is done here - ! *** reserved for future changes - return - - CASE DEFAULT - call message() - call message('***ERROR: iFlag_soilDB option given does not exist. Only 0 and 1 is taken at the moment.') - stop - - END SELECT - - end subroutine generate_soil_database - -END MODULE mo_soil_database diff --git a/src/mHM/mo_soil_moisture.f90 b/src/mHM/mo_soil_moisture.f90 index f9d93b58..dd99bb2d 100644 --- a/src/mHM/mo_soil_moisture.f90 +++ b/src/mHM/mo_soil_moisture.f90 @@ -16,14 +16,14 @@ MODULE mo_soil_moisture - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE PRIVATE :: feddes_et_reduction PRIVATE :: jarvis_et_reduction - PUBLIC :: soil_moisture ! Soil moisture in different soil horizons + PUBLIC :: soil_moisture ! Soil moisture in different soil horizons ! ------------------------------------------------------------------ @@ -44,7 +44,7 @@ MODULE mo_soil_moisture !> \f[ \theta[t] = \theta[t-1] + I[t] - \mathit{ET}[t] \f] !> with \f$ \mathit{ET} \f$ (omit \f$[k,t]\f$) being !> \f[ \mathit{ET} = f_\mathrm{roots} \cdot f_{SM} \cdot \mathit{PET} \f]. - + ! CALLING SEQUENCE ! subroutine soil_moisture(frac_sealed, water_thresh_sealed, pet, & ! evap_coeff, soil_moist_sat, frac_roots, soil_moist_FC, wilting_point, & @@ -119,171 +119,171 @@ MODULE mo_soil_moisture ! Zink M. Demirel M.C., March 2017 - Added Jarvis soil water stress function for evapotranspiration subroutine soil_moisture(processCase, frac_sealed, water_thresh_sealed, pet, & - evap_coeff, soil_moist_sat, frac_roots, soil_moist_FC, wilting_point, & - soil_moist_exponen, jarvis_thresh_c1, aet_canopy, prec_effec, runoff_sealed, & - storage_sealed, infiltration, soil_moist, aet, aet_sealed) + evap_coeff, soil_moist_sat, frac_roots, soil_moist_FC, wilting_point, & + soil_moist_exponen, jarvis_thresh_c1, aet_canopy, prec_effec, runoff_sealed, & + storage_sealed, infiltration, soil_moist, aet, aet_sealed) - use mo_constants, only: eps_dp + use mo_common_constants, only : eps_dp implicit none ! Intent variables - integer(i4), intent(in) :: processCase ! 1 - Feddes equation for PET reduction + integer(i4), intent(in) :: processCase ! 1 - Feddes equation for PET reduction ! ! 2 - Jarvis equation for PET reduction - real(dp), intent(in) :: frac_sealed ! fraction of sealed area - real(dp), intent(in) :: water_thresh_sealed ! Threshhold water depth in impervious + real(dp), intent(in) :: frac_sealed ! fraction of sealed area + real(dp), intent(in) :: water_thresh_sealed ! Threshhold water depth in impervious ! ! areas [mm/s] - real(dp), intent(in) :: pet ! Reference evapotranspiration [mm/s] - real(dp), intent(in) :: evap_coeff ! Evaporation coefficent for free-water + real(dp), intent(in) :: pet ! Reference evapotranspiration [mm/s] + real(dp), intent(in) :: evap_coeff ! Evaporation coefficent for free-water ! ! surface of that current month - real(dp), dimension(:), intent(in) :: soil_moist_sat ! Saturation soil moisture + real(dp), dimension(:), intent(in) :: soil_moist_sat ! Saturation soil moisture ! ! for each horizon [mm] - real(dp), dimension(:), intent(in) :: frac_roots ! Fraction of Roots in soil horizon - real(dp), dimension(:), intent(in) :: soil_moist_FC ! Soil moisture below which actual ET + real(dp), dimension(:), intent(in) :: frac_roots ! Fraction of Roots in soil horizon + real(dp), dimension(:), intent(in) :: soil_moist_FC ! Soil moisture below which actual ET ! ! is reduced [mm] - real(dp), dimension(:), intent(in) :: wilting_point ! Permanent wilting point + real(dp), dimension(:), intent(in) :: wilting_point ! Permanent wilting point ! ! for each horizon [mm] - real(dp), dimension(:), intent(in) :: soil_moist_exponen ! Exponential parameter to how non- + real(dp), dimension(:), intent(in) :: soil_moist_exponen ! Exponential parameter to how non- ! ! linear is the soil water retention - real(dp), intent(in) :: jarvis_thresh_c1 ! jarvis critical value for + real(dp), intent(in) :: jarvis_thresh_c1 ! jarvis critical value for ! ! normalized soil water content - real(dp), intent(in) :: aet_canopy ! actual ET from canopy [mm/s] - real(dp), intent(inout) :: prec_effec ! Effective precipitation + real(dp), intent(in) :: aet_canopy ! actual ET from canopy [mm/s] + real(dp), intent(inout) :: prec_effec ! Effective precipitation ! ! (rain + snow melt) [mm] - real(dp), intent(inout) :: runoff_sealed ! Direct runoff from impervious areas - real(dp), intent(inout) :: storage_sealed ! Retention storage of impervious areas - real(dp), dimension(size(soil_moist_sat,1)), intent(inout) :: infiltration ! Recharge, infiltration intensity or + real(dp), intent(inout) :: runoff_sealed ! Direct runoff from impervious areas + real(dp), intent(inout) :: storage_sealed ! Retention storage of impervious areas + real(dp), dimension(size(soil_moist_sat, 1)), intent(inout) :: infiltration ! Recharge, infiltration intensity or ! ! effective precipitation ! ! for each horizon [mm/s] - real(dp), dimension(size(soil_moist_sat,1)), intent(inout) :: soil_moist ! Soil moisture of each horizon [mm] - real(dp), dimension(size(soil_moist_sat,1)), intent(out) :: aet ! actual ET [mm/s] - real(dp), intent(out) :: aet_sealed ! actual ET from free-water surfaces, + real(dp), dimension(size(soil_moist_sat, 1)), intent(inout) :: soil_moist ! Soil moisture of each horizon [mm] + real(dp), dimension(size(soil_moist_sat, 1)), intent(out) :: aet ! actual ET [mm/s] + real(dp), intent(out) :: aet_sealed ! actual ET from free-water surfaces, ! ! i.e impervious cover [mm/s] ! Local variables integer(i4) :: hh ! counter - real(dp) :: prec_effec_soil ! Effective Prec or infiltration from above - real(dp) :: frac_runoff ! Runoof fraction - real(dp) :: soil_stress_factor ! PET reduction factor according to actual soil moisture - real(dp) :: tmp ! temporary variable for misc use - + real(dp) :: prec_effec_soil ! Effective Prec or infiltration from above + real(dp) :: frac_runoff ! Runoof fraction + real(dp) :: soil_stress_factor ! PET reduction factor according to actual soil moisture + real(dp) :: tmp ! temporary variable for misc use + ! ---------------------------------------------------------------- ! IMPERVIOUS COVER PROCESS ! ---------------------------------------------------------------- runoff_sealed = 0.0_dp - aet_sealed = 0.0_dp + aet_sealed = 0.0_dp if (frac_sealed > 0.0_dp) then - tmp = storage_sealed + prec_effec - - if (tmp > water_thresh_sealed) then - runoff_sealed = tmp - water_thresh_sealed - storage_sealed = water_thresh_sealed - else - runoff_sealed = 0.0_dp - storage_sealed = tmp - end if - - ! aET from sealed area is propotional to the available water content - if(water_thresh_sealed .gt. eps_dp ) then - aet_sealed = ( pet / evap_coeff - aet_canopy) * (storage_sealed / water_thresh_sealed) - ! numerical problem - if (aet_sealed .lt. 0.0_dp) aet_sealed = 0.0_dp - else - aet_sealed = huge(1.0_dp) - end if - - ! sealed storage updata - if (storage_sealed .gt. aet_sealed) then - storage_sealed = storage_sealed - aet_sealed - else - aet_sealed = storage_sealed - storage_sealed = 0.0_dp - end if + tmp = storage_sealed + prec_effec + + if (tmp > water_thresh_sealed) then + runoff_sealed = tmp - water_thresh_sealed + storage_sealed = water_thresh_sealed + else + runoff_sealed = 0.0_dp + storage_sealed = tmp + end if + + ! aET from sealed area is propotional to the available water content + if(water_thresh_sealed .gt. eps_dp) then + aet_sealed = (pet / evap_coeff - aet_canopy) * (storage_sealed / water_thresh_sealed) + ! numerical problem + if (aet_sealed .lt. 0.0_dp) aet_sealed = 0.0_dp + else + aet_sealed = huge(1.0_dp) + end if + + ! sealed storage updata + if (storage_sealed .gt. aet_sealed) then + storage_sealed = storage_sealed - aet_sealed + else + aet_sealed = storage_sealed + storage_sealed = 0.0_dp + end if end if - ! ---------------------------------------------------------------- ! N-LAYER SOIL MODULE ! ---------------------------------------------------------------- - aet(:) = 0.0_dp + aet(:) = 0.0_dp infiltration(:) = 0.0_dp ! for 1st layer input is prec_effec prec_effec_soil = prec_effec - - do hh = 1, size(soil_moist_sat,1) ! nHorizons - ! input for other layers is the infiltration from its immediate upper layer will be input - if (hh .NE. 1) prec_effec_soil = infiltration(hh-1) - - ! start processing for soil moisture process - ! BASED ON SMs as its upper LIMIT - - if (soil_moist(hh) > soil_moist_sat(hh)) then - infiltration(hh) = prec_effec_soil - else - ! to avoid underflow -- or numerical errors - if(soil_moist(hh) > eps_dp) then - !frac_runoff = (soil_moist(hh) / soil_moist_sat(hh))**soil_moist_exponen(hh) - frac_runoff = exp(soil_moist_exponen(hh)*log(soil_moist(hh)/soil_moist_sat(hh))) - else - frac_runoff = 0.0_dp - end if - tmp = prec_effec_soil * (1.0_dp - frac_runoff) - - if ( (soil_moist(hh) + tmp) > soil_moist_sat(hh) ) then - infiltration(hh) = prec_effec_soil + ( soil_moist(hh) - soil_moist_sat(hh) ) - soil_moist(hh) = soil_moist_sat(hh) - else - infiltration(hh) = prec_effec_soil - tmp - soil_moist(hh) = soil_moist(hh) + tmp - end if - end if - - ! aET calculations - - ! Satisfying ET demand sequentially from top to the bottom layer - ! Note that the potential ET for the first soil layer is reduced after - ! satisfying ET demands of the canopy surface - - aet(hh) = pet - aet_canopy ! First layer - if (hh /= 1) aet(hh) = aet(hh) - sum(aet(1:hh-1), mask=(aet(1:hh-1) > 0.0_dp)) ! remaining layers - - ! estimate fraction of ET demand based on root fraction and SM status - select case(processCase) - ! FEDDES EQUATION - case(1) - soil_stress_factor = feddes_et_reduction(soil_moist(hh), soil_moist_FC(hh), wilting_point(hh), & - frac_roots(hh)) - ! JARVIS EQUATION - case(2:3) - !!!!!!!!! INTRODUCING STRESS FACTOR FOR SOIL MOISTURE ET REDUCTION !!!!!!!!!!!!!!!!! - soil_stress_factor = jarvis_et_reduction(soil_moist(hh), soil_moist_sat(hh), wilting_point(hh), & - frac_roots(hh), jarvis_thresh_c1) - end select - - aet(hh) = aet(hh) * soil_stress_factor - - ! avoid numerical error - if(aet(hh) < 0.0_dp) aet(hh) = 0.0_dp - - ! reduce SM state - if(soil_moist(hh) > aet(hh)) then - soil_moist(hh) = soil_moist(hh) - aet(hh) - else - aet(hh) = soil_moist(hh) - eps_dp - soil_moist(hh) = eps_dp - end if - - ! avoid numerical error of underflow - if(soil_moist(hh) < eps_dp) soil_moist(hh) = eps_dp + + do hh = 1, size(soil_moist_sat, 1) ! nHorizons + ! input for other layers is the infiltration from its immediate upper layer will be input + if (hh .NE. 1) prec_effec_soil = infiltration(hh - 1) + + ! start processing for soil moisture process + ! BASED ON SMs as its upper LIMIT + + if (soil_moist(hh) > soil_moist_sat(hh)) then + infiltration(hh) = prec_effec_soil + else + ! to avoid underflow -- or numerical errors + if(soil_moist(hh) > eps_dp) then + !frac_runoff = (soil_moist(hh) / soil_moist_sat(hh))**soil_moist_exponen(hh) + frac_runoff = exp(soil_moist_exponen(hh) * log(soil_moist(hh) / soil_moist_sat(hh))) + else + frac_runoff = 0.0_dp + end if + tmp = prec_effec_soil * (1.0_dp - frac_runoff) + + if ((soil_moist(hh) + tmp) > soil_moist_sat(hh)) then + infiltration(hh) = prec_effec_soil + (soil_moist(hh) - soil_moist_sat(hh)) + soil_moist(hh) = soil_moist_sat(hh) + else + infiltration(hh) = prec_effec_soil - tmp + soil_moist(hh) = soil_moist(hh) + tmp + end if + end if + + ! aET calculations + + ! Satisfying ET demand sequentially from top to the bottom layer + ! Note that the potential ET for the first soil layer is reduced after + ! satisfying ET demands of the canopy surface + + aet(hh) = pet - aet_canopy ! First layer + if (hh /= 1) aet(hh) = aet(hh) - sum(aet(1 : hh - 1), mask = (aet(1 : hh - 1) > 0.0_dp)) ! remaining layers + + ! estimate fraction of ET demand based on root fraction and SM status + select case(processCase) + ! FEDDES EQUATION + case(1) + soil_stress_factor = feddes_et_reduction(soil_moist(hh), soil_moist_FC(hh), wilting_point(hh), & + frac_roots(hh)) + ! JARVIS EQUATION + case(2 : 3) + !!!!!!!!! INTRODUCING STRESS FACTOR FOR SOIL MOISTURE ET REDUCTION !!!!!!!!!!!!!!!!! + soil_stress_factor = jarvis_et_reduction(soil_moist(hh), soil_moist_sat(hh), wilting_point(hh), & + frac_roots(hh), jarvis_thresh_c1) + end select + + aet(hh) = aet(hh) * soil_stress_factor + + ! avoid numerical error + if(aet(hh) < 0.0_dp) aet(hh) = 0.0_dp + + ! reduce SM state + if(soil_moist(hh) > aet(hh)) then + soil_moist(hh) = soil_moist(hh) - aet(hh) + else + aet(hh) = soil_moist(hh) - eps_dp + soil_moist(hh) = eps_dp + end if + + ! avoid numerical error of underflow + if(soil_moist(hh) < eps_dp) soil_moist(hh) = eps_dp end do ! hh - + + end subroutine soil_moisture - + ! ------------------------------------------------------------------ ! NAME @@ -343,35 +343,35 @@ end subroutine soil_moisture ! HISTORY !> \author Matthias Cuntz, Cueneyd Demirel, Matthias Zink !> \date March 2017 - + elemental pure FUNCTION feddes_et_reduction(soil_moist, soil_moist_FC, wilting_point, frac_roots) implicit none - real(dp), intent(in) :: soil_moist ! Soil moisture of each horizon [mm] - real(dp), intent(in) :: soil_moist_FC ! Soil moisture below which actual ET + real(dp), intent(in) :: soil_moist ! Soil moisture of each horizon [mm] + real(dp), intent(in) :: soil_moist_FC ! Soil moisture below which actual ET ! ! is reduced [mm] - real(dp), intent(in) :: wilting_point ! Permanent wilting point - real(dp), intent(in) :: frac_roots ! Fraction of Roots in soil horizon + real(dp), intent(in) :: wilting_point ! Permanent wilting point + real(dp), intent(in) :: frac_roots ! Fraction of Roots in soil horizon ! ! is reduced [mm] - real(dp) :: feddes_et_reduction ! reference evapotranspiration in [mm s-1] + real(dp) :: feddes_et_reduction ! reference evapotranspiration in [mm s-1] ! SM >= FC - if ( soil_moist >= soil_moist_FC ) then - feddes_et_reduction = frac_roots - ! PW < SM < FC - else if ( (soil_moist < soil_moist_FC) .AND. (soil_moist > wilting_point) ) then - feddes_et_reduction = frac_roots * (soil_moist - wilting_point) / (soil_moist_FC - wilting_point) - ! SM <= PW - else if ( soil_moist <= wilting_point ) then - feddes_et_reduction = 0.0_dp + if (soil_moist >= soil_moist_FC) then + feddes_et_reduction = frac_roots + ! PW < SM < FC + else if ((soil_moist < soil_moist_FC) .AND. (soil_moist > wilting_point)) then + feddes_et_reduction = frac_roots * (soil_moist - wilting_point) / (soil_moist_FC - wilting_point) + ! SM <= PW + else if (soil_moist <= wilting_point) then + feddes_et_reduction = 0.0_dp else - feddes_et_reduction = 0.0_dp + feddes_et_reduction = 0.0_dp end if - + END FUNCTION feddes_et_reduction - + ! ------------------------------------------------------------------ ! NAME @@ -391,7 +391,7 @@ END FUNCTION feddes_et_reduction !> if \theta_{norm} < jarvis\_sm\_threshold\_c1 \\ !> \end{array} !> \right. \f] - + ! INTENT(IN) !> \param[in] " real(dp), intent(in) :: soil_moist" Soil moisture of each horizon [mm] !> \param[in] " real(dp), intent(in) :: soil_moist_sat" saturated Soil moisture content [mm] @@ -426,44 +426,44 @@ END FUNCTION feddes_et_reduction ! LITERATURE !> \note Jarvis, N.J., 1989. A simple empirical model of root water uptake. !> J. Hydrol. 107, 57–72. doi:10.1016/0022-1694(89)90050-4 - + ! HISTORY !> \author Cueneyd Demirel, Matthias Zink !> \date March 2017 - + elemental pure FUNCTION jarvis_et_reduction(soil_moist, soil_moist_sat, wilting_point, frac_roots, & - jarvis_thresh_c1) + jarvis_thresh_c1) implicit none - real(dp), intent(in) :: soil_moist ! Soil moisture of each horizon [mm] - real(dp), intent(in) :: soil_moist_sat ! saturated Soil moisture content [mm] - real(dp), intent(in) :: wilting_point ! Permanent wilting point - real(dp), intent(in) :: frac_roots ! Fraction of Roots in soil horizon + real(dp), intent(in) :: soil_moist ! Soil moisture of each horizon [mm] + real(dp), intent(in) :: soil_moist_sat ! saturated Soil moisture content [mm] + real(dp), intent(in) :: wilting_point ! Permanent wilting point + real(dp), intent(in) :: frac_roots ! Fraction of Roots in soil horizon ! ! is reduced [mm] - real(dp), intent(in) :: jarvis_thresh_c1 ! parameter C1 from Jarvis formulation + real(dp), intent(in) :: jarvis_thresh_c1 ! parameter C1 from Jarvis formulation - real(dp) :: jarvis_et_reduction ! reference evapotranspiration in [mm s-1] + real(dp) :: jarvis_et_reduction ! reference evapotranspiration in [mm s-1] ! local - real(dp) :: theta_inorm ! normalized soil water content - + real(dp) :: theta_inorm ! normalized soil water content + ! Calculating normalized Soil Water Content - theta_inorm = (soil_moist - wilting_point)/(soil_moist_sat - wilting_point) + theta_inorm = (soil_moist - wilting_point) / (soil_moist_sat - wilting_point) ! correct for numerical unaccuracies - if (theta_inorm .LT. 0.0_dp) theta_inorm = 0.0_dp + if (theta_inorm .LT. 0.0_dp) theta_inorm = 0.0_dp if (theta_inorm .GT. 1.0_dp) theta_inorm = 1.0_dp - + ! estimate fraction of ET demand based on root fraction and SM status using theta_inorm ! theta_inorm >= jarvis_thresh_c1 - if ( theta_inorm .GE. jarvis_thresh_c1) then - jarvis_et_reduction = frac_roots - ! 0 < theta_inorm < jarvis_thresh_c1 + if (theta_inorm .GE. jarvis_thresh_c1) then + jarvis_et_reduction = frac_roots + ! 0 < theta_inorm < jarvis_thresh_c1 else if (theta_inorm .LT. jarvis_thresh_c1) then - jarvis_et_reduction = frac_roots * (theta_inorm/jarvis_thresh_c1) + jarvis_et_reduction = frac_roots * (theta_inorm / jarvis_thresh_c1) end if END FUNCTION jarvis_et_reduction - + END MODULE mo_soil_moisture diff --git a/src/mHM/mo_spatial_agg_disagg_forcing.f90 b/src/mHM/mo_spatial_agg_disagg_forcing.f90 index 863b3149..3dfcafed 100644 --- a/src/mHM/mo_spatial_agg_disagg_forcing.f90 +++ b/src/mHM/mo_spatial_agg_disagg_forcing.f90 @@ -16,11 +16,10 @@ MODULE mo_spatial_agg_disagg_forcing ! Written Rohini Kumar, Jan 2013 ! Modified - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE - PUBLIC :: spatial_aggregation ! Spatial aggregation or upscaling PUBLIC :: spatial_disaggregation ! Spatial disaggregation or downscaling @@ -80,9 +79,9 @@ MODULE mo_spatial_agg_disagg_forcing ! Modified RK, MZ, DS, May 2014 - added mask2 INTERFACE spatial_aggregation - MODULE PROCEDURE spatial_aggregation_3d, spatial_aggregation_4d + MODULE PROCEDURE spatial_aggregation_3d, spatial_aggregation_4d END INTERFACE spatial_aggregation - + ! ------------------------------------------------------------------ ! NAME @@ -138,48 +137,48 @@ MODULE mo_spatial_agg_disagg_forcing ! Modified RK, MZ, DS, May 2014 - added mask2 INTERFACE spatial_disaggregation - MODULE PROCEDURE spatial_disaggregation_3d, spatial_disaggregation_4d + MODULE PROCEDURE spatial_disaggregation_3d, spatial_disaggregation_4d end INTERFACE spatial_disaggregation - + ! ------------------------------------------------------------------ PRIVATE - + ! ------------------------------------------------------------------ CONTAINS subroutine spatial_aggregation_3d(data2, cellsize2, cellsize1, mask1, mask2, data1) - - use mo_mhm_constants, only: nodata_dp + + use mo_common_constants, only : nodata_dp implicit none - real(dp), dimension(:,:,:), intent(in) :: data2 ! Level-2 data - real(dp), intent(in) :: cellsize2 ! Level-2 resolution - real(dp), intent(in) :: cellsize1 ! Level-1 resolution - logical, dimension(:,:), intent(in) :: mask1 ! Level-1 mask - logical, dimension(:,:), intent(in) :: mask2 ! Level-2 mask + real(dp), dimension(:, :, :), intent(in) :: data2 ! Level-2 data + real(dp), intent(in) :: cellsize2 ! Level-2 resolution + real(dp), intent(in) :: cellsize1 ! Level-1 resolution + logical, dimension(:, :), intent(in) :: mask1 ! Level-1 mask + logical, dimension(:, :), intent(in) :: mask2 ! Level-2 mask + + real(dp), dimension(:, :, :), allocatable, intent(out) :: data1 ! Level-1 data - real(dp), dimension(:,:,:), allocatable, intent(out) :: data1 ! Level-1 data - ! local variables - integer(i4) :: nr2, nc2 ! No. of rows and cols at Level-1 - integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 - real(dp) :: cellFactor - integer(i4), dimension(:,:), allocatable :: nTCells - integer(i4) :: nTimeSteps - integer(i4) :: i, j, ic, jc, t + integer(i4) :: nr2, nc2 ! No. of rows and cols at Level-1 + integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 + real(dp) :: cellFactor + integer(i4), dimension(:, :), allocatable :: nTCells + integer(i4) :: nTimeSteps + integer(i4) :: i, j, ic, jc, t ! get number of rows and cols at level-2 from mask2 ! and the total time steps - nr2 = size( data2, 1 ) - nc2 = size( data2, 2 ) - nTimeSteps = size( data2, 3 ) - + nr2 = size(data2, 1) + nc2 = size(data2, 2) + nTimeSteps = size(data2, 3) + ! get number of rows and cols at level-1 from mask1 - nr1 = size( mask1, 1 ) - nc1 = size( mask1, 2 ) + nr1 = size(mask1, 1) + nc1 = size(mask1, 2) !----------------------------------------------------------------------- ! Allocate and initalize nTCells which comprises @@ -187,91 +186,91 @@ subroutine spatial_aggregation_3d(data2, cellsize2, cellsize1, mask1, mask2, dat ! NOTE:: 1) cell size of L1 > L2 (see CellFactor) ! 2) nTCells is estimated over the valid masked domain only !----------------------------------------------------------------------- - + ! cellFactor = level-1 resolution (hydro) / level-2 resolution (meteo) cellFactor = cellsize1 / cellsize2 - + ! nTCells calculations - allocate( nTCells(nr1, nc1) ) - nTCells(:,:) = 0 - - do j=1, nc2 - jc = ceiling( real(j,dp)/cellFactor ) - do i=1, nr2 - ic = ceiling(real(i,dp)/cellFactor) - if( .not. mask2(i,j) ) cycle - nTCells(ic,jc) = nTcells(ic,jc) + 1 - end do + allocate(nTCells(nr1, nc1)) + nTCells(:, :) = 0 + + do j = 1, nc2 + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, nr2 + ic = ceiling(real(i, dp) / cellFactor) + if(.not. mask2(i, j)) cycle + nTCells(ic, jc) = nTcells(ic, jc) + 1 + end do end do - - + + ! allocate and initalize L1_data - allocate( data1(nr1, nc1, nTimeSteps) ) - data1(:,:,:) = 0.0_dp - + allocate(data1(nr1, nc1, nTimeSteps)) + data1(:, :, :) = 0.0_dp + ! time loop do t = 1, nTimeSteps - - ! perform spatial aggregation - do j=1, nc2 - jc = ceiling( real(j,dp)/cellFactor ) - do i=1, nr2 - ic = ceiling(real(i,dp)/cellFactor) - - ! only in valid masked area - if( .not. mask2(i,j) ) cycle - data1(ic,jc,t) = data1(ic,jc,t) + data2(i,j, t) - - end do - end do - - ! perform spatial average only over valid masked domain - ! out of the masked domain nTCells(:,:) = 0 - where( mask1 ) - data1(:,:,t) = data1(:,:,t) / real( nTcells(:,:), dp ) - elsewhere - data1(:,:,t) = nodata_dp - endwhere + + ! perform spatial aggregation + do j = 1, nc2 + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, nr2 + ic = ceiling(real(i, dp) / cellFactor) + + ! only in valid masked area + if(.not. mask2(i, j)) cycle + data1(ic, jc, t) = data1(ic, jc, t) + data2(i, j, t) + + end do + end do + + ! perform spatial average only over valid masked domain + ! out of the masked domain nTCells(:,:) = 0 + where(mask1) + data1(:, :, t) = data1(:, :, t) / real(nTcells(:, :), dp) + elsewhere + data1(:, :, t) = nodata_dp + endwhere end do - + ! free space deallocate(nTCells) end subroutine spatial_aggregation_3d - + subroutine spatial_aggregation_4d(data2, cellsize2, cellsize1, mask1, mask2, data1) - - use mo_mhm_constants, only: nodata_dp + + use mo_common_constants, only : nodata_dp implicit none - real(dp), dimension(:,:,:,:), intent(in) :: data2 ! Level-2 data - real(dp), intent(in) :: cellsize2 ! Level-2 resolution - real(dp), intent(in) :: cellsize1 ! Level-1 resolution - logical, dimension(:,:), intent(in) :: mask1 ! Level-1 mask - logical, dimension(:,:), intent(in) :: mask2 ! Level-2 mask + real(dp), dimension(:, :, :, :), intent(in) :: data2 ! Level-2 data + real(dp), intent(in) :: cellsize2 ! Level-2 resolution + real(dp), intent(in) :: cellsize1 ! Level-1 resolution + logical, dimension(:, :), intent(in) :: mask1 ! Level-1 mask + logical, dimension(:, :), intent(in) :: mask2 ! Level-2 mask + + real(dp), dimension(:, :, :, :), allocatable, intent(out) :: data1 ! Level-1 data - real(dp), dimension(:,:,:,:), allocatable, intent(out) :: data1 ! Level-1 data - ! local variables - integer(i4) :: nr2, nc2 ! No. of rows and cols at Level-1 - integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 - real(dp) :: cellFactor - integer(i4), dimension(:,:), allocatable :: nTCells - integer(i4) :: nMonths, nHours - integer(i4) :: i, j, ic, jc, t, h + integer(i4) :: nr2, nc2 ! No. of rows and cols at Level-1 + integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 + real(dp) :: cellFactor + integer(i4), dimension(:, :), allocatable :: nTCells + integer(i4) :: nMonths, nHours + integer(i4) :: i, j, ic, jc, t, h ! get number of rows and cols at level-2 from mask2 ! and the total time steps - nr2 = size( data2, 1 ) - nc2 = size( data2, 2 ) - nMonths = size( data2, 3 ) - nHours = size( data2, 4 ) - + nr2 = size(data2, 1) + nc2 = size(data2, 2) + nMonths = size(data2, 3) + nHours = size(data2, 4) + ! get number of rows and cols at level-1 from mask1 - nr1 = size( mask1, 1 ) - nc1 = size( mask1, 2 ) + nr1 = size(mask1, 1) + nc1 = size(mask1, 2) !----------------------------------------------------------------------- ! Allocate and initalize nTCells which comprises @@ -279,56 +278,56 @@ subroutine spatial_aggregation_4d(data2, cellsize2, cellsize1, mask1, mask2, dat ! NOTE:: 1) cell size of L1 > L2 (see CellFactor) ! 2) nTCells is estimated over the valid masked domain only !----------------------------------------------------------------------- - + ! cellFactor = level-1 resolution (hydro) / level-2 resolution (meteo) cellFactor = cellsize1 / cellsize2 - + ! nTCells calculations - allocate( nTCells(nr1, nc1) ) - nTCells(:,:) = 0 - - do j=1, nc2 - jc = ceiling( real(j,dp)/cellFactor ) - do i=1, nr2 - ic = ceiling(real(i,dp)/cellFactor) - if( .not. mask2(i,j) ) cycle - nTCells(ic,jc) = nTcells(ic,jc) + 1 - end do + allocate(nTCells(nr1, nc1)) + nTCells(:, :) = 0 + + do j = 1, nc2 + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, nr2 + ic = ceiling(real(i, dp) / cellFactor) + if(.not. mask2(i, j)) cycle + nTCells(ic, jc) = nTcells(ic, jc) + 1 + end do end do - - + + ! allocate and initalize L1_data - allocate( data1(nr1, nc1, nMonths, nHours) ) - data1(:,:,:,:) = 0.0_dp - + allocate(data1(nr1, nc1, nMonths, nHours)) + data1(:, :, :, :) = 0.0_dp + ! time loop do t = 1, nMonths - do h = 1, nHours + do h = 1, nHours - ! perform spatial aggregation - do j=1, nc2 - jc = ceiling( real(j,dp)/cellFactor ) - do i=1, nr2 - ic = ceiling(real(i,dp)/cellFactor) + ! perform spatial aggregation + do j = 1, nc2 + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, nr2 + ic = ceiling(real(i, dp) / cellFactor) - ! only in valid masked area - if( .not. mask2(i,j) ) cycle - data1(ic,jc,t,h) = data1(ic,jc,t,h) + data2(i,j,t,h) + ! only in valid masked area + if(.not. mask2(i, j)) cycle + data1(ic, jc, t, h) = data1(ic, jc, t, h) + data2(i, j, t, h) - end do end do + end do - ! perform spatial average only over valid masked domain - ! out of the masked domain nTCells(:,:) = 0 - where( mask1 ) - data1(:,:,t,h) = data1(:,:,t,h) / real( nTcells(:,:), dp ) - elsewhere - data1(:,:,t,h) = nodata_dp - endwhere + ! perform spatial average only over valid masked domain + ! out of the masked domain nTCells(:,:) = 0 + where(mask1) + data1(:, :, t, h) = data1(:, :, t, h) / real(nTcells(:, :), dp) + elsewhere + data1(:, :, t, h) = nodata_dp + endwhere - end do + end do end do - + ! free space deallocate(nTCells) @@ -336,108 +335,108 @@ end subroutine spatial_aggregation_4d subroutine spatial_disaggregation_3d(data2, cellsize2, cellsize1, mask1, mask2, data1) - use mo_mhm_constants, only: nodata_dp + use mo_common_constants, only : nodata_dp implicit none - real(dp), dimension(:,:,:), intent(in) :: data2 ! Level-2 data - real(dp), intent(in) :: cellsize2 ! Level-2 resolution - real(dp), intent(in) :: cellsize1 ! Level-1 resolution - logical, dimension(:,:), intent(in) :: mask1 ! Level-1 mask - logical, dimension(:,:), intent(in) :: mask2 ! Level-2 mask + real(dp), dimension(:, :, :), intent(in) :: data2 ! Level-2 data + real(dp), intent(in) :: cellsize2 ! Level-2 resolution + real(dp), intent(in) :: cellsize1 ! Level-1 resolution + logical, dimension(:, :), intent(in) :: mask1 ! Level-1 mask + logical, dimension(:, :), intent(in) :: mask2 ! Level-2 mask + + real(dp), dimension(:, :, :), allocatable, intent(out) :: data1 ! Level-1 data - real(dp), dimension(:,:,:), allocatable, intent(out) :: data1 ! Level-1 data - ! local variables - integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 + integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 - real(dp) :: cellFactor - integer(i4) :: nTimeSteps - integer(i4) :: i, j, t, ic, jc + real(dp) :: cellFactor + integer(i4) :: nTimeSteps + integer(i4) :: i, j, t, ic, jc ! get number of rows and cols at level-2 from mask2 - nr1 = size( mask1, 1) - nc1 = size( mask1, 2) + nr1 = size(mask1, 1) + nc1 = size(mask1, 2) ! cellFactor = level-2 resolution (meteo) / level-1 resolution (hydro) cellFactor = cellsize2 / cellsize1 - + ! total time steps nTimeSteps = size(data2, 3) ! allocate and initalize L1_data - allocate( data1(nr1, nc1, nTimeSteps) ) - data1(:,:,:) = nodata_dp - + allocate(data1(nr1, nc1, nTimeSteps)) + data1(:, :, :) = nodata_dp + ! over the time loop do t = 1, nTimeSteps - + ! spatial disaggregation - do j=1, nc1 - jc = ceiling( real(j,dp)/cellFactor ) - do i=1, nr1 - ic = ceiling(real(i,dp)/cellFactor) - ! only over the valid masked area - if( .not. mask2(ic,jc) ) cycle - data1(i,j,t) = data2(ic,jc, t) - end do + do j = 1, nc1 + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, nr1 + ic = ceiling(real(i, dp) / cellFactor) + ! only over the valid masked area + if(.not. mask2(ic, jc)) cycle + data1(i, j, t) = data2(ic, jc, t) + end do end do - - end do - + + end do + end subroutine spatial_disaggregation_3d subroutine spatial_disaggregation_4d(data2, cellsize2, cellsize1, mask1, mask2, data1) - use mo_mhm_constants, only: nodata_dp + use mo_common_constants, only : nodata_dp implicit none - real(dp), dimension(:,:,:,:), intent(in) :: data2 ! Level-2 data - real(dp), intent(in) :: cellsize2 ! Level-2 resolution - real(dp), intent(in) :: cellsize1 ! Level-1 resolution - logical, dimension(:,:), intent(in) :: mask1 ! Level-1 mask - logical, dimension(:,:), intent(in) :: mask2 ! Level-2 mask + real(dp), dimension(:, :, :, :), intent(in) :: data2 ! Level-2 data + real(dp), intent(in) :: cellsize2 ! Level-2 resolution + real(dp), intent(in) :: cellsize1 ! Level-1 resolution + logical, dimension(:, :), intent(in) :: mask1 ! Level-1 mask + logical, dimension(:, :), intent(in) :: mask2 ! Level-2 mask + + real(dp), dimension(:, :, :, :), allocatable, intent(out) :: data1 ! Level-1 data - real(dp), dimension(:,:,:,:), allocatable, intent(out) :: data1 ! Level-1 data - ! local variables - integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 + integer(i4) :: nr1, nc1 ! No. of rows and cols at Level-1 - real(dp) :: cellFactor - integer(i4) :: nMonths, nHours - integer(i4) :: i, j, t, ic, jc, h + real(dp) :: cellFactor + integer(i4) :: nMonths, nHours + integer(i4) :: i, j, t, ic, jc, h ! get number of rows and cols at level-2 from mask2 - nr1 = size( mask1, 1) - nc1 = size( mask1, 2) + nr1 = size(mask1, 1) + nc1 = size(mask1, 2) ! cellFactor = level-2 resolution (meteo) / level-1 resolution (hydro) cellFactor = cellsize2 / cellsize1 - + ! time axis nMonths = size(data2, 3) - nHours = size(data2, 4) + nHours = size(data2, 4) ! allocate and initalize L1_data - allocate( data1(nr1, nc1, nMonths, nHours) ) - data1(:,:,:,:) = nodata_dp - + allocate(data1(nr1, nc1, nMonths, nHours)) + data1(:, :, :, :) = nodata_dp + ! over the time loop do t = 1, nMonths - do h = 1, nHours - - ! spatial disaggregation - do j=1, nc1 - jc = ceiling( real(j,dp)/cellFactor ) - do i=1, nr1 - ic = ceiling(real(i,dp)/cellFactor) - ! only over the valid masked area - if( .not. mask2(ic,jc) ) cycle - data1(i,j,t,h) = data2(ic,jc,t,h) - end do + do h = 1, nHours + + ! spatial disaggregation + do j = 1, nc1 + jc = ceiling(real(j, dp) / cellFactor) + do i = 1, nr1 + ic = ceiling(real(i, dp) / cellFactor) + ! only over the valid masked area + if(.not. mask2(ic, jc)) cycle + data1(i, j, t, h) = data2(ic, jc, t, h) end do - end do + end do + end do end do end subroutine spatial_disaggregation_4d diff --git a/src/mHM/mo_startup.f90 b/src/mHM/mo_startup.f90 index 16799739..ffeeaf55 100644 --- a/src/mHM/mo_startup.f90 +++ b/src/mHM/mo_startup.f90 @@ -15,22 +15,20 @@ MODULE mo_startup ! Written Luis Samaniego, Rohini Kumar, Dec 2012 - USE mo_kind, ONLY: i4, dp - USE mo_init_states, ONLY: get_basin_info - use mo_mhm_constants, only: nodata_i4, nodata_dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE PRIVATE - PUBLIC :: initialise ! initialization sequence + PUBLIC :: mhm_initialize ! initialization sequence CONTAINS ! ------------------------------------------------------------------ ! NAME - ! initialise + ! mhm_initialize ! PURPOSE !> \brief Initialize main mHM variables @@ -92,61 +90,61 @@ MODULE mo_startup ! Stephan Thober, Aug 2015 - removed initialisation of routing ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options - subroutine initialise(iBasin) + subroutine mhm_initialize() - use mo_kind, only: i4 - use mo_global_variables, only: soilDB, & - L0_Basin, & - read_restart, & - perform_mpr, & - dirRestartIn, & - iFlag_soilDB ! options to handle different types of soil databases - use mo_soil_database, only: generate_soil_database - use mo_init_states, only: variables_alloc - USE mo_restart, ONLY: read_restart_config + use mo_kind, only : i4 + use mo_common_mHM_mRM_variables, only : & + dirRestartIn, & + read_restart + use mo_common_variables, only : & + level1, level0, nBasins, L0_Basin + use mo_init_states, only : variables_alloc + USE mo_common_restart, ONLY : read_grid_info + USE mo_global_variables, ONLY : level2 + use mo_grid, only : set_basin_indices + use mo_mpr_startup, only : mpr_initialize, init_eff_params implicit none - integer(i4), intent(in) :: iBasin + integer(i4) :: iBasin - ! To be initialized only one time - if (iBasin == 1) then - ! constants initialization - call constants_init() - ! soilDB common for all basins - call generate_soil_database(soilDB, iFlag_soilDB) - end if - - ! L0 and L1 initialization - - if ( perform_mpr ) then - if (iBasin .eq. 1) then - call L0_check_input(iBasin) - else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1) ) then - call L0_check_input(iBasin) - end if - end if - - if ( .not. read_restart ) then - if (iBasin .eq. 1) then - call L0_variable_init(iBasin, soilDB%is_present) - - else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1 )) then - call L0_variable_init(iBasin, soilDB%is_present) - end if - call L1_variable_init(iBasin) + ! constants initialization + call constants_init() + allocate(level2(nBasins)) + + if (read_restart) then + allocate(level1(nBasins)) else - call read_restart_config(iBasin, soilDB%is_present, dirRestartIn(iBasin)) + call mpr_initialize() end if - ! L2 inialization - call L2_variable_init(iBasin) + do iBasin = 1, nBasins - ! State variables, fluxes and parameter fields - ! have to be allocated in any case - call variables_alloc(iBasin) + if (read_restart) then + ! this reads only the basin properties + call read_grid_info(iBasin, dirRestartIn(iBasin), "1", "mHM", level1(iBasin)) + ! Parameter fields have to be allocated in any case + call init_eff_params(level1(iBasin)%nCells) + end if + + ! State variables and fluxes + ! have to be allocated and initialised in any case + call variables_alloc(level1(iBasin)%nCells) + + ! L2 inialization + call L2_variable_init(iBasin, level0(L0_Basin(iBasin)), level2(iBasin)) + + end do + + ! if no restart, this is done already in MPR + if (read_restart) then + call set_basin_indices(level1) + end if + + call set_basin_indices(level2) + + end subroutine mhm_initialize - end subroutine initialise ! ------------------------------------------------------------------ @@ -193,662 +191,51 @@ end subroutine initialise ! Modified Rohini Kumar, Jan 2013 ! Juliane Mai & Matthias Cuntz, Nov 2013 - check timeStep - subroutine constants_init( ) + subroutine constants_init() - use mo_global_variables, only: NTSTEPDAY, c2TSTu, timeStep, neutron_integral_AFast - use mo_common_variables, only: processMatrix - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_neutrons, only: TabularIntegralAFast + use mo_global_variables, only : neutron_integral_AFast + use mo_common_variables, only : processMatrix + use mo_neutrons, only : TabularIntegralAFast + use mo_mpr_global_variables, only : GeoUnitList, c2TSTu + use mo_mpr_file, only : file_hydrogeoclass + use mo_string_utils, only : num2str + use mo_file, only : file_namelist_mhm_param + use mo_message, only : message + use mo_common_mHM_mRM_variables, only : & + timestep ! model time step implicit none - ! transformation of time units & constants - if (mod(24,timeStep) > 0) then - call message('mo_startup: timeStep must be a divisor of 24: ', num2str(timeStep)) - stop - end if - NTSTEPDAY = 24_i4/timeStep ! # of time steps per day - c2TSTu = real(timeStep,dp)/24.0_dp ! from per timeStep to per day !Fill Tabular for neutron flux integral - if ( processMatrix(10, 1) .eq. 2 ) then - allocate(neutron_integral_AFast(10000+2)) - call TabularIntegralAFast(neutron_integral_AFast,20.0_dp) + if (processMatrix(10, 1) .eq. 2) then + allocate(neutron_integral_AFast(10000 + 2)) + call TabularIntegralAFast(neutron_integral_AFast, 20.0_dp) else - allocate(neutron_integral_AFast(1)) - neutron_integral_AFast(:)=0.0_dp + allocate(neutron_integral_AFast(1)) + neutron_integral_AFast(:) = 0.0_dp endif - end subroutine constants_init - - ! ------------------------------------------------------------------ - - ! NAME - ! L0_check_input - - !> \brief Check for errors in L0 input data - - !> \details Check for possible errors in input data (morphological and land cover) at level-0 - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" basin id - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - ! \author Rohini Kumar - ! \date Jan 2013 - ! Modified - ! Rohini Kumar, Aug 2013 - added iFlag_LAI_data_format to handle LAI options, - ! and changed within the code made accordingly - ! Rohini Kumar, Sep 2013 - read input data for routing processes according - ! & Stephan Thober, to process_matrix flag - ! Stephan Thober, Aug 2015 - moved check of L0 routing variables to mRM - ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options - - subroutine L0_check_input(iBasin) - - use mo_global_variables, only: basin, & - L0_elev, L0_slope, L0_asp, & - L0_geoUnit, & - L0_soilId, & ! soil class ID on input resolution (L0) - nSoilHorizons_mHM, & ! soil horizons info for mHM - iFlag_soilDB, & ! options to handle different types of soil databases - L0_LCover_LAI, & - nLCoverScene, & - L0_LCover, & - timeStep_LAI_input - - use mo_constants, only: eps_dp - use mo_message, only: message, message_text - use mo_string_utils, only: num2str - - implicit none - - integer(i4), intent(in) :: iBasin - - ! local variables - integer(i4) :: k, n, nH - - ! START CHECKING VARIABLES - do k = basin%L0_iStart(iBasin), basin%L0_iEnd(iBasin) - - ! elevation [m] - if ( abs(L0_elev(k) - nodata_dp) .lt. eps_dp ) then - message_text = trim(num2str(k,'(I5)'))//','//trim(num2str(iBasin,'(I5)')) - call message(' Error: elevation has missing value within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if - - ! slope [%] - if ( abs( L0_slope(k) - nodata_dp) .lt. eps_dp ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)')) - call message(' Error: slope has missing value within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if - - ! aspect [degree] - if ( abs( L0_asp(k) - nodata_dp ) .lt. eps_dp ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)')) - call message(' Error: aspect has missing values within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if - - ! soil-Id [-] - nH = 1 !> by default; when iFlag_soilDB = 0 - if ( iFlag_soilDB .eq. 1 ) nH = nSoilHorizons_mHM - ! another option to handle multiple soil horizons properties - do n = 1, nH - if ( L0_soilId(k,n) .eq. nodata_i4 ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)'))//','// trim(num2str(n,'(I5)')) - call message(' Error: soil id has missing values within the valid masked area at cell in basin and horizon ', & - trim(message_text) ) - stop - end if - end do - - ! geological-Id [-] - if ( L0_geoUnit(k) .eq. nodata_i4 ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)')) - call message(' Error: geological formation id has missing values within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if - - ! landcover scenes - do n = 1, nLCoverScene - if ( L0_LCover(k,n) .eq. nodata_i4 ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)'))//','// trim(num2str(n,'(I5)')) - call message(' Error: land cover id has missing values within the valid masked area at cell in basin and scene ', & - trim(message_text) ) - stop - end if - end do - - ! land cover scenes related to LAI - if( timeStep_LAI_input .EQ. 0 ) then - if ( L0_LCover_LAI(k) .eq. nodata_i4 ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)')) - call message(' Error: land cover ID for LAI has missing values within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if - end if - - end do - - end subroutine L0_check_input - - ! ------------------------------------------------------------------ - - ! NAME - ! L0_variable_init - - !> \brief level 0 variable initialization - - !> \details following tasks are performed for L0 data sets - !> - cell id & numbering - !> - storage of cell cordinates (row and coloum id) - !> - empirical dist. of terrain slope - !> - flag to determine the presence of a particular soil id - !> in this configuration of the model run - !> If a variable is added or removed here, then it also has to - !> be added or removed in the subroutine config_variables_set in - !> module mo_restart and in the subroutine set_config in module - !> mo_set_netcdf_restart - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" basin id - - ! INTENT(INOUT) - !> \param[in,out] "integer(i4), dimension(:) :: soilId_isPresent" - !> flag to indicate wether a given soil-id is present or not, DIMENSION [nSoilTypes] - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - ! \author Rohini Kumar - ! \date Jan 2013 - ! Modified - ! Rohini Kumar & Matthias Cuntz, May 2014 - cell area calulation based on a regular lat-lon grid or - ! on a regular X-Y coordinate system - ! Matthias Cuntz, May 2014 - changed empirical distribution function - ! so that doubles get the same value - ! Matthias Zink & Matthias Cuntz, Feb 2016 - code speed up due to reformulation of CDF calculation - ! Rohini Kumar, Mar 2016 - changes for handling multiple soil database options - ! Maren Kaluza, Feb 2018 - removed slope_val, temp, only sort the index to speed - ! up finding the empirical distribution slope_emp - - - ! ! - subroutine L0_variable_init(iBasin, soilId_isPresent) - - use mo_global_variables, only: level0, & - L0_nCells, L0_cellCoor, & - L0_Id, L0_slope, & - L0_slope_emp, & - L0_soilId, & ! soil class ID on input resolution (L0) - nSoilHorizons_mHM, & ! soil horizons info for mHM - iFlag_soilDB, & ! options to handle different types of soil databases - nSoilTypes, & - L0_areaCell, & - iFlag_cordinate_sys - use mo_append, only: append - use mo_orderpack, only: sort_index - use mo_utils, only: eq - use mo_constants, only: TWOPI_dp, RadiusEarth_dp - - implicit none - - integer(i4), intent(in) :: iBasin - integer(i4), dimension(:), allocatable, intent(inout) :: soilId_isPresent - - ! local variables - integer(i4) :: nCells - integer(i4), dimension(:,:), allocatable :: cellCoor - integer(i4), dimension(:), allocatable :: Id - real(dp), dimension(:), allocatable :: areaCell - real(dp), dimension(:,:), allocatable :: areaCell_2D - - integer(i4) :: nrows, ncols - integer(i4) :: iStart, iEnd - logical, dimension(:,:), allocatable :: mask - - real(dp), dimension(:), allocatable :: slope_emp - integer(i4), dimension(:), allocatable :: slope_sorted_index - - integer(i4) :: i, j, k, nH, i_sort, i_sortpost - real(dp) :: rdum, degree_to_radian, degree_to_metre - - !-------------------------------------------------------- - ! STEPS:: - ! 1) Estimate each variable locally for a given basin - ! 2) Pad each variable to its corresponding global one - !-------------------------------------------------------- - - ! level-0 information - call get_basin_info( iBasin, 0, nrows, ncols, nCells=nCells, iStart=iStart, iEnd=iEnd, mask=mask ) - - allocate( cellCoor(nCells,2) ) - allocate( Id(nCells ) ) - allocate( areaCell(nCells ) ) - allocate( areaCell_2D(nrows,ncols) ) - - cellCoor(:,:) = nodata_i4 - Id(:) = nodata_i4 - areaCell(:) = nodata_dp - areaCell_2D(:,:) = nodata_dp - - !------------------------------------------------ - ! start looping for cell cordinates and ids - !------------------------------------------------ - k = 0 - do j = 1, ncols - do i = 1, nrows - if ( .NOT. mask(i,j) ) cycle - k = k + 1 - Id(k) = k - cellCoor(k,1) = i - cellCoor(k,2) = j - end do - end do - - ! ESTIMATE AREA [m2] - - ! regular X-Y coordinate system - if(iFlag_cordinate_sys .eq. 0) then - areaCell(:) = level0%cellsize(iBasin) * level0%cellsize(iBasin) - - ! regular lat-lon coordinate system - else if(iFlag_cordinate_sys .eq. 1) then - - degree_to_radian = TWOPI_dp / 360.0_dp - degree_to_metre = RadiusEarth_dp*TWOPI_dp/360.0_dp - do i = ncols, 1, -1 - j = ncols - i + 1 - ! get latitude in degrees - rdum = level0%yllcorner(iBasin) + (real(j,dp)-0.5_dp) * level0%cellsize(iBasin) - ! convert to radians - rdum = rdum*degree_to_radian - ! AREA [m2] - areaCell_2D(:,i) = (level0%cellsize(iBasin) * cos(rdum) * degree_to_metre) * (level0%cellsize(iBasin)*degree_to_metre) - end do - areaCell(:) = pack( areaCell_2D(:,:), mask) - - end if - - !--------------------------------------------------- - ! Estimate empirical distribution of slope - !--------------------------------------------------- - allocate( slope_emp(nCells), slope_sorted_index(nCells)) - - ! get sorted data and sorted indexes to remap later - slope_sorted_index = sort_index(L0_slope(iStart:iEnd)) - - ! empirical distribution of slopes = cumulated number points with slopes that are <= the slope at this point - ! - ! sorted data emp. CDF - ! 9 | x x 7/8 | x x - ! | | - ! 8 | x 5/8 | x - ! | | - ! 5 | x x x 4/8 | x x x - ! | | - ! 2 | x 1/8 | x - ! |__________________ |__________________ - ! - ! highest slope value = highest rank or No. of data points / (data points + 1) - slope_emp(slope_sorted_index(nCells)) = real(nCells, dp) / real(nCells+1,dp) - - ! backward loop to check if the preceding data point has the same slope value - do i=nCells-1,1,-1 - i_sort=slope_sorted_index(i) - i_sortpost=slope_sorted_index(i+1) - if (eq(L0_slope(iStart-1+i_sort), L0_slope(iStart-1+i_sortpost))) then - ! if yes: assign the same probabitity - slope_emp(i_sort) = slope_emp(i_sortpost) - else - ! if not: assign rank / (data points + 1) - slope_emp(i_sort) = real(i, dp) / real(nCells+1,dp) - end if - end do - - ! EXAMPLE - ! in = [ 7, 20, 31, 31, 12, 31, 42 ] - ! sorted = [ 7, 12, 20, 31, 31, 31, 42 ] - ! index = [ 1, 5, 2, 3, 4, 6, 7 ] - ! temp = [ 1, 2, 3, 6, 6, 6, 7 ] - ! out = [ 1, 3, 6, 6, 2, 6, 7 ] / (len(out) + 1 ) - - ! remap probabilities to its position in original data - - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - call append( L0_cellCoor, cellCoor ) - call append( L0_Id, Id ) - call append( L0_areaCell, areaCell ) - call append( L0_slope_emp, slope_emp ) - - L0_nCells = size(L0_Id,1) - - !------------------------------------------------------ - ! Assign whether a given soil type is present or not - !------------------------------------------------------ - if ( iBasin .eq. 1 ) then - allocate( soilId_isPresent(nSoilTypes) ) - soilId_isPresent(:) = 0 - end if - - nH = 1 !> by default; when iFlag_soilDB = 0 - if ( iFlag_soilDB .eq. 1 ) nH = nSoilHorizons_mHM - do i = 1, nH - do k = iStart, iEnd - j = L0_soilId(k,i) - soilId_isPresent(j) = 1 - end do - end do - - ! free space - deallocate(cellCoor, Id, areaCell, areaCell_2D, mask, slope_emp, slope_sorted_index) - - end subroutine L0_variable_init - - ! ------------------------------------------------------------------ - - ! NAME - ! L1_variable_init - - !> \brief Level-1 variable initialization - - !> \details following tasks are performed for L1 datasets - !> - cell id & numbering - !> - mask creation - !> - storage of cell cordinates (row and coloum id) - !> - sorage of four corner L0 cordinates - !> If a variable is added or removed here, then it also has to - !> be added or removed in the subroutine config_variables_set in - !> module mo_restart and in the subroutine set_config in module - !> mo_set_netcdf_restart - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" basin id - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - ! \author Rohini Kumar - ! \date Jan 2013 - - subroutine L1_variable_init(iBasin) - - use mo_global_variables, only: nBasins, basin, level0, level1, & - L1_nCells, L1_Id, L1_cellCoor, & - L1_upBound_L0, L1_downBound_L0, & - L1_leftBound_L0, & - L1_rightBound_L0, L1_nTCells_L0,& - L0_areaCell, L1_areaCell, & - resolutionHydrology - use mo_init_states, only: calculate_grid_properties - use mo_append, only: append ! append vector - - implicit none - - integer(i4), intent(in) :: iBasin - - ! local variables - integer(i4) :: nrows0, ncols0 - integer(i4) :: iStart0, iEnd0 - real(dp) :: xllcorner0, yllcorner0 - real(dp) :: cellsize0 - logical, dimension(:,:), allocatable :: mask0 - real(dp), dimension(:,:), allocatable :: areaCell0_2D - - integer(i4) :: nrows1, ncols1 - logical, dimension(:,:), allocatable :: mask1 - - integer(i4) :: nCells - integer(i4), dimension(:,:), allocatable :: cellCoor - integer(i4), dimension(:), allocatable :: Id - integer(i4), dimension(:), allocatable :: upBound - integer(i4), dimension(:), allocatable :: downBound - integer(i4), dimension(:), allocatable :: leftBound - integer(i4), dimension(:), allocatable :: rightBound - real(dp), dimension(:), allocatable :: areaCell - integer(i4), dimension(:), allocatable :: nTCells - - real(dp) :: cellFactorHydro - - integer(i4) :: iup, idown - integer(i4) :: jl, jr - - integer(i4) :: i, j, k, ic, jc - - !-------------------------------------------------------- - ! STEPS:: - ! 1) Estimate each variable locally for a given basin - ! 2) Pad each variable to its corresponding global one - !-------------------------------------------------------- - - ! level-0 information - call get_basin_info( iBasin, 0, nrows0, ncols0, iStart=iStart0, iEnd=iEnd0, mask=mask0, & - xllcorner=xllcorner0, yllcorner=yllcorner0, cellsize=cellsize0 ) - - if(iBasin == 1) then - allocate( level1%nrows (nBasins) ) - allocate( level1%ncols (nBasins) ) - allocate( level1%xllcorner (nBasins) ) - allocate( level1%yllcorner (nBasins) ) - allocate( level1%cellsize (nBasins) ) - allocate( level1%nodata_value (nBasins) ) - end if - - ! grid properties - call calculate_grid_properties( nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - resolutionHydrology(iBasin) , & - level1%nrows(iBasin), level1%ncols(iBasin), level1%xllcorner(iBasin), & - level1%yllcorner(iBasin), level1%cellsize(iBasin), level1%nodata_value(iBasin) ) - - ! level-1 information - call get_basin_info( iBasin, 1, nrows1, ncols1 ) - - ! cellfactor = leve1-1 / level-0 - cellFactorHydro = level1%cellsize(iBasin) / level0%cellsize(iBasin) - - ! allocation and initalization of mask at level-1 - allocate( mask1(nrows1, ncols1) ) - mask1(:,:) = .FALSE. - - ! create mask at level-1 - do j=1,ncols0 - jc = ceiling( real(j,dp)/cellFactorHydro ) - do i=1,nrows0 - if ( .NOT. mask0(i,j) ) cycle - ic = ceiling( real(i,dp)/cellFactorHydro ) - mask1(ic,jc) = .TRUE. - end do - end do - - ! level-0 cell area - allocate( areaCell0_2D(nrows0,ncols0) ) - areaCell0_2D(:,:) = UNPACK( L0_areaCell(iStart0:iEnd0), mask0, nodata_dp ) - - ! estimate ncells and initalize related variables - nCells = count( mask1 ) - - ! allocate and initalize cell1 related variables - allocate( Id (nCells ) ) - allocate( cellCoor (nCells, 2) ) - allocate( upBound (nCells ) ) - allocate( downBound (nCells ) ) - allocate( leftBound (nCells ) ) - allocate( rightBound(nCells ) ) - allocate( areaCell (nCells ) ) - allocate( nTCells (nCells ) ) - - k = 0 - do jc=1,ncols1 - do ic=1,nrows1 - if ( .NOT. mask1(ic,jc) ) cycle - k = k + 1 - - Id(k) = k - cellCoor(k,1) = ic - cellCoor(k,2) = jc - - ! coord. of all corners -> of finer scale level-0 - iup = (ic-1) * nint(cellFactorHydro,i4) + 1 - idown = ic * nint(cellFactorHydro,i4) - jl = (jc-1) * nint(cellFactorHydro,i4) + 1 - jr = jc * nint(cellFactorHydro,i4) - - ! constrain the range of up, down, left, and right boundaries - if(iup < 1 ) iup = 1 - if(idown > nrows0 ) idown = nrows0 - if(jl < 1 ) jl = 1 - if(jr > ncols0 ) jr = ncols0 - - upBound (k) = iup - downBound (k) = idown - leftBound (k) = jl - rightBound(k) = jr - - ! effective area [km2] & total no. of L0 cells within a given L1 cell - areaCell(k) = sum( areacell0_2D(iup:idown, jl:jr), mask0(iup:idown, jl:jr) )*1.0E-6 - nTCells(k) = count( mask0(iup:idown, jl:jr) ) - - end do - end do - - - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - if( iBasin .eq. 1 ) then - - allocate(basin%L1_iStart(nBasins)) - allocate(basin%L1_iEnd (nBasins)) - allocate(basin%L1_iStartMask(nBasins)) - allocate(basin%L1_iEndMask (nBasins)) - - ! basin information - basin%L1_iStart(iBasin) = 1 - basin%L1_iEnd (iBasin) = basin%L1_iStart(iBasin) + nCells - 1 - - basin%L1_iStartMask(iBasin) = 1 - basin%L1_iEndMask (iBasin) = basin%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - - else - - ! basin information - basin%L1_iStart(iBasin) = basin%L1_iEnd(iBasin-1) + 1 - basin%L1_iEnd (iBasin) = basin%L1_iStart(iBasin) + nCells - 1 - - basin%L1_iStartMask(iBasin) = basin%L1_iEndMask(iBasin-1) + 1 - basin%L1_iEndMask (iBasin) = basin%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - + ! check if enough geoparameter are defined in mhm_parameter.nml + ! this was formerly done after reading of data, but mHM and MPR are now seperate processes + if ((processMatrix(9, 2)) .NE. size(GeoUnitList, 1)) then + call message() + call message('***ERROR: Mismatch: Number of geological units in ', trim(adjustl(file_hydrogeoclass)), & + ' is ', trim(adjustl(num2str(size(GeoUnitList, 1))))) + call message(' while it is ', trim(num2str(processMatrix(9, 2))), & + ' in ', trim(file_namelist_mhm_param), '!') + stop 1 end if - call append( basin%L1_Mask, RESHAPE( mask1, (/nrows1*ncols1/) ) ) - call append( L1_Id , Id ) - call append( L1_cellCoor , cellCoor ) - call append( L1_upBound_L0 , upBound ) - call append( L1_downBound_L0 , downBound ) - call append( L1_leftBound_L0 , leftBound ) - call append( L1_rightBound_L0, rightBound ) - call append( L1_areaCell , areaCell ) - call append( L1_nTCells_L0 , nTCells ) - - L1_nCells = size( L1_Id, 1 ) + c2TSTu = real(timeStep, dp) / 24.0_dp ! from per timeStep to per day - ! free space - deallocate( mask0, areaCell0_2D, mask1, areaCell, & - cellCoor, Id, upBound, downBound, & - leftBound, rightBound, nTCells ) - - end subroutine L1_variable_init + end subroutine constants_init ! ------------------------------------------------------------------ ! NAME ! L2_variable_init - + ! PURPOSE !> \brief Initalize Level-2 meteorological forcings data @@ -893,142 +280,71 @@ end subroutine L1_variable_init !> \date Feb 2013 ! -------------------------------------------------------------------------- - subroutine L2_variable_init(iBasin) + subroutine L2_variable_init(iBasin, level0_iBasin, level2_iBasin) + + use mo_common_variables, only : & + Grid - use mo_read_spatial_data,only: read_header_ascii - use mo_message, only: message - use mo_append, only: append ! append vector - use mo_string_utils, only: num2str - use mo_init_states, only: get_basin_info - use mo_init_states, only: calculate_grid_properties + use mo_read_spatial_data, only : read_header_ascii + use mo_message, only : message + use mo_string_utils, only : num2str - use mo_global_variables, only: nBasins, basin, level0, level2, dirPrecipitation - use mo_mhm_constants, only: nodata_dp - use mo_file, only: file_meteo_header, umeteo_header + use mo_global_variables, only : dirPrecipitation + use mo_mpr_file, only : file_meteo_header, umeteo_header + use mo_grid, only : init_lowres_level - implicit none - integer(i4), intent(in) :: iBasin + integer(i4), intent(in) :: iBasin + type(Grid), intent(in) :: level0_iBasin + type(Grid), intent(inout) :: level2_iBasin ! local variables - integer(i4) :: nrows0, ncols0 - logical, dimension(:,:), allocatable :: mask0 - real(dp) :: xllcorner0, yllcorner0 - real(dp) :: cellsize0 - - integer(i4) :: nrows2, ncols2 - logical, dimension(:,:), allocatable :: mask2 - real(dp) :: xllcorner2, yllcorner2 - real(dp) :: cellsize2 - integer(i4) :: nCells2 - real(dp) :: cellFactor - integer(i4) :: i, j, ic, jc - character(256) :: fName + integer(i4) :: nrows2, ncols2 + real(dp) :: xllcorner2, yllcorner2 + real(dp) :: cellsize2, nodata_dummy + character(256) :: fName !-------------------------------------------------------- ! STEPS:: ! 1) Estimate each variable locally for a given basin ! 2) Pad each variable to its corresponding global one !-------------------------------------------------------- - - ! assign space - if(iBasin .eq. 1) then - allocate( level2%nrows (nBasins) ) - allocate( level2%ncols (nBasins) ) - allocate( level2%xllcorner (nBasins) ) - allocate( level2%yllcorner (nBasins) ) - allocate( level2%cellsize (nBasins) ) - allocate( level2%nodata_value (nBasins) ) - end if - - ! read header file + + ! read header file ! NOTE: assuming the header file for all metero variables are same as that of precip. ! A counter check for this assumption is perfromed in the read_meteo_bin file - - fName = trim(adjustl(dirPrecipitation(iBasin))) // trim(adjustl(file_meteo_header)) - call read_header_ascii( trim(fName), umeteo_header, & - level2%nrows(iBasin), level2%ncols(iBasin), level2%xllcorner(iBasin), & - level2%yllcorner(iBasin), level2%cellsize(iBasin), level2%nodata_value(iBasin) ) - - ! level-0 information - call get_basin_info( iBasin, 0, nrows0, ncols0, mask=mask0, & - xllcorner=xllcorner0, yllcorner=yllcorner0, cellsize=cellsize0 ) - - ! grid information - call calculate_grid_properties( nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - level2%cellsize(iBasin), & - nrows2, ncols2, xllcorner2, yllcorner2, cellsize2,level2%nodata_value(iBasin) ) - - ! check - if ( (ncols2 .ne. level2%ncols(iBasin)) .or. & - (nrows2 .ne. level2%nrows(iBasin)) .or. & - ( abs(xllcorner2 - level2%xllcorner(iBasin)) .gt. tiny(1.0_dp) ) .or. & - ( abs(yllcorner2 - level2%yllcorner(iBasin)) .gt. tiny(1.0_dp) ) .or. & - ( abs(cellsize2 - level2%cellsize(iBasin)) .gt. tiny(1.0_dp) ) ) then - call message() - call message('***ERROR: L2_variable_init: Header of meteorology and morphology do not fit for basin: ', & - trim(adjustl(num2str(iBasin)))) - call message(' Rows, cols and cellsize need to be multipliers. x and y corners ') - call message(' need to be equal.') - stop - end if - - - ! cellfactor = leve1-2 / level-0 - cellFactor = level2%cellsize(iBasin) / level0%cellsize(iBasin) - - ! allocation and initalization of mask at level-2 - allocate( mask2(nrows2, ncols2) ) - mask2(:,:) = .FALSE. - - ! create mask at level-2 - do j = 1, ncols0 - jc = ceiling( real(j,dp)/cellFactor ) - do i = 1, nrows0 - if ( .NOT. mask0(i,j) ) cycle - ic = ceiling( real(i,dp)/cellFactor ) - mask2(ic,jc) = .TRUE. - end do - end do - - ! no. of valid cells at level-2 - nCells2 = count( mask2 ) - - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - if (iBasin .eq. 1) then - - ! allocate space - allocate(basin%L2_iStart (nBasins)) - allocate(basin%L2_iEnd (nBasins)) - allocate(basin%L2_iStartMask (nBasins)) - allocate(basin%L2_iEndMask (nBasins)) - - ! basin information - basin%L2_iStart(iBasin) = 1_i4 - basin%L2_iEnd (iBasin) = basin%L2_iStart(iBasin) + nCells2 - 1_i4 - - basin%L2_iStartMask(iBasin) = 1_i4 - basin%L2_iEndMask (iBasin) = basin%L2_iStartMask(iBasin) + nrows2*ncols2 - 1_i4 - - else - - ! basin information - basin%L2_iStart(iBasin) = basin%L2_iEnd(iBasin-1) + 1_i4 - basin%L2_iEnd (iBasin) = basin%L2_iStart(iBasin) + nCells2 - 1_i4 - - basin%L2_iStartMask(iBasin) = basin%L2_iEndMask(iBasin-1) + 1_i4 - basin%L2_iEndMask (iBasin) = basin%L2_iStartMask(iBasin) + nrows2*ncols2 - 1_i4 + fName = trim(adjustl(dirPrecipitation(iBasin))) // trim(adjustl(file_meteo_header)) + call read_header_ascii(trim(fName), umeteo_header, & + nrows2, ncols2, xllcorner2, & + yllcorner2, cellsize2, nodata_dummy) + + call init_lowres_level(level0_iBasin, cellsize2, level2_iBasin) + + ! check + if ((ncols2 .ne. level2_iBasin%ncols) .or. & + (nrows2 .ne. level2_iBasin%nrows) .or. & + (abs(xllcorner2 - level2_iBasin%xllcorner) .gt. tiny(1.0_dp)) .or. & + (abs(yllcorner2 - level2_iBasin%yllcorner) .gt. tiny(1.0_dp)) .or. & + (abs(cellsize2 - level2_iBasin%cellsize) .gt. tiny(1.0_dp))) then + call message(' ***ERROR: subroutine L2_variable_init: size mismatch in grid file for level2 in basin ', & + trim(adjustl(num2str(iBasin))), '!') + call message(' Expected to have following properties (based on L0):') + call message('... rows: ', trim(adjustl(num2str(level2_iBasin%nrows))), ', ') + call message('... cols: ', trim(adjustl(num2str(level2_iBasin%ncols))), ', ') + call message('... cellsize: ', trim(adjustl(num2str(level2_iBasin%cellsize))), ', ') + call message('... xllcorner:', trim(adjustl(num2str(level2_iBasin%xllcorner))), ', ') + call message('... yllcorner:', trim(adjustl(num2str(level2_iBasin%yllcorner))), ', ') + call message(' Provided (in precipitation file):') + call message('... rows: ', trim(adjustl(num2str(nrows2))), ', ') + call message('... cols: ', trim(adjustl(num2str(ncols2))), ', ') + call message('... cellsize: ', trim(adjustl(num2str(cellsize2))), ', ') + call message('... xllcorner:', trim(adjustl(num2str(xllcorner2))), ', ') + call message('... yllcorner:', trim(adjustl(num2str(yllcorner2))), ', ') + stop 1 end if - call append( basin%L2_Mask, RESHAPE( mask2, (/nrows2*ncols2/) ) ) - - ! free space - deallocate(mask0, mask2) - end subroutine L2_variable_init END MODULE mo_startup diff --git a/src/mHM/mo_temporal_disagg_forcing.f90 b/src/mHM/mo_temporal_disagg_forcing.f90 index 7f382305..439a794d 100644 --- a/src/mHM/mo_temporal_disagg_forcing.f90 +++ b/src/mHM/mo_temporal_disagg_forcing.f90 @@ -11,7 +11,7 @@ MODULE mo_temporal_disagg_forcing - USE mo_kind, ONLY: dp + USE mo_kind, ONLY : dp IMPLICIT NONE @@ -54,7 +54,7 @@ MODULE mo_temporal_disagg_forcing !> \param[in] "real(dp) :: fnight_prec" Daytime fraction of precipitation !> \param[in] "real(dp) :: fnight_pet" Daytime fraction of PET !> \param[in] "real(dp) :: fnight_temp" Daytime air temparture increase - + ! INTENT(INOUT) ! None @@ -100,56 +100,56 @@ MODULE mo_temporal_disagg_forcing ! also added the if loop around the temporal dissagg. step ! S. Thober, Jan 2017 --> added disaggregation based on weights given in nc file elemental pure subroutine temporal_disagg_forcing(isday, ntimesteps_day, prec_day, pet_day, temp_day, & - fday_prec, fday_pet, fday_temp, fnight_prec, fnight_pet, fnight_temp, temp_weights, & - pet_weights, pre_weights, read_meteo_weights, & - prec, pet, temp) + fday_prec, fday_pet, fday_temp, fnight_prec, fnight_pet, fnight_temp, temp_weights, & + pet_weights, pre_weights, read_meteo_weights, & + prec, pet, temp) implicit none ! Intent variables - logical, intent(in) :: isday ! is day or night - real(dp), intent(in) :: ntimesteps_day ! # of time steps per day - real(dp), intent(in) :: prec_day ! Daily mean precipitation [mm/s] - real(dp), intent(in) :: pet_day ! Daily mean ET [mm/s] - real(dp), intent(in) :: temp_day ! Daily mean air temperature [K] - real(dp), intent(in) :: fday_prec ! Daytime fraction of precipitation - real(dp), intent(in) :: fday_pet ! Daytime fraction of PET - real(dp), intent(in) :: fday_temp ! Daytime air temparture increase - real(dp), intent(in) :: fnight_prec ! Daytime fraction of precipitation - real(dp), intent(in) :: fnight_pet ! Daytime fraction of PET - real(dp), intent(in) :: fnight_temp ! Daytime air temparture increase - real(dp), intent(in) :: temp_weights ! weights for average temperature - real(dp), intent(in) :: pet_weights ! weights for PET - real(dp), intent(in) :: pre_weights ! weights for precipitation - logical, intent(in) :: read_meteo_weights ! flag indicating that weights should be used + logical, intent(in) :: isday ! is day or night + real(dp), intent(in) :: ntimesteps_day ! # of time steps per day + real(dp), intent(in) :: prec_day ! Daily mean precipitation [mm/s] + real(dp), intent(in) :: pet_day ! Daily mean ET [mm/s] + real(dp), intent(in) :: temp_day ! Daily mean air temperature [K] + real(dp), intent(in) :: fday_prec ! Daytime fraction of precipitation + real(dp), intent(in) :: fday_pet ! Daytime fraction of PET + real(dp), intent(in) :: fday_temp ! Daytime air temparture increase + real(dp), intent(in) :: fnight_prec ! Daytime fraction of precipitation + real(dp), intent(in) :: fnight_pet ! Daytime fraction of PET + real(dp), intent(in) :: fnight_temp ! Daytime air temparture increase + real(dp), intent(in) :: temp_weights ! weights for average temperature + real(dp), intent(in) :: pet_weights ! weights for PET + real(dp), intent(in) :: pre_weights ! weights for precipitation + logical, intent(in) :: read_meteo_weights ! flag indicating that weights should be used ! - real(dp), intent(out) :: prec ! actual precipitation [mm/s] - real(dp), intent(out) :: pet ! Reference ET [mm/s] - real(dp), intent(out) :: temp ! Air temperature [K] + real(dp), intent(out) :: prec ! actual precipitation [mm/s] + real(dp), intent(out) :: pet ! Reference ET [mm/s] + real(dp), intent(out) :: temp ! Air temperature [K] ! default vaule used if ntimesteps_day = 1 (i.e., e.g. daily values) - prec = prec_day - pet = pet_day - temp = temp_day + prec = prec_day + pet = pet_day + temp = temp_day if (read_meteo_weights) then - ! apply weights - pet = pet * pet_weights - temp = (temp + 273.15_dp) * temp_weights - 273.15 ! temperature weights are in K - prec = prec * pre_weights + ! apply weights + pet = pet * pet_weights + temp = (temp + 273.15_dp) * temp_weights - 273.15 ! temperature weights are in K + prec = prec * pre_weights else - ! Distribute Prec, PET and Temp into time steps night/day - if(ntimesteps_day .gt. 1.0_dp) then - if (isday) then ! DAY-TIME - prec = 2.0_dp * prec_day * fday_prec / ntimesteps_day - pet = 2.0_dp * pet_day * fday_pet / ntimesteps_day - temp = temp_day + fday_temp - else ! NIGHT-TIME - prec = 2.0_dp * prec_day * fnight_prec / ntimesteps_day - pet = 2.0_dp * pet_day * fnight_pet / ntimesteps_day - temp = temp_day + fnight_temp - end if - end if + ! Distribute Prec, PET and Temp into time steps night/day + if(ntimesteps_day .gt. 1.0_dp) then + if (isday) then ! DAY-TIME + prec = 2.0_dp * prec_day * fday_prec / ntimesteps_day + pet = 2.0_dp * pet_day * fday_pet / ntimesteps_day + temp = temp_day + fday_temp + else ! NIGHT-TIME + prec = 2.0_dp * prec_day * fnight_prec / ntimesteps_day + pet = 2.0_dp * pet_day * fnight_pet / ntimesteps_day + temp = temp_day + fnight_temp + end if + end if end if end subroutine temporal_disagg_forcing diff --git a/src/mHM/mo_upscaling_operators.f90 b/src/mHM/mo_upscaling_operators.f90 deleted file mode 100644 index a2faa471..00000000 --- a/src/mHM/mo_upscaling_operators.f90 +++ /dev/null @@ -1,590 +0,0 @@ -!> \file mo_upscaling_operators.f90 - -!> \brief Module containing upscaling operators. - -!> \details This module provides the routines for upscaling_operators. - -!> \authors Giovanni Dalmasso, Rohini Kumar -!> \date Dec 2012 - -module mo_upscaling_operators - - ! This module contains the functions for upscaling grid L0_fineScale_2D_data. - - ! Written Giovanni Dalmasso, Rohini Kumar, Dec 2012 - - use mo_kind, only: i4, dp - - implicit none - - private - - public :: majority_statistics ! upscale grid L0_fineScale_2D_data based on a majority statistics - public :: L0_fractionalCover_in_Lx ! fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11) - public :: upscale_arithmetic_mean ! upscale grid L0_fineScale_2D_data based on a ARITHMETIC MEAN - public :: upscale_harmonic_mean ! upscale grid L0_fineScale_2D_data based on a HARMONIC MEAN - public :: upscale_geometric_mean ! upscale grid L0_fineScale_2D_data based on a GEOMETRIC MEAN - -contains - - ! ---------------------------------------------------------------------------- - - ! NAME - ! majority_statistics - - !> \brief majority statistics - - !> \details upscale grid L0_fineScale_2D_data based on a majority statistics - - ! INTENT(IN) - !> \param[in] "integer(i4) :: nClass" number of classes - !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L0_fineScale_2D_data(:,:)" high resolution data - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - !> \return integer(i4) :: majority_statistics(:) — Upscaled variable based on majority. - - ! RESTRICTIONS - !> \note Input values must be floating points. - - ! EXAMPLE - ! calling sequence - ! variable = majority_statistics( nClass, & - ! L1_upper_rowId_cell, & - ! L1_lower_rowId_cell, & - ! L1_left_colonId_cell, & - ! L1_right_colonId_cell, & - ! L0_fineScale_2D_data, & - ! ) - ! - ! LITERATURE - ! None - - ! HISTORY - !> \author Giovanni Dalmasso, Rohini Kumar - !> \date Dec 2012 - ! Written, Giovanni Dalmasso, Dec 2012 - - function majority_statistics( nClass, & ! number of classes - L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell - L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell - L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell - L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell - L0_fineScale_2D_data & ! high resolution data - ) - - implicit none - ! input - integer(i4), intent(in) :: nClass - integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell - integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell - integer(i4), dimension(:, :), intent(in) :: L0_fineScale_2D_data - ! output - integer(i4), dimension( size(L1_upper_rowId_cell,1) ) :: majority_statistics - - ! local variables - integer(i4) :: L1_nCells - integer(i4) :: iu, id, jl, jr - integer(i4) :: nC - integer(i4) :: max_val - integer(i4) :: kk, ll - - L1_nCells = size(majority_statistics,1) - - do kk = 1, L1_nCells - iu = L1_upper_rowId_cell(kk) - id = L1_lower_rowId_cell(kk) - jl = L1_left_colonId_cell(kk) - jr = L1_right_colonId_cell(kk) - - max_val = -9999 - do ll = 1, nClass - nC = count(L0_fineScale_2D_data(iu:id, jl:jr) == ll) - if(nC > max_val) then - majority_statistics(kk) = ll - max_val = nC - end if - end do - end do - - end function majority_statistics - - ! ------------------------------------------------------------------ - - ! NAME - ! L0_fractionalCover_in_Lx - - !> \brief fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11) - - !> \details Fractional coverage of a given class of L0 fields in Lx field (Lx = L1 or L11). - !> For example, this routine can be used for calculating the karstic fraction. - - ! INTENT(IN) - !> \param[in] "integer(i4), dimension(:,:) :: dataIn0" input fields at finer scale - !> \param[in] "integer(i4) :: classId" class id for which fraction has to be estimated - !> \param[in] "logical, dimension(:,:) :: mask0" finer scale L0 mask - !> \param[in] "integer(i4), dimension(:) :: L0upBound_inLx" row start at finer L0 scale - !> \param[in] "integer(i4), dimension(:) :: L0downBound_inLx" row end at finer L0 scale - !> \param[in] "integer(i4), dimension(:) :: L0leftBound_inLx" col start at finer L0 scale - !> \param[in] "integer(i4), dimension(:) :: L0rightBound_inLx" col end at finer L0 scale - !> \param[in] "integer(i4), dimension(:) :: nTCells0_inLx" total number of valid L0 cells in a given Lx cell - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - !> \return real(dp) :: L0_fractionalCover_in_Lx(:) — packed 1D fraction coverage (Lx) of given class id - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Rohini Kumar - !> \date Feb 2013 - - ! ------------------------------------------------------------------ - - function L0_fractionalCover_in_Lx( & - dataIn0, & ! input fields at finer scale - classId, & ! class id for which fraction has to be estimated - mask0, & ! finer scale L0 mask - L0upBound_inLx, & ! row start at finer L0 scale - L0downBound_inLx, & ! row end at finer L0 scale - L0leftBound_inLx, & ! col start at finer L0 scale - L0rightBound_inLx, & ! col end at finer L0 scale - nTCells0_inLx & ! total number of valid L0 cells in a given Lx cell - ) result(frac_cover_Lx) ! packed 1D data at coarser scale (Lx = L1 or L11) - - use mo_mhm_constants, only: nodata_i4 - - implicit none - - ! input - integer(i4),dimension(:), intent(in) :: dataIn0 - integer(i4), intent(in) :: classId - logical, dimension(:,:), intent(in) :: mask0 - integer(i4), dimension(:), intent(in) :: L0upBound_inLx - integer(i4), dimension(:), intent(in) :: L0downBound_inLx - integer(i4), dimension(:), intent(in) :: L0leftBound_inLx - integer(i4), dimension(:), intent(in) :: L0rightBound_inLx - integer(i4), dimension(:), intent(in) :: nTCells0_inLx - - ! return - real(dp), dimension( size(L0upBound_inLx,1) ) :: frac_cover_Lx - - ! local variables - integer(i4) :: kk, iu, id, jl, jr, nT - integer(i4) :: nrows0, ncols0 - integer(i4), dimension(:,:), allocatable :: dummy_Matrix - integer(i4), dimension(:,:), allocatable :: nodata_val - integer(i4) :: nCells1 - - ! estimate number of cells - nCells1 = size(L0upBound_inLx,1) - - ! get nrows and ncols - nrows0 = size(mask0,1) - ncols0 = size(mask0,2) - - !unpack input data from 1D to 2D - allocate( dummy_Matrix(nrows0, ncols0) ) - allocate( nodata_val(nrows0, ncols0) ) - nodata_val(:,:) = nodata_i4 - dummy_Matrix(:,:) = unpack( dataIn0(:), mask0(:,:), nodata_val(:,:) ) - - ! initalize return variable - frac_cover_Lx(:) = 0.0_dp - - ! start calculation - do kk = 1, nCells1 - iu = L0upBound_inLx(kk) - id = L0downBound_inLx(kk) - jl = L0leftBound_inLx(kk) - jr = L0rightBound_inLx(kk) - nT = nTCells0_inLx(kk) - - frac_cover_Lx(kk) = real( count(dummy_Matrix(iu:id, jl:jr) == classId), dp ) / real(nT, dp) - - end do - - ! free space - deallocate(dummy_Matrix, nodata_val) - - end function L0_fractionalCover_in_Lx - - ! ---------------------------------------------------------------------------- - - ! NAME - ! upscale_arithmetic_mean - - !> \brief aritmetic mean - - !> \details upscaling of level-0 grid data to level-1 using aritmetic mean - - ! INTENT(IN) - !> \param[in] "integer(i4) :: nL0_cells_in_L1_cell(:)" number of level-0 cells within a level-1 cell - !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L0_cellId(:,:)" cell ID at level-0 - !> \param[in] "logical :: mask0(:,:)" mask at Level 0 - !> \param[in] "real(dp) :: nodata_value" no data value - !> \param[in] "real(dp) :: L0_fineScale_data(:,:)" high resolution data - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - !> \return real(dp) :: upscale_arithmetic_mean(:) — Upscaled variable from L0 to L1 using arithmetic mean - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! variable = upscale_arithmetic_mean( nL0_cells_in_L1_cell, & - ! L1_upper_rowId_cell, L1_lower_rowId_cell, & - ! L1_left_colonId_cell, L1_right_colonId_cell, & - ! L0_cellId, mask0, & - ! nodata_value, L0_fineScale_2D_data & - ! ) - - ! LITERATURE - ! None - - ! HISTORY - !> \author Giovanni Dalmasso, Rohini Kumar - !> \date Dec 2012 - ! Written, Giovanni Dalmasso, Dec 2012 - ! Modified, Stephan Thober, Feb 2013 - changed dimension of L0 input from 2d to 1d - - function upscale_arithmetic_mean( & - nL0_cells_in_L1_cell, & ! number of level-0 cells within a level-1 cell - L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell - L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell - L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell - L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell - L0_cellId, & ! cell ID at level-0 - mask0, & ! mask at level 0 - nodata_value, & ! no data value - L0_fineScale_data & ! high resolution data - ) - - implicit none - ! input - integer(i4), dimension(:), intent(in) :: nL0_cells_in_L1_cell - integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell - integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell - integer(i4), dimension(:), intent(in) :: L0_cellId - logical, dimension(:,:), intent(in) :: mask0 - real(dp), intent(in) :: nodata_value - real(dp), dimension(:), intent(in) :: L0_fineScale_data - ! output - real(dp), dimension( size(nL0_cells_in_L1_cell,1) ) :: upscale_arithmetic_mean - - ! local variables - integer(i4) :: L1_nCells - integer(i4) :: iu, id, jl, jr - integer(i4) :: kk - integer(i4), dimension(size(mask0,1),size(mask0,2)) :: nodata_2d - integer(i4), dimension(size(mask0,1),size(mask0,2)) :: L0_cellId_2d - real(dp), dimension(size(mask0,1),size(mask0,2)) :: L0_fineScale_2D_data - - ! allocation and initialisation - upscale_arithmetic_mean(:) = 0.0_dp - nodata_2d = int(nodata_value, i4) - L0_cellId_2d = unpack( L0_cellId, mask0, nodata_2d ) - L0_fineScale_2D_data = unpack( L0_fineScale_data, mask0, nodata_value ) - - L1_nCells = size(upscale_arithmetic_mean,1) - - do kk = 1, L1_nCells - iu = L1_upper_rowId_cell(kk) - id = L1_lower_rowId_cell(kk) - jl = L1_left_colonId_cell(kk) - jr = L1_right_colonId_cell(kk) - upscale_arithmetic_mean(kk) = sum( L0_fineScale_2D_data(iu:id, jl:jr), L0_cellId_2d(iu:id, jl:jr) /= & - int(nodata_value,i4) ) / real( nL0_cells_in_L1_cell(kk), dp) - end do - - end function upscale_arithmetic_mean - - ! ---------------------------------------------------------------------------- - - ! NAME - ! upscale_harmonic_mean - - !> \brief harmonic mean - - !> \details upscaling of level-0 grid data to level-1 using harmonic mean - - ! INTENT(IN) - !> \param[in] "integer(i4) :: nL0_cells_in_L1_cell(:)" number of level-0 cells within a level-1 cell - !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L0_cellId(:,:)" cell ID at level-0 - !> \param[in] "logical :: mask0(:,:)" mask at Level 0 - !> \param[in] "real(dp) :: nodata_value" no data value - !> \param[in] "real(dp) :: L0_fineScale_2D_data(:,:)" high resolution data - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - !> \return real(dp) :: upscale_harmonic_mean(:) — Upscaled variable from L0 to L1 using harmonic mean - - ! RESTRICTIONS - !> \note Input values must be floating points. - - ! EXAMPLE - ! calling sequence - ! variable = upscale_harmonic_mean( nL0_cells_in_L1_cell, & - ! L1_upper_rowId_cell, L1_lower_rowId_cell, & - ! L1_left_colonId_cell, L1_right_colonId_cell, & - ! L0_cellId, mask0, & - ! nodata_value, L0_fineScale_2D_data & - ! ) - - ! LITERATURE - ! None - - ! HISTORY - !> \author Giovanni Dalmasso, Rohini Kumar - !> \date Dec 2012 - ! Written, Giovanni Dalmasso, Dec 2012 - ! Modified, Stephan Thober, Jan 2013 - change example calling sequence - ! Stephan Thober, Feb 2013 - added Level 0 mask - - function upscale_harmonic_mean( & - nL0_cells_in_L1_cell, & ! number of level-0 cells within a level-1 cell - L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell - L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell - L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell - L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell - L0_cellId, & ! cell ID at level-0 - mask0, & ! mask at Level 0 - nodata_value, & ! no data value - L0_fineScale_data & ! high resolution data - ) - - implicit none - - ! input - integer(i4), dimension(:), intent(in) :: nL0_cells_in_L1_cell - integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell - integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell - integer(i4), dimension(:), intent(in) :: L0_cellId - logical, dimension(:,:), intent(in) :: mask0 - real(dp), intent(in) :: nodata_value - real(dp), dimension(:), intent(in) :: L0_fineScale_data - ! output - real(dp), dimension( size(nL0_cells_in_L1_cell,1) ) :: upscale_harmonic_mean - - ! local variables - integer(i4) :: L1_nCells - integer(i4) :: iu, id, jl, jr - integer(i4) :: kk - integer(i4), dimension(size(mask0,1),size(mask0,2)) :: nodata_2d - integer(i4), dimension(size(mask0,1),size(mask0,2)) :: L0_cellId_2d - real(dp), dimension(size(mask0,1),size(mask0,2)) :: L0_fineScale_2D_data - - ! allocation and initialisation - upscale_harmonic_mean(:) = 0.0_dp - nodata_2d = int(nodata_value, i4) - L0_cellId_2d = unpack( L0_cellId, mask0, nodata_2d ) - L0_fineScale_2D_data = unpack( L0_fineScale_data, mask0, nodata_value ) - - L1_nCells = size(upscale_harmonic_mean,1) - - do kk = 1, L1_nCells - iu = L1_upper_rowId_cell(kk) - id = L1_lower_rowId_cell(kk) - jl = L1_left_colonId_cell(kk) - jr = L1_right_colonId_cell(kk) - upscale_harmonic_mean(kk) = real( nL0_cells_in_L1_cell(kk), dp ) & - / sum( 1.0_dp/L0_fineScale_2D_data(iu:id, jl:jr), L0_cellId_2d(iu:id, jl:jr) /= int(nodata_value,i4) ) - end do - - end function upscale_harmonic_mean - - ! ---------------------------------------------------------------------------- - - ! NAME - ! upscale_geometric_mean - - !> \brief geometric mean - - !> \details upscaling of level-0 grid data to level-1 using geometric mean - - ! INTENT(IN) - !> \param[in] "integer(i4) :: L1_upper_rowId_cell(:)" upper row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_lower_rowId_cell(:)" lower row boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_left_colonId_cell(:)" left colon boundary (level-0) of a level-1 cell - !> \param[in] "integer(i4) :: L1_right_colonId_cell(:)" right colon boundary (level-0) of a level-1 cell - !> \param[in] "logical :: mask0(:,:)" mask at Level 0 - !> \param[in] "real(dp) :: nodata_value" no data value - - ! INTENT(INOUT) - !> \param[in,out] real(dp) :: L0_fineScale_2D_data(:,:) high resolution data - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - !> \return real(dp) :: upscale_geometric_mean(:) — Upscaled variable from L0 to L1 using geometric mean - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! calling sequence - ! variable = upscale_geometric_mean( L1_upper_rowId_cell, L1_lower_rowId_cell, & - ! L1_left_colonId_cell, L1_right_colonId_cell, & - ! mask0, nodata_value, L0_fineScale_2D_data & - ! ) - - ! LITERATURE - ! None - - ! HISTORY - !> \author Giovanni Dalmasso, Rohini Kumar - !> \date Dec 2012 - ! Written, Giovanni Dalmasso, Dec 2012 - ! Modified, Rohini Kumar, Jun 2016 - fixed bug - - function upscale_geometric_mean( & - L1_upper_rowId_cell, & ! upper row boundary (level-0) of a level-1 cell - L1_lower_rowId_cell, & ! lower row boundary (level-0) of a level-1 cell - L1_left_colonId_cell, & ! left colon boundary (level-0) of a level-1 cell - L1_right_colonId_cell, & ! right colon boundary (level-0) of a level-1 cell - mask0, & ! mask at level 0 - nodata_value, & ! no data value - L0_fineScale_data & ! high resolution data - ) - use mo_utils, only: ne - implicit none - - ! input - integer(i4), dimension(:), intent(in) :: L1_upper_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_lower_rowId_cell - integer(i4), dimension(:), intent(in) :: L1_left_colonId_cell - integer(i4), dimension(:), intent(in) :: L1_right_colonId_cell - logical, dimension(:,:), intent(in) :: mask0 - real(dp), intent(in) :: nodata_value - real(dp), dimension(:), intent(in) :: L0_fineScale_data - ! output - real(dp), dimension( size(L1_upper_rowId_cell,1) ) :: upscale_geometric_mean - - ! loca variables - integer(i4) :: iu, id, jl, jr - integer(i4) :: kk - integer(i4) :: nCells_L0_in_L1 - real(dp), dimension(size(mask0,1),size(mask0,2)) :: L0_fineScale_2D_data - real(dp), dimension(size(mask0,1),size(mask0,2)) :: nodata_2d - real(dp), dimension(:), allocatable :: dummy_V - - ! allocation and initialisation - upscale_geometric_mean(:) = nodata_value - nodata_2d = nodata_value - L0_fineScale_2D_data = unpack( L0_fineScale_data, mask0, nodata_2d ) - - do kk = 1, size(upscale_geometric_mean,1) - iu = L1_upper_rowId_cell(kk) - id = L1_lower_rowId_cell(kk) - jl = L1_left_colonId_cell(kk) - jr = L1_right_colonId_cell(kk) - nCells_L0_in_L1 = count( NE(L0_fineScale_2D_data(iu:id, jl:jr), nodata_value) ) - allocate( dummy_V(nCells_L0_in_L1) ) - dummy_V(:) = PACK( L0_fineScale_2D_data(iu:id,jl:jr), MASK=(NE(L0_fineScale_2D_data(iu:id,jl:jr), nodata_value)) ) - upscale_geometric_mean(kk) = PRODUCT( dummy_V(:) ) - if( NE(upscale_geometric_mean(kk), 0.0_dp) ) then - upscale_geometric_mean(kk) = upscale_geometric_mean(kk)**(1.0_dp/real(nCells_L0_in_L1,dp)) - else - upscale_geometric_mean(kk) = 0.0_dp - end if - deallocate(dummy_V) - !! - end do - - - end function upscale_geometric_mean - - -end module mo_upscaling_operators diff --git a/src/mHM/mo_write_ascii.f90 b/src/mHM/mo_write_ascii.f90 index 096ac9ff..ee255937 100644 --- a/src/mHM/mo_write_ascii.f90 +++ b/src/mHM/mo_write_ascii.f90 @@ -25,7 +25,7 @@ MODULE mo_write_ascii ! Modified, Rohini Kumar, Jun 2014 - bug fixed: writing of max and min value of discharge ! Modified, Stephan Thober, Aug 2015 - moved write_daily_obs_sim_discharge to mRM - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE PUBLIC :: write_configfile ! Writes configuration file @@ -88,58 +88,62 @@ MODULE mo_write_ascii Subroutine write_configfile() - use mo_kind, only: i4, dp - use mo_mhm_constants, only: nodata_dp - use mo_message, only: message - use mo_string_utils, only: num2str - USE mo_file, only: file_config, uconfig, version - use mo_global_variables, only: & - nBasins, & - basin, & - iFlag_cordinate_sys, & - L0_nCells, & - L1_nCells, & - timeStep, & - resolutionHydrology, & - read_restart, & - write_restart, & - dirConfigOut, & - dirMorpho, & - dirLCover, & - dirPrecipitation, & - dirTemperature, & - dirReferenceET, & - dirOut, & - dirRestartOut, & - warmPer, & - evalPer, & - SimPer, & - LCyearId, & - LCfilename - use mo_common_variables, only: & - processMatrix, & - global_parameters, & - global_parameters_name + use mo_kind, only : i4 + use mo_message, only : message + use mo_string_utils, only : num2str + USE mo_common_file, only : file_config, uconfig + USE mo_file, only : version + use mo_global_variables, only : & + dirPrecipitation, & + dirTemperature, & + dirReferenceET + use mo_common_mHM_mRM_variables, only : & + read_restart, & + LCyearId, & + warmPer, & + evalPer, & + SimPer, & + timeStep + use mo_common_variables, only : & + write_restart, & + dirRestartOut, & + level0, & + level1, & + iFlag_cordinate_sys, & + LCfilename, & + nLCoverScene, & + LC_year_start, & + LC_year_end, & + L0_Basin, & + nBasins, & + resolutionHydrology, & + global_parameters, & + global_parameters_name, & + dirMorpho, & + dirLCover, & + dirConfigOut, & + dirOut #ifdef MRM2MHM - use mo_mrm_global_variables, only: & - basin_mrm, & - gauge, & - InflowGauge, & - L11_nCells, & - L11_netPerm, & - L11_fromN, & - L11_toN, & - L11_rOrder, & - L11_label, & - L11_length, & - L11_slope, & - L11_ID, & - L1_L11_ID, & - L1_areaCell, & - nGaugesTotal, & - nInflowGaugesTotal, & - resolutionRouting, & - dirGauges + use mo_mrm_global_variables, only : & + level11, & + gauge, & + InflowGauge, & + L11_netPerm, & + L11_fromN, & + L11_toN, & + L11_rOrder, & + L11_label, & + L11_length, & + L11_slope, & + L1_L11_ID, & + nGaugesTotal, & + nInflowGaugesTotal, & + dirGauges + use mo_common_mHM_mRM_variables, only : & + resolutionRouting + use mo_common_constants, only : nodata_dp + use mo_common_variables, only : processMatrix + #endif @@ -147,21 +151,21 @@ Subroutine write_configfile() ! ! local ! - character(256) :: fName - integer(i4) :: i, j, n - integer(i4) :: err + character(256) :: fName + integer(i4) :: i, j, n + integer(i4) :: err - fName= trim(adjustl(dirConfigOut))//trim(adjustl(file_config)) + fName = trim(adjustl(dirConfigOut)) // trim(adjustl(file_config)) call message() call message(' Log-file written to ', trim(fName)) - open(uconfig, file=fName, status='unknown', action='write', iostat=err) + open(uconfig, file = fName, status = 'unknown', action = 'write', iostat = err) if (err .ne. 0) then - call message(' Problems while creating File' ) - call message(' Error-Code', num2str(err) ) - stop + call message(' Problems while creating File') + call message(' Error-Code', num2str(err)) + stop end if write(uconfig, 200) - write(uconfig, 100) 'mHM-UFZ v-'//trim(version) + write(uconfig, 100) 'mHM-UFZ v-' // trim(version) write(uconfig, 100) 'L. Samaniego & R. Kumar, UFZ' write(uconfig, 200) write(uconfig, 100) @@ -169,36 +173,42 @@ Subroutine write_configfile() write(uconfig, 100) write(uconfig, 103) 'Number of basins ', nBasins #ifdef MRM2MHM - write(uconfig, 103) 'Total No. of nodes ', L11_nCells - write(uconfig, 103) 'Total No. of reaches ', L11_nCells-1 + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 103) 'Total No. of gauges ', nGaugesTotal + end if #endif - write(uconfig, 103) 'No. of cells L0 ', L0_nCells - write(uconfig, 103) 'No. of cells L1 ', L1_nCells + write(uconfig, 103) 'Time Step [h] ', timeStep + do i = 1, nBasins + write(uconfig, 103) 'Basin ', i, 'No. of cells L0 ', level0(L0_Basin(i))%nCells + write(uconfig, 103) 'Basin ', i, 'No. of cells L1 ', level1(i)%nCells #ifdef MRM2MHM - if ( processMatrix(8,1) .ne. 0 ) then - write(uconfig, 103) 'No. of cells L11 ', L11_nCells - write(uconfig, 103) 'Total No. of gauges ', nGaugesTotal + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 103) 'Total No. of nodes ', level11(i)%nCells + write(uconfig, 103) 'Total No. of reaches ', level11(i)%nCells - 1 + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 103) 'No. of cells L11 ', level11(i)%nCells + write(uconfig, 103) 'Total No. of gauges ', nGaugesTotal + end if end if #endif - write(uconfig, 103) 'Time Step [h] ', timeStep - do i=1, nBasins - select case (iFlag_cordinate_sys) - case (0) - write(uconfig, 301) 'Basin ',i, ' Hydrology Resolution [m] ', resolutionHydrology(i) + + select case (iFlag_cordinate_sys) + case (0) + write(uconfig, 301) 'Basin ', i, ' Hydrology Resolution [m] ', resolutionHydrology(i) #ifdef MRM2MHM - if ( processMatrix(8,1) .ne. 0 ) then - write(uconfig, 301) 'Basin ',i, ' Routing Resolution [m] ', resolutionRouting(i) - end if + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 301) 'Basin ', i, ' Routing Resolution [m] ', resolutionRouting(i) + end if #endif case(1) - write(uconfig, 302) 'Basin ',i, ' Hydrology Resolution [o] ', resolutionHydrology(i) + write(uconfig, 302) 'Basin ', i, ' Hydrology Resolution [o] ', resolutionHydrology(i) #ifdef MRM2MHM - if ( processMatrix(8,1) .ne. 0 ) then - write(uconfig, 302) 'Basin ',i, ' Routing Resolution [o] ', resolutionRouting(i) - end if + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 302) 'Basin ', i, ' Routing Resolution [o] ', resolutionRouting(i) + end if #endif - end select + end select end do write(uconfig, 126) 'Flag READ restart ', read_restart write(uconfig, 126) 'Flag WRITE restart ', write_restart @@ -207,108 +217,108 @@ Subroutine write_configfile() ! Model Run period !****************** do j = 1, nBasins - write(uconfig, 115) ' Model Run Periods for Basin ', num2str(j) - write(uconfig, 116) & - 'From To', & - ' Day Month Year Day Month Year' - write(uconfig,117) & - 'Warming Period (1) ',& - warmPer(j)%dStart, warmPer(j)%mStart, warmPer(j)%yStart ,& - warmPer(j)%dEnd , warmPer(j)%mEnd , warmPer(j)%yEnd ,& - 'Evaluation Period (2) ',& - evalPer(j)%dStart ,evalPer(j)%mStart , evalPer(j)%yStart ,& - evalPer(j)%dEnd ,evalPer(j)%mEnd , evalPer(j)%yEnd ,& - 'Simulation Period (1)+(2) ',& - SimPer(j)%dStart , SimPer(j)%mStart , SimPer(j)%yStart ,& - SimPer(j)%dEnd , SimPer(j)%mEnd , SimPer(j)%yEnd + write(uconfig, 115) ' Model Run Periods for Basin ', num2str(j) + write(uconfig, 116) & + 'From To', & + ' Day Month Year Day Month Year' + write(uconfig, 117) & + 'Warming Period (1) ', & + warmPer(j)%dStart, warmPer(j)%mStart, warmPer(j)%yStart, & + warmPer(j)%dEnd, warmPer(j)%mEnd, warmPer(j)%yEnd, & + 'Evaluation Period (2) ', & + evalPer(j)%dStart, evalPer(j)%mStart, evalPer(j)%yStart, & + evalPer(j)%dEnd, evalPer(j)%mEnd, evalPer(j)%yEnd, & + 'Simulation Period (1)+(2) ', & + SimPer(j)%dStart, SimPer(j)%mStart, SimPer(j)%yStart, & + SimPer(j)%dEnd, SimPer(j)%mEnd, SimPer(j)%yEnd end do !********************************* ! Model Land Cover Observations !********************************* do j = 1, nBasins - write(uconfig,118) ' Land Cover Observations for Basin ', num2str(i) - write(uconfig,119) ' Year', ' Land cover scene', 'Land Cover File' - do i=1,SimPer(j)%yEnd-SimPer(j)%yStart+1 - write(uconfig,120) i+SimPer(j)%yStart-1, LCyearId(i+SimPer(j)%yStart-1, j), & - trim(LCfilename(LCyearId(i+SimPer(j)%yStart-1, j))) - end do + write(uconfig, 118) ' Land Cover Observations for Basin ', num2str(i) + write(uconfig, 119) ' Start Year', ' End Year', ' Land cover scene', 'Land Cover File' + do i = 1, nLCoverScene + write(uconfig, 120) LC_year_start(i), LC_year_end(i), & + LCyearId(max(evalPer(j)%yStart, LC_year_start(i)), j), trim(LCfilename(i)) + end do end do !********************************* ! Initial Parameter Ranges !********************************* - write(uconfig,121) ' Initial Transfer Function Parameter Ranges (gammas) ' + write(uconfig, 121) ' Initial Transfer Function Parameter Ranges (gammas) ' ! ! Transfer functions - write(uconfig,122) & - ' i', ' min', ' max', ' current', & - ' name' - do i=1, size(global_parameters,1) - write(uconfig,123) & - i, global_parameters(i,1), global_parameters(i,2), global_parameters(i,3), & - trim(adjustl(global_parameters_name(i))) + write(uconfig, 122) & + ' i', ' min', ' max', ' current', & + ' name' + do i = 1, size(global_parameters, 1) + write(uconfig, 123) & + i, global_parameters(i, 1), global_parameters(i, 2), global_parameters(i, 3), & + trim(adjustl(global_parameters_name(i))) end do #ifdef MRM2MHM ! basin runoff data - if ( processMatrix(8,1) .ne. 0 ) then - write(uconfig, 202) ' Basin Runoff Data ' - write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' - do i=1, nGaugesTotal - if( any(gauge%Q(:,i) > nodata_dp) ) then - write(uconfig,108) i, gauge%basinId(i), maxval(gauge%Q(:,i), gauge%Q(:,i) > nodata_dp), & - minval(gauge%Q(:,i), gauge%Q(:,i) > nodata_dp) - else - write(uconfig,108) i, gauge%basinId(i), nodata_dp, nodata_dp - end if - end do + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 202) ' Basin Runoff Data ' + write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' + do i = 1, nGaugesTotal + if(any(gauge%Q(:, i) > nodata_dp)) then + write(uconfig, 108) i, gauge%basinId(i), maxval(gauge%Q(:, i), gauge%Q(:, i) > nodata_dp), & + minval(gauge%Q(:, i), gauge%Q(:, i) > nodata_dp) + else + write(uconfig, 108) i, gauge%basinId(i), nodata_dp, nodata_dp + end if + end do end if ! inflow gauge data - if ( nInflowGaugesTotal .GT. 0 ) then - write(uconfig, 202) ' Basin Inflow Data ' - write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' - do i=1, nInflowGaugesTotal - if( all(InflowGauge%Q(:,i) > nodata_dp) ) then - write(uconfig,108) i, InflowGauge%basinId(i), maxval(InflowGauge%Q(:,i), InflowGauge%Q(:,i) > nodata_dp), & - minval(InflowGauge%Q(:,i), InflowGauge%Q(:,i) > nodata_dp) - else - write(uconfig,108) i, InflowGauge%basinId(i), nodata_dp, nodata_dp - end if - end do + if (nInflowGaugesTotal .GT. 0) then + write(uconfig, 202) ' Basin Inflow Data ' + write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' + do i = 1, nInflowGaugesTotal + if(all(InflowGauge%Q(:, i) > nodata_dp)) then + write(uconfig, 108) i, InflowGauge%basinId(i), maxval(InflowGauge%Q(:, i), InflowGauge%Q(:, i) > nodata_dp), & + minval(InflowGauge%Q(:, i), InflowGauge%Q(:, i) > nodata_dp) + else + write(uconfig, 108) i, InflowGauge%basinId(i), nodata_dp, nodata_dp + end if + end do end if #endif ! basin config - write(uconfig,218) 'Basin-wise Configuration' - do n=1,nBasins - !ST has to be moved to the config write of mRM - ! if ( processMatrix(8,1) .ne. 0 ) then - ! write(uconfig,103) 'Basin No. ', n, & - ! 'No. of gauges ', basin%nGauges(n) - ! end if - - write(uconfig, 222) 'Directory list' - - write(uconfig, 224) 'Directory to morphological input ', dirMorpho(n) - write(uconfig, 224) 'Directory to land cover input ', dirLCover(n) + write(uconfig, 218) 'Basin-wise Configuration' + do n = 1, nBasins + !ST has to be moved to the config write of mRM + ! if ( processMatrix(8,1) .ne. 0 ) then + ! write(uconfig,103) 'Basin No. ', n, & + ! 'No. of gauges ', basin%nGauges(n) + ! end if + + write(uconfig, 222) 'Directory list' + + write(uconfig, 224) 'Directory to morphological input ', dirMorpho(n) + write(uconfig, 224) 'Directory to land cover input ', dirLCover(n) #ifdef MRM2MHM - if ( processMatrix(8,1) .ne. 0 ) then - write(uconfig, 224) 'Directory to gauging station input ', dirGauges(n) - end if + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 224) 'Directory to gauging station input ', dirGauges(n) + end if #endif - write(uconfig, 224) 'Directory to precipitation input ', dirPrecipitation(n) - write(uconfig, 224) 'Directory to temperature input ', dirTemperature(n) - write(uconfig, 224) 'Directory to reference ET input ', dirReferenceET(n) - write(uconfig, 224) 'Directory to write output by default ', dirOut(n) - write(uconfig, 224) 'Directory to write output when restarted ', dirRestartOut(n) + write(uconfig, 224) 'Directory to precipitation input ', dirPrecipitation(n) + write(uconfig, 224) 'Directory to temperature input ', dirTemperature(n) + write(uconfig, 224) 'Directory to reference ET input ', dirReferenceET(n) + write(uconfig, 224) 'Directory to write output by default ', dirOut(n) + write(uconfig, 224) 'Directory to write output when restarted ', dirRestartOut(n) #ifdef MRM2MHM - if ( processMatrix(8,1) .ne. 0 ) then - write(uconfig, 102) 'River Network (Routing level)' - write(uconfig, 100) 'Label 0 = intermediate draining cell ' - write(uconfig, 100) 'Label 1 = headwater cell ' - write(uconfig, 100) 'Label 2 = sink cell ' - - if (processMatrix(8, 1) .eq. 1_i4) then - write(uconfig, 104) ' Overall', & + if (processMatrix(8, 1) .ne. 0) then + write(uconfig, 102) 'River Network (Routing level)' + write(uconfig, 100) 'Label 0 = intermediate draining cell ' + write(uconfig, 100) 'Label 1 = headwater cell ' + write(uconfig, 100) 'Label 2 = sink cell ' + + if (processMatrix(8, 1) .eq. 1_i4) then + write(uconfig, 104) ' Overall', & ' From', & ' To', & ' Routing', & @@ -322,23 +332,23 @@ Subroutine write_configfile() ' ', & ' ', & ' Slope' - ! - write(uconfig, 105) ' Id', & + ! + write(uconfig, 105) ' Id', & ' Node', & ' Node', & '', & - '', & + '', & ' [km]', & ' [o/oo]' - ! - do j=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n)-1 - i=L11_netPerm(j) + basin_mrm%L11_iStart(n) - 1 ! adjust permutation for multi-basin option - write(uconfig,106) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i), & - L11_length(i)/1000.0_dp, L11_slope(i)*1.0e3_dp - end do - - else if (processMatrix(8, 1) .eq. 2_i4) then - write(uconfig, 134) ' Overall', & + ! + do j = level11(n)%iStart, level11(n)%iEnd - 1 + i = L11_netPerm(j) + level11(n)%iStart - 1 ! adjust permutation for multi-basin option + write(uconfig, 106) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i), & + L11_length(i) / 1000.0_dp, L11_slope(i) * 1.0e3_dp + end do + + else if (processMatrix(8, 1) .eq. 2_i4) then + write(uconfig, 134) ' Overall', & ' From', & ' To', & ' Routing', & @@ -348,88 +358,88 @@ Subroutine write_configfile() ' Routing', & ' Sequence', & ' ' - ! - write(uconfig, 135) ' Id', & + ! + write(uconfig, 135) ' Id', & ' Node', & ' Node', & '', & '' - ! - do j=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n)-1 - i=L11_netPerm(j) + basin_mrm%L11_iStart(n) - 1 ! adjust permutation for multi-basin option - write(uconfig,136) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i) - end do - end if - ! draining node at L11 - write(uconfig, 109) ' Overall', ' Basin', & - ' Cell', ' Routing', & - ' Id', ' Node Id' - do i=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n) - write(uconfig, 110) i, L11_Id(i) - end do - - ! L1 level information - write(uconfig, 111) ' Modeling', ' Routing', ' Effective', & - ' Cell', ' Cell Id', ' Area', & - ' Id', ' [-]', ' [km2]' - - do i=basin%L1_iStart(n), basin%L1_iEnd(n) - write(uconfig,113) i, L1_L11_Id(i), L1_areaCell(i) + ! + do j = level11(n)%iStart, level11(n)%iEnd - 1 + i = L11_netPerm(j) + level11(n)%iStart - 1 ! adjust permutation for multi-basin option + write(uconfig, 136) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i) end do - write(uconfig,114) ' Total[km2]', sum(L1_areaCell(basin%L1_iStart(n): basin%L1_iEnd(n))) - end if + end if + ! draining node at L11 + write(uconfig, 109) ' Overall', ' Basin', & + ' Cell', ' Routing', & + ' Id', ' Node Id' + do i = 1, level11(n)%nCells + write(uconfig, 110) i + end do + + ! L1 level information + write(uconfig, 111) ' Modeling', ' Routing', ' Effective', & + ' Cell', ' Cell Id', ' Area', & + ' Id', ' [-]', ' [km2]' + + do i = 1, level1(n)%nCells + write(uconfig, 113) i, L1_L11_Id(i), level1(n)%CellArea(i) * 1.0E-6_dp + end do + write(uconfig, 114) ' Total[km2]', sum(level1(n)%CellArea) * 1.0E-6_dp + end if #endif ! end do - write(uconfig,*) + write(uconfig, *) close(uconfig) !! Formats -100 format (a80) -102 format (/ 30('-') / a30 / 30('-') ) -103 format (a20, 10x, i10) -104 format (/ 75('-') / 5a10, 5x, 2a10 / 5a10, 5x, 2a10) -105 format (5a10, 5x, 2a10 / 75('-')) -106 format (5i10, 5x, 2f10.3 ) -107 format (2a10, 2a15) -108 format (2i10, 2f15.3) + 100 format (a80) + 102 format (/ 30('-') / a30 / 30('-')) + 103 format (a20, 10x, i10) + 104 format (/ 75('-') / 5a10, 5x, 2a10 / 5a10, 5x, 2a10) + 105 format (5a10, 5x, 2a10 / 75('-')) + 106 format (5i10, 5x, 2f10.3) + 107 format (2a10, 2a15) + 108 format (2i10, 2f15.3) ! -109 format (/ 20('-') / 2a10 / 2a10 / 2a10 / 20('-') ) -110 format ( 2i10 ) + 109 format (/ 20('-') / 2a10 / 2a10 / 2a10 / 20('-')) + 110 format (i10) ! -111 format (/ 30('-') / 3a10 / 3a10 / 3a10 / 30('-') ) -113 format ( 2i10, 1f10.3 ) -114 format (30('-') / a15, 5x, 1f10.3 / ) + 111 format (/ 30('-') / 3a10 / 3a10 / 3a10 / 30('-')) + 113 format (2i10, 1f10.3) + 114 format (30('-') / a15, 5x, 1f10.3 /) ! -115 format (/61('-')/ a50, a10 /61('-')) -116 format (39x,a22 / 25x, a36) -117 format ( 3(a25,6(i6) /) ) + 115 format (/61('-')/ a50, a10 /61('-')) + 116 format (39x, a22 / 25x, a36) + 117 format (3(a25, 6(i6))) ! -118 format (/50('-')/ a40, a10 /50('-')) -119 format (a10, a20, a20/) -120 format (i10, 10x, i10, a20) + 118 format (/50('-')/ a40, a10 /50('-')) + 119 format (a10, a10, a20, a20/) + 120 format (i10, i10, 10x, i10, a20) ! -121 format (/55('-')/ a55 /55('-')) -122 format (a10, 3a15, a35) -123 format (i10, 3f15.3, a35) + 121 format (/55('-')/ a55 /55('-')) + 122 format (a10, 3a15, a35) + 123 format (i10, 3f15.3, a35) ! -126 format (a30,9x,L1) + 126 format (a30, 9x, L1) ! -134 format (/ 50('-') / 5a10 / 5a10) -135 format (5a10 / 50('-')) -136 format (5i10) + 134 format (/ 50('-') / 5a10 / 5a10) + 135 format (5a10 / 50('-')) + 136 format (5i10) ! -200 format (80('-')) -201 format (a80) -202 format (/50('-')/ a50 /50('-')) + 200 format (80('-')) + 201 format (a80) + 202 format (/50('-')/ a50 /50('-')) ! -218 format (/ 80('-')/ 26x, a24,26x, /80('-')) -222 format (/80('-')/ 26x,a21 /80('-')) -224 format (a40, 5x, a256) + 218 format (/ 80('-')/ 26x, a24, 26x, /80('-')) + 222 format (/80('-')/ 26x, a21 /80('-')) + 224 format (a40, 5x, a256) -301 format (a7, i2, a32,f15.0) -302 format (a7, i2, a32,es20.8) + 301 format (a7, i2, a32, f15.0) + 302 format (a7, i2, a32, es20.8) end Subroutine write_configfile @@ -487,49 +497,49 @@ end Subroutine write_configfile subroutine write_optifile(best_OF, best_paramSet, param_names) - use mo_file, only: file_opti, uopti - use mo_global_variables, only: dirConfigOut - use mo_message, only: message - use mo_string_utils, only: num2str + use mo_common_mhm_mrm_file, only : file_opti, uopti + use mo_common_variables, only : dirConfigOut + use mo_message, only : message + use mo_string_utils, only : num2str implicit none - real(dp), intent(in) :: best_OF - real(dp), dimension(:), intent(in) :: best_paramSet - character(len=*), dimension(:), intent(in) :: param_names + real(dp), intent(in) :: best_OF + real(dp), dimension(:), intent(in) :: best_paramSet + character(len = *), dimension(:), intent(in) :: param_names ! local variables - character(256) :: fName, formHeader, formParams - integer(i4) :: ii, err, n_params + character(256) :: fName, formHeader, formParams + integer(i4) :: ii, err, n_params ! number of parameters n_params = size(best_paramSet) ! open file fName = trim(adjustl(dirConfigOut)) // trim(adjustl(file_opti)) - open(uopti, file=fName, status='unknown', action='write', iostat=err, recl=(n_params+1)*40) - if( err .ne. 0 ) then - call message (' IOError while openening ',trim(fName)) - call message (' Error-Code ', num2str(err)) - stop + open(uopti, file = fName, status = 'unknown', action = 'write', iostat = err, recl = (n_params + 1) * 40) + if(err .ne. 0) then + call message (' IOError while openening ', trim(fName)) + call message (' Error-Code ', num2str(err)) + stop end if ! header - write(formHeader, *) '(a40,',n_params,'a40)' + write(formHeader, *) '(a40,', n_params, 'a40)' ! len(param_names(1))=256 but only 39 characters taken here ! write(uopti, formHeader) 'OF', (trim(adjustl(param_names(ii))), ii=1, n_params) - write(uopti, formHeader) 'OF', (trim(adjustl(param_names(ii)(1:39))), ii=1, n_params) + write(uopti, formHeader) 'OF', (trim(adjustl(param_names(ii)(1 : 39))), ii = 1, n_params) ! output - write(formParams, *) '( es40.14, ', n_params,'(es40.14) )' - write(uopti, formParams) best_OF, (best_paramSet(ii), ii=1, n_params) + write(formParams, *) '( es40.14, ', n_params, '(es40.14) )' + write(uopti, formParams) best_OF, (best_paramSet(ii), ii = 1, n_params) ! close file close(uopti) ! screen output call message() - call message(' Optimized parameters written to ', trim(fName) ) + call message(' Optimized parameters written to ', trim(fName)) end subroutine write_optifile @@ -591,130 +601,129 @@ end subroutine write_optifile subroutine write_optinamelist(processMatrix, parameters, maskpara, parameters_name) - use mo_file, only: file_opti_nml, uopti_nml - use mo_global_variables, only: dirConfigOut - use mo_common_variables, only: nProcesses - use mo_message, only: message - use mo_string_utils, only: num2str + use mo_common_mhm_mrm_file, only : file_opti_nml, uopti_nml + use mo_common_variables, only : nProcesses, dirConfigOut + use mo_message, only : message + use mo_string_utils, only : num2str implicit none - integer(i4), dimension(nProcesses, 3), intent(in) :: processMatrix ! information about which process + integer(i4), dimension(nProcesses, 3), intent(in) :: processMatrix ! information about which process ! ! case was used - real(dp), dimension(:,:), intent(in) :: parameters ! (min, max, opti) - logical, dimension(size(parameters,1)), intent(in) :: maskpara ! .true. if parameter was calibrated - character(len=*), dimension(size(parameters,1)), intent(in) :: parameters_name ! clear names of parameters + real(dp), dimension(:, :), intent(in) :: parameters ! (min, max, opti) + logical, dimension(size(parameters, 1)), intent(in) :: maskpara ! .true. if parameter was calibrated + character(len = *), dimension(size(parameters, 1)), intent(in) :: parameters_name ! clear names of parameters ! local variables - character(256) :: fName - character(3) :: flag - character(len=28), dimension(nProcesses) :: Process_descr - integer(i4) :: err - integer(i4) :: iProc, iPar, iPar_start - - Process_descr(1) = 'interception' - Process_descr(2) = 'snow' - Process_descr(3) = 'soilmoisture' - Process_descr(4) = 'directSealedAreaRunoff' - Process_descr(5) = 'potential evapotranspiration' - Process_descr(6) = 'interflow' - Process_descr(7) = 'percolation' - Process_descr(8) = 'routing' - Process_descr(9) = 'geology' + character(256) :: fName + character(3) :: flag + character(len = 28), dimension(nProcesses) :: Process_descr + integer(i4) :: err + integer(i4) :: iProc, iPar, iPar_start + + Process_descr(1) = 'interception' + Process_descr(2) = 'snow' + Process_descr(3) = 'soilmoisture' + Process_descr(4) = 'directSealedAreaRunoff' + Process_descr(5) = 'potential evapotranspiration' + Process_descr(6) = 'interflow' + Process_descr(7) = 'percolation' + Process_descr(8) = 'routing' + Process_descr(9) = 'geology' Process_descr(10) = 'neutrons' ! open file fName = trim(adjustl(dirConfigOut)) // trim(adjustl(file_opti_nml)) - open(uopti_nml, file=fName, status='unknown', action='write', iostat=err) - if( err .ne. 0 ) then - call message (' IOError while openening ',trim(fName)) - call message (' Error-Code ', num2str(err)) - stop + open(uopti_nml, file = fName, status = 'unknown', action = 'write', iostat = err) + if(err .ne. 0) then + call message (' IOError while openening ', trim(fName)) + call message (' Error-Code ', num2str(err)) + stop end if - write(uopti_nml,*) '!global_parameters' - write(uopti_nml,*) '!PARAMETER lower_bound upper_bound value FLAG SCALING' + write(uopti_nml, *) '!global_parameters' + write(uopti_nml, *) '!PARAMETER lower_bound upper_bound value FLAG SCALING' iPar_start = 1 - do iProc=1,nProcesses - - write(uopti_nml,*) '! ',trim(adjustl(process_descr(iProc))) - - select case (iProc) - case(1) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&interception1' - end if - case(2) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&snow1' - end if - case(3) - select case (processMatrix(iProc,1)) - case(1) - write(uopti_nml,*) '&soilmoisture1' - case(2) - write(uopti_nml,*) '&soilmoisture2' - end select - case(4) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&directRunoff1' - end if - case(5) - select case (processMatrix(iProc,1)) - case(0) - write(uopti_nml,*) '&PET0' - case(1) - write(uopti_nml,*) '&PET1' - case(2) - write(uopti_nml,*) '&PET2' - case(3) - write(uopti_nml,*) '&PET3' - end select - case(6) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&interflow1' - end if - case(7) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&percolation1' - end if - case(8) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&routing1' - end if - if (processMatrix(iProc,1) .eq. 2) then - write(uopti_nml,*) '&routing2' - end if - case(9) - if (processMatrix(iProc,1) .eq. 1) then - write(uopti_nml,*) '&geoparameter' - end if - case(10) - if (processMatrix(iProc,1) .ge. 1) then - write(uopti_nml,*) '&neutrons1' - end if - end select - - do iPar=iPar_Start, processMatrix(iProc, 3) - - if (maskpara(iPar)) then - flag=' 1 ' - else - flag=' 0 ' - end if - - write(uopti_nml,*) trim(adjustl(parameters_name(iPar))), ' = ', & - parameters(iPar,1), ' , ', & - parameters(iPar,2), ' , ', & - parameters(iPar,3), ' , ', & - flag, ', 1 ' - end do - - iPar_Start = processMatrix(iProc, 3) + 1 - - write(uopti_nml,*) '/' - write(uopti_nml,*) ' ' + do iProc = 1, nProcesses + + write(uopti_nml, *) '! ', trim(adjustl(process_descr(iProc))) + + select case (iProc) + case(1) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&interception1' + end if + case(2) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&snow1' + end if + case(3) + select case (processMatrix(iProc, 1)) + case(1) + write(uopti_nml, *) '&soilmoisture1' + case(2) + write(uopti_nml, *) '&soilmoisture2' + end select + case(4) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&directRunoff1' + end if + case(5) + select case (processMatrix(iProc, 1)) + case(0) + write(uopti_nml, *) '&PET0' + case(1) + write(uopti_nml, *) '&PET1' + case(2) + write(uopti_nml, *) '&PET2' + case(3) + write(uopti_nml, *) '&PET3' + end select + case(6) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&interflow1' + end if + case(7) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&percolation1' + end if + case(8) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&routing1' + end if + if (processMatrix(iProc, 1) .eq. 2) then + write(uopti_nml, *) '&routing2' + end if + case(9) + if (processMatrix(iProc, 1) .eq. 1) then + write(uopti_nml, *) '&geoparameter' + end if + case(10) + if (processMatrix(iProc, 1) .ge. 1) then + write(uopti_nml, *) '&neutrons1' + end if + end select + + do iPar = iPar_Start, processMatrix(iProc, 3) + + if (maskpara(iPar)) then + flag = ' 1 ' + else + flag = ' 0 ' + end if + + write(uopti_nml, *) trim(adjustl(parameters_name(iPar))), ' = ', & + parameters(iPar, 1), ' , ', & + parameters(iPar, 2), ' , ', & + parameters(iPar, 3), ' , ', & + flag, ', 1 ' + end do + + iPar_Start = processMatrix(iProc, 3) + 1 + + write(uopti_nml, *) '/' + write(uopti_nml, *) ' ' end do ! loop over processes @@ -723,7 +732,7 @@ subroutine write_optinamelist(processMatrix, parameters, maskpara, parameters_na ! screen output call message() - call message(' Optimized parameters written in namelist format to ', trim(fName) ) + call message(' Optimized parameters written in namelist format to ', trim(fName)) end subroutine write_optinamelist diff --git a/src/mHM/mo_write_fluxes_states.f90 b/src/mHM/mo_write_fluxes_states.f90 index 295ad195..ac33abd7 100755 --- a/src/mHM/mo_write_fluxes_states.f90 +++ b/src/mHM/mo_write_fluxes_states.f90 @@ -14,59 +14,58 @@ module mo_write_fluxes_states - use mo_kind , only: i4, dp - use mo_string_utils , only: num2str - use mo_global_variables , only: gridGeoRef, project_details, setup_description, simulation_type, & - Conventions, contact, mHM_details, history - use mo_mhm_constants , only: nodata_dp - use mo_netcdf , only: NcDataset, NcDimension, NcVariable + use mo_kind, only : i4, dp + use mo_string_utils, only : num2str + use mo_common_variables, only : project_details, setup_description, simulation_type, & + Conventions, contact, mHM_details, history + use mo_common_constants, only : nodata_dp + use mo_netcdf, only : NcDataset, NcDimension, NcVariable implicit none type OutputVariable - type(NcVariable) :: nc !> NcDataset which contains the variable - logical :: avg = .false. !> average data before writing - logical, pointer :: mask(:,:) !> mask to reconstruct data - real(dp), allocatable :: data(:) !> store the data between writes - integer(i4) :: counter = 0 !> count the number of updateVariable calls + type(NcVariable) :: nc !> NcDataset which contains the variable + logical :: avg = .false. !> average data before writing + logical, pointer :: mask(:, :) !> mask to reconstruct data + real(dp), allocatable :: data(:) !> store the data between writes + integer(i4) :: counter = 0 !> count the number of updateVariable calls - contains - procedure, public :: updateVariable - procedure, public :: writeVariableTimestep + contains + procedure, public :: updateVariable + procedure, public :: writeVariableTimestep end type OutputVariable ! constructor interface interface OutputVariable - procedure newOutputVariable + procedure newOutputVariable end interface OutputVariable type OutputDataset - integer(i4) :: ibasin !> basin id - type(NcDataset) :: nc !> NcDataset to write - type(OutputVariable), allocatable :: vars(:) !> store all created (dynamic) variables - integer(i4) :: counter = 0 !> count written time steps + integer(i4) :: ibasin !> basin id + type(NcDataset) :: nc !> NcDataset to write + type(OutputVariable), allocatable :: vars(:) !> store all created (dynamic) variables + integer(i4) :: counter = 0 !> count written time steps - contains - procedure, public :: updateDataset - procedure, public :: writeTimestep - procedure, public :: close + contains + procedure, public :: updateDataset + procedure, public :: writeTimestep + procedure, public :: close end type OutputDataset ! constructor interface interface OutputDataset - procedure newOutputDataset + procedure newOutputDataset end interface OutputDataset - private public :: OutputDataset #ifdef pgiFortran154 public :: newOutputDataset #endif - + contains !------------------------------------------------------------------ @@ -120,18 +119,18 @@ module mo_write_fluxes_states ! David Schaefer, Nov 2017, added NcVariable initialization function newOutputVariable(nc, name, dtype, dims, ncells, mask, avg) result(out) - type(NcDataset), intent(in) :: nc - character(*), intent(in) :: name - character(*), intent(in) :: dtype - character(16), intent(in) :: dims(3) - integer(i4), intent(in) :: ncells - logical, intent(in), target :: mask(:,:) + type(NcDataset), intent(in) :: nc + character(*), intent(in) :: name + character(*), intent(in) :: dtype + character(16), intent(in) :: dims(3) + integer(i4), intent(in) :: ncells + logical, intent(in), target :: mask(:, :) logical, intent(in), optional :: avg - type(OutputVariable) :: out + type(OutputVariable) :: out allocate(out%data(ncells)) - out%nc = nc%setVariable(name, dtype, dims, deflate_level=1, shuffle=.true.) - out%data = 0 + out%nc = nc%setVariable(name, dtype, dims, deflate_level = 1, shuffle = .true.) + out%data = 0 out%mask => mask if (present(avg)) out%avg = avg end function newOutputVariable @@ -187,9 +186,9 @@ end function newOutputVariable !> \date June 2015 subroutine updateVariable(self, data) class(OutputVariable), intent(inout) :: self - real(dp) , intent(in) :: data(:) + real(dp), intent(in) :: data(:) - self%data = self%data + data + self%data = self%data + data self%counter = self%counter + 1 end subroutine updateVariable @@ -245,14 +244,13 @@ end subroutine updateVariable ! David Schaefer, Sep. 2015 - bugfix subroutine writeVariableTimestep(self, timestep) class(OutputVariable), intent(inout) :: self - integer(i4) , intent(in) :: timestep + integer(i4), intent(in) :: timestep if (self%avg) then - self%data = self%data / real(self%counter, dp) + self%data = self%data / real(self%counter, dp) end if - call self%nc%setData(unpack(self%data, self%mask, nodata_dp), & - (/1,1,timestep/)) + (/1, 1, timestep/)) self%data = 0 self%counter = 0 @@ -312,201 +310,202 @@ end subroutine writeVariableTimestep ! V. Prykhodk, J. Mai , Nov. 2014 - adding new variable infilSoil - case 16 ! David Schaefer , Jun. 2015 - major rewrite ! David Schaefer , Nov. 2016 - moved NcVariable initialization to newOutputVariable - function newOutputDataset(ibasin, mask1) result(out) + function newOutputDataset(ibasin, mask1, nCells) result(out) - use mo_global_variables, only : outputFlxState, nSoilHorizons_mHM - use mo_init_states, only : get_basin_info + use mo_global_variables, only : outputFlxState + use mo_mpr_global_variables, only : nSoilHorizons_mHM integer(i4), intent(in) :: ibasin - logical, target :: mask1(:,:) - type(OutputDataset) :: out + logical, target, intent(in) :: mask1(:, :) + integer(i4), intent(in) :: nCells + type(OutputDataset) :: out ! local - integer(i4) :: ii, nn, ncols, nrows, ncells - character(3) :: dtype - character(16) :: dims1(3), unit - type(NcDataset) :: nc - type(OutputVariable) :: tmpvars(size(outputFlxState)*nSoilHorizons_mHM) - - call get_basin_info (ibasin, 1, ncols, nrows, ncells=ncells) + integer(i4) :: ii, nn + character(3) :: dtype + character(16) :: dims1(3), unit + type(NcDataset) :: nc + type(OutputVariable) :: tmpvars(size(outputFlxState) * nSoilHorizons_mHM) dtype = "f64" - unit = fluxesUnit(ibasin) - dims1 = (/"easting ", "northing","time "/) - nc = createOutputFile(ibasin) + unit = fluxesUnit(ibasin) + dims1 = (/"easting ", "northing", "time "/) + nc = createOutputFile(ibasin) ii = 0 if (outputFlxState(1)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "interception", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(& - tmpvars(ii), "canopy interception storage", "mm") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "interception", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(& + tmpvars(ii), "canopy interception storage", "mm") end if if (outputFlxState(2)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "snowpack", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(tmpvars(ii), "depth of snowpack", "mm") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "snowpack", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(tmpvars(ii), "depth of snowpack", "mm") end if if (outputFlxState(3)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 - tmpvars(ii) = OutputVariable(nc, "SWC_L"//trim(num2str(nn, '(i2.2)')), & - dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(tmpvars(ii), & - 'soil water content of soil layer'//trim(num2str(nn)), "mm") - end do + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 + tmpvars(ii) = OutputVariable(nc, "SWC_L" // trim(num2str(nn, '(i2.2)')), & + dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(tmpvars(ii), & + 'soil water content of soil layer' // trim(num2str(nn)), "mm") + end do end if if (outputFlxState(4)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 - tmpvars(ii) = OutputVariable(nc, "SM_L"//trim(num2str(nn, '(i2.2)')), & - dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(tmpvars(ii), & - 'volumetric soil moisture of soil layer'//trim(num2str(nn)), "mm mm-1") - end do + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 + tmpvars(ii) = OutputVariable(nc, "SM_L" // trim(num2str(nn, '(i2.2)')), & + dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(tmpvars(ii), & + 'volumetric soil moisture of soil layer' // trim(num2str(nn)), "mm mm-1") + end do end if if (outputFlxState(5)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "SM_Lall", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(& - tmpvars(ii), "average soil moisture over all layers", "mm mm-1") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "SM_Lall", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(& + tmpvars(ii), "average soil moisture over all layers", "mm mm-1") end if if (outputFlxState(6)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "sealedSTW", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(& - tmpvars(ii), "reservoir of sealed areas (sealedSTW)", "mm") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "sealedSTW", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(& + tmpvars(ii), "reservoir of sealed areas (sealedSTW)", "mm") end if if (outputFlxState(7)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "unsatSTW", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(& - tmpvars(ii), "reservoir of unsaturated zone", "mm") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "unsatSTW", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(& + tmpvars(ii), "reservoir of unsaturated zone", "mm") end if if (outputFlxState(8)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "satSTW", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(& - tmpvars(ii), "water level in groundwater reservoir", "mm") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "satSTW", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(& + tmpvars(ii), "water level in groundwater reservoir", "mm") end if if (outputFlxState(18)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "neutrons", dtype, dims1, ncells, mask1, .true.) - call writeVariableAttributes(& - tmpvars(ii), "ground albedo neutrons", "cph") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "neutrons", dtype, dims1, nCells, mask1, .true.) + call writeVariableAttributes(& + tmpvars(ii), "ground albedo neutrons", "cph") end if if (outputFlxState(9)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "PET", dtype, dims1, ncells, mask1) - call writeVariableAttributes(& - tmpvars(ii), "potential Evapotranspiration", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "PET", dtype, dims1, nCells, mask1) + call writeVariableAttributes(& + tmpvars(ii), "potential Evapotranspiration", trim(unit)) end if if (outputFlxState(10)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "aET", dtype, dims1, ncells, mask1) - call writeVariableAttributes(& - tmpvars(ii), "actual Evapotranspiration", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "aET", dtype, dims1, nCells, mask1) + call writeVariableAttributes(& + tmpvars(ii), "actual Evapotranspiration", trim(unit)) end if if (outputFlxState(11)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "Q", dtype, dims1, ncells, mask1) - call writeVariableAttributes(& - tmpvars(ii), "total runoff generated by every cell", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "Q", dtype, dims1, nCells, mask1) + call writeVariableAttributes(& + tmpvars(ii), "total runoff generated by every cell", trim(unit)) end if if (outputFlxState(12)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "QD", dtype, dims1, ncells, mask1) - call writeVariableAttributes(tmpvars(ii), & - "direct runoff generated by every cell (runoffSeal)", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "QD", dtype, dims1, nCells, mask1) + call writeVariableAttributes(tmpvars(ii), & + "direct runoff generated by every cell (runoffSeal)", trim(unit)) end if if (outputFlxState(13)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "QIf", dtype, dims1, ncells, mask1) - call writeVariableAttributes(tmpvars(ii), & - "fast interflow generated by every cell (fastRunoff)", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "QIf", dtype, dims1, nCells, mask1) + call writeVariableAttributes(tmpvars(ii), & + "fast interflow generated by every cell (fastRunoff)", trim(unit)) end if if (outputFlxState(14)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "QIs", dtype, dims1, ncells, mask1) - call writeVariableAttributes(tmpvars(ii), & - "slow interflow generated by every cell (slowRunoff)", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "QIs", dtype, dims1, nCells, mask1) + call writeVariableAttributes(tmpvars(ii), & + "slow interflow generated by every cell (slowRunoff)", trim(unit)) end if if (outputFlxState(15)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "QB", dtype, dims1, ncells, mask1) - call writeVariableAttributes(& - tmpvars(ii), "baseflow generated by every cell", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "QB", dtype, dims1, nCells, mask1) + call writeVariableAttributes(& + tmpvars(ii), "baseflow generated by every cell", trim(unit)) end if if (outputFlxState(16)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "recharge", dtype, dims1, ncells, mask1) - call writeVariableAttributes(& - tmpvars(ii), "groundwater recharge", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "recharge", dtype, dims1, nCells, mask1) + call writeVariableAttributes(& + tmpvars(ii), "groundwater recharge", trim(unit)) end if if (outputFlxState(17)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 - tmpvars(ii) = OutputVariable( & - nc, "soil_infil_L"//trim(num2str(nn,'(i2.2)')), & - dtype, dims1, ncells, mask1) - call writeVariableAttributes(tmpvars(ii), & - "infiltration flux from soil layer"//trim(num2str(nn)), unit) - end do + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "soil_infil_L" // trim(num2str(nn, '(i2.2)')), & + dtype, dims1, nCells, mask1) + call writeVariableAttributes(tmpvars(ii), & + "infiltration flux from soil layer" // trim(num2str(nn)), unit) + end do end if if (outputFlxState(19)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 - tmpvars(ii) = OutputVariable( & - nc, "aET_L"//trim(num2str(nn, '(i2.2)')), & - dtype, dims1, ncells, mask1) - call writeVariableAttributes(tmpvars(ii), & - 'actual Evapotranspiration from soil layer'//trim(num2str(nn)), & - "mm "//trim(unit)) - end do + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "aET_L" // trim(num2str(nn, '(i2.2)')), & + dtype, dims1, nCells, mask1) + call writeVariableAttributes(tmpvars(ii), & + 'actual Evapotranspiration from soil layer' // trim(num2str(nn)), & + "mm " // trim(unit)) + end do end if if (outputFlxState(20)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "preEffect", dtype, dims1, ncells, mask1) - call writeVariableAttributes(& - tmpvars(ii), "effective precipitation", trim(unit)) + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "preEffect", dtype, dims1, nCells, mask1) + call writeVariableAttributes(& + tmpvars(ii), "effective precipitation", trim(unit)) end if - out = OutputDataset(ibasin, nc, tmpvars(1:ii)) + out%vars = tmpvars(1 : ii) + out%nc = nc + out%ibasin = ibasin end function newOutputDataset @@ -600,243 +599,244 @@ end function newOutputDataset ! V. Prykhodk, J. Mai, Nov. 2014 - adding new variable infilSoil - case 16 ! David Schaefer , Jun. 2015 - major rewrite subroutine updateDataset(& - self , sidx , eidx , & - L1_fSealed , L1_fNotSealed, L1_inter , & - L1_snowPack , L1_soilMoist , L1_soilMoistSat , & - L1_sealSTW , L1_unsatSTW , L1_satSTW , & - L1_neutrons , L1_pet , L1_aETSoil , & - L1_aETCanopy , L1_aETSealed , L1_total_runoff , & - L1_runoffSeal, L1_fastRunoff, L1_slowRunoff , & - L1_baseflow , L1_percol , L1_infilSoil , & - L1_preEffect ) - - use mo_global_variables, only : outputFlxState, nSoilHorizons_mHM + self, sidx, eidx, & + L1_fSealed, L1_fNotSealed, L1_inter, & + L1_snowPack, L1_soilMoist, L1_soilMoistSat, & + L1_sealSTW, L1_unsatSTW, L1_satSTW, & + L1_neutrons, L1_pet, L1_aETSoil, & + L1_aETCanopy, L1_aETSealed, L1_total_runoff, & + L1_runoffSeal, L1_fastRunoff, L1_slowRunoff, & + L1_baseflow, L1_percol, L1_infilSoil, & + L1_preEffect) + + use mo_global_variables, only : outputFlxState + use mo_mpr_global_variables, only : nSoilHorizons_mHM class(OutputDataset), intent(inout), target :: self - integer(i4), intent(in) :: sidx, eidx - real(dp), intent(in) :: L1_fSealed(:) - real(dp), intent(in) :: L1_fNotSealed(:) + integer(i4), intent(in) :: sidx, eidx + real(dp), intent(in) :: L1_fSealed(:) + real(dp), intent(in) :: L1_fNotSealed(:) ! states - real(dp), intent(in) :: L1_inter(:) - real(dp), intent(in) :: L1_snowPack(:) - real(dp), intent(in) :: L1_soilMoist(:,:) - real(dp), intent(in) :: L1_soilMoistSat(:,:) - real(dp), intent(in) :: L1_sealSTW(:) - real(dp), intent(in) :: L1_unsatSTW(:) - real(dp), intent(in) :: L1_satSTW(:) - real(dp), intent(in) :: L1_neutrons(:) + real(dp), intent(in) :: L1_inter(:) + real(dp), intent(in) :: L1_snowPack(:) + real(dp), intent(in) :: L1_soilMoist(:, :) + real(dp), intent(in) :: L1_soilMoistSat(:, :) + real(dp), intent(in) :: L1_sealSTW(:) + real(dp), intent(in) :: L1_unsatSTW(:) + real(dp), intent(in) :: L1_satSTW(:) + real(dp), intent(in) :: L1_neutrons(:) ! fluxes, - real(dp), intent(in) :: L1_pet(:) - real(dp), intent(in) :: L1_aETSoil(:,:) - real(dp), intent(in) :: L1_aETCanopy(:) - real(dp), intent(in) :: L1_aETSealed(:) - real(dp), intent(in) :: L1_total_runoff(:) - real(dp), intent(in) :: L1_runoffSeal(:) - real(dp), intent(in) :: L1_fastRunoff(:) - real(dp), intent(in) :: L1_slowRunoff(:) - real(dp), intent(in) :: L1_baseflow(:) - real(dp), intent(in) :: L1_percol(:) - real(dp), intent(in) :: L1_infilSoil(:,:) - real(dp), intent(in) :: L1_preEffect(:) + real(dp), intent(in) :: L1_pet(:) + real(dp), intent(in) :: L1_aETSoil(:, :) + real(dp), intent(in) :: L1_aETCanopy(:) + real(dp), intent(in) :: L1_aETSealed(:) + real(dp), intent(in) :: L1_total_runoff(:) + real(dp), intent(in) :: L1_runoffSeal(:) + real(dp), intent(in) :: L1_fastRunoff(:) + real(dp), intent(in) :: L1_slowRunoff(:) + real(dp), intent(in) :: L1_baseflow(:) + real(dp), intent(in) :: L1_percol(:) + real(dp), intent(in) :: L1_infilSoil(:, :) + real(dp), intent(in) :: L1_preEffect(:) ! local type(OutputVariable), pointer :: vars(:) - integer(i4) :: ii, nn + integer(i4) :: ii, nn ii = 0 - vars => self%vars + vars => self%vars if (outputFlxState(1)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_inter(sidx:eidx)) + call updateVariable(vars(ii), L1_inter(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_inter(sidx:eidx)) + call vars(ii)%updateVariable(L1_inter(sidx : eidx)) #endif end if if (outputFlxState(2)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_snowPack(sidx:eidx)) + call updateVariable(vars(ii), L1_snowPack(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_snowPack(sidx:eidx)) + call vars(ii)%updateVariable(L1_snowPack(sidx : eidx)) #endif end if if (outputFlxState(3)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_soilMoist(sidx:eidx,nn)) + call updateVariable(vars(ii), L1_soilMoist(sidx : eidx, nn)) #else - call vars(ii)%updateVariable(L1_soilMoist(sidx:eidx,nn)) + call vars(ii)%updateVariable(L1_soilMoist(sidx : eidx, nn)) #endif end do end if if (outputFlxState(4)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_soilMoist(sidx:eidx,nn) & - / L1_soilMoistSat(sidx:eidx,nn)) + call updateVariable(vars(ii), L1_soilMoist(sidx : eidx, nn) & + / L1_soilMoistSat(sidx : eidx, nn)) #else - call vars(ii)%updateVariable(L1_soilMoist(sidx:eidx,nn) & - / L1_soilMoistSat(sidx:eidx,nn)) + call vars(ii)%updateVariable(L1_soilMoist(sidx : eidx, nn) & + / L1_soilMoistSat(sidx : eidx, nn)) #endif end do end if if (outputFlxState(5)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), sum(L1_soilMoist(sidx:eidx,:), dim=2) & - / sum(L1_soilMoistSat(sidx:eidx,:), dim=2)) + call updateVariable(vars(ii), sum(L1_soilMoist(sidx : eidx, :), dim = 2) & + / sum(L1_soilMoistSat(sidx : eidx, :), dim = 2)) #else - call vars(ii)%updateVariable(sum(L1_soilMoist(sidx:eidx,:), dim=2) & - / sum(L1_soilMoistSat(sidx:eidx,:), dim=2)) + call vars(ii)%updateVariable(sum(L1_soilMoist(sidx : eidx, :), dim = 2) & + / sum(L1_soilMoistSat(sidx : eidx, :), dim = 2)) #endif end if if (outputFlxState(6)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_sealSTW(sidx:eidx)) + call updateVariable(vars(ii), L1_sealSTW(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_sealSTW(sidx:eidx)) + call vars(ii)%updateVariable(L1_sealSTW(sidx : eidx)) #endif end if if (outputFlxState(7)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_unsatSTW(sidx:eidx)) + call updateVariable(vars(ii), L1_unsatSTW(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_unsatSTW(sidx:eidx)) + call vars(ii)%updateVariable(L1_unsatSTW(sidx : eidx)) #endif end if if (outputFlxState(8)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_satSTW(sidx:eidx)) + call updateVariable(vars(ii), L1_satSTW(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_satSTW(sidx:eidx)) + call vars(ii)%updateVariable(L1_satSTW(sidx : eidx)) #endif end if if (outputFlxState(18)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_neutrons(sidx:eidx)) + call updateVariable(vars(ii), L1_neutrons(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_neutrons(sidx:eidx)) + call vars(ii)%updateVariable(L1_neutrons(sidx : eidx)) #endif end if if (outputFlxState(9)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_pet(sidx:eidx)) + call updateVariable(vars(ii), L1_pet(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_pet(sidx:eidx)) + call vars(ii)%updateVariable(L1_pet(sidx : eidx)) #endif end if if (outputFlxState(10)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), sum(L1_aETSoil(sidx:eidx,:), dim=2) * L1_fNotSealed(sidx:eidx) & - + L1_aETCanopy(sidx:eidx) + L1_aETSealed(sidx:eidx) * L1_fSealed(sidx:eidx)) + call updateVariable(vars(ii), sum(L1_aETSoil(sidx : eidx, :), dim = 2) * L1_fNotSealed(sidx : eidx) & + + L1_aETCanopy(sidx : eidx) + L1_aETSealed(sidx : eidx) * L1_fSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(sum(L1_aETSoil(sidx:eidx,:), dim=2) * L1_fNotSealed(sidx:eidx) & - + L1_aETCanopy(sidx:eidx) + L1_aETSealed(sidx:eidx) * L1_fSealed(sidx:eidx)) + call vars(ii)%updateVariable(sum(L1_aETSoil(sidx : eidx, :), dim = 2) * L1_fNotSealed(sidx : eidx) & + + L1_aETCanopy(sidx : eidx) + L1_aETSealed(sidx : eidx) * L1_fSealed(sidx : eidx)) #endif end if if (outputFlxState(11)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_total_runoff(sidx:eidx)) + call updateVariable(vars(ii), L1_total_runoff(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_total_runoff(sidx:eidx)) + call vars(ii)%updateVariable(L1_total_runoff(sidx : eidx)) #endif end if if (outputFlxState(12)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_runoffSeal(sidx:eidx) * L1_fSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_runoffSeal(sidx : eidx) * L1_fSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_runoffSeal(sidx:eidx) * L1_fSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_runoffSeal(sidx : eidx) * L1_fSealed(sidx : eidx)) #endif end if if (outputFlxState(13)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_fastRunoff(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_fastRunoff(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_fastRunoff(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_fastRunoff(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #endif end if if (outputFlxState(14)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_slowRunoff(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_slowRunoff(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_slowRunoff(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_slowRunoff(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #endif end if if (outputFlxState(15)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_baseflow(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_baseflow(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_baseflow(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_baseflow(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #endif end if if (outputFlxState(16)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_percol(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_percol(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_percol(sidx:eidx) * L1_fNotSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_percol(sidx : eidx) * L1_fNotSealed(sidx : eidx)) #endif end if if (outputFlxState(17)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_infilSoil(sidx:eidx,nn) * L1_fNotSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_infilSoil(sidx : eidx, nn) * L1_fNotSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_infilSoil(sidx:eidx,nn) * L1_fNotSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_infilSoil(sidx : eidx, nn) * L1_fNotSealed(sidx : eidx)) #endif end do end if if (outputFlxState(19)) then - do nn = 1, nSoilHorizons_mHM - ii = ii + 1 + do nn = 1, nSoilHorizons_mHM + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_aETSoil(sidx:eidx,nn) * L1_fNotSealed(sidx:eidx)) + call updateVariable(vars(ii), L1_aETSoil(sidx : eidx, nn) * L1_fNotSealed(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_aETSoil(sidx:eidx,nn) * L1_fNotSealed(sidx:eidx)) + call vars(ii)%updateVariable(L1_aETSoil(sidx : eidx, nn) * L1_fNotSealed(sidx : eidx)) #endif end do end if if (outputFlxState(20)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L1_preEffect(sidx:eidx)) + call updateVariable(vars(ii), L1_preEffect(sidx : eidx)) #else - call vars(ii)%updateVariable(L1_preEffect(sidx:eidx)) + call vars(ii)%updateVariable(L1_preEffect(sidx : eidx)) #endif end if @@ -890,9 +890,9 @@ end subroutine updateDataset !> \date June 2015 subroutine writeTimestep(self, timestep) class(OutputDataset), intent(inout), target :: self - integer(i4), intent(in) :: timestep - integer(i4) :: ii - type(NcVariable) :: tvar + integer(i4), intent(in) :: timestep + integer(i4) :: ii + type(NcVariable) :: tvar self%counter = self%counter + 1 @@ -901,7 +901,7 @@ subroutine writeTimestep(self, timestep) call tvar%setData(timestep, (/self%counter/)) do ii = 1, size(self%vars) - call self%vars(ii)%writeVariableTimestep(self%counter) + call self%vars(ii)%writeVariableTimestep(self%counter) end do end subroutine writeTimestep @@ -956,9 +956,9 @@ end subroutine writeTimestep ! David Schaefer, June 2015 - adapted to new structure subroutine close(self) - use mo_String_utils, only: num2str - use mo_message, only: message - use mo_global_variables, only: dirOut + use mo_String_utils, only : num2str + use mo_message, only : message + use mo_common_variables, only : dirOut class(OutputDataset) :: self call self%nc%close() @@ -1018,78 +1018,82 @@ end subroutine close ! Oct 2015, Stephan Thober - added actual version of mHM function createOutputFile(ibasin) result(nc) - use mo_global_variables, only: dirOut, evalPer, level1 - use mo_file, only: version - use mo_julian, only: dec2date + use mo_common_variables, only : dirOut, level1 + use mo_common_mhm_mrm_variables, only : evalPer + use mo_grid, only : mapCoordinates, geoCoordinates + use mo_file, only : version + use mo_julian, only : dec2date integer(i4), intent(in) :: ibasin - type(NcDataset) :: nc - type(NcDimension) :: dimids1(3) - type(NcVariable) :: var - integer(i4) :: day, month, year - character(1028) :: fname - character(128) :: unit, date, time, datetime - real(dp), allocatable :: northing(:), easting(:), lat(:,:), lon(:,:) + type(NcDataset) :: nc + type(NcDimension) :: dimids1(3) + type(NcVariable) :: var + integer(i4) :: day, month, year + character(1028) :: fname + character(128) :: unit, date, time, datetime + real(dp), allocatable :: northing(:), easting(:), lat(:, :), lon(:, :) fname = trim(dirOut(ibasin)) // 'mHM_Fluxes_States.nc' - call mapCoordinates(ibasin, level1, northing, easting) - call geoCoordinates(ibasin, level1, lat, lon) + call mapCoordinates(level1(ibasin), northing, easting) + call geoCoordinates(level1(ibasin), lat, lon) - nc = NcDataset(trim(fname),"w") + nc = NcDataset(trim(fname), "w") dimids1 = (/& - nc%setDimension("easting", size(easting)), & - nc%setDimension("northing", size(northing)), & - nc%setDimension("time", 0) & - /) + nc%setDimension("easting", size(easting)), & + nc%setDimension("northing", size(northing)), & + nc%setDimension("time", 0) & + /) ! time units - call dec2date(real(evalPer(ibasin)%julStart, dp), dd=day, mm=month, yy=year) - write(unit,"('hours since ', i4, '-' ,i2.2, '-', i2.2, 1x, '00:00:00')") year, month, day + call dec2date(real(evalPer(ibasin)%julStart, dp), dd = day, mm = month, yy = year) + write(unit, "('hours since ', i4, '-' ,i2.2, '-', i2.2, 1x, '00:00:00')") year, month, day ! time var = nc%setVariable("time", "i32", (/ dimids1(3) /)) call var%setAttribute("units", unit) - call var%setAttribute("long_name","time") + call var%setAttribute("long_name", "time") ! northing var = nc%setVariable("northing", "f64", (/ dimids1(2) /)) call var%setData(northing) - call var%setAttribute("units","m or deg. dec.") - call var%setAttribute("long_name","y-coordinate in the given coordinate system") + call var%setAttribute("units", "m or deg. dec.") + call var%setAttribute("long_name", "y-coordinate in the given coordinate system") ! easting var = nc%setVariable("easting", "f64", (/ dimids1(1) /)) call var%setData(easting) - call var%setAttribute("units","m or deg. dec.") - call var%setAttribute("long_name","x-coordinate in the given coordinate system") + call var%setAttribute("units", "m or deg. dec.") + call var%setAttribute("long_name", "x-coordinate in the given coordinate system") ! lon - var = nc%setVariable("lon","f64",dimids1(1:2)) + var = nc%setVariable("lon", "f64", dimids1(1 : 2)) call var%setData(lon) - call var%setAttribute("units","deg. dec.") - call var%setAttribute("long_name","longitude") - call var%setAttribute("missing_value",nodata_dp) + call var%setAttribute("units", "deg. dec.") + call var%setAttribute("long_name", "longitude") + call var%setAttribute("missing_value", nodata_dp) ! lat - var = nc%setVariable("lat","f64",dimids1(1:2)) + var = nc%setVariable("lat", "f64", dimids1(1 : 2)) call var%setData(lat) - call var%setAttribute("units","deg. dec.") - call var%setAttribute("long_name","latitude") - call var%setAttribute("missing_value",nodata_dp) + call var%setAttribute("units", "deg. dec.") + call var%setAttribute("long_name", "latitude") + call var%setAttribute("missing_value", nodata_dp) ! global attributes - call date_and_time(date=date, time=time) - write(datetime,"(a4,'-',a2,'-',a2,1x,a2,':',a2,':',a2)") date(1:4), & - date(5:6), date(7:8), time(1:2), time(3:4), time(5:6) - - call nc%setAttribute("project", project_details ) - call nc%setAttribute("setup_description",setup_description) - call nc%setAttribute("simulation_type",simulation_type) - call nc%setAttribute("Conventions",Conventions) - call nc%setAttribute("contact",contact) - call nc%setAttribute("mHM_details",trim(mHM_details)//", release mHMv"//trim(version)) - call nc%setAttribute("history", trim(datetime)//", "//history) - + call date_and_time(date = date, time = time) + write(datetime, "(a4,'-',a2,'-',a2,1x,a2,':',a2,':',a2)") date(1 : 4), & + date(5 : 6), date(7 : 8), time(1 : 2), time(3 : 4), time(5 : 6) + + call nc%setAttribute("project", project_details) + call nc%setAttribute("setup_description", setup_description) + call nc%setAttribute("simulation_type", simulation_type) + call nc%setAttribute("Conventions", Conventions) + call nc%setAttribute("contact", contact) + call nc%setAttribute("mHM_details", trim(mHM_details) // ", release mHMv" // trim(version)) + call nc%setAttribute("history", trim(datetime) // ", " // history) + call nc%setAttribute("title", "mHMv"//trim(version)//" "//trim(simulation_type)//" outputs") + call nc%setAttribute("creation_date", datetime) + end function createOutputFile !------------------------------------------------------------------ @@ -1139,174 +1143,17 @@ end function createOutputFile !> \date June 2015 subroutine writeVariableAttributes(var, long_name, unit) type(OutputVariable), intent(in) :: var - character(*) , intent(in) :: long_name, unit + character(*), intent(in) :: long_name, unit - call var%nc%setAttribute("_FillValue",nodata_dp) - call var%nc%setAttribute("long_name",long_name) - call var%nc%setAttribute("unit",unit) - call var%nc%setAttribute("scale_factor",1.0_dp) - call var%nc%setAttribute("missing_value",nodata_dp) - call var%nc%setAttribute("coordinates","lat lon") + call var%nc%setAttribute("long_name", long_name) + call var%nc%setAttribute("unit", unit) + call var%nc%setAttribute("scale_factor", 1.0_dp) + call var%nc%setAttribute("missing_value", nodata_dp) + call var%nc%setAttribute("coordinates", "lat lon") end subroutine writeVariableAttributes - !------------------------------------------------------------------ - ! NAME - ! mapCoordinates - ! - ! PURPOSE - !> \brief Generate map coordinates - !> \details Generate map coordinate arrays for given basin and level - ! - ! CALLING SEQUENCE - ! call mapCoordinates(ibasin, level, y, x) - ! - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" -> basin number - !> \param[in] "type(geoGridRef) :: level" -> grid reference - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "real(:) :: y(:)" -> y-coordinates - !> \param[out] "real(dp) :: x(:)" -> x-coorindates - ! - ! INTENT(IN), OPTIONAL - ! None - ! - ! INTENT(INOUT), OPTIONAL - ! None - ! - ! INTENT(OUT), OPTIONAL - ! None - ! - ! RETURN - ! None - ! - ! RESTRICTIONS - ! None - ! - ! EXAMPLE - ! None - ! - ! LITERATURE - ! None - ! - ! HISTORY - !> \author Matthias Zink - !> \date Apr 2013 - ! Modified: - ! Stephan Thober, Nov 2013 - removed fproj dependency - ! David Schaefer, Jun 2015 - refactored the former subroutine CoordSystem - subroutine mapCoordinates(ibasin, level, y, x) - - implicit none - - integer(i4), intent(in) :: iBasin - type(gridGeoRef), intent(in) :: level - real(dp), intent(out), allocatable :: x(:), y(:) - integer(i4) :: ii, ncols, nrows - real(dp) :: cellsize - - cellsize = level%cellsize(ibasin) - nrows = level%nrows(ibasin) - ncols = level%ncols(ibasin) - - allocate(x(nrows), y(ncols)) - - x(1) = level%xllcorner(ibasin) + 0.5_dp * cellsize - do ii = 2, nrows - x(ii) = x(ii-1) + cellsize - end do - - ! inverse for Panoply, ncview display - y(ncols) = level%yllcorner(ibasin) + 0.5_dp * cellsize - do ii = ncols-1,1,-1 - y(ii) = y(ii+1) + cellsize - end do - - end subroutine mapCoordinates - - !------------------------------------------------------------------ - ! NAME - ! geoCoordinates - ! - ! PURPOSE - !> \brief Generate geographic coordinates - !> \details Generate geographic coordinate arrays for given basin and level - ! - ! CALLING SEQUENCE - ! call mapCoordinates(ibasin, level, y, x) - ! - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" -> basin number - !> \param[in] "type(gridGeoRef) :: level" -> grid reference - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "real(dp) :: lat(:,:)" -> lat-coordinates - !> \param[out] "real(dp) :: lon(:,:)" -> lon-coorindates - ! - ! INTENT(IN), OPTIONAL - ! None - ! - ! INTENT(INOUT), OPTIONAL - ! None - ! - ! INTENT(OUT), OPTIONAL - ! None - ! - ! RETURN - ! None - ! - ! RESTRICTIONS - ! None - ! - ! EXAMPLE - ! None - ! - ! LITERATURE - ! None - ! - ! HISTORY - !> \author Matthias Zink - !> \date Apr 2013 - ! Modified: - ! Stephan Thober, Nov 2013 - removed fproj dependency - ! David Schaefer, Jun 2015 - refactored the former subroutine CoordSystem - ! Stephan Thober, Sep 2015 - using mask to unpack coordinates - ! Stephan Thober, Oct 2015 - writing full lat/lon again - subroutine geoCoordinates(ibasin, level, lat, lon) - - use mo_global_variables, only : L1_rect_latitude, L1_rect_longitude - - implicit none - - integer(i4), intent(in) :: iBasin - type(gridGeoRef), intent(in) :: level - real(dp), intent(out), allocatable :: lat(:,:), lon(:,:) - integer(i4) :: ncols, nrows - integer(i4) :: ii, pos - - nrows = level%nrows(ibasin) - ncols = level%ncols(ibasin) - - pos = 1 - if ( ibasin .gt. 1 ) then - do ii = 1, ibasin -1 - pos = pos + level%ncols(ii) * level%nrows(ii) - end do - end if - - lat = reshape(L1_rect_latitude(pos:pos+nrows*ncols-1), (/nrows, ncols/)) - lon = reshape(L1_rect_longitude(pos:pos+nrows*ncols-1), (/nrows, ncols/)) - - end subroutine geoCoordinates - !------------------------------------------------------------------ ! NAME ! fluxesUnit @@ -1354,27 +1201,28 @@ end subroutine geoCoordinates !> \date June 2015 function fluxesUnit(ibasin) - use mo_global_variables, only : simPer, NTSTEPDAY, timestep, timeStep_model_outputs + use mo_common_mhm_mrm_variables, only : simPer, timestep, nTstepDay + use mo_global_variables, only : timeStep_model_outputs integer(i4), intent(in) :: ibasin - character(16) :: fluxesUnit - real(dp) :: ntsteps + character(16) :: fluxesUnit + real(dp) :: ntsteps - if (timestep*timestep_model_outputs .eq. 1) then - fluxesUnit = 'mm h-1' + if (timestep * timestep_model_outputs .eq. 1) then + fluxesUnit = 'mm h-1' else if (timestep_model_outputs > 1) then - fluxesUnit = 'mm '//trim(adjustl(num2str(timestep)))//'h-1' + fluxesUnit = 'mm ' // trim(adjustl(num2str(timestep))) // 'h-1' else if (timestep_model_outputs .eq. 0) then - ntsteps = ( simPer(iBasin)%julEnd - simPer(iBasin)%julStart + 1 ) * NTSTEPDAY - fluxesUnit = 'mm '//trim(adjustl(num2str(nint(ntsteps))))//'h-1' + ntsteps = (simPer(iBasin)%julEnd - simPer(iBasin)%julStart + 1) * nTstepDay + fluxesUnit = 'mm ' // trim(adjustl(num2str(nint(ntsteps)))) // 'h-1' else if (timestep_model_outputs .eq. -1) then - fluxesUnit = 'mm d-1' + fluxesUnit = 'mm d-1' else if (timestep_model_outputs .eq. -2) then - fluxesUnit = 'mm month-1' + fluxesUnit = 'mm month-1' else if (timestep_model_outputs .eq. -3) then - fluxesUnit = 'mm a-1' + fluxesUnit = 'mm a-1' else - fluxesUnit = '' + fluxesUnit = '' end if end function fluxesUnit diff --git a/src/mRM/mo_mrm_constants.f90 b/src/mRM/mo_mrm_constants.f90 index 98af5ded..ebab0eea 100644 --- a/src/mRM/mo_mrm_constants.f90 +++ b/src/mRM/mo_mrm_constants.f90 @@ -4,33 +4,22 @@ !> \author Stephan Thober !> \date Aug 2015 module mo_mrm_constants - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none - ! maximum number of outputs (fluxes states) for mHM - integer(i4), public, parameter :: nOutFlxState = 1_i4 ! max. number of outputs to write into a netcdf file + ! maximum number of outputs (fluxes states) for mrM + integer(i4), public, parameter :: nOutFlxState = 1_i4 ! max. number of outputs to write into a netcdf file ! computational - integer(i4), public, parameter :: nodata_i4 = -9999_i4 ! [-] global no data value - real(dp), public, parameter :: nodata_dp = -9999._dp ! [-] global no data value - ! integer(i4), public, parameter :: nRoutingStates = 2 ! Dimension of the auxiliary vectors ! ! which store current and past states of ! ! incoming and outgoing of discharge at ! ! a given node ! ! (1 - past) ! ! (2 - current) - integer(i4), public, parameter :: nColPars = 5_i4 ! number of properties of the global variables #ifdef CYGWIN integer(i4), public, parameter :: maxNoGauges = 50_i4 ! maximal number of gauges allowed #else integer(i4), public, parameter :: maxNoGauges = 200_i4 ! maximal number of gauges allowed #endif - integer(i4), public, parameter :: maxNoBasins = 50_i4 ! maximum number of allowed basins - integer(i4), public, parameter :: maxNLcovers = 50_i4 ! maximum number of allowed LCover scenes - ! temporal - real(dp), public, parameter :: HourSecs = 3600.0_dp ! seconds per hour - ! default inital values for states and fluxes as well as parameter fields - real(dp), public, parameter :: P1_InitStateFluxes = 0.00_dp - ! ! parameters for routing real(dp), public, parameter :: rout_space_weight = 0._dp ! space weighting of routing is set to 0._dp ! ! This parameter has no effect on the routing @@ -42,9 +31,9 @@ module mo_mrm_constants ! timesteps in [s] that can be selected by adaptive time step ! these are multiples of 1 hour and 24 hours real(dp), dimension(19), parameter :: given_TS = & - (/ 60._dp, 120._dp, 180._dp, 240._dp, 300._dp, 360._dp, & - 600._dp, 720._dp, 900._dp, 1200._dp, 1800._dp, 3600._dp, & - 7200._dp, 10800._dp, 14400._dp, 21600._dp, 28800._dp, 43200._dp, & - 86400._dp/) + (/ 60._dp, 120._dp, 180._dp, 240._dp, 300._dp, 360._dp, & + 600._dp, 720._dp, 900._dp, 1200._dp, 1800._dp, 3600._dp, & + 7200._dp, 10800._dp, 14400._dp, 21600._dp, 28800._dp, 43200._dp, & + 86400._dp/) end module mo_mrm_constants diff --git a/src/mRM/mo_mrm_eval.f90 b/src/mRM/mo_mrm_eval.f90 index 45efc010..36efecb5 100644 --- a/src/mRM/mo_mrm_eval.f90 +++ b/src/mRM/mo_mrm_eval.f90 @@ -59,71 +59,73 @@ module mo_mrm_eval !> \author Stephan Thober !> \date Sep 2015 ! Modified, Nov 2016, Stephan Thober - implemented second routing process i.e. adaptive timestep - - subroutine mrm_eval(parameterset, runoff) - - use mo_kind, only: i4, dp - use mo_utils, only: ge - use mo_mrm_global_variables, only: & - nBasins, & - read_restart, & ! flag for reading restart - dirRestartIn, & ! directory containing restart directory - simPer, & ! simulation period - nTStepDay, & ! number of timesteps per day - timestep, & ! simulation timestep in [h] - perform_mpr, & - LCYearId, & ! land cover year id - L1_total_runoff_in, & ! total runoff [mm h-1] - ! INPUT variables for mRM routing ==================================== - L0_LCover_mRM, & ! L0 land cover - L0_floodPlain, & ! flood plains at L0 level - L0_areaCell, & - L1_areaCell, & - L1_L11_ID, & - L11_areaCell, & - L11_aFloodPlain, & ! flood plains at L11 level - L11_length, & ! link length - L11_slope, & - L11_L1_ID, & - L11_netPerm, & ! routing order at L11 - L11_fromN, & ! link source at L11 - L11_toN, & ! link target at L11 - L11_nOutlets, & - basin_mrm, & ! basin_mrm structure - InflowGauge, & - resolutionRouting, & - resolutionHydrology, & - ! INPUT variables for writing output ================================= - outputFlxState_mrm, & ! output Fluxes - warmingDays_mrm, & ! warmingDays for each basin - timeStep_model_outputs_mrm, & - ! INPUT/OUTPUT variables for mRM routing ============================= - L11_TSrout, & ! routing timestep in seconds - L11_C1, & ! first muskingum parameter - L11_C2, & ! second muskigum parameter - L11_qOUT, & ! routed runoff flowing out of L11 cell - L11_qTIN, & ! inflow water into the reach at L11 - L11_qTR, & ! - L11_FracFPimp, & ! fraction of impervious layer at L11 scale - L11_qMod, & - mRM_runoff ! global variable containing runoff for every gauge - use mo_common_variables, only: optimize, processMatrix - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_restart, only: mrm_read_restart_states - use mo_mrm_routing, only: mrm_routing - use mo_mrm_init, only: variables_default_init_routing, mrm_update_param - use mo_mrm_write, only: mrm_write_output_fluxes - use mo_julian, only: caldat, julday - use mo_mrm_constants, only: HourSecs + + subroutine mrm_eval(parameterset, runoff, sm_opti, basin_avg_tws, neutrons_opti, et_opti) + + use mo_kind, only : i4, dp + use mo_utils, only : ge + use mo_message, only : message + use mo_mrm_global_variables, only : & + level11, & + outputFlxState_mrm, & ! output Fluxes + timeStep_model_outputs_mrm, & + L1_total_runoff_in, & ! total runoff [mm h-1] + ! INPUT variables for mRM routing ==================================== + L1_L11_ID, & + L11_length, & ! link length + L11_slope, & + L11_L1_ID, & + L11_netPerm, & ! routing order at L11 + L11_fromN, & ! link source at L11 + L11_toN, & ! link target at L11 + L11_nOutlets, & + basin_mrm, & ! basin_mrm structure + InflowGauge, & + ! INPUT/OUTPUT variables for mRM routing ============================= + L11_TSrout, & ! routing timestep in seconds + L11_C1, & ! first muskingum parameter + L11_C2, & ! second muskigum parameter + L11_qOUT, & ! routed runoff flowing out of L11 cell + L11_qTIN, & ! inflow water into the reach at L11 + L11_qTR, & ! + L11_nLinkFracFPimp, & ! fraction of impervious layer at L11 scale + L11_qMod, & + mRM_runoff ! global variable containing runoff for every gauge + use mo_common_variables, only : processMatrix, & + ! other variables + level1, & + resolutionHydrology, & + nBasins + use mo_common_mHM_mRM_variables, only : & ! + nTStepDay, & ! number of timesteps per day + warmingDays, & ! warmingDays for each basin + simPer, & ! simulation period + LCYearId, & ! land cover year id + optimize, & + dirRestartIn, & ! directory containing restart directory + read_restart, & ! flag for reading restart + timestep, & ! simulation timestep in [h] + resolutionRouting + + use mo_mrm_restart, only : mrm_read_restart_states + use mo_mrm_routing, only : mrm_routing + use mo_mrm_init, only : variables_default_init_routing, mrm_update_param + use mo_mrm_write, only : mrm_write_output_fluxes + use mo_julian, only : caldat, julday + use mo_common_constants, only : HourSecs implicit none ! input variables real(dp), dimension(:), intent(in) :: parameterset - real(dp), dimension(:,:), allocatable, optional, intent(out) :: runoff ! dim1=time dim2=gauge + real(dp), dimension(:, :), allocatable, optional, intent(out) :: runoff ! dim1=time dim2=gauge + real(dp), dimension(:, :), allocatable, optional, intent(out) :: sm_opti ! dim1=ncells, dim2=time + real(dp), dimension(:, :), allocatable, optional, intent(out) :: basin_avg_tws ! dim1=time dim2=nBasins + real(dp), dimension(:, :), allocatable, optional, intent(out) :: neutrons_opti ! dim1=ncells, dim2=time + real(dp), dimension(:, :), allocatable, optional, intent(out) :: et_opti ! dim1=ncells, dim2=time ! local variables - integer(i4) :: ii + integer(i4) :: iBasin integer(i4) :: jj integer(i4) :: tt integer(i4) :: day @@ -132,14 +134,11 @@ subroutine mrm_eval(parameterset, runoff) integer(i4) :: hour integer(i4) :: nTimeSteps integer(i4) :: Lcover_yID ! Land cover year ID - integer(i4) :: s0, e0 ! start and end index at level 0 for current basin integer(i4) :: s1, e1 ! start and end index at level 1 for current basin integer(i4) :: s11, e11 ! start and end index at L11 - integer(i4) :: s110, e110 ! start and end index of L11 at L0 - integer(i4) :: nrows, ncols integer(i4) :: iDischargeTS ! discharge timestep - real(dp) :: tsRoutFactor ! factor between routing and hydrological modelling resolution - real(dp) :: tsRoutFactorIn ! factor between routing and hydrological modelling resolution (temporary variable) + real(dp) :: tsRoutFactor ! factor between routing and hydrological modelling resolution + real(dp) :: tsRoutFactorIn ! factor between routing and hydrological modelling resolution (temporary variable) integer(i4) :: timestep_rout ! timestep of runoff to rout [h] ! ! - identical to timestep of input if ! ! tsRoutFactor is less than 1 @@ -147,217 +146,206 @@ subroutine mrm_eval(parameterset, runoff) ! ! tsRoutFactor is greater than 1 ! real(dp) :: newTime - logical :: do_mpr real(dp), allocatable :: RunToRout(:) ! Runoff that is input for routing real(dp), allocatable :: InflowDischarge(:) ! inflowing discharge - logical, allocatable :: mask11(:,:) - logical :: do_rout ! flag for performing routing + logical, allocatable :: mask11(:, :) + logical :: do_rout ! flag for performing routing + if (present(sm_opti) .or. present(basin_avg_tws) .or. present(neutrons_opti) .or. present(et_opti)) then + call message("Error during initialization of mrm_eval, incorrect call from optimization routine.") + stop 1 + end if if (.not. read_restart) then - !------------------------------------------- - ! L11 ROUTING STATE VARIABLES, FLUXES AND - ! PARAMETERS - !------------------------------------------- - call variables_default_init_routing() + !------------------------------------------- + ! L11 ROUTING STATE VARIABLES, FLUXES AND + ! PARAMETERS + !------------------------------------------- + call variables_default_init_routing() end if - if (.not. perform_mpr) stop 'MPR cannot be skipped at the moment' - ! ---------------------------------------- ! initialize factor between routing resolution and hydrologic model resolution ! ---------------------------------------- tsRoutFactor = 1_i4 - allocate(InflowDischarge(size(InflowGauge%Q, dim=2))) + allocate(InflowDischarge(size(InflowGauge%Q, dim = 2))) InflowDischarge = 0._dp ! ---------------------------------------- ! loop over basins ! ---------------------------------------- - do ii = 1, nBasins - ! read states from restart - if (read_restart) call mrm_read_restart_states(ii, dirRestartIn(ii)) - ! - ! get basin information at L11 and L110 if routing is activated - call get_basin_info_mrm(ii, 0, nrows, ncols, iStart=s0, iEnd=e0 ) - call get_basin_info_mrm(ii, 1, nrows, ncols, iStart=s1, iEnd=e1 ) - call get_basin_info_mrm(ii, 11, nrows, ncols, iStart=s11, iEnd=e11, mask=mask11 ) - call get_basin_info_mrm(ii, 110, nrows, ncols, iStart=s110, iEnd=e110) - ! - ! initialize routing parameters (has to be called only for Routing option 2) - if (processMatrix(8, 1) .eq. 2) call mrm_update_param(ii, & - parameterset(processMatrix(8,3) - processMatrix(8,2) + 1:processMatrix(8,3))) - ! calculate NtimeSteps for this basin - nTimeSteps = (simPer(ii)%julEnd - simPer(ii)%julStart + 1) * NTSTEPDAY - ! initialize timestep - newTime = real(simPer(ii)%julStart,dp) - ! initialize land cover year id - Lcover_yID = 0 - ! initialize variable for runoff for routing - allocate(RunToRout(e1 - s1 + 1)) - RunToRout = 0._dp - ! ---------------------------------------- - ! loop over time - ! ---------------------------------------- - hour = -timestep - do tt = 1, nTimeSteps - ! set discharge timestep - iDischargeTS = ceiling(real(tt,dp) / real(NTSTEPDAY,dp)) - ! calculate current timestep - call caldat(int(newTime), yy=year, mm=month, dd=day) - ! ------------------------------------------------------------------- - ! PERFORM ROUTING - ! ------------------------------------------------------------------- + do iBasin = 1, nBasins + ! read states from restart + if (read_restart) call mrm_read_restart_states(iBasin, dirRestartIn(iBasin)) + ! + ! get basin information at L11 and L1 if routing is activated + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + s11 = level11(iBasin)%iEnd + e11 = level11(iBasin)%iEnd + mask11 = level11(iBasin)%mask + ! + ! initialize routing parameters (has to be called only for Routing option 2) + if (processMatrix(8, 1) .eq. 2) call mrm_update_param(iBasin, & + parameterset(processMatrix(8, 3) - processMatrix(8, 2) + 1 : processMatrix(8, 3))) + ! calculate NtimeSteps for this basin + nTimeSteps = (simPer(iBasin)%julEnd - simPer(iBasin)%julStart + 1) * NTSTEPDAY + ! initialize timestep + newTime = real(simPer(iBasin)%julStart, dp) + ! initialize variable for runoff for routing + allocate(RunToRout(e1 - s1 + 1)) + RunToRout = 0._dp + ! ---------------------------------------- + ! loop over time + ! ---------------------------------------- + hour = -timestep + do tt = 1, nTimeSteps + ! set discharge timestep + iDischargeTS = ceiling(real(tt, dp) / real(NTSTEPDAY, dp)) + ! calculate current timestep + call caldat(int(newTime), yy = year, mm = month, dd = day) + ! initialize land cover year id + Lcover_yID = LCyearId(year, iBasin) + ! + ! ------------------------------------------------------------------- + ! PERFORM ROUTING + ! ------------------------------------------------------------------- + ! + ! set input variables for routing + if (processMatrix(8, 1) .eq. 1) then + ! >>> + ! >>> original Muskingum routing, executed every time + ! >>> + ! + do_rout = .True. + L11_tsRout(iBasin) = (timestep * HourSecs) + tsRoutFactorIn = 1._dp + timestep_rout = timestep + RunToRout = L1_total_runoff_in(s1 : e1, tt) ! runoff [mm TST-1] mm per timestep + InflowDischarge = InflowGauge%Q(iDischargeTS, :) ! inflow discharge in [m3 s-1] ! - ! set input variables for routing - if (processMatrix(8, 1) .eq. 1) then - ! >>> - ! >>> original Muskingum routing, executed every time - ! >>> - ! - ! determine whether mpr is to be executed - if( ( LCyearId(year,ii) .NE. Lcover_yId) .or. (tt .EQ. 1) ) then - do_mpr = perform_mpr - Lcover_yID = LCyearId(year, ii) - else - do_mpr = .false. - end if - ! - do_rout = .True. - L11_tsRout(ii) = (timestep * HourSecs) - tsRoutFactorIn = 1._dp - timestep_rout = timestep - RunToRout = L1_total_runoff_in(s1:e1, tt) ! runoff [mm TST-1] mm per timestep - InflowDischarge = InflowGauge%Q(iDischargeTS,:) ! inflow discharge in [m3 s-1] - ! - else if (processMatrix(8, 1) .eq. 2) then - ! >>> - ! >>> adaptive timestep - ! >>> - ! - ! set dummy lcover_yID - Lcover_yID = 1_i4 - ! - do_rout = .False. - ! calculate factor - tsRoutFactor = L11_tsRout(ii) / (timestep * HourSecs) - ! print *, 'routing factor: ', tsRoutFactor - ! prepare routing call - if (tsRoutFactor .lt. 1._dp) then - ! ---------------------------------------------------------------- - ! routing timesteps are shorter than hydrologic time steps - ! ---------------------------------------------------------------- - ! set all input variables - tsRoutFactorIn = tsRoutFactor - RunToRout = L1_total_runoff_in(s1:e1, tt) ! runoff [mm TST-1] mm per timestep - InflowDischarge = InflowGauge%Q(iDischargeTS,:) ! inflow discharge in [m3 s-1] - timestep_rout = timestep - do_rout = .True. - else - ! ---------------------------------------------------------------- - ! routing timesteps are longer than hydrologic time steps - ! ---------------------------------------------------------------- - ! set all input variables - tsRoutFactorIn = tsRoutFactor - RunToRout = RunToRout + L1_total_runoff_in(s1:e1, tt) - InflowDischarge = InflowDischarge + InflowGauge%Q(iDischargeTS, :) - ! reset tsRoutFactorIn if last period did not cover full period - if ((tt .eq. nTimeSteps) .and. (mod(tt, nint(tsRoutFactorIn)) .ne. 0_i4)) & - tsRoutFactorIn = mod(tt, nint(tsRoutFactorIn)) - if ((mod(tt, nint(tsRoutFactorIn)) .eq. 0_i4) .or. (tt .eq. nTimeSteps)) then - InflowDischarge = InflowDischarge / tsRoutFactorIn - timestep_rout = nint(real(timestep,dp) * tsRoutFactor) - do_rout = .True. - end if - end if + else if (processMatrix(8, 1) .eq. 2_i4) then + ! >>> + ! >>> adaptive timestep + ! >>> + ! + do_rout = .False. + ! calculate factor + tsRoutFactor = L11_tsRout(iBasin) / (timestep * HourSecs) + ! print *, 'routing factor: ', tsRoutFactor + ! prepare routing call + if (tsRoutFactor .lt. 1._dp) then + ! ---------------------------------------------------------------- + ! routing timesteps are shorter than hydrologic time steps + ! ---------------------------------------------------------------- + ! set all input variables + tsRoutFactorIn = tsRoutFactor + RunToRout = L1_total_runoff_in(s1 : e1, tt) ! runoff [mm TST-1] mm per timestep + InflowDischarge = InflowGauge%Q(iDischargeTS, :) ! inflow discharge in [m3 s-1] + timestep_rout = timestep + do_rout = .True. + else + ! ---------------------------------------------------------------- + ! routing timesteps are longer than hydrologic time steps + ! ---------------------------------------------------------------- + ! set all input variables + tsRoutFactorIn = tsRoutFactor + RunToRout = RunToRout + L1_total_runoff_in(s1 : e1, tt) + InflowDischarge = InflowDischarge + InflowGauge%Q(iDischargeTS, :) + ! reset tsRoutFactorIn if last period did not cover full period + if ((tt .eq. nTimeSteps) .and. (mod(tt, nint(tsRoutFactorIn)) .ne. 0_i4)) & + tsRoutFactorIn = mod(tt, nint(tsRoutFactorIn)) + if ((mod(tt, nint(tsRoutFactorIn)) .eq. 0_i4) .or. (tt .eq. nTimeSteps)) then + InflowDischarge = InflowDischarge / tsRoutFactorIn + timestep_rout = nint(real(timestep, dp) * tsRoutFactor) + do_rout = .True. + end if end if - ! ------------------------------------------------------------------- - ! execute routing - ! ------------------------------------------------------------------- - if (do_rout) call mRM_routing( & - ! general INPUT variables - processMatrix(8, 1), & ! parse process Case to be used - parameterset, & ! routing par. - RunToRout, & ! runoff [mm TST-1] mm per timestep old: L1_total_runoff_in(s1:e1, tt), & - L1_areaCell(s1:e1), & - L1_L11_Id(s1:e1), & - L11_areaCell(s11:e11), & - L11_L1_Id(s11:e11), & - L11_netPerm(s11:e11), & ! routing order at L11 - L11_fromN(s11:e11), & ! link source at L11 - L11_toN(s11:e11), & ! link target at L11 - L11_nOutlets(ii), & ! number of outlets - timestep_rout, & ! timestep of runoff to rout [h] - tsRoutFactorIn, & ! Factor between routing and hydrologic resolution - basin_mrm%L11_iEnd(ii) - basin_mrm%L11_iStart(ii) + 1, & ! number of Nodes - basin_mrm%nInflowGauges(ii), & - basin_mrm%InflowGaugeIndexList(ii,:), & - basin_mrm%InflowGaugeHeadwater(ii,:), & - basin_mrm%InflowGaugeNodeList(ii,:), & - InflowDischarge, & - basin_mrm%nGauges(ii), & - basin_mrm%gaugeIndexList(ii,:), & - basin_mrm%gaugeNodeList(ii,:), & - ge(resolutionRouting(ii), resolutionHydrology(ii)), & - ! original routing specific input variables - L0_LCover_mRM(s0:e0, Lcover_yID), & ! L0 land cover - L0_floodPlain(s110:e110), & ! flood plains at L0 level - L0_areaCell(s0:e0), & - L11_aFloodPlain(s11:e11), & ! flood plains at L11 level - L11_length(s11:e11 - 1), & ! link length - L11_slope(s11:e11 - 1), & - ! general INPUT/OUTPUT variables - L11_C1(s11:e11), & ! first muskingum parameter - L11_C2(s11:e11), & ! second muskigum parameter - L11_qOUT(s11:e11), & ! routed runoff flowing out of L11 cell - L11_qTIN(s11:e11,:), & ! inflow water into the reach at L11 - L11_qTR(s11:e11,:), & ! - L11_qMod(s11:e11), & - mRM_runoff(tt, :), & - ! original routing specific input/output variables - L11_FracFPimp(s11:e11), & ! fraction of impervious layer at L11 scale - ! OPTIONAL INPUT variables - do_mpr) - ! ------------------------------------------------------------------- - ! reset variables - ! ------------------------------------------------------------------- - if (processMatrix(8, 1) .eq. 1) then - ! reset Input variables - InflowDischarge = 0._dp - RunToRout = 0._dp - else if (processMatrix(8, 1) .eq. 2) then - if ((.not. (tsRoutFactorIn .lt. 1._dp)) .and. do_rout) then - do jj = 1, nint(tsRoutFactorIn) - mRM_runoff(tt - jj + 1, :) = mRM_runoff(tt, :) - end do - ! reset Input variables - InflowDischarge = 0._dp - RunToRout = 0._dp - end if + end if + ! ------------------------------------------------------------------- + ! execute routing + ! ------------------------------------------------------------------- + if (do_rout) call mRM_routing(& + ! general INPUT variables + read_restart, & + processMatrix(8, 1), & ! parse process Case to be used + parameterset, & ! routing par. + RunToRout, & ! runoff [mm TST-1] mm per timestep old: L1_total_runoff_in(s1:e1, tt), & + level1(iBasin)%CellArea * 1.E-6_dp, & + L1_L11_Id(s1 : e1), & + level11(iBasin)%CellArea * 1.E-6_dp, & + L11_L1_Id(s11 : e11), & + L11_netPerm(s11 : e11), & ! routing order at L11 + L11_fromN(s11 : e11), & ! link source at L11 + L11_toN(s11 : e11), & ! link target at L11 + L11_nOutlets(iBasin), & ! number of outlets + timestep_rout, & ! timestep of runoff to rout [h] + tsRoutFactorIn, & ! Factor between routing and hydrologic resolution + level11(iBasin)%nCells, & ! number of Nodes + basin_mrm(iBasin)%nInflowGauges, & + basin_mrm(iBasin)%InflowGaugeIndexList(:), & + basin_mrm(iBasin)%InflowGaugeHeadwater(:), & + basin_mrm(iBasin)%InflowGaugeNodeList(:), & + InflowDischarge, & + basin_mrm(iBasin)%nGauges, & + basin_mrm(iBasin)%gaugeIndexList(:), & + basin_mrm(iBasin)%gaugeNodeList(:), & + ge(resolutionRouting(iBasin), resolutionHydrology(iBasin)), & + ! original routing specific input variables + L11_length(s11 : e11 - 1), & ! link length + L11_slope(s11 : e11 - 1), & + L11_nLinkFracFPimp(s11 : e11, Lcover_yID), & ! fraction of impervious layer at L11 scale + ! general INPUT/OUTPUT variables + L11_C1(s11 : e11), & ! first muskingum parameter + L11_C2(s11 : e11), & ! second muskigum parameter + L11_qOUT(s11 : e11), & ! routed runoff flowing out of L11 cell + L11_qTIN(s11 : e11, :), & ! inflow water into the reach at L11 + L11_qTR(s11 : e11, :), & ! + L11_qMod(s11 : e11), & + mRM_runoff(tt, :) & + ) + ! ------------------------------------------------------------------- + ! reset variables + ! ------------------------------------------------------------------- + if (processMatrix(8, 1) .eq. 1) then + ! reset Input variables + InflowDischarge = 0._dp + RunToRout = 0._dp + else if (processMatrix(8, 1) .eq. 2) then + if ((.not. (tsRoutFactorIn .lt. 1._dp)) .and. do_rout) then + do jj = 1, nint(tsRoutFactorIn) + mRM_runoff(tt - jj + 1, :) = mRM_runoff(tt, :) + end do + ! reset Input variables + InflowDischarge = 0._dp + RunToRout = 0._dp end if - ! ------------------------------------------------------------------- - ! INCREMENT TIME - ! ------------------------------------------------------------------- - hour = mod(hour+timestep, 24) - newTime = julday(day,month,year) + real(hour+timestep,dp)/24._dp - ! ------------------------------------------------------------------- - ! WRITE OUTPUT - ! ------------------------------------------------------------------- - if (.not. optimize .and. any(outputFlxState_mrm)) then - call mrm_write_output_fluxes( & + end if + ! ------------------------------------------------------------------- + ! INCREMENT TIME + ! ------------------------------------------------------------------- + hour = mod(hour + timestep, 24) + newTime = julday(day, month, year) + real(hour + timestep, dp) / 24._dp + ! ------------------------------------------------------------------- + ! WRITE OUTPUT + ! ------------------------------------------------------------------- + if (.not. optimize .and. any(outputFlxState_mrm)) then + call mrm_write_output_fluxes(& ! basin id - ii, & + iBasin, & + ! nCells in basin + level11(iBasin)%nCells, & ! output specification timeStep_model_outputs_mrm, & ! time specification - warmingDays_mrm(ii), newTime, nTimeSteps, nTStepDay, & + warmingDays(iBasin), newTime, nTimeSteps, nTStepDay, & tt, day, month, year, timestep, & ! mask specification mask11, & ! output variables - L11_qmod(s11:e11)) - end if - end do - ! clean runoff variable - deallocate(RunToRout) + L11_qmod(s11 : e11)) + end if + end do + ! clean runoff variable + deallocate(RunToRout) end do ! ========================================================================= diff --git a/src/mRM/mo_mrm_file.f90 b/src/mRM/mo_mrm_file.f90 index 7f831f0d..7377bfb4 100644 --- a/src/mRM/mo_mrm_file.f90 +++ b/src/mRM/mo_mrm_file.f90 @@ -10,73 +10,56 @@ MODULE mo_mrm_file IMPLICIT NONE - + !> Current mHM model version - CHARACTER(len=*), PARAMETER :: version = '1.1' ! Version + CHARACTER(len = *), PARAMETER :: version = '1.1' ! Version !> Time of current mHM model version release - CHARACTER(len=*), PARAMETER :: version_date = 'Nov 2016' ! Release date + CHARACTER(len = *), PARAMETER :: version_date = 'Nov 2016' ! Release date !> Driver file - CHARACTER(len=*), PARAMETER :: file_main = 'mrm_driver.f90' ! Driver + CHARACTER(len = *), PARAMETER :: file_main = 'mrm_driver.f90' ! Driver !> Namelist file name - CHARACTER(len=*), PARAMETER :: file_namelist_mrm = 'mhm.nml' ! Namelist + CHARACTER(len = *), PARAMETER :: file_namelist_mrm = 'mrm.nml' ! Namelist !> Unit for namelist - INTEGER, PARAMETER :: unamelist_mrm = 40 ! set different from mhm + INTEGER, PARAMETER :: unamelist_mrm = 40 ! set different from mhm !> Parameter namelists file name - CHARACTER(len=*), PARAMETER :: file_namelist_param_mrm = 'mhm_parameter.nml' ! Parameter namelists + CHARACTER(len = *), PARAMETER :: file_namelist_param_mrm = 'mrm_parameter.nml' ! Parameter namelists !> Unit for namelist - INTEGER, PARAMETER :: unamelist_param = 41 ! set different from mhm + INTEGER, PARAMETER :: unamelist_param_mrm = 41 ! set different from mhm - !> DEM input data file - CHARACTER(len=*), PARAMETER :: file_dem = 'dem.asc' ! DEM - !> Unit for DEM input data file - INTEGER, PARAMETER :: udem = 53 ! - !> flow accumulation input data file - CHARACTER(len=*), PARAMETER :: file_facc = 'facc.asc' ! flow accumulation + CHARACTER(len = *), PARAMETER :: file_facc = 'facc.asc' ! flow accumulation !> Unit for flow accumulation input data file - INTEGER, PARAMETER :: ufacc = 56 ! + INTEGER, PARAMETER :: ufacc = 56 ! !> flow direction input data file - CHARACTER(len=*), PARAMETER :: file_fdir = 'fdir.asc' ! flow direction + CHARACTER(len = *), PARAMETER :: file_fdir = 'fdir.asc' ! flow direction !> Unit for flow direction input data file - INTEGER, PARAMETER :: ufdir = 57 ! - !> Unit for LCover input data file - INTEGER, PARAMETER :: ulcoverclass = 61 ! + INTEGER, PARAMETER :: ufdir = 57 ! !> gauge location input data file - CHARACTER(len=*), PARAMETER :: file_gaugeloc = 'idgauges.asc' ! gauge location + CHARACTER(len = *), PARAMETER :: file_gaugeloc = 'idgauges.asc' ! gauge location !> Unit for gauge location input data file - INTEGER, PARAMETER :: ugaugeloc = 62 ! + INTEGER, PARAMETER :: ugaugeloc = 62 ! !> unit for discharge time series - INTEGER, PARAMETER :: udischarge = 66 ! + INTEGER, PARAMETER :: udischarge = 66 ! !> file defining mRM's outputs - CHARACTER(len=*), PARAMETER :: file_defOutput = 'mrm_outputs.nml' ! output states and fluxes + CHARACTER(len = *), PARAMETER :: file_defOutput = 'mrm_outputs.nml' ! output states and fluxes !> Unit for file defining mRM's outputs - INTEGER, PARAMETER :: udefOutput = 67 ! + INTEGER, PARAMETER :: udefOutput = 67 ! !> file defining mHM's outputs - CHARACTER(len=*), PARAMETER :: file_config = 'ConfigFile.log' ! configuration + CHARACTER(len = *), PARAMETER :: file_config = 'ConfigFile.log' ! configuration !> Unit for file defining mHM's outputs - INTEGER, PARAMETER :: uconfig = 68 ! - - !> file defining optimization outputs (objective and p arameter set) - CHARACTER(len=*), PARAMETER :: file_opti = 'FinalParam.out' ! final parameters & objective - !> Unit for file optimization outputs (objective and p arameter set) - INTEGER, PARAMETER :: uopti = 72 ! - !> file defining optimization outputs in a namelist fo rmat (parameter set) - CHARACTER(len=*), PARAMETER :: file_opti_nml = 'FinalParam.nml' ! final parameters - !> Unit for file optimization outputs in a namelist fo rmat (parameter set) - INTEGER, PARAMETER :: uopti_nml = 73 ! + INTEGER, PARAMETER :: uconfig = 68 ! !> file defining optimazation outputs - CHARACTER(len=*), PARAMETER :: file_daily_discharge = 'daily_discharge.out' ! daily discharge file + CHARACTER(len = *), PARAMETER :: file_daily_discharge = 'daily_discharge.out' ! daily discharge file !> Unit for file optimazation outputs - INTEGER, PARAMETER :: udaily_discharge = 74 ! + INTEGER, PARAMETER :: udaily_discharge = 74 ! !> file defining optimazation outputs - CHARACTER(len=*), PARAMETER :: ncfile_discharge = 'discharge.nc' ! discharge file as netcdf + CHARACTER(len = *), PARAMETER :: ncfile_discharge = 'discharge.nc' ! discharge file as netcdf !> file containing mrm output - character(len=*), PARAMETER :: file_mrm_output = 'mRM_Fluxes_States.nc' - + character(len = *), PARAMETER :: file_mrm_output = 'mRM_Fluxes_States.nc' END MODULE mo_mrm_file diff --git a/src/mRM/mo_mrm_global_variables.f90 b/src/mRM/mo_mrm_global_variables.f90 index dd285293..6c23cc3b 100644 --- a/src/mRM/mo_mrm_global_variables.f90 +++ b/src/mRM/mo_mrm_global_variables.f90 @@ -6,100 +6,55 @@ !> \authors Luis Samaniego, Stephan Thober !> \date Aug 2015 +! Modified Robert Schweppe, Dec 2017 - merged duplicated variables with mhm into common variables module mo_mrm_global_variables - - use mo_kind, only: i4, i8, dp - use mo_mrm_constants, only: nOutFlxState - use mo_common_variables, only: period - + + use mo_kind, only : i4, i8, dp + use mo_mrm_constants, only : nOutFlxState + use mo_common_variables, only : Grid, GridRemapper + implicit none - + PUBLIC :: gaugingStation ! ------------------------------------------------------------------- ! General variables ! ------------------------------------------------------------------- - integer(i4) :: mrm_coupling_mode ! 0 = stand alone - ! ! 1 = general coupling to a model - ! ! 2 = specific coupling to mhm logical :: is_start ! flag for first timestep for mpr ! ------------------------------------------------------------------- - ! PROJECT DESCRIPTION for the NETCDF output file + ! DEFINE OUTPUTS ! ------------------------------------------------------------------- - character(1024),public :: project_details ! project including funding instituion., PI, etc. - character(1024),public :: setup_description ! any specific description of simulation - character(1024),public :: simulation_type ! e.g. seasonal forecast, climate projection, ... - character(256),public :: Conventions ! convention used for dataset - character(1024),public :: contact ! contact details, incl. PI name - character(1024),public :: mHM_details ! developing institution, specific mHM revision - character(1024),public :: history ! details on version/creation date + ! + integer(i4) :: timeStep_model_outputs_mrm ! timestep for writing model outputs - ! ------------------------------------------------------------------- - ! INPUT variables for configuration of mRM - ! ------------------------------------------------------------------- - integer(i4), public :: timeStep ! [h] simulation time step (= TS) in [h] - integer(i4), allocatable, public :: timeStep_model_inputs(:) ! frequency for reading meteo input - integer(i4), public :: iFlag_cordinate_sys ! options model for the run cordinate system - integer(i4), allocatable, public :: L0_Basin(:) - real(dp), allocatable, public :: resolutionRouting(:) ! [m or degree] resolution of routing - Level 11 - real(dp), allocatable, public :: resolutionHydrology(:) ! [m or degree] resolution of routing - Level 11 - logical, public :: read_restart ! flag - logical, public :: write_restart ! flag - logical, public :: perform_mpr ! switch for performing multiscale parameter regionalization + logical, dimension(nOutFlxState) :: outputFlxState_mrm ! Define model outputs see "mhm_outputs.nml" + ! dim1 = number of output variables to be written ! ------------------------------------------------------------------ ! DIRECTORIES ! ------------------------------------------------------------------ ! has the dimension of nBasins - character(256), public :: dirConfigOut - character(256), public :: dirCommonFiles ! directory where common input files should be located - character(256), dimension(:), allocatable, public :: dirMorpho ! Directory where morphological files are located - character(256), dimension(:), allocatable, public :: dirLCover ! Directory where land cover files are located character(256), dimension(:), allocatable, public :: dirGauges ! Directory where discharge files are located character(256), dimension(:), allocatable, public :: dirTotalRunoff ! Directory where simulated total runoff files are located - character(256), dimension(:), allocatable, public :: dirOut ! Directory where output is written to - character(256), dimension(:), allocatable, public :: dirRestartOut ! Directory where output of restart is written - character(256), dimension(:), allocatable, public :: dirRestartIn! Directory where input of restart is read from - character(256), dimension(:), allocatable, public :: fileLatLon ! Directory where the Lat Lon Files are located + character(256), public :: filenameTotalRunoff ! Filename of simulated total runoff file + character(256), public :: varnameTotalRunoff ! variable name of total runoff - character(256), public :: filenameTotalRunoff ! Filename of simulated total runoff file - character(256), public :: varnameTotalRunoff ! variable name of total runoff - - ! ------------------------------------------------------------------ - ! CONSTANT - ! ------------------------------------------------------------------ - integer(i4), public :: nTstepDay ! Number of time intervals per day - ! ! (was previously NAGG) ! ------------------------------------------------------------------- ! GRID description ! ------------------------------------------------------------------- - type gridGeoRef - ! dim1=basin id - integer(i4), dimension(:), allocatable :: ncols ! Number of columns - integer(i4), dimension(:), allocatable :: nrows ! Number of rows - real(dp), dimension(:), allocatable :: xllcorner ! x coordinate of the lowerleft corner - real(dp), dimension(:), allocatable :: yllcorner ! y coordinate of the lowerleft corner - real(dp), dimension(:), allocatable :: cellsize ! Cellsize x = cellsize y - real(dp), dimension(:), allocatable :: nodata_value ! Code to define the mask - end type gridGeoRef - type(gridGeoRef), public :: level0 ! grid information at morphological level (e.g., dem, fDir) - type(gridGeoRef), public :: level1 ! grid information at runoff level - type(gridGeoRef), public :: level11 ! Reference of the routing variables - type(gridGeoRef), public :: level110 ! Reference of the routing variables at L0 scale (e.g., L0_floodPlain) - ! - real(dp), dimension(:), allocatable, public :: L0_longitude ! 1d longitude array - real(dp), dimension(:), allocatable, public :: L0_latitude ! 1d latitude array - real(dp), dimension(:), allocatable, public :: L11_rect_longitude ! 1d longitude array for whole basin rectangle - real(dp), dimension(:), allocatable, public :: L11_rect_latitude ! 1d latitude array for whole basin rectangle + type(Grid), dimension(:), allocatable, target, public :: level11 ! Reference of the routing variables + type(GridRemapper), dimension(:), allocatable, public :: l0_l11_remap ! grid information at runoff level + type(GridRemapper), dimension(:), allocatable, public :: l1_l11_remap ! grid information at runoff level + ! ----------------------------------------------------------------- ! RUNOFF variable ! ----------------------------------------------------------------- - real(dp), dimension(:,:), allocatable, public :: mRM_runoff ! variable containing runoff for each basin and gauge - + real(dp), dimension(:, :), allocatable, public :: mRM_runoff ! variable containing runoff for each basin and gauge + ! ----------------------------------------------------------------- ! GAUGED station data ! ----------------------------------------------------------------- @@ -108,158 +63,82 @@ module mo_mrm_global_variables integer(i4), public :: nMeasPerDay ! Number of observations per day, ! ! e.g. 24 -> hourly discharge, 1 -> daily discharge type gaugingStation - integer(i4), dimension(:), allocatable :: basinId ! Basin Id - integer(i4), dimension(:), allocatable :: gaugeId ! Gauge Id (e.g. 0000444) - character(256), dimension(:), allocatable :: fname ! Name runoff file - real(dp), dimension(:,:), allocatable :: Q ! [m3 s-1] observed daily mean discharge (simPer) - ! ! dim1=number observations, dim2=number of gauges + integer(i4), dimension(:), allocatable :: basinId ! Basin Id + integer(i4), dimension(:), allocatable :: gaugeId ! Gauge Id (e.g. 0000444) + character(256), dimension(:), allocatable :: fname ! Name runoff file + real(dp), dimension(:, :), allocatable :: Q ! [m3 s-1] observed daily mean discharge (simPer) + ! ! dim1=number observations, dim2=number of gauges end type gaugingStation type(gaugingStation), public :: gauge ! Gauging station information type(gaugingStation), public :: InflowGauge ! inflow gauge information - ! ----------------------------------------------------------------- - ! LAND COVER DATA - ! ----------------------------------------------------------------- - ! Land cover information - real(dp), public :: fracSealed_cityArea ! fraction of area within city assumed to be - ! ! perfectly sealed [0-1] - integer(i4), public :: nLCoverScene ! Number of land cover scene - character(256), public, dimension(:), allocatable :: LCfilename ! file names for the different land cover scenes - integer(i4), public, dimension(:,:), allocatable :: LCyearId ! Mapping of landcover scenes (1, 2,..) for each basin - - ! ------------------------------------------------------------------- - ! PERIOD description - ! ------------------------------------------------------------------- - type(period), dimension(:), allocatable, public :: warmPer ! time period for warming - type(period), dimension(:), allocatable, public :: evalPer ! time period for model evaluation - type(period), dimension(:), allocatable, public :: simPer ! warmPer + evalPer - type(period), dimension(:), allocatable, public :: readPer ! start and end dates of read period - integer(i4), dimension(:), allocatable, public :: warmingDays_mrm ! number of days for warm up period - ! ------------------------------------------------------------------- ! BASIN general description ! ------------------------------------------------------------------- - integer(i4), public :: nBasins ! Number of basins for multi-basin optimization - type basinInfo - ! dim1 = basin id - ! dim2 = maximum number of gauges in a given basin - ! discharge measurement gauges - integer(i4), dimension(:), allocatable :: nGauges ! Number of gauges within a basin - integer(i4), dimension(:,:), allocatable :: gaugeIdList ! Gauge Id list (e.g. 0000444 0000445) - integer(i4), dimension(:,:), allocatable :: gaugeIndexList ! Gauge index list (e.g. 1 for 00444, 2 for 00445) - integer(i4), dimension(:,:), allocatable :: gaugeNodeList ! Gauge node list at L11 - - ! discharge inflow gauges (e.g if headwar bsins are missing) - integer(i4), dimension(:), allocatable :: nInflowGauges ! Number of gauges within a basin - integer(i4), dimension(:,:), allocatable :: InflowGaugeIdList ! Gauge Id list (e.g. 0000444 0000445) - integer(i4), dimension(:,:), allocatable :: InflowGaugeIndexList ! Gauge index list (e.g. 1 for 00444, 2 for 00445) - integer(i4), dimension(:,:), allocatable :: InflowGaugeNodeList ! Gauge node list at L11 - logical, dimension(:,:), allocatable :: InflowGaugeHeadwater ! if headwater cells of inflow gauge will be considered - - ! basin outlet - integer(i4), dimension(:), allocatable :: L0_Noutlet - integer(i4), dimension(:,:), allocatable :: L0_rowOutlet ! Outlet locations in L0 - integer(i4), dimension(:,:), allocatable :: L0_colOutlet ! Outlet locations in L0 - - ! for remapping - integer(i4), dimension(:), allocatable :: L0_iStart ! Starting cell index of a given basin at L0 - integer(i4), dimension(:), allocatable :: L0_iEnd ! Ending cell index of a given basin at L0 - integer(i4), dimension(:), allocatable :: L0_iStartMask ! Starting cell index of mask a given basin at L0 - integer(i4), dimension(:), allocatable :: L0_iEndMask ! Ending cell index of mask a given basin at L0 - logical, dimension(:), pointer :: L0_mask ! Mask of level0 based on DEM - - integer(i4), dimension(:), allocatable :: L1_iStart ! Starting cell index of a given basin at L1 - integer(i4), dimension(:), allocatable :: L1_iEnd ! Ending cell index of a given basin at L1 - integer(i4), dimension(:), allocatable :: L1_iStartMask ! Starting cell index of mask a given basin at L1 - integer(i4), dimension(:), allocatable :: L1_iEndMask ! Ending cell index of mask a given basin at L1 - logical, dimension(:), allocatable :: L1_mask ! Mask of level1 - - integer(i4), dimension(:), allocatable :: L11_iStart ! Sarting cell index of a given basin at L11 = node - integer(i4), dimension(:), allocatable :: L11_iEnd ! Ending cell index of a given basin at L11 = node - integer(i4), dimension(:), allocatable :: L11_iStartMask ! Starting cell index of mask a given basin at L11 - integer(i4), dimension(:), allocatable :: L11_iEndMask ! Ending cell index of mask a given basin at L11 - logical, dimension(:), allocatable :: L11_mask ! Mask of level11 - - integer(i4), dimension(:), allocatable :: L110_iStart ! Sarting cell index of L0_floodPlain - ! ! at a given basin at L110 = node - integer(i4), dimension(:), allocatable :: L110_iEnd ! Ending cell index of L0_floodPlain - ! ! at a given basin at L110 = node - end type basinInfo - type(basinInfo), public :: basin_mrm ! Basin structure - logical, dimension(:), allocatable, target :: L0_mask_mRM ! global target variable in case mRM is not used to mHM - - ! ------------------------------------------------------------------- - ! L0 DOMAIN description -> + type basinInfo_mRM + ! dim1 = maximum number of gauges in a given basin + ! discharge measurement gauges + integer(i4) :: nGauges ! Number of gauges within a basin + integer(i4), dimension(:), allocatable :: gaugeIdList ! Gauge Id list (e.g. 0000444 0000445) + integer(i4), dimension(:), allocatable :: gaugeIndexList ! Gauge index list (e.g. 1 for 00444, 2 for 00445) + integer(i4), dimension(:), allocatable :: gaugeNodeList ! Gauge node list at L11 + + ! discharge inflow gauges (e.g if headwar bsins are missing) + integer(i4) :: nInflowGauges ! Number of gauges within a basin + integer(i4), dimension(:), allocatable :: InflowGaugeIdList ! Gauge Id list (e.g. 0000444 0000445) + integer(i4), dimension(:), allocatable :: InflowGaugeIndexList ! Gauge index list (e.g. 1 for 00444, 2 for 00445) + integer(i4), dimension(:), allocatable :: InflowGaugeNodeList ! Gauge node list at L11 + logical, dimension(:), allocatable :: InflowGaugeHeadwater ! if headwater cells of inflow gauge will be considered + + ! basin outlet + ! TODO: move this out of here since it is mrm_net_startup relevant only for domain0 + integer(i4) :: L0_Noutlet + integer(i4), dimension(:), allocatable :: L0_rowOutlet ! Outlet locations in L0 + integer(i4), dimension(:), allocatable :: L0_colOutlet ! Outlet locations in L0 + end type basinInfo_mRM + + ! dim1 = basinId + type(basinInfo_mRM), dimension(:), allocatable, public, target :: basin_mrm ! Basin structure + ! ------------------------------------------------------------------- + ! L0 DOMAIN description -> those are needed within the mrm_net_startup routines only + ! TODO: deallocate when net_startup is done ! ------------------------------------------------------------------- ! dim1 = number grid cells ! input data - morphological variables - real(dp), public, dimension(:), allocatable, target :: L0_elev_read ! only read if not coupled to mhm - real(dp), public, dimension(:), pointer :: L0_elev_mRM ! [m] Elevation (sinks removed) variable used for routing - integer(i4), public, dimension(:), allocatable :: L0_fAcc ! Flow accumulation - integer(i4), public, dimension(:), allocatable :: L0_fDir ! Flow direction (standard ArcGIS) - integer(i4), public, dimension(:,:), pointer :: L0_LCover_mRM ! Normal landcover id (upto 3 classes) - ! ! dim1=number grid cells, dim2=Number of land cover scenes - integer(i4), public, dimension(:,:), allocatable, target :: L0_LCover_read ! read variable if not coupled to mhm - - integer(i4), public, dimension(:,:), allocatable :: L0_cellCoor ! Cell coordinates (row,col) for each grid cell, dim2=2 - integer(i4), public, dimension(:), allocatable :: L0_Id ! Level-0 id - integer(i4), public, dimension(:), allocatable :: L0_gaugeLoc ! Location of gauges within the catchment integer(i4), public, dimension(:), allocatable :: L0_InflowGaugeLoc ! Location of inflow gauges within catchment - integer(i4), public, dimension(:), allocatable :: L0_L11_Id ! Mapping of L11 Id on L0 - ! ! (sub-cat. id. == cell Id L11) - real(dp), public, dimension(:), allocatable :: L0_areaCell ! [m2] Area of a cell at level-0 - + integer(i4), public, dimension(:), allocatable :: L0_fAcc ! Flow accumulation + integer(i4), public, dimension(:), allocatable :: L0_fDir ! Flow direction (standard ArcGIS) ! ! mRM derived variables ! dim1 = number grid cells L0 - integer(i4), public, dimension(:), allocatable :: L0_draSC ! Index of draining cell of each sub catchment + integer(i4), public, dimension(:), allocatable :: L0_draSC ! Index of draining cell of each sub catchment ! ! i.e. a routing cell L11 integer(i4), public, dimension(:), allocatable :: L0_draCell ! Draining cell id at L11 of ith cell of L0 integer(i4), public, dimension(:), allocatable :: L0_streamNet ! Stream network integer(i4), public, dimension(:), allocatable :: L0_floodPlain ! Floodplains of stream i - integer(i4) :: L0_nCells ! Number of cells at level 0 - + ! ------------------------------------------------------------------- ! L1 DOMAIN description ! ------------------------------------------------------------------- ! dim1 = number grid cells L1 integer(i4), public, dimension(:), allocatable :: L11_L1_ID ! Mapping of L11 Id on L1 - real(dp), public, dimension(:), allocatable :: L1_areaCell ! [km2] Effective area of cell at this level - integer(i4), public, dimension(:), allocatable :: L1_Id ! Ids of grid at level-11 - integer(i4) :: L1_nCells ! Number of cells at level 1 ! ------------------------------------------------------------------- ! L1 variables ! ------------------------------------------------------------------- ! dim1 = number grid cells L1 ! dim2 = number of timesteps - real(dp), public, dimension(:,:), allocatable :: L1_total_runoff_in + real(dp), public, dimension(:, :), allocatable :: L1_total_runoff_in ! ------------------------------------------------------------------- ! L11 DOMAIN description ! ------------------------------------------------------------------- ! dim1 = number grid cells L11 ! dim2 = 2 - integer(i4), public :: L11_nCells ! No. of routing cells (= nSC = nNodes) - integer(i4), public, dimension(:,:), allocatable :: L11_cellCoor ! Cell coordinates (row,col) - ! ! -> Routing integer(i4), public, dimension(:), allocatable :: L1_L11_ID ! Mapping of L1 Id on L11 - real(dp), public, dimension(:), allocatable :: L11_areaCell ! [km2] Effective area of cell at this level - integer(i4), public, dimension(:), allocatable :: L11_Id ! Ids of grid at level-11 integer(i4), public, dimension(:), allocatable :: L11_fDir ! Flow direction (standard notation) integer(i4), public, dimension(:), allocatable :: L11_nOutlets - ! Reference - ! dim1 = number grid cells L11 - integer(i4), public, dimension(:), allocatable :: L11_upBound_L0 ! Row start at finer level-0 scale - integer(i4), public, dimension(:), allocatable :: L11_downBound_L0 ! Row end at finer level-0 scale - integer(i4), public, dimension(:), allocatable :: L11_leftBound_L0 ! Col start at finer level-0 scale - integer(i4), public, dimension(:), allocatable :: L11_rightBound_L0 ! Col end at finer level-0 scale - integer(i4), public, dimension(:), allocatable :: L11_upBound_L1 ! Row start at finer level-1 scale - integer(i4), public, dimension(:), allocatable :: L11_downBound_L1 ! Row end at finer level-1 scale - integer(i4), public, dimension(:), allocatable :: L11_leftBound_L1 ! Col start at finer level-1 scale - integer(i4), public, dimension(:), allocatable :: L11_rightBound_L1 ! Col end at finer level-1 scale - ! Constants ! dim1 = number grid cells L11 integer(i4), public, dimension(:), allocatable :: L11_rowOut ! Grid vertical location of the Outlet @@ -271,42 +150,36 @@ module mo_mrm_global_variables ! Fluxes ! dim1 = number grid cells L11 ! dim2 = 2 - real(dp), public, dimension(:), allocatable :: L11_Qmod ! [m3 s-1] Simulated discharge - real(dp), public, dimension(:), allocatable :: L11_qOUT ! [m3 s-1] Total outflow from cells L11 at time tt - real(dp), public, dimension(:,:), allocatable :: L11_qTIN ! Total discharge inputs at t-1 and t - real(dp), public, dimension(:,:), allocatable :: L11_qTR ! Routed outflow leaving a node - - real(dp), public, dimension(:), allocatable :: L11_FracFPimp ! [1] Fraction of the flood plain with - integer(i4), public, dimension(:), allocatable :: L11_fromN ! From node (sinks are at the end) - integer(i4), public, dimension(:), allocatable :: L11_toN ! To node (sinks are at the end) - integer(i4), public, dimension(:), allocatable :: L11_netPerm ! Routing sequence (permutation of L11_rOrder) - integer(i4), public, dimension(:), allocatable :: L11_fRow ! From row in L0 grid - integer(i4), public, dimension(:), allocatable :: L11_fCol ! From col in L0 grid - integer(i4), public, dimension(:), allocatable :: L11_tRow ! To row in L0 grid - integer(i4), public, dimension(:), allocatable :: L11_tCol ! To col in L0 grid - integer(i4), public, dimension(:), allocatable :: L11_rOrder ! Network routing order - integer(i4), public, dimension(:), allocatable :: L11_label ! Label Id [0='', 1=HeadWater, 2=Sink] - logical, public, dimension(:), allocatable :: L11_sink ! .true. if sink node reached - real(dp), public, dimension(:), allocatable :: L11_length ! [m] Total length of river link - real(dp), public, dimension(:), allocatable :: L11_aFloodPlain ! [m2] Area of the flood plain + real(dp), public, dimension(:), allocatable :: L11_Qmod ! [m3 s-1] Simulated discharge + real(dp), public, dimension(:), allocatable :: L11_qOUT ! [m3 s-1] Total outflow from cells L11 at time tt + real(dp), public, dimension(:, :), allocatable :: L11_qTIN ! Total discharge inputs at t-1 and t + real(dp), public, dimension(:, :), allocatable :: L11_qTR ! Routed outflow leaving a node + + integer(i4), public, dimension(:), allocatable :: L11_fromN ! From node (sinks are at the end) + integer(i4), public, dimension(:), allocatable :: L11_toN ! To node (sinks are at the end) + integer(i4), public, dimension(:), allocatable :: L11_netPerm ! Routing sequence (permutation of L11_rOrder) + integer(i4), public, dimension(:), allocatable :: L11_fRow ! From row in L0 grid + integer(i4), public, dimension(:), allocatable :: L11_fCol ! From col in L0 grid + integer(i4), public, dimension(:), allocatable :: L11_tRow ! To row in L0 grid + integer(i4), public, dimension(:), allocatable :: L11_tCol ! To col in L0 grid + integer(i4), public, dimension(:), allocatable :: L11_rOrder ! Network routing order + integer(i4), public, dimension(:), allocatable :: L11_label ! Label Id [0='', 1=HeadWater, 2=Sink] + logical, public, dimension(:), allocatable :: L11_sink ! .true. if sink node reached + real(dp), public, dimension(:), allocatable :: L11_length ! [m] Total length of river link + real(dp), public, dimension(:), allocatable, target :: L11_aFloodPlain ! [m2] Area of the flood plain ! ! impervious cover - real(dp), public, dimension(:), allocatable :: L11_slope ! [1] Average slope of river link + real(dp), public, dimension(:), allocatable :: L11_slope ! [1] Average slope of river link ! Parameters ! dim1 = number grid cells L11 - real(dp), public, dimension(:), allocatable :: L11_K ! [d] kappa: Muskingum travel time parameter. - real(dp), public, dimension(:), allocatable :: L11_xi ! [1] xi: Muskingum diffusion parameter - ! ! (attenuation). - real(dp), public, dimension(:), allocatable :: L11_tsRout ! [s] Routing timestep - real(dp), public, dimension(:), allocatable :: L11_C1 ! [-] Routing parameter C1=f(K,xi, DT) (Chow, 25-41) - real(dp), public, dimension(:), allocatable :: L11_C2 ! [-] Routing parameter C2 (") + real(dp), public, dimension(:, :), allocatable :: L11_nLinkFracFPimp ! fraction of impervious lcover at the floodplain + ! dims: nLink, LCYearID - ! ------------------------------------------------------------------- - ! DEFINE OUTPUTS - ! ------------------------------------------------------------------- - ! - integer(i4) :: timeStep_model_outputs_mrm ! timestep for writing model outputs - logical, dimension(nOutFlxState) :: outputFlxState_mrm ! Define model outputs see "mhm_outputs.nml" - ! ! dim1 = number of output variables to be written + real(dp), public, dimension(:), allocatable :: L11_K ! [d] kappa: Muskingum travel time parameter. + real(dp), public, dimension(:), allocatable :: L11_xi ! [1] xi: Muskingum diffusion parameter + ! ! (attenuation). + real(dp), public, dimension(:), allocatable :: L11_tsRout ! [s] Routing timestep + real(dp), public, dimension(:), allocatable :: L11_C1 ! [-] Routing parameter C1=f(K,xi, DT) (Chow, 25-41) + real(dp), public, dimension(:), allocatable :: L11_C2 ! [-] Routing parameter C2 (") end module mo_mrm_global_variables diff --git a/src/mRM/mo_mrm_init.f90 b/src/mRM/mo_mrm_init.f90 index 2ea64c7b..34270811 100644 --- a/src/mRM/mo_mrm_init.f90 +++ b/src/mRM/mo_mrm_init.f90 @@ -74,185 +74,220 @@ MODULE mo_mrm_init ! Modified, Sep 2015 - Stephan Thober, added L0_mask, L0_elev, and L0_LCover ! May 2016 - Stephan Thober, added warning message in case no gauge is found in modelling domain - subroutine mrm_init(L0_mask, L0_elev, L0_LCover) - - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_mrm_constants, only: nodata_i4 - use mo_mrm_global_variables, only: read_restart, nBasins, perform_mpr, L0_Basin, dirRestartIn, & - mrm_coupling_mode, basin_mrm - use mo_mrm_net_startup, only: & - L11_variable_init, & - L11_flow_direction, & - L11_set_network_topology, & - L11_routing_order, & - L11_link_location, & - L11_set_drain_outlet_gauges, & - L11_stream_features - use mo_mrm_read_config, only: read_mrm_config_coupling, read_mrm_config - use mo_mrm_read_data, only: mrm_read_discharge, mrm_read_L0_data, & - mrm_L1_variable_init, & - mrm_L0_variable_init, & - mrm_read_total_runoff - use mo_mrm_read_latlon, only: read_latlon - use mo_mrm_restart, only: mrm_read_restart_config - use mo_common_variables, only: processMatrix, global_parameters + subroutine mrm_init(file_namelist, unamelist, file_namelist_param, unamelist_param) + + use mo_kind, only : i4 + use mo_message, only : message + use mo_common_constants, only : nodata_i4, nodata_dp + use mo_mrm_global_variables, only : & + basin_mrm, l0_l11_remap, l1_l11_remap, level11 + use mo_mrm_net_startup, only : & + l11_l1_mapping, & + L11_flow_direction, & + L11_set_network_topology, & + L11_routing_order, & + L11_link_location, & + L11_set_drain_outlet_gauges, & + L11_stream_features, & + L11_fraction_sealed_floodplain + use mo_mrm_read_config, only : mrm_read_config + use mo_common_read_config, only : common_read_config + use mo_common_mHM_mRM_read_config, ONLY : & + common_mHM_mRM_read_config, check_optimization_settings ! Read main configuration files + use mo_mrm_read_data, only : mrm_read_discharge, mrm_read_L0_data, & + mrm_read_total_runoff + use mo_mrm_restart, only : mrm_read_restart_config + use mo_common_mHM_mRM_variables, only : read_restart, dirRestartIn, resolutionRouting, mrm_coupling_mode + use mo_common_variables, only : L0_Basin, processMatrix, & + global_parameters, nBasins, level0, level1, resolutionHydrology, l0_l1_remap + use mo_grid, only : L0_grid_setup, init_lowres_level, set_basin_indices + use mo_common_restart, only : read_grid_info + use mo_read_latlon, only : read_latlon implicit none ! input variables - logical, target, intent(in), optional :: L0_mask(:) ! L0 mask - real(dp), target, intent(in), optional :: L0_elev(:) ! L0 elevation - integer(i4), target, intent(in), optional :: L0_LCover(:,:) ! L0 land cover + character(*), intent(in) :: file_namelist, file_namelist_param + integer, intent(in) :: unamelist, unamelist_param ! local variables integer(i4) :: iStart, iEnd ! start and end index for routing parameters - integer(i4) :: iBasin - logical :: ReadLatLon - - !----------------------------------------------------------- - ! READ COUPLING MODE - !----------------------------------------------------------- - call read_mrm_config_coupling() - - !----------------------------------------------------------- - ! PRINT STARTUP MESSAGE - !----------------------------------------------------------- - if (mrm_coupling_mode .eq. 0) then - call print_startup_message() + integer(i4) :: iBasin, gauge_counter + logical :: ReadLatLon + + if (mrm_coupling_mode .eq. 0_i4) then + call common_read_config(file_namelist, unamelist) + call common_mHM_mRM_read_config(file_namelist, unamelist) + !----------------------------------------------------------- + ! PRINT STARTUP MESSAGE + !----------------------------------------------------------- + call print_startup_message(file_namelist, file_namelist_param) else - call message('') - call message(' Inititalize mRM') + call message('') + call message(' Inititalize mRM') end if - - ! ---------------------------------------------------------- - ! READ CONFIG - ! ---------------------------------------------------------- - call read_mrm_config((mrm_coupling_mode .ne. 2), ReadLatLon) - !----------------------------------------------------------- - ! CONFIG OUTPUT - !----------------------------------------------------------- - if (mrm_coupling_mode .eq. 0) then - call config_output() + ! read config for mrm, readlatlon is set here depending on whether output is needed + call mrm_read_config(file_namelist, unamelist, file_namelist_param, unamelist_param, & + (mrm_coupling_mode .eq. 0_i4), ReadLatLon) + + ! this was moved here, because it depends on global_parameters that are only set in mrm_read_config + if (mrm_coupling_mode .eq. 0_i4) then + call check_optimization_settings() + allocate(l0_l1_remap(nBasins)) + allocate(level1(nBasins)) + !----------------------------------------------------------- + ! CONFIG OUTPUT + !----------------------------------------------------------- + call config_output() end if ! ---------------------------------------------------------- ! READ DATA ! ---------------------------------------------------------- - ! level 0 data - if (processMatrix(8, 1) .eq. 1) call mrm_read_L0_data(L0_mask, L0_elev, L0_LCover) - if (processMatrix(8, 1) .eq. 2) call mrm_read_L0_data(L0_mask, L0_elev) - - if (perform_mpr) then - do iBasin = 1, nBasins - if (iBasin .eq. 1) then - call L0_check_input_routing(iBasin) - else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1) ) then - call L0_check_input_routing(iBasin) - end if - end do + allocate(level11(nBasins)) + allocate(l0_l11_remap(nBasins)) + allocate(l1_l11_remap(nBasins)) + + if (.not. read_restart) then + ! read all (still) necessary level 0 data + if (processMatrix(8, 1) .eq. 1_i4) call mrm_read_L0_data(mrm_coupling_mode .eq. 0_i4, ReadLatLon, .true.) + if (processMatrix(8, 1) .eq. 2_i4) call mrm_read_L0_data(mrm_coupling_mode .eq. 0_i4, ReadLatLon, .false.) end if - if (read_restart) then - ! ---------------------------------------------------------- - ! READ RESTART VARIABLES - ! ---------------------------------------------------------- - do iBasin = 1, nBasins - call mrm_read_restart_config(iBasin, dirRestartIn(iBasin)) - end do - else - ! ---------------------------------------------------------- - ! LEVEL 1 DATA - ! ---------------------------------------------------------- - do iBasin = 1, nBasins - if (iBasin .eq. 1) then - call mrm_L0_variable_init(iBasin) - else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1 )) then - call mrm_L0_variable_init(iBasin) + do iBasin = 1, nBasins + if (read_restart) then + ! this reads the basin properties + if (mrm_coupling_mode .eq. 0_i4) then + call read_grid_info(iBasin, dirRestartIn(iBasin), "1", "mRM", level1(iBasin)) + end if + call read_grid_info(iBasin, dirRestartIn(iBasin), "11", "mRM", level11(iBasin)) + call mrm_read_restart_config(iBasin, dirRestartIn(iBasin)) + else + if (iBasin .eq. 1) then + call L0_check_input_routing(L0_Basin(iBasin)) + if (mrm_coupling_mode .eq. 0_i4) then + call L0_grid_setup(level0(L0_Basin(iBasin))) end if - call mrm_L1_variable_init(iBasin) - end do - ! ---------------------------------------------------------- - ! INITIALIZE STREAM NETWORK - ! ---------------------------------------------------------- - do iBasin = 1, nBasins - call L11_variable_init(iBasin) - call L11_flow_direction(iBasin) - call L11_set_network_topology(iBasin) - call L11_routing_order(iBasin) - call L11_link_location(iBasin) - call L11_set_drain_outlet_gauges(iBasin) - ! stream characteristics - call L11_stream_features(iBasin) - end do - ! check whether there are gauges within the modelling domain - if (allocated(basin_mrm%gaugeNodeList)) then - if (all(basin_mrm%gaugeNodeList .eq. nodata_i4)) then - call message('') - call message(' WARNING: no gauge found within modelling domain') + else if ((L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1))) then + call L0_check_input_routing(L0_Basin(iBasin)) + if (mrm_coupling_mode .eq. 0_i4) then + call L0_grid_setup(level0(L0_Basin(iBasin))) end if - end if - ! ---------------------------------------------------------- - ! INITIALIZE PARAMETERS - ! ---------------------------------------------------------- - do iBasin = 1, nBasins - iStart = processMatrix(8,3) - processMatrix(8,2) + 1 - iEnd = processMatrix(8,3) - call mrm_init_param(iBasin, global_parameters(iStart : iEnd, 3)) - end do + end if + + if (mrm_coupling_mode .eq. 0_i4) then + call init_lowres_level(level0(L0_Basin(iBasin)), resolutionHydrology(iBasin), & + level1(iBasin), l0_l1_remap(iBasin)) + end if + call init_lowres_level(level0(L0_Basin(iBasin)), resolutionRouting(iBasin), & + level11(iBasin), l0_l11_remap(iBasin)) + call init_lowres_level(level1(iBasin), resolutionRouting(iBasin), & + level11(iBasin), l1_l11_remap(iBasin)) + call L11_L1_mapping(iBasin) + + if (ReadLatLon) then + ! read lat lon coordinates of each basin + call read_latlon(iBasin, "lon_l11", "lat_l11", "level11", level11(iBasin)) + else + ! allocate the memory and set to nodata + allocate(level11(iBasin)%x(level11(iBasin)%nrows, level11(iBasin)%ncols)) + allocate(level11(iBasin)%y(level11(iBasin)%nrows, level11(iBasin)%ncols)) + level11(iBasin)%x = nodata_dp + level11(iBasin)%y = nodata_dp + end if + end if + end do + + call set_basin_indices(level11) + call set_basin_indices(level1) + + do iBasin = 1, nBasins + if (.not. read_restart) then + ! ---------------------------------------------------------- + ! INITIALIZE STREAM NETWORK + ! ---------------------------------------------------------- + call L11_flow_direction(iBasin) + call L11_set_network_topology(iBasin) + call L11_routing_order(iBasin) + call L11_link_location(iBasin) + call L11_set_drain_outlet_gauges(iBasin) + ! stream characteristics + call L11_stream_features(iBasin) + + end if + + end do + + ! check whether there are gauges within the modelling domain + if (allocated(basin_mrm)) then + gauge_counter = 0 + do iBasin = 1, nBasins + if (.not. all(basin_mrm(iBasin)%gaugeNodeList .eq. nodata_i4)) then + gauge_counter = gauge_counter + 1 + end if + end do + if (gauge_counter .lt. 1) then + call message('') + call message(' WARNING: no gauge found within modelling domain') + end if end if + ! ---------------------------------------------------------- + ! INITIALIZE PARAMETERS + ! ---------------------------------------------------------- + do iBasin = 1, nBasins + iStart = processMatrix(8, 3) - processMatrix(8, 2) + 1 + iEnd = processMatrix(8, 3) + call mrm_init_param(iBasin, global_parameters(iStart : iEnd, 3)) + end do ! ---------------------------------------------------------- ! INITIALIZE STATES AND ROUTING PARAMETERS ! ---------------------------------------------------------- do iBasin = 1, nBasins - call variables_alloc_routing(iBasin) + call variables_alloc_routing(iBasin) end do + ! mpr-like definiton of sealed floodplain fraction + if ((processMatrix(8, 1) .eq. 1_i4) .and. (.not. read_restart)) then + call L11_fraction_sealed_floodplain(2_i4, .true.) + else + ! dummy initialization + call L11_fraction_sealed_floodplain(2_i4, .false.) + end if + ! ------------------------------------------------------- ! READ INPUT DATA AND OBSERVED DISCHARGE DATA ! ------------------------------------------------------- ! read simulated runoff at level 1 - if (mrm_coupling_mode .eq. 0) then - do iBasin = 1, nBasins - call mrm_read_total_runoff(iBasin) - end do + if (mrm_coupling_mode .eq. 0_i4) then + do iBasin = 1, nBasins + call mrm_read_total_runoff(iBasin) + end do end if ! discharge data call mrm_read_discharge() - ! ---------------------------------------------------------- - ! READ LAT & LON IF OUTPUT SHALL BE WRITTEN - ! ---------------------------------------------------------- - if (ReadLatLon) then - do iBasin = 1, nBasins - call read_latlon(iBasin) - end do - end if - call message('') call message(' Finished Initialization of mRM') end subroutine mrm_init - !=============================================================== ! PRINT STARTUP MESSAGE !=============================================================== - subroutine print_startup_message() - - use mo_kind, only: i4 - use mo_message, only: message, message_text - use mo_string_utils, only: num2str, separator - use mo_mrm_file, only: & - version, & - version_date, & - file_main, & - file_namelist_mrm, & - file_namelist_param_mrm, & - file_defOutput + subroutine print_startup_message(file_namelist, file_namelist_param) + + use mo_kind, only : i4 + use mo_message, only : message, message_text + use mo_string_utils, only : num2str, separator + use mo_mrm_file, only : & + version, & + version_date, & + file_main, & + file_defOutput implicit none ! local variables + character(*), intent(in) :: file_namelist, file_namelist_param integer(i4), dimension(8) :: datetime ! Date and time call message(separator) @@ -269,42 +304,44 @@ subroutine print_startup_message() call message(separator) call message() - call date_and_time(values=datetime) - message_text = trim(num2str(datetime(3),'(I2.2)'))//"."//trim(num2str(datetime(2),'(I2.2)')) & - //"."//trim(num2str(datetime(1),'(I4.4)'))//" "//trim(num2str(datetime(5),'(I2.2)')) & - //":"//trim(num2str(datetime(6),'(I2.2)'))//":"//trim(num2str(datetime(7),'(I2.2)')) + call date_and_time(values = datetime) + message_text = trim(num2str(datetime(3), '(I2.2)')) // "." // trim(num2str(datetime(2), '(I2.2)')) & + // "." // trim(num2str(datetime(1), '(I4.4)')) // " " // trim(num2str(datetime(5), '(I2.2)')) & + // ":" // trim(num2str(datetime(6), '(I2.2)')) // ":" // trim(num2str(datetime(7), '(I2.2)')) call message('Start at ', trim(message_text), '.') call message('Using main file ', trim(file_main), ' and namelists: ') - call message(' ',trim(file_namelist_mrm)) - call message(' ',trim(file_namelist_param_mrm)) + call message(' ', trim(file_namelist)) + call message(' ', trim(file_namelist_param)) call message(' ', trim(file_defOutput), ' (if it is given)') call message() end subroutine print_startup_message - + !--------------------------------------------------------------- ! Config output !--------------------------------------------------------------- subroutine config_output() - use mo_kind, only: i4 - use mo_string_utils, only: num2str - use mo_message, only: message - use mo_mrm_file, only: & - file_namelist_mrm, & - file_namelist_param_mrm, & - file_defOutput - use mo_mrm_global_variables, only: & - dirMorpho, & - dirLCover, & - dirGauges, & - dirOut, & - basin_mrm, & - nBasins + use mo_kind, only : i4 + use mo_string_utils, only : num2str + use mo_message, only : message + use mo_mrm_file, only : & + file_namelist_mrm, & + file_namelist_param_mrm, & + file_defOutput + use mo_mrm_global_variables, only : & + dirGauges, & + basin_mrm + use mo_common_variables, only : & + dirLCover, & + dirOut, & + dirMorpho, & + nBasins + implicit none ! local variables - integer(i4) :: ii + integer(i4) :: iBasin integer(i4) :: jj ! call message() @@ -316,37 +353,37 @@ subroutine config_output() call message(' # of basins: ', trim(num2str(nbasins))) call message() call message(' Input data directories:') - do ii = 1, nbasins - call message( ' --------------' ) - call message( ' BASIN ', num2str(ii,'(I3)') ) - call message( ' --------------' ) - call message(' Morphological directory: ', trim(dirMorpho(ii) )) - call message(' Land cover directory: ', trim(dirLCover(ii) )) - call message(' Discharge directory: ', trim(dirGauges(ii) )) - call message(' Output directory: ', trim(dirOut(ii) )) - call message(' Evaluation gauge ', 'ID') - do jj = 1 , basin_mrm%nGauges(ii) - call message(' ',trim(adjustl(num2str(jj))),' ', & - trim(adjustl(num2str(basin_mrm%gaugeIdList(ii,jj))))) - end do - if (basin_mrm%nInflowGauges(ii) .GT. 0) then - call message(' Inflow gauge ', 'ID') - do jj = 1 , basin_mrm%nInflowGauges(ii) - call message(' ',trim(adjustl(num2str(jj))),' ', & - trim(adjustl(num2str(basin_mrm%InflowGaugeIdList(ii,jj))))) - end do - end if + do iBasin = 1, nbasins + call message(' --------------') + call message(' BASIN ', num2str(iBasin, '(I3)')) + call message(' --------------') + call message(' Morphological directory: ', trim(dirMorpho(iBasin))) + call message(' Land cover directory: ', trim(dirLCover(iBasin))) + call message(' Discharge directory: ', trim(dirGauges(iBasin))) + call message(' Output directory: ', trim(dirOut(iBasin))) + call message(' Evaluation gauge ', 'ID') + do jj = 1, basin_mrm(iBasin)%nGauges + call message(' ', trim(adjustl(num2str(jj))), ' ', & + trim(adjustl(num2str(basin_mrm(iBasin)%gaugeIdList(jj))))) + end do + if (basin_mrm(iBasin)%nInflowGauges .GT. 0) then + call message(' Inflow gauge ', 'ID') + do jj = 1, basin_mrm(iBasin)%nInflowGauges + call message(' ', trim(adjustl(num2str(jj))), ' ', & + trim(adjustl(num2str(basin_mrm(iBasin)%InflowGaugeIdList(jj))))) + end do + end if end do end subroutine config_output - + ! ------------------------------------------------------------------ ! NAME ! variables_default_init_routing !> \brief Default initalization mRM related L11 variables - + !> \details Default initalization of mHM related L11 variables (e.g., states, !> fluxes, and parameters) as per given constant values given in mo_mhm_constants. !> Variables initalized here is defined in the mo_global_variables.f90 file. @@ -391,11 +428,10 @@ end subroutine config_output subroutine variables_default_init_routing() - use mo_mrm_global_variables, only: & - L11_Qmod, L11_qOUT, L11_qTIN, L11_qTR, L11_K, L11_xi,L11_C1, L11_C2, & - L11_FracFPimp - use mo_mrm_constants, only: & - P1_InitStateFluxes + use mo_mrm_global_variables, only : & + L11_Qmod, L11_qOUT, L11_qTIN, L11_qTR, L11_K, L11_xi, L11_C1, L11_C2 + use mo_common_constants, only : & + P1_InitStateFluxes implicit none !------------------------------------------- ! L11 ROUTING STATE VARIABLES, FLUXES AND @@ -417,115 +453,104 @@ subroutine variables_default_init_routing() L11_C1 = P1_InitStateFluxes ! Routing parameter C2 =f(K,xi, DT) (Chow, 25-41) L11_C2 = P1_InitStateFluxes - ! Fraction of the flood plain with impervious cover - L11_FracFPimp = P1_InitStateFluxes end subroutine variables_default_init_routing - + ! -------------------------------------------------------------------------- ! L0_check_input_routing ! -------------------------------------------------------------------------- - subroutine L0_check_input_routing(iBasin) - - use mo_kind, only: i4 - use mo_message, only: message, message_text - use mo_string_utils, only: num2str - use mo_mrm_global_variables, only: L0_fDir, L0_fAcc, basin_mrm - USE mo_mrm_constants, ONLY: nodata_i4 + subroutine L0_check_input_routing(L0Basin_iBasin) + + use mo_kind, only : i4 + use mo_message, only : message, message_text + use mo_string_utils, only : num2str + use mo_mrm_global_variables, only : L0_fDir, L0_fAcc + use mo_common_variables, only : level0 + USE mo_common_constants, ONLY : nodata_i4 implicit none ! input variables - integer(i4) :: iBasin + integer(i4), intent(in) :: L0Basin_iBasin ! local variables integer(i4) :: k - do k = basin_mrm%L0_iStart(iBasin), basin_mrm%L0_iEnd(iBasin) - ! flow direction [-] - if ( L0_fDir(k) .eq. nodata_i4 ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)')) - call message(' Error: flow direction has missing value within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if - ! flow accumulation [-] - if ( L0_fAcc(k) .eq. nodata_i4 ) then - message_text = trim(num2str(k,'(I5)'))//','// trim(num2str(iBasin,'(I5)')) - call message(' Error: flow accumulation has missing values within the valid masked area at cell in basin ', & - trim(message_text) ) - stop - end if + do k = level0(L0Basin_iBasin)%iStart, level0(L0Basin_iBasin)%iEnd + ! flow direction [-] + if (L0_fDir(k) .eq. nodata_i4) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(L0Basin_iBasin, '(I5)')) + call message(' Error: flow direction has missing value within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if + ! flow accumulation [-] + if (L0_fAcc(k) .eq. nodata_i4) then + message_text = trim(num2str(k, '(I5)')) // ',' // trim(num2str(L0Basin_iBasin, '(I5)')) + call message(' Error: flow accumulation has missing values within the valid masked area at cell in basin ', & + trim(message_text)) + stop + end if end do - + end subroutine L0_check_input_routing - + ! -------------------------------------------------------------------------- ! L11 ROUTING STATE VARIABLES, FLUXES AND ! PARAMETERS ! -------------------------------------------------------------------------- subroutine variables_alloc_routing(iBasin) - - use mo_kind, only: i4, dp - use mo_mrm_constants, only: nRoutingStates - use mo_append, only: append ! append vector - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: L11_Qmod, L11_qOUT, L11_qTIN, & - L11_qTR, L11_K, L11_xi,L11_C1, L11_C2, L11_FracFPimp + + use mo_kind, only : i4, dp + use mo_mrm_constants, only : nRoutingStates + use mo_append, only : append ! append vector + use mo_mrm_global_variables, only : L11_Qmod, L11_qOUT, L11_qTIN, & + L11_qTR, L11_K, L11_xi, L11_C1, L11_C2, level11 implicit none ! input variables integer(i4), intent(in) :: iBasin ! local variables - integer(i4) :: nrows11, ncols11 - integer(i4) :: ncells11 - real(dp), dimension(:), allocatable :: dummy_Vector11 - real(dp), dimension(:,:), allocatable :: dummy_Matrix11_IT - - ! level-11 information - call get_basin_info_mrm( iBasin, 11, nrows11, ncols11, ncells=ncells11 ) + real(dp), dimension(:), allocatable :: dummy_Vector11 + real(dp), dimension(:, :), allocatable :: dummy_Matrix11_IT ! dummy vector and matrix - allocate( dummy_Vector11 (nCells11 ) ) - allocate( dummy_Matrix11_IT(nCells11, nRoutingStates) ) + allocate(dummy_Vector11 (level11(iBasin)%nCells)) + allocate(dummy_Matrix11_IT(level11(iBasin)%nCells, nRoutingStates)) ! simulated discharge at each node dummy_Vector11(:) = 0.0_dp - call append( L11_Qmod, dummy_Vector11 ) + call append(L11_Qmod, dummy_Vector11) ! Total outflow from cells L11 at time tt dummy_Vector11(:) = 0.0_dp - call append( L11_qOUT, dummy_Vector11 ) + call append(L11_qOUT, dummy_Vector11) ! Total discharge inputs at t-1 and t - dummy_Matrix11_IT(:,:) = 0.0_dp - call append( L11_qTIN, dummy_Matrix11_IT ) + dummy_Matrix11_IT(:, :) = 0.0_dp + call append(L11_qTIN, dummy_Matrix11_IT) ! Routed outflow leaving a node - dummy_Matrix11_IT(:,:) = 0.0_dp - call append( L11_qTR, dummy_Matrix11_IT ) + dummy_Matrix11_IT(:, :) = 0.0_dp + call append(L11_qTR, dummy_Matrix11_IT) ! kappa: Muskingum travel time parameter. dummy_Vector11(:) = 0.0_dp - call append( L11_K, dummy_Vector11 ) + call append(L11_K, dummy_Vector11) ! xi: Muskingum diffusion parameter dummy_Vector11(:) = 0.0_dp - call append( L11_xi, dummy_Vector11 ) + call append(L11_xi, dummy_Vector11) ! Routing parameter C1=f(K,xi, DT) (Chow, 25-41) dummy_Vector11(:) = 0.0_dp - call append( L11_C1, dummy_Vector11 ) + call append(L11_C1, dummy_Vector11) ! Routing parameter C2 =f(K,xi, DT) (Chow, 25-41) dummy_Vector11(:) = 0.0_dp - call append( L11_C2, dummy_Vector11 ) + call append(L11_C2, dummy_Vector11) - ! Fraction of the flood plain with impervious cover - dummy_Vector11(:) = 0.0_dp - call append( L11_FracFPimp, dummy_Vector11 ) - ! free space - if ( allocated( dummy_Vector11 ) ) deallocate( dummy_Vector11 ) - if ( allocated( dummy_Matrix11_IT ) ) deallocate( dummy_Matrix11_IT ) + if (allocated(dummy_Vector11)) deallocate(dummy_Vector11) + if (allocated(dummy_Matrix11_IT)) deallocate(dummy_Matrix11_IT) end subroutine variables_alloc_routing @@ -536,116 +561,121 @@ end subroutine variables_alloc_routing ! Modified: subroutine mrm_init_param(iBasin, param) - use mo_kind, only: i4, dp - use mo_common_variables, only: processMatrix - use mo_mrm_global_variables, only: & - ! input variables - resolutionRouting, timeStep, iFlag_cordinate_sys, & - basin_mrm, nBasins, & - ! output variables - L11_tsRout - use mo_mrm_constants, only: HourSecs, given_TS - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_utils, only: notequal, locate - + use mo_kind, only : i4, dp + use mo_common_variables, only : & + ! input variables + iFlag_cordinate_sys, & + processMatrix, nBasins + use mo_common_mHM_mRM_variables, only : & + resolutionRouting, timeStep + use mo_mrm_global_variables, only : & + ! input variables + basin_mrm, & + ! output variables + L11_tsRout + use mo_common_constants, only : HourSecs + use mo_mrm_constants, only : given_TS + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_utils, only : notequal, locate + implicit none ! Input - integer(i4), intent(in) :: iBasin ! Basin number + integer(i4), intent(in) :: iBasin ! Basin number real(dp), dimension(:), intent(in) :: param ! input parameter (param(1) is celerity in m/s) ! local variables integer(i4) :: index ! index selected from given_TS - real(dp) :: deltaX ! spatial routing resolution - real(dp) :: K ! [s] wave travel time parameter + real(dp) :: deltaX ! spatial routing resolution + real(dp) :: K ! [s] wave travel time parameter ! temporal resolution of routing - if (iBasin .eq. 1) then - allocate(L11_tsRout(nBasins)) - L11_TSrout = 0._dp + if (iBasin .eq. 1 .and. .not. allocated(L11_tsRout)) then + allocate(L11_tsRout(nBasins)) + L11_TSrout = 0._dp end if if (processMatrix(8, 1) .eq. 1) then - L11_tsRout = timestep * HourSecs + L11_tsRout = timestep * HourSecs else if (processMatrix(8, 1) .eq. 2) then - ! adjust spatial resolution - deltaX = resolutionRouting(iBasin) - if (iFlag_cordinate_sys .eq. 1_i4) deltaX = deltaX * 1.e5_dp ! conversion from degree to m (it's rough) + ! adjust spatial resolution + deltaX = resolutionRouting(iBasin) + if (iFlag_cordinate_sys .eq. 1_i4) deltaX = deltaX * 1.e5_dp ! conversion from degree to m (it's rough) - ! calculate time step of routing model in [s] - K = deltaX / param(1) + ! calculate time step of routing model in [s] + K = deltaX / param(1) - ! determine routing timestep - index = locate(given_TS, K) - L11_TSrout(iBasin) = given_TS(index) + ! determine routing timestep + index = locate(given_TS, K) + L11_TSrout(iBasin) = given_TS(index) end if - + call message('') - call message(' Basin: '//num2str(iBasin, '(i3)')) - call message(' routing resolution [s]:. '//num2str(L11_tsRout(iBasin), '(f7.0)')) - call message(' routing factor:......... '//num2str(L11_tsRout(iBasin) / (timestep * HourSecs), '(f5.2)')) - - if ( NOTEQUAL(mod(HourSecs * 24.0_dp, L11_tsRout(iBasin)), 0.0_dp) .and. & - (basin_mrm%nInflowGauges(iBasin) .gt. 0)) then - call message('***WARNING: routing timestep is not a multiple of 24 h.') - call message(' Inflowgauge timeseries is averaged over values') - call message(' of different days, small mismatches at') - call message(' inflowgauge location might occur.') + call message(' Basin: ' // num2str(iBasin, '(i3)')) + call message(' routing resolution [s]:. ' // num2str(L11_tsRout(iBasin), '(f7.0)')) + call message(' routing factor:......... ' // num2str(L11_tsRout(iBasin) / (timestep * HourSecs), '(f5.2)')) + + if (NOTEQUAL(mod(HourSecs * 24.0_dp, L11_tsRout(iBasin)), 0.0_dp) .and. & + (basin_mrm(iBasin)%nInflowGauges .gt. 0)) then + call message('***WARNING: routing timestep is not a multiple of 24 h.') + call message(' Inflowgauge timeseries is averaged over values') + call message(' of different days, small mismatches at') + call message(' inflowgauge location might occur.') end if end subroutine mrm_init_param subroutine mrm_update_param(iBasin, param) - use mo_kind, only: i4, dp - use mo_mrm_global_variables, only: & - ! input variable - resolutionRouting, L11_TSrout, iFlag_cordinate_sys, & - ! output variables - L11_C1, L11_C2 - use mo_mrm_constants, only: rout_space_weight, given_TS - use mo_mrm_tools, only: get_basin_info_mrm - use mo_utils, only: locate - + use mo_kind, only : i4, dp + use mo_mrm_global_variables, only : & + ! input variable + L11_TSrout, & + ! output variables + L11_C1, L11_C2, level11 + use mo_mrm_constants, only : rout_space_weight, given_TS + use mo_utils, only : locate + use mo_common_variables, only : iFlag_cordinate_sys + use mo_common_mHM_mRM_variables, only : resolutionRouting + implicit none ! Input integer(i4), intent(in) :: iBasin ! Basin number - real(dp), intent(in) :: param(1) ! celerity parameter [m s-1] + real(dp), intent(in) :: param(1) ! celerity parameter [m s-1] ! local variables - integer(i4) :: nrows - integer(i4) :: ncols integer(i4) :: s11 integer(i4) :: e11 integer(i4) :: index ! index selected from given_TS - real(dp) :: deltaX ! spatial routing resolution - real(dp) :: K ! [s] wave travel time parameter - real(dp) :: xi ! [1] Muskingum diffusion parameter (attenuation) + real(dp) :: deltaX ! spatial routing resolution + real(dp) :: K ! [s] wave travel time parameter + real(dp) :: xi ! [1] Muskingum diffusion parameter (attenuation) ! get basin information - call get_basin_info_mrm(iBasin, 11, nrows, ncols, iStart=s11, iEnd=e11) + s11 = level11(iBasin)%iStart + e11 = level11(iBasin)%iEnd ! adjust spatial resolution deltaX = resolutionRouting(iBasin) if (iFlag_cordinate_sys .eq. 1_i4) deltaX = deltaX * 1.e5_dp ! conversion from degree to m (it's rough) ! [s] wave travel time parameter - K = deltaX / param(1) + K = deltaX / param(1) ! set time-weighting scheme xi = abs(rout_space_weight) ! set weighting factor to 0._dp ! determine routing timestep index = locate(given_TS, K) L11_TSrout(iBasin) = given_TS(index) - - ! Muskingum parameters - L11_C1(s11: e11) = L11_TSrout(iBasin) / ( K * (1.0_dp - xi) + 0.5_dp * L11_TSrout(iBasin) ) - L11_C2(s11: e11) = 1.0_dp - L11_C1(s11) * K / L11_TSrout(iBasin) + + ! Muskingum parameters + L11_C1(s11 : e11) = L11_TSrout(iBasin) / (K * (1.0_dp - xi) + 0.5_dp * L11_TSrout(iBasin)) + L11_C2(s11 : e11) = 1.0_dp - L11_C1(s11) * K / L11_TSrout(iBasin) ! optional print ! print *, 'C1 Muskingum routing parameter: ', L11_C1(s11) diff --git a/src/mRM/mo_mrm_mpr.f90 b/src/mRM/mo_mrm_mpr.f90 index db62f913..260b7730 100644 --- a/src/mRM/mo_mrm_mpr.f90 +++ b/src/mRM/mo_mrm_mpr.f90 @@ -9,12 +9,12 @@ !> \author Luis Samaniego, Stephan Thober !> \date Aug 2015 module mo_mrm_mpr - use mo_kind, only: dp + use mo_kind, only : dp implicit none public :: reg_rout private contains - + ! ---------------------------------------------------------------------------- ! NAME @@ -40,7 +40,7 @@ module mo_mrm_mpr ! INTENT(INOUT) ! None - + ! INTENT(OUT) !> \param[out] "real(dp) :: C1(:)" - routing parameter C1 (Chow, 25-41) !> \param[out] "real(dp) :: C2(:)" - routing parameter C2 (") @@ -71,49 +71,49 @@ module mo_mrm_mpr !> \date Dec 2012 ! Written Stephan Thober, Dec 2012 - subroutine reg_rout( param, length, slope, fFPimp, TS, & - C1, C2 ) + subroutine reg_rout(param, length, slope, fFPimp, TS, & + C1, C2) implicit none ! Input - real(dp), dimension(5), intent(in) :: param ! input parameter - real(dp), dimension(:), intent(in) :: length ! [m] total length - real(dp), dimension(:), intent(in) :: slope ! average slope - real(dp), dimension(:), intent(in) :: fFPimp ! fraction of the flood plain with + real(dp), dimension(5), intent(in) :: param ! input parameter + real(dp), dimension(:), intent(in) :: length ! [m] total length + real(dp), dimension(:), intent(in) :: slope ! average slope + real(dp), dimension(:), intent(in) :: fFPimp ! fraction of the flood plain with ! ! impervious layer - real(dp), intent(in) :: TS ! [h] time step in + real(dp), intent(in) :: TS ! [h] time step in ! Output real(dp), dimension(:), intent(out) :: C1 ! routing parameter C1 (Chow, 25-41) real(dp), dimension(:), intent(out) :: C2 ! routing parameter C2 (") ! loval variables - real(dp) :: ssMax ! stream slope max - real(dp), dimension(size(fFPimp,1)) :: K ! [d] Muskingum travel time parameter - real(dp), dimension(size(fFPimp,1)) :: xi ! [1] Muskingum diffusion parameter (attenuation) + real(dp) :: ssMax ! stream slope max + real(dp), dimension(size(fFPimp, 1)) :: K ! [d] Muskingum travel time parameter + real(dp), dimension(size(fFPimp, 1)) :: xi ! [1] Muskingum diffusion parameter (attenuation) ! normalize stream bed slope - ssMax = maxval( slope(:) ) + ssMax = maxval(slope(:)) ! New regional relationship; K = f(length, slope, & fFPimp) K = param(1) + param(2) * (length * 0.001_dp) & - + param(3) * slope & - + param(4) * fFPimp + + param(3) * slope & + + param(4) * fFPimp ! Xi = f(slope) - xi = param(5)*(1.0_dp + slope / ssMax) + xi = param(5) * (1.0_dp + slope / ssMax) ! constraints on Xi - xi = merge( 0.5_dp, xi, xi > 0.5_dp ) - xi = merge( 0.005_dp, xi, xi < 0.005_dp ) + xi = merge(0.5_dp, xi, xi > 0.5_dp) + xi = merge(0.005_dp, xi, xi < 0.005_dp) ! constrains on Ki - K = merge( 0.5_dp * TS / xi, K, K > 0.5_dp * TS / xi ) - K = merge( 0.5_dp * TS / (1.0_dp - xi), K, K < 0.5_dp * TS / (1.0_dp - xi)) + K = merge(0.5_dp * TS / xi, K, K > 0.5_dp * TS / xi) + K = merge(0.5_dp * TS / (1.0_dp - xi), K, K < 0.5_dp * TS / (1.0_dp - xi)) ! Muskingum parameters - C1 = TS / ( K * (1.0_dp - xi) + 0.5_dp * TS ) + C1 = TS / (K * (1.0_dp - xi) + 0.5_dp * TS) C2 = 1.0_dp - C1 * K / TS end subroutine reg_rout diff --git a/src/mRM/mo_mrm_net_startup.f90 b/src/mRM/mo_mrm_net_startup.f90 index 3360176f..1ad8c1ad 100644 --- a/src/mRM/mo_mrm_net_startup.f90 +++ b/src/mRM/mo_mrm_net_startup.f90 @@ -17,9 +17,9 @@ ! on a regular X-Y coordinate system module mo_mrm_net_startup - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none - PUBLIC :: L11_variable_init + PUBLIC :: L11_L1_mapping PUBLIC :: L11_flow_direction PUBLIC :: L11_set_network_topology PUBLIC :: L11_routing_order @@ -29,344 +29,103 @@ module mo_mrm_net_startup PUBLIC :: L11_fraction_sealed_floodplain PUBLIC :: get_distance_two_lat_lon_points contains - ! -------------------------------------------------------------------------- - - ! NAME - ! L11_variable_init - ! PURPOSE - !> \brief Cell numbering at ROUTING LEVEL-11 - - !> \details Cell numbering at ROUTING LEVEL-11 \n - !> List of Level- 0 and 1 cells contained within a given Level-11 cell.\n - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" Basin Id - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! call L11_variable_init(1) - ! LITERATURE - ! None - - ! HISTORY - !> \author Luis Samaniego - !> \date Dec 2005 - - ! Modified Luis Samaniego, Jan 2013 - modular version - ! Stephan Thober, Aug 2015 - ported to mRM - ! Stephan Thober, Sep 2015 - create L11 mask based on Level 0 not based on Level 1 - ! -------------------------------------------------------------------------- - - subroutine L11_variable_init(iBasin) - use mo_utils, only: ge - use mo_mrm_constants, only: nodata_i4, nodata_dp - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm, calculate_grid_properties - use mo_mrm_global_variables, only: & - level1, & - basin_mrm, & - level11, resolutionRouting, & - nBasins, & - L0_areaCell, & - L1_Id, & - L1_L11_ID, & ! INOUT: mapping of L1 Id on L11 in case L11 > L1 - L11_L1_ID, & ! INOUT: mapping of L11 Id on L1 in case L1 > L11 - L11_areaCell, & ! INOUT: cell area in [km2] at L11 - L11_cellCoor, & ! cell coordinates (row,col) - L11_nCells, & ! Total No. of routing cells (= nNodes) - L11_Id, & ! ids of grid at level-11 - L11_upBound_L1, & ! INOUT: row start at finer level-1 scale - L11_downBound_L1, & ! INOUT: row end at finer level-1 scale - L11_leftBound_L1, & ! INOUT: col start at finer level-1 scale - L11_rightBound_L1 ! INOUT: col end at finer level-1 scale + subroutine L11_L1_mapping(iBasin) + use mo_common_constants, only : nodata_i4 + use mo_append, only : append + use mo_mrm_global_variables, only : & + level11, & + L1_L11_ID, & ! INOUT: mapping of L1 Id on L11 in case L11 > L1 + L11_L1_ID ! INOUT: mapping of L11 Id on L1 in case L1 > L11 + use mo_common_variables, only : & + level1 implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nrows0, ncols0 - real(dp) :: xllcorner0, yllcorner0 - real(dp) :: cellsize0 - ! - integer(i4) :: nrows1, ncols1 - integer(i4) :: nrows11, ncols11 - integer(i4) :: ncells - integer(i4) :: iStart0, iEnd0 - integer(i4) :: iStart1, iEnd1 - integer(i4) :: iStartMask1, iEndMask1 - logical, dimension(:,:), allocatable :: mask0, mask1, mask11 - integer(i4), dimension(:), allocatable :: upBound1, downBound1, leftBound1, rightBound1 - integer(i4), dimension(:,:), allocatable :: cellCoor - integer(i4) :: kk - integer(i4) :: ic, jc, icc, jcc - integer(i4) :: iu, id, jl, jr - integer(i4), dimension(:,:), allocatable :: L11Id_on_L1 ! mapping of L11 Id on L1 - integer(i4), dimension(:,:), allocatable :: L1Id_on_L11 ! mapping of L1 Id on L11 - integer(i4), dimension(:,:), allocatable :: Id11 ! ids of grid at level-11 - integer(i4), dimension(:,:), allocatable :: Id1 ! ids of grid at level-1 - real(dp), dimension(:,:), allocatable :: areaCell0_2D - real(dp), dimension(:), allocatable :: areaCell - real(dp) :: cellFactorR - real(dp) :: cellFactorRbyH - integer(i4) :: cellFactorRbyH_inv - !-------------------------------------------------------- - ! STEPS:: - ! 1) Estimate each variable locally for a given basin - ! 2) Pad each variable to its corresponding global one - !-------------------------------------------------------- - ! level-0 information - call get_basin_info_mrm( iBasin, 0, nrows0, ncols0, iStart=iStart0, iEnd=iEnd0, & - xllcorner=xllcorner0, yllcorner=yllcorner0, cellsize=cellsize0, mask=mask0) - - if(iBasin == 1) then - ! allocate - allocate( level11%nrows (nBasins) ) - allocate( level11%ncols (nBasins) ) - allocate( level11%xllcorner (nBasins) ) - allocate( level11%yllcorner (nBasins) ) - allocate( level11%cellsize (nBasins) ) - allocate( level11%nodata_value (nBasins) ) - - ! initialize - level11%nrows(:) = nodata_i4 - level11%ncols(:) = nodata_i4 - level11%xllcorner(:) = nodata_dp - level11%yllcorner(:) = nodata_dp - level11%cellsize(:) = nodata_dp - level11%nodata_value(:) = nodata_dp - end if - - ! grid information - call calculate_grid_properties( nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - resolutionRouting(iBasin) , & - level11%nrows(iBasin), level11%ncols(iBasin), level11%xllcorner(iBasin), & - level11%yllcorner(iBasin), level11%cellsize(iBasin), level11%nodata_value(iBasin) ) - ! level-1 information - call get_basin_info_mrm (iBasin, 1, nrows1, ncols1, iStart=iStart1, iEnd=iEnd1, & - iStartMask=iStartMask1, iEndMask=iEndMask1, mask=mask1 ) - - ! level-11 information - call get_basin_info_mrm (iBasin, 11, nrows11, ncols11) - - ! allocate and initialize - allocate( mask11(nrows11, ncols11) ) - mask11(:,:) = .FALSE. - - cellFactorR = level11%cellsize(iBasin) / cellsize0 - ! create a mask: Id with respect to Level 0 - ! create a mask at Level 11: Id with respect to Level 0 - do jc = 1, ncols0 - jcc = ceiling(real(jc, dp) / cellFactorR) - do ic = 1, nrows0 - if (.NOT. mask0(ic, jc)) cycle - icc = ceiling(real(ic,dp) / cellFactorR) - mask11(icc, jcc) = .TRUE. - end do - end do - - ! set number of cells (equals nNodes) - ncells = count( mask11 ) - - ! initialize areacell - allocate ( areacell(ncells) ) - areacell = nodata_i4 - ! allocate bounds - allocate ( upBound1 (ncells) ) - allocate ( downBound1 (ncells) ) - allocate ( leftBound1 (ncells) ) - allocate ( rightBound1 (ncells) ) - upBound1(:) = nodata_i4 - downBound1(:) = nodata_i4 - leftBound1(:) = nodata_i4 - rightBound1(:) = nodata_i4 + integer(i4) :: nrows1, ncols1 + integer(i4) :: nrows11, ncols11 + integer(i4) :: kk + integer(i4) :: icc, jcc + integer(i4) :: iu, id, jl, jr + integer(i4), dimension(:, :), allocatable :: L11Id_on_L1 ! mapping of L11 Id on L1 + integer(i4), dimension(:, :), allocatable :: L1Id_on_L11 ! mapping of L1 Id on L11 + integer(i4), dimension(:, :), allocatable :: dummy_2d_id ! dummy ID + real(dp) :: cellFactorRbyH + integer(i4) :: cellFactorRbyH_inv + + nrows1 = level1(iBasin)%nrows + nrows11 = level11(iBasin)%nrows + ncols1 = level1(iBasin)%ncols + ncols11 = level11(iBasin)%ncols ! allocate variables for mapping L11 Ids and L1 Ids - allocate ( L11Id_on_L1 (nrows1, ncols1 ) ) - allocate ( L1Id_on_L11 (nrows11, ncols11 ) ) - allocate ( Id11 (nrows11, ncols11 ) ) - allocate ( Id1 (nrows1, ncols1 ) ) - L11Id_on_L1(:,:) = nodata_i4 - L1Id_on_L11(:,:) = nodata_i4 - Id11(:,:) = nodata_i4 - Id1(:,:) = nodata_i4 - - ! allocate - allocate ( cellCoor(nCells,2) ) + allocate (L11Id_on_L1 (nrows1, ncols1)) + allocate (L1Id_on_L11 (nrows11, ncols11)) + L11Id_on_L1(:, :) = nodata_i4 + L1Id_on_L11(:, :) = nodata_i4 - ! initialize - cellCoor(:,:) = nodata_i4 + ! set cell factor for routing + cellFactorRbyH = level11(iBasin)%cellsize / level1(iBasin)%cellsize - ! counting valid cells at level 11 - kk = 0 - do jcc = 1, ncols11 - do icc = 1, nrows11 - if ( .not. mask11(icc,jcc) ) cycle + ! set mapping + ! create mapping between L11 and L1 for L11 resolution higher than L1 resolution + if (cellFactorRbyH .lt. 1._dp) then + allocate (dummy_2d_id (nrows1, ncols1)) + dummy_2d_id = unpack(level1(iBasin)%Id, level1(iBasin)%mask, nodata_i4) + cellFactorRbyH_inv = int(1. / cellFactorRbyH, i4) + kk = 0 + do jcc = 1, ncols1 + do icc = 1, nrows1 + if(.not. level1(iBasin)%mask(icc, jcc)) cycle kk = kk + 1 - Id11(icc,jcc) = kk - cellCoor(kk,1) = icc - cellCoor(kk,2) = jcc - end do - end do - - !-------------------------------------------------------- - ! UPDATE BASIN_MRM VARIABLE - !-------------------------------------------------------- - if(iBasin == 1) then - - ! allocate - allocate(basin_mrm%L11_iStart (nBasins)) - allocate(basin_mrm%L11_iEnd (nBasins)) - allocate(basin_mrm%L11_iStartMask (nBasins)) - allocate(basin_mrm%L11_iEndMask (nBasins)) - - ! initialize - basin_mrm%L11_iStart(:) = nodata_i4 - basin_mrm%L11_iEnd(:) = nodata_i4 - basin_mrm%L11_iStartMask(:) = nodata_i4 - basin_mrm%L11_iEndMask(:) = nodata_i4 - - ! basin information - basin_mrm%L11_iStart(iBasin) = 1 - basin_mrm%L11_iEnd (iBasin) = basin_mrm%L11_iStart(iBasin) + nCells - 1 - - basin_mrm%L11_iStartMask(iBasin) = 1 - basin_mrm%L11_iEndMask (iBasin) = basin_mrm%L11_iStartMask(iBasin) + nrows11*ncols11 - 1 - + ! + iu = (icc - 1) * cellFactorRbyH_inv + 1 + id = min(icc * cellFactorRbyH_inv, nrows11) + jl = (jcc - 1) * cellFactorRbyH_inv + 1 + jr = min(jcc * cellFactorRbyH_inv, ncols11) + + L1Id_on_L11(iu : id, jl : jr) = merge(dummy_2d_id, nodata_i4, level11(iBasin)%mask(iu : id, jl : jr)) + end do + end do else + allocate (dummy_2d_id (nrows11, ncols11)) + dummy_2d_id = unpack(level11(iBasin)%Id, level11(iBasin)%mask, nodata_i4) - ! basin information - basin_mrm%L11_iStart(iBasin) = basin_mrm%L11_iEnd(iBasin-1) + 1 - basin_mrm%L11_iEnd (iBasin) = basin_mrm%L11_iStart(iBasin) + nCells - 1 - - basin_mrm%L11_iStartMask(iBasin) = basin_mrm%L11_iEndMask(iBasin-1) + 1 - basin_mrm%L11_iEndMask (iBasin) = basin_mrm%L11_iStartMask(iBasin) + nrows11*ncols11 - 1 - - end if - - !-------------------------------------------------------- - ! CALCULATE L11_AREACELL AND CELL ID MAPPING WITH L1 - !-------------------------------------------------------- - ! level-0 cell area - allocate( areaCell0_2D(nrows0,ncols0) ) - areaCell0_2D(:,:) = UNPACK( L0_areaCell(iStart0:iEnd0), mask0, nodata_dp ) - - ! set cell factor for routing - cellFactorRbyH = level11%cellsize(iBasin) / level1%cellsize(iBasin) - cellFactorR = level11%cellsize(iBasin) / cellsize0 - - kk = 0 - do jcc = 1, ncols11 - do icc = 1, nrows11 - if( .not. mask11(icc,jcc)) cycle + kk = 0 + do jcc = 1, ncols11 + do icc = 1, nrows11 + if(.not. level11(iBasin)%mask(icc, jcc)) cycle kk = kk + 1 - ! coord. of all corners L11 -> of finer scale level-0 - iu = (icc-1) * nint(cellFactorR,i4) + 1 - id = icc * nint(cellFactorR,i4) - jl = (jcc-1) * nint(cellFactorR,i4) + 1 - jr = jcc * nint(cellFactorR,i4) - ! constrain the range of up, down, left, and right boundaries - if(iu < 1 ) iu = 1 - if(id > nrows0) id = nrows0 - if(jl < 1 ) jl = 1 - if(jr > ncols0) jr = ncols0 - - ! effective area [km2] & total no. of L0 cells within a given L1 cell - areaCell(kk) = sum( areacell0_2D(iu:id, jl:jr), mask0(iu:id, jl:jr) )*1.0E-6 - ! coord. of all corners L11 -> of finer scale level-1 - iu = (icc-1) * nint(cellFactorRbyH,i4) + 1 - id = icc * nint(cellFactorRbyH,i4) - jl = (jcc-1) * nint(cellFactorRbyH,i4) + 1 - jr = jcc * nint(cellFactorRbyH,i4) + iu = (icc - 1) * nint(cellFactorRbyH, i4) + 1 + id = icc * nint(cellFactorRbyH, i4) + jl = (jcc - 1) * nint(cellFactorRbyH, i4) + 1 + jr = jcc * nint(cellFactorRbyH, i4) ! constrain the range of up, down, left, and right boundaries - if( iu < 1 ) iu = 1 - if( id > nrows1 ) id = nrows1 - if( jl < 1 ) jl = 1 - if( jr > ncols1 ) jr = ncols1 - - upBound1 (kk) = iu - downBound1 (kk) = id - leftBound1 (kk) = jl - rightBound1(kk) = jr - - ! set mapping - if (ge(cellFactorRbyH, 1._dp)) then - ! Delimitation of level-11 cells on level-1 for L11 resolution lower than L1 resolution - L11Id_on_L1(iu:id, jl:jr) = Id11(icc, jcc) - end if - end do - end do - - ! create mapping between L11 and L1 for L11 resolution higher than L1 resolution - if (cellFactorRbyH .lt. 1._dp) then - cellFactorRbyH_inv = int(1. / cellFactorRbyH, i4) - kk = 0 - do jcc = 1, ncols1 - do icc = 1, nrows1 - if( .not. mask1(icc,jcc)) cycle - kk = kk + 1 - ! - iu = (icc - 1) * cellFactorRbyH_inv + 1 - id = min(icc * cellFactorRbyH_inv, nrows11) - jl = (jcc - 1) * cellFactorRbyH_inv + 1 - jr = min(jcc * cellFactorRbyH_inv, ncols11) - ! - Id1(icc,jcc) = kk - L1Id_on_L11(iu:id, jl:jr) = merge(Id1(icc,jcc), nodata_i4, mask11(iu:id, jl:jr)) - end do - end do + if(iu < 1) iu = 1 + if(id > nrows1) id = nrows1 + if(jl < 1) jl = 1 + if(jr > ncols1) jr = ncols1 + + ! Delimitation of level-11 cells on level-1 for L11 resolution lower than L1 resolution + L11Id_on_L1(iu : id, jl : jr) = dummy_2d_id(icc, jcc) + end do + end do end if - ! L1 data sets - call append( L1_id, pack ( Id1(:,:), mask1 ) ) - call append( L1_L11_Id, pack ( L11Id_on_L1(:,:), mask1 ) ) - + call append(L1_L11_Id, pack (L11Id_on_L1(:, :), level1(iBasin)%mask)) ! L11 data sets - call append( L11_L1_Id, PACK ( L1Id_on_L11(:,:), mask11) ) - call append( basin_mrm%L11_Mask, RESHAPE( mask11, (/nrows11*ncols11/) ) ) - ! other L11 data sets - call append( L11_cellCoor, cellCoor ) - call append( L11_Id, pack(Id11, mask11) ) - call append( L11_areaCell, areacell) - call append( L11_upBound_L1, upBound1(:) ) - call append( L11_downBound_L1, downBound1(:) ) - call append( L11_leftBound_L1, leftBound1(:) ) - call append( L11_rightBound_L1, rightBound1(:) ) - - L11_nCells = size( L11_Id, 1 ) - + call append(L11_L1_Id, PACK (L1Id_on_L11(:, :), level11(iBasin)%mask)) ! free space - deallocate(Id11, mask1, mask11, cellCoor, areacell, & - upBound1, downBound1, leftBound1, rightBound1, & - L11Id_on_L1, L1Id_on_L11) - - end subroutine L11_variable_init + deallocate(L11Id_on_L1, L1Id_on_L11, dummy_2d_id) + end subroutine L11_L1_mapping ! -------------------------------------------------------------------------- ! NAME @@ -441,10 +200,10 @@ end subroutine L11_variable_init ! EXAMPLE ! None - + ! LITERATURE ! None - + ! HISTORY !> \author Luis Samaniego !> \date Dec 2005 @@ -457,138 +216,60 @@ end subroutine L11_variable_init ! Stephan Thober, May 2016 - introducing multiple outlets ! -------------------------------------------------------------------------- subroutine L11_flow_direction(iBasin) - use mo_append, only: append - use mo_message, only: message - use mo_mrm_constants, only: nodata_i4 - use mo_mrm_global_variables, only: & - basin_mrm, & - level0, & - nBasins, & - level11, & - L0_fAcc, L0_fDir, & - L0_draSC, & ! INOUT: draining cell of each sub catchment (== cell L11) - L0_cellCoor, & - L0_id, & - L0_L11_Id, & ! INOUT: mapping of L11 Id on L0 - L11_Id, & - L11_cellCoor, & - L11_rowOut, & ! INOUT: grid vertical location of the Outlet - L11_colOut, & ! INOUT: grid horizontal location of the Outlet - L11_fDir, & ! INOUT: flow direction at L11 (standard notation) - L11_upBound_L0, & ! INOUT: row start at finer level-0 scale - L11_downBound_L0, & ! INOUT: row end at finer level-0 scale - L11_leftBound_L0, & ! INOUT: col start at finer level-0 scale - L11_rightBound_L0, & ! INOUT: col end at finer level-0 scale - L11_nOutlets - use mo_mrm_tools, only: get_basin_info_mrm - use mo_string_utils, only: num2str + use mo_append, only : append + use mo_message, only : message + use mo_common_constants, only : nodata_i4 + use mo_common_variables, only : & + level0, L0_Basin, Grid + use mo_mrm_global_variables, only : & + basin_mrm, & + level11, & + L0_l11_remap, & + L0_fAcc, L0_fDir, & + L0_draSC, & ! INOUT: draining cell of each sub catchment (== cell L11) + L11_rowOut, & ! INOUT: grid vertical location of the Outlet + L11_colOut, & ! INOUT: grid horizontal location of the Outlet + L11_fDir, & ! INOUT: flow direction at L11 (standard notation) + L11_nOutlets + use mo_string_utils, only : num2str implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nCells0 - integer(i4) :: nrows0, ncols0 - integer(i4) :: nrows11, ncols11 - integer(i4) :: nNodes ! = ncells11 - integer(i4) :: iStart0, iEnd0 - integer(i4) :: iStart11, iEnd11 - logical, dimension(:,:), allocatable :: mask0, mask11 - integer(i4), dimension(:), allocatable :: upBound0, downBound0, leftBound0, rightBound0 - real(dp) :: cellFactorR - integer(i4) :: icc, jcc - integer(i4) :: ii, jj, kk, ic, jc - integer(i4) :: iu, id - integer(i4) :: jl, jr - integer(i4) :: iRow, jCol - integer(i4), dimension(:,:), allocatable :: L11Id_on_L0 ! mapping of L11 Id on L0 - integer(i4), dimension(:,:), allocatable :: iD0 - integer(i4), dimension(:,:), allocatable :: fDir0 - integer(i4), dimension(:,:), allocatable :: fAcc0 - integer(i4), dimension(:,:), allocatable :: Id11 ! ids of grid at level-11 - integer(i4), dimension(:,:), allocatable :: fDir11 - integer(i4), dimension(:,:), allocatable :: cellCoor0 - integer(i4), dimension(:,:), allocatable :: cellCoor11 - integer(i4), dimension(:), allocatable :: rowOut ! northing cell loc. of the Outlet - integer(i4), dimension(:), allocatable :: colOut ! easting cell loc. of the Outlet - integer(i4), dimension(:,:), allocatable :: draSC0 - integer(i4), dimension(:,:), allocatable :: oLoc ! output location in L0 - integer(i4) :: side - integer(i4) :: fAccMax, idMax - integer(i4) :: Noutlet ! Number of outlet found - integer(i4) :: old_Noutlet ! Number of outlets before this basin - integer(i4), dimension(:,:), allocatable :: dummy ! helping variable for storing L0 outlet coordinates - logical :: is_outlet ! flag whether outlet is found + integer(i4) :: nCells0 + integer(i4) :: nrows0, ncols0 + integer(i4) :: s0, e0 + integer(i4) :: nrows11, ncols11 + integer(i4) :: nNodes ! = ncells11 + integer(i4) :: ii, jj, kk, ic, jc + integer(i4) :: iu, id + integer(i4) :: jl, jr + integer(i4) :: iRow, jCol + integer(i4), dimension(:, :), allocatable :: iD0 + integer(i4), dimension(:, :), allocatable :: fDir0 + integer(i4), dimension(:, :), allocatable :: fAcc0 + integer(i4), dimension(:, :), allocatable :: fDir11 + integer(i4), dimension(:), allocatable :: rowOut ! northing cell loc. of the Outlet + integer(i4), dimension(:), allocatable :: colOut ! easting cell loc. of the Outlet + integer(i4), dimension(:, :), allocatable :: draSC0 + integer(i4), dimension(:, :), allocatable :: oLoc ! output location in L0 + integer(i4) :: side + integer(i4) :: fAccMax, idMax + integer(i4) :: Noutlet ! Number of outlet found + integer(i4) :: old_Noutlet ! Number of outlets before this basin + logical :: is_outlet ! flag whether outlet is found + type(Grid), pointer :: level0_iBasin !-------------------------------------------------------- ! STEPS: ! 1) Estimate each variable locally for a given basin ! 2) Pad each variable to its corresponding global one !-------------------------------------------------------- - - ! level-0 information - call get_basin_info_mrm (iBasin, 0, nrows0, ncols0, ncells=nCells0, & - iStart=iStart0, iEnd=iEnd0, mask=mask0) - - ! level-11 information - call get_basin_info_mrm (iBasin, 11, nrows11, ncols11, ncells=nNodes, & - iStart=iStart11, iEnd=iEnd11, mask=mask11) - - ! set cell factors - cellFactorR = level11%cellsize(iBasin) / level0%cellsize(iBasin) - - ! allocate - allocate ( upBound0 (nNodes) ) - allocate ( downBound0 (nNodes) ) - allocate ( leftBound0 (nNodes) ) - allocate ( rightBound0 (nNodes) ) - - allocate ( L11Id_on_L0 (nrows0, ncols0 ) ) - allocate ( Id11(nrows11, ncols11) ) - ! initialize - Noutlet = 0_i4 - upBound0(:) = nodata_i4 - downBound0(:) = nodata_i4 - leftBound0(:) = nodata_i4 - rightBound0(:) = nodata_i4 - - L11Id_on_L0(:,:) = nodata_i4 - Id11(:,:) = nodata_i4 - - ! get Ids of L11 - Id11(:,:) = unpack( L11_Id(iStart11:iEnd11), mask11, nodata_i4 ) - - kk = 0 - do jcc = 1, ncols11 - do icc = 1, nrows11 - if( .not. mask11(icc,jcc)) cycle - kk = kk + 1 - - ! coord. of all corners L11 -> on finer scale level-0 - iu = (icc-1) * nint(cellFactorR,i4) + 1 - id = icc * nint(cellFactorR,i4) - jl = (jcc-1) * nint(cellFactorR,i4) + 1 - jr = jcc * nint(cellFactorR,i4) - - ! constrain the range of up, down, left, and right boundaries - if( iu < 1 ) iu = 1 - if( id > nrows0 ) id = nrows0 - if( jl < 1 ) jl = 1 - if( jr > ncols0 ) jr = ncols0 - - upBound0 (kk) = iu - downBound0 (kk) = id - leftBound0 (kk) = jl - rightBound0(kk) = jr - - ! Delimitation of level-11 cells on level-0 - L11Id_on_L0(iu:id, jl:jr) = Id11(icc, jcc) - - end do - end do - + Noutlet = 0_i4 + level0_iBasin => level0(L0_Basin(iBasin)) !------------------------------------------------------------------ ! Set Flow Direction at Level 11 ! Searching order @@ -601,296 +282,289 @@ subroutine L11_flow_direction(iBasin) ! flow direction at level-11 ! allocate - allocate ( iD0 ( nrows0, ncols0 ) ) - allocate ( fAcc0 ( nrows0, ncols0 ) ) - allocate ( fDir0 ( nrows0, ncols0 ) ) - allocate ( draSC0 ( nrows0, ncols0 ) ) - allocate ( cellCoor0 ( nCells0, 2 ) ) - allocate ( cellCoor11 ( nNodes, 2 ) ) - allocate ( fDir11 ( nrows11, ncols11 ) ) - allocate ( rowOut ( nNodes ) ) - allocate ( colOut ( nNodes ) ) - allocate ( oLoc ( 1, 2 ) ) + nrows0 = level0_iBasin%nrows + ncols0 = level0_iBasin%ncols + nCells0 = level0_iBasin%ncells + nrows11 = level11(iBasin)%nrows + ncols11 = level11(iBasin)%ncols + nNodes = level11(iBasin)%ncells + s0 = level0_iBasin%iStart + e0 = level0_iBasin%iEnd + + allocate (iD0 (nrows0, ncols0)) + allocate (fAcc0 (nrows0, ncols0)) + allocate (fDir0 (nrows0, ncols0)) + allocate (draSC0 (nrows0, ncols0)) + allocate (fDir11 (nrows11, ncols11)) + allocate (rowOut (nNodes)) + allocate (colOut (nNodes)) + allocate (oLoc (1, 2)) ! initialize - iD0(:,:) = nodata_i4 - fAcc0(:,:) = nodata_i4 - fDir0(:,:) = nodata_i4 - draSC0(:,:) = nodata_i4 - cellCoor0(:,:) = nodata_i4 - cellCoor11(:,:) = nodata_i4 - fDir11(:,:) = nodata_i4 - rowOut(:) = nodata_i4 - colOut(:) = nodata_i4 - oLoc(:,:) = nodata_i4 + iD0(:, :) = nodata_i4 + fAcc0(:, :) = nodata_i4 + fDir0(:, :) = nodata_i4 + draSC0(:, :) = nodata_i4 + fDir11(:, :) = nodata_i4 + rowOut(:) = nodata_i4 + colOut(:) = nodata_i4 + oLoc(:, :) = nodata_i4 - ! get iD, fAcc, fDir at L0 - iD0(:,:) = UNPACK( L0_Id (iStart0:iEnd0), mask0, nodata_i4 ) - fAcc0(:,:) = UNPACK( L0_fAcc (iStart0:iEnd0), mask0, nodata_i4 ) - fDir0(:,:) = UNPACK( L0_fDir (iStart0:iEnd0), mask0, nodata_i4 ) - cellCoor0(:,:) = L0_cellCoor (iStart0 : iEnd0, :) - cellCoor11(:,:) = L11_cellCoor (iStart11: iEnd11, :) + ! get iD, fAcc, fDir at L0 + iD0(:, :) = UNPACK(level0_iBasin%Id, level0_iBasin%mask, nodata_i4) + fAcc0(:, :) = UNPACK(L0_fAcc (s0 : e0), level0_iBasin%mask, nodata_i4) + fDir0(:, :) = UNPACK(L0_fDir (s0 : e0), level0_iBasin%mask, nodata_i4) ! case where routing and input data scale is similar IF(nCells0 .EQ. nNodes) THEN - oLoc(1, :) = maxloc( fAcc0, mask0 ) - kk = L11Id_on_L0( oLoc(1, 1), oLoc(1, 2) ) + oLoc(1, :) = maxloc(fAcc0, level0_iBasin%mask) + kk = L0_L11_remap(iBasin)%lowres_id_on_highres(oLoc(1, 1), oLoc(1, 2)) ! for a single node model run if(nCells0 .EQ. 1) then - fDir11(1,1) = fDir0(oLoc(1, 1), oLoc(1, 2)) + fDir11(1, 1) = fDir0(oLoc(1, 1), oLoc(1, 2)) else - fDir11(:,:) = fDir0(:,:) + fDir11(:, :) = fDir0(:, :) end if - fDir11 ( cellCoor11(kk,1), cellCoor11(kk,2) ) = 0 + fDir11 (level11(iBasin)%CellCoor(kk, 1), level11(iBasin)%CellCoor(kk, 2)) = 0 ! set location of main outlet in L11 do kk = 1, nNodes - ii = cellCoor11( kk, 1 ) - jj = cellCoor11( kk, 2 ) - rowOut(kk) = ii - colOut(kk) = jj + ii = level11(iBasin)%CellCoor(kk, 1) + jj = level11(iBasin)%CellCoor(kk, 2) + rowOut(kk) = ii + colOut(kk) = jj end do - do kk = 1, ncells0 - ii = cellCoor0( kk, 1 ) - jj = cellCoor0( kk, 2 ) - draSC0(ii, jj) = kk + do kk = 1, ncells0 + ii = level0_iBasin%CellCoor(kk, 1) + jj = level0_iBasin%CellCoor(kk, 2) + draSC0(ii, jj) = kk end do ! case where routing and input data scale differs - ELSE + ELSE ! ======================================================================= ! ST: find all cells whose downstream cells are outside the domain ! ======================================================================= do ii = 1, nCells0 - iRow = cellCoor0(ii, 1) - jCol = cellCoor0(ii, 2) - call moveDownOneCell(fDir0(iRow, jCol), iRow, jCol) - ! check whether new location is inside bound - is_outlet = .False. - if ((iRow .le. 0_i4) .or. (iRow .gt. nrows0) .or. & - (jCol .le. 0_i4) .or. (jCol .gt. ncols0)) then - is_outlet = .True. - else - if (fdir0(iRow, jCol) .lt. 0) is_outlet = .True. - end if - ! - if (is_outlet) then - Noutlet = Noutlet + 1_i4 - ! cell is an outlet - if (Noutlet .eq. 1) then - oLoc(1, :) = cellCoor0(ii, :) - else - call append(oLoc, cellCoor0(ii:ii, :)) - end if - ! drain this cell into corresponding L11 cell - kk = L11Id_on_L0(oLoc(Noutlet, 1), oLoc(Noutlet, 2)) - draSC0(oLoc(Noutlet, 1), oLoc(Noutlet, 2)) = kk - ! check whether cell has maximum flow accumulation - ! coord. of all corners - iu = upBound0 (kk) - id = downBound0 (kk) - jl = leftBound0 (kk) - jr = rightBound0(kk) - if (maxval(facc0(iu: id, jl: jr)) .eq. facc0(oLoc(Noutlet, 1), oLoc(Noutlet, 2))) then - ! set location of outlet at L11 - rowOut(kk) = oLoc(Noutlet, 1) - colOut(kk) = oLoc(Noutlet, 2) - fdir11(cellCoor11(kk,1), cellCoor11(kk,2)) = 0 - end if - end if + iRow = level0_iBasin%CellCoor(ii, 1) + jCol = level0_iBasin%CellCoor(ii, 2) + call moveDownOneCell(fDir0(iRow, jCol), iRow, jCol) + ! check whether new location is inside bound + is_outlet = .False. + if ((iRow .le. 0_i4) .or. (iRow .gt. nrows0) .or. & + (jCol .le. 0_i4) .or. (jCol .gt. ncols0)) then + is_outlet = .True. + else + if (fdir0(iRow, jCol) .lt. 0) is_outlet = .True. + end if + ! + if (is_outlet) then + Noutlet = Noutlet + 1_i4 + ! cell is an outlet + if (Noutlet .eq. 1) then + oLoc(1, :) = level0_iBasin%CellCoor(ii, :) + else + call append(oLoc, level0_iBasin%CellCoor(ii : ii, :)) + end if + ! drain this cell into corresponding L11 cell + kk = L0_L11_remap(iBasin)%lowres_id_on_highres(oLoc(Noutlet, 1), oLoc(Noutlet, 2)) + draSC0(oLoc(Noutlet, 1), oLoc(Noutlet, 2)) = kk + ! check whether cell has maximum flow accumulation + ! coord. of all corners + iu = l0_l11_remap(iBasin)%upper_bound (kk) + id = l0_l11_remap(iBasin)%lower_bound (kk) + jl = l0_l11_remap(iBasin)%left_bound (kk) + jr = l0_l11_remap(iBasin)%right_bound(kk) + if (maxval(facc0(iu : id, jl : jr)) .eq. facc0(oLoc(Noutlet, 1), oLoc(Noutlet, 2))) then + ! set location of outlet at L11 + rowOut(kk) = oLoc(Noutlet, 1) + colOut(kk) = oLoc(Noutlet, 2) + fdir11(level11(iBasin)%CellCoor(kk, 1), level11(iBasin)%CellCoor(kk, 2)) = 0 + end if + end if end do - + ! finding cell L11 outlets - using L0_fAcc do kk = 1, nNodes - ! exclude outlet L11 - if ( rowOut(kk) > 0 ) cycle - - ic = cellCoor11(kk,1) - jc = cellCoor11(kk,2) - - ! coord. of all corners - iu = upBound0 (kk) - id = downBound0 (kk) - jl = leftBound0 (kk) - jr = rightBound0(kk) - - fAccMax = -9 - idMax = 0 - side = -1 - ! searching on side 4 - do jj = jl,jr - if ( ( fAcc0(iu,jj) > fAccMax ) .and. & - ( fDir0(iu,jj) == 32 .or. & - fDir0(iu,jj) == 64 .or. & - fDir0(iu,jj) == 128 ) ) then - fAccMax = fAcc0(iu,jj) - idMax = id0(iu,jj) - side = 4 - end if - end do - - ! searching on side 1 - do ii = iu,id - if ( ( fAcc0(ii,jr) > fAccMax ) .and. & - ( fDir0(ii,jr) == 1 .or. & - fDir0(ii,jr) == 2 .or. & - fDir0(ii,jr) == 128 ) ) then - fAccMax = fAcc0(ii,jr) - idMax = id0(ii,jr) - side = 1 - end if - end do - - ! searching on side 2 - do jj = jl,jr - if ( ( fAcc0(id,jj) > fAccMax ) .and. & - ( fDir0(id,jj) == 2 .or. & - fDir0(id,jj) == 4 .or. & - fDir0(id,jj) == 8 ) ) then - fAccMax = fAcc0(id,jj) - idMax = id0(id,jj) - side = 2 - end if - end do - - ! searching on side 3 - do ii = iu,id - if ( ( fAcc0(ii,jl) > fAccMax ) .and. & - ( fDir0(ii,jl) == 8 .or. & - fDir0(ii,jl) == 16 .or. & - fDir0(ii,jl) == 32 ) ) then - fAccMax = fAcc0(ii,jl) - idMax = id0(ii,jl) - side = 3 - end if - end do - - ! set location of the cell-outlet (row, col) in L0 - ii = cellCoor0( idMax, 1 ) - jj = cellCoor0( idMax, 2 ) - rowOut(kk) = ii - colOut(kk) = jj - draSC0(ii,jj) = kk - - ! set fDir at L11 - if ( ii == iu .and. jj == jl ) then - select case ( fDir0(ii,jj) ) - case (8,16) - fDir11(ic,jc) = 16 - case (32) - fDir11(ic,jc) = 32 - case (64,128) - fDir11(ic,jc) = 64 - end select - elseif ( ii == iu .and. jj == jr ) then - select case ( fDir0(ii,jj) ) - case (32,64) - fDir11(ic,jc) = 64 - case (128) - fDir11(ic,jc) = 128 - case (1,2) - fDir11(ic,jc) = 1 - end select - elseif ( ii == id .and. jj == jl ) then - select case ( fDir0(ii,jj) ) - case (2,4) - fDir11(ic,jc) = 4 - case (8) - fDir11(ic,jc) = 8 - case (16,32) - fDir11(ic,jc) = 16 - end select - elseif ( ii == id .and. jj == jr ) then - select case ( fDir0(ii,jj) ) - case (128,1) - fDir11(ic,jc) = 1 - case (2) - fDir11(ic,jc) = 2 - case (4,8) - fDir11(ic,jc) = 4 - end select - else - ! cell on one side - select case (side) - case (1) - fDir11(ic,jc) = 1 - case (2) - fDir11(ic,jc) = 4 - case (3) - fDir11(ic,jc) = 16 - case (4) - fDir11(ic,jc) = 64 - case default - stop 'Error L11_flow_direction: side = -1' - end select - end if + ! exclude outlet L11 + if (rowOut(kk) > 0) cycle + + ic = level11(iBasin)%CellCoor(kk, 1) + jc = level11(iBasin)%CellCoor(kk, 2) + + ! coord. of all corners + iu = l0_l11_remap(iBasin)%upper_bound (kk) + id = l0_l11_remap(iBasin)%lower_bound (kk) + jl = l0_l11_remap(iBasin)%left_bound (kk) + jr = l0_l11_remap(iBasin)%right_bound(kk) + + fAccMax = -9 + idMax = 0 + side = -1 + ! searching on side 4 + do jj = jl, jr + if ((fAcc0(iu, jj) > fAccMax) .and. & + (fDir0(iu, jj) == 32 .or. & + fDir0(iu, jj) == 64 .or. & + fDir0(iu, jj) == 128)) then + fAccMax = fAcc0(iu, jj) + idMax = id0(iu, jj) + side = 4 + end if + end do + + ! searching on side 1 + do ii = iu, id + if ((fAcc0(ii, jr) > fAccMax) .and. & + (fDir0(ii, jr) == 1 .or. & + fDir0(ii, jr) == 2 .or. & + fDir0(ii, jr) == 128)) then + fAccMax = fAcc0(ii, jr) + idMax = id0(ii, jr) + side = 1 + end if + end do + + ! searching on side 2 + do jj = jl, jr + if ((fAcc0(id, jj) > fAccMax) .and. & + (fDir0(id, jj) == 2 .or. & + fDir0(id, jj) == 4 .or. & + fDir0(id, jj) == 8)) then + fAccMax = fAcc0(id, jj) + idMax = id0(id, jj) + side = 2 + end if + end do + + ! searching on side 3 + do ii = iu, id + if ((fAcc0(ii, jl) > fAccMax) .and. & + (fDir0(ii, jl) == 8 .or. & + fDir0(ii, jl) == 16 .or. & + fDir0(ii, jl) == 32)) then + fAccMax = fAcc0(ii, jl) + idMax = id0(ii, jl) + side = 3 + end if + end do + + ! set location of the cell-outlet (row, col) in L0 + ii = level0_iBasin%CellCoor(idMax, 1) + jj = level0_iBasin%CellCoor(idMax, 2) + rowOut(kk) = ii + colOut(kk) = jj + draSC0(ii, jj) = kk + + ! set fDir at L11 + if (ii == iu .and. jj == jl) then + select case (fDir0(ii, jj)) + case (8, 16) + fDir11(ic, jc) = 16 + case (32) + fDir11(ic, jc) = 32 + case (64, 128) + fDir11(ic, jc) = 64 + end select + elseif (ii == iu .and. jj == jr) then + select case (fDir0(ii, jj)) + case (32, 64) + fDir11(ic, jc) = 64 + case (128) + fDir11(ic, jc) = 128 + case (1, 2) + fDir11(ic, jc) = 1 + end select + elseif (ii == id .and. jj == jl) then + select case (fDir0(ii, jj)) + case (2, 4) + fDir11(ic, jc) = 4 + case (8) + fDir11(ic, jc) = 8 + case (16, 32) + fDir11(ic, jc) = 16 + end select + elseif (ii == id .and. jj == jr) then + select case (fDir0(ii, jj)) + case (128, 1) + fDir11(ic, jc) = 1 + case (2) + fDir11(ic, jc) = 2 + case (4, 8) + fDir11(ic, jc) = 4 + end select + else + ! cell on one side + select case (side) + case (1) + fDir11(ic, jc) = 1 + case (2) + fDir11(ic, jc) = 4 + case (3) + fDir11(ic, jc) = 16 + case (4) + fDir11(ic, jc) = 64 + case default + stop 'Error L11_flow_direction: side = -1' + end select + end if end do - - END IF - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - - ! allocate space for row and col Outlet - if(iBasin .eq. 1) then - allocate( basin_mrm%L0_Noutlet(nBasins) ) - allocate( basin_mrm%L0_rowOutlet(1, nBasins) ) - allocate( basin_mrm%L0_colOutlet(1, nBasins) ) - basin_mrm%L0_Noutlet = nodata_i4 - basin_mrm%L0_rowOutlet = nodata_i4 - basin_mrm%L0_colOutlet = nodata_i4 - end if - - ! L0 data sets - call append( L0_draSC, PACK ( draSC0(:,:), mask0) ) - call append( L0_L11_Id, PACK ( L11Id_on_L0(:,:), mask0) ) - basin_mrm%L0_Noutlet(iBasin) = Noutlet - ! set L0 outlet coordinates - old_Noutlet = size(basin_mrm%L0_rowOutlet, dim=1) - if (Noutlet .le. old_Noutlet) then - basin_mrm%L0_rowOutlet(:Noutlet, iBasin) = oLoc(:, 1) - basin_mrm%L0_colOutlet(:Noutlet, iBasin) = oLoc(:, 2) - else + + END IF + !-------------------------------------------------------- + ! Start padding up local variables to global variables + !-------------------------------------------------------- + + ! allocate space for row and col Outlet + allocate(basin_mrm(iBasin)%L0_rowOutlet(1)) + allocate(basin_mrm(iBasin)%L0_colOutlet(1)) + basin_mrm(iBasin)%L0_Noutlet = nodata_i4 + basin_mrm(iBasin)%L0_rowOutlet = nodata_i4 + basin_mrm(iBasin)%L0_colOutlet = nodata_i4 + + ! L0 data sets + ! check whether L0 data is shared + if (iBasin .eq. 1) then + call append(L0_draSC, PACK (draSC0(:, :), level0_iBasin%mask)) + else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1)) then + call append(L0_draSC, PACK (draSC0(:, :), level0_iBasin%mask)) + end if + + basin_mrm(iBasin)%L0_Noutlet = Noutlet + ! set L0 outlet coordinates + old_Noutlet = size(basin_mrm(iBasin)%L0_rowOutlet, dim = 1) + if (Noutlet .le. old_Noutlet) then + basin_mrm(iBasin)%L0_rowOutlet(: Noutlet) = oLoc(:, 1) + basin_mrm(iBasin)%L0_colOutlet(: Noutlet) = oLoc(:, 2) + else ! store up to size of old_Noutlet - basin_mrm%L0_rowOutlet(:old_Noutlet, iBasin) = oLoc(:old_Noutlet, 1) - basin_mrm%L0_colOutlet(:old_Noutlet, iBasin) = oLoc(:old_Noutlet, 2) + basin_mrm(iBasin)%L0_rowOutlet(: old_Noutlet) = oLoc(: old_Noutlet, 1) + basin_mrm(iBasin)%L0_colOutlet(: old_Noutlet) = oLoc(: old_Noutlet, 2) ! enlarge rowOutlet and colOutlet in basin_mrm structure - allocate(dummy(Noutlet - old_Noutlet, nBasins)) - dummy = nodata_i4 - dummy(:, iBasin) = oLoc(old_Noutlet + 1:, 1) - call append(basin_mrm%L0_rowOutlet, dummy) - dummy(:, iBasin) = oLoc(old_Noutlet + 1:, 2) - call append(basin_mrm%L0_colOutlet, dummy) - deallocate(dummy) - end if - - ! L11 data sets - call append( L11_nOutlets, count(fdir11 .eq. 0_i4) ) - call append( L11_fDir, PACK ( fDir11(:,:), mask11) ) - call append( L11_rowOut , rowOut(:) ) - call append( L11_colOut , colOut(:) ) - call append( L11_upBound_L0 , upBound0(:) ) - call append( L11_downBound_L0 , downBound0(:) ) - call append( L11_leftBound_L0 , leftBound0(:) ) - call append( L11_rightBound_L0 , rightBound0(:) ) - - ! communicate - call message('') - call message(' Basin: '//num2str(iBasin, '(i3)')) - call message(' Number of outlets found at Level 0:.. '//num2str(Noutlet, '(i7)')) - call message(' Number of outlets found at Level 11:. '//num2str(count(fdir11 .eq. 0_i4), '(i7)')) - - ! free space - deallocate(mask0, mask11, & - upBound0, downBound0, leftBound0, rightBound0, & - L11Id_on_L0, Id11, & - iD0, fDir0, fAcc0, fDir11, cellCoor0, & - cellCoor11, rowOut, colOut, draSC0 ) - - end subroutine L11_flow_direction + !TODO: do other basins also need to be enlarged accordingly??? + call append(basin_mrm(iBasin)%L0_rowOutlet, oLoc(old_Noutlet + 1 :, 1)) + call append(basin_mrm(iBasin)%L0_colOutlet, oLoc(old_Noutlet + 1 :, 2)) + end if + + ! L11 data sets + call append(L11_nOutlets, count(fdir11 .eq. 0_i4)) + call append(L11_fDir, PACK (fDir11(:, :), level11(iBasin)%mask)) + call append(L11_rowOut, rowOut(:)) + call append(L11_colOut, colOut(:)) + + ! communicate + call message('') + call message(' Basin: ' // num2str(iBasin, '(i3)')) + call message(' Number of outlets found at Level 0:.. ' // num2str(Noutlet, '(i7)')) + call message(' Number of outlets found at Level 11:. ' // num2str(count(fdir11 .eq. 0_i4), '(i7)')) + + ! free space + deallocate(fDir0, fAcc0, fDir11, rowOut, colOut, draSC0) + + end subroutine L11_flow_direction ! ------------------------------------------------------------------ @@ -934,10 +608,10 @@ end subroutine L11_flow_direction ! EXAMPLE ! None - + ! LITERATURE ! None - + ! HISTORY !> \author Luis Samaniego !> \date Dec 2005 @@ -948,73 +622,60 @@ end subroutine L11_flow_direction ! ------------------------------------------------------------------ subroutine L11_set_network_topology(iBasin) - use mo_mrm_constants, only: nodata_i4 - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - L11_Id, L11_cellCoor, & - L11_fDir, & - L11_fromN, & ! INOUT: from node - L11_toN ! INOUT: to node + use mo_common_constants, only : nodata_i4 + use mo_append, only : append + use mo_mrm_global_variables, only : & + level11, & + L11_fDir, & + L11_fromN, & ! INOUT: from node + L11_toN ! INOUT: to node implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nNodes - integer(i4) :: nrows11, ncols11 - integer(i4) :: iStart11, iEnd11 - logical, dimension(:,:), allocatable :: mask11 - integer(i4), dimension(:,:), allocatable :: cellCoor11 - integer(i4), dimension(:,:), allocatable :: Id11 ! ids of grid at level-11 - integer(i4), dimension(:,:), allocatable :: fDir11 - integer(i4) :: jj, kk, ic, jc - integer(i4) :: fn, tn - - integer(i4), dimension(:), allocatable :: nLinkFromN, nLinkToN - - ! level-11 information - call get_basin_info_mrm (iBasin, 11, nrows11, ncols11, ncells=nNodes, & - iStart=iStart11, iEnd=iEnd11, mask=mask11) + integer(i4), dimension(:, :), allocatable :: fDir11 + integer(i4), dimension(:, :), allocatable :: dummy_2d_id + integer(i4) :: jj, kk, ic, jc + integer(i4) :: fn, tn + + integer(i4), dimension(:), allocatable :: nLinkFromN, nLinkToN ! Routing network vectors have nNodes size instead of nLinks to ! avoid the need of having two extra indices to identify a basin. ! allocate - allocate ( nLinkFromN ( nNodes ) ) ! valid from (1 : nLinks) - allocate ( nLinkToN ( nNodes ) ) ! " - allocate ( cellCoor11 ( nNodes, 2 ) ) - allocate ( Id11 ( nrows11, ncols11 ) ) - allocate ( fDir11 ( nrows11, ncols11 ) ) + allocate (nLinkFromN (level11(iBasin)%nCells)) ! valid from (1 : nLinks) + allocate (nLinkToN (level11(iBasin)%nCells)) ! " + allocate (fDir11 (level11(iBasin)%nrows, level11(iBasin)%ncols)) + allocate (dummy_2d_id(level11(iBasin)%nrows, level11(iBasin)%ncols)) + dummy_2d_id = unpack(level11(iBasin)%Id, level11(iBasin)%mask, nodata_i4) + ! initialize - nLinkFromN(:) = nodata_i4 - nLinkToN(:) = nodata_i4 - cellCoor11(:,:) = nodata_i4 - Id11(:,:) = nodata_i4 - fDir11(:,:) = nodata_i4 + nLinkFromN(:) = nodata_i4 + nLinkToN(:) = nodata_i4 + fDir11(:, :) = nodata_i4 ! get grids of L11 - Id11(:,:) = UNPACK( L11_Id ( iStart11 : iEnd11), mask11, nodata_i4 ) - fDir11(:,:) = UNPACK( L11_fDir ( iStart11 : iEnd11), mask11, nodata_i4 ) - cellCoor11(:,:) = L11_cellCoor ( iStart11 : iEnd11, : ) + fDir11(:, :) = UNPACK(L11_fDir (level11(iBasin)%iStart : level11(iBasin)%iEnd), level11(iBasin)%mask, nodata_i4) ! ------------------------------------------------------------------ ! network topology ! ------------------------------------------------------------------ jj = 0 - do kk = 1, nNodes - ic = cellCoor11(kk,1) - jc = cellCoor11(kk,2) - fn = kk - call moveDownOneCell(fDir11(ic, jc), ic, jc) - tn = Id11(ic,jc) - if (fn == tn) cycle - jj = jj + 1 - nLinkFromN(jj) = fn - nLinkToN(jj) = tn + do kk = 1, level11(iBasin)%nCells + ic = level11(iBasin)%CellCoor(kk, 1) + jc = level11(iBasin)%CellCoor(kk, 2) + fn = kk + call moveDownOneCell(fDir11(ic, jc), ic, jc) + tn = dummy_2d_id(ic, jc) + if (fn == tn) cycle + jj = jj + 1 + nLinkFromN(jj) = fn + nLinkToN(jj) = tn end do !-------------------------------------------------------- @@ -1022,11 +683,11 @@ subroutine L11_set_network_topology(iBasin) !-------------------------------------------------------- ! L11 data sets - call append( L11_fromN, nLinkFromN(:) ) ! sinks are at the end - call append( L11_toN, nLinkToN(:) ) + call append(L11_fromN, nLinkFromN(:)) ! sinks are at the end + call append(L11_toN, nLinkToN(:)) ! free space - deallocate (mask11, cellCoor11, Id11, fDir11, nLinkFromN, nLinkToN) + deallocate (fDir11, nLinkFromN, nLinkToN) end subroutine L11_set_network_topology @@ -1067,13 +728,13 @@ end subroutine L11_set_network_topology ! RESTRICTIONS ! None - + ! EXAMPLE ! None - + ! LITERATURE ! None - + ! HISTORY !> \author Luis Samaniego !> \date Dec 2005 @@ -1084,133 +745,127 @@ end subroutine L11_set_network_topology ! ------------------------------------------------------------------ subroutine L11_routing_order(iBasin) - use mo_mrm_constants, only: nodata_i4 - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - L11_fromN, & ! IN: from node - L11_toN, & ! IN: to node - L11_fDir, & ! IN: flow direction to identify sink - L11_nOutlets, & ! IN: number of sinks/outlets - L11_sink, & ! IN: == .true. if sink node reached - L11_rOrder, & ! INOUT: network routing order - L11_label, & ! INOUT: label Id [0='', 1=HeadWater, 2=Sink] - L11_netPerm ! INOUT: routing order (permutation) + use mo_common_constants, only : nodata_i4 + use mo_append, only : append + use mo_mrm_global_variables, only : & + level11, & + L11_fromN, & ! IN: from node + L11_toN, & ! IN: to node + L11_fDir, & ! IN: flow direction to identify sink + L11_nOutlets, & ! IN: number of sinks/outlets + L11_sink, & ! IN: == .true. if sink node reached + L11_rOrder, & ! INOUT: network routing order + L11_label, & ! INOUT: label Id [0='', 1=HeadWater, 2=Sink] + L11_netPerm ! INOUT: routing order (permutation) implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nNodes - integer(i4) :: nLinks - integer(i4) :: nrows11, ncols11 - integer(i4) :: iStart11, iEnd11 - integer(i4), dimension(:), allocatable :: nLinkFromN ! from node - integer(i4), dimension(:), allocatable :: nLinkToN ! to node - integer(i4), dimension(:), allocatable :: nLinkROrder ! network routing order - integer(i4), dimension(:), allocatable :: nLinkLabel ! label Id [0='', 1=HeadWater, 2=Sink] - logical, dimension(:), allocatable :: nLinkSink ! == .true. if sink node reached - integer(i4), dimension(:), allocatable :: netPerm ! routing order (permutation) - integer(i4) :: ii, jj, kk - logical :: flag - - ! level-11 information - call get_basin_info_mrm (iBasin, 11, nrows11, ncols11, ncells=nNodes, iStart=iStart11, iEnd=iEnd11) - - nLinks = nNodes - L11_nOutlets(iBasin) + integer(i4) :: nLinks + integer(i4), dimension(:), allocatable :: nLinkFromN ! from node + integer(i4), dimension(:), allocatable :: nLinkToN ! to node + integer(i4), dimension(:), allocatable :: nLinkROrder ! network routing order + integer(i4), dimension(:), allocatable :: nLinkLabel ! label Id [0='', 1=HeadWater, 2=Sink] + logical, dimension(:), allocatable :: nLinkSink ! == .true. if sink node reached + integer(i4), dimension(:), allocatable :: netPerm ! routing order (permutation) + integer(i4) :: ii, jj, kk + logical :: flag + + nLinks = level11(iBasin)%nCells - L11_nOutlets(iBasin) ! Routing network vectors have nNodes size instead of nLinks to ! avoid the need of having two extra indices to identify a basin. ! allocate - allocate ( nLinkFromN ( nNodes ) ) ! all vectors valid from (1 : nLinks) - allocate ( nLinkToN ( nNodes ) ) - allocate ( nLinkROrder ( nNodes ) ) - allocate ( nLinkLabel ( nNodes ) ) - allocate ( nLinkSink ( nNodes ) ) - allocate ( netPerm ( nNodes ) ) + allocate (nLinkFromN (level11(iBasin)%nCells)) ! all vectors valid from (1 : nLinks) + allocate (nLinkToN (level11(iBasin)%nCells)) + allocate (nLinkROrder (level11(iBasin)%nCells)) + allocate (nLinkLabel (level11(iBasin)%nCells)) + allocate (nLinkSink (level11(iBasin)%nCells)) + allocate (netPerm (level11(iBasin)%nCells)) ! initialize - nLinkFromN(:) = nodata_i4 - nLinkToN(:) = nodata_i4 - nLinkROrder(1:nLinks) = 1 - nLinkROrder(nNodes) = nodata_i4 - nLinkLabel(1:nLinks) = 0 - nLinkLabel(nNodes) = nodata_i4 - nLinkSink(:) = .FALSE. - netPerm(:) = nodata_i4 + nLinkFromN(:) = nodata_i4 + nLinkToN(:) = nodata_i4 + nLinkROrder(1 : nLinks) = 1 + nLinkROrder(level11(iBasin)%nCells) = nodata_i4 + nLinkLabel(1 : nLinks) = 0 + nLinkLabel(level11(iBasin)%nCells) = nodata_i4 + nLinkSink(:) = .FALSE. + netPerm(:) = nodata_i4 ! for a single node model run - if(nNodes .GT. 1) then + if(level11(iBasin)%nCells .GT. 1) then ! get network vectors of L11 - nLinkFromN(:) = L11_fromN ( iStart11 : iEnd11 ) - nLinkToN(:) = L11_toN ( iStart11 : iEnd11 ) - - loop1: do ii = 1, nLinks - loop2: do jj = 1, nLinks - if ( jj == ii ) cycle loop2 - if ( nLinkFromN(ii) == nLinkToN(jj) ) then - nLinkROrder(ii) = -9 - end if - if ( nLinkROrder(ii) == -9 ) cycle loop1 - end do loop2 + nLinkFromN(:) = L11_fromN (level11(iBasin)%iStart : level11(iBasin)%iEnd) + nLinkToN(:) = L11_toN (level11(iBasin)%iStart : level11(iBasin)%iEnd) + + loop1 : do ii = 1, nLinks + loop2 : do jj = 1, nLinks + if (jj == ii) cycle loop2 + if (nLinkFromN(ii) == nLinkToN(jj)) then + nLinkROrder(ii) = -9 + end if + if (nLinkROrder(ii) == -9) cycle loop1 + end do loop2 end do loop1 ! counting headwaters kk = 0 do ii = 1, nLinks - if ( nLinkROrder(ii) == 1) then - kk = kk + 1 - nLinkROrder(ii) = kk - nLinkLabel(ii) = 1 ! 'Head Water' - end if + if (nLinkROrder(ii) == 1) then + kk = kk + 1 + nLinkROrder(ii) = kk + nLinkLabel(ii) = 1 ! 'Head Water' + end if end do ! counting downstream - do while ( minval( nLinkROrder( 1 : nLinks ) ) < 0 ) - !! print *, count(nLinkROrder .lt. 0), minval(nLinkROrder) - loop3: do ii = 1, nLinks - if ( .NOT. nLinkROrder(ii) == -9 ) cycle loop3 - flag = .TRUE. - loop4: do jj = 1, nLinks - if ( jj == ii .OR. nLinkFromN(ii) /= nLinkToN(jj) ) then - cycle loop4 - else if (.NOT. ( nLinkFromN(ii) == nLinkToN(jj) .AND. nLinkROrder(jj) > 0 )) then - flag = .FALSE. - exit loop4 - else - end if - end do loop4 - - if (flag) then - kk = kk + 1 - nLinkROrder(ii) = kk + do while (minval(nLinkROrder(1 : nLinks)) < 0) + !! print *, count(nLinkROrder .lt. 0), minval(nLinkROrder) + loop3 : do ii = 1, nLinks + if (.NOT. nLinkROrder(ii) == -9) cycle loop3 + flag = .TRUE. + loop4 : do jj = 1, nLinks + if (jj == ii .OR. nLinkFromN(ii) /= nLinkToN(jj)) then + cycle loop4 + else if (.NOT. (nLinkFromN(ii) == nLinkToN(jj) .AND. nLinkROrder(jj) > 0)) then + flag = .FALSE. + exit loop4 + else end if - end do loop3 + end do loop4 + + if (flag) then + kk = kk + 1 + nLinkROrder(ii) = kk + end if + end do loop3 end do - + ! identify sink cells do ii = 1, nLinks - if (L11_fdir(iStart11 + nLinkToN(ii) - 1_i4) .eq. 0_i4) nlinksink(ii) = .True. + if (L11_fdir(level11(iBasin)%iStart + nLinkToN(ii) - 1_i4) .eq. 0_i4) nlinksink(ii) = .True. end do where(nlinksink) nLinkLabel = 2 ! 'Sink' ! keep routing order do ii = 1, nLinks - netPerm(nLinkROrder(ii)) = ii + netPerm(nLinkROrder(ii)) = ii end do - + ! end of multi-node network design loop end if - + !-------------------------------------------------------- ! Start padding up local variables to global variables !-------------------------------------------------------- ! L11 network data sets - call append( L11_rOrder, nLinkROrder(:) ) - call append( L11_label, nLinkLabel(:) ) - call append( L11_sink, nLinkSink(:) ) - call append( L11_netPerm, netPerm(:) ) + call append(L11_rOrder, nLinkROrder(:)) + call append(L11_label, nLinkLabel(:)) + call append(L11_sink, nLinkSink(:)) + call append(L11_netPerm, netPerm(:)) ! free space - deallocate (nLinkFromN, nLinkToN, nLinkROrder, nLinkLabel, nLinkSink, netPerm ) + deallocate (nLinkFromN, nLinkToN, nLinkROrder, nLinkLabel, nLinkSink, netPerm) end subroutine L11_routing_order @@ -1266,163 +921,163 @@ end subroutine L11_routing_order ! ------------------------------------------------------------------ subroutine L11_link_location(iBasin) - use mo_mrm_constants, only: nodata_i4 - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - basin_mrm, & ! IN - L0_fDir, & ! IN: flow direction (standard notation) L0 - L11_nOutlets,& ! IN: Number of Outlets/Sinks - L0_draSC, & ! IN: Index of draining cell of each sub catchment (== cell L11) - L11_fromN, & ! IN: from node - L11_rowOut, & ! IN: grid vertical location of the Outlet - L11_colOut, & ! IN: grid horizontal location of the Outlet - L11_netPerm, & ! IN: routing order (permutation) - L11_fRow, & ! INOUT: from row in L0 grid - L11_fCol, & ! INOUT: from col in L0 grid - L11_tRow, & ! INOUT: to row in L0 grid - L11_tCol ! INOUT: to col in L0 grid + use mo_common_constants, only : nodata_i4 + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_append, only : append + use mo_common_variables, only : & + level0, L0_Basin, Grid + use mo_mrm_global_variables, only : & + level11, & + basin_mrm, & ! IN + L0_fDir, & ! IN: flow direction (standard notation) L0 + L11_nOutlets, & ! IN: Number of Outlets/Sinks + L0_draSC, & ! IN: Index of draining cell of each sub catchment (== cell L11) + L11_fromN, & ! IN: from node + L11_rowOut, & ! IN: grid vertical location of the Outlet + L11_colOut, & ! IN: grid horizontal location of the Outlet + L11_netPerm, & ! IN: routing order (permutation) + L11_fRow, & ! INOUT: from row in L0 grid + L11_fCol, & ! INOUT: from col in L0 grid + L11_tRow, & ! INOUT: to row in L0 grid + L11_tCol ! INOUT: to col in L0 grid implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nNodes - integer(i4) :: nLinks - integer(i4) :: nrows0, ncols0 - integer(i4) :: nrows110, ncols110 - integer(i4) :: iStart0, iEnd0 - integer(i4) :: iStart110, iEnd110 - integer(i4) :: nrows11, ncols11 - integer(i4) :: iStart11, iEnd11 - integer(i4), dimension(:), allocatable :: rowOut ! northing cell loc. of the Outlet - integer(i4), dimension(:), allocatable :: colOut ! easting cell loc. of the Outlet - integer(i4), dimension(:), allocatable :: nLinkFromN - integer(i4), dimension(:), allocatable :: netPerm - integer(i4), dimension(:), allocatable :: nLinkFromRow - integer(i4), dimension(:), allocatable :: nLinkFromCol - integer(i4), dimension(:), allocatable :: nLinkToRow - integer(i4), dimension(:), allocatable :: nLinkToCol - logical, dimension(:,:), allocatable :: mask0 - integer(i4), dimension(:,:), allocatable :: fDir0 - integer(i4), dimension(:,:), allocatable :: draSC0 - integer(i4) :: ii, rr, kk - integer(i4) :: iNode, iRow, jCol - integer(i4), dimension(:,:), allocatable :: oLoc ! output location in L0 - integer(i4) :: nOutlets ! number of outlets in basin - logical :: is_outlet ! flag for finding outlet - - ! level-0 information - call get_basin_info_mrm (iBasin, 0, nrows0, ncols0, iStart=iStart0, iEnd=iEnd0, mask=mask0) - - ! level-110 information - call get_basin_info_mrm (iBasin, 110, nrows110, ncols110, iStart=iStart110, iEnd=iEnd110) - - ! level-11 information - call get_basin_info_mrm (iBasin, 11, nrows11, ncols11, ncells=nNodes, iStart=iStart11, iEnd=iEnd11) + integer(i4) :: nLinks + integer(i4), dimension(:), allocatable :: rowOut ! northing cell loc. of the Outlet + integer(i4), dimension(:), allocatable :: colOut ! easting cell loc. of the Outlet + integer(i4), dimension(:), allocatable :: nLinkFromN + integer(i4), dimension(:), allocatable :: netPerm + integer(i4), dimension(:), allocatable :: nLinkFromRow + integer(i4), dimension(:), allocatable :: nLinkFromCol + integer(i4), dimension(:), allocatable :: nLinkToRow + integer(i4), dimension(:), allocatable :: nLinkToCol + integer(i4), dimension(:, :), allocatable :: fDir0 + integer(i4), dimension(:, :), allocatable :: draSC0 + integer(i4) :: ii, rr, kk, s0, e0 + integer(i4) :: iNode, iRow, jCol, prevRow, prevCol + integer(i4), dimension(:, :), allocatable :: oLoc ! output location in L0 + integer(i4) :: nOutlets ! number of outlets in basin + logical :: is_outlet ! flag for finding outlet + type(Grid), pointer :: level0_iBasin + + level0_iBasin => level0(L0_Basin(iBasin)) + s0 = level0_iBasin%iStart + e0 = level0_iBasin%iEnd + nOutlets = L11_nOutlets(iBasin) - nLinks = nNodes - nOutlets + nLinks = level11(iBasin)%nCells - nOutlets - ! Routing network vectors have nNodes size instead of nLinks to + ! Routing network vectors have level11(iBasin)%nCells size instead of nLinks to ! avoid the need of having two extra indices to identify a basin. ! allocate - allocate ( rowOut ( nNodes ) ) - allocate ( colOut ( nNodes ) ) - allocate ( nLinkFromN ( nNodes ) ) ! all network vectors valid from (1 : nLinks) - allocate ( netPerm ( nNodes ) ) - allocate ( nLinkFromRow ( nNodes ) ) - allocate ( nLinkFromCol ( nNodes ) ) - allocate ( nLinkToRow ( nNodes ) ) - allocate ( nLinkToCol ( nNodes ) ) - allocate ( fDir0 ( nrows0, ncols0 ) ) - allocate ( draSC0 ( nrows0, ncols0 ) ) + allocate (rowOut (level11(iBasin)%nCells)) + allocate (colOut (level11(iBasin)%nCells)) + allocate (nLinkFromN (level11(iBasin)%nCells)) ! all network vectors valid from (1 : nLinks) + allocate (netPerm (level11(iBasin)%nCells)) + allocate (nLinkFromRow (level11(iBasin)%nCells)) + allocate (nLinkFromCol (level11(iBasin)%nCells)) + allocate (nLinkToRow (level11(iBasin)%nCells)) + allocate (nLinkToCol (level11(iBasin)%nCells)) + allocate (fDir0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (draSC0 (level0_iBasin%nrows, level0_iBasin%ncols)) ! initialize - rowOut = nodata_i4 - colOut = nodata_i4 - nLinkFromN = nodata_i4 - netPerm = nodata_i4 - nLinkFromRow = nodata_i4 - nLinkFromCol = nodata_i4 - nLinkToRow = nodata_i4 - nLinkToCol = nodata_i4 - fDir0 = nodata_i4 - draSC0 = nodata_i4 + rowOut = nodata_i4 + colOut = nodata_i4 + nLinkFromN = nodata_i4 + netPerm = nodata_i4 + nLinkFromRow = nodata_i4 + nLinkFromCol = nodata_i4 + nLinkToRow = nodata_i4 + nLinkToCol = nodata_i4 + fDir0 = nodata_i4 + draSC0 = nodata_i4 ! for a single node model run - if(nNodes .GT. 1) then + if(level11(iBasin)%nCells .GT. 1) then ! get fDir at L0 - fDir0(:,:) = UNPACK( L0_fDir (iStart0:iEnd0), mask0, nodata_i4 ) - draSC0(:,:) = UNPACK( L0_draSC (iStart110:iEnd110), mask0, nodata_i4 ) + fDir0(:, :) = UNPACK(L0_fDir (s0 : e0), level0_iBasin%mask, nodata_i4) + draSC0(:, :) = UNPACK(L0_draSC (s0 : e0), level0_iBasin%mask, nodata_i4) ! get network vectors of L11 - nLinkFromN(:) = L11_fromN ( iStart11 : iEnd11 ) - netPerm(:) = L11_netPerm ( iStart11 : iEnd11 ) - rowOut(:) = L11_rowOut ( iStart11 : iEnd11 ) - colOut(:) = L11_colOut ( iStart11 : iEnd11 ) + nLinkFromN(:) = L11_fromN (level11(iBasin)%iStart : level11(iBasin)%iEnd) + netPerm(:) = L11_netPerm (level11(iBasin)%iStart : level11(iBasin)%iEnd) + rowOut(:) = L11_rowOut (level11(iBasin)%iStart : level11(iBasin)%iEnd) + colOut(:) = L11_colOut (level11(iBasin)%iStart : level11(iBasin)%iEnd) ! finding main outlet (row, col) in L0 allocate(oLoc(Noutlets, 2)) - oLoc(:, 1) = basin_mrm%L0_rowOutlet(:Noutlets, iBasin) - oLoc(:, 2) = basin_mrm%L0_colOutlet(:Noutlets, iBasin) + oLoc(:, 1) = basin_mrm(iBasin)%L0_rowOutlet(: Noutlets) + oLoc(:, 2) = basin_mrm(iBasin)%L0_colOutlet(: Noutlets) ! Location of the stream-joint cells (row, col) do rr = 1, nLinks - ii = netPerm(rr) - iNode = nLinkFromN(ii) - iRow = rowOut(iNode) - jCol = colOut(iNode) - call moveDownOneCell( fDir0(iRow,jcol), iRow, jcol ) - ! set "from" cell - nLinkFromRow(ii) = iRow - nLinkFromCol(ii) = jCol - - ! check whether this location is an outlet - is_outlet = .False. - do kk = 1, Noutlets - if (iRow .eq. oLoc(kk, 1) .and. jCol .eq. oLoc(kk, 2)) is_outlet = .True. - end do - - if (is_outlet) then - - nLinkToRow(ii) = iRow - nLinkToCol(ii) = jCol - - else - - do while ( .not. ( draSC0(iRow,jCol) > 0 ) ) - call moveDownOneCell( fDir0(iRow,jcol), iRow, jCol ) - ! check whether this location is an outlet and exit - do kk = 1, Noutlets - if (iRow .eq. oLoc(kk, 1) .and. jCol .eq. oLoc(kk, 2)) exit - end do - ! if ( iRow == oLoc(1) .and. jCol == oLoc(2)) exit + ii = netPerm(rr) + iNode = nLinkFromN(ii) + iRow = rowOut(iNode) + jCol = colOut(iNode) + call moveDownOneCell(fDir0(iRow, jcol), iRow, jcol) + ! set "from" cell + nLinkFromRow(ii) = iRow + nLinkFromCol(ii) = jCol + + ! check whether this location is an outlet + is_outlet = .False. + do kk = 1, Noutlets + if (iRow .eq. oLoc(kk, 1) .and. jCol .eq. oLoc(kk, 2)) is_outlet = .True. + end do + + if (is_outlet) then + + nLinkToRow(ii) = iRow + nLinkToCol(ii) = jCol + + else + + do while (.not. (draSC0(iRow, jCol) > 0)) + prevRow = iRow + prevCol = jCol + call moveDownOneCell(fDir0(iRow, jcol), iRow, jCol) + ! check whether this location is an outlet and exit + do kk = 1, Noutlets + if (iRow .eq. oLoc(kk, 1) .and. jCol .eq. oLoc(kk, 2)) exit end do - ! set "to" cell (when an outlet is reached) - nLinkToRow(ii) = iRow - nLinkToCol(ii) = jCol + if (prevRow .eq. iRow .and. prevCol .eq. jCol) then + call message('Something went wrong during L11_link_location, ', & + 'movedownonecell got stuck in infinite loop at cell (', num2str(iRow), ' ', & + num2str(jCol)) + stop 1 + end if + end do + ! set "to" cell (when an outlet is reached) + nLinkToRow(ii) = iRow + nLinkToCol(ii) = jCol - end if + end if end do ! end of multi-node network design loop end if - + !-------------------------------------------------------- ! Start padding up local variables to global variables !-------------------------------------------------------- ! L11 network data sets - call append( L11_fRow, nLinkFromRow(:) ) - call append( L11_fCol, nLinkFromCol(:) ) - call append( L11_tRow, nLinkToRow(:) ) - call append( L11_tCol, nLinkToCol(:) ) + call append(L11_fRow, nLinkFromRow(:)) + call append(L11_fCol, nLinkFromCol(:)) + call append(L11_tRow, nLinkToRow(:)) + call append(L11_tCol, nLinkToCol(:)) ! free space - deallocate ( rowOut, colOut, nLinkFromN, netPerm, nLinkFromRow, & - nLinkFromCol, nLinkToRow, nLinkToCol, fDir0, draSC0 ) + deallocate (rowOut, colOut, nLinkFromN, netPerm, nLinkFromRow, & + nLinkFromCol, nLinkToRow, nLinkToCol, fDir0, draSC0) end subroutine L11_link_location @@ -1430,7 +1085,7 @@ end subroutine L11_link_location ! NAME ! L11_set_drain_outlet_gauges - + ! PURPOSE !> \brief Draining cell identification and Set gauging node @@ -1482,123 +1137,113 @@ end subroutine L11_link_location ! Stephan Thober, Aug 2015 - ported to mRM ! ------------------------------------------------------------------ subroutine L11_set_drain_outlet_gauges(iBasin) - use mo_mrm_constants, only: nodata_i4 - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - basin_mrm, & - L0_fDir, & ! IN: flow direction (standard notation) L0 - L0_draSC, & ! IN: Index of draining cell of each sub catchment (== cell L11) - L0_gaugeLoc, & ! IN: location of gauges (read with gauge Id then - ! ! transformed into gauge running ID => [1,nGaugesTotal] - L0_cellCoor, & ! IN: cell coordinates (row,col) -> input data - L0_InflowgaugeLoc, & ! IN: location of gauges (read with gauge Id then - ! ! transformed into gauge running ID => [1,nGaugesTotal] - L0_L11_Id, & ! IN: mapping of L11 Id on L0 - L0_draCell ! INOUT: draining cell id at L11 of ith cell of L0 + use mo_common_constants, only : nodata_i4 + use mo_append, only : append + use mo_mrm_global_variables, only : & + l0_l11_remap, & + basin_mrm, & + L0_fDir, & ! IN: flow direction (standard notation) L0 + L0_draSC, & ! IN: Index of draining cell of each sub catchment (== cell L11) + L0_gaugeLoc, & ! IN: location of gauges (read with gauge Id then + ! ! transformed into gauge running ID => [1,nGaugesTotal] + L0_InflowgaugeLoc, & ! IN: location of gauges (read with gauge Id then + ! ! transformed into gauge running ID => [1,nGaugesTotal] + L0_draCell ! INOUT: draining cell id at L11 of ith cell of L0 + use mo_common_variables, only : & + level0, L0_Basin, Grid implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nCells0 - integer(i4) :: nrows0, ncols0 - integer(i4) :: nrows110, ncols110 - integer(i4) :: iStart0, iEnd0 - integer(i4) :: iStart110, iEnd110 - logical, dimension(:,:), allocatable :: mask0 - integer(i4), dimension(:,:), allocatable :: cellCoor0 - integer(i4), dimension(:,:), allocatable :: draSC0 - integer(i4), dimension(:,:), allocatable :: fDir0 - integer(i4), dimension(:,:), allocatable :: gaugeLoc0 - integer(i4), dimension(:,:), allocatable :: InflowGaugeLoc0 - integer(i4), dimension(:,:), allocatable :: draCell0 - integer(i4), dimension(:,:), allocatable :: L11Id_on_L0 - integer(i4) :: ii, jj, kk, ll - integer(i4) :: iSc - integer(i4) :: iRow, jCol - - ! level-0 information - call get_basin_info_mrm ( iBasin, 0, nrows0, ncols0, ncells=nCells0, & - iStart=iStart0, iEnd=iEnd0, mask=mask0 ) - - ! level-110 information (nrows110,ncols110) always equal to (nrows0,ncols0) - call get_basin_info_mrm ( iBasin, 110, nrows110, ncols110, & - iStart=iStart110, iEnd=iEnd110 ) + integer(i4), dimension(:, :), allocatable :: draSC0 + integer(i4), dimension(:, :), allocatable :: fDir0 + integer(i4), dimension(:, :), allocatable :: gaugeLoc0 + integer(i4), dimension(:, :), allocatable :: InflowGaugeLoc0 + integer(i4), dimension(:, :), allocatable :: draCell0 + integer(i4) :: ii, jj, kk, ll, s0, e0 + integer(i4) :: iSc + integer(i4) :: iRow, jCol + type(Grid) :: level0_iBasin + + level0_iBasin = level0(L0_Basin(iBasin)) + s0 = level0_iBasin%iStart + e0 = level0_iBasin%iEnd + ! allocate - allocate ( cellCoor0 ( nCells0, 2 ) ) - allocate ( draSC0 ( nrows0, ncols0 ) ) - allocate ( fDir0 ( nrows0, ncols0 ) ) - allocate ( gaugeLoc0 ( nrows0, ncols0 ) ) - allocate ( InflowGaugeLoc0 ( nrows0, ncols0 ) ) - allocate ( draCell0 ( nrows0, ncols0 ) ) - allocate ( L11Id_on_L0 ( nrows0, ncols0 ) ) + allocate (draSC0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (fDir0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (gaugeLoc0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (InflowGaugeLoc0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (draCell0 (level0_iBasin%nrows, level0_iBasin%ncols)) ! initialize - cellCoor0(:,:) = nodata_i4 - draSC0(:,:) = nodata_i4 - fDir0(:,:) = nodata_i4 - gaugeLoc0(:,:) = nodata_i4 - InflowGaugeLoc0(:,:) = nodata_i4 - draCell0(:,:) = nodata_i4 - L11Id_on_L0(:,:) = nodata_i4 - - ! get L0 fields - cellCoor0(:,:) = L0_cellCoor(iStart0 : iEnd0, :) - - draSC0(:,:) = UNPACK( L0_draSC (iStart110:iEnd110), mask0, nodata_i4 ) - fDir0(:,:) = UNPACK( L0_fDir (iStart0:iEnd0), mask0, nodata_i4 ) - gaugeLoc0(:,:) = UNPACK( L0_gaugeLoc (iStart0:iEnd0), mask0, nodata_i4 ) - InflowGaugeLoc0(:,:) = UNPACK( L0_InflowgaugeLoc (iStart0:iEnd0), mask0, nodata_i4 ) - L11Id_on_L0(:,:) = UNPACK( L0_L11_Id (iStart110:iEnd110), mask0, nodata_i4 ) - - - do kk = 1, nCells0 - ii = cellCoor0(kk,1) - jj = cellCoor0(kk,2) - iSc = draSC0(ii,jj) - ! find drainage path - iRow = ii - jCol = jj - do while ( .NOT. iSC > 0 ) - ! move downstream - call moveDownOneCell( fDir0(iRow,jCol), iRow, jCol ) - iSC = draSC0(iRow,jCol) - end do - draCell0(ii,jj) = iSC - - ! find cell at L11 corresponding to gauges in basin at L0 !>> L11Id_on_L0 is Id of - ! the routing cell at level-11 - if ( gaugeLoc0(ii,jj) .NE. nodata_i4 ) then - ! evaluation gauges - do ll = 1, basin_mrm%nGauges(iBasin) - ! search for gaugeID in L0 grid and save ID on L11 - if (basin_mrm%gaugeIdList(iBasin, ll) .EQ. gaugeLoc0(ii,jj)) then - basin_mrm%gaugeNodeList(iBasin, ll) = L11Id_on_L0(ii, jj) - end if - end do - end if - - if ( InflowGaugeLoc0(ii,jj) .NE. nodata_i4 ) then - ! inflow gauges - do ll = 1, basin_mrm%nInflowGauges(iBasin) - ! search for gaugeID in L0 grid and save ID on L11 - if ( basin_mrm%InflowGaugeIdList(iBasin, ll) .EQ. InflowGaugeLoc0(ii,jj)) & - basin_mrm%InflowGaugeNodeList( iBasin, ll ) = L11Id_on_L0(ii,jj) - end do - end if + draSC0(:, :) = nodata_i4 + fDir0(:, :) = nodata_i4 + gaugeLoc0(:, :) = nodata_i4 + InflowGaugeLoc0(:, :) = nodata_i4 + draCell0(:, :) = nodata_i4 + + draSC0(:, :) = UNPACK(L0_draSC (s0 : e0), & + level0_iBasin%mask, nodata_i4) + fDir0(:, :) = UNPACK(L0_fDir (s0 : e0), & + level0_iBasin%mask, nodata_i4) + gaugeLoc0(:, :) = UNPACK(L0_gaugeLoc (s0 : e0), & + level0_iBasin%mask, nodata_i4) + InflowGaugeLoc0(:, :) = UNPACK(L0_InflowgaugeLoc (s0 : e0), & + level0_iBasin%mask, nodata_i4) + + do kk = 1, level0_iBasin%nCells + ii = level0_iBasin%CellCoor(kk, 1) + jj = level0_iBasin%CellCoor(kk, 2) + iSc = draSC0(ii, jj) + ! find drainage path + iRow = ii + jCol = jj + do while (.NOT. iSC > 0) + ! move downstream + call moveDownOneCell(fDir0(iRow, jCol), iRow, jCol) + iSC = draSC0(iRow, jCol) + end do + draCell0(ii, jj) = iSC + + ! find cell at L11 corresponding to gauges in basin at L0 !>> L11_on_L0 is Id of + ! the routing cell at level-11 + if (gaugeLoc0(ii, jj) .NE. nodata_i4) then + ! evaluation gauges + do ll = 1, basin_mrm(iBasin)%nGauges + ! search for gaugeID in L0 grid and save ID on L11 + if (basin_mrm(iBasin)%gaugeIdList(ll) .EQ. gaugeLoc0(ii, jj)) then + basin_mrm(iBasin)%gaugeNodeList(ll) = L0_L11_remap(iBasin)%lowres_id_on_highres(ii, jj) + end if + end do + end if + + if (InflowGaugeLoc0(ii, jj) .NE. nodata_i4) then + ! inflow gauges + do ll = 1, basin_mrm(iBasin)%nInflowGauges + ! search for gaugeID in L0 grid and save ID on L11 + if (basin_mrm(iBasin)%InflowGaugeIdList(ll) .EQ. InflowGaugeLoc0(ii, jj)) & + basin_mrm(iBasin)%InflowGaugeNodeList(ll) = L0_L11_remap(iBasin)%lowres_id_on_highres(ii, jj) + end do + end if end do !-------------------------------------------------------- ! Start padding up local variables to global variables !-------------------------------------------------------- - ! L0 data sets - call append(L0_draCell, PACK(draCell0(:,:), mask0)) + ! L0 data sets + ! check whether L0 data is shared + if (iBasin .eq. 1) then + call append(L0_draCell, PACK(draCell0(:, :), level0_iBasin%mask)) + else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1)) then + call append(L0_draCell, PACK(draCell0(:, :), level0_iBasin%mask)) + end if ! free space - deallocate ( mask0, cellCoor0, draSC0, fDir0, gaugeLoc0, draCell0, L11Id_on_L0) + deallocate (draSC0, fDir0, gaugeLoc0, draCell0) end subroutine L11_set_drain_outlet_gauges @@ -1606,7 +1251,7 @@ end subroutine L11_set_drain_outlet_gauges ! NAME ! L11_stream_features - + ! PURPOSE !> \brief Stream features (stream network and floodplain) @@ -1657,232 +1302,235 @@ end subroutine L11_set_drain_outlet_gauges ! ------------------------------------------------------------------ subroutine L11_stream_features(iBasin) - use mo_mrm_constants, only: nodata_i4, nodata_dp - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm - use mo_common_variables, only: processMatrix - use mo_mrm_global_variables, only: & - L0_elev_mRM, & ! IN: elevation (sinks removed) [m] - iFlag_cordinate_sys, & ! IN: coordinate system - L0_Id, & ! IN: level-0 id - L0_fDir, & ! IN: flow direction (standard notation) L0 - L0_areaCell, & ! IN: area of a cell at level-0, -> is same for all basin [m2] - L11_fRow, & ! IN: from row in L0 grid - L11_fCol, & ! IN: from col in L0 grid - L11_tRow, & ! IN: to row in L0 grid - L11_tCol, & ! IN: to col in L0 grid - L11_netPerm, & ! IN: routing order (permutation) - L0_streamNet, & ! IN: stream network - L0_floodPlain, & ! IN: floodplains of stream i - L11_length, & ! IN: total length [m] - L11_aFloodPlain, & ! IN: area of the flood plain [m2] - L11_nOutlets, & ! IN: Number of Outlets/Sinks - L11_slope ! INOUT: normalized average slope + use mo_common_constants, only : nodata_i4, nodata_dp + use mo_append, only : append + use mo_common_variables, only : & + level0, & + L0_Basin, & + Grid, & + processMatrix, & + iFlag_cordinate_sys, & ! IN: coordinate system + L0_elev + + use mo_mrm_global_variables, only : & + level11, & + L0_fDir, & ! IN: flow direction (standard notation) L0 + L11_fRow, & ! IN: from row in L0 grid + L11_fCol, & ! IN: from col in L0 grid + L11_tRow, & ! IN: to row in L0 grid + L11_tCol, & ! IN: to col in L0 grid + L11_netPerm, & ! IN: routing order (permutation) + L0_streamNet, & ! IN: stream network + L0_floodPlain, & ! IN: floodplains of stream i + L11_length, & ! IN: total length [m] + L11_aFloodPlain, & ! IN: area of the flood plain [m2] + L11_nOutlets, & ! IN: Number of Outlets/Sinks + L11_slope ! INOUT: normalized average slope implicit none - integer(i4), intent(in) :: iBasin ! basin + integer(i4), intent(in) :: iBasin ! basin ! local - integer(i4) :: nCells0 - integer(i4) :: nNodes - integer(i4) :: nLinks - integer(i4) :: nrows0, ncols0 - integer(i4) :: iStart0, iEnd0 - integer(i4) :: nrows11, ncols11 - integer(i4) :: iStart11, iEnd11 - logical, dimension(:,:), allocatable :: mask0 - integer(i4), dimension(:,:), allocatable :: iD0 - integer(i4), dimension(:,:), allocatable :: fDir0 - real(dp), dimension(:,:), allocatable :: elev0 - real(dp), dimension(:,:), allocatable :: areaCell0 - integer(i4), dimension(:,:), allocatable :: streamNet0 - integer(i4), dimension(:,:), allocatable :: floodPlain0 - integer(i4), dimension(:), allocatable :: netPerm ! routing order (permutation) - integer(i4), dimension(:), allocatable :: nLinkFromRow - integer(i4), dimension(:), allocatable :: nLinkFromCol - integer(i4), dimension(:), allocatable :: nLinkToRow - integer(i4), dimension(:), allocatable :: nLinkToCol - real(dp), dimension(:), allocatable :: nLinkLength - real(dp), dimension(:), allocatable :: nLinkAFloodPlain - real(dp), dimension(:), allocatable :: nLinkSlope - integer(i4) :: ii, rr, ns - integer(i4) :: frow, fcol - integer(i4) :: fId, tId - integer(i4), dimension(:,:), allocatable :: stack, append_chunk - integer(i4), dimension(:), allocatable :: dummy_1d - real(dp) :: length - integer(i4), dimension(:,:), allocatable :: nodata_i4_tmp - real(dp), dimension(:,:), allocatable :: nodata_dp_tmp - - ! level-0 information - call get_basin_info_mrm ( iBasin, 0, nrows0, ncols0, ncells=nCells0, & - iStart=iStart0, iEnd=iEnd0, mask=mask0 ) - - ! level-11 information - call get_basin_info_mrm (iBasin, 11, nrows11, ncols11, ncells=nNodes, iStart=iStart11, iEnd=iEnd11) - - nLinks = nNodes - L11_nOutlets(iBasin) + integer(i4) :: nLinks + integer(i4), dimension(:, :), allocatable :: iD0 + integer(i4), dimension(:, :), allocatable :: fDir0 + real(dp), dimension(:, :), allocatable :: elev0 + real(dp), dimension(:, :), allocatable :: areaCell0 + integer(i4), dimension(:, :), allocatable :: streamNet0 + integer(i4), dimension(:, :), allocatable :: floodPlain0 + integer(i4), dimension(:), allocatable :: netPerm ! routing order (permutation) + integer(i4), dimension(:), allocatable :: nLinkFromRow + integer(i4), dimension(:), allocatable :: nLinkFromCol + integer(i4), dimension(:), allocatable :: nLinkToRow + integer(i4), dimension(:), allocatable :: nLinkToCol + real(dp), dimension(:), allocatable :: nLinkLength + real(dp), dimension(:), allocatable :: nLinkAFloodPlain + real(dp), dimension(:), allocatable :: nLinkSlope + integer(i4) :: ii, rr, ns, s0, e0 + integer(i4) :: frow, fcol + integer(i4) :: fId, tId + integer(i4), dimension(:, :), allocatable :: stack, append_chunk + integer(i4), dimension(:), allocatable :: dummy_1d + real(dp) :: length + integer(i4), dimension(:, :), allocatable :: nodata_i4_tmp + real(dp), dimension(:, :), allocatable :: nodata_dp_tmp + type(Grid) :: level0_iBasin + + level0_iBasin = level0(L0_Basin(iBasin)) + s0 = level0_iBasin%iStart + e0 = level0_iBasin%iEnd + nLinks = level11(iBasin)%nCells - L11_nOutlets(iBasin) + ! allocate - allocate ( iD0 ( nrows0, ncols0 ) ) - allocate ( elev0 ( nrows0, ncols0 ) ) - allocate ( fDir0 ( nrows0, ncols0 ) ) - allocate ( areaCell0 ( nrows0, ncols0 ) ) - allocate ( streamNet0 ( nrows0, ncols0 ) ) - allocate ( floodPlain0 ( nrows0, ncols0 ) ) + allocate (iD0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (elev0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (fDir0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (areaCell0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (streamNet0 (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (floodPlain0 (level0_iBasin%nrows, level0_iBasin%ncols)) ! Routing network vectors have nNodes size instead of nLinks to ! avoid the need of having two extra indices to identify a basin. - allocate ( stack ( nNodes, 2 ) ) !>> stack(nNodes, 2) - allocate ( dummy_1d ( 2 )) - allocate ( append_chunk ( 8, 2 ) ) - allocate ( netPerm ( nNodes ) ) - allocate ( nLinkFromRow ( nNodes ) ) - allocate ( nLinkFromCol ( nNodes ) ) - allocate ( nLinkToRow ( nNodes ) ) - allocate ( nLinkToCol ( nNodes ) ) - allocate ( nLinkLength ( nNodes ) ) - allocate ( nLinkAFloodPlain ( nNodes ) ) - allocate ( nLinkSlope ( nNodes ) ) - - allocate (nodata_i4_tmp ( nrows0, ncols0 ) ) - allocate (nodata_dp_tmp ( nrows0, ncols0 ) ) + allocate (stack (level11(iBasin)%nCells, 2)) !>> stack(nNodes, 2) + allocate (dummy_1d (2)) + allocate (append_chunk (8, 2)) + allocate (netPerm (level11(iBasin)%nCells)) + allocate (nLinkFromRow (level11(iBasin)%nCells)) + allocate (nLinkFromCol (level11(iBasin)%nCells)) + allocate (nLinkToRow (level11(iBasin)%nCells)) + allocate (nLinkToCol (level11(iBasin)%nCells)) + allocate (nLinkLength (level11(iBasin)%nCells)) + allocate (nLinkAFloodPlain (level11(iBasin)%nCells)) + allocate (nLinkSlope (level11(iBasin)%nCells)) + + allocate (nodata_i4_tmp (level0_iBasin%nrows, level0_iBasin%ncols)) + allocate (nodata_dp_tmp (level0_iBasin%nrows, level0_iBasin%ncols)) ! initialize - iD0(:,:) = nodata_i4 - elev0(:,:) = nodata_dp - fDir0(:,:) = nodata_i4 - areaCell0(:,:) = nodata_dp - streamNet0(:,:) = nodata_i4 - floodPlain0(:,:) = nodata_i4 - - stack(:,:) = nodata_i4 - append_chunk(:,:) = nodata_i4 - netPerm(:) = nodata_i4 - nLinkFromRow(:) = nodata_i4 - nLinkFromCol(:) = nodata_i4 - nLinkToRow(:) = nodata_i4 - nLinkToCol(:) = nodata_i4 - nLinkLength(:) = nodata_dp - nLinkAFloodPlain(:) = nodata_dp - nLinkSlope(:) = nodata_dp - - nodata_i4_tmp(:,:) = nodata_i4 - nodata_dp_tmp(:,:) = nodata_dp + iD0(:, :) = nodata_i4 + elev0(:, :) = nodata_dp + fDir0(:, :) = nodata_i4 + areaCell0(:, :) = nodata_dp + streamNet0(:, :) = nodata_i4 + floodPlain0(:, :) = nodata_i4 + + stack(:, :) = nodata_i4 + append_chunk(:, :) = nodata_i4 + netPerm(:) = nodata_i4 + nLinkFromRow(:) = nodata_i4 + nLinkFromCol(:) = nodata_i4 + nLinkToRow(:) = nodata_i4 + nLinkToCol(:) = nodata_i4 + nLinkLength(:) = nodata_dp + nLinkAFloodPlain(:) = nodata_dp + nLinkSlope(:) = nodata_dp + + nodata_i4_tmp(:, :) = nodata_i4 + nodata_dp_tmp(:, :) = nodata_dp ! >>> CAUTION: only calculate link flood plain area if ! >>> CAUTION: original routing is used - FParea: if (processMatrix(8, 1) .eq. 1_i4) then - ! for a single node model run - if(nNodes .GT. 1) then - ! get L0 fields - iD0(:,:) = UNPACK( L0_Id (iStart0:iEnd0), mask0, nodata_i4_tmp ) - elev0(:,:) = UNPACK( L0_elev_mRM (iStart0:iEnd0), mask0, nodata_dp_tmp ) - fDir0(:,:) = UNPACK( L0_fDir (iStart0:iEnd0), mask0, nodata_i4_tmp ) - areaCell0(:,:) = UNPACK( L0_areaCell (iStart0:iEnd0), mask0, nodata_dp_tmp ) - - ! get network vectors of L11 - netPerm(:) = L11_netPerm ( iStart11 : iEnd11 ) - nLinkFromRow(:) = L11_fRow ( iStart11 : iEnd11 ) - nLinkFromCol(:) = L11_fCol ( iStart11 : iEnd11 ) - nLinkToRow(:) = L11_tRow ( iStart11 : iEnd11 ) - nLinkToCol(:) = L11_tCol ( iStart11 : iEnd11 ) - - ! Flood plains: stream network delineation - streamNet0(:,:) = nodata_i4 - floodPlain0(:,:) = nodata_i4 - - do rr = 1, nLinks - - ii = netPerm(rr) - frow = nLinkFromRow(ii) - fcol = nLinkFromCol(ii) - - ! Init - streamNet0( frow, fcol) = ii - floodPlain0(frow, fcol) = ii - stack = 0 - append_chunk = 0 - ns = 1 - stack(ns,1) = frow - stack(ns,2) = fcol - - call cellLength(iBasin, fDir0(frow,fcol), fRow, fCol, iFlag_cordinate_sys, nLinkLength(ii) ) - nLinkSlope(ii) = elev0(frow, fcol) - - fId = iD0( frow, fcol ) - tId = iD0( nLinkToRow(ii) , nLinkToCol(ii) ) - - do while ( .NOT. (fId == tId)) - ! Search flood plain from point(frow,fcol) upwards, keep co-ordinates in STACK - do while (ns > 0) - if (ns + 8 .gt. size(stack,1)) then - call append(stack,append_chunk) - end if - call moveUp( elev0, fDir0, frow, fcol, stack, ns ) - stack(1,1) = 0 - stack(1,2) = 0 - ! stack = cshift(stack, SHIFT = 1, DIM = 1) - ! substitute cshift <<< - dummy_1d = stack(1, :) - stack(:size(stack, dim=1) - 1, :) = stack(2:, :) - stack(size(stack, dim=1), :) = dummy_1d - ! substitute cshift >>> - if (stack(1,1) > 0 .and. stack(1,2) > 0 ) floodPlain0( stack(1,1), stack(1,2) ) = ii - ns = count( stack > 0 ) / 2 - end do - - ! move downstream - call moveDownOneCell( fDir0(frow,fcol), frow, fcol ) - streamNet0(frow, fcol) = ii - floodPlain0(frow, fcol) = ii - fId = iD0(frow, fcol) - stack = 0 - ns = 1 - stack(ns,1) = frow - stack(ns,2) = fcol - call cellLength(iBasin, fDir0(fRow,fCol), fRow, fCol, iFlag_cordinate_sys, length ) - nLinkLength(ii) = nLinkLength(ii) + length - - end do - - ! stream bed slope - nLinkSlope(ii) = ( nLinkSlope(ii) - elev0(frow, fcol) ) / nLinkLength(ii) - - if ( nLinkSlope(ii) < 0.0001_dp) nLinkSlope(ii) = 0.0001_dp - - ! calculate area of floodplains (avoid overwriting) - nLinkAFloodPlain(ii) = sum ( areaCell0(:,:), mask = ( floodPlain0(:,:) == ii ) ) - ! old > real( count( floodPlain0(:,:,) == i), dp ) * areaCell0 + FParea : if (processMatrix(8, 1) .eq. 1_i4) then + ! for a single node model run + if(level11(iBasin)%nCells .GT. 1) then + ! get L0 fields + iD0(:, :) = UNPACK(level0_iBasin%Id, level0_iBasin%mask, nodata_i4_tmp) + elev0(:, :) = UNPACK(L0_elev (s0 : e0), & + level0_iBasin%mask, nodata_dp_tmp) + fDir0(:, :) = UNPACK(L0_fDir (s0 : e0), & + level0_iBasin%mask, nodata_i4_tmp) + areaCell0(:, :) = UNPACK(level0_iBasin%CellArea, level0_iBasin%mask, nodata_dp_tmp) + + ! get network vectors of L11 + netPerm(:) = L11_netPerm (level11(iBasin)%iStart : level11(iBasin)%iEnd) + nLinkFromRow(:) = L11_fRow (level11(iBasin)%iStart : level11(iBasin)%iEnd) + nLinkFromCol(:) = L11_fCol (level11(iBasin)%iStart : level11(iBasin)%iEnd) + nLinkToRow(:) = L11_tRow (level11(iBasin)%iStart : level11(iBasin)%iEnd) + nLinkToCol(:) = L11_tCol (level11(iBasin)%iStart : level11(iBasin)%iEnd) + + ! Flood plains: stream network delineation + streamNet0(:, :) = nodata_i4 + floodPlain0(:, :) = nodata_i4 + + do rr = 1, nLinks + + ii = netPerm(rr) + frow = nLinkFromRow(ii) + fcol = nLinkFromCol(ii) + + ! Init + streamNet0(frow, fcol) = ii + floodPlain0(frow, fcol) = ii + stack = 0 + append_chunk = 0 + ns = 1 + stack(ns, 1) = frow + stack(ns, 2) = fcol + + call cellLength(iBasin, fDir0(frow, fcol), fRow, fCol, iFlag_cordinate_sys, nLinkLength(ii)) + nLinkSlope(ii) = elev0(frow, fcol) + + fId = iD0(frow, fcol) + tId = iD0(nLinkToRow(ii), nLinkToCol(ii)) + + do while (.NOT. (fId == tId)) + ! Search flood plain from point(frow,fcol) upwards, keep co-ordinates in STACK + do while (ns > 0) + if (ns + 8 .gt. size(stack, 1)) then + call append(stack, append_chunk) + end if + call moveUp(elev0, fDir0, frow, fcol, stack, ns) + stack(1, 1) = 0 + stack(1, 2) = 0 + ! stack = cshift(stack, SHIFT = 1, DIM = 1) + ! substitute cshift <<< + dummy_1d = stack(1, :) + stack(: size(stack, dim = 1) - 1, :) = stack(2 :, :) + stack(size(stack, dim = 1), :) = dummy_1d + ! substitute cshift >>> + if (stack(1, 1) > 0 .and. stack(1, 2) > 0) floodPlain0(stack(1, 1), stack(1, 2)) = ii + ns = count(stack > 0) / 2 + end do + + ! move downstream + call moveDownOneCell(fDir0(frow, fcol), frow, fcol) + streamNet0(frow, fcol) = ii + floodPlain0(frow, fcol) = ii + fId = iD0(frow, fcol) + stack = 0 + ns = 1 + stack(ns, 1) = frow + stack(ns, 2) = fcol + call cellLength(iBasin, fDir0(fRow, fCol), fRow, fCol, iFlag_cordinate_sys, length) + nLinkLength(ii) = nLinkLength(ii) + length end do - ! end of multi-node network design loop - end if - end if FParea - - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - - ! L0 data sets - call append( L0_streamNet, PACK ( streamNet0(:,:), mask0) ) - call append( L0_floodPlain, PACK ( floodPlain0(:,:), mask0) ) - - ! L11 network data sets - call append( L11_length, nLinkLength(:) ) - call append( L11_aFloodPlain, nLinkAFloodPlain(:) ) - call append( L11_slope, nLinkSlope(:) ) - - ! free space - deallocate (& - mask0, iD0, elev0, fDir0, areaCell0, streamNet0, floodPlain0, & - stack, netPerm, nLinkFromRow, nLinkFromCol, nLinkToRow, nLinkToCol, & - nLinkLength, nLinkAFloodPlain, nLinkSlope, dummy_1d) - deallocate(nodata_i4_tmp,nodata_dp_tmp) - - end subroutine L11_stream_features + ! stream bed slope + nLinkSlope(ii) = (nLinkSlope(ii) - elev0(frow, fcol)) / nLinkLength(ii) + + if (nLinkSlope(ii) < 0.0001_dp) nLinkSlope(ii) = 0.0001_dp + + ! calculate area of floodplains (avoid overwriting) + nLinkAFloodPlain(ii) = sum (areaCell0(:, :), mask = (floodPlain0(:, :) == ii)) + ! old > real( count( floodPlain0(:,:,) == i), dp ) * areaCell0 + + end do + + ! end of multi-node network design loop + end if + end if FParea + + !-------------------------------------------------------- + ! Start padding up local variables to global variables + !-------------------------------------------------------- + + ! L0 data sets + ! check whether L0 data is shared + if (iBasin .eq. 1) then + call append(L0_streamNet, PACK (streamNet0(:, :), level0_iBasin%mask)) + call append(L0_floodPlain, PACK (floodPlain0(:, :), level0_iBasin%mask)) + else if (L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1)) then + call append(L0_streamNet, PACK (streamNet0(:, :), level0_iBasin%mask)) + call append(L0_floodPlain, PACK (floodPlain0(:, :), level0_iBasin%mask)) + end if + + + ! L11 network data sets + call append(L11_length, nLinkLength(:)) + call append(L11_aFloodPlain, nLinkAFloodPlain(:)) + call append(L11_slope, nLinkSlope(:)) + + ! free space + deallocate (& + iD0, elev0, fDir0, streamNet0, floodPlain0, & + areaCell0, stack, netPerm, nLinkFromRow, nLinkFromCol, nLinkToRow, nLinkToCol, & + nLinkLength, nLinkAFloodPlain, nLinkSlope, dummy_1d) + deallocate(nodata_i4_tmp, nodata_dp_tmp) + + end subroutine L11_stream_features ! ------------------------------------------------------------------ @@ -1945,37 +1593,52 @@ end subroutine L11_stream_features ! Modified Luis Samaniego, Jan 2013 - modular version ! Stephan Thober, Aug 2015 - ported to mRM ! ------------------------------------------------------------------ - subroutine L11_fraction_sealed_floodplain( & - nLinks, LCover0, floodPlain0, & ! INTENT IN - areaCell0, nLinkAFloodPlain, & ! INTENT IN - LCClassImp, & ! INTENT IN - nLinkFracFPimp ) ! INTENT OUT - use mo_mrm_constants, only: nodata_dp + subroutine L11_fraction_sealed_floodplain(LCClassImp, do_init) + + use mo_mrm_global_variables, only : L11_nLinkFracFPimp, L0_floodPlain, level11, L11_aFloodPlain, L11_nOutlets + use mo_common_variables, only : level0, L0_LCover, nBasins, nLCoverScene, L0_Basin, Grid + use mo_append, only : append + use mo_common_constants, only : nodata_dp + implicit none - integer(i4), intent(in) :: nLinks - integer(i4), dimension(:), intent(in) :: LCover0 - integer(i4), dimension(:), intent(in) :: floodPlain0 - real(dp), dimension(:), intent(in) :: areaCell0 - real(dp), dimension(:), intent(in) :: nLinkAFloodPlain - integer(i4), intent(in) :: LCClassImp ! e.g. = 2 (old code) - real(dp), dimension(nLinks),intent(out) :: nLinkFracFPimp + integer(i4), intent(in) :: LCClassImp ! e.g. = 2 (old code) + logical, intent(in) :: do_init ! local - integer(i4) :: ii - - ! initalization - nLinkFracFPimp(1:nLinks) = nodata_dp + integer(i4) :: nLinks + real(dp), dimension(:), pointer :: nLinkAFloodPlain + real(dp), dimension(:,:), allocatable :: temp_array + integer(i4) :: ii, iBasin, iiLC, s0, e0 + type(Grid) :: level0_iBasin + + ! initialization + do iBasin = 1, nBasins + allocate(temp_array(level11(iBasin)%nCells, nLCoverScene)) + temp_array = nodata_dp + if (do_init) then + level0_iBasin = level0(L0_Basin(iBasin)) + + s0 = level0_iBasin%iStart + e0 = level0_iBasin%iEnd + nLinks = level11(iBasin)%nCells + 1 - L11_nOutlets(iBasin) + nLinkAFloodPlain => L11_aFloodPlain(level11(iBasin)%iStart : level11(iBasin)%iEnd) + + do iiLC = 1, nLCoverScene + ! for a single node model run + if(nLinks .GT. 0) then + do ii = 1, nLinks + temp_array(ii, iiLC) = sum(level0_iBasin%CellArea(:), & + mask = (L0_floodPlain(s0 : e0) == ii .and. L0_LCover(s0 : e0, iiLC) == LCClassImp)) & + / nLinkAFloodPlain(ii) + end do + end if + end do + end if + call append(L11_nLinkFracFPimp, temp_array(:,:)) + deallocate(temp_array) + end do - ! for a single node model run - if(nLinks .GT. 0) then - do ii = 1, nLinks - nLinkFracFPimp(ii) = sum ( areaCell0(:), & - mask = ( floodPlain0(:) == ii .and. LCover0(:) == LCClassImp ) ) & - / nLinkAFloodPlain(ii) - end do - end if - end subroutine L11_fraction_sealed_floodplain ! ------------------------------------------------------------------ @@ -1983,142 +1646,142 @@ end subroutine L11_fraction_sealed_floodplain ! ------------------------------------------------------------------ subroutine moveUp(elev0, fDir0, fi, fj, ss, nn) - use mo_mrm_constants, only: deltaH - use mo_utils, only: le, ge + use mo_mrm_constants, only : deltaH + use mo_utils, only : le, ge implicit none - real(dp), dimension(:,:), allocatable, intent(IN) :: elev0 - integer(i4), dimension(:,:), allocatable, intent(IN) :: fDir0 - integer(i4), intent(IN) :: fi, fj ! co-ordinate of the stream bed - integer(i4), dimension(:,:), intent(INOUT) :: ss - integer(i4), intent(INOUT) :: nn + real(dp), dimension(:, :), allocatable, intent(IN) :: elev0 + integer(i4), dimension(:, :), allocatable, intent(IN) :: fDir0 + integer(i4), intent(IN) :: fi, fj ! co-ordinate of the stream bed + integer(i4), dimension(:, :), intent(INOUT) :: ss + integer(i4), intent(INOUT) :: nn ! local - integer(i4) :: ii ,jj, ip, im, jp, jm + integer(i4) :: ii, jj, ip, im, jp, jm integer(i4) :: nrows, ncols - ii = ss(1,1) - jj = ss(1,2) - ip = ii+1 - im = ii-1 - jp = jj+1 - jm = jj-1 + ii = ss(1, 1) + jj = ss(1, 2) + ip = ii + 1 + im = ii - 1 + jp = jj + 1 + jm = jj - 1 nrows = size(fDir0, 1) ncols = size(fDir0, 2) !E - if (jp <= ncols ) then - if ( ( fdir0(ii,jp) == 16 ) .and. & - ( le(( elev0(ii,jp) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = ii - ss(nn,2) = jp - !print *, i,jp - end if + if (jp <= ncols) then + if ((fdir0(ii, jp) == 16) .and. & + (le((elev0(ii, jp) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = ii + ss(nn, 2) = jp + !print *, i,jp + end if end if - + !SE - if ( ( ip <= nrows ) .and. & - ( jp <= ncols ) ) then - if ( ( fdir0(ip,jp) == 32 ) .and. & - ( le(( elev0(ip,jp) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = ip - ss(nn,2) = jp - !print *, ip,jp - end if + if ((ip <= nrows) .and. & + (jp <= ncols)) then + if ((fdir0(ip, jp) == 32) .and. & + (le((elev0(ip, jp) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = ip + ss(nn, 2) = jp + !print *, ip,jp + end if end if !S - if ( ( ip <= nrows ) .and. & - ( jp <= ncols ) ) then - if ( ( fdir0(ip,jj) == 64 ) .and. & - ( le(( elev0(ip,jj) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = ip - ss(nn,2) = jj - !print *, ip,j - end if + if ((ip <= nrows) .and. & + (jp <= ncols)) then + if ((fdir0(ip, jj) == 64) .and. & + (le((elev0(ip, jj) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = ip + ss(nn, 2) = jj + !print *, ip,j + end if end if !SW - if ( ( ip <= nrows ) .and. & - ( jp <= ncols ) .and. & - ( jm >= 1 ) ) then - if ( ( fdir0(ip,jm) == 128 ) .and. & - ( le(( elev0(ip,jm) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = ip - ss(nn,2) = jm - !print *, ip,jm - end if + if ((ip <= nrows) .and. & + (jp <= ncols) .and. & + (jm >= 1)) then + if ((fdir0(ip, jm) == 128) .and. & + (le((elev0(ip, jm) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = ip + ss(nn, 2) = jm + !print *, ip,jm + end if end if !W - if ( ( jm >= 1 ) .and. & - (jp <= ncols ) ) then - if ( ( fdir0(ii,jm) == 1 ) .and. & - ( le(( elev0(ii,jm) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = ii - ss(nn,2) = jm - !print *, i,jm - end if + if ((jm >= 1) .and. & + (jp <= ncols)) then + if ((fdir0(ii, jm) == 1) .and. & + (le((elev0(ii, jm) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = ii + ss(nn, 2) = jm + !print *, i,jm + end if end if !NW - if ( ( im >= 1 ) .and. & - ( jp <= ncols ) .and. & - ( jm >= 1 ) ) then - if ( ( fdir0(im,jm) == 2 ) .and. & - ( le(( elev0(im,jm) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = im - ss(nn,2) = jm - !print *, im,jm - end if + if ((im >= 1) .and. & + (jp <= ncols) .and. & + (jm >= 1)) then + if ((fdir0(im, jm) == 2) .and. & + (le((elev0(im, jm) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = im + ss(nn, 2) = jm + !print *, im,jm + end if end if !N - if ( ( im >= 1 ) .and. & - ( jp <= ncols ) ) then - if ( ( fdir0(im,jj) == 4 ) .and. & - ( le(( elev0(im,jj) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = im - ss(nn,2) = jj - !print *, im,j - end if + if ((im >= 1) .and. & + (jp <= ncols)) then + if ((fdir0(im, jj) == 4) .and. & + (le((elev0(im, jj) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = im + ss(nn, 2) = jj + !print *, im,j + end if end if !NE - if ( ( im >= 1 ) .and. & - ( jp <= ncols ) ) then - if ( ( fdir0(im,jp) == 8 ) .and. & - ( le(( elev0(im,jp) - elev0(fi,fj) ), deltaH) ) .and. & - ( ge(( elev0(ii,jp) - elev0(fi,fj) ), 0.0_dp) ) & - ) then - nn = nn + 1 - ss(nn,1) = im - ss(nn,2) = jp - !print *, im,jp - end if + if ((im >= 1) .and. & + (jp <= ncols)) then + if ((fdir0(im, jp) == 8) .and. & + (le((elev0(im, jp) - elev0(fi, fj)), deltaH)) .and. & + (ge((elev0(ii, jp) - elev0(fi, fj)), 0.0_dp)) & + ) then + nn = nn + 1 + ss(nn, 1) = im + ss(nn, 2) = jp + !print *, im,jp + end if end if end subroutine moveUp @@ -2130,32 +1793,32 @@ subroutine moveDownOneCell(fDir, iRow, jCol) implicit none - integer(i4), intent(IN) :: fDir - integer(i4), intent(INOUT) :: iRow, jCol + integer(i4), intent(IN) :: fDir + integer(i4), intent(INOUT) :: iRow, jCol select case (fDir) case(1) !E - jCol = jCol + 1 + jCol = jCol + 1 case(2) !SE - iRow = iRow + 1 - jCol = jCol + 1 + iRow = iRow + 1 + jCol = jCol + 1 case(4) !S - iRow = iRow + 1 + iRow = iRow + 1 case(8) !SW - iRow = iRow + 1 - jCol = jCol - 1 + iRow = iRow + 1 + jCol = jCol - 1 case(16) !W - jCol = jCol - 1 + jCol = jCol - 1 case(32) !NW - iRow = iRow - 1 - jCol = jCol - 1 + iRow = iRow - 1 + jCol = jCol - 1 case(64) !N - iRow = iRow - 1 + iRow = iRow - 1 case(128) !NE - iRow = iRow - 1 - jCol = jCol + 1 + iRow = iRow - 1 + jCol = jCol + 1 case default !sink - ! do nothing + ! do nothing end select end subroutine moveDownOneCell @@ -2165,55 +1828,57 @@ end subroutine moveDownOneCell ! ------------------------------------------------------------------ subroutine cellLength(iBasin, fDir, iRow, jCol, iCoorSystem, length) - use mo_constants, only: SQRT2_dp - use mo_mrm_global_variables, only: level0 + use mo_constants, only : SQRT2_dp + use mo_common_variables, only : level0, Grid, L0_Basin implicit none - integer(i4), intent(IN) :: iBasin - integer(i4), intent(IN) :: fDir - integer(i4), intent(IN) :: iRow - integer(i4), intent(IN) :: jCol - integer(i4), intent(IN) :: iCoorSystem - real(dp), intent(OUT) :: length - + integer(i4), intent(IN) :: iBasin + integer(i4), intent(IN) :: fDir + integer(i4), intent(IN) :: iRow + integer(i4), intent(IN) :: jCol + integer(i4), intent(IN) :: iCoorSystem + real(dp), intent(OUT) :: length + ! local variables - integer(i4) :: iRow_to, jCol_to - real(dp) :: lat_1, long_1, lat_2, long_2 - + integer(i4) :: iRow_to, jCol_to + real(dp) :: lat_1, long_1, lat_2, long_2 + type(Grid) :: level0_iBasin + + level0_iBasin = level0(L0_Basin(iBasin)) ! regular X-Y cordinate system IF(iCoorSystem .EQ. 0) THEN - - select case (fDir) - case(1, 4, 16, 64) ! E, S, W, N - length = 1.0_dp - case(2, 8, 32, 128) ! SE, SW, NW, NE - length = SQRT2_dp - end select - length = length * level0%cellsize(iBasin) - - ! regular lat-lon cordinate system + + select case (fDir) + case(1, 4, 16, 64) ! E, S, W, N + length = 1.0_dp + case(2, 8, 32, 128) ! SE, SW, NW, NE + length = SQRT2_dp + end select + length = length * level0_iBasin%cellsize + + ! regular lat-lon cordinate system ELSE IF(iCoorSystem .EQ. 1) THEN - iRow_to = iRow - jCol_to = jCol - - ! move in the direction of flow - call moveDownOneCell(fDir, iRow_to, jCol_to) - - ! estimate lat-lon points - lat_1 = level0%yllcorner(iBasin) + real( (level0%ncols(iBasin)-jCol),dp)*level0%cellsize(iBasin) + & - 0.5_dp*level0%cellsize(iBasin) - long_1 = level0%xllcorner(iBasin) + real( (iRow-1) ,dp)*level0%cellsize(iBasin) + & - 0.5_dp*level0%cellsize(iBasin) - - lat_2 = level0%yllcorner(iBasin) + real( (level0%ncols(iBasin)-jCol_to),dp)*level0%cellsize(iBasin) + & - 0.5_dp*level0%cellsize(iBasin) - long_2 = level0%xllcorner(iBasin) + real( (iRow_to-1) ,dp)*level0%cellsize(iBasin) + & - 0.5_dp*level0%cellsize(iBasin) - ! get distance between two points - call get_distance_two_lat_lon_points(lat_1, long_1, lat_2, long_2, length) - + iRow_to = iRow + jCol_to = jCol + + ! move in the direction of flow + call moveDownOneCell(fDir, iRow_to, jCol_to) + + ! estimate lat-lon points + lat_1 = level0_iBasin%yllcorner + real((level0_iBasin%ncols - jCol), dp) * level0_iBasin%cellsize + & + 0.5_dp * level0_iBasin%cellsize + long_1 = level0_iBasin%xllcorner + real((iRow - 1), dp) * level0_iBasin%cellsize + & + 0.5_dp * level0_iBasin%cellsize + + lat_2 = level0_iBasin%yllcorner + real((level0_iBasin%ncols - jCol_to), dp) * level0_iBasin%cellsize + & + 0.5_dp * level0_iBasin%cellsize + long_2 = level0_iBasin%xllcorner + real((iRow_to - 1), dp) * level0_iBasin%cellsize + & + 0.5_dp * level0_iBasin%cellsize + ! get distance between two points + call get_distance_two_lat_lon_points(lat_1, long_1, lat_2, long_2, length) + END IF ! end subroutine cellLength @@ -2223,12 +1888,12 @@ end subroutine cellLength ! NAME ! get_distance_two_lat_lon_points - + ! PURPOSE !> \brief estimate distance in [m] between two points in a lat-lon - + !> \details estimate distance in [m] between two points in a lat-lon - + ! INTENT(IN) !> \param[in] "real(dp) :: lat1" latitude of point-1 !> \param[in] "real(dp) :: long1" longitude of point-1 @@ -2271,36 +1936,36 @@ end subroutine cellLength ! -------------------------------------------------------------------------- subroutine get_distance_two_lat_lon_points(lat1, long1, lat2, long2, distance_out) - use mo_constants, only: TWOPI_dp, RadiusEarth_dp + use mo_constants, only : TWOPI_dp, RadiusEarth_dp implicit none - real(dp), intent(in) :: lat1, long1, lat2, long2 - real(dp), intent(out) :: distance_out - + real(dp), intent(in) :: lat1, long1, lat2, long2 + real(dp), intent(out) :: distance_out + ! local variables - real(dp) :: theta1 - real(dp) :: phi1 - real(dp) :: theta2 - real(dp) :: phi2 - real(dp) :: dtor - real(dp) :: term1 - real(dp) :: term2 - real(dp) :: term3 - real(dp) :: temp - - dtor = TWOPI_dp/360.0_dp - theta1 = dtor*long1 - phi1 = dtor*lat1 - theta2 = dtor*long2 - phi2 = dtor*lat2 - - term1 = cos(phi1)*cos(theta1)*cos(phi2)*cos(theta2) - term2 = cos(phi1)*sin(theta1)*cos(phi2)*sin(theta2) - term3 = sin(phi1)*sin(phi2) - temp = term1+term2+term3 + real(dp) :: theta1 + real(dp) :: phi1 + real(dp) :: theta2 + real(dp) :: phi2 + real(dp) :: dtor + real(dp) :: term1 + real(dp) :: term2 + real(dp) :: term3 + real(dp) :: temp + + dtor = TWOPI_dp / 360.0_dp + theta1 = dtor * long1 + phi1 = dtor * lat1 + theta2 = dtor * long2 + phi2 = dtor * lat2 + + term1 = cos(phi1) * cos(theta1) * cos(phi2) * cos(theta2) + term2 = cos(phi1) * sin(theta1) * cos(phi2) * sin(theta2) + term3 = sin(phi1) * sin(phi2) + temp = term1 + term2 + term3 if(temp .GT. 1.0_dp) temp = 1.0_dp - distance_out = RadiusEarth_dp*acos(temp); + distance_out = RadiusEarth_dp * acos(temp); end subroutine get_distance_two_lat_lon_points diff --git a/src/mRM/mo_mrm_objective_function_runoff.f90 b/src/mRM/mo_mrm_objective_function_runoff.f90 index 48161d1c..456ffe39 100644 --- a/src/mRM/mo_mrm_objective_function_runoff.f90 +++ b/src/mRM/mo_mrm_objective_function_runoff.f90 @@ -38,7 +38,8 @@ ! Feb 2016, Juliane Mai - multi-objective function (18) using lnNSE(highflows) and lnNSE(lowflows) ! - multi-objective function (19) using lnNSE(highflows) and lnNSE(lowflows) ! - multi-objective function (20) using FDC and discharge of months DJF -! May 2018, Stephan Thober, Bjoern Guse - single objective function (21) using weighted NSE following (Hundecha and Bardossy, 2004) +! May 2018, Stephan Thober, Bjoern Guse - single objective function (21) using weighted NSE +! following (Hundecha and Bardossy, 2004) MODULE mo_mrm_objective_function_runoff @@ -48,14 +49,13 @@ MODULE mo_mrm_objective_function_runoff ! Modified Stephan Thober, Oct 2015 - removed all none runoff objectives, ! these can be found mo_objective_functions_sm - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp + use mo_optimization_utils, only : eval_interface IMPLICIT NONE PRIVATE - PUBLIC :: loglikelihood ! loglikelihood with errormodel including linear trend and lag(1)-correlation - PUBLIC :: loglikelihood_stddev ! loglikelihood where error is computed from difference of obs vs model PUBLIC :: single_objective_runoff ! single-objective function wrapper PUBLIC :: multi_objective_runoff ! multi-objective function wrapper PUBLIC :: extract_runoff ! extract runoff period specified in mhm.nml from available runoff time series @@ -112,56 +112,70 @@ MODULE mo_mrm_objective_function_runoff ! Modified, ! Oct 2015, Stephan Thober - only runoff objective functions ! May 2018, Stephan Thober, Bjoern Guse - added weighted objective function - ! + ! - FUNCTION single_objective_runoff(parameterset) + FUNCTION single_objective_runoff(parameterset, eval, arg1, arg2, arg3) - USE mo_common_variables, ONLY: opti_function + USE mo_common_mHM_mRM_variables, ONLY : opti_function, opti_method + use mo_message, only : message IMPLICIT NONE - REAL(dp), DIMENSION(:), INTENT(IN) :: parameterset - REAL(dp) :: single_objective_runoff + REAL(dp), DIMENSION(:), INTENT(IN) :: parameterset + procedure(eval_interface), INTENT(IN), POINTER :: eval + real(dp), optional, intent(in) :: arg1 + real(dp), optional, intent(out) :: arg2 + real(dp), optional, intent(out) :: arg3 + REAL(dp) :: single_objective_runoff !write(*,*) 'parameterset: ',parameterset(:) select case (opti_function) case (1) - ! 1.0-nse - single_objective_runoff = objective_nse(parameterset) + ! 1.0-nse + single_objective_runoff = objective_nse(parameterset, eval) case (2) - ! 1.0-lnnse - single_objective_runoff = objective_lnnse(parameterset) + ! 1.0-lnnse + single_objective_runoff = objective_lnnse(parameterset, eval) case (3) - ! 1.0-0.5*(nse+lnnse) - single_objective_runoff = objective_equal_nse_lnnse(parameterset) + ! 1.0-0.5*(nse+lnnse) + single_objective_runoff = objective_equal_nse_lnnse(parameterset, eval) case (4) - ! -loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed - single_objective_runoff = - loglikelihood_stddev(parameterset, 1.0_dp) + if (opti_method .eq. 0_i4) then + ! MCMC + single_objective_runoff = loglikelihood_stddev(parameterset, eval, arg1, arg2, arg3) + else + ! -loglikelihood with trend removed from absolute errors and then lag(1)-autocorrelation removed + single_objective_runoff = - loglikelihood_stddev(parameterset, eval, 1.0_dp) + end if case (5) - ! ((1-NSE)**6+(1-lnNSE)**6)**(1/6) - single_objective_runoff = objective_power6_nse_lnnse(parameterset) + ! ((1-NSE)**6+(1-lnNSE)**6)**(1/6) + single_objective_runoff = objective_power6_nse_lnnse(parameterset, eval) case (6) - ! SSE - single_objective_runoff = objective_sse(parameterset) + ! SSE + single_objective_runoff = objective_sse(parameterset, eval) case (7) - ! -loglikelihood with trend removed from absolute errors - single_objective_runoff = -loglikelihood_trend_no_autocorr(parameterset, 1.0_dp) + ! -loglikelihood with trend removed from absolute errors + single_objective_runoff = -loglikelihood_trend_no_autocorr(parameterset, eval, 1.0_dp) case (8) - ! -loglikelihood of approach 2 of Evin et al. (2013), - ! i.e. linear error model with lag(1)-autocorrelation on relative errors - single_objective_runoff = -loglikelihood_evin2013_2(parameterset) + if (opti_method .eq. 0_i4) then + ! MCMC + single_objective_runoff = loglikelihood_evin2013_2(parameterset, eval, regularize = .true.) + else + ! -loglikelihood of approach 2 of Evin et al. (2013), + ! i.e. linear error model with lag(1)-autocorrelation on relative errors + single_objective_runoff = -loglikelihood_evin2013_2(parameterset, eval) + end if + case (9) - ! KGE - single_objective_runoff = objective_kge(parameterset) + ! KGE + single_objective_runoff = objective_kge(parameterset, eval) case (14) - ! combination of KGE of every gauging station based on a power-6 norm \n - ! sum[((1.0-KGE_i)/ nGauges)**6]**(1/6) - single_objective_runoff = objective_multiple_gauges_kge_power6(parameterset) - case (31) - ! weighted NSE with observed streamflow - single_objective_runoff = objective_weighted_nse(parameterset) + ! combination of KGE of every gauging station based on a power-6 norm \n + ! sum[((1.0-KGE_i)/ nGauges)**6]**(1/6) + single_objective_runoff = objective_multiple_gauges_kge_power6(parameterset, eval) case default - stop "Error objective: This opti_function is either not implemented yet or is not a single-objective one." + call message("Error objective: This opti_function is either not implemented yet or is not a single-objective one.") + stop 1 end select END FUNCTION single_objective_runoff @@ -212,109 +226,38 @@ END FUNCTION single_objective_runoff !> \date Oct 2015 ! Modified, - SUBROUTINE multi_objective_runoff(parameterset, multi_objectives) - - USE mo_common_variables, ONLY: opti_function - - IMPLICIT NONE - - REAL(dp), DIMENSION(:), INTENT(IN) :: parameterset - REAL(dp), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: multi_objectives - - select case (opti_function) - case (16) - ! 1st objective: 1.0-nse - ! 2nd objective: 1.0-lnnse - multi_objectives = multi_objective_nse_lnnse(parameterset) - case (18) - ! 1st objective: 1.0 - lnNSE(Q_highflow) (95% percentile) - ! 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) - multi_objectives = multi_objective_lnnse_highflow_lnnse_lowflow(parameterset) - case (19) - ! 1st objective: 1.0 - lnNSE(Q_highflow) (non-low flow) - ! 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) - multi_objectives = multi_objective_lnnse_highflow_lnnse_lowflow_2(parameterset) - case (20) - ! 1st objective: 1.0 - difference in FDC's low-segment volume - ! 2nd objective: 1.0 - NSE of discharge of months DJF - multi_objectives = multi_objective_ae_fdc_lsv_nse_djf(parameterset) - case default - stop "Error objective: Either this opti_function is not implemented yet or it is not a multi-objective one." - end select - - END SUBROUTINE multi_objective_runoff - - ! ------------------------------------------------------------------ - - ! NAME - ! loglikelihood - - !> \brief Wrapper for loglikelihood functions. - - !> \details This wrapper picks the loglikelihood function selected from the namelist parameter - !> \e opti\_function. \n - !> It returns the return value of the selected loglikelihood function. - !> - !> This routine assumes that the wrapped function is a real likelihood - !> where the errors are known or modelled. - - ! INTENT(IN) - !> \param[in] "real(dp) :: parameterset(:)" 1D-array with parameters the model is run with - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - !> \return real(dp) :: loglikelihood — loglikelihood function value - - ! RESTRICTIONS - !> \note The wrapped functions must return real loglikelihoods, i.e. - !> errors are either known from observations or modelled. - - ! EXAMPLE - ! para = (/ 1., 2, 3., -999., 5., 6. /) - ! obj_value = loglikelihood(para) - - ! LITERATURE - - ! HISTORY - !> \author Juliane Mai - !> \date Dec 2012 - ! Modified, - FUNCTION loglikelihood(parameterset) + SUBROUTINE multi_objective_runoff(parameterset, eval, multi_objectives) - USE mo_common_variables, ONLY: opti_function, opti_method + USE mo_common_mHM_mRM_variables, ONLY : opti_function IMPLICIT NONE REAL(dp), DIMENSION(:), INTENT(IN) :: parameterset - REAL(dp) :: loglikelihood + procedure(eval_interface), INTENT(IN), pointer :: eval + REAL(dp), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: multi_objectives select case (opti_function) - case (8) - if (opti_method == 0) then - ! Approach 2 of Evin et al. (2013), i.e. linear error model with lag(1)-autocorrelation on relative errors - loglikelihood = loglikelihood_evin2013_2(parameterset, regularize=.true.) - else - loglikelihood = loglikelihood_evin2013_2(parameterset) - end if + case (16) + ! 1st objective: 1.0-nse + ! 2nd objective: 1.0-lnnse + multi_objectives = multi_objective_nse_lnnse(parameterset, eval) + case (18) + ! 1st objective: 1.0 - lnNSE(Q_highflow) (95% percentile) + ! 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) + multi_objectives = multi_objective_lnnse_highflow_lnnse_lowflow(parameterset, eval) + case (19) + ! 1st objective: 1.0 - lnNSE(Q_highflow) (non-low flow) + ! 2nd objective: 1.0 - lnNSE(Q_lowflow) (5% of data range) + multi_objectives = multi_objective_lnnse_highflow_lnnse_lowflow_2(parameterset, eval) + case (20) + ! 1st objective: 1.0 - difference in FDC's low-segment volume + ! 2nd objective: 1.0 - NSE of discharge of months DJF + multi_objectives = multi_objective_ae_fdc_lsv_nse_djf(parameterset, eval) case default - stop "Error loglikelihood: chosen opti_function is no loglikelihood." + stop "Error objective: Either this opti_function is not implemented yet or it is not a multi-objective one." end select - END FUNCTION loglikelihood + END SUBROUTINE multi_objective_runoff ! ------------------------------------------------------------------ @@ -344,14 +287,14 @@ END FUNCTION loglikelihood ! None ! INTENT(OUT), OPTIONAL - !> \param[out] "real(dp), optional :: stddev_new" standard deviation of errors with removed trend and correlation + !> \param[out] "real(dp), optional :: stddev_new" standard deviation of errors with removed trend and correlation !> between model run using parameter set and observation !> \param[out] "real(dp), optional :: likeli_new" logarithmic likelihood determined with stddev_new instead of stddev ! RETURN - !> \return real(dp) :: loglikelihood_stddev — logarithmic likelihood using given stddev - !> but remove optimal trend and lag(1)-autocorrelation in errors - !> (absolute between running model with parameterset and observation) + !> \return real(dp) :: loglikelihood_stddev — logarithmic likelihood using given stddev + !> but remove optimal trend and lag(1)-autocorrelation in errors + !> (absolute between running model with parameterset and observation) ! RESTRICTIONS !> \note Input values must be floating points. @@ -370,78 +313,79 @@ END FUNCTION loglikelihood ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION loglikelihood_stddev(parameterset, stddev, stddev_new, likeli_new) - use mo_moment, only: mean, correlation - use mo_linfit, only: linfit - use mo_append, only: append + FUNCTION loglikelihood_stddev(parameterset, eval, stddev, stddev_new, likeli_new) + use mo_moment, only : mean, correlation + use mo_linfit, only : linfit + use mo_append, only : append implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp), intent(in) :: stddev ! standard deviation of data - real(dp), intent(out), optional :: stddev_new ! standard deviation of errors using paraset - real(dp), intent(out), optional :: likeli_new ! likelihood using stddev_new, i.e. using new parameter set - real(dp) :: loglikelihood_stddev + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), intent(in) :: stddev ! standard deviation of data + real(dp), intent(out), optional :: stddev_new ! standard deviation of errors using paraset + real(dp), intent(out), optional :: likeli_new ! likelihood using stddev_new, i.e. using new parameter set + real(dp) :: loglikelihood_stddev ! local - real(dp), dimension(:,:), allocatable :: runoff ! modelled runoff for a given parameter set + real(dp), dimension(:, :), allocatable :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - integer(i4) :: nmeas - real(dp), dimension(:), allocatable :: errors - real(dp), dimension(:), allocatable :: obs, calc, out - real(dp) :: a, b, c - real(dp) :: stddev_tmp - - call eval(parameterset, runoff=runoff) + integer(i4) :: gg ! gauges counter + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + integer(i4) :: nmeas + real(dp), dimension(:), allocatable :: errors + real(dp), dimension(:), allocatable :: obs, calc, out + real(dp) :: a, b, c + real(dp) :: stddev_tmp + + call eval(parameterset, runoff = runoff) ! extract runoff and append it to obs and calc - do gg = 1, size(runoff, dim=2) ! second dimension equals nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! append it to variables - call append( obs, runoff_obs ) - call append( calc, runoff_agg ) + do gg = 1, size(runoff, dim = 2) ! second dimension equals nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! append it to variables + call append(obs, runoff_obs) + call append(calc, runoff_agg) end do ! ---------------------------------------- - nmeas = size(obs, dim = 1) + nmeas = size(obs, dim = 1) allocate(out(nmeas), errors(nmeas)) - errors(:) = abs( calc(:) - obs(:) ) + errors(:) = abs(calc(:) - obs(:)) ! remove linear trend of errors - must be model NOT obs ! out = linfit(obs, errors, a=a, b=b, model2=.False.) ! errors(:) = errors(:) - (a + obs(:)*b) - out = linfit(calc, errors, a=a, b=b, model2=.False.) - errors(:) = errors(:) - (a + calc(:)*b) + out = linfit(calc, errors, a = a, b = b, model2 = .False.) + errors(:) = errors(:) - (a + calc(:) * b) ! remove lag(1)-autocorrelation of errors - c = correlation(errors(2:nmeas),errors(1:nmeas-1)) - errors(1:nmeas-1) = errors(2:nmeas) - c*errors(1:nmeas-1) - errors(nmeas) = 0.0_dp + c = correlation(errors(2 : nmeas), errors(1 : nmeas - 1)) + errors(1 : nmeas - 1) = errors(2 : nmeas) - c * errors(1 : nmeas - 1) + errors(nmeas) = 0.0_dp ! you have to take stddev=const because otherwise loglikelihood is always N ! in MCMC stddev gets updated only when a better likelihood is found. - loglikelihood_stddev = sum( errors(:) * errors(:) / stddev**2 ) + loglikelihood_stddev = sum(errors(:) * errors(:) / stddev**2) loglikelihood_stddev = -0.5_dp * loglikelihood_stddev - write(*,*) '-loglikelihood_stddev = ', -loglikelihood_stddev + write(*, *) '-loglikelihood_stddev = ', -loglikelihood_stddev - stddev_tmp = sqrt(sum( (errors(:) - mean(errors)) * (errors(:) - mean(errors))) / real(nmeas-1,dp)) + stddev_tmp = sqrt(sum((errors(:) - mean(errors)) * (errors(:) - mean(errors))) / real(nmeas - 1, dp)) if (present(stddev_new)) then - stddev_new = stddev_tmp + stddev_new = stddev_tmp end if if (present(likeli_new)) then - likeli_new = sum( errors(:) * errors(:) / stddev_tmp**2 ) - likeli_new = -0.5_dp * likeli_new + likeli_new = sum(errors(:) * errors(:) / stddev_tmp**2) + likeli_new = -0.5_dp * likeli_new end if - deallocate(runoff, runoff_agg, runoff_obs_mask, runoff_obs ) + deallocate(runoff, runoff_agg, runoff_obs_mask, runoff_obs) deallocate(obs, calc, out, errors) END FUNCTION loglikelihood_stddev @@ -479,14 +423,14 @@ END FUNCTION loglikelihood_stddev ! None ! INTENT(OUT), OPTIONAL - !> \param[out] "real(dp), optional :: stddev_new" standard deviation of errors with removed trend and correlation + !> \param[out] "real(dp), optional :: stddev_new" standard deviation of errors with removed trend and correlation !> between model run using parameter set and observation !> \param[out] "real(dp), optional :: likeli_new" logarithmic likelihood determined with stddev_new instead of stddev ! RETURN - !> \return real(dp) :: loglikelihood_evin2013_2 — logarithmic likelihood using given stddev - !> but remove optimal trend and lag(1)-autocorrelation in errors - !> (absolute between running model with parameterset and observation) + !> \return real(dp) :: loglikelihood_evin2013_2 — logarithmic likelihood using given stddev + !> but remove optimal trend and lag(1)-autocorrelation in errors + !> (absolute between running model with parameterset and observation) ! RESTRICTIONS !> \note Does not work with MCMC yet. @@ -505,95 +449,96 @@ END FUNCTION loglikelihood_stddev ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION loglikelihood_evin2013_2(parameterset, regularize) + FUNCTION loglikelihood_evin2013_2(parameterset, eval, regularize) - use mo_constants, only: pi_dp - use mo_moment, only: correlation - use mo_common_variables, only: global_parameters ! for parameter ranges --> col1=min, col2=max - use mo_utils, only: eq - use mo_append, only: append + use mo_constants, only : pi_dp + use mo_moment, only : correlation + use mo_common_variables, only : global_parameters ! for parameter ranges --> col1=min, col2=max + use mo_utils, only : eq + use mo_append, only : append implicit none - real(dp), dimension(:), intent(in) :: parameterset - logical, optional, intent(in) :: regularize - real(dp) :: loglikelihood_evin2013_2 + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + logical, optional, intent(in) :: regularize + real(dp) :: loglikelihood_evin2013_2 ! local - real(dp), dimension(:,:), allocatable :: runoff ! modelled runoff for a given parameter set + real(dp), dimension(:, :), allocatable :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - real(dp) :: penalty ! penalty term due to a parmeter set out of bound - integer(i4) :: gg ! gauges counter - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff - integer(i4) :: nmeas - real(dp), dimension(:), allocatable :: errors, sigma, eta, y - real(dp), dimension(:), allocatable :: obs, calc, out - real(dp) :: a, b, c, vary, vary1, ln2pi, tmp - integer(i4) :: npara - logical :: iregularize + real(dp) :: penalty ! penalty term due to a parmeter set out of bound + integer(i4) :: gg ! gauges counter + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: nmeas + real(dp), dimension(:), allocatable :: errors, sigma, eta, y + real(dp), dimension(:), allocatable :: obs, calc, out + real(dp) :: a, b, c, vary, vary1, ln2pi, tmp + integer(i4) :: npara + logical :: iregularize iregularize = .false. if (present(regularize)) iregularize = regularize npara = size(parameterset) - call eval(parameterset(1:npara-2), runoff=runoff) + call eval(parameterset(1 : npara - 2), runoff = runoff) ! extract runoff and append it to obs and calc - do gg = 1, size(runoff, dim=2) ! second dimension equals nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! append it to variables - call append( obs, runoff_obs ) - call append( calc, runoff_agg ) + do gg = 1, size(runoff, dim = 2) ! second dimension equals nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! append it to variables + call append(obs, runoff_obs) + call append(calc, runoff_agg) end do ! ---------------------------------------- - nmeas = size(obs, dim = 1 ) + nmeas = size(obs, dim = 1) - allocate( out(nmeas), errors(nmeas), sigma(nmeas), eta(nmeas), y(nmeas)) + allocate(out(nmeas), errors(nmeas), sigma(nmeas), eta(nmeas), y(nmeas)) ! residual errors errors(:) = calc(:) - obs(:) ! linear error model - a = parameterset(npara-1) + a = parameterset(npara - 1) b = parameterset(npara) sigma(:) = a + b * calc(:) ! standardized residual errors (SRE) - eta(:) = errors(:) / sigma(:) + eta(:) = errors(:) / sigma(:) ! remove lag(1)-autocorrelation of SRE - c = correlation(eta(2:nmeas),eta(1:nmeas-1)) + c = correlation(eta(2 : nmeas), eta(1 : nmeas - 1)) y(1) = 0.0_dp ! only for completeness - y(2:nmeas) = eta(2:nmeas) - c*eta(1:nmeas-1) + y(2 : nmeas) = eta(2 : nmeas) - c * eta(1 : nmeas - 1) ! likelihood of residual errors - ln2pi = log(sqrt(2.0_dp*pi_dp)) - vary = 1.0_dp - c*c + ln2pi = log(sqrt(2.0_dp * pi_dp)) + vary = 1.0_dp - c * c vary1 = 1.0_dp / vary - loglikelihood_evin2013_2 = -ln2pi - 0.5_dp*eta(1)*eta(1) - log(sigma(1)) & ! li(eta(1))/sigma(1) - - real(nmeas-1,dp)*log(sqrt(2.0_dp*pi_dp*vary)) & - - sum(0.5_dp*y(2:nmeas)*y(2:nmeas)*vary1) - sum(log(sigma(2:nmeas))) + loglikelihood_evin2013_2 = -ln2pi - 0.5_dp * eta(1) * eta(1) - log(sigma(1)) & ! li(eta(1))/sigma(1) + - real(nmeas - 1, dp) * log(sqrt(2.0_dp * pi_dp * vary)) & + - sum(0.5_dp * y(2 : nmeas) * y(2 : nmeas) * vary1) - sum(log(sigma(2 : nmeas))) if (iregularize) then - ! Regularistion term as deviation from initial parameter value - penalty = parameter_regularization( & - parameterset(1:npara-2), & ! current parameter set - global_parameters(1:npara-2,3), & ! prior/initial parameter set - global_parameters(1:npara-2,1:2), & ! bounds - eq(global_parameters(1:npara-2,4),1.0_dp)) ! used/unused - - tmp = loglikelihood_evin2013_2 + penalty - write(*,*) '-loglikelihood_evin2013_2, + penalty, chi^2: ', -loglikelihood_evin2013_2, -tmp, -tmp/real(nmeas,dp) - loglikelihood_evin2013_2 = tmp + ! Regularistion term as deviation from initial parameter value + penalty = parameter_regularization(& + parameterset(1 : npara - 2), & ! current parameter set + global_parameters(1 : npara - 2, 3), & ! prior/initial parameter set + global_parameters(1 : npara - 2, 1 : 2), & ! bounds + eq(global_parameters(1 : npara - 2, 4), 1.0_dp)) ! used/unused + + tmp = loglikelihood_evin2013_2 + penalty + write(*, *) '-loglikelihood_evin2013_2, + penalty, chi^2: ', -loglikelihood_evin2013_2, -tmp, -tmp / real(nmeas, dp) + loglikelihood_evin2013_2 = tmp else - write(*,*) '-loglikelihood_evin2013_2, chi^2: ', -loglikelihood_evin2013_2, -loglikelihood_evin2013_2/real(nmeas,dp) + write(*, *) '-loglikelihood_evin2013_2, chi^2: ', -loglikelihood_evin2013_2, -loglikelihood_evin2013_2 / real(nmeas, dp) end if - deallocate(runoff, runoff_agg, runoff_obs_mask, runoff_obs ) + deallocate(runoff, runoff_agg, runoff_obs_mask, runoff_obs) deallocate(obs, calc, out, errors, sigma, eta, y) END FUNCTION loglikelihood_evin2013_2 @@ -601,38 +546,38 @@ END FUNCTION loglikelihood_evin2013_2 ! Regularisation function sum(((para-ini)/sigma)**2) FUNCTION parameter_regularization(paraset, prior, bounds, mask) - use mo_constants, only: pi_dp + use mo_constants, only : pi_dp implicit none - real(dp), dimension(:), intent(in) :: paraset - real(dp), dimension(size(paraset)), intent(in) :: prior - real(dp), dimension(size(paraset),2), intent(in) :: bounds ! (min, max) - logical, dimension(size(paraset)), intent(in) :: mask - real(dp) :: parameter_regularization + real(dp), dimension(:), intent(in) :: paraset + real(dp), dimension(size(paraset)), intent(in) :: prior + real(dp), dimension(size(paraset), 2), intent(in) :: bounds ! (min, max) + logical, dimension(size(paraset)), intent(in) :: mask + real(dp) :: parameter_regularization ! local variables integer(i4) :: ipara integer(i4) :: npara - real(dp), parameter :: onetwelveth = 1._dp/12._dp + real(dp), parameter :: onetwelveth = 1._dp / 12._dp real(dp), dimension(size(paraset)) :: sigma - npara = size(paraset,1) - - sigma = sqrt(onetwelveth*(bounds(:,2)-bounds(:,1))**2) ! standard deviation of uniform distribution - parameter_regularization = -sum(log(sqrt(2.0_dp*pi_dp)*sigma), mask=mask) - - do ipara=1,npara - if (mask(ipara)) then - ! if ((paraset(ipara) .lt. bounds(ipara,1)) .or. (paraset(ipara) .gt. bounds(ipara,2))) then - ! ! outside bounds - parameter_regularization = parameter_regularization - & - 0.5_dp*((paraset(ipara)-prior(ipara))/sigma(ipara))**2 - ! else - ! ! in bound - ! parameter_regularization = 0.0_dp - ! end if - end if + npara = size(paraset, 1) + + sigma = sqrt(onetwelveth * (bounds(:, 2) - bounds(:, 1))**2) ! standard deviation of uniform distribution + parameter_regularization = -sum(log(sqrt(2.0_dp * pi_dp) * sigma), mask = mask) + + do ipara = 1, npara + if (mask(ipara)) then + ! if ((paraset(ipara) .lt. bounds(ipara,1)) .or. (paraset(ipara) .gt. bounds(ipara,2))) then + ! ! outside bounds + parameter_regularization = parameter_regularization - & + 0.5_dp * ((paraset(ipara) - prior(ipara)) / sigma(ipara))**2 + ! else + ! ! in bound + ! parameter_regularization = 0.0_dp + ! end if + end if end do END FUNCTION parameter_regularization @@ -690,72 +635,73 @@ END FUNCTION parameter_regularization ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION loglikelihood_trend_no_autocorr(parameterset, stddev_old, stddev_new, likeli_new) - use mo_moment, only: stddev - use mo_linfit, only: linfit - use mo_append, only: append + FUNCTION loglikelihood_trend_no_autocorr(parameterset, eval, stddev_old, stddev_new, likeli_new) + use mo_moment, only : stddev + use mo_linfit, only : linfit + use mo_append, only : append implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp), intent(in) :: stddev_old ! standard deviation of data - real(dp), intent(out), optional :: stddev_new ! standard deviation of errors using paraset - real(dp), intent(out), optional :: likeli_new ! likelihood using stddev_new, i.e. using new parameter set - real(dp) :: loglikelihood_trend_no_autocorr + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), intent(in) :: stddev_old ! standard deviation of data + real(dp), intent(out), optional :: stddev_new ! standard deviation of errors using paraset + real(dp), intent(out), optional :: likeli_new ! likelihood using stddev_new, i.e. using new parameter set + real(dp) :: loglikelihood_trend_no_autocorr ! local - real(dp), dimension(:,:), allocatable :: runoff ! modelled runoff for a given parameter set + real(dp), dimension(:, :), allocatable :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - integer(i4) :: nmeas - real(dp), dimension(:), allocatable :: errors - real(dp), dimension(:), allocatable :: obs, calc, out - real(dp) :: a, b - real(dp) :: stddev_tmp - - call eval(parameterset, runoff=runoff) + integer(i4) :: gg ! gauges counter + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + integer(i4) :: nmeas + real(dp), dimension(:), allocatable :: errors + real(dp), dimension(:), allocatable :: obs, calc, out + real(dp) :: a, b + real(dp) :: stddev_tmp + + call eval(parameterset, runoff = runoff) ! extract runoff and append it to obs and calc - do gg = 1, size(runoff, dim=2) ! second dimension equals nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! append it to variables - call append( obs, runoff_obs ) - call append( calc, runoff_agg ) + do gg = 1, size(runoff, dim = 2) ! second dimension equals nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! append it to variables + call append(obs, runoff_obs) + call append(calc, runoff_agg) end do ! ---------------------------------------- - nmeas = size(obs, dim = 1) + nmeas = size(obs, dim = 1) ! allocate output variables allocate(out(nmeas), errors(nmeas)) - errors(:) = abs( calc(:) - obs(:) ) + errors(:) = abs(calc(:) - obs(:)) ! remove linear trend of errors - must be model NOT obs - out = linfit(calc, errors, a=a, b=b, model2=.False.) - errors(:) = errors(:) - (a + calc(:)*b) + out = linfit(calc, errors, a = a, b = b, model2 = .False.) + errors(:) = errors(:) - (a + calc(:) * b) ! you have to take stddev_old=const because otherwise loglikelihood_trend_no_autocorr is always N ! in MCMC stddev_old gets updated only when a better likelihood is found. - loglikelihood_trend_no_autocorr = sum( errors(:) * errors(:) / stddev_old**2 ) + loglikelihood_trend_no_autocorr = sum(errors(:) * errors(:) / stddev_old**2) loglikelihood_trend_no_autocorr = -0.5_dp * loglikelihood_trend_no_autocorr - write(*,*) '-loglikelihood_trend_no_autocorr = ', -loglikelihood_trend_no_autocorr + write(*, *) '-loglikelihood_trend_no_autocorr = ', -loglikelihood_trend_no_autocorr stddev_tmp = 1.0_dp ! initialization if (present(stddev_new) .or. present(likeli_new)) then - stddev_tmp = stddev(errors(:)) + stddev_tmp = stddev(errors(:)) end if if (present(stddev_new)) then - stddev_new = stddev_tmp + stddev_new = stddev_tmp end if if (present(likeli_new)) then - likeli_new = sum( errors(:) * errors(:) / stddev_tmp**2 ) - likeli_new = -0.5_dp * likeli_new + likeli_new = sum(errors(:) * errors(:) / stddev_tmp**2) + likeli_new = -0.5_dp * likeli_new end if deallocate(runoff, runoff_agg, runoff_obs, runoff_obs_mask) @@ -819,42 +765,43 @@ END FUNCTION loglikelihood_trend_no_autocorr ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_lnnse(parameterset) + FUNCTION objective_lnnse(parameterset, eval) - use mo_errormeasures, only: lnnse + use mo_errormeasures, only : lnnse implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_lnnse + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_lnnse ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_lnnse = 0.0_dp - do gg=1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! lnNSE - objective_lnnse = objective_lnnse + & - lnnse( runoff_obs, runoff_agg, mask=runoff_obs_mask) + do gg = 1, nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! lnNSE + objective_lnnse = objective_lnnse + & + lnnse(runoff_obs, runoff_agg, mask = runoff_obs_mask) end do ! objective function value which will be minimized - objective_lnnse = 1.0_dp - objective_lnnse / real(nGaugesTotal,dp) + objective_lnnse = 1.0_dp - objective_lnnse / real(nGaugesTotal, dp) - write(*,*) 'objective_lnnse = ',objective_lnnse + write(*, *) 'objective_lnnse = ', objective_lnnse ! pause - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) END FUNCTION objective_lnnse @@ -912,42 +859,43 @@ END FUNCTION objective_lnnse ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_sse(parameterset) + FUNCTION objective_sse(parameterset, eval) - use mo_errormeasures, only: sse + use mo_errormeasures, only : sse implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_sse + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_sse ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_sse = 0.0_dp - do gg=1, nGaugesTotal - ! - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! - objective_sse = objective_sse + & - sse( runoff_obs, runoff_agg, mask=runoff_obs_mask) + do gg = 1, nGaugesTotal + ! + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! + objective_sse = objective_sse + & + sse(runoff_obs, runoff_agg, mask = runoff_obs_mask) end do ! objective_sse = objective_sse + sse(gauge%Q, runoff_model_agg) !, runoff_model_agg_mask) - objective_sse = objective_sse / real(nGaugesTotal,dp) + objective_sse = objective_sse / real(nGaugesTotal, dp) - write(*,*) 'objective_sse = ', objective_sse + write(*, *) 'objective_sse = ', objective_sse ! pause - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) END FUNCTION objective_sse @@ -1007,42 +955,43 @@ END FUNCTION objective_sse ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_nse(parameterset) + FUNCTION objective_nse(parameterset, eval) - use mo_errormeasures, only: nse + use mo_errormeasures, only : nse implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_nse + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_nse ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_nse = 0.0_dp - do gg=1, nGaugesTotal - ! - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! - objective_nse = objective_nse + & - nse( runoff_obs, runoff_agg, mask=runoff_obs_mask) + do gg = 1, nGaugesTotal + ! + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! + objective_nse = objective_nse + & + nse(runoff_obs, runoff_agg, mask = runoff_obs_mask) end do ! objective_nse = objective_nse + nse(gauge%Q, runoff_model_agg) !, runoff_model_agg_mask) - objective_nse = 1.0_dp - objective_nse / real(nGaugesTotal,dp) + objective_nse = 1.0_dp - objective_nse / real(nGaugesTotal, dp) - write(*,*) 'objective_nse (i.e., 1 - NSE) = ',objective_nse + write(*, *) 'objective_nse (i.e., 1 - NSE) = ', objective_nse ! pause - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) END FUNCTION objective_nse @@ -1105,47 +1054,48 @@ END FUNCTION objective_nse ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_equal_nse_lnnse(parameterset) + FUNCTION objective_equal_nse_lnnse(parameterset, eval) - use mo_errormeasures, only: nse, lnnse + use mo_errormeasures, only : nse, lnnse implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_equal_nse_lnnse + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_equal_nse_lnnse ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_equal_nse_lnnse = 0.0_dp - do gg=1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! - ! NSE - objective_equal_nse_lnnse = objective_equal_nse_lnnse + & - nse( runoff_obs, runoff_agg, mask=runoff_obs_mask ) - ! lnNSE - objective_equal_nse_lnnse = objective_equal_nse_lnnse + & - lnnse( runoff_obs, runoff_agg, mask=runoff_obs_mask ) + do gg = 1, nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! + ! NSE + objective_equal_nse_lnnse = objective_equal_nse_lnnse + & + nse(runoff_obs, runoff_agg, mask = runoff_obs_mask) + ! lnNSE + objective_equal_nse_lnnse = objective_equal_nse_lnnse + & + lnnse(runoff_obs, runoff_agg, mask = runoff_obs_mask) end do ! objective function value which will be minimized - objective_equal_nse_lnnse = 1.0_dp - 0.5_dp * objective_equal_nse_lnnse / real(nGaugesTotal,dp) + objective_equal_nse_lnnse = 1.0_dp - 0.5_dp * objective_equal_nse_lnnse / real(nGaugesTotal, dp) - write(*,*) 'objective_equal_nse_lnnse = ',objective_equal_nse_lnnse + write(*, *) 'objective_equal_nse_lnnse = ', objective_equal_nse_lnnse ! clean up - deallocate( runoff_agg, runoff_obs ) - deallocate( runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs) + deallocate(runoff_obs_mask) END FUNCTION objective_equal_nse_lnnse @@ -1207,49 +1157,50 @@ END FUNCTION objective_equal_nse_lnnse !> \date Oct 2015 ! Modified, - FUNCTION multi_objective_nse_lnnse(parameterset) + FUNCTION multi_objective_nse_lnnse(parameterset, eval) ! use mo_mhm_eval, only: mhm_eval - use mo_errormeasures, only: nse, lnnse + use mo_errormeasures, only : nse, lnnse - implicit none + implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp), dimension(2) :: multi_objective_nse_lnnse + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), dimension(2) :: multi_objective_nse_lnnse ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff ! call mhm_eval(parameterset, runoff=runoff) - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) - - multi_objective_nse_lnnse = 0.0_dp - do gg=1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! - ! NSE - multi_objective_nse_lnnse(1) = multi_objective_nse_lnnse(1) + & - nse( runoff_obs, runoff_agg, mask=runoff_obs_mask ) - ! lnNSE - multi_objective_nse_lnnse(2) = multi_objective_nse_lnnse(2) + & - lnnse( runoff_obs, runoff_agg, mask=runoff_obs_mask ) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) + + multi_objective_nse_lnnse = 0.0_dp + do gg = 1, nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! + ! NSE + multi_objective_nse_lnnse(1) = multi_objective_nse_lnnse(1) + & + nse(runoff_obs, runoff_agg, mask = runoff_obs_mask) + ! lnNSE + multi_objective_nse_lnnse(2) = multi_objective_nse_lnnse(2) + & + lnnse(runoff_obs, runoff_agg, mask = runoff_obs_mask) end do ! objective function value which will be minimized - multi_objective_nse_lnnse(:) = 1.0_dp - multi_objective_nse_lnnse(:) / real(nGaugesTotal,dp) + multi_objective_nse_lnnse(:) = 1.0_dp - multi_objective_nse_lnnse(:) / real(nGaugesTotal, dp) ! write(*,*) 'multi_objective_nse_lnnse = ',multi_objective_nse_lnnse ! clean up - deallocate( runoff_agg, runoff_obs ) - deallocate( runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs) + deallocate(runoff_obs_mask) END FUNCTION multi_objective_nse_lnnse @@ -1319,77 +1270,78 @@ END FUNCTION multi_objective_nse_lnnse !> \date Oct 2015 ! Modified, - FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow(parameterset) + FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow(parameterset, eval) ! use mo_mhm_eval, only: mhm_eval - use mo_errormeasures, only: lnnse - use mo_percentile, only: percentile + use mo_errormeasures, only : lnnse + use mo_percentile, only : percentile - implicit none + implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp), dimension(2) :: multi_objective_lnnse_highflow_lnnse_lowflow + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), dimension(2) :: multi_objective_lnnse_highflow_lnnse_lowflow ! local - real(dp), dimension(:,:), allocatable :: runoff ! modelled runoff for a given parameter set - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - real(dp) :: q_low ! upper discharge value to determine lowflow timepoints - real(dp) :: q_high ! lower discharge value to determine highflow timepoints - integer(i4) :: nrunoff ! total number of discharge values - integer(i4) :: tt ! timepoint counter - logical, dimension(:), allocatable :: lowflow_mask ! mask to get lowflow values - logical, dimension(:), allocatable :: highflow_mask ! mask to get highflow values + real(dp), dimension(:, :), allocatable :: runoff ! modelled runoff for a given parameter set + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + real(dp) :: q_low ! upper discharge value to determine lowflow timepoints + real(dp) :: q_high ! lower discharge value to determine highflow timepoints + integer(i4) :: nrunoff ! total number of discharge values + integer(i4) :: tt ! timepoint counter + logical, dimension(:), allocatable :: lowflow_mask ! mask to get lowflow values + logical, dimension(:), allocatable :: highflow_mask ! mask to get highflow values ! call mhm_eval(parameterset, runoff=runoff) - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) - - multi_objective_lnnse_highflow_lnnse_lowflow = 0.0_dp - do gg=1, nGaugesTotal - ! - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - nrunoff = size(runoff_obs,dim=1) - !print*, 'nrunoff = ',nrunoff - ! - ! mask for highflow timepoints - if ( allocated(highflow_mask) ) deallocate(highflow_mask) - allocate( highflow_mask( nrunoff ) ) - highflow_mask = .false. - q_high = percentile(runoff_obs,95._dp,mask=runoff_obs_mask) - forall(tt=1:nrunoff) highflow_mask(tt) = ( runoff_obs(tt) > q_high .and. runoff_obs_mask(tt)) - !print*, 'nhigh = ',count(highflow_mask) - ! - ! mask for lowflow timepoints - if ( allocated(lowflow_mask) ) deallocate(lowflow_mask) - allocate( lowflow_mask( nrunoff ) ) - lowflow_mask = .false. - q_low = minval(runoff_obs,mask=runoff_obs_mask) & - + 0.05_dp * (maxval(runoff_obs,mask=runoff_obs_mask) - minval(runoff_obs,mask=runoff_obs_mask)) - forall(tt=1:nrunoff) lowflow_mask(tt) = ( runoff_obs(tt) < q_low .and. runoff_obs_mask(tt)) - !print*, 'nlow = ',count(lowflow_mask) - ! - ! lnNSE highflows - multi_objective_lnnse_highflow_lnnse_lowflow(1) = multi_objective_lnnse_highflow_lnnse_lowflow(1) + & - lnnse( runoff_obs, runoff_agg, mask=highflow_mask ) - ! - ! lnNSE lowflows - multi_objective_lnnse_highflow_lnnse_lowflow(2) = multi_objective_lnnse_highflow_lnnse_lowflow(2) + & - lnnse( runoff_obs, runoff_agg, mask=lowflow_mask ) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) + + multi_objective_lnnse_highflow_lnnse_lowflow = 0.0_dp + do gg = 1, nGaugesTotal + ! + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + nrunoff = size(runoff_obs, dim = 1) + !print*, 'nrunoff = ',nrunoff + ! + ! mask for highflow timepoints + if (allocated(highflow_mask)) deallocate(highflow_mask) + allocate(highflow_mask(nrunoff)) + highflow_mask = .false. + q_high = percentile(runoff_obs, 95._dp, mask = runoff_obs_mask) + forall(tt = 1 : nrunoff) highflow_mask(tt) = (runoff_obs(tt) > q_high .and. runoff_obs_mask(tt)) + !print*, 'nhigh = ',count(highflow_mask) + ! + ! mask for lowflow timepoints + if (allocated(lowflow_mask)) deallocate(lowflow_mask) + allocate(lowflow_mask(nrunoff)) + lowflow_mask = .false. + q_low = minval(runoff_obs, mask = runoff_obs_mask) & + + 0.05_dp * (maxval(runoff_obs, mask = runoff_obs_mask) - minval(runoff_obs, mask = runoff_obs_mask)) + forall(tt = 1 : nrunoff) lowflow_mask(tt) = (runoff_obs(tt) < q_low .and. runoff_obs_mask(tt)) + !print*, 'nlow = ',count(lowflow_mask) + ! + ! lnNSE highflows + multi_objective_lnnse_highflow_lnnse_lowflow(1) = multi_objective_lnnse_highflow_lnnse_lowflow(1) + & + lnnse(runoff_obs, runoff_agg, mask = highflow_mask) + ! + ! lnNSE lowflows + multi_objective_lnnse_highflow_lnnse_lowflow(2) = multi_objective_lnnse_highflow_lnnse_lowflow(2) + & + lnnse(runoff_obs, runoff_agg, mask = lowflow_mask) end do ! objective function value which will be minimized multi_objective_lnnse_highflow_lnnse_lowflow(:) = 1.0_dp & - - multi_objective_lnnse_highflow_lnnse_lowflow(:) / real(nGaugesTotal,dp) + - multi_objective_lnnse_highflow_lnnse_lowflow(:) / real(nGaugesTotal, dp) ! write(*,*) 'multi_objective_lnnse_highflow_lnnse_lowflow = ',multi_objective_lnnse_highflow_lnnse_lowflow ! clean up - deallocate( runoff_agg, runoff_obs ) - deallocate( runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs) + deallocate(runoff_obs_mask) END FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow @@ -1458,73 +1410,74 @@ END FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow !> \date Oct 2015 ! Modified, - FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow_2(parameterset) + FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow_2(parameterset, eval) ! use mo_mhm_eval, only: mhm_eval - use mo_errormeasures, only: lnnse + use mo_errormeasures, only : lnnse - implicit none + implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp), dimension(2) :: multi_objective_lnnse_highflow_lnnse_lowflow_2 + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), dimension(2) :: multi_objective_lnnse_highflow_lnnse_lowflow_2 ! local - real(dp), dimension(:,:), allocatable :: runoff ! modelled runoff for a given parameter set - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - real(dp) :: q_low ! upper discharge value to determine lowflow timepoints - integer(i4) :: nrunoff ! total number of discharge values - integer(i4) :: tt ! timepoint counter - logical, dimension(:), allocatable :: lowflow_mask ! mask to get lowflow values - logical, dimension(:), allocatable :: highflow_mask ! mask to get highflow values + real(dp), dimension(:, :), allocatable :: runoff ! modelled runoff for a given parameter set + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + real(dp) :: q_low ! upper discharge value to determine lowflow timepoints + integer(i4) :: nrunoff ! total number of discharge values + integer(i4) :: tt ! timepoint counter + logical, dimension(:), allocatable :: lowflow_mask ! mask to get lowflow values + logical, dimension(:), allocatable :: highflow_mask ! mask to get highflow values ! call mhm_eval(parameterset, runoff=runoff) - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) - - multi_objective_lnnse_highflow_lnnse_lowflow_2 = 0.0_dp - do gg=1, nGaugesTotal - ! - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - nrunoff = size(runoff_obs,dim=1) - !print*, 'nrunoff = ',nrunoff - ! - ! mask for lowflow timepoints - if ( allocated(lowflow_mask) ) deallocate(lowflow_mask) - allocate( lowflow_mask( nrunoff ) ) - lowflow_mask = .false. - q_low = minval(runoff_obs,mask=runoff_obs_mask) & - + 0.05_dp * (maxval(runoff_obs,mask=runoff_obs_mask) - minval(runoff_obs,mask=runoff_obs_mask)) - forall(tt=1:nrunoff) lowflow_mask(tt) = ( runoff_obs(tt) < q_low .and. runoff_obs_mask(tt)) - !print*, 'nlow = ',count(lowflow_mask) - ! - ! mask for highflow timepoints - if ( allocated(highflow_mask) ) deallocate(highflow_mask) - allocate( highflow_mask( nrunoff ) ) - highflow_mask = (.not. lowflow_mask) .and. runoff_obs_mask - !print*, 'nhigh = ',count(highflow_mask) - ! - ! lnNSE highflows - multi_objective_lnnse_highflow_lnnse_lowflow_2(1) = multi_objective_lnnse_highflow_lnnse_lowflow_2(1) + & - lnnse( runoff_obs, runoff_agg, mask=highflow_mask ) - ! - ! lnNSE lowflows - multi_objective_lnnse_highflow_lnnse_lowflow_2(2) = multi_objective_lnnse_highflow_lnnse_lowflow_2(2) + & - lnnse( runoff_obs, runoff_agg, mask=lowflow_mask ) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) + + multi_objective_lnnse_highflow_lnnse_lowflow_2 = 0.0_dp + do gg = 1, nGaugesTotal + ! + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + nrunoff = size(runoff_obs, dim = 1) + !print*, 'nrunoff = ',nrunoff + ! + ! mask for lowflow timepoints + if (allocated(lowflow_mask)) deallocate(lowflow_mask) + allocate(lowflow_mask(nrunoff)) + lowflow_mask = .false. + q_low = minval(runoff_obs, mask = runoff_obs_mask) & + + 0.05_dp * (maxval(runoff_obs, mask = runoff_obs_mask) - minval(runoff_obs, mask = runoff_obs_mask)) + forall(tt = 1 : nrunoff) lowflow_mask(tt) = (runoff_obs(tt) < q_low .and. runoff_obs_mask(tt)) + !print*, 'nlow = ',count(lowflow_mask) + ! + ! mask for highflow timepoints + if (allocated(highflow_mask)) deallocate(highflow_mask) + allocate(highflow_mask(nrunoff)) + highflow_mask = (.not. lowflow_mask) .and. runoff_obs_mask + !print*, 'nhigh = ',count(highflow_mask) + ! + ! lnNSE highflows + multi_objective_lnnse_highflow_lnnse_lowflow_2(1) = multi_objective_lnnse_highflow_lnnse_lowflow_2(1) + & + lnnse(runoff_obs, runoff_agg, mask = highflow_mask) + ! + ! lnNSE lowflows + multi_objective_lnnse_highflow_lnnse_lowflow_2(2) = multi_objective_lnnse_highflow_lnnse_lowflow_2(2) + & + lnnse(runoff_obs, runoff_agg, mask = lowflow_mask) end do ! objective function value which will be minimized multi_objective_lnnse_highflow_lnnse_lowflow_2(:) = 1.0_dp & - - multi_objective_lnnse_highflow_lnnse_lowflow_2(:) / real(nGaugesTotal,dp) + - multi_objective_lnnse_highflow_lnnse_lowflow_2(:) / real(nGaugesTotal, dp) ! write(*,*) 'multi_objective_lnnse_highflow_lnnse_lowflow_2 = ',multi_objective_lnnse_highflow_lnnse_lowflow_2 ! clean up - deallocate( runoff_agg, runoff_obs ) - deallocate( runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs) + deallocate(runoff_obs_mask) END FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow_2 @@ -1588,86 +1541,88 @@ END FUNCTION multi_objective_lnnse_highflow_lnnse_lowflow_2 !> \date Feb 2016 ! Modified, - FUNCTION multi_objective_ae_fdc_lsv_nse_djf(parameterset) + FUNCTION multi_objective_ae_fdc_lsv_nse_djf(parameterset, eval) - use mo_errormeasures, only: nse - use mo_julian, only: dec2date - use mo_mrm_global_variables, only: gauge, nMeasPerDay, evalPer - use mo_mrm_signatures, only: FlowDurationCurve + use mo_errormeasures, only : nse + use mo_julian, only : dec2date + use mo_mrm_global_variables, only : gauge, nMeasPerDay + use mo_common_mhm_mrm_variables, only : evalPer + use mo_mrm_signatures, only : FlowDurationCurve - implicit none + implicit none - real(dp), dimension(:), intent(in) :: parameterset - real(dp), dimension(2) :: multi_objective_ae_fdc_lsv_nse_djf + real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp), dimension(2) :: multi_objective_ae_fdc_lsv_nse_djf ! local - real(dp), dimension(:,:), allocatable :: runoff ! modelled runoff for a given parameter set - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal ! total number of gauges - integer(i4) :: iBasin ! basin ID of gauge - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff - integer(i4) :: nrunoff ! total number of discharge values - integer(i4) :: tt ! timepoint counter - integer(i4) :: month ! month of current time step - real(dp) :: current_time ! Fractional Julian day of current time step - logical, dimension(:), allocatable :: djf_mask ! mask to get lowflow values - real(dp), dimension(10) :: quantiles ! quantiles for FDC - integer(i4) :: nquantiles ! number of quantiles - real(dp), dimension(size(quantiles)) :: fdc ! FDC of simulated or observed discharge - real(dp) :: lsv_mod ! low-segment volume of FDC of simulated discharge - real(dp) :: lsv_obs ! low-segment volume of FDC of observed discharge + real(dp), dimension(:, :), allocatable :: runoff ! modelled runoff for a given parameter set + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal ! total number of gauges + integer(i4) :: iBasin ! basin ID of gauge + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for aggregated measured runoff + integer(i4) :: nrunoff ! total number of discharge values + integer(i4) :: tt ! timepoint counter + integer(i4) :: month ! month of current time step + real(dp) :: current_time ! Fractional Julian day of current time step + logical, dimension(:), allocatable :: djf_mask ! mask to get lowflow values + real(dp), dimension(10) :: quantiles ! quantiles for FDC + integer(i4) :: nquantiles ! number of quantiles + real(dp), dimension(size(quantiles)) :: fdc ! FDC of simulated or observed discharge + real(dp) :: lsv_mod ! low-segment volume of FDC of simulated discharge + real(dp) :: lsv_obs ! low-segment volume of FDC of observed discharge ! call mhm_eval(parameterset, runoff=runoff) - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) - nquantiles = size(quantiles) - forall(tt=1:nquantiles) quantiles(tt) = real(tt,dp) / real(nquantiles,dp) - - multi_objective_ae_fdc_lsv_nse_djf = 0.0_dp - do gg=1, nGaugesTotal - ! - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - nrunoff = size(runoff_obs,dim=1) - ! - ! mask DJF timepoints - if ( allocated(djf_mask) ) deallocate(djf_mask) - allocate( djf_mask( nrunoff ) ) - djf_mask = .false. - - iBasin = gauge%basinId( gg ) - do tt=1, nrunoff - current_time = evalPer( iBasin )%julStart + (tt-1) * 1.0_dp/real(nMeasPerDay,dp) - call dec2date(current_time, mm=month) - if ( (month == 1 .or. month == 2 .or. month == 12) .and. runoff_obs_mask(tt) ) djf_mask(tt) = .True. - end do - ! - ! Absolute error of low-segment volume of FDC - fdc = FlowDurationCurve(runoff_obs, quantiles, mask=runoff_obs_mask, low_segment_volume=lsv_obs) - fdc = FlowDurationCurve(runoff_agg, quantiles, mask=runoff_obs_mask, low_segment_volume=lsv_mod) - fdc = fdc * 1.0_dp ! only to avoid warning of unused variable - ! - ! Absolute distance between low-segment volumes - multi_objective_ae_fdc_lsv_nse_djf(1) = multi_objective_ae_fdc_lsv_nse_djf(1) + & - abs( lsv_obs - lsv_mod ) - ! - ! NSE of DJF discharge - multi_objective_ae_fdc_lsv_nse_djf(2) = multi_objective_ae_fdc_lsv_nse_djf(2) + & - nse( runoff_obs, runoff_agg, mask=djf_mask ) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) + nquantiles = size(quantiles) + forall(tt = 1 : nquantiles) quantiles(tt) = real(tt, dp) / real(nquantiles, dp) + + multi_objective_ae_fdc_lsv_nse_djf = 0.0_dp + do gg = 1, nGaugesTotal + ! + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + nrunoff = size(runoff_obs, dim = 1) + ! + ! mask DJF timepoints + if (allocated(djf_mask)) deallocate(djf_mask) + allocate(djf_mask(nrunoff)) + djf_mask = .false. + + iBasin = gauge%basinId(gg) + do tt = 1, nrunoff + current_time = evalPer(iBasin)%julStart + (tt - 1) * 1.0_dp / real(nMeasPerDay, dp) + call dec2date(current_time, mm = month) + if ((month == 1 .or. month == 2 .or. month == 12) .and. runoff_obs_mask(tt)) djf_mask(tt) = .True. + end do + ! + ! Absolute error of low-segment volume of FDC + fdc = FlowDurationCurve(runoff_obs, quantiles, mask = runoff_obs_mask, low_segment_volume = lsv_obs) + fdc = FlowDurationCurve(runoff_agg, quantiles, mask = runoff_obs_mask, low_segment_volume = lsv_mod) + fdc = fdc * 1.0_dp ! only to avoid warning of unused variable + ! + ! Absolute distance between low-segment volumes + multi_objective_ae_fdc_lsv_nse_djf(1) = multi_objective_ae_fdc_lsv_nse_djf(1) + & + abs(lsv_obs - lsv_mod) + ! + ! NSE of DJF discharge + multi_objective_ae_fdc_lsv_nse_djf(2) = multi_objective_ae_fdc_lsv_nse_djf(2) + & + nse(runoff_obs, runoff_agg, mask = djf_mask) end do ! objective function value which will be minimized multi_objective_ae_fdc_lsv_nse_djf(1) = & - multi_objective_ae_fdc_lsv_nse_djf(1) / real(nGaugesTotal,dp) + multi_objective_ae_fdc_lsv_nse_djf(1) / real(nGaugesTotal, dp) multi_objective_ae_fdc_lsv_nse_djf(2) = 1.0_dp & - - multi_objective_ae_fdc_lsv_nse_djf(2) / real(nGaugesTotal,dp) + - multi_objective_ae_fdc_lsv_nse_djf(2) / real(nGaugesTotal, dp) - write(*,*) 'multi_objective_ae_fdc_lsv_nse_djf = ',multi_objective_ae_fdc_lsv_nse_djf + write(*, *) 'multi_objective_ae_fdc_lsv_nse_djf = ', multi_objective_ae_fdc_lsv_nse_djf ! clean up - deallocate( runoff_agg, runoff_obs ) - deallocate( runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs) + deallocate(runoff_obs_mask) END FUNCTION multi_objective_ae_fdc_lsv_nse_djf @@ -1733,44 +1688,45 @@ END FUNCTION multi_objective_ae_fdc_lsv_nse_djf ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_power6_nse_lnnse(parameterset) + FUNCTION objective_power6_nse_lnnse(parameterset, eval) - use mo_errormeasures, only: nse, lnnse + use mo_errormeasures, only : nse, lnnse implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_power6_nse_lnnse + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_power6_nse_lnnse ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_power6_nse_lnnse = 0.0_dp - do gg=1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! NSE + lnNSE - objective_power6_nse_lnnse = objective_power6_nse_lnnse + & - ( (1.0_dp-nse( runoff_obs, runoff_agg, mask=runoff_obs_mask) )**6 + & - (1.0_dp-lnnse(runoff_obs, runoff_agg, mask=runoff_obs_mask) )**6 )**onesixth + do gg = 1, nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! NSE + lnNSE + objective_power6_nse_lnnse = objective_power6_nse_lnnse + & + ((1.0_dp - nse(runoff_obs, runoff_agg, mask = runoff_obs_mask))**6 + & + (1.0_dp - lnnse(runoff_obs, runoff_agg, mask = runoff_obs_mask))**6)**onesixth end do ! objective function value which will be minimized - objective_power6_nse_lnnse = objective_power6_nse_lnnse / real(nGaugesTotal,dp) + objective_power6_nse_lnnse = objective_power6_nse_lnnse / real(nGaugesTotal, dp) - write(*,*) 'objective_power6_nse_lnnse = ', objective_power6_nse_lnnse + write(*, *) 'objective_power6_nse_lnnse = ', objective_power6_nse_lnnse ! pause - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) END FUNCTION objective_power6_nse_lnnse @@ -1841,43 +1797,44 @@ END FUNCTION objective_power6_nse_lnnse ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_kge(parameterset) + FUNCTION objective_kge(parameterset, eval) - use mo_errormeasures, only: kge + use mo_errormeasures, only : kge implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_kge + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_kge ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff ! - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_kge = 0.0_dp - do gg=1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! KGE - objective_kge = objective_kge + & - kge( runoff_obs, runoff_agg, mask=runoff_obs_mask) + do gg = 1, nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! KGE + objective_kge = objective_kge + & + kge(runoff_obs, runoff_agg, mask = runoff_obs_mask) end do ! objective_kge = objective_kge + kge(gauge%Q, runoff_model_agg, runoff_model_agg_mask) - objective_kge = 1.0_dp - objective_kge / real(nGaugesTotal,dp) + objective_kge = 1.0_dp - objective_kge / real(nGaugesTotal, dp) - write(*,*) 'objective_kge (i.e., 1 - KGE) = ', objective_kge + write(*, *) 'objective_kge (i.e., 1 - KGE) = ', objective_kge ! pause - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) END FUNCTION objective_kge @@ -1950,45 +1907,45 @@ END FUNCTION objective_kge ! Stephan Thober, Aug 2015 - substituted nGaugesTotal variable with size(runoff, dim=2) ! to not interfere with mRM - FUNCTION objective_multiple_gauges_kge_power6(parameterset) + FUNCTION objective_multiple_gauges_kge_power6(parameterset, eval) - use mo_errormeasures, only: kge + use mo_errormeasures, only : kge implicit none real(dp), dimension(:), intent(in) :: parameterset - real(dp) :: objective_multiple_gauges_kge_power6 - real(dp), parameter :: onesixth = 1.0_dp/6.0_dp + procedure(eval_interface), INTENT(IN), pointer :: eval + real(dp) :: objective_multiple_gauges_kge_power6 + real(dp), parameter :: onesixth = 1.0_dp / 6.0_dp ! local - real(dp), allocatable, dimension(:,:) :: runoff ! modelled runoff for a given parameter set + real(dp), allocatable, dimension(:, :) :: runoff ! modelled runoff for a given parameter set ! ! dim1=nTimeSteps, dim2=nGauges - integer(i4) :: gg ! gauges counter - integer(i4) :: nGaugesTotal - real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff - real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff - logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff + integer(i4) :: gg ! gauges counter + integer(i4) :: nGaugesTotal + real(dp), dimension(:), allocatable :: runoff_agg ! aggregated simulated runoff + real(dp), dimension(:), allocatable :: runoff_obs ! measured runoff + logical, dimension(:), allocatable :: runoff_obs_mask ! mask for measured runoff ! - call eval(parameterset, runoff=runoff) - nGaugesTotal = size(runoff, dim=2) + call eval(parameterset, runoff = runoff) + nGaugesTotal = size(runoff, dim = 2) objective_multiple_gauges_kge_power6 = 0.0_dp - do gg=1, nGaugesTotal - ! extract runoff - call extract_runoff( gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) - ! KGE - objective_multiple_gauges_kge_power6 = objective_multiple_gauges_kge_power6 + & - ( (1.0_dp - kge(runoff_obs, runoff_agg, mask=runoff_obs_mask) )/ real(nGaugesTotal,dp) )**6 + do gg = 1, nGaugesTotal + ! extract runoff + call extract_runoff(gg, runoff, runoff_agg, runoff_obs, runoff_obs_mask) + ! KGE + objective_multiple_gauges_kge_power6 = objective_multiple_gauges_kge_power6 + & + ((1.0_dp - kge(runoff_obs, runoff_agg, mask = runoff_obs_mask)) / real(nGaugesTotal, dp))**6 end do - objective_multiple_gauges_kge_power6 = objective_multiple_gauges_kge_power6**onesixth - write(*,*) 'objective_multiple_gauges_kge_power6 = ', objective_multiple_gauges_kge_power6 + objective_multiple_gauges_kge_power6 = objective_multiple_gauges_kge_power6**onesixth + write(*, *) 'objective_multiple_gauges_kge_power6 = ', objective_multiple_gauges_kge_power6 - deallocate( runoff_agg, runoff_obs, runoff_obs_mask ) + deallocate(runoff_agg, runoff_obs, runoff_obs_mask) END FUNCTION objective_multiple_gauges_kge_power6 - ! ------------------------------------------------------------------ ! NAME @@ -1996,15 +1953,15 @@ END FUNCTION objective_multiple_gauges_kge_power6 !> \brief Objective function of weighted NSE. - !> \details The objective function only depends on a parameter vector. - !> The model will be called with that parameter vector and + !> \details The objective function only depends on a parameter vector. + !> The model will be called with that parameter vector and !> the model output is subsequently compared to observed data. !> Therefore, the weighted Nash-Sutcliffe model efficiency coefficient \f$ NSE \f$ !> \f[ wNSE = 1 - \frac{\sum_{i=1}^N Q_{obs}(i) * (Q_{obs}(i) - Q_{model}(i))^2} !> {\sum_{i=1}^N Q_{obs}(i) * (Q_{obs}(i) - \bar{Q_{obs}})^2} \f] !> is calculated and the objective function is !> \f[ obj\_value = 1- wNSE \f] - !> The observed data \f$ Q_{obs} \f$ are global in this module. + !> The observed data \f$ Q_{obs} \f$ are global in this module. ! INTENT(IN) !> \param[in] "real(dp) :: parameterset(:)" 1D-array with parameters the model is run with @@ -2025,7 +1982,7 @@ END FUNCTION objective_multiple_gauges_kge_power6 ! None ! RETURN - !> \return real(dp) :: objective_weighted_nse — objective function value + !> \return real(dp) :: objective_weighted_nse — objective function value !> (which will be e.g. minimized by an optimization routine like DDS) ! RESTRICTIONS @@ -2043,13 +2000,14 @@ END FUNCTION objective_multiple_gauges_kge_power6 !> \date May 2018 ! Modified - FUNCTION objective_weighted_nse(parameterset) + FUNCTION objective_weighted_nse(parameterset, eval) use mo_errormeasures, only: wnse implicit none real(dp), dimension(:), intent(in) :: parameterset + procedure(eval_interface), INTENT(IN), pointer :: eval real(dp) :: objective_weighted_nse ! local @@ -2082,6 +2040,7 @@ FUNCTION objective_weighted_nse(parameterset) END FUNCTION objective_weighted_nse + ! ------------------------------------------------------------------ ! NAME @@ -2134,17 +2093,18 @@ END FUNCTION objective_weighted_nse !> \date Jan 2015 ! ------------------------------------------------------------------ - subroutine extract_runoff( gaugeId, runoff, runoff_agg, runoff_obs, runoff_obs_mask ) + subroutine extract_runoff(gaugeId, runoff, runoff_agg, runoff_obs, runoff_obs_mask) - use mo_mrm_global_variables, only: gauge, nMeasPerDay, evalPer, warmingDays_mrm, nTstepDay - use mo_message, only: message - use mo_utils, only: ge + use mo_mrm_global_variables, only : gauge, nMeasPerDay + use mo_common_mhm_mrm_variables, only : evalPer, warmingDays, nTstepDay + use mo_message, only : message + use mo_utils, only : ge implicit none ! input variables - integer(i4), intent(in) :: gaugeId ! current gauge Id - real(dp), dimension(:,:), intent(in) :: runoff ! simulated runoff + integer(i4), intent(in) :: gaugeId ! current gauge Id + real(dp), dimension(:, :), intent(in) :: runoff ! simulated runoff ! output variables real(dp), dimension(:), allocatable, intent(out) :: runoff_agg ! aggregated simulated @@ -2153,16 +2113,16 @@ subroutine extract_runoff( gaugeId, runoff, runoff_agg, runoff_obs, runoff_obs_m real(dp), dimension(:), allocatable, intent(out) :: runoff_obs ! extracted measured ! runoff to exactly the ! evaluation period - logical, dimension(:), allocatable, intent(out) :: runoff_obs_mask ! mask of no data values + logical, dimension(:), allocatable, intent(out) :: runoff_obs_mask ! mask of no data values ! in runoff_obs ! local variables - integer(i4) :: iBasin ! basin id - integer(i4) :: tt ! timestep counter - integer(i4) :: length ! length of extracted time series - integer(i4) :: factor ! between simulated and measured time scale - integer(i4) :: TPD_sim ! simulated Timesteps per Day - integer(i4) :: TPD_obs ! observed Timesteps per Day + integer(i4) :: iBasin ! basin id + integer(i4) :: tt ! timestep counter + integer(i4) :: length ! length of extracted time series + integer(i4) :: factor ! between simulated and measured time scale + integer(i4) :: TPD_sim ! simulated Timesteps per Day + integer(i4) :: TPD_obs ! observed Timesteps per Day real(dp), dimension(:), allocatable :: dummy ! copy time resolution to local variables @@ -2170,119 +2130,45 @@ subroutine extract_runoff( gaugeId, runoff, runoff_agg, runoff_obs, runoff_obs_m TPD_obs = nMeasPerDay ! check if modelled timestep is an integer multiple of measured timesteps - if ( modulo( TPD_sim, TPD_obs) .eq. 0 ) then - factor = TPD_sim / TPD_obs + if (modulo(TPD_sim, TPD_obs) .eq. 0) then + factor = TPD_sim / TPD_obs else - call message(' Error: Number of modelled datapoints is no multiple of measured datapoints per day') - stop + call message(' Error: Number of modelled datapoints is no multiple of measured datapoints per day') + stop end if ! extract basin Id from gauge Id - iBasin = gauge%basinId( gaugeId ) + iBasin = gauge%basinId(gaugeId) ! get length of evaluation period times TPD_obs - length = ( evalPer( iBasin )%julEnd - evalPer( iBasin )%julStart + 1 ) * TPD_obs + length = (evalPer(iBasin)%julEnd - evalPer(iBasin)%julStart + 1) * TPD_obs ! extract measurements - if ( allocated( runoff_obs ) ) deallocate( runoff_obs ) - allocate( runoff_obs( length ) ) - runoff_obs = gauge%Q( 1 : length, gaugeId ) + if (allocated(runoff_obs)) deallocate(runoff_obs) + allocate(runoff_obs(length)) + runoff_obs = gauge%Q(1 : length, gaugeId) ! create mask of observed runoff - if ( allocated( runoff_obs_mask ) ) deallocate( runoff_obs_mask ) - allocate( runoff_obs_mask( length ) ) + if (allocated(runoff_obs_mask)) deallocate(runoff_obs_mask) + allocate(runoff_obs_mask(length)) runoff_obs_mask = .false. - forall(tt=1:length) runoff_obs_mask(tt) = ge( runoff_obs(tt), 0.0_dp) + forall(tt = 1 : length) runoff_obs_mask(tt) = ge(runoff_obs(tt), 0.0_dp) ! extract and aggregate simulated runoff - if ( allocated( runoff_agg ) ) deallocate( runoff_agg ) - allocate( runoff_agg( length ) ) + if (allocated(runoff_agg)) deallocate(runoff_agg) + allocate(runoff_agg(length)) ! remove warming days - length = ( evalPer( iBasin )%julEnd - evalPer( iBasin )%julStart + 1 ) * TPD_sim - allocate( dummy( length ) ) - dummy = runoff( warmingDays_mrm(iBasin)*TPD_sim + 1:warmingDays_mrm(iBasin)*TPD_sim + length, gaugeId ) + length = (evalPer(iBasin)%julEnd - evalPer(iBasin)%julStart + 1) * TPD_sim + allocate(dummy(length)) + dummy = runoff(warmingDays(iBasin) * TPD_sim + 1 : warmingDays(iBasin) * TPD_sim + length, gaugeId) ! aggregate runoff - length = ( evalPer( iBasin )%julEnd - evalPer( iBasin )%julStart + 1 ) * TPD_obs - forall(tt=1:length) runoff_agg(tt) = sum( dummy( (tt-1)*factor+1: tt*factor ) ) / & - real(factor,dp) + length = (evalPer(iBasin)%julEnd - evalPer(iBasin)%julStart + 1) * TPD_obs + forall(tt = 1 : length) runoff_agg(tt) = sum(dummy((tt - 1) * factor + 1 : tt * factor)) / & + real(factor, dp) ! clean up - deallocate( dummy ) + deallocate(dummy) end subroutine extract_runoff - ! ================================================================== - ! PRIVATE ROUTINES ================================================= - ! ================================================================== - - ! ------------------------------------------------------------------ - - ! NAME - ! eval - - !> \brief returns mHM_eval or mRM_eval given preprocessor flag - - !> \details call mHM_eval if MRM2MHM preprocessor flag is used while - !> compilation or mRM_eval otherwise - - ! INTENT(IN) - !> \param[in] "integer(i4) :: parameterset" - mHM or mRM parameter set - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - !> \param[out] "real(dp), optional :: runoff(:)" - simulated runoff - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! see use in this module above - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober - !> \date Oct 2015 - - ! ------------------------------------------------------------------ - subroutine eval(parameterset, runoff, basin_avg_tws) - -#ifdef MRM2MHM - use mo_mhm_eval, only: mHM_eval -#else - use mo_mrm_eval, only: mRM_eval - use mo_message, only: message -#endif - - implicit none - - ! input variables - real(dp), intent(in) :: parameterset(:) - - ! output variables - real(dp), allocatable, optional, intent(out) :: runoff(:,:) - real(dp), allocatable, optional, intent(out) :: basin_avg_tws(:,:) - -#ifdef MRM2MHM - call mHM_eval(parameterset, runoff=runoff, basin_avg_tws=basin_avg_tws) -#else - call mRM_eval(parameterset, runoff=runoff) -#endif - - end subroutine eval END MODULE mo_mrm_objective_function_runoff diff --git a/src/mRM/mo_mrm_read_config.f90 b/src/mRM/mo_mrm_read_config.f90 index 434b5c61..eb780652 100644 --- a/src/mRM/mo_mrm_read_config.f90 +++ b/src/mRM/mo_mrm_read_config.f90 @@ -9,101 +9,14 @@ !> \date Aug 2015 module mo_mrm_read_config - - use mo_kind, only : i4, dp - - implicit none - - public :: read_mrm_config_coupling - public :: read_mrm_config - -contains - - ! ------------------------------------------------------------------ - - ! NAME - ! read_mrm_config_coupling - - ! PURPOSE - !> \brief Read the coupling mode of mRM - ! - !> \details Read the variable mrm_coupling_mode from coupling_config namelist - !> There are three options: - !> mrm_coupling_mode = 0 - Stand-alone version - !> = 1 - Coupled to a Hydrologic or land-surface model - !> = 2 - Coupled to mHM - !> - !> The difference between the second and third option is the read of the configuration. - !> The second option reads the configuration from mrm.nml and parameters from mrm_parameters.nml. - !> The third option takes the configuration from mhm.nml and parameters from mhm_parameters.nml. - ! - ! INTENT(IN) - ! None - ! - ! INTENT(INOUT) - ! None - ! INTENT(OUT) - ! None - ! - ! INTENT(IN), OPTIONAL - ! None - ! - ! INTENT(INOUT), OPTIONAL - ! None - ! - ! INTENT(OUT), OPTIONAL - ! None - ! - ! RETURN - ! None - ! - ! RESTRICTIONS - !> \note No mrm_coupling_mode greater than 2 can be given. - ! - ! EXAMPLE - ! None - ! - ! LITERATURE - ! None + use mo_kind, only : i4, dp - ! HISTORY - !> \author Stephan Thober - !> \date Aug 2015 - ! Modified, + implicit none - subroutine read_mrm_config_coupling() - - use mo_mrm_file, only: file_namelist_mrm, unamelist_mrm - use mo_mrm_global_variables, only: mrm_coupling_mode - use mo_message, only: message - use mo_nml, only: open_nml, position_nml, close_nml - - implicit none - namelist /coupling_config/ mrm_coupling_mode - call open_nml(file_namelist_mrm, unamelist_mrm, quiet=.true.) - call position_nml('coupling_config', unamelist_mrm) - read(unamelist_mrm, nml=coupling_config) - call close_nml(unamelist_mrm) - ! check whether coupling mode is specified correctly - if (mrm_coupling_mode .eq. 2) then -#ifndef MRM2MHM - call message('***ERROR: coupling mode equals 2, but MRM2MHM preprocessor flag is not set while compiling') - stop -#endif - end if - if (mrm_coupling_mode .eq. 0) then -#ifdef MRM2MHM - call message('***ERROR: coupling mode equals 0, but MRM2MHM preprocessor flag is set while compiling') - stop -#endif - end if - if (mrm_coupling_mode .gt. 2) then - call message('***ERROR: coupling mode greater than two is not yet provided') - stop - end if - end subroutine read_mrm_config_coupling + public :: mrm_read_config +contains ! ------------------------------------------------------------------ ! NAME @@ -153,175 +66,79 @@ end subroutine read_mrm_config_coupling ! Sep 2015, Stephan Thober - removed stop condition when routing resolution is smaller than hydrologic resolution ! Oct 2015, Stephan Thober - added NLoutputResults namelist, fileLatLon to directories_general namelist, ! and readLatLon flag - subroutine read_mrm_config(do_message, readLatLon) - use mo_common_variables, only: & - processMatrix, & - nProcesses, & - optimize, & ! if mhm runs in optimization mode or not - optimize_restart, & ! Optimization will be restarted from - ! ! mo_.restart file (.true.) - opti_method, & ! optimization algorithm used - opti_function, & ! objective function to be optimized - nIterations, & ! number of iterations in optimization - seed, & ! seed used for optimization - dds_r, & ! DDS: perturbation rate - sa_temp, & ! SA: initial temperature - sce_ngs, sce_npg, sce_nps, & ! SCE: # complexes, # points per complex, - ! ! # points per subcomplex - mcmc_opti, & ! MCMC: if optimization mode of MCMC or only uncertainty estimation - mcmc_error_params, & ! parameters of error model used in likelihood - global_parameters, & - ALMA_convention - use mo_julian, only: julday, caldat - use mo_message, only: message - use mo_mrm_constants, only: nodata_i4, & - maxNoGauges, & ! maximum number of allowed gauges - maxNLcovers, & ! maximum number of allowed LCover scenes - maxNoBasins ! maximum number of allowed basins - use mo_mrm_file, only: & - file_namelist_mrm, & - unamelist_mrm, file_namelist_param_mrm, & - file_defOutput, udefOutput - use mo_mrm_global_variables, only : & - mrm_coupling_mode, & - nTstepDay, & ! # of time steps per day - timestep, & ! timestep of routing [h] - iFlag_cordinate_sys, & ! model run cordinate system - nGaugesTotal, gauge, & ! number of evaluation gauges and gauge informations - nInflowGaugesTotal, InflowGauge, & ! number of inflow gauges and gauge informations - dirCommonFiles, & ! directory where common input files should be located for all modeled basins - dirConfigOut, & - dirMorpho, & ! Directory where morphological files are located - dirLCover, & ! Directory where land cover files are located - dirGauges, & ! Directory where discharge files are located - dirTotalRunoff, & ! Directory where simulated runoff files are located - dirOut, & ! Directory where output is written to - dirRestartOut, & ! Directory where output of restart is written - dirRestartIn, & ! Directory where input of restart is read from - fileLatLon, & ! directories where LatLon file is located - is_start, & ! flag for first timestep - resolutionRouting, & ! resolution of routing - resolutionHydrology, & ! resolution of Hydrology - L0_Basin, & ! L0_Basin ID - read_restart, & ! flag reading restart - write_restart, & ! flag writing restart - perform_mpr, & ! switch for performing mpr - nBasins, & ! number of basins - simPer, & - evalPer, & - warmingdays_mrm, & - warmPer, & - timestep_model_inputs, & - fracSealed_cityArea, nLcoverScene, & ! land cover information - LCYearId, & - LCfilename, & - basin_mrm, & - timeStep_model_outputs_mrm, & ! timestep for writing model outputs - outputFlxState_mrm, & ! definition which output to write - filenameTotalRunoff, & ! filename for total runoff file - varnameTotalRunoff, & ! varname for total runoff - period, & ! structure for time periods - project_details, & ! project including funding instituion., PI, etc. - setup_description, & ! any specific description of simulation - simulation_type, & ! e.g. seasonal forecast, climate projection, ... - Conventions, & ! convention used for dataset - contact, & ! contact details, incl. PI name, modellers - mHM_details, & ! developing institution, version, specific mHM revision - history ! details on version/creation date - - use mo_nml, only: open_nml, position_nml, close_nml - use mo_string_utils, only: num2str - + subroutine mrm_read_config(file_namelist, unamelist, file_namelist_param, unamelist_param, do_message, readLatLon) + use mo_common_variables, only : & + nBasins, & ! number of basins + ALMA_convention, & + processMatrix + use mo_message, only : message + use mo_common_constants, only : & + nodata_i4, & ! nodata values + maxNoBasins ! maximum number of allowed basins + use mo_common_mHM_mRM_read_config, only : common_check_resolution + use mo_mrm_constants, only : maxNoGauges ! maximum number of allowed gauges + use mo_mrm_file, only : & + file_defOutput, udefOutput + use mo_mrm_global_variables, only : & + outputFlxState_mrm, & ! definition which output to write + timeStep_model_outputs_mrm, & ! timestep for writing model outputs + nGaugesTotal, gauge, & ! number of evaluation gauges and gauge informations + nInflowGaugesTotal, InflowGauge, & ! number of inflow gauges and gauge informations + dirGauges, & ! Directory where discharge files are located + dirTotalRunoff, & ! Directory where simulated runoff files are located + is_start, & ! flag for first timestep + basin_mrm, basinInfo_mRM, & + filenameTotalRunoff, & ! filename for total runoff file + varnameTotalRunoff ! varname for total runoff + + use mo_nml, only : open_nml, position_nml, close_nml + use mo_string_utils, only : num2str implicit none - + + character(*), intent(in) :: file_namelist, file_namelist_param + integer, intent(in) :: unamelist, unamelist_param ! input variables logical, intent(in) :: do_message ! output variables logical, intent(out) :: readLatLon ! ! local variables - integer(i4), dimension(nProcesses) :: processCase ! Choosen process description number - integer(i4), dimension(maxNoBasins) :: NoGauges_basin - integer(i4), dimension(maxNoBasins,maxNoGauges) :: Gauge_id - character(256), dimension(maxNoBasins,maxNoGauges) :: Gauge_filename - integer(i4), dimension(maxNoBasins) :: NoInflowGauges_basin - integer(i4), dimension(maxNoBasins,maxNoGauges) :: InflowGauge_id - character(256), dimension(maxNoBasins,maxNoGauges) :: InflowGauge_filename - logical, dimension(maxNoBasins,maxNoGauges) :: InflowGauge_Headwater - integer(i4) :: iBasin - integer(i4) :: iGauge - integer(i4) :: idx - integer(i4) :: ii - integer(i4) :: n_true_pars - real(dp) :: cellFactorRbyH ! conversion factor L11 to L1 - - ! namelist variables: direcoteries - character(256), dimension(maxNoBasins) :: dir_Morpho - character(256), dimension(maxNoBasins) :: dir_LCover - character(256), dimension(maxNoBasins) :: dir_Gauges - character(256), dimension(maxNoBasins) :: dir_Total_Runoff - character(256), dimension(maxNoBasins) :: dir_Out - character(256), dimension(maxNoBasins) :: dir_RestartOut - character(256), dimension(maxNoBasins) :: dir_RestartIn - character(256), dimension(maxNoBasins) :: file_LatLon - ! namelist variables: mainconfig - real(dp), dimension(maxNoBasins) :: resolution_Routing - real(dp), dimension(maxNoBasins) :: resolution_Hydrology - integer(i4), dimension(maxNoBasins) :: L0Basin - ! namelist variables: LCover - integer(i4) :: nLcover_scene - integer(i4), dimension(maxNLCovers) :: LCoverYearStart ! starting year of LCover - integer(i4), dimension(maxNLCovers) :: LCoverYearEnd ! ending year of LCover - character(256), dimension(maxNLCovers) :: LCoverfName ! filename of Lcover file - ! namelist variables: time_periods - integer(i4) :: jday - integer(i4), dimension(maxNoBasins) :: warming_Days - type(period), dimension(maxNoBasins) :: eval_Per - integer(i4), dimension(maxNoBasins) :: time_step_model_inputs - character(256) :: para_file ! filename of parameter namelist + integer(i4), dimension(maxNoBasins) :: NoGauges_basin + integer(i4), dimension(maxNoBasins, maxNoGauges) :: Gauge_id + character(256), dimension(maxNoBasins, maxNoGauges) :: Gauge_filename + integer(i4), dimension(maxNoBasins) :: NoInflowGauges_basin + integer(i4), dimension(maxNoBasins, maxNoGauges) :: InflowGauge_id + character(256), dimension(maxNoBasins, maxNoGauges) :: InflowGauge_filename + logical, dimension(maxNoBasins, maxNoGauges) :: InflowGauge_Headwater + integer(i4) :: iBasin + integer(i4) :: iGauge + integer(i4) :: idx + + ! namelist variables: directories + character(256), dimension(maxNoBasins) :: dir_Gauges + character(256), dimension(maxNoBasins) :: dir_Total_Runoff ! for output file namelist - logical :: file_exists + logical :: file_exists + type(basinInfo_mRM), pointer :: basin_mrm_iBasin ! namelist spatial & temporal resolution, optmization information - namelist /project_description/ project_details, setup_description, simulation_type, & - Conventions, contact, mHM_details, history - namelist /project_description/ project_details, setup_description, simulation_type, & - Conventions, contact, mHM_details, history - namelist /mainconfig/ timestep, iFlag_cordinate_sys, resolution_Routing, resolution_Hydrology, & - ALMA_convention, L0Basin, optimize, optimize_restart, opti_method, opti_function, nBasins, & - read_restart, write_restart, perform_mpr, filenameTotalRunoff, varnameTotalRunoff - ! namelist for time settings - namelist /time_periods/ warming_Days, eval_Per, time_step_model_inputs - ! namelist process selection - namelist /processSelection/ processCase + namelist /mainconfig_mrm/ ALMA_convention, filenameTotalRunoff, varnameTotalRunoff ! namelist directories namelist /directories_mRM/ dir_Gauges, dir_Total_Runoff - namelist /directories_general/ dirConfigOut, dirCommonFiles, & - dir_Morpho, dir_LCover, & - dir_Out, dir_RestartOut, & - dir_RestartIn, file_LatLon - namelist/LCover/ fracSealed_cityArea, nLcover_scene, LCoverYearStart, LCoverYearEnd, LCoverfName namelist /evaluation_gauges/ nGaugesTotal, NoGauges_basin, Gauge_id, gauge_filename ! namelist for inflow gauges - namelist /inflow_gauges/ nInflowGaugesTotal, NoInflowGauges_basin, InflowGauge_id, & - InflowGauge_filename, InflowGauge_Headwater - ! namelist for optimization settings - namelist/Optimization/ nIterations, seed, & - dds_r, & - sa_temp, & - sce_ngs, sce_npg, sce_nps, & - mcmc_opti, mcmc_error_params - ! namelist defining mRM outputs - namelist/NLoutputResults/timeStep_model_outputs_mrm, outputFlxState_mrm + namelist /inflow_gauges/ nInflowGaugesTotal, NoInflowGauges_basin, InflowGauge_id, & + InflowGauge_filename, InflowGauge_Headwater + ! name list regarding output + namelist /NLoutputResults/timeStep_model_outputs_mrm, outputFlxState_mrm !=============================================================== ! INITIALIZATION !=============================================================== - para_file = file_namelist_param_mrm is_start = .True. - nGaugesTotal = nodata_i4 + nGaugesTotal = nodata_i4 NoGauges_basin = nodata_i4 - Gauge_id = nodata_i4 + Gauge_id = nodata_i4 gauge_filename = num2str(nodata_i4) ! default arguments @@ -332,526 +149,256 @@ subroutine read_mrm_config(do_message, readLatLon) !=============================================================== ! Read namelist main directories !=============================================================== - call open_nml(file_namelist_mrm, unamelist_mrm, quiet=.true.) - - !=============================================================== - ! Read namelist specifying the project description - !=============================================================== - call position_nml('project_description', unamelist_mrm) - read(unamelist_mrm, nml=project_description) - - !=============================================================== - ! Read namelist specifying the model configuration - !=============================================================== - call position_nml('mainconfig', unamelist_mrm) - read(unamelist_mrm, nml=mainconfig) - - if (nBasins .GT. maxNoBasins) then - call message() - call message('***ERROR: Number of basins is resticted to ', trim(num2str(maxNoBasins)),'!') - stop - end if - ! allocate patharray sizes - allocate(resolutionRouting(nBasins)) - allocate(resolutionHydrology(nBasins)) - allocate(L0_Basin(nBasins)) - allocate(dirMorpho(nBasins)) - allocate(dirLCover(nBasins)) - allocate(dirGauges(nBasins)) - allocate(dirTotalRunoff(nBasins)) - allocate(dirOut(nBasins)) - allocate(dirRestartOut(nBasins)) - allocate(dirRestartIn(nBasins)) - allocate(fileLatLon(nBasins)) - resolutionRouting = resolution_Routing(1:nBasins) - resolutionHydrology = resolution_Hydrology(1:nBasins) - L0_Basin = L0Basin(1:nBasins) - - ! - ! check for possible options - if( .NOT. (iFlag_cordinate_sys == 0 .OR. iFlag_cordinate_sys == 1) ) then - call message() - call message('***ERROR: coordinate system for the model run should be 0 or 1') - stop - end if - ! check for perform_mpr - if ( ( .not. read_restart ) .and. ( .not. perform_mpr ) ) then - call message() - call message('***ERROR: cannot omit mpr when read_restart is set to .false.') - stop - end if - - ! allocate time periods - allocate(simPer(nBasins)) - allocate(evalPer(nBasins)) - allocate(warmingdays_mrm(nBasins)) - allocate(warmPer(nBasins)) - allocate(timestep_model_inputs(nBasins)) - - ! set ntstepday - nTstepDay = 24_i4/timeStep ! # of time steps per day - - !=============================================================== - ! Set or read process selection - !=============================================================== -#ifdef MRM2MHM - processCase = 0_i4 - processCase(8) = processMatrix(8, 1) -#else - processCase = 0_i4 - call position_nml('processselection', unamelist_mrm) - read(unamelist_mrm, nml=processSelection) -#endif - - !=============================================================== - ! read simulation time periods incl. warming days - !=============================================================== - call position_nml('time_periods', unamelist_mrm) - read(unamelist_mrm, nml=time_periods) - warmingDays_mrm = warming_Days(1:nBasins) - evalPer = eval_Per(1:nBasins) - timestep_model_inputs = time_step_model_inputs(1:nBasins) - - ! consistency check for timestep_model_inputs - if ( any( timestep_model_inputs .ne. 0 ) .and. & - .not. all( timestep_model_inputs .ne. 0 ) ) then - call message() - call message('***ERROR: timestep_model_inputs either have to be all zero or all non-zero') - stop - end if - ! check for optimzation and timestep_model_inputs options - if ( optimize .and. ( any(timestep_model_inputs .ne. 0) ) ) then - call message() - call message('***ERROR: optimize and chunk read is switched on! (set timestep_model_inputs to zero)') - stop - end if + call open_nml(file_namelist, unamelist, quiet = .true.) !=============================================================== - ! determine simulation time period incl. warming days for each - ! basin + ! Read namelist for mainconfig for mRM !=============================================================== - do ii = 1, nBasins - ! julian days for evaluation period - jday = julday(dd=evalPer(ii)%dStart, mm=evalPer(ii)%mStart, yy=evalPer(ii)%yStart) - evalPer(ii)%julStart = jday - - jday = julday(dd=evalPer(ii)%dEnd, mm=evalPer(ii)%mEnd, yy=evalPer(ii)%yEnd) - evalPer(ii)%julEnd = jday - - ! determine warming period - warmPer(ii)%julStart = evalPer(ii)%julStart - warmingDays_mrm(ii) - warmPer(ii)%julEnd = evalPer(ii)%julStart - 1 - - call caldat(warmPer(ii)%julStart, dd=warmPer(ii)%dStart, mm=warmPer(ii)%mStart, yy=warmPer(ii)%yStart) - call caldat(warmPer(ii)%julEnd, dd=warmPer(ii)%dEnd, mm=warmPer(ii)%mEnd, yy=warmPer(ii)%yEnd) - - ! sumulation Period = warming Period + evaluation Period - simPer(ii)%dStart = warmPer(ii)%dStart - simPer(ii)%mStart = warmPer(ii)%mStart - simPer(ii)%yStart = warmPer(ii)%yStart - simPer(ii)%julStart = warmPer(ii)%julStart - simPer(ii)%dEnd = evalPer(ii)%dEnd - simPer(ii)%mEnd = evalPer(ii)%mEnd - simPer(ii)%yEnd = evalPer(ii)%yEnd - simPer(ii)%julEnd = evalPer(ii)%julEnd - end do + call position_nml('mainconfig_mrm', unamelist) + read(unamelist, nml = mainconfig_mrm) !=============================================================== ! Read namelist for mainpaths !=============================================================== - call position_nml('directories_mRM', unamelist_mrm) - read(unamelist_mrm, nml=directories_mRM) - call position_nml('directories_general', unamelist_mrm) - read(unamelist_mrm, nml=directories_general) - - dirMorpho = dir_Morpho(1:nBasins) - dirLCover = dir_LCover(1:nBasins) - dirGauges = dir_Gauges(1:nBasins) - dirTotalRunoff = dir_Total_Runoff(1:nBasins) - dirOut = dir_Out(1:nBasins) - dirRestartOut = dir_RestartOut(1:nBasins) - dirRestartIn = dir_RestartIn(1:nBasins) - fileLatLon = file_LatLon(1:nBasins) + call position_nml('directories_mRM', unamelist) + read(unamelist, nml = directories_mRM) - !=============================================================== - ! Read land cover information - !=============================================================== - if (processCase(8) .eq. 1) then - call position_nml('LCover', unamelist_mrm) - read(unamelist_mrm, nml=LCover) - end if + dirGauges = dir_Gauges(1 : nBasins) + dirTotalRunoff = dir_Total_Runoff(1 : nBasins) !=============================================================== ! READ EVALUATION GAUGES !=============================================================== - call position_nml('evaluation_gauges', unamelist_mrm) - read(unamelist_mrm, nml=evaluation_gauges) - + call position_nml('evaluation_gauges', unamelist) + read(unamelist, nml = evaluation_gauges) + if (nGaugesTotal .GT. maxNoGauges) then - call message() - call message('***ERROR: mhm.nml: Total number of evaluation gauges is restricted to', num2str(maxNoGauges)) - call message(' Error occured in namlist: evaluation_gauges') - stop + call message() + call message('***ERROR: ', trim(file_namelist), ': Total number of evaluation gauges is restricted to', & + num2str(maxNoGauges)) + call message(' Error occured in namlist: evaluation_gauges') + stop 1 end if - allocate(gauge%gaugeId(nGaugesTotal)) ; gauge%gaugeId = nodata_i4 - allocate(gauge%basinId(nGaugesTotal)) ; gauge%basinId = nodata_i4 + allocate(gauge%gaugeId(nGaugesTotal)) ; gauge%gaugeId = nodata_i4 + allocate(gauge%basinId(nGaugesTotal)) ; gauge%basinId = nodata_i4 allocate(gauge%fName (nGaugesTotal)) ; gauge%fName(1) = num2str(nodata_i4) - allocate(basin_mrm%nGauges (nBasins )) ; basin_mrm%nGauges = nodata_i4 - allocate(basin_mrm%gaugeIdList (nBasins, maxval(NoGauges_basin(:)))) ; basin_mrm%gaugeIdList = nodata_i4 - allocate(basin_mrm%gaugeIndexList (nBasins, maxval(NoGauges_basin(:)))) ; basin_mrm%gaugeIndexList = nodata_i4 - allocate(basin_mrm%gaugeNodeList (nBasins, maxval(NoGauges_basin(:)))) ; basin_mrm%gaugeNodeList = nodata_i4 + allocate(basin_mrm(nBasins)) idx = 0 do iBasin = 1, nBasins - ! check if NoGauges_basin has a valid value - if ( NoGauges_basin(iBasin) .EQ. nodata_i4 ) then + basin_mrm_iBasin => basin_mrm(iBasin) + ! initialize + basin_mrm_iBasin%nGauges = nodata_i4 + allocate(basin_mrm_iBasin%gaugeIdList(maxval(NoGauges_basin(:)))) + basin_mrm_iBasin%gaugeIdList = nodata_i4 + allocate(basin_mrm_iBasin%gaugeIndexList(maxval(NoGauges_basin(:)))) + basin_mrm_iBasin%gaugeIndexList = nodata_i4 + allocate(basin_mrm_iBasin%gaugeNodeList(maxval(NoGauges_basin(:)))) + basin_mrm_iBasin%gaugeNodeList = nodata_i4 + ! check if NoGauges_basin has a valid value + if (NoGauges_basin(iBasin) .EQ. nodata_i4) then + call message() + call message('***ERROR: ', trim(file_namelist), ': Number of evaluation gauges for subbasin ', & + trim(adjustl(num2str(iBasin))), ' is not defined!') + call message(' Error occured in namelist: evaluation_gauges') + stop 1 + end if + + basin_mrm_iBasin%nGauges = NoGauges_basin(iBasin) + + do iGauge = 1, NoGauges_basin(iBasin) + ! check if NoGauges_basin has a valid value + if (Gauge_id(iBasin, iGauge) .EQ. nodata_i4) then call message() - call message('***ERROR: mhm.nml: Number of evaluation gauges for subbasin ', & - trim(adjustl(num2str(iBasin))),' is not defined!') + call message('***ERROR: ', trim(file_namelist), ': ID ', & + trim(adjustl(num2str(Gauge_id(iBasin, iGauge)))), ' of evaluation gauge ', & + trim(adjustl(num2str(iGauge))), ' for subbasin ', & + trim(adjustl(num2str(iBasin))), ' is not defined!') call message(' Error occured in namelist: evaluation_gauges') - stop - end if - - basin_mrm%nGauges(iBasin) = NoGauges_basin(iBasin) - - do iGauge = 1, NoGauges_basin(iBasin) - ! check if NoGauges_basin has a valid value - if (Gauge_id(iBasin,iGauge) .EQ. nodata_i4) then - call message() - call message('***ERROR: mhm.nml: ID ', & - trim(adjustl(num2str(Gauge_id(iBasin,iGauge)))), ' of evaluation gauge ', & - trim(adjustl(num2str(iGauge))),' for subbasin ', & - trim(adjustl(num2str(iBasin))),' is not defined!') - call message(' Error occured in namelist: evaluation_gauges') - stop - else if (trim(gauge_filename(iBasin,iGauge)) .EQ. trim(num2str(nodata_i4))) then - call message() - call message('***ERROR: mhm.nml: Filename of evaluation gauge ', & - trim(adjustl(num2str(iGauge))),' for subbasin ', & - trim(adjustl(num2str(iBasin))),' is not defined!') - call message(' Error occured in namelist: evaluation_gauges') - stop - end if - ! - idx = idx + 1 - gauge%basinId(idx) = iBasin - gauge%gaugeId(idx) = Gauge_id(iBasin,iGauge) - gauge%fname(idx) = trim(dirGauges(iBasin)) // trim(gauge_filename(iBasin,iGauge)) - basin_mrm%gaugeIdList(iBasin,iGauge) = Gauge_id(iBasin,iGauge) - basin_mrm%gaugeIndexList(iBasin,iGauge) = idx - end do + stop 1 + else if (trim(gauge_filename(iBasin, iGauge)) .EQ. trim(num2str(nodata_i4))) then + call message() + call message('***ERROR: ', trim(file_namelist), ': Filename of evaluation gauge ', & + trim(adjustl(num2str(iGauge))), ' for subbasin ', & + trim(adjustl(num2str(iBasin))), ' is not defined!') + call message(' Error occured in namelist: evaluation_gauges') + stop 1 + end if + ! + idx = idx + 1 + gauge%basinId(idx) = iBasin + gauge%gaugeId(idx) = Gauge_id(iBasin, iGauge) + gauge%fname(idx) = trim(dirGauges(iBasin)) // trim(gauge_filename(iBasin, iGauge)) + basin_mrm_iBasin%gaugeIdList(iGauge) = Gauge_id(iBasin, iGauge) + basin_mrm_iBasin%gaugeIndexList(iGauge) = idx + end do end do - if ( nGaugesTotal .NE. idx) then - call message() - call message('***ERROR: mhm.nml: Total number of evaluation gauges (', trim(adjustl(num2str(nGaugesTotal))), & - ') different from sum of gauges in subbasins (', trim(adjustl(num2str(idx))), ')!') - call message(' Error occured in namelist: evaluation_gauges') - stop + if (nGaugesTotal .NE. idx) then + call message() + call message('***ERROR: ', trim(file_namelist), ': Total number of evaluation gauges (', & + trim(adjustl(num2str(nGaugesTotal))), & + ') different from sum of gauges in subbasins (', trim(adjustl(num2str(idx))), ')!') + call message(' Error occured in namelist: evaluation_gauges') + stop end if - + !=============================================================== ! Read inflow gauge information !=============================================================== - - nInflowGaugesTotal = 0 + + nInflowGaugesTotal = 0 NoInflowGauges_basin = 0 - InflowGauge_id = nodata_i4 + InflowGauge_id = nodata_i4 InflowGauge_filename = num2str(nodata_i4) - call position_nml('inflow_gauges', unamelist_mrm) - read(unamelist_mrm, nml=inflow_gauges) + call position_nml('inflow_gauges', unamelist) + read(unamelist, nml = inflow_gauges) if (nInflowGaugesTotal .GT. maxNoGauges) then - call message() - call message('***ERROR: mhm.nml:read_gauge_lut: Total number of inflow gauges is restricted to', num2str(maxNoGauges)) - call message(' Error occured in namlist: inflow_gauges') - stop + call message() + call message('***ERROR: ', trim(file_namelist), & + ':read_gauge_lut: Total number of inflow gauges is restricted to', num2str(maxNoGauges)) + call message(' Error occured in namlist: inflow_gauges') + stop end if - ! allocation - max() to avoid allocation with zero, needed for mhm call - allocate(InflowGauge%gaugeId (max(1,nInflowGaugesTotal))) - allocate(InflowGauge%basinId (max(1,nInflowGaugesTotal))) - allocate(InflowGauge%fName (max(1,nInflowGaugesTotal))) - allocate(basin_mrm%nInflowGauges (nBasins )) - allocate(basin_mrm%InflowGaugeIdList (nBasins, max(1, maxval(NoInflowGauges_basin(:))))) - allocate(basin_mrm%InflowGaugeHeadwater (nBasins, max(1, maxval(NoInflowGauges_basin(:))))) - allocate(basin_mrm%InflowGaugeIndexList (nBasins, max(1, maxval(NoInflowGauges_basin(:))))) - allocate(basin_mrm%InflowGaugeNodeList (nBasins, max(1, maxval(NoInflowGauges_basin(:))))) + allocate(InflowGauge%gaugeId (max(1, nInflowGaugesTotal))) + allocate(InflowGauge%basinId (max(1, nInflowGaugesTotal))) + allocate(InflowGauge%fName (max(1, nInflowGaugesTotal))) ! dummy initialization InflowGauge%gaugeId = nodata_i4 InflowGauge%basinId = nodata_i4 - InflowGauge%fName = num2str(nodata_i4) - basin_mrm%nInflowGauges = 0 - basin_mrm%InflowGaugeIdList = nodata_i4 - basin_mrm%InflowGaugeHeadwater = .FALSE. - basin_mrm%InflowGaugeIndexList = nodata_i4 - basin_mrm%InflowGaugeNodeList = nodata_i4 + InflowGauge%fName = num2str(nodata_i4) idx = 0 do iBasin = 1, nBasins - - ! no inflow gauge for subbasin i - if (NoInflowGauges_basin(iBasin) .EQ. nodata_i4) then - NoInflowGauges_basin(iBasin) = 0 - end if - - basin_mrm%nInflowGauges(iBasin) = NoInflowGauges_basin(iBasin) - - do iGauge = 1, NoInflowGauges_basin(iBasin) - ! check if NoInflowGauges_basin has a valid value - if (InflowGauge_id(iBasin,iGauge) .EQ. nodata_i4) then - call message() - call message('***ERROR: mhm.nml:ID of inflow gauge ', & - trim(adjustl(num2str(iGauge))),' for subbasin ', & - trim(adjustl(num2str(iBasin))),' is not defined!') - call message(' Error occured in namlist: inflow_gauges') - stop - else if (trim(InflowGauge_filename(iBasin,iGauge)) .EQ. trim(num2str(nodata_i4))) then - call message() - call message('***ERROR: mhm.nml:Filename of inflow gauge ', & - trim(adjustl(num2str(iGauge))),' for subbasin ', & - trim(adjustl(num2str(iBasin))),' is not defined!') - call message(' Error occured in namlist: inflow_gauges') - stop - end if - ! - idx = idx + 1 - InflowGauge%basinId(idx) = iBasin - InflowGauge%gaugeId(idx) = InflowGauge_id(iBasin,iGauge) - InflowGauge%fname(idx) = trim(dirGauges(iBasin)) // trim(InflowGauge_filename(iBasin,iGauge)) - basin_mrm%InflowGaugeIdList(iBasin,iGauge) = InflowGauge_id(iBasin,iGauge) - basin_mrm%InflowGaugeHeadwater(iBasin,iGauge) = InflowGauge_Headwater(iBasin,iGauge) - basin_mrm%InflowGaugeIndexList(iBasin,iGauge) = idx - end do - end do - - if ( nInflowGaugesTotal .NE. idx) then - call message() - call message('***ERROR: mhm.nml: Total number of inflow gauges (', trim(adjustl(num2str(nInflowGaugesTotal))), & - ') different from sum of inflow gauges in subbasins (', trim(adjustl(num2str(idx))), ')!') - call message(' Error occured in namlist: inflow_gauges') - stop - end if - - !=============================================================== - ! determine land cover periods - !=============================================================== - if (processCase(8) .eq. 1) then - ! countercheck if land cover covers simulation period - if (LCoverYearStart(1) .GT. minval(evalPer(1:nBasins)%yStart) ) then + basin_mrm_iBasin => basin_mrm(iBasin) + + allocate(basin_mrm_iBasin%InflowGaugeIdList (max(1, maxval(NoInflowGauges_basin(:))))) + allocate(basin_mrm_iBasin%InflowGaugeHeadwater (max(1, maxval(NoInflowGauges_basin(:))))) + allocate(basin_mrm_iBasin%InflowGaugeIndexList (max(1, maxval(NoInflowGauges_basin(:))))) + allocate(basin_mrm_iBasin%InflowGaugeNodeList (max(1, maxval(NoInflowGauges_basin(:))))) + ! dummy initialization + basin_mrm_iBasin%nInflowGauges = 0 + basin_mrm_iBasin%InflowGaugeIdList = nodata_i4 + basin_mrm_iBasin%InflowGaugeHeadwater = .FALSE. + basin_mrm_iBasin%InflowGaugeIndexList = nodata_i4 + basin_mrm_iBasin%InflowGaugeNodeList = nodata_i4 + ! no inflow gauge for subbasin i + if (NoInflowGauges_basin(iBasin) .EQ. nodata_i4) then + NoInflowGauges_basin(iBasin) = 0 + end if + + basin_mrm_iBasin%nInflowGauges = NoInflowGauges_basin(iBasin) + + do iGauge = 1, NoInflowGauges_basin(iBasin) + ! check if NoInflowGauges_basin has a valid value + if (InflowGauge_id(iBasin, iGauge) .EQ. nodata_i4) then call message() - call message('***ERROR: Land cover for warming period is missing!') - call message(' FILE: mhm.nml, namelist: LCover') - call message(' SimStart : ', trim(num2str(minval(evalPer(1:nBasins)%yStart)))) - call message(' LCoverStart: ', trim(num2str(LCoverYearStart(1)))) + call message('***ERROR: ', trim(file_namelist), ':ID of inflow gauge ', & + trim(adjustl(num2str(iGauge))), ' for subbasin ', & + trim(adjustl(num2str(iBasin))), ' is not defined!') + call message(' Error occured in namlist: inflow_gauges') stop - end if - if (LCoverYearEnd(nLcover_scene) .LT. maxval(evalPer(1:nBasins)%yEnd) ) then + else if (trim(InflowGauge_filename(iBasin, iGauge)) .EQ. trim(num2str(nodata_i4))) then call message() - call message('***ERROR: Land cover period shorter than modelling period!') - call message(' FILE: mhm.nml, namelist: LCover') - call message(' SimEnd : ', trim(num2str(maxval(evalPer(1:nBasins)%yEnd)))) - call message(' LCoverEnd: ', trim(num2str(LCoverYearEnd(nLcover_scene)))) + call message('***ERROR: ', trim(file_namelist), ':Filename of inflow gauge ', & + trim(adjustl(num2str(iGauge))), ' for subbasin ', & + trim(adjustl(num2str(iBasin))), ' is not defined!') + call message(' Error occured in namlist: inflow_gauges') stop - end if - ! - allocate(LCYearId(minval(simPer(1:nBasins)%yStart):maxval(simPer(1:nBasins)%yEnd),nBasins)) - LCYearId = nodata_i4 - do iBasin = 1, nBasins - do ii = 1, nLcover_scene - ! land cover before model period ! land cover after model period - if ((LCoverYearEnd(ii) .LT. evalPer(iBasin)%yStart) .OR. & - (LCoverYearStart(ii) .GT. evalPer(iBasin)%yEnd)) then - cycle - else if ((LCoverYearStart(ii) .LE. evalPer(iBasin)%yStart) .AND. & - (LCoverYearEnd(ii) .GE. evalPer(iBasin)%yEnd)) then - LCyearId(simPer(iBasin)%yStart:simPer(iBasin)%yEnd, iBasin) = ii - exit - else if ((LCoverYearStart(ii) .LE. evalPer(iBasin)%yStart) .AND. & - (LCoverYearEnd(ii) .LT. evalPer(iBasin)%yEnd)) then - LCyearId(simPer(iBasin)%yStart:LCoverYearEnd(ii), iBasin) = ii - else if ((LCoverYearStart(ii) .GT. evalPer(iBasin)%yStart) .AND. & - (LCoverYearEnd(ii) .GE. evalPer(iBasin)%yEnd)) then - LCyearId(LCoverYearStart(ii):simPer(iBasin)%yEnd, iBasin) = ii - else - LCyearId(LCoverYearStart(ii):LCoverYearEnd(ii), iBasin) = ii - end if - end do - end do - ! - ! correct number of input land cover scenes to number of needed scenes - nLCoverScene = maxval(LCyearId, mask = (LCyearId .gt. nodata_i4) ) - & - minval(LCyearId, mask = (LCyearId .gt. nodata_i4) ) + 1 - ! put land cover scenes to corresponding file name and LuT - allocate(LCfilename(nLCoverScene)) - LCfilename(:) = LCoverfName( minval(LCyearId, mask = ( LCyearId .gt. nodata_i4 ) ) : & - maxval(LCyearId)) - ! update the ID's - ! use next line because of Intel11 bug: LCyearId = LCyearId - minval(LCyearId) + 1 - LCyearId(:,:) = LCyearId(:,:) - minval(LCyearId, mask = ( LCyearId .gt. nodata_i4 ) ) + 1 - ! - if ( maxval( simPer(1:nBasins)%julStart ) .eq. minval( simPer(1:nBasins)%julStart) .and. & - maxval( simPer(1:nBasins)%julEnd ) .eq. minval( simPer(1:nBasins)%julEnd ) ) then - if (any(LCyearId .EQ. nodata_i4)) then - call message() - call message('***ERROR: Intermidiate land cover period is missing!') - call message(' FILE: mhm.nml, namelist: LCover') - stop - end if - else - if (do_message) then - call message() - call message('***WARNING: No check on missing land cover period is performed!') - end if - end if - end if - - !=============================================================== - ! check matching of resolutions: hydrology, forcing and routing - !=============================================================== - do ii = 1, nBasins - cellFactorRbyH = resolutionRouting(ii) / resolutionHydrology(ii) - if (do_message) then - call message() - call message('Basin ', trim(adjustl(num2str(ii))), ': ') - call message('resolution Hydrology (basin ', trim(adjustl(num2str(ii))), ') = ', & - trim(adjustl(num2str(resolutionHydrology(ii))))) - call message('resolution Routing (basin ', trim(adjustl(num2str(ii))), ') = ', & - trim(adjustl(num2str(resolutionRouting(ii))))) - end if - ! - if( nint(cellFactorRbyH * 100.0_dp) .eq. 100) then - if (do_message) then - call message() - call message('Resolution of routing and hydrological modeling are equal!') - end if - - else if ( nint(cellFactorRbyH * 100.0_dp) .gt. 100) then - if( nint(mod(cellFactorRbyH, 2.0_dp) * 100.0_dp) .ne. 0) then - call message() - call message('***ERROR: Resolution of routing is not a multiple of hydrological model resolution!') - call message(' FILE: mhm.nml, namelist: mainconfig, variable: resolutionRouting') - STOP - end if - ! - if (do_message) then - call message() - call message('Resolution of routing is bigger than hydrological model resolution by ', & - trim(adjustl(num2str(nint(cellFactorRbyH)))), ' times !') - end if - end if - ! + end if + ! + idx = idx + 1 + InflowGauge%basinId(idx) = iBasin + InflowGauge%gaugeId(idx) = InflowGauge_id(iBasin, iGauge) + InflowGauge%fname(idx) = trim(dirGauges(iBasin)) // trim(InflowGauge_filename(iBasin, iGauge)) + basin_mrm_iBasin%InflowGaugeIdList(iGauge) = InflowGauge_id(iBasin, iGauge) + basin_mrm_iBasin%InflowGaugeHeadwater(iGauge) = InflowGauge_Headwater(iBasin, iGauge) + basin_mrm_iBasin%InflowGaugeIndexList(iGauge) = idx + end do end do - call close_nml(unamelist_mrm) + if (nInflowGaugesTotal .NE. idx) then + call message() + call message('***ERROR: ', trim(file_namelist), ': Total number of inflow gauges (', & + trim(adjustl(num2str(nInflowGaugesTotal))), & + ') different from sum of inflow gauges in subbasins (', trim(adjustl(num2str(idx))), ')!') + call message(' Error occured in namlist: inflow_gauges') + stop + end if + + call common_check_resolution(do_message, .true.) + + call close_nml(unamelist) !=============================================================== ! Read namelist global parameters !=============================================================== - call read_mrm_routing_params(processCase(8), para_file) - - !=============================================================== - ! Settings for Optimization - !=============================================================== - if (mrm_coupling_mode .ne. 2) then - ! if mRM is coupled to mHM; the latter already read the optimization - call open_nml(file_namelist_mrm, unamelist_mrm, quiet=.true.) - ! namelist for Optimization settings - call position_nml('Optimization', unamelist_mrm) - read(unamelist_mrm, nml=Optimization) - call close_nml(unamelist_mrm) - end if - - ! check and set default values - if (nIterations .le. 0_i4) then - call message('Number of iterations for Optimization (nIterations) must be greater than zero') - stop - end if - if (dds_r .lt. 0.0_dp .or. dds_r .gt. 1.0_dp) then - call message('dds_r must be between 0.0 and 1.0') - stop - end if - if (sce_ngs .lt. 1_i4) then - call message ('number of complexes in SCE (sce_ngs) must be at least 1') - stop - end if - ! number of points in each complex: default = 2n+1 - if (sce_npg .lt. 0_i4) then - n_true_pars = count(nint(global_parameters(:,4)) .eq. 1) - sce_npg = 2 * n_true_pars + 1_i4 - end if - ! number of points in each sub-complex: default = n+1 - if (sce_nps .lt. 0_i4) then - n_true_pars = count(nint(global_parameters(:,4)) .eq. 1) - sce_nps = n_true_pars + 1_i4 - end if - if (sce_npg .lt. sce_nps) then - call message ('number of points per complex (sce_npg) must be greater or') - call message ('equal number of points per sub-complex (sce_nps)') - stop - end if + call read_mrm_routing_params(processMatrix(8, 1), file_namelist_param, unamelist_param) !=============================================================== ! Read Output specifications for mRM !=============================================================== outputFlxState_mrm = .FALSE. timeStep_model_outputs_mrm = -2 - inquire(file=file_defOutput, exist=file_exists) + inquire(file = file_defOutput, exist = file_exists) if (file_exists) then - ! file exists - call open_nml(file_defOutput, udefOutput, quiet=.true.) - call position_nml('NLoutputResults', udefOutput) - read(udefOutput, nml=NLoutputResults) - call close_nml(udefOutput) + ! file exists + call open_nml(file_defOutput, udefOutput, quiet = .true.) + call position_nml('NLoutputResults', udefOutput) + read(udefOutput, nml = NLoutputResults) + call close_nml(udefOutput) else - call message('') - call message('No file specifying mRM output fluxes exists') + call message('') + call message('No file specifying mRM output fluxes exists') end if readLatLon = any(outputFlxState_mrm) if (any(outputFlxState_mrm)) then - call message( '' ) - call message( ' Following output will be written:' ) + call message('') + call message(' Following output will be written:') - call message( ' FLUXES:' ) - if (outputFlxState_mrm(1)) then - call message( ' routed streamflow (L11_qMod) [mm]') - end if + call message(' FLUXES:') + if (outputFlxState_mrm(1)) then + call message(' routed streamflow (L11_qMod) [mm]') + end if end if - call message( '' ) - call message( ' FINISHED reading config' ) - call message( '' ) + call message('') + call message(' FINISHED reading config') + call message('') + + end subroutine mrm_read_config - end subroutine read_mrm_config - ! --------------------------------------------------------------------------- ! SUBROUTINE READ_MRM_ROUTING_PARAMS ! --------------------------------------------------------------------------- - subroutine read_mrm_routing_params(processCase, file_namelist) - use mo_mrm_file, only: unamelist_param ! file containing parameter values - use mo_nml, only: open_nml, position_nml, close_nml - use mo_message, only: message - use mo_mrm_constants, only: nColPars ! number of properties of the global variables - use mo_common_variables, only: & - processMatrix, & - global_parameters, & ! global parameters - global_parameters_name ! clear names of global parameters - use mo_append, only: append + subroutine read_mrm_routing_params(processCase, file_namelist_param, unamelist_param) + use mo_nml, only : open_nml, position_nml, close_nml + use mo_message, only : message + use mo_common_constants, only : nColPars ! number of properties of the global variables + use mo_common_variables, only : & + processMatrix, & + global_parameters, & ! global parameters + global_parameters_name ! clear names of global parameters + use mo_common_functions, only : in_bound +#ifndef MRM2MHM + use mo_append, only : append +#endif implicit none ! input variables integer(i4), intent(in) :: processCase ! it is the default case, should be one - character(256), intent(in) :: file_namelist ! file name containing parameter namelist + character(*), intent(in) :: file_namelist_param ! file name containing parameter namelist + integer(i4), intent(in) :: unamelist_param ! file name id containing parameter namelist ! local variables -#ifdef MRM2MHM +#ifdef MRM2MHM integer(i4) :: start_index ! equals sum of previous parameters -#else - integer(i4) :: dummy ! dummy variable to always use processCase -#endif +#endif real(dp), dimension(nColPars) :: muskingumTravelTime_constant real(dp), dimension(nColPars) :: muskingumTravelTime_riverLength real(dp), dimension(nColPars) :: muskingumTravelTime_riverSlope @@ -860,112 +407,93 @@ subroutine read_mrm_routing_params(processCase, file_namelist) real(dp), dimension(nColPars) :: streamflow_celerity namelist /routing1/ muskingumTravelTime_constant, muskingumTravelTime_riverLength, & - muskingumTravelTime_riverSlope, muskingumTravelTime_impervious, muskingumAttenuation_riverSlope + muskingumTravelTime_riverSlope, muskingumTravelTime_impervious, muskingumAttenuation_riverSlope namelist /routing2/ streamflow_celerity ! - call open_nml(file_namelist, unamelist_param, quiet=.true.) + call open_nml(file_namelist_param, unamelist_param, quiet = .true.) if (processCase .eq. 1_i4) then - call position_nml('routing1', unamelist_param) - read(unamelist_param, nml=routing1) + call position_nml('routing1', unamelist_param) + read(unamelist_param, nml = routing1) else if (processCase .eq. 2_i4) then - call position_nml('routing2', unamelist_param) - read(unamelist_param, nml=routing2) + call position_nml('routing2', unamelist_param) + read(unamelist_param, nml = routing2) end if - + #ifdef MRM2MHM ! ------------------------------------------------------------------------- ! INCLUDE MRM PARAMETERS IN PARAMETERS OF MHM ! ------------------------------------------------------------------------- ! Muskingum routing parameters with MPR if (processCase .eq. 1_i4) then - ! insert parameter values and names at position required by mhm - processMatrix(8, 1) = processCase - processMatrix(8, 2) = 5_i4 - processMatrix(8, 3) = sum(processMatrix(1:8, 2)) - start_index = processMatrix(8, 3) - processMatrix(8, 2) - global_parameters(start_index + 1, :) = muskingumTravelTime_constant - global_parameters(start_index + 2, :) = muskingumTravelTime_riverLength - global_parameters(start_index + 3, :) = muskingumTravelTime_riverSlope - global_parameters(start_index + 4, :) = muskingumTravelTime_impervious - global_parameters(start_index + 5, :) = muskingumAttenuation_riverSlope - - global_parameters_name(start_index + 1 : start_index + processMatrix(8,2)) = (/ & - 'muskingumTravelTime_constant ', & - 'muskingumTravelTime_riverLength', & - 'muskingumTravelTime_riverSlope ', & - 'muskingumTravelTime_impervious ', & - 'muskingumAttenuation_riverSlope'/) - ! adaptive timestep routing - else if (processCase .eq. 2_i4) then - processMatrix(8, 1) = processCase - processMatrix(8, 2) = 1_i4 - processMatrix(8, 3) = sum(processMatrix(1:8, 2)) - start_index = processMatrix(8, 3) - processMatrix(8, 2) - global_parameters(start_index + 1, :) = streamflow_celerity - - global_parameters_name(start_index + 1 : start_index + processMatrix(8,2)) = (/ & - 'streamflow_celerity'/) - end if + ! insert parameter values and names at position required by mhm + processMatrix(8, 1) = processCase + processMatrix(8, 2) = 5_i4 + processMatrix(8, 3) = sum(processMatrix(1 : 8, 2)) + start_index = processMatrix(8, 3) - processMatrix(8, 2) + global_parameters(start_index + 1, :) = muskingumTravelTime_constant + global_parameters(start_index + 2, :) = muskingumTravelTime_riverLength + global_parameters(start_index + 3, :) = muskingumTravelTime_riverSlope + global_parameters(start_index + 4, :) = muskingumTravelTime_impervious + global_parameters(start_index + 5, :) = muskingumAttenuation_riverSlope + + global_parameters_name(start_index + 1 : start_index + processMatrix(8, 2)) = (/ & + 'muskingumTravelTime_constant ', & + 'muskingumTravelTime_riverLength', & + 'muskingumTravelTime_riverSlope ', & + 'muskingumTravelTime_impervious ', & + 'muskingumAttenuation_riverSlope'/) + ! adaptive timestep routing + else if (processCase .eq. 2_i4) then + processMatrix(8, 1) = processCase + processMatrix(8, 2) = 1_i4 + processMatrix(8, 3) = sum(processMatrix(1 : 8, 2)) + start_index = processMatrix(8, 3) - processMatrix(8, 2) + global_parameters(start_index + 1, :) = streamflow_celerity + + global_parameters_name(start_index + 1 : start_index + processMatrix(8, 2)) = (/ & + 'streamflow_celerity'/) + end if #else ! Muskingum routing parameters with MPR if (processCase .eq. 1_i4) then - processMatrix(8, 1) = processCase - processMatrix(8, 2) = 5_i4 - processMatrix(8, 3) = processMatrix(8, 2) - ! set variables of mrm (redundant in case of coupling to mhm) - call append(global_parameters, reshape(muskingumTravelTime_constant, (/1, nColPars/))) - call append(global_parameters, reshape(muskingumTravelTime_riverLength, (/1, nColPars/))) - call append(global_parameters, reshape(muskingumTravelTime_riverSlope, (/1, nColPars/))) - call append(global_parameters, reshape(muskingumTravelTime_impervious, (/1, nColPars/))) - call append(global_parameters, reshape(muskingumAttenuation_riverSlope, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'muskingumTravelTime_constant ', & - 'muskingumTravelTime_riverLength', & - 'muskingumTravelTime_riverSlope ', & - 'muskingumTravelTime_impervious ', & - 'muskingumAttenuation_riverSlope'/)) - ! adaptive timestep routing - else if (processCase .eq. 2_i4) then - processMatrix(8, 1) = processCase - processMatrix(8, 2) = 1_i4 - processMatrix(8, 3) = processMatrix(8, 2) - ! set variables of mrm (redundant in case of coupling to mhm) - call append(global_parameters, reshape(streamflow_celerity, (/1, nColPars/))) - - call append(global_parameters_name, (/ & - 'streamflow_celerity'/)) - end if + processMatrix(8, 1) = processCase + processMatrix(8, 2) = 5_i4 + processMatrix(8, 3) = processMatrix(8, 2) + ! set variables of mrm (redundant in case of coupling to mhm) + call append(global_parameters, reshape(muskingumTravelTime_constant, (/1, nColPars/))) + call append(global_parameters, reshape(muskingumTravelTime_riverLength, (/1, nColPars/))) + call append(global_parameters, reshape(muskingumTravelTime_riverSlope, (/1, nColPars/))) + call append(global_parameters, reshape(muskingumTravelTime_impervious, (/1, nColPars/))) + call append(global_parameters, reshape(muskingumAttenuation_riverSlope, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'muskingumTravelTime_constant ', & + 'muskingumTravelTime_riverLength', & + 'muskingumTravelTime_riverSlope ', & + 'muskingumTravelTime_impervious ', & + 'muskingumAttenuation_riverSlope'/)) + ! adaptive timestep routing + else if (processCase .eq. 2_i4) then + processMatrix(8, 1) = processCase + processMatrix(8, 2) = 1_i4 + processMatrix(8, 3) = processMatrix(8, 2) + ! set variables of mrm (redundant in case of coupling to mhm) + call append(global_parameters, reshape(streamflow_celerity, (/1, nColPars/))) + + call append(global_parameters_name, (/ & + 'streamflow_celerity'/)) + end if #endif - ! check if parameter are in range - if ( .not. in_bound(global_parameters) ) then - call message('***ERROR: parameter in namelist "routing1" out of bound in ', & - trim(adjustl(file_namelist))) - stop - end if - - call close_nml(unamelist_param) - - end subroutine read_mrm_routing_params - - ! -------------------------------------------------------------------------------- - ! private funtions and subroutines, DUPLICATED FROM mo_read_config.f90 - ! -------------------------------------------------------------------------------- - - function in_bound(params) - real(dp), dimension(:,:), intent(in) :: params ! parameter: - ! ! col_1=Lower bound, - ! ! col_2=Upper bound - ! ! col_3=initial - logical :: in_bound - - if ( any(params(:,3) .lt. params(:,1)) .or. any(params(:,3) .gt. params(:,2)) ) then - in_bound=.false. - else - in_bound=.true. + ! check if parameter are in range + if (.not. in_bound(global_parameters)) then + call message('***ERROR: parameter in namelist "routing1" out of bound in ', & + trim(adjustl(file_namelist_param))) + stop end if - end function in_bound + call close_nml(unamelist_param) + + end subroutine read_mrm_routing_params end module mo_mrm_read_config diff --git a/src/mRM/mo_mrm_read_data.f90 b/src/mRM/mo_mrm_read_data.f90 index 0b3f1287..9c7da269 100644 --- a/src/mRM/mo_mrm_read_data.f90 +++ b/src/mRM/mo_mrm_read_data.f90 @@ -8,16 +8,14 @@ !> \date Aug 2015 module mo_mrm_read_data - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none public :: mrm_read_L0_data - public :: mrm_L1_variable_init - public :: mrm_L0_variable_init - public :: mrm_read_total_runoff public :: mrm_read_discharge + public :: mrm_read_total_runoff private contains - + ! ------------------------------------------------------------------ ! NAME @@ -66,659 +64,171 @@ module mo_mrm_read_data !> \author Juliane Mai, Matthias Zink, and Stephan Thober !> \date Aug 2015 ! Modified, Sep 2015 - Stephan Thober, added L0_mask, L0_elev, and L0_LCover - subroutine mrm_read_L0_data(L0_mask, L0_elev, L0_LCover) - use mo_mrm_constants, only: nodata_i4, nodata_dp ! mRM's global nodata vales - use mo_append, only: append, paste - use mo_string_utils, only: num2str - use mo_message, only: message - use mo_read_spatial_data, only: read_spatial_data_ascii, read_header_ascii - use mo_mrm_file, only: & - file_facc, ufacc, & ! file name and unit of flow acc map - file_fdir, ufdir, & ! file name and unit of flow dir map - file_gaugeloc, ugaugeloc, & ! file name and unit of gauge locations m - file_dem, udem, & - uLCoverClass - use mo_mrm_global_variables, only: & - mrm_coupling_mode, & - nBasins, & - perform_mpr, & - nLCoverScene, & - level0, & ! level0 information - resolutionHydrology, & - dirMorpho, & ! directories - dirLCover, & - LCfilename, & - L0_mask_mRM, & - L0_Basin, & - L0_elev_mRM, & ! level 0 elevation - L0_elev_read, & - L0_LCover_mRM, & - L0_LCover_read, & - L0_fAcc, & ! flow accumulation on input resolution (L0) - L0_fDir, & ! flow direction on input resolution (L0) - L0_gaugeLoc, & ! location of evaluation gauges on input resolution (L0) - L0_InflowGaugeLoc, & ! location of inflow gauges on input resolution (L0) - basin_mrm ! basin information for single basins - use mo_common_variables, only: & - processMatrix ! process description - + subroutine mrm_read_L0_data(do_reinit, do_readlatlon, do_readlcover) + use mo_common_constants, only : nodata_i4! mRM's global nodata vales + use mo_append, only : append + use mo_string_utils, only : num2str + use mo_message, only : message + use mo_read_spatial_data, only : read_spatial_data_ascii + use mo_mrm_file, only : & + file_facc, ufacc, & ! file name and unit of flow acc map + file_fdir, ufdir, & ! file name and unit of flow dir map + file_gaugeloc, ugaugeloc ! file name and unit of gauge locations m + use mo_mrm_global_variables, only : & + L0_fAcc, & ! flow accumulation on input resolution (L0) + L0_fDir, & ! flow direction on input resolution (L0) + L0_gaugeLoc, & ! location of evaluation gauges on input resolution (L0) + L0_InflowGaugeLoc, & ! location of inflow gauges on input resolution (L0) + basin_mrm ! basin information for single basins + use mo_common_variables, only : & + L0_LCover, & + Grid, & + level0, & ! level0 information + dirMorpho, & ! directories + L0_Basin, & + nBasins, & + processMatrix ! process description + use mo_common_read_data, only : read_dem, read_lcover + USE mo_read_latlon, ONLY : read_latlon + implicit none - + ! optional input variables - logical, dimension(:), target, intent(in), optional :: L0_mask ! L0 mask - real(dp), dimension(:), target, intent(in), optional :: L0_elev ! L0 elevation - integer(i4), dimension(:,:), target, intent(in), optional :: L0_LCover ! L0 land cover - + logical, intent(in) :: do_reinit + logical, intent(in) :: do_readlatlon + logical, intent(in) :: do_readlcover + ! local variables integer(i4) :: iBasin integer(i4) :: iVar integer(i4) :: iGauge character(256) :: fname integer(i4) :: nunit - integer(i4) :: nCells ! number of cells in global_mask - integer(i4), dimension(:,:), allocatable :: data_i4_2d - integer(i4), dimension(:,:), allocatable :: dataMatrix_i4 - real(dp), dimension(:,:), allocatable :: data_dp_2d - logical, dimension(:,:), allocatable :: mask_2d - logical, dimension(:,:), allocatable :: mask_global + integer(i4), dimension(:, :), allocatable :: data_i4_2d + integer(i4), dimension(:, :), allocatable :: dataMatrix_i4 + logical, dimension(:, :), allocatable :: mask_2d + logical, dimension(:, :), allocatable :: mask_global + type(Grid), pointer :: level0_iBasin + ! ************************************************ ! READ SPATIAL DATA FOR EACH BASIN ! ************************************************ - ! allocate necessary variables at Level0 - allocate(level0%nrows (nBasins)) - allocate(level0%ncols (nBasins)) - allocate(level0%xllcorner (nBasins)) - allocate(level0%yllcorner (nBasins)) - allocate(level0%cellsize (nBasins)) - allocate(level0%nodata_value(nBasins)) - ! - allocate(basin_mrm%L0_iStart (nBasins)) - allocate(basin_mrm%L0_iEnd (nBasins)) - allocate(basin_mrm%L0_iStartMask(nBasins)) - allocate(basin_mrm%L0_iEndMask (nBasins)) - ! - ! allocate necessary variables at Level110 - allocate(basin_mrm%L110_iStart (nBasins)) - allocate(basin_mrm%L110_iEnd (nBasins)) - - basin_loop: do iBasin = 1, nBasins - ! Header (to check consistency) - fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_dem)) - call read_header_ascii(trim(fName), udem, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), level0%nodata_value(iBasin)) - - ! check for L0 and L1 scale consistency - if( resolutionHydrology(iBasin) .LT. level0%cellsize(iBasin)) then - call message() - call message('***ERROR: resolutionHydrology (L1) should be smaller than the input data resolution (L0)') - call message(' check set-up (in mhm.nml) for basin: ', trim(adjustl(num2str(iBasin))),' ...') - stop - end if - - ! DEM + overall mask creation - fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_dem)) - ! only read dem data if not coupled to mhm - call read_spatial_data_ascii(trim(fName), udem, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin),& - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_dp_2d, mask_global) - ! create overall mHM mask on L0 and save indices - nCells = size(mask_global, dim=1)*size(mask_global, dim=2) - if (.not. present(L0_mask)) call append( L0_mask_mRM, reshape(mask_global, (/nCells/))) - - ! Saving indices at Level110 irrespective of whether L0_data is shared or not - if (iBasin .eq. 1) then - basin_mrm%L110_iStart(iBasin) = 1 - basin_mrm%L110_iEnd (iBasin) = basin_mrm%L110_iStart(iBasin) + count(mask_global) - 1 - else - basin_mrm%L110_iStart(iBasin) = basin_mrm%L110_iEnd(iBasin-1) + 1 - basin_mrm%L110_iEnd (iBasin) = basin_mrm%L110_iStart(iBasin) + count(mask_global) - 1 - end if - - ! check whether L0 data is shared - if (iBasin .gt. 1) then - if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then - ! - call message(' Using data of previous basin: ', trim(adjustl(num2str(iBasin))),' ...') - basin_mrm%L0_iStart(iBasin) = basin_mrm%L0_iStart(iBasin - 1) - basin_mrm%L0_iEnd (iBasin) = basin_mrm%L0_iEnd(iBasin - 1) - ! - basin_mrm%L0_iStartMask(iBasin) = basin_mrm%L0_iStartMask(iBasin - 1 ) - basin_mrm%L0_iEndMask (iBasin) = basin_mrm%L0_iEndMask(iBasin - 1 ) - ! - ! DO NOT read L0 data - cycle - ! - end if - end if - ! - call message(' Reading data for basin: ', trim(adjustl(num2str(iBasin))),' ...') - ! - ! Saving indices of mask and packed data - if(iBasin .eq. 1) then - basin_mrm%L0_iStart(iBasin) = 1 - basin_mrm%L0_iEnd (iBasin) = basin_mrm%L0_iStart(iBasin) + count(mask_global) - 1 - ! - basin_mrm%L0_iStartMask(iBasin) = 1 - basin_mrm%L0_iEndMask (iBasin) = basin_mrm%L0_iStartMask(iBasin) + nCells - 1 - else - basin_mrm%L0_iStart(iBasin) = basin_mrm%L0_iEnd(iBasin-1) + 1 - basin_mrm%L0_iEnd (iBasin) = basin_mrm%L0_iStart(iBasin) + count(mask_global) - 1 - ! - basin_mrm%L0_iStartMask(iBasin) = basin_mrm%L0_iEndMask(iBasin-1) + 1 - basin_mrm%L0_iEndMask (iBasin) = basin_mrm%L0_iStartMask(iBasin) + nCells - 1 - end if - - ! ---------------------------------------------------------------------- - ! READ L0 DATA - ! ---------------------------------------------------------------------- - ! always read elev - if (mrm_coupling_mode .ne. 2) then - ! put global nodata value into array (probably not all grid cells have values) - data_dp_2d = merge(data_dp_2d, nodata_dp, mask_global) - ! put data in variable - call append(L0_elev_read, pack(data_dp_2d, mask_global)) - ! deallocate arrays - deallocate(data_dp_2d) - end if - - ! Read additional L0 data, if restart is false - read_L0_data: if ( perform_mpr ) then - ! - - ! read fAcc, fDir, gaugeLoc - do iVar = 1, 3 - select case (iVar) - case(1) ! flow accumulation - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_facc)) - nunit = ufacc - case(2) ! flow direction - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_fdir)) - nunit = ufdir - case(3) ! location of gauging stations - fName = trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_gaugeloc)) - nunit = ugaugeloc - end select - ! - ! reading and transposing - call read_spatial_data_ascii(trim(fName), nunit, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - ! put data into global L0 variable - select case (iVar) - case(1) ! flow accumulation - call append( L0_fAcc, pack(data_i4_2d, mask_global) ) - case(2) ! flow direction - ! rotate flow direction and any other variable with directions - ! NOTE: ONLY when ASCII files are read - call rotate_fdir_variable(data_i4_2d) - ! append - call append( L0_fDir, pack(data_i4_2d, mask_global) ) - case(3) ! location of evaluation and inflow gauging stations - ! evaluation gauges - ! Input data check - do iGauge = 1, basin_mrm%nGauges(iBasin) - ! If gaugeId is found in gauging location file? - if (.not. any(data_i4_2d .EQ. basin_mrm%gaugeIdList(iBasin, iGauge))) then - call message() - call message('***ERROR: Gauge ID "', trim(adjustl(num2str(basin_mrm%gaugeIdList(iBasin, iGauge)))), & - '" not found in ' ) - call message(' Gauge location input file: ', & - trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_gaugeloc))) - stop - end if - end do - - call append( L0_gaugeLoc, pack(data_i4_2d, mask_global) ) - - ! inflow gauges - ! if no inflow gauge for this subbasin exists still matirx with dim of subbasin has to be paded - if (basin_mrm%nInflowGauges(iBasin) .GT. 0_i4) then - ! Input data check - do iGauge = 1, basin_mrm%nInflowGauges(iBasin) - ! If InflowGaugeId is found in gauging location file? - if (.not. any(data_i4_2d .EQ. basin_mrm%InflowGaugeIdList(iBasin, iGauge))) then - call message() - call message('***ERROR: Inflow Gauge ID "', & - trim(adjustl(num2str(basin_mrm%InflowGaugeIdList(iBasin, iGauge)))), & - '" not found in ' ) - call message(' Gauge location input file: ', & - trim(adjustl(dirMorpho(iBasin)))//trim(adjustl(file_gaugeloc))) - stop - end if - end do - end if - - call append( L0_InflowGaugeLoc, pack(data_i4_2d, mask_global) ) - - end select - ! - ! deallocate arrays - deallocate(data_i4_2d, mask_2d) - ! - end do - end if read_L0_data - ! - if (.not. present(L0_LCover)) then - ! LCover read in is realized seperated because of unknown number of scenes - if (processMatrix(8, 1) .eq. 1) then - do iVar = 1, nLCoverScene - fName = trim(adjustl(dirLCover(iBasin)))//trim(adjustl(LCfilename(iVar))) - call read_spatial_data_ascii(trim(fName), ulcoverclass, & - level0%nrows(iBasin), level0%ncols(iBasin), level0%xllcorner(iBasin), & - level0%yllcorner(iBasin), level0%cellsize(iBasin), data_i4_2d, mask_2d) - - ! put global nodata value into array (probably not all grid cells have values) - data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) - call paste(dataMatrix_i4, pack(data_i4_2d, mask_global), nodata_i4) - ! - deallocate(data_i4_2d) - end do - end if - if (processMatrix(8, 1) .eq. 2) then - allocate(dataMatrix_i4(count(mask_global), 1)) - dataMatrix_i4 = nodata_i4 - end if - ! - call append( L0_LCover_read, dataMatrix_i4 ) - ! free memory - deallocate(dataMatrix_i4) - end if - - ! free memory - deallocate(mask_global) - - end do basin_loop - - ! ---------------------------------------------------------------- - ! assign pointers for L0 variables if mpr is switched on - ! ---------------------------------------------------------------- - if (present(L0_mask)) then - basin_mRM%L0_mask => L0_mask - else - basin_mRM%L0_mask => L0_mask_mRM - end if - if (present(L0_elev)) then - L0_elev_mRM => L0_elev - else - L0_elev_mRM => L0_elev_read - end if - if (present(L0_LCover)) then - L0_LCover_mRM => L0_LCover - else - L0_LCover_mRM => L0_LCover_read + if (do_reinit) then + call read_dem() end if - end subroutine mrm_read_L0_data - - ! ------------------------------------------------------------------ - - ! NAME - ! mrm_L0_variable_init - - !> \brief level 0 variable initialization - - !> \details following tasks are performed for L0 data sets - !> - cell id & numbering - !> - storage of cell cordinates (row and coloum id) - !> If a variable is added or removed here, then it also has to - !> be added or removed in the subroutine config_variables_set in - !> module mo_restart and in the subroutine set_config in module - !> mo_set_netcdf_restart - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" basin id - - ! INTENT(INOUT) - !> \param[in,out] "integer(i4), dimension(:) :: soilId_isPresent" - !> flag to indicate wether a given soil-id is present or not, DIMENSION [nSoilTypes] - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - ! \author Rohini Kumar - ! \date Jan 2013 - ! Modified - ! Rohini Kumar & Matthias Cuntz, May 2014 - cell area calulation based on a regular lat-lon grid or - ! on a regular X-Y coordinate system - ! Matthias Cuntz, May 2014 - changed empirical distribution function - ! so that doubles get the same value - ! Stephan Thober, Aug 2015 - adapted for mRM - - subroutine mrm_L0_variable_init(iBasin) - use mo_append, only: append - use mo_constants, only: TWOPI_dp, RadiusEarth_dp - use mo_mrm_constants, only: nodata_i4, nodata_dp - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - L0_areaCell, & - level0, & - L0_cellCoor, & - L0_Id, & - L0_nCells, & - iFlag_cordinate_sys - - implicit none - - integer(i4), intent(in) :: iBasin - - ! local variables - integer(i4) :: nCells - integer(i4), dimension(:,:), allocatable :: cellCoor - integer(i4), dimension(:), allocatable :: Id - real(dp), dimension(:), allocatable :: areaCell - real(dp), dimension(:,:), allocatable :: areaCell_2D - - integer(i4) :: nrows, ncols - integer(i4) :: iStart, iEnd - logical, dimension(:,:), allocatable :: mask - - integer(i4) :: i, j, k - real(dp) :: rdum, degree_to_radian, degree_to_metre - - !-------------------------------------------------------- - ! STEPS:: - ! 1) Estimate each variable locally for a given basin - ! 2) Pad each variable to its corresponding global one - !-------------------------------------------------------- - - ! level-0 information - call get_basin_info_mrm( iBasin, 0, nrows, ncols, nCells=nCells, iStart=iStart, iEnd=iEnd, mask=mask ) - - allocate( cellCoor(nCells,2) ) - allocate( Id(nCells ) ) - allocate( areaCell(nCells ) ) - allocate( areaCell_2D(nrows,ncols) ) - - cellCoor(:,:) = nodata_i4 - Id(:) = nodata_i4 - areaCell(:) = nodata_dp - areaCell_2D(:,:) = nodata_dp - - !------------------------------------------------ - ! start looping for cell cordinates and ids - !------------------------------------------------ - k = 0 - do j = 1, ncols - do i = 1, nrows - if ( .NOT. mask(i,j) ) cycle - k = k + 1 - Id(k) = k - cellCoor(k,1) = i - cellCoor(k,2) = j - end do - end do - - ! ESTIMATE AREA [m2] - - ! regular X-Y coordinate system - if(iFlag_cordinate_sys .eq. 0) then - areaCell(:) = level0%cellsize(iBasin) * level0%cellsize(iBasin) - - ! regular lat-lon coordinate system - else if(iFlag_cordinate_sys .eq. 1) then - - degree_to_radian = TWOPI_dp / 360.0_dp - degree_to_metre = RadiusEarth_dp*TWOPI_dp/360.0_dp - do i = ncols, 1, -1 - j = ncols - i + 1 - ! get latitude in degrees - rdum = level0%yllcorner(iBasin) + (real(j,dp)-0.5_dp) * level0%cellsize(iBasin) - ! convert to radians - rdum = rdum*degree_to_radian - ! AREA [m2] - areaCell_2D(:,i) = (level0%cellsize(iBasin) * cos(rdum) * degree_to_metre) * (level0%cellsize(iBasin)*degree_to_metre) - end do - areaCell(:) = pack( areaCell_2D(:,:), mask) - + if (do_readlcover .and. processMatrix(8, 1) .eq. 1) then + call read_lcover() + else if (do_readlcover .and. processMatrix(8, 1) .eq. 2) then + allocate(dataMatrix_i4(count(mask_global), 1)) + dataMatrix_i4 = nodata_i4 + call append(L0_LCover, dataMatrix_i4) + ! free memory + deallocate(dataMatrix_i4) end if - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - call append( L0_cellCoor, cellCoor ) - call append( L0_Id, Id ) - call append( L0_areaCell, areaCell ) - - ! ---------------------------------------------------------------- - ! set number of cells at Level 0 - ! ---------------------------------------------------------------- - L0_nCells = size(L0_Id, 1) + do iBasin = 1, nBasins - ! free space - deallocate(cellCoor, Id, areaCell, areaCell_2D, mask) + level0_iBasin => level0(L0_Basin(iBasin)) - end subroutine mrm_L0_variable_init - - ! ------------------------------------------------------------------ - - ! NAME - ! mrm_L1_variable_init - - !> \brief level 1 variable initialization - - !> \details mRM only requires to initialize L1_areaCell and - !> L1_mask - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" basin id - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - ! None - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - ! \author Rohini Kumar & Stephan Thober - ! \date Aug 2015 - subroutine mrm_L1_variable_init(iBasin) - use mo_mrm_constants, only: nodata_dp - use mo_append, only: append ! append vector - use mo_mrm_tools, only: get_basin_info_mrm, calculate_grid_properties - use mo_mrm_global_variables, only: & - level0, & - resolutionHydrology, & - L0_areaCell, & - L1_areaCell, & - L1_nCells, & - level1, & - nBasins, & - basin_mrm - - implicit none - - ! input variables - integer(i4), intent(in) :: iBasin - ! local variables - integer(i4) :: nrows0, ncols0 - integer(i4) :: iStart0, iEnd0 - real(dp) :: xllcorner0, yllcorner0 - real(dp) :: cellsize0 - logical, dimension(:,:), allocatable :: mask0 - real(dp), dimension(:,:), allocatable :: areaCell0_2D - - integer(i4) :: nrows1, ncols1 - logical, dimension(:,:), allocatable :: mask1 - - integer(i4) :: nCells - real(dp), dimension(:), allocatable :: areaCell - - real(dp) :: cellFactorHydro - - integer(i4) :: iup, idown - integer(i4) :: jl, jr - - integer(i4) :: i, j, k, ic, jc - - !-------------------------------------------------------- - ! STEPS:: - ! 1) Estimate each variable locally for a given basin - ! 2) Pad each variable to its corresponding global one - !-------------------------------------------------------- - - ! level-0 information - call get_basin_info_mrm( iBasin, 0, nrows0, ncols0, iStart=iStart0, iEnd=iEnd0, mask=mask0, & - xllcorner=xllcorner0, yllcorner=yllcorner0, cellsize=cellsize0 ) - - if(iBasin == 1) then - allocate( level1%nrows (nBasins) ) - allocate( level1%ncols (nBasins) ) - allocate( level1%xllcorner (nBasins) ) - allocate( level1%yllcorner (nBasins) ) - allocate( level1%cellsize (nBasins) ) - allocate( level1%nodata_value (nBasins) ) - end if - - ! grid properties - call calculate_grid_properties( nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - resolutionHydrology(iBasin) , & - level1%nrows(iBasin), level1%ncols(iBasin), level1%xllcorner(iBasin), & - level1%yllcorner(iBasin), level1%cellsize(iBasin), level1%nodata_value(iBasin) ) - - ! level-1 information - call get_basin_info_mrm( iBasin, 1, nrows1, ncols1 ) - - ! cellfactor = leve1-1 / level-0 - cellFactorHydro = level1%cellsize(iBasin) / level0%cellsize(iBasin) - - ! allocation and initalization of mask at level-1 - allocate( mask1(nrows1, ncols1) ) - mask1(:,:) = .FALSE. - - ! create mask at level-1 - do j=1,ncols0 - jc = ceiling( real(j,dp)/cellFactorHydro ) - do i=1,nrows0 - if ( .NOT. mask0(i,j) ) cycle - ic = ceiling( real(i,dp)/cellFactorHydro ) - mask1(ic,jc) = .TRUE. - end do - end do - - ! level-0 cell area - allocate( areaCell0_2D(nrows0,ncols0) ) - areaCell0_2D(:,:) = UNPACK( L0_areaCell(iStart0:iEnd0), mask0, nodata_dp ) - - ! estimate ncells and initalize related variables - nCells = count( mask1 ) - - ! allocate and initalize cell1 related variables - allocate( areaCell (nCells ) ) - - k = 0 - do jc=1,ncols1 - do ic=1,nrows1 - if ( .NOT. mask1(ic,jc) ) cycle - k = k + 1 - - ! coord. of all corners -> of finer scale level-0 - iup = (ic-1) * nint(cellFactorHydro,i4) + 1 - idown = ic * nint(cellFactorHydro,i4) - jl = (jc-1) * nint(cellFactorHydro,i4) + 1 - jr = jc * nint(cellFactorHydro,i4) + ! check whether L0 data is shared + if (iBasin .gt. 1) then + if (L0_Basin(iBasin) .eq. L0_Basin(iBasin - 1)) then + ! + call message(' Using data of basin ', & + trim(adjustl(num2str(L0_Basin(iBasin)))), ' for basin: ',& + trim(adjustl(num2str(iBasin))), '...') + cycle + ! + end if + end if + ! + call message(' Reading data for basin: ', trim(adjustl(num2str(iBasin))), ' ...') + + if (do_readlatlon) then + ! read lat lon coordinates of each basin + call read_latlon(iBasin, "lon_l0", "lat_l0", "level0", level0_iBasin) + end if + + ! read fAcc, fDir, gaugeLoc + do iVar = 1, 3 + select case (iVar) + case(1) ! flow accumulation + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_facc)) + nunit = ufacc + case(2) ! flow direction + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_fdir)) + nunit = ufdir + case(3) ! location of gauging stations + fName = trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_gaugeloc)) + nunit = ugaugeloc + end select + ! + ! reading and transposing + call read_spatial_data_ascii(trim(fName), nunit, & + level0_iBasin%nrows, level0_iBasin%ncols, level0_iBasin%xllcorner, & + level0_iBasin%yllcorner, level0_iBasin%cellsize, data_i4_2d, mask_2d) + + ! put global nodata value into array (probably not all grid cells have values) + data_i4_2d = merge(data_i4_2d, nodata_i4, mask_2d) + ! put data into global L0 variable + select case (iVar) + case(1) ! flow accumulation + call append(L0_fAcc, pack(data_i4_2d, level0_iBasin%mask)) + case(2) ! flow direction + ! rotate flow direction and any other variable with directions + ! NOTE: ONLY when ASCII files are read + call rotate_fdir_variable(data_i4_2d) + ! append + call append(L0_fDir, pack(data_i4_2d, level0_iBasin%mask)) + case(3) ! location of evaluation and inflow gauging stations + ! evaluation gauges + ! Input data check + do iGauge = 1, basin_mrm(iBasin)%nGauges + ! If gaugeId is found in gauging location file? + if (.not. any(data_i4_2d .EQ. basin_mrm(iBasin)%gaugeIdList(iGauge))) then + call message() + call message('***ERROR: Gauge ID "', trim(adjustl(num2str(basin_mrm(iBasin)%gaugeIdList(iGauge)))), & + '" not found in ') + call message(' Gauge location input file: ', & + trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_gaugeloc))) + stop + end if + end do - ! constrain the range of up, down, left, and right boundaries - if(iup < 1 ) iup = 1 - if(idown > nrows0 ) idown = nrows0 - if(jl < 1 ) jl = 1 - if(jr > ncols0 ) jr = ncols0 + call append(L0_gaugeLoc, pack(data_i4_2d, level0_iBasin%mask)) + + ! inflow gauges + ! if no inflow gauge for this subbasin exists still matirx with dim of subbasin has to be paded + if (basin_mrm(iBasin)%nInflowGauges .GT. 0_i4) then + ! Input data check + do iGauge = 1, basin_mrm(iBasin)%nInflowGauges + ! If InflowGaugeId is found in gauging location file? + if (.not. any(data_i4_2d .EQ. basin_mrm(iBasin)%InflowGaugeIdList(iGauge))) then + call message() + call message('***ERROR: Inflow Gauge ID "', & + trim(adjustl(num2str(basin_mrm(iBasin)%InflowGaugeIdList(iGauge)))), & + '" not found in ') + call message(' Gauge location input file: ', & + trim(adjustl(dirMorpho(iBasin))) // trim(adjustl(file_gaugeloc))) + stop 1 + end if + end do + end if - ! effective area [km2] & total no. of L0 cells within a given L1 cell - areaCell(k) = sum( areacell0_2D(iup:idown, jl:jr), mask0(iup:idown, jl:jr) )*1.0E-6 + call append(L0_InflowGaugeLoc, pack(data_i4_2d, level0_iBasin%mask)) - end do + end select + ! + ! deallocate arrays + deallocate(data_i4_2d, mask_2d) + ! + end do end do - - !-------------------------------------------------------- - ! Start padding up local variables to global variables - !-------------------------------------------------------- - if( iBasin .eq. 1 ) then - - allocate(basin_mrm%L1_iStart(nBasins)) - allocate(basin_mrm%L1_iEnd (nBasins)) - allocate(basin_mrm%L1_iStartMask(nBasins)) - allocate(basin_mrm%L1_iEndMask (nBasins)) - - ! basin information - basin_mrm%L1_iStart(iBasin) = 1 - basin_mrm%L1_iEnd (iBasin) = basin_mrm%L1_iStart(iBasin) + nCells - 1 - - basin_mrm%L1_iStartMask(iBasin) = 1 - basin_mrm%L1_iEndMask (iBasin) = basin_mrm%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - - else - - ! basin information - basin_mrm%L1_iStart(iBasin) = basin_mrm%L1_iEnd(iBasin-1) + 1 - basin_mrm%L1_iEnd (iBasin) = basin_mrm%L1_iStart(iBasin) + nCells - 1 - - basin_mrm%L1_iStartMask(iBasin) = basin_mrm%L1_iEndMask(iBasin-1) + 1 - basin_mrm%L1_iEndMask (iBasin) = basin_mrm%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - - end if - - call append( basin_mrm%L1_Mask, RESHAPE( mask1, (/nrows1*ncols1/) ) ) - call append( L1_areaCell, areaCell ) - - ! ---------------------------------------------------------------- - ! set number of cells at Level 1 - ! ---------------------------------------------------------------- - L1_nCells = size(L1_areaCell, 1) - - ! free space - deallocate( mask0, areaCell0_2D, mask1, areaCell ) - - end subroutine mrm_L1_variable_init - + end subroutine mrm_read_L0_data ! --------------------------------------------------------------------------- ! NAME @@ -764,24 +274,25 @@ end subroutine mrm_L1_variable_init ! \author Matthias Zink & Stephan Thober ! \date Aug 2015 subroutine mrm_read_discharge() - use mo_message, only: message - use mo_append, only: paste - use mo_string_utils, only: num2str - use mo_read_timeseries, only: read_timeseries - use mo_mrm_file, only: udischarge - use mo_mrm_constants, only: nodata_dp - use mo_mrm_global_variables, only: & - nBasins, & - mRM_runoff, & ! variable storing runoff for each gauge - nGaugesTotal, gauge, nMeasPerDay, & ! evaluaton gauging station information - nInflowGaugesTotal, InflowGauge, & ! inflow stations information - evalPer, & ! model evaluation period (for discharge read in) - nTstepDay, & - simPer ! model simulation period (for inflow read in) - use mo_common_variables, only: & - optimize, & ! optimizeation flag for some error checks - opti_function ! opti_function that determines to what data to calibrate - + use mo_message, only : message + use mo_append, only : paste + use mo_string_utils, only : num2str + use mo_read_timeseries, only : read_timeseries + use mo_mrm_file, only : udischarge + use mo_common_constants, only : nodata_dp + use mo_mrm_global_variables, only : & + mRM_runoff, & ! variable storing runoff for each gauge + nGaugesTotal, gauge, nMeasPerDay, & ! evaluaton gauging station information + nInflowGaugesTotal, InflowGauge ! inflow stations information + use mo_common_variables, only : & + nBasins + use mo_common_mHM_mRM_variables, only : & + optimize, & ! optimizeation flag for some error checks + opti_function, & ! opti_function that determines to what data to calibrate + evalPer, & ! model evaluation period (for discharge read in) + simPer, & ! model simulation period (for inflow read in) + nTstepDay + implicit none ! local variables @@ -796,58 +307,57 @@ subroutine mrm_read_discharge() !---------------------------------------------------------- ! INITIALIZE RUNOFF !---------------------------------------------------------- - maxTimeSteps = maxval( simPer(1:nBasins)%julEnd - simPer(1:nBasins)%julStart + 1 ) * nTstepDay - allocate( mRM_runoff(maxTimeSteps, nGaugesTotal) ) + maxTimeSteps = maxval(simPer(1 : nBasins)%julEnd - simPer(1 : nBasins)%julStart + 1) * nTstepDay + allocate(mRM_runoff(maxTimeSteps, nGaugesTotal)) mRM_runoff = nodata_dp ! READ GAUGE DATA do iGauge = 1, nGaugesTotal - ! get basin id - iBasin = gauge%basinId(iGauge) - ! get start and end dates - start_tmp = (/evalPer(iBasin)%yStart, evalPer(iBasin)%mStart, evalPer(iBasin)%dStart/) - end_tmp = (/evalPer(iBasin)%yEnd, evalPer(iBasin)%mEnd, evalPer(iBasin)%dEnd /) - ! evaluation gauge - fName = trim(adjustl(gauge%fname(iGauge))) - call read_timeseries(trim(fName), udischarge, & - start_tmp, end_tmp, optimize, opti_function, & - data_dp_1d, mask=mask_1d, nMeasPerDay=nMeasPerDay) - data_dp_1d = merge(data_dp_1d, nodata_dp, mask_1d) - call paste(gauge%Q, data_dp_1d, nodata_dp ) - deallocate (data_dp_1d) + ! get basin id + iBasin = gauge%basinId(iGauge) + ! get start and end dates + start_tmp = (/evalPer(iBasin)%yStart, evalPer(iBasin)%mStart, evalPer(iBasin)%dStart/) + end_tmp = (/evalPer(iBasin)%yEnd, evalPer(iBasin)%mEnd, evalPer(iBasin)%dEnd /) + ! evaluation gauge + fName = trim(adjustl(gauge%fname(iGauge))) + call read_timeseries(trim(fName), udischarge, & + start_tmp, end_tmp, optimize, opti_function, & + data_dp_1d, mask = mask_1d, nMeasPerDay = nMeasPerDay) + data_dp_1d = merge(data_dp_1d, nodata_dp, mask_1d) + call paste(gauge%Q, data_dp_1d, nodata_dp) + deallocate (data_dp_1d) end do ! ! inflow gauge ! ! in mhm call InflowGauge%Q has to be initialized -- dummy allocation with period of basin 1 and initialization if (nInflowGaugesTotal .EQ. 0) then - allocate( data_dp_1d( maxval( simPer(:)%julEnd - simPer(:)%julStart + 1 ) ) ) - data_dp_1d = nodata_dp - call paste(InflowGauge%Q, data_dp_1d, nodata_dp) + allocate(data_dp_1d(maxval(simPer(:)%julEnd - simPer(:)%julStart + 1))) + data_dp_1d = nodata_dp + call paste(InflowGauge%Q, data_dp_1d, nodata_dp) else - - do iGauge = 1, nInflowGaugesTotal - ! get basin id - iBasin = InflowGauge%basinId(iGauge) - ! get start and end dates - start_tmp = (/simPer(iBasin)%yStart, simPer(iBasin)%mStart, simPer(iBasin)%dStart/) - end_tmp = (/simPer(iBasin)%yEnd, simPer(iBasin)%mEnd, simPer(iBasin)%dEnd /) - ! inflow gauge - fName = trim(adjustl(InflowGauge%fname(iGauge))) - call read_timeseries(trim(fName), udischarge, & - start_tmp, end_tmp, optimize, opti_function, & - data_dp_1d, mask=mask_1d, nMeasPerDay=nMeasPerDay) - if ( .NOT. (all(mask_1d)) ) then - call message() - call message('***ERROR: Nodata values in inflow gauge time series. File: ', trim(fName)) - call message(' During simulation period from ', num2str(simPer(iBasin)%yStart) & - ,' to ', num2str(simPer(iBasin)%yEnd)) - stop - end if - data_dp_1d = merge(data_dp_1d, nodata_dp, mask_1d) - call paste(InflowGauge%Q, data_dp_1d, nodata_dp) - deallocate (data_dp_1d) - end do + do iGauge = 1, nInflowGaugesTotal + ! get basin id + iBasin = InflowGauge%basinId(iGauge) + ! get start and end dates + start_tmp = (/simPer(iBasin)%yStart, simPer(iBasin)%mStart, simPer(iBasin)%dStart/) + end_tmp = (/simPer(iBasin)%yEnd, simPer(iBasin)%mEnd, simPer(iBasin)%dEnd /) + ! inflow gauge + fName = trim(adjustl(InflowGauge%fname(iGauge))) + call read_timeseries(trim(fName), udischarge, & + start_tmp, end_tmp, optimize, opti_function, & + data_dp_1d, mask = mask_1d, nMeasPerDay = nMeasPerDay) + if (.NOT. (all(mask_1d))) then + call message() + call message('***ERROR: Nodata values in inflow gauge time series. File: ', trim(fName)) + call message(' During simulation period from ', num2str(simPer(iBasin)%yStart) & + , ' to ', num2str(simPer(iBasin)%yEnd)) + stop + end if + data_dp_1d = merge(data_dp_1d, nodata_dp, mask_1d) + call paste(InflowGauge%Q, data_dp_1d, nodata_dp) + deallocate (data_dp_1d) + end do end if end subroutine mrm_read_discharge @@ -863,7 +373,7 @@ end subroutine mrm_read_discharge !> simulated by a hydrologic model or land surface model. This !> total runoff will then be aggregated to the level 11 resolution !> and then routed through the stream network. - + ! INTENT(IN) !> \param[in] "integer(i4) :: iBasin" basin id @@ -903,67 +413,58 @@ end subroutine mrm_read_discharge ! MODIFIED, Feb 2016, Stephan Thober - refactored deallocate statements ! Sep 2016, Stephan Thober - added ALMA convention subroutine mrm_read_total_runoff(iBasin) - use mo_append, only: append - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_constants, only: nodata_dp, HourSecs - use mo_read_forcing_nc, only: read_forcing_nc - use mo_mrm_global_variables, only: & - timestep, & - simPer, & ! simulation period - dirTotalRunoff, & ! directory of total_runoff file for each basin - L1_total_runoff_in, & ! simulated runoff at L1 - filenameTotalRunoff, & ! filename - varnameTotalRunoff ! varname - use mo_common_variables, only: ALMA_convention + use mo_append, only : append + use mo_read_forcing_nc, only : read_forcing_nc + use mo_mrm_global_variables, only : & + dirTotalRunoff, & ! directory of total_runoff file for each basin + L1_total_runoff_in, & ! simulated runoff at L1 + filenameTotalRunoff, & ! filename + varnameTotalRunoff ! varname + use mo_common_variables, only : ALMA_convention, level1 + use mo_common_mHM_mRM_variables, only : timestep, simPer + use mo_common_constants, only : nodata_dp, HourSecs implicit none - + ! input variables integer(i4), intent(in) :: iBasin ! local variables integer(i4) :: tt - integer(i4) :: nrows - integer(i4) :: ncols - integer(i4) :: ncells integer(i4) :: nTimeSteps integer(i4) :: nctimestep ! tell nc file to read daily or hourly values - logical, dimension(:,:), allocatable :: mask - real(dp), dimension(:,:,:), allocatable :: L1_data ! read data from file - real(dp), dimension(:,:), allocatable :: L1_data_packed - - ! get basin information at level 1 - call get_basin_info_mrm(iBasin, 1, nrows, ncols, ncells=ncells, mask=mask) + real(dp), dimension(:, :, :), allocatable :: L1_data ! read data from file + real(dp), dimension(:, :), allocatable :: L1_data_packed if (timestep .eq. 1) nctimestep = -4 ! hourly input if (timestep .eq. 24) nctimestep = -1 ! daily input - call read_forcing_nc(trim(dirTotalRunoff(iBasin)), nrows, ncols, simPer(iBasin), & - varnameTotalRunoff, L1_data, mask, nctimestep=nctimestep, filename=filenameTotalRunoff) - + call read_forcing_nc(trim(dirTotalRunoff(iBasin)), level1(iBasin)%nrows, level1(iBasin)%ncols, & + varnameTotalRunoff, level1(iBasin)%mask, L1_data, target_period = simPer(iBasin), & + nctimestep = nctimestep, filename = filenameTotalRunoff) ! pack variables nTimeSteps = size(L1_data, 3) - allocate( L1_data_packed(nCells, nTimeSteps)) + allocate(L1_data_packed(level1(iBasin)%nCells, nTimeSteps)) do tt = 1, nTimeSteps - L1_data_packed(:,tt) = pack(L1_data(:,:,tt), mask=mask) + L1_data_packed(:, tt) = pack(L1_data(:, :, tt), mask = level1(iBasin)%mask) end do ! free space immediately deallocate(L1_data) ! convert if ALMA conventions have been given if (ALMA_convention) then - ! convert from kg m-2 s-1 to mm TST-1 - ! 1 kg m-2 -> 1 mm depth - ! multiply with time to obtain per timestep - L1_data_packed = L1_data_packed * timestep * HourSecs - ! ! dump to file - ! call dump_netcdf('test.nc', L1_data_packed) + ! convert from kg m-2 s-1 to mm TST-1 + ! 1 kg m-2 -> 1 mm depth + ! multiply with time to obtain per timestep + L1_data_packed = L1_data_packed * timestep * HourSecs + ! ! dump to file + ! call dump_netcdf('test.nc', L1_data_packed) else - ! convert from mm hr-1 to mm TST-1 - L1_data_packed = L1_data_packed * timestep + ! convert from mm hr-1 to mm TST-1 + L1_data_packed = L1_data_packed * timestep end if - + ! append - call append(L1_total_runoff_in, L1_data_packed(:,:), nodata_dp) + call append(L1_total_runoff_in, L1_data_packed(:, :), nodata_dp) !free space deallocate(L1_data_packed) @@ -974,15 +475,15 @@ end subroutine mrm_read_total_runoff ! Rotate fdir variable to the new coordinate system ! L. Samaniego & R. Kumar ! ------------------------------------------------------------------ - subroutine rotate_fdir_variable( x ) - USE mo_mrm_constants, ONLY: nodata_i4 ! mHM's global nodata vales + subroutine rotate_fdir_variable(x) + USE mo_common_constants, ONLY : nodata_i4 ! mHM's global nodata vales implicit none - integer(i4), dimension(:,:), intent(INOUT) :: x - + integer(i4), dimension(:, :), intent(INOUT) :: x + ! local - integer(i4) :: i, j + integer(i4) :: i, j !------------------------------------------------------------------- ! NOTE: @@ -1021,30 +522,30 @@ subroutine rotate_fdir_variable( x ) ! obtained. !------------------------------------------------------------------- - do i = 1, size(x,1) - do j = 1, size(x,2) - if ( x(i,j) .eq. nodata_i4 ) cycle - select case ( x(i,j) ) - case(1) - x(i,j) = 4 - case(2) - x(i,j) = 2 - case(4) - x(i,j) = 1 - case(8) - x(i,j) = 128 - case(16) - x(i,j) = 64 - case(32) - x(i,j) = 32 - case(64) - x(i,j) = 16 - case(128) - x(i,j) = 8 - end select - end do + do i = 1, size(x, 1) + do j = 1, size(x, 2) + if (x(i, j) .eq. nodata_i4) cycle + select case (x(i, j)) + case(1) + x(i, j) = 4 + case(2) + x(i, j) = 2 + case(4) + x(i, j) = 1 + case(8) + x(i, j) = 128 + case(16) + x(i, j) = 64 + case(32) + x(i, j) = 32 + case(64) + x(i, j) = 16 + case(128) + x(i, j) = 8 + end select + end do end do -end subroutine rotate_fdir_variable + end subroutine rotate_fdir_variable end module mo_mrm_read_data diff --git a/src/mRM/mo_mrm_read_latlon.f90 b/src/mRM/mo_mrm_read_latlon.f90 deleted file mode 100644 index dc963499..00000000 --- a/src/mRM/mo_mrm_read_latlon.f90 +++ /dev/null @@ -1,261 +0,0 @@ -!> \file mo_read_latlon.f90 - -!> \brief reading latitude and longitude coordinates for each basin - -!> \authors Stephan Thober -!> \date Nov 2013 - -MODULE mo_mrm_read_latlon - - ! This module provides routines for reading latitude and longitude coordinates - ! from file. - - ! Written Stephan Thober, Nov 2013 - - USE mo_kind, ONLY: i4, dp - - ! Of course - IMPLICIT NONE - - PUBLIC :: read_latlon - - PRIVATE - -CONTAINS - - ! ------------------------------------------------------------------ - - ! NAME - ! read_latlon - - ! PURPOSE - !> \brief reads latitude and longitude coordinates - - !> \details reads latitude and longitude coordinates from - !> netcdf file for each basin and appends it to the global - !> variables latitude and longitude. - - ! CALLING SEQUENCE - ! call read_latlon(ii) - - ! INTENT(IN) - !> \param[in] "integer(i4) :: ii" basin index - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - ! None - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - !> File name of the basins must be xxx_latlon.nc, where - !> xxx is the basin id. Variable names in the netcdf file - !> have to be 'lat' for latitude and 'lon' for longitude. - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Stephan Thober - !> \date Nov 2013 - ! modified, Stephan Thober, Sep 2015 - added latitude and longitude for level 0 - ! Stephan Thober, Oct 2015 - added L1_rect_latitude and L1_rect_longitude - ! Stephan Thober, Oct 2015 - adapted to mRM - - subroutine read_latlon(ii) - - USE mo_mrm_global_variables, ONLY: fileLatLon, level11, & - L0_latitude, L0_longitude, level0, basin_mrm, L0_Basin, & - L11_rect_latitude, L11_rect_longitude - USE mo_append, ONLY: append - USE mo_message, ONLY: message - USE mo_ncread, ONLY: get_NcVar, get_NcDim - use mo_string_utils, only: num2str - - implicit none - - integer(i4), intent(in) :: ii ! basin index - - ! local variables - character(256) :: fname ! file name - integer(i4), dimension(5) :: dl ! dimension lengths - real(dp), dimension(:,:), allocatable :: dummy ! dummy variable - logical, dimension(:,:), allocatable :: mask - - ! construct filename - fname = trim( fileLatLon(ii) ) - - ! ------------------------------------------------------------------------- - ! READ LEVEL 0 LATITUDE / LONGITUDE - ! ------------------------------------------------------------------------- - if (ii .eq. 1) then - ! create mask for level 0 - mask = reshape(basin_mrm%L0_mask(basin_mrm%L0_iStartMask(ii):basin_mrm%L0_iEndMask(ii)), & - (/level0%nrows(ii), level0%ncols(ii)/)) - ! read dimension length of variable in netcdf File - dl = get_NcDim( trim(fname), 'lat_l0' ) - - ! consistency check - if ( (dl(1) .NE. level0%nrows(ii) ) .or. & - (dl(2) .NE. level0%ncols(ii) ) ) then - call message( ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message( ' Latlon expected to have following dimensions ... level0%nrows(ii):', & - trim(adjustl(num2str(level0%nrows(ii)))),', level0%ncols(ii):', trim(adjustl(num2str(level0%ncols(ii))))) - call message( ' Latlon provided ... level0%nrows(ii):', & - trim(adjustl(num2str(dl(1)))),', level0%ncols(ii):', trim(adjustl(num2str(dl(2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - - allocate(dummy(dl(1), dl(2))) - - ! read dummy variable - call get_NcVar( trim(fname), 'lat_l0', dummy ) - - ! append it to global variables - call append( L0_latitude, pack( dummy, mask )) - deallocate(dummy) - - ! read dimension length of variable in netcdf File - dl = get_NcDim( trim(fname), 'lon_l0' ) - - ! consistency check - if ( (dl(1) .NE. level0%nrows(ii) ) .or. & - (dl(2) .NE. level0%ncols(ii) ) ) then - call message( ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message( ' Latlon expected to have following dimensions ... level0%nrows(ii):', & - trim(adjustl(num2str(level0%nrows(ii)))),', level0%ncols(ii):', trim(adjustl(num2str(level0%ncols(ii))))) - call message( ' Latlon provided ... level0%nrows(ii):', & - trim(adjustl(num2str(dl(1)))),', level0%ncols(ii):', trim(adjustl(num2str(dl(2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - - allocate(dummy(dl(1), dl(2))) - - ! read dummy variable - call get_NcVar( trim(fname), 'lon_l0', dummy ) - - ! append it to global variables - call append( L0_longitude, pack( dummy, .true. )) - deallocate(dummy) - else if (L0_Basin(ii) .ne. L0_Basin(ii - 1)) then - ! create mask for level 0 - mask = reshape(basin_mrm%L0_mask(basin_mrm%L0_iStartMask(ii):basin_mrm%L0_iEndMask(ii)), & - (/level0%nrows(ii), level0%ncols(ii)/)) - ! read dimension length of variable in netcdf File - dl = get_NcDim( trim(fname), 'lat_l0' ) - - ! consistency check - if ( (dl(1) .NE. level0%nrows(ii) ) .or. & - (dl(2) .NE. level0%ncols(ii) ) ) then - call message( ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message( ' Latlon expected to have following dimensions ... level0%nrows(ii):', & - trim(adjustl(num2str(level0%nrows(ii)))),', level0%ncols(ii):', trim(adjustl(num2str(level0%ncols(ii))))) - call message( ' Latlon provided ... level0%nrows(ii):', & - trim(adjustl(num2str(dl(1)))),', level0%ncols(ii):', trim(adjustl(num2str(dl(2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - - allocate(dummy(dl(1), dl(2))) - - ! read dummy variable - call get_NcVar( trim(fname), 'lat_l0', dummy ) - - ! append it to global variables - call append( L0_latitude, pack( dummy, mask )) - deallocate(dummy) - - ! read dimension length of variable in netcdf File - dl = get_NcDim( trim(fname), 'lon_l0' ) - - ! consistency check - if ( (dl(1) .NE. level0%nrows(ii) ) .or. & - (dl(2) .NE. level0%ncols(ii) ) ) then - call message( ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message( ' Latlon expected to have following dimensions ... level0%nrows(ii):', & - trim(adjustl(num2str(level0%nrows(ii)))),', level0%ncols(ii):', trim(adjustl(num2str(level0%ncols(ii))))) - call message( ' Latlon provided ... level0%nrows(ii):', & - trim(adjustl(num2str(dl(1)))),', level0%ncols(ii):', trim(adjustl(num2str(dl(2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - - allocate(dummy(dl(1), dl(2))) - - ! read dummy variable - call get_NcVar( trim(fname), 'lon_l0', dummy ) - - ! append it to global variables - call append( L0_longitude, pack( dummy, mask )) - deallocate(dummy) - end if - ! clean up - if (allocated(mask)) deallocate(mask) - mask = reshape(basin_mrm%L11_mask(basin_mrm%L11_iStartMask(ii):basin_mrm%L11_iEndMask(ii)), & - (/level11%nrows(ii), level11%ncols(ii)/)) - - ! ------------------------------------------------------------------------- - ! READ LEVEL 11 LATITUDE / LONGITUDE - ! ------------------------------------------------------------------------- - ! read dimension length of variable in netcdf File - dl = get_NcDim( trim(fname), 'lat_l11' ) - - ! consistency check - if ( (dl(1) .NE. level11%nrows(ii) ) .or. & - (dl(2) .NE. level11%ncols(ii) ) ) then - call message( ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message( ' Latlon expected to have following dimensions ... level11%nrows(ii):', & - trim(adjustl(num2str(level11%nrows(ii)))),', level11%ncols(ii):', trim(adjustl(num2str(level11%ncols(ii))))) - call message( ' Latlon provided ... level11%nrows(ii):', & - trim(adjustl(num2str(dl(1)))),', level11%ncols(ii):', trim(adjustl(num2str(dl(2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - - allocate(dummy(dl(1), dl(2))) - - ! read dummy variable - call get_NcVar( trim(fname), 'lat_l11', dummy ) - - ! append it to global variables - call append( L11_rect_latitude, pack(dummy, .true.)) - deallocate(dummy) - - ! read dimension length of variable in netcdf File - dl = get_NcDim( trim(fname), 'lon_l11' ) - - ! consistency check - if ( (dl(1) .NE. level11%nrows(ii) ) .or. & - (dl(2) .NE. level11%ncols(ii) ) ) then - call message( ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!') - call message( ' Latlon expected to have following dimensions ... level11%nrows(ii):', & - trim(adjustl(num2str(level11%nrows(ii)))),', level11%ncols(ii):', trim(adjustl(num2str(level11%ncols(ii))))) - call message( ' Latlon provided ... level11%nrows(ii):', & - trim(adjustl(num2str(dl(1)))),', level11%ncols(ii):', trim(adjustl(num2str(dl(2))))) - stop ' ***ERROR: subroutine mo_read_latlon: size mismatch in latlon file!' - end if - - allocate(dummy(dl(1), dl(2))) - - ! read dummy variable - call get_NcVar( trim(fname), 'lon_l11', dummy ) - - ! append it to global variables - call append( L11_rect_longitude, pack(dummy, .true.)) - deallocate(dummy, mask) - - end subroutine read_latlon - -END MODULE mo_mrm_read_latlon diff --git a/src/mRM/mo_mrm_restart.f90 b/src/mRM/mo_mrm_restart.f90 index 2d23eb7d..18ba3abc 100644 --- a/src/mRM/mo_mrm_restart.f90 +++ b/src/mRM/mo_mrm_restart.f90 @@ -8,13 +8,13 @@ !> \authors Stephan Thober !> \date Aug 2015 module mo_mrm_restart - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp implicit none public :: mrm_write_restart public :: mrm_read_restart_states public :: mrm_read_restart_config contains - + ! ------------------------------------------------------------------ ! NAME @@ -68,200 +68,136 @@ module mo_mrm_restart ! May 2016, Stephan Thober - split L0_OutletCoord into L0_rowOutlet & L0_colOutlet ! because multiple outlets could exist ! Nov 2016, Stephan Thober - added L11_TSrout, ProcessMatrix - + subroutine mrm_write_restart(iBasin, OutPath) - use mo_message, only: message - use mo_netcdf, only: NcDataset, NcDimension, NcVariable - use mo_string_utils, only: num2str - use mo_common_variables, only: processMatrix - use mo_mrm_constants, only: nRoutingStates, nodata_dp, nodata_i4 - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - basin_mrm, & - L0_cellCoor, & - L0_Id, & - L0_areaCell, & - L1_Id, & - L1_areaCell, & - L1_L11_Id, & - L11_Qmod, & - L11_qOUT, & - L11_qTIN, & - L11_qTR, & - L11_K, & - L11_xi, & - L11_C1, & - L11_C2, & - L11_FracFPimp, & - L11_cellCoor, & - L11_Id, & - L11_areaCell, & - L0_draSC, & - L0_draCell, & - L0_streamNet, & - L0_floodPlain, & - L0_L11_Id, & - L11_TSrout, & - L11_L1_Id, & - L11_rowOut, & - L11_colOut, & - L11_fDir, & - L11_upBound_L0, & - L11_downBound_L0, & - L11_leftBound_L0, & - L11_rightBound_L0, & - L11_upBound_L1, & - L11_downBound_L1, & - L11_leftBound_L1, & - L11_rightBound_L1, & - L11_fDir, & - L11_fromN, & - L11_toN, & - L11_rOrder, & - L11_label, & - L11_sink, & - L11_netPerm, & - L11_rowOut, & - L11_colOut, & - L11_fRow, & - L11_fCol, & - L11_tRow, & - L11_tCol, & - L11_length, & - L11_aFloodPlain, & - L11_slope + use mo_message, only : message + use mo_netcdf, only : NcDataset, NcDimension, NcVariable + use mo_string_utils, only : num2str + use mo_common_variables, only : & + processMatrix, level1, nLCoverScene + use mo_mrm_constants, only : nRoutingStates + use mo_common_constants, only : nodata_dp, nodata_i4 + use mo_common_restart, only : write_grid_info + use mo_mrm_global_variables, only : & + level11, & + basin_mrm, & + L1_L11_Id, & + L11_Qmod, & + L11_qOUT, & + L11_qTIN, & + L11_qTR, & + L11_K, & + L11_xi, & + L11_C1, & + L11_C2, & + L11_nLinkFracFPimp, & + L11_TSrout, & + L11_L1_Id, & + L11_rowOut, & + L11_colOut, & + L11_fDir, & + L11_fDir, & + L11_fromN, & + L11_toN, & + L11_rOrder, & + L11_label, & + L11_sink, & + L11_netPerm, & + L11_rowOut, & + L11_colOut, & + L11_fRow, & + L11_fCol, & + L11_tRow, & + L11_tCol, & + L11_length, & + L11_aFloodPlain, & + L11_slope implicit none ! input variables - integer(i4), intent(in) :: iBasin + integer(i4), intent(in) :: iBasin character(256), dimension(:), intent(in) :: OutPath ! list of Output paths per Basin - ! local variables - character(256) :: Fname - integer(i4) :: ii - integer(i4) :: s0 ! start index at level 0 - integer(i4) :: e0 ! end index at level 0 - integer(i4) :: ncols0 ! number of colums at level 0 - integer(i4) :: nrows0 ! number of rows at level 0 - logical, dimension(:,:), allocatable :: mask0 ! mask at level 0 - integer(i4) :: s1 ! start index at level 1 - integer(i4) :: e1 ! end index at level 1 - integer(i4) :: ncols1 ! number of colums at level 1 - integer(i4) :: nrows1 ! number of rows at level 1 - logical, dimension(:,:), allocatable :: mask1 ! mask at level 1 - integer(i4) :: s11 ! start index at level 11 - integer(i4) :: e11 ! end index at level 11 - integer(i4) :: ncols11 ! number of colums at level 11 - integer(i4) :: nrows11 ! number of rows at level 11 - logical, dimension(:,:), allocatable :: mask11 ! mask at level 11 - integer(i4) :: s110 ! start index at pseudo level 110 - integer(i4) :: e110 ! end index at pseudo level 110 - integer(i4) :: ncols110 ! number of colums at pseudo level 110 - integer(i4) :: nrows110 ! number of rows at pseudo level 110 - real(dp), dimension(:,:,:), allocatable :: dummy_d3 ! dummy variable - integer(i4) :: Noutlet ! number of outlets at level 0 - - type(NcDataset) :: nc - type(NcDimension) :: rows0, cols0, rows1, cols1, rows11, cols11, it11 - type(NcDimension) :: links, nout, nts, nproc - type(NcVariable) :: var - - ! get Level0 information about the basin - call get_basin_info_mrm( iBasin, 0, nrows0, ncols0, iStart=s0, iEnd=e0, mask=mask0 ) - ! get Level1 information about the basin - call get_basin_info_mrm( iBasin, 1, nrows1, ncols1, iStart=s1, iEnd=e1, mask=mask1 ) - ! get Level11 information about the basin - call get_basin_info_mrm( iBasin, 11, nrows11, ncols11, iStart=s11, iEnd=e11, mask=mask11 ) - ! get Level110 information about the basin - call get_basin_info_mrm( iBasin, 110, nrows110, ncols110, iStart=s110, iEnd=e110) + ! local variables + character(256) :: Fname + integer(i4) :: ii + integer(i4) :: s1 ! start index at level 1 + integer(i4) :: e1 ! end index at level 1 + logical, dimension(:, :), allocatable :: mask1 ! mask at level 1 + integer(i4) :: s11 ! start index at level 11 + integer(i4) :: e11 ! end index at level 11 + integer(i4) :: ncols11 ! number of colums at level 11 + integer(i4) :: nrows11 ! number of rows at level 11 + logical, dimension(:, :), allocatable :: mask11 ! mask at level 11 + real(dp), dimension(:, :, :), allocatable :: dummy_d3 ! dummy variable + + type(NcDataset) :: nc + type(NcDimension) :: rows1, cols1, rows11, cols11, it11, lcscenes + type(NcDimension) :: links, nts, nproc + type(NcVariable) :: var + + ! get Level1 and Level11 information about the basin + s1 = level1(iBasin)%iStart + e1 = level1(iBasin)%iEnd + mask1 = level1(iBasin)%mask + s11 = level11(iBasin)%iStart + e11 = level11(iBasin)%iEnd + mask11 = level11(iBasin)%mask + ncols11 = level11(iBasin)%ncols + nrows11 = level11(iBasin)%nrows + allocate(dummy_d3(nrows11, ncols11, nRoutingStates)) ! set restart file name - Fname = trim(OutPath(iBasin)) // 'mRM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' - ! set number of outlets - Noutlet = basin_mrm%L0_Noutlet(iBasin) + Fname = trim(OutPath(iBasin)) // 'mRM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' call message(' Writing mRM restart file to ' // trim(Fname) // ' ...') - nc = NcDataset(fname,"w") - rows0 = nc%setDimension("nrows0", nrows0) - cols0 = nc%setDimension("ncols0", ncols0) - rows1 = nc%setDimension("nrows1", nrows1) - cols1 = nc%setDimension("ncols1", ncols1) - rows11 = nc%setDimension("nrows11", nrows11) - cols11 = nc%setDimension("ncols11", ncols11) - it11 = nc%setDimension("nIT", nRoutingStates) - links = nc%setDimension("nLinks", size(L11_length(s11:e11))) - nout = nc%setDimension("Noutlet", Noutlet) - nts = nc%setDimension("TS", 1) - nproc = nc%setDimension("Nprocesses", size(processMatrix, dim=1)) + nc = NcDataset(fname, "w") - ! add processMatrix - var = nc%setVariable("ProcessMatrix","i32",(/nproc/)) - call var%setFillValue(nodata_i4) - call var%setData(processMatrix(:, 1)) - call var%setAttribute("long_name","Process Matrix") - - var = nc%setVariable("L0_rowCoor","i32",(/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_cellCoor(s0:e0,1), mask0, nodata_i4)) - call var%setAttribute("long_name","row coordinates at Level 0") - - var = nc%setVariable("L0_colCoor", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_cellCoor(s0:e0,2), mask0, nodata_i4)) - call var%setAttribute("long_name", "col coordinates at Level 0") + call write_grid_info(level1(iBasin), "1", nc) + call write_grid_info(level11(iBasin), "11", nc) - var = nc%setVariable("L0_Id", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_Id(s0:e0), mask0, nodata_i4)) - call var%setAttribute("long_name", "cell IDs at level 0") + rows1 = nc%getDimension("nrows1") + cols1 = nc%getDimension("ncols1") + rows11 = nc%getDimension("nrows11") + cols11 = nc%getDimension("ncols11") - var = nc%setVariable("L0_areaCell", "f64", (/rows0, cols0/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L0_areaCell(s0:e0), mask0, nodata_dp)) - call var%setAttribute("long_name", "Area of a cell at level-0 [m2]") + it11 = nc%setDimension("nIT", nRoutingStates) + links = nc%setDimension("nLinks", size(L11_length(s11 : e11))) + nts = nc%setDimension("TS", 1) + nproc = nc%setDimension("Nprocesses", size(processMatrix, dim = 1)) + lcscenes = nc%setDimension("LCoverScenes", nLCoverScene) - var = nc%setVariable("L1_basin_Mask", "i32", (/rows1, cols1/)) - call var%setFillValue(nodata_i4) - call var%setData(merge( 1_i4, 0_i4, & - reshape(basin_mrm%L1_Mask(basin_mrm%L1_iStartMask(iBasin):basin_mrm%L1_iEndMask(iBasin)),& - (/nrows1,ncols1/)))) - call var%setAttribute("long_name", "Mask at Level 1") - var = nc%setVariable("L1_Id", "i32", (/rows1, cols1/)) + ! add processMatrix + var = nc%setVariable("ProcessMatrix", "i32", (/nproc/)) call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_Id(s1:e1), mask1, nodata_i4)) - call var%setAttribute("long_name", "cell IDs at level 1") + call var%setData(processMatrix(:, 1)) + call var%setAttribute("long_name", "Process Matrix") - var = nc%setVariable("L1_areaCell", "f64", (/rows1, cols1/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L1_areaCell(s1:e1), mask1, nodata_dp)) - call var%setAttribute("long_name", "Effective area of cell at this level [km2]") - var = nc%setVariable("L1_L11_Id", "i32", (/rows1, cols1/)) call var%setFillValue(nodata_i4) - call var%setData(unpack(L1_L11_Id(s1:e1), mask1, nodata_i4)) + call var%setData(unpack(L1_L11_Id(s1 : e1), mask1, nodata_i4)) call var%setAttribute("long_name", "Mapping of L1 Id on L11") var = nc%setVariable("L11_Qmod", "f64", (/rows11, cols11/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_Qmod(s11:e11), mask11, nodata_dp)) + call var%setData(unpack(L11_Qmod(s11 : e11), mask11, nodata_dp)) call var%setAttribute("long_name", "simulated discharge at each node at level 11") var = nc%setVariable("L11_qOUT", "f64", (/rows11, cols11/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_qOUT(s11:e11), mask11, nodata_dp)) + call var%setData(unpack(L11_qOUT(s11 : e11), mask11, nodata_dp)) call var%setAttribute("long_name", "Total outflow from cells L11 at time tt at level 11") - allocate( dummy_d3( nrows11, ncols11, nRoutingStates ) ) - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L11_qTIN(s11:e11,ii), mask11, nodata_dp ) + do ii = 1, size(dummy_d3, 3) + dummy_d3(:, :, ii) = unpack(L11_qTIN(s11 : e11, ii), mask11, nodata_dp) end do var = nc%setVariable("L11_qTIN", "f64", (/rows11, cols11, it11/)) call var%setFillValue(nodata_dp) call var%setData(dummy_d3) call var%setAttribute("long_name", "Total discharge inputs at t-1 and t at level 11") - do ii = 1, size( dummy_d3, 3 ) - dummy_d3(:,:,ii) = unpack( L11_qTR(s11:e11,ii), mask11, nodata_dp ) + do ii = 1, size(dummy_d3, 3) + dummy_d3(:, :, ii) = unpack(L11_qTR(s11 : e11, ii), mask11, nodata_dp) end do var = nc%setVariable("L11_qTR", "f64", (/rows11, cols11, it11/)) call var%setFillValue(nodata_dp) @@ -270,243 +206,147 @@ subroutine mrm_write_restart(iBasin, OutPath) var = nc%setVariable("L11_K", "f64", (/rows11, cols11/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_K(s11:e11), mask11, nodata_dp)) + call var%setData(unpack(L11_K(s11 : e11), mask11, nodata_dp)) call var%setAttribute("long_name", "kappa: Muskingum travel time parameter at level 11") var = nc%setVariable("L11_xi", "f64", (/rows11, cols11/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_xi(s11:e11), mask11, nodata_dp)) + call var%setData(unpack(L11_xi(s11 : e11), mask11, nodata_dp)) call var%setAttribute("long_name", "xi: Muskingum diffusion parameter at level 11") var = nc%setVariable("L11_C1", "f64", (/rows11, cols11/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_C1(s11:e11), mask11, nodata_dp)) + call var%setData(unpack(L11_C1(s11 : e11), mask11, nodata_dp)) call var%setAttribute("long_name", "Routing parameter C1=f(K,xi, DT) (Chow, 25-41) at level 11") var = nc%setVariable("L11_C2", "f64", (/rows11, cols11/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_C2(s11:e11), mask11, nodata_dp)) + call var%setData(unpack(L11_C2(s11 : e11), mask11, nodata_dp)) call var%setAttribute("long_name", "Routing parameter C2=f(K,xi, DT) (Chow, 25-41) at level 11") - var = nc%setVariable("L11_FracFPimp", "f64", (/rows11, cols11/)) + deallocate(dummy_d3) + allocate(dummy_d3(nrows11, ncols11, nLCoverScene)) + do ii = 1, size(dummy_d3, 3) + dummy_d3(:, :, ii) = unpack(L11_nLinkFracFPimp(s11 : e11, ii), mask11, nodata_dp) + end do + var = nc%setVariable("L11_nLinkFracFPimp", "f64", (/rows11, cols11, lcscenes/)) call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_FracFPimp(s11:e11), mask11, nodata_dp)) + call var%setData(dummy_d3) call var%setAttribute("long_name", "Fraction of the flood plain with impervious cover at level 11") ! ---------------------------------------------------------- ! L11 config set ! ---------------------------------------------------------- - var = nc%setVariable("L11_basin_Mask", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(merge(1_i4, 0_i4, & - reshape(basin_mrm%L11_Mask(basin_mrm%L11_iStartMask(iBasin):basin_mrm%L11_iEndMask(iBasin)),& - (/nrows11,ncols11/)))) - call var%setAttribute("long_name", "Mask at Level 11") var = nc%setVariable("L11_TSrout", "i32", (/nts/)) call var%setFillValue(nodata_i4) call var%setData(L11_TSrout(iBasin)) call var%setAttribute("long_name", "routing resolution at Level 11") call var%setAttribute("units", "s") - - var = nc%setVariable("L11_rowCoor", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_cellCoor(s11:e11,1), mask11, nodata_i4)) - call var%setAttribute("long_name", "row coordinates at Level 11") - - var = nc%setVariable("L11_colCoor", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_cellCoor(s11:e11,2), mask11, nodata_i4)) - call var%setAttribute("long_name", "col coordinates at Level 11") - - var = nc%setVariable("L11_Id", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_Id(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "cell Ids at Level 11") - - var = nc%setVariable("L11_areaCell", "f64", (/rows11, cols11/)) - call var%setFillValue(nodata_dp) - call var%setData(unpack(L11_areaCell(s11:e11), mask11, nodata_dp)) - call var%setAttribute("long_name", "cell area at Level 11") var = nc%setVariable("L11_fDir", "i32", (/rows11, cols11/)) call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_fDir(s11:e11), mask11, nodata_i4)) + call var%setData(unpack(L11_fDir(s11 : e11), mask11, nodata_i4)) call var%setAttribute("long_name", "flow Direction at Level 11") var = nc%setVariable("L11_rowOut", "i32", (/rows11, cols11/)) call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_rowOut(s11:e11), mask11, nodata_i4)) + call var%setData(unpack(L11_rowOut(s11 : e11), mask11, nodata_i4)) call var%setAttribute("long_name", "Grid vertical location of the Outlet at Level 11") var = nc%setVariable("L11_colOut", "i32", (/rows11, cols11/)) call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_colOut(s11:e11), mask11, nodata_i4)) + call var%setData(unpack(L11_colOut(s11 : e11), mask11, nodata_i4)) call var%setAttribute("long_name", "Grid horizontal location of the Outlet at Level 11") - var = nc%setVariable("L11_upBound_L0", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_upBound_L0(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Row start at finer level-0 scale of Level 11 cell") - - var = nc%setVariable("L11_downBound_L0", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_downBound_L0(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Row end at finer level-0 scale of Level 11 cell") - - var = nc%setVariable("L11_leftBound_L0", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_leftBound_L0(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Col start at finer level-0 scale of Level 11 cell") - - var = nc%setVariable("L11_rightBound_L0", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_rightBound_L0(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Col end at finer level-0 scale of Level 11 cell") - var = nc%setVariable("L11_fromN", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_fromN(s11:e11)) + call var%setData(L11_fromN(s11 : e11)) call var%setAttribute("long_name", "From Node") var = nc%setVariable("L11_toN", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_toN(s11:e11)) + call var%setData(L11_toN(s11 : e11)) call var%setAttribute("long_name", "To Node") var = nc%setVariable("L11_rOrder", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_rOrder(s11:e11)) + call var%setData(L11_rOrder(s11 : e11)) call var%setAttribute("long_name", "Network routing order at Level 11") var = nc%setVariable("L11_label", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_label(s11:e11)) + call var%setData(L11_label(s11 : e11)) call var%setAttribute("long_name", "Label Id [0='', 1=HeadWater, 2=Sink] at Level 11") var = nc%setVariable("L11_sink", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(merge( 1_i4, 0_i4, L11_sink(s11:e11))) + call var%setData(merge(1_i4, 0_i4, L11_sink(s11 : e11))) call var%setAttribute("long_name", ".true. if sink node reached at Level 11") var = nc%setVariable("L11_netPerm", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_netPerm(s11:e11)) + call var%setData(L11_netPerm(s11 : e11)) call var%setAttribute("long_name", "Routing sequence (permutation of L11_rOrder) at Level 11") var = nc%setVariable("L11_fRow", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_fRow(s11:e11)) + call var%setData(L11_fRow(s11 : e11)) call var%setAttribute("long_name", "From row in L0 grid at Level 11") var = nc%setVariable("L11_fCol", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_fCol(s11:e11)) + call var%setData(L11_fCol(s11 : e11)) call var%setAttribute("long_name", "From col in L0 grid at Level 11") var = nc%setVariable("L11_tRow", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_tRow(s11:e11)) + call var%setData(L11_tRow(s11 : e11)) call var%setAttribute("long_name", "To row in L0 grid at Level 11") var = nc%setVariable("L11_tCol", "i32", (/links/)) call var%setFillValue(nodata_i4) - call var%setData(L11_tCol(s11:e11)) + call var%setData(L11_tCol(s11 : e11)) call var%setAttribute("long_name", "To Col in L0 grid at Level 11") var = nc%setVariable("L11_length", "f64", (/links/)) call var%setFillValue(nodata_dp) - call var%setData(L11_length(s11:e11)) + call var%setData(L11_length(s11 : e11)) call var%setAttribute("long_name", "Total length of river link [m]") var = nc%setVariable("L11_aFloodPlain", "f64", (/links/)) call var%setFillValue(nodata_dp) - call var%setData(L11_aFloodPlain(s11:e11)) + call var%setData(L11_aFloodPlain(s11 : e11)) call var%setAttribute("long_name", "Area of the flood plain [m2]") var = nc%setVariable("L11_slope", "f64", (/links/)) call var%setFillValue(nodata_dp) - call var%setData(L11_slope(s11:e11)) + call var%setData(L11_slope(s11 : e11)) call var%setAttribute("long_name", "Average slope of river link") - var = nc%setVariable("L0_draCell", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_draCell(s110:e110), mask0, nodata_i4)) - call var%setAttribute("long_name", "Draining cell id at L11 of ith cell of L0") - - var = nc%setVariable("L0_streamNet", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_streamNet(s110:e110), mask0, nodata_i4)) - call var%setAttribute("long_name", "Stream network") - - var = nc%setVariable("L0_floodPlain", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_floodPlain(s110:e110), mask0, nodata_i4)) - call var%setAttribute("long_name", "Floodplains of stream i") - - var = nc%setVariable("L0_draSC", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_draSC(s110:e110), mask0, nodata_i4)) - call var%setAttribute("long_name", "Floodplains of stream i") - - var = nc%setVariable("L0_L11_Id", "i32", (/rows0, cols0/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L0_L11_Id(s110:e110), mask0, nodata_i4)) - call var%setAttribute("long_name", "Mapping of L11 Id on L0") - var = nc%setVariable("L11_L1_Id", "i32", (/rows11, cols11/)) call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_L1_Id(s11:e11), mask11, nodata_i4)) + call var%setData(unpack(L11_L1_Id(s11 : e11), mask11, nodata_i4)) call var%setAttribute("long_name", "Mapping of L1 Id on L11") - var = nc%setVariable("L11_upBound_L1", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_upBound_L1(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Row start at finer level-1 scale") - - var = nc%setVariable("L11_downBound_L1", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack( L11_downBound_L1(s11:e11), mask11, nodata_i4 )) - call var%setAttribute("long_name", "Row end at finer level-1 scale") - - var = nc%setVariable("L11_leftBound_L1", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_leftBound_L1(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Col start at finer level-1 scale") - - var = nc%setVariable("L11_rightBound_L1", "i32", (/rows11, cols11/)) - call var%setFillValue(nodata_i4) - call var%setData(unpack(L11_rightBound_L1(s11:e11), mask11, nodata_i4)) - call var%setAttribute("long_name", "Col start at finer level-1 scale") - - var = nc%setVariable("L0_RowOutletCoord", "i32", (/nout/)) - call var%setFillValue(nodata_i4) - call var%setData(basin_mrm%L0_rowOutlet(:Noutlet, iBasin)) - call var%setAttribute("long_name", "Row outlet coordinates at level 0") - - var = nc%setVariable("L0_ColOutletCoord", "i32", (/nout/)) - call var%setFillValue(nodata_i4) - call var%setData(basin_mrm%L0_colOutlet(:Noutlet, iBasin)) - call var%setAttribute("long_name", "Column outlet coordinates at level 0") - var = nc%setVariable("gaugeNodeList", "i32", & - (/nc%setDimension("Ngauges", size(basin_mrm%gaugeNodeList(iBasin,:)))/) & - ) + (/nc%setDimension("Ngauges", size(basin_mrm(iBasin)%gaugeNodeList(:)))/) & + ) call var%setFillValue(nodata_i4) - call var%setData(basin_mrm%gaugeNodeList(iBasin,:)) + call var%setData(basin_mrm(iBasin)%gaugeNodeList(:)) call var%setAttribute("long_name", "cell ID of gauges") var = nc%setVariable("InflowGaugeNodeList", "i32", & - (/nc%setDimension("nInflowGauges", size(basin_mrm%InflowGaugeNodeList(iBasin,:)))/) & - ) + (/nc%setDimension("nInflowGauges", size(basin_mrm(iBasin)%InflowGaugeNodeList(:)))/) & + ) call var%setFillValue(nodata_i4) - call var%setData(basin_mrm%InflowGaugeNodeList(iBasin,:)) + call var%setData(basin_mrm(iBasin)%InflowGaugeNodeList(:)) call var%setAttribute("long_name", "cell ID of gauges") ! free dummy variables - deallocate( dummy_d3 ) + deallocate(dummy_d3) call nc%close() - + end subroutine mrm_write_restart ! ------------------------------------------------------------------ @@ -565,20 +405,21 @@ end subroutine mrm_write_restart ! because multiple outlets could exist ! subroutine mrm_read_restart_states(iBasin, InPath) - use mo_netcdf, only: NcDataset, NcVariable - use mo_string_utils, only: num2str - use mo_mrm_constants, only: nRoutingStates - use mo_mrm_tools, only: get_basin_info_mrm - use mo_mrm_global_variables, only: & - L11_Qmod, & - L11_Qout, & - L11_qTIN, & - L11_qTR, & - L11_K, & - L11_xi, & - L11_C1, & - L11_C2, & - L11_FracFPimp + use mo_netcdf, only : NcDataset, NcVariable + use mo_string_utils, only : num2str + use mo_mrm_constants, only : nRoutingStates + use mo_common_variables, only : nLCoverScene + use mo_mrm_global_variables, only : & + level11, & + L11_Qmod, & + L11_Qout, & + L11_qTIN, & + L11_qTR, & + L11_K, & + L11_xi, & + L11_C1, & + L11_C2, & + L11_nLinkFracFPimp implicit none ! input variables integer(i4), intent(in) :: iBasin @@ -587,75 +428,77 @@ subroutine mrm_read_restart_states(iBasin, InPath) integer(i4) :: ii integer(i4) :: s11 ! start index at level 11 integer(i4) :: e11 ! end index at level 11 - integer(i4) :: ncols11 ! number of colums at level 11 - integer(i4) :: nrows11 ! number of rows at level 11 - integer(i4) :: ncells11 ! number of cells at level 11 - logical, dimension(:,:), allocatable :: mask11 ! mask at level 11 - real(dp), dimension(:,:), allocatable :: dummyD2 ! dummy, 2 dimension - real(dp), dimension(:,:,:), allocatable :: dummyD3 ! dummy, 3 dimension - character(256) :: fname - type(NcDataset) :: nc + logical, dimension(:, :), allocatable :: mask11 ! mask at level 11 + real(dp), dimension(:, :), allocatable :: dummyD2 ! dummy, 2 dimension + real(dp), dimension(:, :, :), allocatable :: dummyD3 ! dummy, 3 dimension + character(256) :: fname + type(NcDataset) :: nc type(NcVariable) :: var - + ! set file name - fname = trim(InPath) // 'mRM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' - + fname = trim(InPath) // 'mRM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' + ! get basin info at L11 including ncells, start, end, and mask - call get_basin_info_mrm(iBasin, 11, nrows11, ncols11, ncells=ncells11, iStart=s11, iEnd=e11, mask=mask11) + s11 = level11(iBasin)%iStart + e11 = level11(iBasin)%iEnd + mask11 = level11(iBasin)%mask nc = NcDataset(fname, "r") ! simulated discharge at each node var = nc%getVariable("L11_Qmod") call var%getData(dummyD2) - L11_Qmod(s11:e11) = pack( dummyD2, mask11 ) + L11_Qmod(s11 : e11) = pack(dummyD2, mask11) ! Total outflow from cells L11 at time tt var = nc%getVariable("L11_qOUT") call var%getData(dummyD2) - L11_qOUT(s11:e11) = pack( dummyD2, mask11 ) + L11_qOUT(s11 : e11) = pack(dummyD2, mask11) ! Total discharge inputs at t-1 and t var = nc%getVariable("L11_qTIN") call var%getData(dummyD3) do ii = 1, nRoutingStates - L11_qTIN(s11:e11,ii) = pack( dummyD3(:,:,ii), mask11 ) + L11_qTIN(s11 : e11, ii) = pack(dummyD3(:, :, ii), mask11) end do ! Routed outflow leaving a node var = nc%getVariable("L11_qTR") call var%getData(dummyD3) do ii = 1, nRoutingStates - L11_qTR(s11:e11,ii) = pack( dummyD3(:,:,ii), mask11 ) + L11_qTR(s11 : e11, ii) = pack(dummyD3(:, :, ii), mask11) end do ! kappa: Muskingum travel time parameter. var = nc%getVariable("L11_K") call var%getData(dummyD2) - L11_K(s11:e11) = pack( dummyD2, mask11 ) + L11_K(s11 : e11) = pack(dummyD2, mask11) ! xi: Muskingum diffusion parameter var = nc%getVariable("L11_xi") call var%getData(dummyD2) - L11_xi(s11:e11) = pack( dummyD2, mask11 ) + L11_xi(s11 : e11) = pack(dummyD2, mask11) ! Routing parameter C1=f(K,xi, DT) (Chow, 25-41) var = nc%getVariable("L11_C1") call var%getData(dummyD2) - L11_C1(s11:e11) = pack( dummyD2, mask11 ) + L11_C1(s11 : e11) = pack(dummyD2, mask11) ! Routing parameter C2 =f(K,xi, DT) (Chow, 25-41) var = nc%getVariable("L11_C2") call var%getData(dummyD2) - L11_C2(s11:e11) = pack( dummyD2, mask11 ) + L11_C2(s11 : e11) = pack(dummyD2, mask11) ! Fraction of the flood plain with impervious cover - var = nc%getVariable("L11_FracFPimp") - call var%getData(dummyD2) - L11_FracFPimp(s11:e11) = pack( dummyD2, mask11 ) + var = nc%getVariable("L11_nLinkFracFPimp") + deallocate(dummyD3) + call var%getData(dummyD3) + do ii = 1, nLCoverScene + L11_nLinkFracFPimp(s11 : e11, ii) = pack(dummyD3(:, :, ii), mask11) + end do ! free memory - deallocate( dummyD2, dummyD3 ) + deallocate(dummyD2, dummyD3) end subroutine mrm_read_restart_states @@ -715,160 +558,67 @@ end subroutine mrm_read_restart_states ! Mar 2016, David Schaefer - mo_netcdf ! Nov 2016, Stephan Thober - added L11_TSrout, ProcessMatrix - subroutine mrm_read_restart_config( iBasin, InPath ) - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_kind, only: i4, dp - use mo_append, only: append - use mo_netcdf, only: NcDataset, NcVariable - use mo_mrm_constants, only: nodata_dp, nodata_i4 - use mo_mrm_tools, only: get_basin_info_mrm, calculate_grid_properties - use mo_common_variables, only: processMatrix - use mo_mrm_global_variables, only: & - L0_Basin, & ! check whether L0_Basin should be read - nBasins, & ! Number of Basins - basin_mrm, & - resolutionHydrology, & - resolutionRouting, & - level1, & - level11, & - L0_cellCoor , & - L0_Id , & ! Ids of grid at level-0 - L0_areaCell, & ! Ids of grid at level-0 - L1_Id, & - L1_areaCell, & ! [km2] Effective area of cell at this level - L1_L11_Id, & - L11_cellCoor, & ! cell Coordinates at Level 11 - L11_Id, & ! cell Ids at Level 11 - L11_areaCell, & - L11_nCells, & ! Number of Cells at Level 11 - L1_nCells, & ! Number of Cells at Level 1 - L0_nCells, & ! Number of Cells at Level 0 - L0_draSC, & - L0_L11_Id, & - L11_TSrout, & - L11_L1_Id, & - L11_fDir, & - L11_rowOut, & - L11_colOut, & - L11_upBound_L0, & - L11_downBound_L0, & - L11_leftBound_L0, & - L11_rightBound_L0, & - L11_upBound_L1, & - L11_downBound_L1, & - L11_leftBound_L1, & - L11_rightBound_L1, & - L11_fromN, & - L11_toN, & - L11_rOrder, & - L11_label, & - L11_sink, & - L11_nOutlets, & - L11_netPerm, & - L11_fRow, & - L11_fCol, & - L11_tRow, & - L11_tCol, & - L0_draCell, & - L0_streamNet, & - L0_floodPlain, & - L11_length, & - L11_aFloodPlain, & - L11_slope + subroutine mrm_read_restart_config(iBasin, InPath) + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_kind, only : i4, dp + use mo_append, only : append + use mo_netcdf, only : NcDataset, NcVariable + use mo_common_constants, only : nodata_dp + use mo_common_variables, only : processMatrix + use mo_mrm_global_variables, only : & + basin_mrm, & + level11, & + L1_L11_Id, & + L11_TSrout, & + L11_L1_Id, & + L11_fDir, & + L11_rowOut, & + L11_colOut, & + L11_fromN, & + L11_toN, & + L11_rOrder, & + L11_label, & + L11_sink, & + L11_nOutlets, & + L11_netPerm, & + L11_fRow, & + L11_fCol, & + L11_tRow, & + L11_tCol, & + L11_length, & + L11_aFloodPlain, & + L11_slope + use mo_common_variables, only : & + level1, & + nBasins ! Number of Basins implicit none - integer(i4), intent(in) :: iBasin + integer(i4), intent(in) :: iBasin character(256), intent(in) :: InPath ! list of Output paths per Basin ! local variables character(256) :: fname ! local variables - integer(i4) :: nrows0 ! Number of rows at level 0 - integer(i4) :: ncols0 ! Number of cols at level 0 - logical, allocatable :: mask0(:, :) ! Mask at Level 0 - integer(i4) :: nrows1 ! Number of rows at level 1 - integer(i4) :: ncols1 ! Number of cols at level 1 logical, allocatable :: mask1(:, :) ! Mask at Level 1 - integer(i4) :: nrows11 ! Number of rows at level 11 - integer(i4) :: ncols11 ! Number of cols at level 11 logical, allocatable :: mask11(:, :) ! Mask at Level 11 - integer(i4) :: nCells11 ! Number of cells at lev. 11 - real(dp) :: xllcorner0, yllcorner0 - real(dp) :: cellsize0 - integer(i4) :: iStart0, iEnd0 ! DUMMY variables - integer(i4) :: Noutlet - integer(i4) :: old_Noutlet integer(i4), allocatable :: dummyI1(:) ! dummy, 1 dimension I4 - integer(i4), allocatable :: dummy(:, :) integer(i4), allocatable :: dummyI2(:, :) ! dummy, 2 dimension I4 - integer(i4), allocatable :: dummyI22(:, :) ! 2nd dummy, 2 dimension I4 - real(dp), allocatable :: dummyD1(:) ! dummy, 1 dimension DP - real(dp), allocatable :: dummyD2(:, :) ! dummy, 2 dimension - type(NcDataset) :: nc - type(NcVariable) :: var + real(dp), allocatable :: dummyD1(:) ! dummy, 1 dimension DP + type(NcDataset) :: nc + type(NcVariable) :: var ! set file name fname = trim(InPath) // 'mRM_restart_' // trim(num2str(iBasin, '(i3.3)')) // '.nc' - call message(' Reading mRM restart file: ', trim(adjustl(Fname)),' ...') + call message(' Reading mRM restart file: ', trim(adjustl(Fname)), ' ...') - if (iBasin .eq. 1) then - allocate(level1%nrows(nBasins)) - allocate(level1%ncols(nBasins)) - allocate(level1%xllcorner(nBasins)) - allocate(level1%yllcorner(nBasins)) - allocate(level1%cellsize(nBasins)) - allocate(level1%nodata_value(nBasins)) - - allocate(level11%nrows(nBasins)) - allocate(level11%ncols(nBasins)) - allocate(level11%xllcorner(nBasins)) - allocate(level11%yllcorner(nBasins)) - allocate(level11%cellsize(nBasins)) - allocate(level11%nodata_value(nBasins)) - - allocate(basin_mrm%L1_iStart(nBasins)) - allocate(basin_mrm%L1_iEnd (nBasins)) - allocate(basin_mrm%L1_iStartMask(nBasins)) - allocate(basin_mrm%L1_iEndMask (nBasins)) - - allocate(basin_mrm%L11_iStart(nBasins)) - allocate(basin_mrm%L11_iEnd(nBasins)) - allocate(basin_mrm%L11_iStartMask(nBasins)) - allocate(basin_mrm%L11_iEndMask(nBasins)) - - allocate(basin_mrm%L0_Noutlet(nBasins)) - allocate(basin_mrm%L0_rowOutlet(1, nBasins)) - allocate(basin_mrm%L0_colOutlet(1, nBasins)) - basin_mrm%L0_Noutlet = nodata_i4 - basin_mrm%L0_rowOutlet = nodata_i4 - basin_mrm%L0_colOutlet = nodata_i4 - end if - - ! grid properties - call get_basin_info_mrm(iBasin, 0, nrows0, ncols0, iStart= iStart0, iEnd=iEnd0, mask=mask0, & - xllcorner=xllcorner0, yllcorner=yllcorner0, cellsize=cellsize0) - - !call get_basin_info_mrm( iBasin, 1, nrows1, ncols1) - call calculate_grid_properties(nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - resolutionHydrology(iBasin) , & - level1%nrows(iBasin), level1%ncols(iBasin), level1%xllcorner(iBasin), & - level1%yllcorner(iBasin), level1%cellsize(iBasin), level1%nodata_value(iBasin)) - ! - ! level-1 information - call calculate_grid_properties(nrows0, ncols0, xllcorner0, yllcorner0, cellsize0, nodata_dp, & - resolutionRouting(iBasin), & - level11%nrows(iBasin), level11%ncols(iBasin), level11%xllcorner(iBasin), & - level11%yllcorner(iBasin), level11%cellsize(iBasin), level11%nodata_value(iBasin)) - - call get_basin_info_mrm(iBasin, 1, nrows1, ncols1) - - call get_basin_info_mrm(iBasin, 11, nrows11, ncols11) + ! get basin info at L11 mask + mask1 = level1(iBasin)%mask + mask11 = level11(iBasin)%mask nc = NcDataset(fname, "r") @@ -876,208 +626,36 @@ subroutine mrm_read_restart_config( iBasin, InPath ) ! Read Process Matrix for check <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< var = nc%getVariable("ProcessMatrix") - allocate(dummyI1(size(processMatrix, dim=1))) + allocate(dummyI1(size(processMatrix, dim = 1))) call var%getData(dummyI1) if (dummyI1(8) .ne. processMatrix(8, 1)) then - call message('***ERROR: process description for routing') - call message('***ERROR: given in restart file does not match') - call message('***ERROR: that in namelist') - call message('***ERROR: restart file value:. ' // num2str(dummyI1(8), '(i2)')) - call message('***ERROR: namelist value:..... ' // num2str(processMatrix(8, 1), '(i2)')) - stop 'ERROR: mrm_read_restart_config' + call message('***ERROR: process description for routing') + call message('***ERROR: given in restart file does not match') + call message('***ERROR: that in namelist') + call message('***ERROR: restart file value:. ' // num2str(dummyI1(8), '(i2)')) + call message('***ERROR: namelist value:..... ' // num2str(processMatrix(8, 1), '(i2)')) + stop 'ERROR: mrm_read_restart_config' end if deallocate(dummyI1) - - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! Read L0 variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! check whether L0 data should be read - if (iBasin .eq. 1) then - ! read L0 cellCoor - allocate(dummyI22(count(mask0),2)) - - var = nc%getVariable("L0_rowCoor") - call var%getData(dummyI2) - dummyI22(:,1) = pack(dummyI2, mask0) - - var = nc%getVariable("L0_colCoor") - call var%getData(dummyI2) - dummyI22(:,2) = pack(dummyI2, mask0) - - call append(L0_cellCoor, dummyI22) - deallocate(dummyI22) - - var = nc%getVariable("L0_Id") - call var%getData(dummyI2) - call append(L0_Id, pack(dummyI2, mask0)) - - var = nc%getVariable("L0_areaCell") - call var%getData(dummyD2) - call append( L0_areaCell, pack(dummyD2, mask0) ) - - else - if ( L0_Basin(iBasin) .ne. L0_Basin(iBasin - 1) ) then - ! read L0 cellCoor - allocate(dummyI22(count(mask0), 2)) - - var = nc%getVariable("L0_rowCoor") - call var%getData(dummyI2) - dummyI22(:,1) = pack( dummyI2, mask0 ) - - var = nc%getVariable("L0_colCoor") - call var%getData(dummyI2) - dummyI22(:,2) = pack(dummyI2, mask0) - - call append(L0_cellCoor, dummyI22) - deallocate(dummyI22) - - var = nc%getVariable("L0_Id") - call var%getData(dummyI2) - call append(L0_Id, pack(dummyI2, mask0)) - - var = nc%getVariable("L0_areaCell") - call var%getData(dummyD2) - call append(L0_areaCell, pack(dummyD2, mask0)) - - end if - end if ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! Read L1 variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! read L1 mask - var = nc%getVariable("L1_basin_Mask") - call var%getData(dummyI2) - mask1 = (dummyI2 .eq. 1_i4) - call append(basin_mrm%L1_Mask, reshape((dummyI2 .eq. 1_i4), (/nrows1*ncols1/))) - - ! update basin database - if( iBasin .eq. 1 ) then - basin_mrm%L1_iStart(iBasin) = 1 - basin_mrm%L1_iStartMask(iBasin) = 1 - else - basin_mrm%L1_iStart(iBasin) = basin_mrm%L1_iEnd(iBasin-1) + 1 - basin_mrm%L1_iStartMask(iBasin) = basin_mrm%L1_iEndMask(iBasin-1) + 1 - end if - basin_mrm%L1_iEnd(iBasin) = basin_mrm%L1_iStart(iBasin) + count(mask1) - 1 - basin_mrm%L1_iEndMask(iBasin) = basin_mrm%L1_iStartMask(iBasin) + nrows1*ncols1 - 1 - - ! get level1 information including mask - call get_basin_info_mrm(iBasin, 1, nrows1, ncols1, mask=mask1) - ! - var = nc%getVariable("L1_Id") - call var%getData(dummyI2) - call append(L1_Id, pack(dummyI2, mask1)) - var = nc%getVariable("L1_L11_Id") call var%getData(dummyI2) call append(L1_L11_Id, pack(dummyI2, mask1)) - ! allocate( dummyD2( nrows1, ncols1 ) ) - var = nc%getVariable("L1_areaCell") - call var%getData(dummyD2) - call append(L1_areaCell, pack( dummyD2, mask1)) - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! Read L11 variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! read L11 mask - var = nc%getVariable("L11_basin_Mask") - call var%getData(dummyI2) - mask11 = (dummyI2 .eq. 1_i4) - call append(basin_mrm%L11_Mask, reshape(mask11, (/nrows11*ncols11/))) - - ! get Number of cells - nCells11 = count(mask11) - ! read L11_TSrout if (iBasin .eq. 1) then - allocate(L11_TSrout(nBasins)) - L11_tsRout = nodata_dp + allocate(L11_TSrout(nBasins)) + L11_tsRout = nodata_dp end if var = nc%getVariable("L11_TSrout") call var%getData(L11_TSrout(iBasin)) - ! update basin database - if (iBasin .eq. 1) then - basin_mrm%L11_iStart(iBasin) = 1 - basin_mrm%L11_iStartMask(iBasin) = 1 - else - basin_mrm%L11_iStart(iBasin) = basin_mrm%L11_iEnd(iBasin-1) + 1 - basin_mrm%L11_iStartMask(iBasin) = basin_mrm%L11_iEndMask(iBasin-1) + 1 - end if - basin_mrm%L11_iEnd(iBasin) = basin_mrm%L11_iStart(iBasin) + nCells11 - 1 - basin_mrm%L11_iEndMask(iBasin) = basin_mrm%L11_iStartMask(iBasin) + nrows11*ncols11 - 1 - - ! read L11 cellCoor - allocate(dummyI22(count(mask11), 2)) - var = nc%getVariable("L11_rowCoor") - call var%getData(dummyI2) - dummyI22(:,1) = pack(dummyI2, mask11) - - var = nc%getVariable("L11_colCoor") - call var%getData(dummyI2) - dummyI22(:,2) = pack(dummyI2, mask11) - call append(L11_cellCoor, dummyI22) - deallocate(dummyI22) - - ! read L11 IDs - var = nc%getVariable("L11_Id") - call var%getData(dummyI2) - call append(L11_Id, pack(dummyI2, mask11)) - - var = nc%getVariable("L11_areaCell") - call var%getData(dummyD2) - call append(L11_areaCell, pack(dummyD2, mask11)) - - ! update Number of cells at Level 11 - L11_nCells = size(L11_Id, 1) - - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! read L0 outlet Coordinates - var = nc%getVariable("L0_RowOutletCoord") - call var%getData(dummyI1) - - Noutlet = size(dummyI1, dim=1) - basin_mrm%L0_Noutlet(iBasin) = Noutlet - deallocate(dummyI2) - allocate(dummyI2(Noutlet, 2)) - dummyI2(:, 1) = dummyI1 - - var = nc%getVariable("L0_ColOutletCoord") - call var%getData(dummyI1) - dummyI2(:, 2) = dummyI1 - - old_Noutlet = size(basin_mrm%L0_rowOutlet, dim=1) - ! store outlet coordinates to basin structure - if (Noutlet .le. old_Noutlet) then - basin_mrm%L0_rowOutlet(:Noutlet, iBasin) = dummyI2(:, 1) - basin_mrm%L0_colOutlet(:Noutlet, iBasin) = dummyI2(:, 2) - else - ! store up to size of old_Noutlet - basin_mrm%L0_rowOutlet(:old_Noutlet, iBasin) = dummyI2(:old_Noutlet, 1) - basin_mrm%L0_colOutlet(:old_Noutlet, iBasin) = dummyI2(:old_Noutlet, 2) - ! enlarge rowOutlet and colOutlet in basin_mrm structure - allocate(dummy(Noutlet - old_Noutlet, nBasins)) - dummy = nodata_i4 - dummy(:, iBasin) = dummyI2(old_Noutlet + 1:, 1) - call append(basin_mrm%L0_rowOutlet, dummy) - dummy(:, iBasin) = dummyI2(old_Noutlet + 1:, 2) - call append(basin_mrm%L0_colOutlet, dummy) - deallocate(dummy) - end if - deallocate(dummyI1, dummyI2) - - ! read L0 draining cell index - var = nc%getVariable("L0_draSC") - call var%getData(dummyI2) - call append(L0_draSC, pack(dummyI2, mask0)) - - ! Mapping of L11 Id on L0 - var = nc%getVariable("L0_L11_Id") - call var%getData(dummyI2) - call append(L0_L11_Id, pack(dummyI2, mask0)) - ! L11 data sets ! Mapping of L1 Ids on L1 var = nc%getVariable("L11_L1_Id") @@ -1090,7 +668,7 @@ subroutine mrm_read_restart_config( iBasin, InPath ) call append(L11_fDir, pack(dummyI2, mask11)) ! append Number of Outlets at Level 11 (where facc == 0 ) call append(L11_nOutlets, count((dummyI2 .eq. 0_i4))) - + ! Grid vertical location of the Outlet var = nc%getVariable("L11_rowOut") call var%getData(dummyI2) @@ -1101,46 +679,6 @@ subroutine mrm_read_restart_config( iBasin, InPath ) call var%getData(dummyI2) call append(L11_colOut, pack(dummyI2, mask11)) - ! Row start at finer level-0 scale - var = nc%getVariable("L11_upBound_L0") - call var%getData(dummyI2) - call append(L11_upBound_L0, pack(dummyI2, mask11)) - - ! Row end at finer level-0 scale - var = nc%getVariable("L11_downBound_L0") - call var%getData(dummyI2) - call append(L11_downBound_L0, pack(dummyI2, mask11)) - - ! Col start at finer level-0 scale - var = nc%getVariable("L11_leftBound_L0") - call var%getData(dummyI2) - call append(L11_leftBound_L0, pack(dummyI2, mask11)) - - ! Col end at finer level-0 scale - var = nc%getVariable("L11_rightBound_L0") - call var%getData(dummyI2) - call append(L11_rightBound_L0, pack(dummyI2, mask11)) - - ! Row start at finer level-11 scale - var = nc%getVariable("L11_upBound_L1") - call var%getData(dummyI2) - call append(L11_upBound_L1, pack(dummyI2, mask11)) - - ! Row end at finer level-11 scale - var = nc%getVariable("L11_downBound_L1") - call var%getData(dummyI2) - call append(L11_downBound_L1, pack(dummyI2, mask11)) - - ! Col start at finer level-11 scale - var = nc%getVariable("L11_leftBound_L1") - call var%getData(dummyI2) - call append(L11_leftBound_L1, pack(dummyI2, mask11)) - - ! Col end at finer level-11 scale - var = nc%getVariable("L11_rightBound_L1") - call var%getData(dummyI2) - call append(L11_rightBound_L1, pack(dummyI2, mask11)) - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! From Node var = nc%getVariable("L11_fromN") @@ -1196,34 +734,19 @@ subroutine mrm_read_restart_config( iBasin, InPath ) ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - var = nc%getVariable("L0_draCell") - call var%getData(dummyI2) - call append(L0_draCell, pack(dummyI2, mask0)) - ! read gaugenodelist var = nc%getVariable("gaugeNodeList") call var%getData(dummyI1) - basin_mrm%gaugeNodeList(iBasin,:) = dummyI1 + basin_mrm(iBasin)%gaugeNodeList(:) = dummyI1 ! read InflowGaugeNodelist - if (basin_mrm%nInflowGauges(iBasin) > 0) then - var = nc%getVariable("InflowGaugeNodeList") - call var%getData(dummyI1) - basin_mrm%InflowgaugeNodeList(iBasin,:) = dummyI1 + if (basin_mrm(iBasin)%nInflowGauges > 0) then + var = nc%getVariable("InflowGaugeNodeList") + call var%getData(dummyI1) + basin_mrm(iBasin)%InflowgaugeNodeList(:) = dummyI1 end if ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - ! L0 data sets - ! Stream network - var = nc%getVariable("L0_streamNet") - call var%getData(dummyI2) - call append(L0_streamNet, pack(dummyI2, mask0)) - - ! Floodplains of stream i - var = nc%getVariable("L0_floodPlain") - call var%getData(dummyI2) - call append(L0_floodPlain, pack(dummyI2, mask0)) - ! L11 network data sets ! [m] Total length of river link var = nc%getVariable("L11_length") @@ -1240,10 +763,6 @@ subroutine mrm_read_restart_config( iBasin, InPath ) call var%getData(dummyD1) call append(L11_slope, dummyD1) - ! update Number of cells at Level 1 and Level 0 - L1_nCells = size(L0_areaCell, 1) - L0_nCells = size(L1_areaCell, 1) - end subroutine mrm_read_restart_config end module mo_mrm_restart diff --git a/src/mRM/mo_mrm_routing.f90 b/src/mRM/mo_mrm_routing.f90 index f05b9046..ff41cdf6 100644 --- a/src/mRM/mo_mrm_routing.f90 +++ b/src/mRM/mo_mrm_routing.f90 @@ -17,7 +17,7 @@ MODULE mo_mrm_routing ! Written Luis Samaniego, Dec 2012 - USE mo_kind, ONLY: i4, dp + USE mo_kind, ONLY : i4, dp IMPLICIT NONE @@ -67,10 +67,6 @@ MODULE mo_mrm_routing !> \param[in] "integer(i4), dimension(:) :: gaugeNodeList" gauge node list at L11 !> \param[in] "logical :: map_flag" flag indicating whether routing resolution is !> coarser than hydrologic resolution - !> \param[in] "integer(i4), dimension(:) :: L0_LCover" L0 land cover - !> \param[in] "integer(i4), dimension(:) :: L0_floodPlain" L0 fraction of flood plains - !> \param[in] "real(dp), dimension(:) :: L0_areaCell" L0 cell area - !> \param[in] "real(dp), dimension(:) :: L11_aFloodPlain" L11 area of flood plain !> \param[in] "real(dp), dimension(:) :: L11_length" L11 link length !> \param[in] "real(dp), dimension(:) :: L11_slope" L11 slope ! @@ -117,200 +113,162 @@ MODULE mo_mrm_routing ! before copying simulated runoff ! Nov 2016, Stephan Thober - implemented second routing process i.e. adaptive timestep - subroutine mRM_routing( & - ! - ! general input variables ================================================= - processCase, & ! processCase for Routing - global_routing_param, & ! routing parameters - L1_total_runoff, & ! total runoff from L1 grid cells - L1_areaCell, & ! L1 cell area - L1_L11_Id, & ! L11 cell ids on Level 1 - L11_areaCell, & ! area cell [km2] at Level11 - L11_L1_Id, & ! L1 cell ids on Level 11 - L11_netPerm, & ! L11 routing order - L11_fromN, & ! L11 source grid cell order - L11_toN, & ! L11 target grid cell order - L11_nOutlets, & ! number of outlets - timestep, & ! simulation timestep in [h] - tsRoutFactor, & ! factor from routing temporal resolution to hydrology temporal resolution - nNodes, & ! number of nodes - nInflowGauges, & ! number of inflow gauges - InflowGaugeIndexList, & ! index list of inflow gauges - InflowGaugeHeadwater, & ! flag for headwater cell of inflow gauge - InflowGaugeNodeList, & ! gauge node list at L11 - InflowDischarge, & ! inflowing discharge at discharge gauge at current day - nGauges, & ! number of recording gauges - gaugeIndexList, & ! index list for outflow gauges - gaugeNodeList, & ! gauge node list at L11s - map_flag, & ! flag indicating whether routing resolution is larger than hydrologic resolution - ! - ! original routing specific input variables =============================== - L0_LCover, & ! L0 land cover - L0_floodPlain, & ! L0 fraction of flood plains - L0_areaCell, & ! L0 cell area - L11_aFloodPlain, & ! L11 area of flood plain - L11_length, & ! L11 link length - L11_slope, & ! L11 slope - ! - ! general input/output variables ========================================== - L11_C1, & ! L11 muskingum parameter 1 - L11_C2, & ! L11 muskingum parameter 2 - L11_qOut, & ! total runoff from L11 grid cells - L11_qTIN, & ! L11 inflow to the reach - L11_qTR, & ! L11 routed outflow - L11_qMod, & - GaugeDischarge, & - ! - ! original routing specific input/output variables ======================== - L11_FracFPimp, & ! L11 fraction of flood plain with impervios cover - ! - ! optional input variables ================================================ - do_mpr_routing & - ) - use mo_mrm_global_variables, only: is_start - use mo_mrm_mpr, only: reg_rout - use mo_mrm_net_startup, only: L11_fraction_sealed_floodplain + subroutine mRM_routing(& + ! + ! general input variables ================================================= + read_states, & ! whether states are derived from restart file + processCase, & ! processCase for Routing + global_routing_param, & ! routing parameters + L1_total_runoff, & ! total runoff from L1 grid cells + L1_areaCell, & ! L1 cell area + L1_L11_Id, & ! L11 cell ids on Level 1 + L11_areaCell, & ! area cell [km2] at Level11 + L11_L1_Id, & ! L1 cell ids on Level 11 + L11_netPerm, & ! L11 routing order + L11_fromN, & ! L11 source grid cell order + L11_toN, & ! L11 target grid cell order + L11_nOutlets, & ! number of outlets + timestep, & ! simulation timestep in [h] + tsRoutFactor, & ! factor from routing temporal resolution to hydrology temporal resolution + nNodes, & ! number of nodes + nInflowGauges, & ! number of inflow gauges + InflowGaugeIndexList, & ! index list of inflow gauges + InflowGaugeHeadwater, & ! flag for headwater cell of inflow gauge + InflowGaugeNodeList, & ! gauge node list at L11 + InflowDischarge, & ! inflowing discharge at discharge gauge at current day + nGauges, & ! number of recording gauges + gaugeIndexList, & ! index list for outflow gauges + gaugeNodeList, & ! gauge node list at L11s + map_flag, & ! flag indicating whether routing resolution is larger than hydrologic resolution + ! + ! original routing specific input variables =============================== + L11_length, & ! L11 link length + L11_slope, & ! L11 slope + L11_FracFPimp, & ! L11 fraction of flood plain with impervious cover + ! + ! general input/output variables ========================================== + L11_C1, & ! L11 muskingum parameter 1 + L11_C2, & ! L11 muskingum parameter 2 + L11_qOut, & ! total runoff from L11 grid cells + L11_qTIN, & ! L11 inflow to the reach + L11_qTR, & ! L11 routed outflow + L11_qMod, & + GaugeDischarge & + ) + + use mo_mrm_global_variables, only : is_start + use mo_mrm_mpr, only : reg_rout implicit none ! general input variables ==================================================== - integer(i4), intent(in) :: processCase - real(dp), dimension(:), intent(in) :: global_routing_param ! routing parameters - real(dp), dimension(:), intent(in) :: L1_total_runoff ! total runoff from L1 grid cells - real(dp), dimension(:), intent(in) :: L1_areaCell ! L1 cell area + logical, intent(in) :: read_states + integer(i4), intent(in) :: processCase + real(dp), dimension(:), intent(in) :: global_routing_param ! routing parameters + real(dp), dimension(:), intent(in) :: L1_total_runoff ! total runoff from L1 grid cells + real(dp), dimension(:), intent(in) :: L1_areaCell ! L1 cell area integer(i4), dimension(:), intent(in) :: L1_L11_Id ! L11 cell ids at L1 - real(dp), dimension(:), intent(in) :: L11_areaCell ! L11 area cell [km2] + real(dp), dimension(:), intent(in) :: L11_areaCell ! L11 area cell [km2] integer(i4), dimension(:), intent(in) :: L11_L1_Id ! L1 cell ids at L11 integer(i4), dimension(:), intent(in) :: L11_netPerm ! L11 routing order integer(i4), dimension(:), intent(in) :: L11_fromN ! L11 source grid cell order integer(i4), dimension(:), intent(in) :: L11_toN ! L11 target grid cell order - integer(i4), intent(in) :: L11_nOutlets ! L11 number of outlets/sinks - integer(i4), intent(in) :: timestep ! simulation timestep in [h] - real(dp), intent(in) :: tsRoutFactor ! factor from routing temporal resolution to hydrology temporal resolution - integer(i4), intent(in) :: nNodes ! number of nodes - integer(i4), intent(in) :: nInflowGauges ! number of inflow gauges + integer(i4), intent(in) :: L11_nOutlets ! L11 number of outlets/sinks + integer(i4), intent(in) :: timestep ! simulation timestep in [h] + real(dp), intent(in) :: tsRoutFactor ! factor from routing temporal resolution to hydrology temporal resolution + integer(i4), intent(in) :: nNodes ! number of nodes + integer(i4), intent(in) :: nInflowGauges ! number of inflow gauges integer(i4), dimension(:), intent(in) :: InflowGaugeIndexList ! index list of inflow gauges - logical, dimension(:), intent(in) :: InflowGaugeHeadwater ! flag for headwater cell of inflow gauge + logical, dimension(:), intent(in) :: InflowGaugeHeadwater ! flag for headwater cell of inflow gauge integer(i4), dimension(:), intent(in) :: InflowGaugeNodeList ! gauge node list at L11 - real(dp), dimension(:), intent(in) :: InflowDischarge ! inflowing discharge at discharge gauge at current day - integer(i4), intent(in) :: nGauges ! number of recording gauges + real(dp), dimension(:), intent(in) :: InflowDischarge ! inflowing discharge at discharge gauge at current day + integer(i4), intent(in) :: nGauges ! number of recording gauges integer(i4), dimension(:), intent(in) :: gaugeIndexList ! index list for outflow gauges integer(i4), dimension(:), intent(in) :: gaugeNodeList ! gauge node list at L11 - logical, intent(in) :: map_flag ! flag indicating whether routing resolution > hydrology resolution + logical, intent(in) :: map_flag ! flag indicating whether routing resolution > hydrology resolution ! ! original routing specific input variables =============================== - integer(i4), dimension(:), intent(in) :: L0_LCover ! L0 land cover - integer(i4), dimension(:), intent(in) :: L0_floodPlain ! L0 fraction of flood plains - real(dp), dimension(:), intent(in) :: L0_areaCell ! L0 cell area - real(dp), dimension(:), intent(in) :: L11_aFloodPlain ! L11 area of flood plain - real(dp), dimension(:), intent(in) :: L11_length ! L11 link length - real(dp), dimension(:), intent(in) :: L11_slope ! L11 slope + real(dp), dimension(:), intent(in) :: L11_length ! L11 link length + real(dp), dimension(:), intent(in) :: L11_slope ! L11 slope + real(dp), dimension(:), intent(in) :: L11_FracFPimp ! L11 fraction of flood plain with impervios cover ! ! input/output variables ================================================== real(dp), dimension(:), intent(inout) :: L11_C1 ! L11 muskingum parameter 1 real(dp), dimension(:), intent(inout) :: L11_C2 ! L11 muskingum parameter 2 real(dp), dimension(:), intent(inout) :: L11_qOut ! total runoff from L11 grid cells - real(dp), dimension(:,:), intent(inout) :: L11_qTIN ! L11 inflow to the reach - real(dp), dimension(:,:), intent(inout) :: L11_qTR ! L11 routed outflow + real(dp), dimension(:, :), intent(inout) :: L11_qTIN ! L11 inflow to the reach + real(dp), dimension(:, :), intent(inout) :: L11_qTR ! L11 routed outflow real(dp), dimension(:), intent(inout) :: L11_qMod ! modelled discharge at each grid cell real(dp), dimension(:), intent(inout) :: GaugeDischarge ! modelled discharge at each gauge ! - ! original routing specific input/output variables ======================== - real(dp), dimension(:), intent(inout) :: L11_FracFPimp ! L11 fraction of flood plain with impervios cover - ! - ! optional input variables ================================================ - logical, optional, intent(in) :: do_mpr_routing ! flag for performing mpr + ! local variables ========================================================= - logical :: do_mpr integer(i4) :: gg integer(i4) :: tt integer(i4) :: rout_loop ! number of routing loops - real(dp) :: L11_qAcc(size(L11_qMod, dim=1)) ! variable for accumulation + real(dp) :: L11_qAcc(size(L11_qMod, dim = 1)) ! variable for accumulation - ! ==================================================================== - ! FIRST, EXECUTE MPR - ! ==================================================================== - ! evaluate whether mpr should be executed - do_mpr = .false. if (is_start) then - do_mpr = .true. - is_start = .false. + is_start = .false. end if - if (present(do_mpr_routing)) do_mpr = do_mpr_routing - - if (processCase .eq. 1_i4) then - ! execute mpr for routing - if (do_mpr) then - !------------------------------------------------------------------- - ! estimate fraction of impervious cover in flood plains - ! --> time independent variable: to be initalized every time - ! with landcover change - ! --> Note: L11_fraction_sealed_floodplain routine is called - ! only in case when routing process is ON - !------------------------------------------------------------------- - CALL L11_fraction_sealed_floodplain( nNodes - L11_nOutlets, & - L0_LCover, & - L0_floodPlain, & - L0_areaCell, & - L11_aFloodPlain, & - 2, & - L11_FracFPimp) ! intent out - ! for a single node model run - if (nNodes .GT. 1) then - call reg_rout( global_routing_param, & - L11_length, L11_slope, L11_FracFPimp(:nNodes - L11_nOutlets), & - real(timeStep,dp), L11_C1(:nNodes - L11_nOutlets), L11_C2(:nNodes - L11_nOutlets)) - end if - end if + + ! this is using the sealed fraction for determining the routing parameters + ! MPR has already been done + if (processCase .eq. 1_i4 .AND. (.not. read_states)) then + ! for a single node model run + if (nNodes .GT. 1) then + call reg_rout(global_routing_param, & + L11_length, L11_slope, L11_FracFPimp(: nNodes - L11_nOutlets), & + real(timeStep, dp), L11_C1(: nNodes - L11_nOutlets), L11_C2(: nNodes - L11_nOutlets)) + end if end if ! ===================================================================== - ! SECOND, EXECUTE ROUTING + ! NOW, EXECUTE ROUTING ! ==================================================================== ! calculate number of routing loops rout_loop = max(1_i4, nint(1._dp / tsRoutFactor)) - ! runoff accumulation from L1 to L11 level call L11_runoff_acc(L1_total_runoff, L1_areaCell, L1_L11_Id, & - L11_areaCell, L11_L1_Id, timeStep, & ! Intent IN - map_flag, & ! Intent IN - L11_qOut) ! Intent OUT + L11_areaCell, L11_L1_Id, timeStep, & ! Intent IN + map_flag, & ! Intent IN + L11_qOut) ! Intent OUT ! add inflow - call add_inflow( nInflowGauges, & - InflowGaugeIndexList, & - InflowGaugeHeadwater, & - InflowGaugeNodeList, & - InflowDischarge, & ! Intent IN - L11_qOUT) ! Intent INOUT + call add_inflow(nInflowGauges, & + InflowGaugeIndexList, & + InflowGaugeHeadwater, & + InflowGaugeNodeList, & + InflowDischarge, & ! Intent IN + L11_qOUT) ! Intent INOUT ! for a single node model run - if( nNodes .GT. 1) then - ! routing multiple times if timestep is smaller than 1 - ! - L11_qAcc = 0._dp - do tt = 1, rout_loop - ! routing of water within river reaches - call L11_routing( nNodes, nNodes - L11_nOutlets, & - L11_netPerm, & - L11_fromN, & ! Intent IN - L11_toN, & ! Intent IN - L11_C1, & ! Intent IN - L11_C2, & ! Intent IN - L11_qOut, & ! Intent IN - nInflowGauges, & ! Intent IN - InflowGaugeHeadwater, & ! Intent IN - InflowGaugeNodeList, & ! Intent IN - L11_qTIN, & ! Intent INOUT - L11_qTR, & ! Intent INOUT - L11_Qmod) ! Intent OUT - ! accumulate values of individual subtimesteps - L11_qAcc = L11_qAcc + L11_qMod - end do - ! calculate mean over routing period (timestep) - L11_qMod = L11_qAcc / real(rout_loop, dp) + if(nNodes .GT. 1) then + ! routing multiple times if timestep is smaller than 1 + ! + L11_qAcc = 0._dp + do tt = 1, rout_loop + ! routing of water within river reaches + call L11_routing(nNodes, nNodes - L11_nOutlets, & + L11_netPerm, & + L11_fromN, & ! Intent IN + L11_toN, & ! Intent IN + L11_C1, & ! Intent IN + L11_C2, & ! Intent IN + L11_qOut, & ! Intent IN + nInflowGauges, & ! Intent IN + InflowGaugeHeadwater, & ! Intent IN + InflowGaugeNodeList, & ! Intent IN + L11_qTIN, & ! Intent INOUT + L11_qTR, & ! Intent INOUT + L11_Qmod) ! Intent OUT + ! accumulate values of individual subtimesteps + L11_qAcc = L11_qAcc + L11_qMod + end do + ! calculate mean over routing period (timestep) + L11_qMod = L11_qAcc / real(rout_loop, dp) else - L11_Qmod = L11_qOUT + L11_Qmod = L11_qOUT end if !---------------------------------------------------------------------- @@ -322,9 +280,9 @@ subroutine mRM_routing( & ! ordered corresponing to gauge%Q(:,:) !---------------------------------------------------------------------- do gg = 1, nGauges - GaugeDischarge(gaugeIndexList(gg)) = L11_Qmod(gaugeNodeList(gg)) + GaugeDischarge(gaugeIndexList(gg)) = L11_Qmod(gaugeNodeList(gg)) end do - + end subroutine mRM_routing ! ------------------------------------------------------------------ @@ -389,60 +347,60 @@ end subroutine mRM_routing ! ------------------------------------------------------------------ SUBROUTINE L11_runoff_acc(qAll, efecArea, L1_L11_Id, & - L11_areaCell, L11_L1_Id, & - TS, map_flag, qAcc) + L11_areaCell, L11_L1_Id, & + TS, map_flag, qAcc) - use mo_mrm_constants, only: HourSecs, nodata_dp + use mo_common_constants, only : HourSecs, nodata_dp IMPLICIT NONE - real(dp), intent(in) :: qall(:) ! [mm tst-1] total runoff l1 - real(dp), intent(in) :: efecarea(:) ! [km2] efective area at l1 + real(dp), intent(in) :: qall(:) ! [mm tst-1] total runoff l1 + real(dp), intent(in) :: efecarea(:) ! [km2] efective area at l1 integer(i4), intent(in) :: L1_L11_Id(:) ! l1 ids mapped on l11 - real(dp), intent(in) :: L11_areacell(:) ! [km2] efective area at l11 + real(dp), intent(in) :: L11_areacell(:) ! [km2] efective area at l11 integer(i4), intent(in) :: L11_L1_Id(:) ! l11 ids mapped on l1 integer(i4), intent(in) :: TS ! [h] time step - logical, intent(in) :: map_flag ! true when routing resolution is larger than hydrologic resolution - real(dp), intent(out) :: qAcc(:) ! [m3 s-1] aggregated runoff at l11 + logical, intent(in) :: map_flag ! true when routing resolution is larger than hydrologic resolution + real(dp), intent(out) :: qAcc(:) ! [m3 s-1] aggregated runoff at l11 - ! local variables - integer(i4) :: k - real(dp) :: TST ! [s] time step + ! local variables + integer(i4) :: k + real(dp) :: TST ! [s] time step ! ------------------------------------------------------------------ ! ACCUMULATION OF DISCHARGE TO A ROUTING CELL ! ------------------------------------------------------------------ ! Hydrologic timestep in seconds - TST = HourSecs * TS + TST = HourSecs * TS if (map_flag) then - ! Estimate specific runoff at L11 - ! NOTE: - ! 1) Total discharge depth aggregated at L11 level [mm/TST] - ! 2) Transform depth [mm/TST] to discharge [m3/s] - ! Total runoff should be divided by total_area to get - ! specific discharge at L11. Then, to transform specific - ! discharge from [mm/TST] to [m3/s], it should be multiplied by - ! total_area [km2]*10^3 and divided by TST. - ! Therefore, in this operation total_area cancels out. - qAcc = 0._dp - ! loop over high-resolution cells (L1) and add discharge to - ! corresponding low-resolution cells (L11) - do k = 1, size(qAll, 1) - qAcc(L1_L11_Id(k)) = qAcc(L1_L11_Id(k)) + qAll(k) * efecArea(k) - end do - qAcc = qAcc * 1000.0_dp / TST - ! + ! Estimate specific runoff at L11 + ! NOTE: + ! 1) Total discharge depth aggregated at L11 level [mm/TST] + ! 2) Transform depth [mm/TST] to discharge [m3/s] + ! Total runoff should be divided by total_area to get + ! specific discharge at L11. Then, to transform specific + ! discharge from [mm/TST] to [m3/s], it should be multiplied by + ! total_area [km2]*10^3 and divided by TST. + ! Therefore, in this operation total_area cancels out. + qAcc = 0._dp + ! loop over high-resolution cells (L1) and add discharge to + ! corresponding low-resolution cells (L11) + do k = 1, size(qAll, 1) + qAcc(L1_L11_Id(k)) = qAcc(L1_L11_Id(k)) + qAll(k) * efecArea(k) + end do + qAcc = qAcc * 1000.0_dp / TST + ! else - ! initialize qout - qAcc = nodata_dp - do k = 1, size(qAcc, 1) - ! map flux from coarse L1 resolution to fine L11 resolution - qAcc(k) = qAll(L11_L1_Id(k)) - end do - ! adjust flux by area cell - qAcc(:) = qAcc(:) * L11_areaCell(:) * 1000.0_dp / TST + ! initialize qout + qAcc = nodata_dp + do k = 1, size(qAcc, 1) + ! map flux from coarse L1 resolution to fine L11 resolution + qAcc(k) = qAll(L11_L1_Id(k)) + end do + ! adjust flux by area cell + qAcc(:) = qAcc(:) * L11_areaCell(:) * 1000.0_dp / TST end if END SUBROUTINE L11_runoff_acc @@ -465,7 +423,7 @@ END SUBROUTINE L11_runoff_acc !> inflow is happening. The values are not directly added to the !> river network. If this cell is not a headwater then the streamflow !> produced upstream will be neglected. - + ! INTENT(IN) !> \param[in] "integer(i4) :: nInflowGauges" number of inflow gauges !> \param[in] "integer(i4) :: InflowIndexList" index of inflow points @@ -475,10 +433,10 @@ END SUBROUTINE L11_runoff_acc ! INTENT(INOUT) !> \param[in,out] "real(dp) :: qOut" [m3 s-1] Series of attenuated runoff - + ! INTENT(OUT) ! None - + ! INTENT(IN), OPTIONAL ! None @@ -506,40 +464,40 @@ END SUBROUTINE L11_runoff_acc ! Modified ! ------------------------------------------------------------------ subroutine add_inflow(nInflowGauges, InflowIndexList, InflowHeadwater, & - InflowNodeList, QInflow, & ! Intent IN - qOut) ! Intent INOUT + InflowNodeList, QInflow, & ! Intent IN + qOut) ! Intent INOUT + + use mo_kind, only : i4, dp - use mo_kind, only: i4, dp - implicit none ! input variables - integer(i4), intent(in) :: nInflowGauges ! [-] number of inflow points - integer(i4), intent(in) :: InflowIndexList(:) ! [-] index of inflow points - logical, intent(in) :: InflowHeadwater(:) ! [-] if to consider headwater cells of inflow gauge - integer(i4), intent(in) :: InflowNodeList(:) ! [-] L11 ID of inflow points - real(dp), intent(in) :: QInflow(:) ! [m3 s-1] inflowing water + integer(i4), intent(in) :: nInflowGauges ! [-] number of inflow points + integer(i4), intent(in) :: InflowIndexList(:) ! [-] index of inflow points + logical, intent(in) :: InflowHeadwater(:) ! [-] if to consider headwater cells of inflow gauge + integer(i4), intent(in) :: InflowNodeList(:) ! [-] L11 ID of inflow points + real(dp), intent(in) :: QInflow(:) ! [m3 s-1] inflowing water ! output variables - real(dp), intent(inout) :: qOut(:) ! [m3 s-1] Series of attenuated runoff + real(dp), intent(inout) :: qOut(:) ! [m3 s-1] Series of attenuated runoff ! local variables integer(i4) :: ii - + ! discharge for inflow gauges (e.g. for missing upstream catchments) is added here ! should be put after UH attenuation because it is measured runoff at this cell if (nInflowGauges .gt. 0) then - do ii = 1, nInflowGauges - if (InflowHeadwater(ii)) then - ! add inflowing water to water produced by upstream/headwater cells - qOut(InflowNodeList(ii)) = qOut(InflowNodeList(ii)) + QInflow(InflowIndexList(ii)) - else - ! put only timeseries and cut upstream/headwater cells produced water for routing - qOut(InflowNodeList(ii)) = QInflow(InflowIndexList(ii)) - end if - end do + do ii = 1, nInflowGauges + if (InflowHeadwater(ii)) then + ! add inflowing water to water produced by upstream/headwater cells + qOut(InflowNodeList(ii)) = qOut(InflowNodeList(ii)) + QInflow(InflowIndexList(ii)) + else + ! put only timeseries and cut upstream/headwater cells produced water for routing + qOut(InflowNodeList(ii)) = QInflow(InflowIndexList(ii)) + end if + end do end if end subroutine add_inflow - + ! ------------------------------------------------------------------ ! NAME @@ -596,7 +554,7 @@ end subroutine add_inflow ! INTENT(INOUT) !> \param[in,out] "real(dp) :: netNode_qTIN(nNodes,2)" Total discharge inputs at t-1 and t !> \param[in,out] "real(dp) :: netNode_qTR(nNodes,2)" Routed outflow leaving a node (\cite TS2006 ) - + ! INTENT(OUT) !> \param[out] "real(dp) :: netNode_Qmod(nNodes)" Simulated discharge [m3 s-1] @@ -629,46 +587,46 @@ end subroutine add_inflow ! Nov 2011 - parallel version ! Luis Samaniego Jan 2013 - modularization, documentation ! ------------------------------------------------------------------ - subroutine L11_routing( & - nNodes, nLinks, netPerm, netLink_fromN, netLink_toN, & - netLink_C1, netLink_C2, netNode_qOUT, nInflowGauges, InflowHeadwater, InflowNodeList, & - netNode_qTIN, netNode_qTR, netNode_Qmod ) + subroutine L11_routing(& + nNodes, nLinks, netPerm, netLink_fromN, netLink_toN, & + netLink_C1, netLink_C2, netNode_qOUT, nInflowGauges, InflowHeadwater, InflowNodeList, & + netNode_qTIN, netNode_qTR, netNode_Qmod) implicit none ! Input - integer(i4), intent(in) :: nNodes ! number of network nodes = nCells1 - integer(i4), intent(in) :: nLinks ! number of stream segment (reaches) + integer(i4), intent(in) :: nNodes ! number of network nodes = nCells1 + integer(i4), intent(in) :: nLinks ! number of stream segment (reaches) ! Stream link description network topology ==> netLink - integer(i4), dimension(:), intent(in) :: netPerm ! basin routing order (permutation) - integer(i4), dimension(:), intent(in) :: netLink_fromN ! from node - integer(i4), dimension(:), intent(in) :: netLink_toN ! to node - real(dp), dimension(:), intent(in) :: netLink_C1 ! [1] routing parameter C1 (Chow, 25-41) - real(dp), dimension(:), intent(in) :: netLink_C2 ! [1] routing parameters C2 (") + integer(i4), dimension(:), intent(in) :: netPerm ! basin routing order (permutation) + integer(i4), dimension(:), intent(in) :: netLink_fromN ! from node + integer(i4), dimension(:), intent(in) :: netLink_toN ! to node + real(dp), dimension(:), intent(in) :: netLink_C1 ! [1] routing parameter C1 (Chow, 25-41) + real(dp), dimension(:), intent(in) :: netLink_C2 ! [1] routing parameters C2 (") ! State variables - real(dp), dimension(:), intent(in) :: netNode_qOUT ! [m3 s-1] Total outflow, all cells, basin, + real(dp), dimension(:), intent(in) :: netNode_qOUT ! [m3 s-1] Total outflow, all cells, basin, ! ! level L11 at time tt - integer(i4), intent(in) :: nInflowGauges ! [-] number of inflow points - logical, dimension(:), intent(in) :: InflowHeadwater ! [-] if to consider headwater cells of inflow gauge - integer(i4), dimension(:), intent(in) :: InflowNodeList ! [-] L11 ID of inflow points + integer(i4), intent(in) :: nInflowGauges ! [-] number of inflow points + logical, dimension(:), intent(in) :: InflowHeadwater ! [-] if to consider headwater cells of inflow gauge + integer(i4), dimension(:), intent(in) :: InflowNodeList ! [-] L11 ID of inflow points ! Input - Output - real(dp), dimension(:,:), intent(inout) :: netNode_qTIN ! [m3 s-1] Total inputs at t-1 and t - real(dp), dimension(:,:), intent(inout) :: netNode_qTR ! [m3 s-1] Transformed outflow leaving + real(dp), dimension(:, :), intent(inout) :: netNode_qTIN ! [m3 s-1] Total inputs at t-1 and t + real(dp), dimension(:, :), intent(inout) :: netNode_qTR ! [m3 s-1] Transformed outflow leaving ! ! node I (Muskingum) ! Output - real(dp), dimension(nNodes), intent(out) :: netNode_Qmod ! [m3 s-1] Simulated routed discharge + real(dp), dimension(nNodes), intent(out) :: netNode_Qmod ! [m3 s-1] Simulated routed discharge ! local - integer(i4) :: i, k, iNode, tNode - integer(i4), parameter :: IT = 2 ! current routing state (2) - integer(i4), parameter :: IT1 = 1 ! past routing state (1) - ! Entry value for the auxiliary vectors - ! netNode_qTIN(iNode,:) - ! netNode_qTR(iNode,:) - ! which store current and past states of - ! incoming and outgoing of discharge at iNode + integer(i4) :: i, k, iNode, tNode + integer(i4), parameter :: IT = 2 ! current routing state (2) + integer(i4), parameter :: IT1 = 1 ! past routing state (1) + ! Entry value for the auxiliary vectors + ! netNode_qTIN(iNode,:) + ! netNode_qTR(iNode,:) + ! which store current and past states of + ! incoming and outgoing of discharge at iNode !-------------------------------------------------------------------------- @@ -676,37 +634,37 @@ subroutine L11_routing( & !-------------------------------------------------------------------------- ! initialize total input at point time IT in all nodes - netNode_qTIN(:,IT) = 0.0_dp + netNode_qTIN(:, IT) = 0.0_dp !-------------------------------------------------------------------------- ! Links in sequential mode .... with single node !-------------------------------------------------------------------------- ! ST - decent parallelization has to be done!!! !!$OMP parallel !!$OMP do private( i, inode, tnode) - do k = 1 , nLinks - ! get LINK routing order -> i - i = netPerm(k) - iNode = netLink_fromN(i) - tNode = netLink_toN(i) - - ! accumulate all inputs in iNode - netNode_qTIN(iNode,IT) = netNode_qTIN(iNode,IT) + netNode_qOUT(iNode) - - ! routing iNode - netNode_qTR(iNode,IT) = netNode_qTR(iNode,IT1) & - + netLink_C1(i) * ( netNode_qTIN(iNode,IT1) - netNode_qTR (iNode,IT1) ) & - + netLink_C2(i) * ( netNode_qTIN(iNode,IT) - netNode_qTIN(iNode,IT1) ) - - ! check if the inflow from upstream cells should be deactivated - if (nInflowGauges .GT. 0) then - do i = 1, nInflowGauges - ! check if downstream Node (tNode) is inflow gauge and headwaters should be ignored - if ( (tNode == InflowNodeList(i)) .AND. (.NOT. InflowHeadwater(i))) netNode_qTR(iNode,IT) = 0.0_dp - end do - end if - - ! add routed water to downstream node - netNode_qTIN(tNode,IT) = netNode_qTIN(tNode,IT) + netNode_qTR(iNode,IT) + do k = 1, nLinks + ! get LINK routing order -> i + i = netPerm(k) + iNode = netLink_fromN(i) + tNode = netLink_toN(i) + + ! accumulate all inputs in iNode + netNode_qTIN(iNode, IT) = netNode_qTIN(iNode, IT) + netNode_qOUT(iNode) + + ! routing iNode + netNode_qTR(iNode, IT) = netNode_qTR(iNode, IT1) & + + netLink_C1(i) * (netNode_qTIN(iNode, IT1) - netNode_qTR (iNode, IT1)) & + + netLink_C2(i) * (netNode_qTIN(iNode, IT) - netNode_qTIN(iNode, IT1)) + + ! check if the inflow from upstream cells should be deactivated + if (nInflowGauges .GT. 0) then + do i = 1, nInflowGauges + ! check if downstream Node (tNode) is inflow gauge and headwaters should be ignored + if ((tNode == InflowNodeList(i)) .AND. (.NOT. InflowHeadwater(i))) netNode_qTR(iNode, IT) = 0.0_dp + end do + end if + + ! add routed water to downstream node + netNode_qTIN(tNode, IT) = netNode_qTIN(tNode, IT) + netNode_qTR(iNode, IT) end do !!$OMP end do !!$OMP end parallel @@ -714,8 +672,8 @@ subroutine L11_routing( & !-------------------------------------------------------------------------- ! Accumulate all inputs in tNode (netNode_qOUT) ONLY for last link !-------------------------------------------------------------------------- - tNode = netLink_toN( netPerm(nLinks) ) - netNode_qTIN(tNode,IT) = netNode_qTIN(tNode,IT) + netNode_qOUT(tNode) + tNode = netLink_toN(netPerm(nLinks)) + netNode_qTIN(tNode, IT) = netNode_qTIN(tNode, IT) + netNode_qOUT(tNode) !-------------------------------------------------------------------------- ! save modeled discharge at time step tt then shift flow storages @@ -723,10 +681,10 @@ subroutine L11_routing( & !-------------------------------------------------------------------------- ! !!$OMP parallel ! store generated discharge - netNode_Qmod(1:nNodes) = netNode_qTIN(1:nNodes,IT) + netNode_Qmod(1 : nNodes) = netNode_qTIN(1 : nNodes, IT) ! backflow t-> t-1 - netNode_qTR(1:nNodes,IT1) = netNode_qTR(1:nNodes,IT) - netNode_qTIN(1:nNodes,IT1)= netNode_qTIN(1:nNodes,IT) + netNode_qTR(1 : nNodes, IT1) = netNode_qTR(1 : nNodes, IT) + netNode_qTIN(1 : nNodes, IT1) = netNode_qTIN(1 : nNodes, IT) ! !!$OMP end parallel end subroutine L11_routing diff --git a/src/mRM/mo_mrm_signatures.f90 b/src/mRM/mo_mrm_signatures.f90 index c4735be9..93bc1851 100644 --- a/src/mRM/mo_mrm_signatures.f90 +++ b/src/mRM/mo_mrm_signatures.f90 @@ -21,7 +21,7 @@ MODULE mo_mrm_signatures - USE mo_kind, ONLY: i4, sp, dp + USE mo_kind, ONLY : i4, sp, dp IMPLICIT NONE @@ -93,19 +93,19 @@ MODULE mo_mrm_signatures FUNCTION Autocorrelation(data, lags, mask) - use mo_corr, only: autocorr + use mo_corr, only : autocorr IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! Data series - integer(i4), dimension(:), intent(in) :: lags ! Lags for autocorrelation - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask for data points - real(dp), dimension(size(lags,1)) :: autocorrelation ! Autocorrelation of data at given lags + real(dp), dimension(:), intent(in) :: data ! Data series + integer(i4), dimension(:), intent(in) :: lags ! Lags for autocorrelation + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask for data points + real(dp), dimension(size(lags, 1)) :: autocorrelation ! Autocorrelation of data at given lags if (present(mask)) then - autocorrelation = autocorr(data, lags, mask=mask) + autocorrelation = autocorr(data, lags, mask = mask) else - autocorrelation = autocorr(data, lags) + autocorrelation = autocorr(data, lags) end if END FUNCTION Autocorrelation @@ -134,7 +134,7 @@ END FUNCTION Autocorrelation !> where \f$ m_1 \f$ and \f$ m_2 \f$ are the lowest and highest flow exceedance probabilities within the !> midsegment of FDC. The settings \f$m_1=0.2\f$ and \f$0.7\f$ are used by Shafii et. al (2014) and are !> implemented like that.\n - !> + !> !> Optionally, the FDC medium high-segment volume \f$FDC_{MHSV}\f$ as used by Shafii et. al (2014) can be !> returned. The \f$FDC_{MHSV}\f$ is defined as !> \f[ FDC_{MHSV} = \sum_{h=1}^{H} q_h \f] @@ -170,7 +170,7 @@ END FUNCTION Autocorrelation ! INTENT(OUT) ! None - + ! INTENT(IN), OPTIONAL !> \param[in] "logical, dimension(size(data,1)) :: mask" mask of data array @@ -211,7 +211,7 @@ END FUNCTION Autocorrelation ! Shafii, M., & Tolson, B. A. (2015). ! Optimizing hydrological consistency by incorporating hydrological signatures into model calibration objectives. ! Water Resources Research, 51(5), 3796-3814. doi:10.1002/2014WR016520 - + ! HISTORY !> \author Remko Nijzink, Juliane Mai !> \date March 2014 @@ -223,81 +223,81 @@ END FUNCTION Autocorrelation ! low_segment_volume FUNCTION FlowDurationCurve(data, quantiles, mask, concavity_index, & - mid_segment_slope, mhigh_segment_volume, high_segment_volume, low_segment_volume) + mid_segment_slope, mhigh_segment_volume, high_segment_volume, low_segment_volume) - use mo_percentile, only: percentile - use mo_utils, only: ge, le + use mo_percentile, only : percentile + use mo_utils, only : ge, le IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! data series - real(dp), dimension(:), intent(in) :: quantiles ! Percentages of exceedance (x-axis of FDC) - logical, dimension(:), optional, intent(in) :: mask ! mask for data - real(dp), optional, intent(out) :: concavity_index ! Concavity index as defined by + real(dp), dimension(:), intent(in) :: data ! data series + real(dp), dimension(:), intent(in) :: quantiles ! Percentages of exceedance (x-axis of FDC) + logical, dimension(:), optional, intent(in) :: mask ! mask for data + real(dp), optional, intent(out) :: concavity_index ! Concavity index as defined by ! ! Sauquet et al. (2011) - real(dp), optional, intent(out) :: mid_segment_slope ! mid-segment slope as defined by + real(dp), optional, intent(out) :: mid_segment_slope ! mid-segment slope as defined by ! ! Shafii et al. (2014) - real(dp), optional, intent(out) :: mhigh_segment_volume ! medium-high-segment volume + real(dp), optional, intent(out) :: mhigh_segment_volume ! medium-high-segment volume ! ! 0.0 <= exceed. prob. <= 0.2 - real(dp), optional, intent(out) :: high_segment_volume ! high-segment volume as defined by + real(dp), optional, intent(out) :: high_segment_volume ! high-segment volume as defined by ! ! Shafii et al. (2014) ! ! 0.0 <= exceed. prob. <= 0.02 - real(dp), optional, intent(out) :: low_segment_volume ! low-segment volume as defined by + real(dp), optional, intent(out) :: low_segment_volume ! low-segment volume as defined by ! ! Shafii et al. (2014) ! ! 0.7 <= exceed. prob. <= 1.0 - real(dp), dimension(size(quantiles,1)) :: FlowDurationCurve ! data point where x% of the data points + real(dp), dimension(size(quantiles, 1)) :: FlowDurationCurve ! data point where x% of the data points ! ! are above that value ! local variables - logical, dimension(size(data,1)) :: maske ! mask for data points - real(dp) :: min_flow_value ! minimal flow value - real(dp) :: flow_value_thres ! flow value at a threshold quantile - + logical, dimension(size(data, 1)) :: maske ! mask for data points + real(dp) :: min_flow_value ! minimal flow value + real(dp) :: flow_value_thres ! flow value at a threshold quantile + ! checking optionals if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if - - FlowDurationCurve = percentile(data, (1._dp-quantiles)*100._dp, mask=maske, mode_in=5) + + FlowDurationCurve = percentile(data, (1._dp - quantiles) * 100._dp, mask = maske, mode_in = 5) if (present(concavity_index)) then - concavity_index = & - ( percentile(data, (1._dp-0.10_dp)*100._dp, mask=maske, mode_in=5) - & - percentile(data, (1._dp-0.99_dp)*100._dp, mask=maske, mode_in=5) ) / & - ( percentile(data, (1._dp-0.01_dp)*100._dp, mask=maske, mode_in=5) - & - percentile(data, (1._dp-0.99_dp)*100._dp, mask=maske, mode_in=5) ) + concavity_index = & + (percentile(data, (1._dp - 0.10_dp) * 100._dp, mask = maske, mode_in = 5) - & + percentile(data, (1._dp - 0.99_dp) * 100._dp, mask = maske, mode_in = 5)) / & + (percentile(data, (1._dp - 0.01_dp) * 100._dp, mask = maske, mode_in = 5) - & + percentile(data, (1._dp - 0.99_dp) * 100._dp, mask = maske, mode_in = 5)) end if if (present(mid_segment_slope)) then - ! mid-flows are defined to be between 0.2 and 0.7 by Shafii et. al (2014) - mid_segment_slope = & - log( percentile(data, (1._dp-0.2_dp)*100._dp, mask=maske, mode_in=5) ) - & - log( percentile(data, (1._dp-0.7_dp)*100._dp, mask=maske, mode_in=5) ) + ! mid-flows are defined to be between 0.2 and 0.7 by Shafii et. al (2014) + mid_segment_slope = & + log(percentile(data, (1._dp - 0.2_dp) * 100._dp, mask = maske, mode_in = 5)) - & + log(percentile(data, (1._dp - 0.7_dp) * 100._dp, mask = maske, mode_in = 5)) end if if (present(mhigh_segment_volume)) then - ! medium high-flows are defined to be between 0.0 and 0.2 as to be constistent - ! with the mid-segment (0.2-0.7) and low-segment (0.7-1.0) definitions - flow_value_thres = percentile(data, (1._dp-0.2_dp)*100._dp, mask=maske, mode_in=5) - mhigh_segment_volume = sum(data,mask=(maske .and. ge(data,flow_value_thres))) - ! print*, 'flow_value_thres = ',flow_value_thres - ! print*, 'mhigh_segment_volume = ',mhigh_segment_volume + ! medium high-flows are defined to be between 0.0 and 0.2 as to be constistent + ! with the mid-segment (0.2-0.7) and low-segment (0.7-1.0) definitions + flow_value_thres = percentile(data, (1._dp - 0.2_dp) * 100._dp, mask = maske, mode_in = 5) + mhigh_segment_volume = sum(data, mask = (maske .and. ge(data, flow_value_thres))) + ! print*, 'flow_value_thres = ',flow_value_thres + ! print*, 'mhigh_segment_volume = ',mhigh_segment_volume end if if (present(high_segment_volume)) then - ! high-flows are defined to be between 0.0 and 0.02 by Shafii et. al (2014) - flow_value_thres = percentile(data, (1._dp-0.02_dp)*100._dp, mask=maske, mode_in=5) - high_segment_volume = sum(data,mask=(maske .and. ge(data,flow_value_thres))) + ! high-flows are defined to be between 0.0 and 0.02 by Shafii et. al (2014) + flow_value_thres = percentile(data, (1._dp - 0.02_dp) * 100._dp, mask = maske, mode_in = 5) + high_segment_volume = sum(data, mask = (maske .and. ge(data, flow_value_thres))) end if if (present(low_segment_volume)) then - ! low-flows are defined to be between 0.7 and 1.0 by Shafii et. al (2014) - min_flow_value = minval(data, mask=maske) - flow_value_thres = percentile(data, (1._dp-0.7)*100._dp, mask=maske, mode_in=5) - low_segment_volume = -1.0_dp * & - sum( log(data) - log(min_flow_value), mask=(maske .and. le(data,flow_value_thres))) + ! low-flows are defined to be between 0.7 and 1.0 by Shafii et. al (2014) + min_flow_value = minval(data, mask = maske) + flow_value_thres = percentile(data, (1._dp - 0.7) * 100._dp, mask = maske, mode_in = 5) + low_segment_volume = -1.0_dp * & + sum(log(data) - log(min_flow_value), mask = (maske .and. le(data, flow_value_thres))) end if END FUNCTION FlowDurationCurve @@ -320,7 +320,7 @@ END FUNCTION FlowDurationCurve !> whereas the duration the data decrease (ndecline) divided by the number of peaks (npeaks) !> gives the declining limb density DLD !> \f[ DLD=t_{fall}/n_{peak}. \f] - + !> An optional mask of data points can be specified. ! CALLING SEQUENCE @@ -368,65 +368,65 @@ END FUNCTION FlowDurationCurve SUBROUTINE Limb_densities(data, mask, RLD, DLD) - use mo_message, only : message + use mo_message, only : message IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! data series (with rising and declining limbs) - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask for data series - real(dp), optional, intent(out) :: RLD ! rising limb density - real(dp), optional, intent(out) :: DLD ! declining limb density + real(dp), dimension(:), intent(in) :: data ! data series (with rising and declining limbs) + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask for data series + real(dp), optional, intent(out) :: RLD ! rising limb density + real(dp), optional, intent(out) :: DLD ! declining limb density ! local variables - logical, dimension(size(data,1)) :: maske ! mask for data points - integer(i4) :: jj ! Counter - integer(i4) :: n_peak ! Number of peaks - integer(i4) :: n_decline ! Number of declining data points - integer(i4) :: n_rise ! Number of rising data points - logical, dimension(size(data,1)) :: goes_up ! True if rising, False if declining or contains masked values - real(dp) :: thres_rise ! Threshold that is has to rise at least to be detected as rising value + logical, dimension(size(data, 1)) :: maske ! mask for data points + integer(i4) :: jj ! Counter + integer(i4) :: n_peak ! Number of peaks + integer(i4) :: n_decline ! Number of declining data points + integer(i4) :: n_rise ! Number of rising data points + logical, dimension(size(data, 1)) :: goes_up ! True if rising, False if declining or contains masked values + real(dp) :: thres_rise ! Threshold that is has to rise at least to be detected as rising value ! checking optionals if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if - if ( (.not. present(RLD)) .and. (.not. present(DLD)) ) then - call message('mo_signatures: limb_densities: Neither RLD or DLD is specified in calling sequence.') - stop + if ((.not. present(RLD)) .and. (.not. present(DLD))) then + call message('mo_signatures: limb_densities: Neither RLD or DLD is specified in calling sequence.') + stop end if - + ! initialize - n_rise = 0_i4 + n_rise = 0_i4 n_decline = 0_i4 - n_peak = 0_i4 + n_peak = 0_i4 - goes_up = .False. + goes_up = .False. thres_rise = 1.0_dp - do jj=1, size(data,1)-1 - if (maske(jj) .and. maske(jj+1)) then - if (data(jj) < data(jj+1) - thres_rise) then - goes_up(jj) = .true. - ! print*, jj, ' ', data(jj), ' ', data(jj+1) - end if - end if + do jj = 1, size(data, 1) - 1 + if (maske(jj) .and. maske(jj + 1)) then + if (data(jj) < data(jj + 1) - thres_rise) then + goes_up(jj) = .true. + ! print*, jj, ' ', data(jj), ' ', data(jj+1) + end if + end if end do - n_rise = count(goes_up) + n_rise = count(goes_up) n_decline = count(maske) - count(goes_up) ! write(*,*) 'goes_up = ', goes_up(1:178) ! peak is where goes_up switches from true to false n_peak = 0_i4 - do jj=1, size(data,1)-1 - if (maske(jj) .and. maske(jj+1)) then - if (goes_up(jj) .and. .not.(goes_up(jj+1)) ) then - n_peak = n_peak+1_i4 - ! print*, jj - end if - end if + do jj = 1, size(data, 1) - 1 + if (maske(jj) .and. maske(jj + 1)) then + if (goes_up(jj) .and. .not.(goes_up(jj + 1))) then + n_peak = n_peak + 1_i4 + ! print*, jj + end if + end if end do ! do jj=2, size(data,1)-1 @@ -454,30 +454,30 @@ SUBROUTINE Limb_densities(data, mask, RLD, DLD) ! ! n_decline = n_decline+1_i4 ! ! end if ! ! end if - + ! end do ! write(*,*) 'n_peak = ', n_peak if (present(RLD)) then - if (n_peak>0_i4) then - RLD = real(n_rise,dp)/ real(n_peak,dp) - else - RLD = 0.0_dp - end if + if (n_peak>0_i4) then + RLD = real(n_rise, dp) / real(n_peak, dp) + else + RLD = 0.0_dp + end if end if - + if (present(DLD)) then - if (n_peak>0_i4) then - DLD = real(n_decline,dp)/real(n_peak,dp) - else - DLD = 0.0_dp - end if + if (n_peak>0_i4) then + DLD = real(n_decline, dp) / real(n_peak, dp) + else + DLD = 0.0_dp + end if end if - + END SUBROUTINE Limb_densities - !------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- ! NAME ! MaximumMonthlyFlow @@ -534,78 +534,78 @@ END SUBROUTINE Limb_densities FUNCTION MaximumMonthlyFlow(data, mask, yr_start, mo_start, dy_start) - use mo_julian, only: date2dec, dec2date - use mo_message, only: message + use mo_julian, only : date2dec, dec2date + use mo_message, only : message IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! Data series - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask for data points - integer(i4), optional, intent(in) :: yr_start ! year of date of first data point given - integer(i4), optional, intent(in) :: mo_start ! month of date of first data point given + real(dp), dimension(:), intent(in) :: data ! Data series + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask for data points + integer(i4), optional, intent(in) :: yr_start ! year of date of first data point given + integer(i4), optional, intent(in) :: mo_start ! month of date of first data point given ! ! DEFAULT: 1 - integer(i4), optional, intent(in) :: dy_start ! day of date of first data point given + integer(i4), optional, intent(in) :: dy_start ! day of date of first data point given ! ! DEFAULT: 1 - real(dp) :: MaximumMonthlyFlow ! return: maximum of average monthly flow - + real(dp) :: MaximumMonthlyFlow ! return: maximum of average monthly flow + ! local variables - logical, dimension(size(data,1)) :: maske - integer(i4) :: ii ! counter - integer(i4) :: yr, mo, dy, imo ! date variables - integer(i4), dimension(12) :: counter ! number of data points per month - real(dp), dimension(12) :: flow_month ! summed data points per months - real(dp) :: ref_jul_day ! julian day of one day before start day + logical, dimension(size(data, 1)) :: maske + integer(i4) :: ii ! counter + integer(i4) :: yr, mo, dy, imo ! date variables + integer(i4), dimension(12) :: counter ! number of data points per month + real(dp), dimension(12) :: flow_month ! summed data points per months + real(dp) :: ref_jul_day ! julian day of one day before start day if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if if (.not. present(yr_start)) then - call message('mo_signatures: MaximumMonthlyFlow: Year of of data point has to be given!') - stop + call message('mo_signatures: MaximumMonthlyFlow: Year of of data point has to be given!') + stop else - yr = yr_start + yr = yr_start end if if (present(mo_start)) then - mo = mo_start + mo = mo_start else - mo = 1 + mo = 1 end if if (present(dy_start)) then - dy = dy_start + dy = dy_start else - dy = 1 + dy = 1 end if flow_month = 0.0_dp - counter = 0_i4 - ref_jul_day = date2dec(yy=yr, mm=mo, dd=dy) - 1.0_dp - - do ii=1, size(data,1) - if (maske(ii)) then - ! determine current month - call dec2date(ref_jul_day+real(ii,dp), mm=imo) - ! add value - counter(imo) = counter(imo) + 1 - flow_month(imo) = flow_month(imo) + data(ii) - end if + counter = 0_i4 + ref_jul_day = date2dec(yy = yr, mm = mo, dd = dy) - 1.0_dp + + do ii = 1, size(data, 1) + if (maske(ii)) then + ! determine current month + call dec2date(ref_jul_day + real(ii, dp), mm = imo) + ! add value + counter(imo) = counter(imo) + 1 + flow_month(imo) = flow_month(imo) + data(ii) + end if end do if (any(counter == 0_i4)) then - call message('mo_signatures: MaximumMonthlyFlow: There are months with no data points!') - call message(' Aborted!') - stop + call message('mo_signatures: MaximumMonthlyFlow: There are months with no data points!') + call message(' Aborted!') + stop end if ! average - MaximumMonthlyFlow = maxval(flow_month / real(counter,dp)) + MaximumMonthlyFlow = maxval(flow_month / real(counter, dp)) END FUNCTION MaximumMonthlyFlow - + !------------------------------------------------------------------------------- ! NAME ! Moments @@ -679,58 +679,58 @@ END FUNCTION MaximumMonthlyFlow SUBROUTINE Moments(data, mask, mean_data, stddev_data, median_data, max_data, mean_log, stddev_log, median_log, max_log) - use mo_message, only: message - use mo_moment, only: mean, stddev - use mo_percentile, only: median + use mo_message, only : message + use mo_moment, only : mean, stddev + use mo_percentile, only : median IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! Data series - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask for data points - real(dp), optional, intent(out) :: mean_data ! mean of data - real(dp), optional, intent(out) :: stddev_data ! standard deviation of data - real(dp), optional, intent(out) :: median_data ! median of data - real(dp), optional, intent(out) :: max_data ! max/ peak of data - real(dp), optional, intent(out) :: mean_log ! mean of log-transformed data - real(dp), optional, intent(out) :: stddev_log ! standard deviation of log-transformed data - real(dp), optional, intent(out) :: median_log ! median of log-transformed data - real(dp), optional, intent(out) :: max_log ! max/ peak of log-transformed data + real(dp), dimension(:), intent(in) :: data ! Data series + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask for data points + real(dp), optional, intent(out) :: mean_data ! mean of data + real(dp), optional, intent(out) :: stddev_data ! standard deviation of data + real(dp), optional, intent(out) :: median_data ! median of data + real(dp), optional, intent(out) :: max_data ! max/ peak of data + real(dp), optional, intent(out) :: mean_log ! mean of log-transformed data + real(dp), optional, intent(out) :: stddev_log ! standard deviation of log-transformed data + real(dp), optional, intent(out) :: median_log ! median of log-transformed data + real(dp), optional, intent(out) :: max_log ! max/ peak of log-transformed data ! local variables - logical, dimension(size(data,1)) :: maske - real(dp), dimension(size(data,1)) :: logdata + logical, dimension(size(data, 1)) :: maske + real(dp), dimension(size(data, 1)) :: logdata if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if - if ( .not.(present(mean_data)) .and. .not.(present(stddev_data)) .and. & - .not.(present(median_data)) .and. .not.(present(max_data)) .and. & - .not.(present(mean_log)) .and. .not.(present(stddev_log)) .and. & - .not.(present(median_log)) .and. .not.(present(max_log)) ) then - call message('mo_signatures: Moments: None of the optional output arguments is specified') - stop + if (.not.(present(mean_data)) .and. .not.(present(stddev_data)) .and. & + .not.(present(median_data)) .and. .not.(present(max_data)) .and. & + .not.(present(mean_log)) .and. .not.(present(stddev_log)) .and. & + .not.(present(median_log)) .and. .not.(present(max_log))) then + call message('mo_signatures: Moments: None of the optional output arguments is specified') + stop end if - if (present(mean_data)) mean_data = mean(data, mask=maske) - if (present(stddev_data)) stddev_data = stddev(data, mask=maske) - if (present(median_data)) median_data = median(data, mask=maske) - if (present(max_data)) max_data = maxval(data, mask=maske) - - if (present(mean_log) .or. present(stddev_log)) then - where (data > 0.0_dp) - logdata = log(data) - elsewhere - logdata = -9999.0_dp ! will not be used, since mask is set to .false. - maske = .false. - end where - - if (present(mean_log)) mean_log = mean(logdata, mask=maske) - if (present(stddev_log)) stddev_log = stddev(logdata, mask=maske) - if (present(median_log)) median_log = median(logdata, mask=maske) - if (present(max_log)) max_log = maxval(logdata, mask=maske) + if (present(mean_data)) mean_data = mean(data, mask = maske) + if (present(stddev_data)) stddev_data = stddev(data, mask = maske) + if (present(median_data)) median_data = median(data, mask = maske) + if (present(max_data)) max_data = maxval(data, mask = maske) + + if (present(mean_log) .or. present(stddev_log)) then + where (data > 0.0_dp) + logdata = log(data) + elsewhere + logdata = -9999.0_dp ! will not be used, since mask is set to .false. + maske = .false. + end where + + if (present(mean_log)) mean_log = mean(logdata, mask = maske) + if (present(stddev_log)) stddev_log = stddev(logdata, mask = maske) + if (present(median_log)) median_log = median(logdata, mask = maske) + if (present(max_log)) max_log = maxval(logdata, mask = maske) end if END SUBROUTINE Moments @@ -801,69 +801,69 @@ END SUBROUTINE Moments FUNCTION PeakDistribution(data, quantiles, mask, slope_peak_distribution) - USE mo_percentile, only: percentile + USE mo_percentile, only : percentile IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! data points - real(dp), dimension(:), intent(in) :: quantiles ! percentages of occurence - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask of data points - real(dp), optional, intent(out) :: slope_peak_distribution ! slope of peak flow duration curve - real(dp), dimension(size(quantiles,1)) :: PeakDistribution ! distribution of peaks in data + real(dp), dimension(:), intent(in) :: data ! data points + real(dp), dimension(:), intent(in) :: quantiles ! percentages of occurence + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask of data points + real(dp), optional, intent(out) :: slope_peak_distribution ! slope of peak flow duration curve + real(dp), dimension(size(quantiles, 1)) :: PeakDistribution ! distribution of peaks in data ! ! returns values of distribution at ! ! given quantiles ! local variables - integer(i4) :: ii, jj ! counters - logical, dimension(size(data,1)) :: maske ! mask of data - integer(i4) :: n_peak ! Number of peaks - real(dp), dimension(2) :: pp ! array containing some quantiles - real(dp), dimension(2) :: data_pp ! data points of quantiles pp - real(dp) , allocatable, dimension(:) :: data_peak ! series containing only peak values of original series data + integer(i4) :: ii, jj ! counters + logical, dimension(size(data, 1)) :: maske ! mask of data + integer(i4) :: n_peak ! Number of peaks + real(dp), dimension(2) :: pp ! array containing some quantiles + real(dp), dimension(2) :: data_pp ! data points of quantiles pp + real(dp), allocatable, dimension(:) :: data_peak ! series containing only peak values of original series data ! checking optionals if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if - + ! count peaks - n_peak=0_i4 - do jj=2, size(data,1)-1 - if (maske(jj-1) .and. maske(jj) .and. maske(jj+1)) then - if ( (data(jj-1) .le. data(jj)) .and. (data(jj+1) .le. data(jj)) ) then - n_peak = n_peak+1_i4 - end if - end if + n_peak = 0_i4 + do jj = 2, size(data, 1) - 1 + if (maske(jj - 1) .and. maske(jj) .and. maske(jj + 1)) then + if ((data(jj - 1) .le. data(jj)) .and. (data(jj + 1) .le. data(jj))) then + n_peak = n_peak + 1_i4 + end if + end if end do allocate(data_peak(n_peak)) ! find peaks - jj=0 - do ii=2, size(data,1)-1 - if (maske(ii-1) .and. maske(ii) .and. maske(ii+1)) then - if( (data(ii-1) .le. data(ii)) .and. (data(ii+1) .le. data(ii)) ) then - jj=jj+1_i4 - data_peak(jj)=data(ii) - end if - end if + jj = 0 + do ii = 2, size(data, 1) - 1 + if (maske(ii - 1) .and. maske(ii) .and. maske(ii + 1)) then + if((data(ii - 1) .le. data(ii)) .and. (data(ii + 1) .le. data(ii))) then + jj = jj + 1_i4 + data_peak(jj) = data(ii) + end if + end if end do if (present(slope_peak_distribution)) then - ! calculate slope between 10% and 50% quantiles, per definition - pp = (/ 0.1_dp, 0.5_dp /) - data_pp = percentile(data_peak,(1.0_dp-pp)*100._dp, mode_in=5) ! (1-p) because exceedence probability is required - slope_peak_distribution = (data_pp(1)-data_pp(2))/(0.9_dp-0.5_dp) + ! calculate slope between 10% and 50% quantiles, per definition + pp = (/ 0.1_dp, 0.5_dp /) + data_pp = percentile(data_peak, (1.0_dp - pp) * 100._dp, mode_in = 5) ! (1-p) because exceedence probability is required + slope_peak_distribution = (data_pp(1) - data_pp(2)) / (0.9_dp - 0.5_dp) end if - PeakDistribution = percentile(data_peak,(1.0_dp-Quantiles)*100._dp, mode_in=5) - deallocate( data_peak) + PeakDistribution = percentile(data_peak, (1.0_dp - Quantiles) * 100._dp, mode_in = 5) + deallocate(data_peak) END FUNCTION PeakDistribution - !------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- ! NAME ! RunoffRatio @@ -937,53 +937,53 @@ END FUNCTION PeakDistribution FUNCTION RunoffRatio(data, basin_area, mask, precip_series, precip_sum, log_data) - use mo_message, only: message + use mo_message, only : message IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! Discharge series [m**3/s] - real(dp), intent(in) :: basin_area ! Basin area [km**2] - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask for data points - real(dp), dimension(size(data,1)), optional, intent(in) :: precip_series ! series of daily precip. [mm/km**2 / d] + real(dp), dimension(:), intent(in) :: data ! Discharge series [m**3/s] + real(dp), intent(in) :: basin_area ! Basin area [km**2] + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask for data points + real(dp), dimension(size(data, 1)), optional, intent(in) :: precip_series ! series of daily precip. [mm/km**2 / d] ! ! optional mask will be applied - real(dp), optional, intent(in) :: precip_sum ! sum of daily precip. [mm/km**2 / d] + real(dp), optional, intent(in) :: precip_sum ! sum of daily precip. [mm/km**2 / d] ! ! optional mask will not be applied - logical, optional, intent(in) :: log_data ! if log(data) is used in ratio + logical, optional, intent(in) :: log_data ! if log(data) is used in ratio ! ! DEFAULT: .false. - real(dp) :: RunoffRatio ! sum(data) / sum(precip) + real(dp) :: RunoffRatio ! sum(data) / sum(precip) ! local variables - logical, dimension(size(data,1)) :: maske ! mask of data - logical :: log_dat ! if logarithmic data are used --> sum(log(data)) / sum(precip) - real(dp) :: sum_discharge - real(dp) :: sum_precip + logical, dimension(size(data, 1)) :: maske ! mask of data + logical :: log_dat ! if logarithmic data are used --> sum(log(data)) / sum(precip) + real(dp) :: sum_discharge + real(dp) :: sum_precip ! checking optionals if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if if (present(log_data)) then - log_dat = log_data + log_dat = log_data else - log_dat = .false. + log_dat = .false. end if - if ( (present(precip_series) .and. present(precip_sum)) .or. & - (.not. present(precip_series) .and. .not. present(precip_sum)) ) then - call message('mo_signatures: RunoffRatio: Exactly one precipitation information') - call message(' (precipitation series or sum of precipitation) ') - call message(' has to be specified!') - stop + if ((present(precip_series) .and. present(precip_sum)) .or. & + (.not. present(precip_series) .and. .not. present(precip_sum))) then + call message('mo_signatures: RunoffRatio: Exactly one precipitation information') + call message(' (precipitation series or sum of precipitation) ') + call message(' has to be specified!') + stop end if if (present(mask) .and. present(precip_sum)) then - call message('mo_signatures: RunoffRatio: Already aggregated precipitation (precip_sum) and' ) - call message(' mask can not be used together.') - call message(' Precip_series should be used instead!') - stop + call message('mo_signatures: RunoffRatio: Already aggregated precipitation (precip_sum) and') + call message(' mask can not be used together.') + call message(' Precip_series should be used instead!') + stop end if ! mhm output [m**3/s] --> required [mm/d] @@ -993,15 +993,15 @@ FUNCTION RunoffRatio(data, basin_area, mask, precip_series, precip_sum, log_data ! => [m**3/(s km**2) * 86.4 ] = [mm/d] ! => discharge value [m**3/s] / catchment area [km**2] * 86.4 [km**2 s/m**3 * mm/d] if (log_dat) then - sum_discharge = sum(log(data)*86.4_dp/basin_area,mask=maske) + sum_discharge = sum(log(data) * 86.4_dp / basin_area, mask = maske) else - sum_discharge = sum(data*86.4_dp/basin_area,mask=maske) + sum_discharge = sum(data * 86.4_dp / basin_area, mask = maske) end if if (present(precip_sum)) then - sum_precip = precip_sum + sum_precip = precip_sum else - sum_precip = sum(precip_series,mask=maske) + sum_precip = sum(precip_series, mask = maske) end if RunoffRatio = sum_discharge / sum_precip @@ -1060,35 +1060,35 @@ END FUNCTION RunoffRatio FUNCTION ZeroFlowRatio(data, mask) - use mo_message, only: message - use mo_utils, only: eq + use mo_message, only : message + use mo_utils, only : eq IMPLICIT NONE - real(dp), dimension(:), intent(in) :: data ! Data series - logical, dimension(size(data,1)), optional, intent(in) :: mask ! mask for data points - real(dp) :: ZeroFlowRatio ! Autocorrelation of data at given lags + real(dp), dimension(:), intent(in) :: data ! Data series + logical, dimension(size(data, 1)), optional, intent(in) :: mask ! mask for data points + real(dp) :: ZeroFlowRatio ! Autocorrelation of data at given lags ! local variables - logical, dimension(size(data,1)) :: maske ! mask of data - integer(i4) :: nall ! total number of data points - integer(i4) :: nzero ! number of zero data points + logical, dimension(size(data, 1)) :: maske ! mask of data + integer(i4) :: nall ! total number of data points + integer(i4) :: nzero ! number of zero data points ! checking optionals if (present(mask)) then - maske = mask + maske = mask else - maske = .true. + maske = .true. end if - nall = count(maske) + nall = count(maske) nzero = count(maske .and. (eq(data, 0.0_dp))) if (nall > 0) then - ZeroFlowRatio = real(nzero, dp) / real(nall, dp) + ZeroFlowRatio = real(nzero, dp) / real(nall, dp) else - call message('mo_signatures: ZeroFlowRatio: all data points are masked') - stop + call message('mo_signatures: ZeroFlowRatio: all data points are masked') + stop end if END FUNCTION ZeroFlowRatio diff --git a/src/mRM/mo_mrm_tools.f90 b/src/mRM/mo_mrm_tools.f90 deleted file mode 100644 index 25396412..00000000 --- a/src/mRM/mo_mrm_tools.f90 +++ /dev/null @@ -1,272 +0,0 @@ -!> \file mo_mrm_tools.f90 - -!> \brief Provide utility routines used within mRM. - -!> \details This module contains subroutines that are used frequently -!> to obtain basin and grid properties. - -!> \author Luis Samaniego -!> \date Dec 2012 -! Modified -! Stephan Thober, Aug 2015 - adapted to mRM -module mo_mrm_tools - implicit none - public :: get_basin_info_mrm - public :: calculate_grid_properties - private -contains - ! ------------------------------------------------------------------ - - ! NAME - ! get_basin_info_mrm - - !> \brief Get basic basin information (e.g., nrows, ncols, indices, mask) - - !> \details Get basic basin information (e.g., nrows, ncols, indices, mask) for - !> different levels (L0, L1, L11, and L110). - ! - ! CALLING SEQUENCE - ! call get_basin_info_mrm(iBasin, iLevel,nrows,ncols, ncells, iStart, iEnd, & - ! iStartMask, iEndMask, mask, xllcorner, yllcorner, cellsize) - - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" basin id - !> \param[in] "integer(i4) :: iLevel" level id (e.g., 0, 1, 11, 2) - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "integer(i4) :: nRows" no. of rows - !> \param[out] "integer(i4) :: nCols" no. of coloums - !> \param[out] "integer(i4) :: ncells" no. of cells - !> \param[out] "integer(i4) :: iStart" start cell index of a given basin at a given level - !> \param[out] "integer(i4) :: iEnd" end cell index of a given basin at a given level - !> \param[out] "integer(i4) :: iStartMask" start cell index of mask a given basin at a given level - !> \param[out] "integer(i4) :: iEndMask" end cell index of mask a given basin at a given level - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - !> \param[out] "logical, optional :: mask" Mask at a given level - !> \param[out] "real(dp), optional :: xllcorner" x coordinate of the lowerleft corner at a given level - !> \param[out] "real(dp), optional :: yllcorner" y coordinate of the lowerleft corner at a given level - !> \param[out] "real(dp), optional :: cellsize" cell size at a given level - - ! RETURN - - ! RESTRICTIONS - !> \note This subroutine cannot be called for level 2, that does not exist within mRM. - - ! EXAMPLE - - ! LITERATURE - - ! HISTORY - ! \authors Rohini Kumar, Luis Samaniego - ! \date Jan 2013 - ! Modified, R. Kumar, Sep 2013 - documentation added according to the template - ! Stephan Thober, Aug 2015 - adapted for mRM - - subroutine get_basin_info_mrm(iBasin, iLevel, nrows, ncols, ncells, iStart, iEnd, & - iStartMask, iEndMask, mask, xllcorner, yllcorner, cellsize) - use mo_kind, only: i4, dp - use mo_message, only: message - use mo_mrm_global_variables, only: level0, level1, level11, basin_mrm - implicit none - - integer(i4), intent(in) :: iBasin - integer(i4), intent(in) :: iLevel - integer(i4), intent(out) :: nrows, ncols - integer(i4), optional, intent(out) :: ncells - integer(i4), optional, intent(out) :: iStart, iEnd - integer(i4), optional, intent(out) :: iStartMask, iEndMask - logical, optional, dimension(:,:), allocatable, intent(out) :: mask - real(dp), optional, intent(out) :: xllcorner, yllcorner, cellsize - - ! level information - select case (iLevel) - case (0) - nrows = level0%nrows(iBasin) - ncols = level0%ncols(iBasin) - if (present(ncells)) ncells = basin_mrm%L0_iEnd(iBasin) - basin_mrm%L0_iStart(iBasin) + 1 - if (present(iStart)) iStart = basin_mrm%L0_iStart(iBasin) - if (present(iEnd)) iEnd = basin_mrm%L0_iEnd(iBasin) - if (present(iStartMask)) iStartMask = basin_mrm%L0_iStartMask(iBasin) - if (present(iEndMask)) iEndMask = basin_mrm%L0_iEndMask(iBasin) - if (present(Mask)) then - allocate ( mask(nrows, ncols) ) - mask(:,:) = .FALSE. - mask(:,:) = RESHAPE( basin_mrm%L0_Mask( basin_mrm%L0_iStartMask(iBasin): basin_mrm%L0_iEndMask(iBasin)),& - (/nrows,ncols/) ) - end if - if (present(xllcorner)) xllcorner = level0%xllcorner(iBasin) - if (present(yllcorner)) yllcorner = level0%yllcorner(iBasin) - if (present(cellsize)) cellsize = level0%cellsize(iBasin) - - case (1) - nrows = level1%nrows(iBasin) - ncols = level1%ncols(iBasin) - if (present(ncells)) ncells = basin_mrm%L1_iEnd(iBasin) - basin_mrm%L1_iStart(iBasin) + 1 - if (present(iStart)) iStart = basin_mrm%L1_iStart(iBasin) - if (present(iEnd)) iEnd = basin_mrm%L1_iEnd(iBasin) - if (present(iStartMask)) iStartMask = basin_mrm%L1_iStartMask(iBasin) - if (present(iEndMask)) iEndMask = basin_mrm%L1_iEndMask(iBasin) - if (present(Mask)) then - allocate ( mask(nrows, ncols) ) - mask(:,:) = .FALSE. - mask(:,:) = RESHAPE( basin_mrm%L1_Mask( basin_mrm%L1_iStartMask(iBasin): basin_mrm%L1_iEndMask(iBasin)),& - (/nrows,ncols/) ) - end if - if (present(xllcorner)) xllcorner = level1%xllcorner(iBasin) - if (present(yllcorner)) yllcorner = level1%yllcorner(iBasin) - if (present(cellsize)) cellsize = level1%cellsize(iBasin) - - case (11) - nrows = level11%nrows(iBasin) - ncols = level11%ncols(iBasin) - if (present(ncells)) ncells = basin_mrm%L11_iEnd(iBasin) - basin_mrm%L11_iStart(iBasin) + 1 - if (present(iStart)) iStart = basin_mrm%L11_iStart(iBasin) - if (present(iEnd)) iEnd = basin_mrm%L11_iEnd(iBasin) - if (present(iStartMask)) iStartMask = basin_mrm%L11_iStartMask(iBasin) - if (present(iEndMask)) iEndMask = basin_mrm%L11_iEndMask(iBasin) - if (present(Mask)) then - allocate ( mask(nrows, ncols) ) - mask(:,:) = .FALSE. - mask(:,:) = RESHAPE( basin_mrm%L11_Mask( basin_mrm%L11_iStartMask(iBasin): basin_mrm%L11_iEndMask(iBasin)),& - (/nrows,ncols/) ) - end if - if (present(xllcorner)) xllcorner = level11%xllcorner(iBasin) - if (present(yllcorner)) yllcorner = level11%yllcorner(iBasin) - if (present(cellsize)) cellsize = level11%cellsize(iBasin) - - case (110) - if (present(iStart)) iStart = basin_mrm%L110_iStart(iBasin) - if (present(iEnd)) iEnd = basin_mrm%L110_iEnd(iBasin) - - case (2) - call message('***ERROR: get_basin_info_mrm has been called for level2 that does not exist within mRM') - call message('***ERROR: use get_basin_info from mhm instead') - stop - - end select - - end subroutine get_basin_info_mrm - - ! ------------------------------------------------------------------ - - ! NAME - ! calculate_grid_properties - - ! PURPOSE - !> \brief Calculates basic grid properties at a required coarser level using - !> information of a given finer level. - - !> \brief Calculates basic grid properties at a required coarser level (e.g., L11) using - !> information of a given finer level (e.g., L0). Basic grid properties such as - !> nrows, ncols, xllcorner, yllcorner cellsize are estimated in this - !> routine. - - ! CALLING SEQUENCE - ! call calculate_grid_properties( nrowsIn, ncolsIn, xllcornerIn, & - ! yllcornerIn, cellsizeIn, nodata_valueIn, & - ! aimingResolution, nrowsOut, ncolsOut, xllcornerOut, & - ! yllcornerOut, cellsizeOut, nodata_valueOut ) - ! INTENT(IN) - !> \param[in] "integer(i4) :: nrowsIn" no. of rows at an input level - !> \param[in] "integer(i4) :: ncolsIn" no. of cols at an input level - !> \param[in] "real(dp) :: xllcornerIn" xllcorner at an input level - !> \param[in] "real(dp) :: yllcornerIn" yllcorner at an input level - !> \param[in] "real(dp) :: cellsizeIn" cell size at an input level - !> \param[in] "real(dp) :: nodata_valueIn" nodata value at an input level - !> \param[in] "real(dp) :: aimingResolution" resolution of an output level - - ! INTENT(INOUT) - ! None - - ! INTENT(OUT) - !> \param[out] "integer(i4) :: nrowsOut" no. of rows at an output level - !> \param[out] "integer(i4) :: ncolsOut" no. of cols at an output level - !> \param[out] "real(dp) :: xllcornerOut" xllcorner at an output level - !> \param[out] "real(dp) :: yllcornerOut" yllcorner at an output level - !> \param[out] "real(dp) :: cellsizeOut" cell size at an output level - !> \param[out] "real(dp) :: nodata_valueOut" nodata value at an output level - - ! INTENT(IN), OPTIONAL - ! None - - ! INTENT(INOUT), OPTIONAL - ! None - - ! INTENT(OUT), OPTIONAL - ! None - - ! RETURN - ! None - - ! RESTRICTIONS - !> \note resolutions of input and output levels should confirm each other. - - ! EXAMPLE - ! None - - ! LITERATURE - ! None - - ! HISTORY - !> \author Matthias Zink & Rohini Kumar - !> \date Feb 2013 - ! Modified, R. Kumar, Sep 2013 - documentation added according to the template - - subroutine calculate_grid_properties( & - nrowsIn, ncolsIn, xllcornerIn, yllcornerIn, cellsizeIn, nodata_valueIn, & - aimingResolution, & - nrowsOut, ncolsOut, xllcornerOut, yllcornerOut, cellsizeOut, nodata_valueOut ) - use mo_kind, only: i4, dp - use mo_message, only: message ! for print out - use mo_string_utils, only: num2str - - implicit none - - integer(i4), intent(in) :: nrowsIn - integer(i4), intent(in) :: ncolsIn - real(dp), intent(in) :: xllcornerIn - real(dp), intent(in) :: yllcornerIn - real(dp), intent(in) :: cellsizeIn - real(dp), intent(in) :: nodata_valueIn - real(dp), intent(in) :: aimingResolution - - integer(i4), intent(out) :: nrowsOut - integer(i4), intent(out) :: ncolsOut - real(dp), intent(out) :: xllcornerOut - real(dp), intent(out) :: yllcornerOut - real(dp), intent(out) :: cellsizeOut - real(dp), intent(out) :: nodata_valueOut - - ! local variables - real(dp) :: cellfactor - - cellFactor = aimingResolution / cellsizeIn - - if ( nint(mod(aimingResolution, cellsizeIn)) .ne. 0) then - call message() - call message('***ERROR: Two resolutions size do not confirm: ', & - trim(adjustl(num2str(nint(AimingResolution)))), ' and ', & - trim(adjustl(num2str(nint(cellsizeIn)))) ) - stop - end if - - cellsizeOut = cellsizeIn * cellFactor - ncolsOut = ceiling( real(ncolsIn, dp) / cellFactor) - nrowsOut = ceiling( real(nrowsIn, dp) / cellFactor) - xllcornerOut = xllcornerIn + real(ncolsIn,dp) * cellsizeIn - real(ncolsOut,dp) * cellsizeOut - yllcornerOut = yllcornerIn + real(nrowsIn,dp) * cellsizeIn - real(nrowsOut,dp) * cellsizeOut - nodata_valueOut = nodata_valueIn - - end subroutine calculate_grid_properties - -end module mo_mrm_tools diff --git a/src/mRM/mo_mrm_write.f90 b/src/mRM/mo_mrm_write.f90 index 08909bfd..af0fa4a0 100644 --- a/src/mRM/mo_mrm_write.f90 +++ b/src/mRM/mo_mrm_write.f90 @@ -10,18 +10,18 @@ !> \date Aug 2015 module mo_mrm_write - use mo_kind, only: i4, dp + use mo_kind, only : i4, dp use mo_mrm_write_fluxes_states, only : OutputDataset - + implicit none public :: mrm_write public :: mrm_write_output_fluxes public :: mrm_write_optinamelist public :: mrm_write_optifile - + private - + ! counters for write_output_fluxes integer(i4) :: day_counter ! for daily output integer(i4) :: month_counter ! for monthly output @@ -81,14 +81,18 @@ module mo_mrm_write subroutine mrm_write() - use mo_mrm_global_variables, only: & - mRM_runoff, & - gauge, nGaugesTotal, basin_mrm, nBasins, evalPer, warmingDays_mrm, simPer, & - ntstepday, write_restart, dirRestartOut, mrm_coupling_mode - use mo_mrm_restart, only: mrm_write_restart + use mo_mrm_global_variables, only : & + mRM_runoff, & + gauge, nGaugesTotal, basin_mrm + use mo_mrm_restart, only : mrm_write_restart + use mo_common_mhm_mrm_variables, only : & + evalPer, warmingDays, simPer, mrm_coupling_mode, nTstepDay + use mo_common_variables, only : & + nBasins, & + dirRestartOut, write_restart implicit none - + ! local variables integer(i4) :: iBasin integer(i4) :: iDay, iS, iE @@ -96,22 +100,22 @@ subroutine mrm_write() integer(i4) :: tt integer(i4) :: gg integer(i4) :: nTimeSteps - real(dp), dimension(:,:), allocatable :: d_Qmod + real(dp), dimension(:, :), allocatable :: d_Qmod ! -------------------------------------------------------------------------- ! WRITE CONFIG FILE ! -------------------------------------------------------------------------- - if (mrm_coupling_mode .ne. 2) call write_configfile() + if (mrm_coupling_mode .eq. 0_i4) call write_configfile() ! -------------------------------------------------------------------------- ! WRITE RESTART ! -------------------------------------------------------------------------- if (write_restart) then - do iBasin = 1, nBasins - call mrm_write_restart(iBasin, dirRestartOut) - end do + do iBasin = 1, nBasins + call mrm_write_restart(iBasin, dirRestartOut) + end do end if - + ! -------------------------------------------------------------------------- ! STORE DAILY DISCHARGE TIMESERIES OF EACH GAUGING STATION ! FOR SIMULATIONS DURING THE EVALUATION PERIOD @@ -120,31 +124,31 @@ subroutine mrm_write() ! Note:: Observed Q are stored only for the evaluation period and not for ! the warming days ! -------------------------------------------------------------------------- - ii = maxval( evalPer(1:nBasins)%julEnd - evalPer(1:nBasins)%julStart + 1 ) - allocate( d_Qmod(ii, nGaugesTotal) ) + ii = maxval(evalPer(1 : nBasins)%julEnd - evalPer(1 : nBasins)%julStart + 1) + allocate(d_Qmod(ii, nGaugesTotal)) d_Qmod = 0.0_dp ! loop over basins do ii = 1, nBasins - nTimeSteps = ( simPer(ii)%julEnd - simPer(ii)%julStart + 1 ) * NTSTEPDAY - iDay = 0 - ! loop over timesteps - do tt = warmingDays_mrm(ii)*NTSTEPDAY+1, nTimeSteps, NTSTEPDAY - iS = tt - iE = tt + NTSTEPDAY - 1 - iDay = iDay + 1 - ! over gauges - do gg = 1, basin_mrm%nGauges(ii) - d_Qmod(iDay, basin_mrm%gaugeIndexList(ii,gg) ) = & - sum( mRM_runoff(iS:iE, basin_mrm%gaugeIndexList(ii,gg)) )/ real(NTSTEPDAY,dp) - end do - ! - end do + nTimeSteps = (simPer(ii)%julEnd - simPer(ii)%julStart + 1) * NTSTEPDAY + iDay = 0 + ! loop over timesteps + do tt = warmingDays(ii) * NTSTEPDAY + 1, nTimeSteps, NTSTEPDAY + iS = tt + iE = tt + NTSTEPDAY - 1 + iDay = iDay + 1 + ! over gauges + do gg = 1, basin_mrm(ii)%nGauges + d_Qmod(iDay, basin_mrm(ii)%gaugeIndexList(gg)) = & + sum(mRM_runoff(iS : iE, basin_mrm(ii)%gaugeIndexList(gg))) / real(NTSTEPDAY, dp) + end do + ! + end do end do ! write in an ASCII file ! OBS[nModeling_days X nGauges_total] , SIM[nModeling_days X nGauges_total] - call write_daily_obs_sim_discharge( gauge%Q(:,:), d_Qmod(:,:) ) + call write_daily_obs_sim_discharge(gauge%Q(:, :), d_Qmod(:, :)) ! free space - deallocate(d_Qmod) + deallocate(d_Qmod) end subroutine mrm_write ! ------------------------------------------------------------------ @@ -196,100 +200,102 @@ end subroutine mrm_write ! Stephan Thober, Sep 2015 - updated write of stream network ! Stephan Thober, Nov 2016 - adapted write to selected case for routing process - Subroutine write_configfile() - - use mo_utils, only: ge - use mo_kind, only: i4, dp - use mo_mrm_constants, only: nodata_dp - use mo_message, only: message - use mo_string_utils, only: num2str - USE mo_mrm_file, only: file_config, uconfig, version - use mo_mrm_global_variables, only: & - mrm_coupling_mode, & - nBasins, & - basin_mrm, & - gauge, & - InflowGauge, & - L11_nCells, & - L11_netPerm, & - L11_fromN, & - L11_toN, & - L11_rOrder, & - L11_label, & - L11_length, & - L11_slope, & - L11_ID, & - L11_L1_Id, & - L1_areaCell, & - L1_L11_Id, & - L0_nCells, & - L1_nCells, & - nGaugesTotal, & - nInflowGaugesTotal, & - resolutionRouting, & - dirGauges, & - dirTotalRunoff, & - timeStep, & - resolutionHydrology, & - read_restart, & - write_restart, & - dirConfigOut, & - dirMorpho, & - dirLCover, & - dirOut, & - dirRestartOut, & - warmPer, & - evalPer, & - SimPer, & - LCyearId, & - LCfilename - - use mo_common_variables, only: & - processMatrix, & - global_parameters, & - global_parameters_name + Subroutine write_configfile() + + use mo_utils, only : ge + use mo_kind, only : i4, dp + use mo_common_constants, only : nodata_dp + use mo_message, only : message + use mo_string_utils, only : num2str + USE mo_mrm_file, only : version + USE mo_common_file, only : file_config, uconfig + use mo_mrm_global_variables, only : & + level11, & + basin_mrm, & + gauge, & + InflowGauge, & + L11_netPerm, & + L11_fromN, & + L11_toN, & + L11_rOrder, & + L11_label, & + L11_length, & + L11_slope, & + L11_L1_Id, & + L1_L11_Id, & + nGaugesTotal, & + nInflowGaugesTotal, & + dirGauges, & + dirTotalRunoff + + use mo_common_mHM_mRM_variables, only : & + mrm_coupling_mode, & + read_restart, & + resolutionRouting, & + LCyearId, & + timeStep, & + warmPer, & + evalPer, & + SimPer + use mo_common_variables, only : & + level0, level1, L0_Basin, & + write_restart, & + dirRestartOut, & + nBasins, & + resolutionHydrology, & + processMatrix, & + global_parameters, & + global_parameters_name, & + LCfilename, & + nLCoverScene, & + LC_year_start, & + LC_year_end, & + dirConfigOut, & + dirMorpho, & + dirLCover, & + dirOut implicit none ! ! local ! - character(256) :: fName - integer(i4) :: i, j, n - integer(i4) :: err + character(256) :: fName + integer(i4) :: i, j, n + integer(i4) :: err - fName= trim(adjustl(dirConfigOut))//trim(adjustl(file_config)) + fName = trim(adjustl(dirConfigOut)) // trim(adjustl(file_config)) call message() call message(' Log-file written to ', trim(fName)) - open(uconfig, file=fName, status='unknown', action='write', iostat=err) + open(uconfig, file = fName, status = 'unknown', action = 'write', iostat = err) if (err .ne. 0) then - call message(' Problems while creating File' ) - call message(' Error-Code', num2str(err) ) - stop + call message(' Problems while creating File') + call message(' Error-Code', num2str(err)) + stop end if - write(uconfig, 200) - write(uconfig, 100) 'mRM-UFZ v-'//trim(version) + write(uconfig, 200) + write(uconfig, 100) 'mRM-UFZ v-' // trim(version) write(uconfig, 100) 'S. Thober, L. Samaniego & R. Kumar, UFZ' - write(uconfig, 200) + write(uconfig, 200) write(uconfig, 100) write(uconfig, 201) ' M A I N mRM C O N F I G U R A T I O N I N F O R M A T I O N ' write(uconfig, 100) write(uconfig, 103) 'Number of basins ', nBasins - write(uconfig, 103) 'Total No. of nodes ', L11_nCells - write(uconfig, 103) 'Total No. of reaches ', L11_nCells-1 - write(uconfig, 103) 'No. of cells L0 ', L0_nCells - write(uconfig, 103) 'No. of cells L1 ', L1_nCells - write(uconfig, 103) 'No. of cells L11 ', L11_nCells write(uconfig, 103) 'Total No. of gauges ', nGaugesTotal write(uconfig, 103) 'Time Step [h] ', timeStep - do i=1, nBasins - ! select case (iFlag_cordinate_sys) - ! case (0) - write(uconfig, 301) 'Basin ',i, ' Hydrology Resolution [m] ', resolutionHydrology(i) - write(uconfig, 301) 'Basin ',i, ' Routing Resolution [m] ', resolutionRouting(i) - ! case(1) - ! write(uconfig, 302) 'Basin ',i, ' Hydrology Resolution [o] ', resolutionHydrology(i) - ! write(uconfig, 302) 'Basin ',i, ' Routing Resolution [o] ', resolutionRouting(i) - ! end select + do i = 1, nBasins + write(uconfig, 103) 'Total No. of nodes ', level11(i)%nCells + write(uconfig, 103) 'No. of cells L0 ', level0(L0_Basin(i))%nCells + write(uconfig, 103) 'No. of cells L1 ', level1(i)%nCells + write(uconfig, 103) 'No. of cells L11 ', level11(i)%nCells + + ! select case (iFlag_cordinate_sys) + ! case (0) + write(uconfig, 301) 'Basin ', i, ' Hydrology Resolution [m] ', resolutionHydrology(i) + write(uconfig, 301) 'Basin ', i, ' Routing Resolution [m] ', resolutionRouting(i) + ! case(1) + ! write(uconfig, 302) 'Basin ',i, ' Hydrology Resolution [o] ', resolutionHydrology(i) + ! write(uconfig, 302) 'Basin ',i, ' Routing Resolution [o] ', resolutionRouting(i) + ! end select end do write(uconfig, 126) 'Flag READ restart ', read_restart write(uconfig, 126) 'Flag WRITE restart ', write_restart @@ -298,220 +304,220 @@ Subroutine write_configfile() ! Model Run period !****************** do j = 1, nBasins - write(uconfig, 115) ' Model Run Periods for Basin ', num2str(j) - write(uconfig, 116) & - 'From To', & - ' Day Month Year Day Month Year' - write(uconfig,117) & - 'Warming Period (1) ',& - warmPer(j)%dStart, warmPer(j)%mStart, warmPer(j)%yStart ,& - warmPer(j)%dEnd , warmPer(j)%mEnd , warmPer(j)%yEnd ,& - 'Evaluation Period (2) ',& - evalPer(j)%dStart ,evalPer(j)%mStart , evalPer(j)%yStart ,& - evalPer(j)%dEnd ,evalPer(j)%mEnd , evalPer(j)%yEnd ,& - 'Simulation Period (1)+(2) ',& - SimPer(j)%dStart , SimPer(j)%mStart , SimPer(j)%yStart ,& - SimPer(j)%dEnd , SimPer(j)%mEnd , SimPer(j)%yEnd + write(uconfig, 115) ' Model Run Periods for Basin ', num2str(j) + write(uconfig, 116) & + 'From To', & + ' Day Month Year Day Month Year' + write(uconfig, 117) & + 'Warming Period (1) ', & + warmPer(j)%dStart, warmPer(j)%mStart, warmPer(j)%yStart, & + warmPer(j)%dEnd, warmPer(j)%mEnd, warmPer(j)%yEnd, & + 'Evaluation Period (2) ', & + evalPer(j)%dStart, evalPer(j)%mStart, evalPer(j)%yStart, & + evalPer(j)%dEnd, evalPer(j)%mEnd, evalPer(j)%yEnd, & + 'Simulation Period (1)+(2) ', & + SimPer(j)%dStart, SimPer(j)%mStart, SimPer(j)%yStart, & + SimPer(j)%dEnd, SimPer(j)%mEnd, SimPer(j)%yEnd end do !********************************* ! Model Land Cover Observations !********************************* if (processMatrix(8, 1) .eq. 1) then - do j = 1, nBasins - write(uconfig,118) ' Land Cover Observations for Basin ', num2str(i) - write(uconfig,119) ' Year', ' Land cover scene', 'Land Cover File' - do i=1,SimPer(j)%yEnd-SimPer(j)%yStart+1 - write(uconfig,120) i+SimPer(j)%yStart-1, LCyearId(i+SimPer(j)%yStart-1, j), & - trim(LCfilename(LCyearId(i+SimPer(j)%yStart-1, j))) - end do - end do + do j = 1, nBasins + write(uconfig, 118) ' Land Cover Observations for Basin ', num2str(i) + write(uconfig, 119) ' Start Year', ' End Year', ' Land cover scene', 'Land Cover File' + do i = 1, nLCoverScene + write(uconfig, 120) LC_year_start(i), LC_year_end(i), & + LCyearId(max(evalPer(j)%yStart, LC_year_start(i)), j), trim(LCfilename(i)) + end do + end do end if !********************************* ! Initial Parameter Ranges !********************************* - write(uconfig,121) ' Initial Transfer Function Parameter Ranges (gammas) ' + write(uconfig, 121) ' Initial Transfer Function Parameter Ranges (gammas) ' ! ! Transfer functions - write(uconfig,122) & - ' i', ' min', ' max', ' current', & - ' name' - do i=1, size(global_parameters,1) - write(uconfig,123) & - i, global_parameters(i,1), global_parameters(i,2), global_parameters(i,3), & - trim(adjustl(global_parameters_name(i))) + write(uconfig, 122) & + ' i', ' min', ' max', ' current', & + ' name' + do i = 1, size(global_parameters, 1) + write(uconfig, 123) & + i, global_parameters(i, 1), global_parameters(i, 2), global_parameters(i, 3), & + trim(adjustl(global_parameters_name(i))) end do ! basin runoff data write(uconfig, 202) ' Basin Runoff Data ' - write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' - do i=1, nGaugesTotal - if( any(gauge%Q(:,i) > nodata_dp) ) then - write(uconfig,108) i, gauge%basinId(i), maxval(gauge%Q(:,i), gauge%Q(:,i) > nodata_dp), & - minval(gauge%Q(:,i), gauge%Q(:,i) > nodata_dp) - else - write(uconfig,108) i, gauge%basinId(i), nodata_dp, nodata_dp - end if + write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' + do i = 1, nGaugesTotal + if(any(gauge%Q(:, i) > nodata_dp)) then + write(uconfig, 108) i, gauge%basinId(i), maxval(gauge%Q(:, i), gauge%Q(:, i) > nodata_dp), & + minval(gauge%Q(:, i), gauge%Q(:, i) > nodata_dp) + else + write(uconfig, 108) i, gauge%basinId(i), nodata_dp, nodata_dp + end if end do ! inflow gauge data - if ( nInflowGaugesTotal .GT. 0 ) then - write(uconfig, 202) ' Basin Inflow Data ' - write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' - do i=1, nInflowGaugesTotal - if( all(InflowGauge%Q(:,i) > nodata_dp) ) then - write(uconfig,108) i, InflowGauge%basinId(i), maxval(InflowGauge%Q(:,i), InflowGauge%Q(:,i) > nodata_dp), & - minval(InflowGauge%Q(:,i), InflowGauge%Q(:,i) > nodata_dp) - else - write(uconfig,108) i, InflowGauge%basinId(i), nodata_dp, nodata_dp - end if - end do + if (nInflowGaugesTotal .GT. 0) then + write(uconfig, 202) ' Basin Inflow Data ' + write(uconfig, 107) ' Gauge No.', ' Basin Id', ' Qmax[m3/s]', ' Qmin[m3/s]' + do i = 1, nInflowGaugesTotal + if(all(InflowGauge%Q(:, i) > nodata_dp)) then + write(uconfig, 108) i, InflowGauge%basinId(i), maxval(InflowGauge%Q(:, i), InflowGauge%Q(:, i) > nodata_dp), & + minval(InflowGauge%Q(:, i), InflowGauge%Q(:, i) > nodata_dp) + else + write(uconfig, 108) i, InflowGauge%basinId(i), nodata_dp, nodata_dp + end if + end do end if ! basin config - write(uconfig,218) 'Basin-wise Configuration' - do n=1,nBasins - write(uconfig,103) 'Basin No. ', n, & - 'No. of gauges ', basin_mrm%nGauges(n) - - write(uconfig, 222) 'Directory list' - - write(uconfig, 224) 'Directory to morphological input ', dirMorpho(n) - write(uconfig, 224) 'Directory to land cover input ', dirLCover(n) - write(uconfig, 224) 'Directory to gauging station input ', dirGauges(n) - if (mrm_coupling_mode .eq. 0) then - write(uconfig, 224) 'Directory to simulated runoff input ', dirTotalRunoff(n) - end if - write(uconfig, 224) 'Directory to write output by default ', dirOut(n) - write(uconfig, 224) 'Directory to write output when restarted ', dirRestartOut(n) - - write(uconfig, 102) 'River Network (Routing level)' - write(uconfig, 100) 'Label 0 = intermediate draining cell ' - write(uconfig, 100) 'Label 1 = headwater cell ' - write(uconfig, 100) 'Label 2 = sink cell ' - - if (processMatrix(8, 1) .eq. 1_i4) then - write(uconfig, 104) ' Overall', & - ' From', & - ' To', & - ' Routing', & - ' Label', & - ' Length', & - ' Mean', & - ' Link', & - ' Routing', & - ' Routing', & - ' Sequence', & - ' ', & - ' ', & - ' Slope' - ! - write(uconfig, 105) ' Id', & - ' Node', & - ' Node', & - '', & - '', & - ' [km]', & - ' [o/oo]' - ! - do j=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n)-1 - i=L11_netPerm(j) + basin_mrm%L11_iStart(n) - 1 ! adjust permutation for multi-basin option - write(uconfig,106) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i), & - L11_length(i)/1000.0_dp, L11_slope(i)*1.0e3_dp - end do - - else if (processMatrix(8, 1) .eq. 2_i4) then - write(uconfig, 134) ' Overall', & - ' From', & - ' To', & - ' Routing', & - ' Label', & - ' Link', & - ' Routing', & - ' Routing', & - ' Sequence', & - ' ' - ! - write(uconfig, 135) ' Id', & - ' Node', & - ' Node', & - '', & - '' - ! - do j=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n)-1 - i=L11_netPerm(j) + basin_mrm%L11_iStart(n) - 1 ! adjust permutation for multi-basin option - write(uconfig,136) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i) - end do - end if - ! draining node at L11 - write(uconfig, 109) ' Overall', ' Basin', & - ' Cell', ' Routing', & - ' Id', ' Node Id' - do i=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n) - write(uconfig, 110) i, L11_Id(i) - end do - - ! L1 level information - write(uconfig, 111) ' Modeling', ' Routing', ' Effective', & - ' Cell', ' Cell Id', ' Area', & - ' Id', ' [-]', ' [km2]' - if (ge(resolutionRouting(n), resolutionHydrology(n))) then - do i=basin_mrm%L1_iStart(n), basin_mrm%L1_iEnd(n) - write(uconfig,113) i, L1_L11_Id(i), L1_areaCell(i) - end do - else - do i=basin_mrm%L11_iStart(n), basin_mrm%L11_iEnd(n) - write(uconfig,113) i, L11_L1_Id(i) !, L1_areaCell(i) - end do - end if - write(uconfig,114) ' Total[km2]', sum(L1_areaCell(basin_mrm%L1_iStart(n): basin_mrm%L1_iEnd(n))) + write(uconfig, 218) 'Basin-wise Configuration' + do n = 1, nBasins + write(uconfig, 103) 'Basin No. ', n, & + 'No. of gauges ', basin_mrm(n)%nGauges + + write(uconfig, 222) 'Directory list' + + write(uconfig, 224) 'Directory to morphological input ', dirMorpho(n) + write(uconfig, 224) 'Directory to land cover input ', dirLCover(n) + write(uconfig, 224) 'Directory to gauging station input ', dirGauges(n) + if (mrm_coupling_mode .eq. 0) then + write(uconfig, 224) 'Directory to simulated runoff input ', dirTotalRunoff(n) + end if + write(uconfig, 224) 'Directory to write output by default ', dirOut(n) + write(uconfig, 224) 'Directory to write output when restarted ', dirRestartOut(n) + + write(uconfig, 102) 'River Network (Routing level)' + write(uconfig, 100) 'Label 0 = intermediate draining cell ' + write(uconfig, 100) 'Label 1 = headwater cell ' + write(uconfig, 100) 'Label 2 = sink cell ' + + if (processMatrix(8, 1) .eq. 1_i4) then + write(uconfig, 104) ' Overall', & + ' From', & + ' To', & + ' Routing', & + ' Label', & + ' Length', & + ' Mean', & + ' Link', & + ' Routing', & + ' Routing', & + ' Sequence', & + ' ', & + ' ', & + ' Slope' + ! + write(uconfig, 105) ' Id', & + ' Node', & + ' Node', & + '', & + '', & + ' [km]', & + ' [o/oo]' + ! + do j = level11(n)%iStart, level11(n)%iEnd - 1 + i = L11_netPerm(j) + level11(n)%iStart - 1 ! adjust permutation for multi-basin option + write(uconfig, 106) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i), & + L11_length(i) / 1000.0_dp, L11_slope(i) * 1.0e3_dp + end do + + else if (processMatrix(8, 1) .eq. 2_i4) then + write(uconfig, 134) ' Overall', & + ' From', & + ' To', & + ' Routing', & + ' Label', & + ' Link', & + ' Routing', & + ' Routing', & + ' Sequence', & + ' ' + ! + write(uconfig, 135) ' Id', & + ' Node', & + ' Node', & + '', & + '' + ! + do j = level11(n)%iStart, level11(n)%iEnd - 1 + i = L11_netPerm(j) + level11(n)%iStart - 1 ! adjust permutation for multi-basin option + write(uconfig, 136) i, L11_fromN(i), L11_toN(i), L11_rOrder(i), L11_label(i) + end do + end if + ! draining node at L11 + write(uconfig, 109) ' Overall', ' Basin', & + ' Cell', ' Routing', & + ' Id', ' Node Id' + do i = level11(n)%Id(1), level11(n)%Id(level11(n)%nCells) + write(uconfig, 110) i + level11(n)%iStart - 1, i + end do + + ! L1 level information + write(uconfig, 111) ' Modeling', ' Routing', ' Effective', & + ' Cell', ' Cell Id', ' Area', & + ' Id', ' [-]', ' [km2]' + if (ge(resolutionRouting(n), resolutionHydrology(n))) then + do i = level1(n)%Id(1), level1(n)%Id(level1(n)%nCells) + write(uconfig, 110) i + level1(n)%iStart - 1, L1_L11_Id (i + level1(n)%iStart - 1), level1(n)%CellArea(i) * 1.E-6_dp + end do + else + do i = level11(n)%Id(1), level11(n)%Id(level11(n)%nCells) + write(uconfig, 110) i + level11(n)%iStart - 1, L11_L1_Id (i + level11(n)%iStart - 1) + end do + end if + write(uconfig, 114) ' Total[km2]', sum(level1(n)%CellArea) * 1.E-6_dp end do - write(uconfig,*) - close(uconfig) + write(uconfig, *) + close(uconfig) !! Formats -100 format (a80) -102 format (/ 30('-') / a30 / 30('-') ) -103 format (a20, 10x, i10) -104 format (/ 75('-') / 5a10, 5x, 2a10 / 5a10, 5x, 2a10) -105 format (5a10, 5x, 2a10 / 75('-')) -106 format (5i10, 5x, 2f10.3 ) -107 format (2a10, 2a15) -108 format (2i10, 2f15.3) + 100 format (a80) + 102 format (/ 30('-') / a30 / 30('-')) + 103 format (a20, 10x, i10) + 104 format (/ 75('-') / 5a10, 5x, 2a10 / 5a10, 5x, 2a10) + 105 format (5a10, 5x, 2a10 / 75('-')) + 106 format (5i10, 5x, 2f10.3) + 107 format (2a10, 2a15) + 108 format (2i10, 2f15.3) + ! + 109 format (/ 20('-') / 2a10 / 2a10 / 2a10 / 20('-')) + 110 format (2i10) ! -109 format (/ 20('-') / 2a10 / 2a10 / 2a10 / 20('-') ) -110 format ( 2i10 ) + 111 format (/ 30('-') / 3a10 / 3a10 / 3a10 / 30('-')) + !113 format ( 2i10, 1f10.3 ) + 114 format (30('-') / a15, 5x, 1f10.3 /) ! -111 format (/ 30('-') / 3a10 / 3a10 / 3a10 / 30('-') ) -113 format ( 2i10, 1f10.3 ) -114 format (30('-') / a15, 5x, 1f10.3 / ) + 115 format (/61('-')/ a50, a10 /61('-')) + 116 format (39x, a22 / 25x, a36) + 117 format (3(a25, 6(i6))) ! -115 format (/61('-')/ a50, a10 /61('-')) -116 format (39x,a22 / 25x, a36) -117 format ( 3(a25,6(i6) /) ) + 118 format (/50('-')/ a40, a10 /50('-')) + 119 format (a10, a10, a20, a20/) + 120 format (i10, i10, 10x, i10, a20) ! -118 format (/50('-')/ a40, a10 /50('-')) -119 format (a10, a20, a20/) -120 format (i10, 10x, i10, a20) + 121 format (/55('-')/ a55 /55('-')) + 122 format (a10, 3a15, a35) + 123 format (i10, 3f15.3, a35) ! -121 format (/55('-')/ a55 /55('-')) -122 format (a10, 3a15, a35) -123 format (i10, 3f15.3, a35) + 126 format (a30, 9x, L1) ! -126 format (a30,9x,L1) + 134 format (/ 50('-') / 5a10 / 5a10) + 135 format (5a10 / 50('-')) + 136 format (5i10) ! -134 format (/ 50('-') / 5a10 / 5a10) -135 format (5a10 / 50('-')) -136 format (5i10) -! -200 format (80('-')) -201 format (a80) -202 format (/50('-')/ a50 /50('-')) + 200 format (80('-')) + 201 format (a80) + 202 format (/50('-')/ a50 /50('-')) ! -218 format (/ 80('-')/ 26x, a24,26x, /80('-')) -222 format (/80('-')/ 26x,a21 /80('-')) -224 format (a40, 5x, a256) + 218 format (/ 80('-')/ 26x, a24, 26x, /80('-')) + 222 format (/80('-')/ 26x, a21 /80('-')) + 224 format (a40, 5x, a256) -301 format (a7, i2, a32,f15.0) -! 302 format (a7, i2, a32,es20.8) + 301 format (a7, i2, a32, f15.0) + ! 302 format (a7, i2, a32,es20.8) end Subroutine write_configfile ! ------------------------------------------------------------------ @@ -567,26 +573,27 @@ end Subroutine write_configfile subroutine write_daily_obs_sim_discharge(Qobs, Qsim) - - use mo_errormeasures, only: kge, nse - use mo_julian, only: dec2date - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_utils, only: ge - use mo_mrm_file, only: file_daily_discharge, udaily_discharge, & - ncfile_discharge - use mo_mrm_global_variables, only: & - nBasins, & - basin_mrm, & - dirOut, evalPer, & - gauge - use mo_ncwrite, only: var2nc + use mo_errormeasures, only : kge, nse + use mo_julian, only : dec2date + use mo_message, only : message + use mo_string_utils, only : num2str + use mo_utils, only : ge + use mo_mrm_file, only : file_daily_discharge, udaily_discharge, & + ncfile_discharge + use mo_mrm_global_variables, only : & + basin_mrm, & + gauge + use mo_ncwrite, only : var2nc + use mo_common_mhm_mrm_variables, only : & + evalPer + use mo_common_variables, only : & + nBasins, dirOut implicit none ! input arguments - real(dp), dimension(:,:), intent(in) :: Qobs ! observed time series [nModeling_days X nGauges_total] - real(dp), dimension(:,:), intent(in) :: Qsim ! simulated time series [nModeling_days X nGauges_total] + real(dp), dimension(:, :), intent(in) :: Qobs ! observed time series [nModeling_days X nGauges_total] + real(dp), dimension(:, :), intent(in) :: Qsim ! simulated time series [nModeling_days X nGauges_total] ! local vars character(256) :: fName, formHeader, formData, dummy, dnames(1) @@ -604,91 +611,91 @@ subroutine write_daily_obs_sim_discharge(Qobs, Qsim) ! basin loop do bb = 1, nBasins - if( basin_mrm%nGauges(bb) .lt. 1 ) cycle - - ! estimate igauge_end - igauge_end = igauge_start + basin_mrm%nGauges(bb) - 1 - - ! check the existance of file - fName = trim(adjustl(dirOut(bb))) // trim(adjustl(file_daily_discharge)) - open(udaily_discharge, file=trim(fName), status='unknown', action='write', iostat=err) - if( err .ne. 0 ) then - call message (' IOError while openening ',trim(fName)) - call message (' Error-Code ', num2str(err)) - stop - end if - - ! header - write(formHeader, *) '( 4a8, ' , basin_mrm%nGauges(bb),'(2X, a5, i10.10, 2X, a5, i10.10) )' - write(udaily_discharge, formHeader) 'No', 'Day', 'Mon', 'Year', & - ( 'Qobs_', gauge%gaugeId(gg), & - 'Qsim_', gauge%gaugeId(gg), gg=igauge_start, igauge_end ) - - ! form data - write(formData, *) '( 4I8, ' , basin_mrm%nGauges(bb),'(2X, f15.7 , 2X, f15.7 ) )' - - ! write data - newTime = real(evalPer(bb)%julStart,dp) - 0.5_dp - - do tt = 1, (evalPer(bb)%julEnd - evalPer(bb)%julStart + 1) - call dec2date(newTime, yy=year, mm=month, dd=day) - write(udaily_discharge, formData) tt, day, month, year, ( Qobs(tt,gg), Qsim(tt,gg) , gg=igauge_start, igauge_end ) - newTime = newTime + 1.0_dp - end do - - ! close file - close(udaily_discharge) - - ! ====================================================================== - ! write netcdf file - ! ====================================================================== - dnames(1) = 'time' - ! dnames(2) = 'gauges' - fName = trim(adjustl(dirOut(bb))) // trim(adjustl(ncfile_discharge)) - tlength = evalPer(bb)%julEnd - evalPer(bb)%julStart + 1 - create = .true. - do gg = igauge_start, igauge_end - ! write simulated discharge at that gauge - call var2nc(trim(fName), Qsim(1:tlength, gg), & - dnames(1:1), 'Qsim_' // trim(num2str(gauge%gaugeID(gg), '(i10.10)')), create=create, & - units='m3 s-1', long_name='simulated discharge at gauge ' // trim(num2str(gauge%gaugeID(gg), '(i10.10)'))) - create = .false. - ! write observed discharge at that gauge - call var2nc(trim(fName), Qobs(1:tlength, gg), & - dnames(1:1), 'Qobs_' // trim(num2str(gauge%gaugeID(gg), '(i10.10)')), create=create, & - units='m3 s-1', long_name='observed discharge at gauge ' // trim(num2str(gauge%gaugeID(gg), '(i10.10)'))) - end do - ! add time axis - allocate(taxis(tlength)) - forall(tt = 1:tlength) taxis(tt) = tt * 24 - 1 - call dec2date(real(evalPer(bb)%julStart,dp) - 0.5_dp, yy=year, mm=month, dd=day) - call var2nc(trim(fName), taxis, & - dnames(1:1), dnames(1), & - units='hours since '// & - trim(num2str(year))//'-'//trim(num2str(month, '(i2.2)'))//'-'//trim(num2str(day, '(i2.2)'))// & - ' 00:00:00', & - long_name='time in hours') - deallocate(taxis) - - ! ====================================================================== - ! screen output - ! ====================================================================== - call message() - write(dummy,'(I3)') bb - call message(' OUTPUT: saved daily discharge file for basin ', trim(adjustl(dummy))) - call message(' to ',trim(fname)) - do gg=igauge_start, igauge_end - if (count(ge(Qobs(:,gg), 0.0_dp)) > 1 ) then - call message(' KGE of daily discharge (gauge #',trim(adjustl(num2str(gg))),'): ', & - trim(adjustl(num2str(kge(Qobs(:,gg), Qsim(:,gg), mask=(ge(Qobs(:,gg), 0.0_dp)))))) ) - call message(' NSE of daily discharge (gauge #',trim(adjustl(num2str(gg))),'): ', & - trim(adjustl(num2str(nse(Qobs(:,gg), Qsim(:,gg), mask=(ge(Qobs(:,gg), 0.0_dp)))))) ) - end if - end do - - ! update igauge_start - igauge_start = igauge_end + 1 - ! + if(basin_mrm(bb)%nGauges .lt. 1) cycle + + ! estimate igauge_end + igauge_end = igauge_start + basin_mrm(bb)%nGauges - 1 + + ! check the existance of file + fName = trim(adjustl(dirOut(bb))) // trim(adjustl(file_daily_discharge)) + open(udaily_discharge, file = trim(fName), status = 'unknown', action = 'write', iostat = err) + if(err .ne. 0) then + call message (' IOError while openening ', trim(fName)) + call message (' Error-Code ', num2str(err)) + stop + end if + + ! header + write(formHeader, *) '( 4a8, ', basin_mrm(bb)%nGauges, '(2X, a5, i10.10, 2X, a5, i10.10) )' + write(udaily_discharge, formHeader) 'No', 'Day', 'Mon', 'Year', & + ('Qobs_', gauge%gaugeId(gg), & + 'Qsim_', gauge%gaugeId(gg), gg = igauge_start, igauge_end) + + ! form data + write(formData, *) '( 4I8, ', basin_mrm(bb)%nGauges, '(2X, f15.7 , 2X, f15.7 ) )' + + ! write data + newTime = real(evalPer(bb)%julStart, dp) - 0.5_dp + + do tt = 1, (evalPer(bb)%julEnd - evalPer(bb)%julStart + 1) + call dec2date(newTime, yy = year, mm = month, dd = day) + write(udaily_discharge, formData) tt, day, month, year, (Qobs(tt, gg), Qsim(tt, gg), gg = igauge_start, igauge_end) + newTime = newTime + 1.0_dp + end do + + ! close file + close(udaily_discharge) + + ! ====================================================================== + ! write netcdf file + ! ====================================================================== + dnames(1) = 'time' + ! dnames(2) = 'gauges' + fName = trim(adjustl(dirOut(bb))) // trim(adjustl(ncfile_discharge)) + tlength = evalPer(bb)%julEnd - evalPer(bb)%julStart + 1 + create = .true. + do gg = igauge_start, igauge_end + ! write simulated discharge at that gauge + call var2nc(trim(fName), Qsim(1 : tlength, gg), & + dnames(1 : 1), 'Qsim_' // trim(num2str(gauge%gaugeID(gg), '(i10.10)')), create = create, & + units = 'm3 s-1', long_name = 'simulated discharge at gauge ' // trim(num2str(gauge%gaugeID(gg), '(i10.10)'))) + create = .false. + ! write observed discharge at that gauge + call var2nc(trim(fName), Qobs(1 : tlength, gg), & + dnames(1 : 1), 'Qobs_' // trim(num2str(gauge%gaugeID(gg), '(i10.10)')), create = create, & + units = 'm3 s-1', long_name = 'observed discharge at gauge ' // trim(num2str(gauge%gaugeID(gg), '(i10.10)'))) + end do + ! add time axis + allocate(taxis(tlength)) + forall(tt = 1 : tlength) taxis(tt) = tt * 24 - 1 + call dec2date(real(evalPer(bb)%julStart, dp) - 0.5_dp, yy = year, mm = month, dd = day) + call var2nc(trim(fName), taxis, & + dnames(1 : 1), dnames(1), & + units = 'hours since ' // & + trim(num2str(year)) // '-' // trim(num2str(month, '(i2.2)')) // '-' // trim(num2str(day, '(i2.2)')) // & + ' 00:00:00', & + long_name = 'time in hours') + deallocate(taxis) + + ! ====================================================================== + ! screen output + ! ====================================================================== + call message() + write(dummy, '(I3)') bb + call message(' OUTPUT: saved daily discharge file for basin ', trim(adjustl(dummy))) + call message(' to ', trim(fname)) + do gg = igauge_start, igauge_end + if (count(ge(Qobs(:, gg), 0.0_dp)) > 1) then + call message(' KGE of daily discharge (gauge #', trim(adjustl(num2str(gg))), '): ', & + trim(adjustl(num2str(kge(Qobs(:, gg), Qsim(:, gg), mask = (ge(Qobs(:, gg), 0.0_dp))))))) + call message(' NSE of daily discharge (gauge #', trim(adjustl(num2str(gg))), '): ', & + trim(adjustl(num2str(nse(Qobs(:, gg), Qsim(:, gg), mask = (ge(Qobs(:, gg), 0.0_dp))))))) + end if + end do + + ! update igauge_start + igauge_start = igauge_end + 1 + ! end do ! end subroutine write_daily_obs_sim_discharge @@ -739,28 +746,32 @@ end subroutine write_daily_obs_sim_discharge !> \date Aug 2015 ! Modified, - subroutine mrm_write_output_fluxes( & - iBasin, & - timeStep_model_outputs, & ! timestep of model outputs - warmingDays_mrm, & ! number of warming days - newTime, & ! julian date of next time step - nTimeSteps, & ! number of total timesteps - nTStepDay, & ! number of timesteps per day - tt, & ! current model timestep - day, & ! current day of the year - month, & ! current month of the year - year, & ! current year - timestep, & ! current model time resolution - mask11, & ! mask at level 11 - L11_qmod & ! current routed streamflow - ) - use mo_kind, only: i4, dp - use mo_julian, only: caldat + subroutine mrm_write_output_fluxes(& + iBasin, & + nCells, & + timeStep_model_outputs, & ! timestep of model outputs + warmingDays, & ! number of warming days + newTime, & ! julian date of next time step + nTimeSteps, & ! number of total timesteps + nTStepDay, & ! number of timesteps per day + tt, & ! current model timestep + day, & ! current day of the year + month, & ! current month of the year + year, & ! current year + timestep, & ! current model time resolution + mask11, & ! mask at level 11 + L11_qmod & ! current routed streamflow + ) + use mo_kind, only : i4, dp + use mo_julian, only : caldat + implicit none + ! input variables integer(i4), intent(in) :: iBasin + integer(i4), intent(in) :: nCells integer(i4), intent(in) :: timeStep_model_outputs - integer(i4), intent(in) :: warmingDays_mrm + integer(i4), intent(in) :: warmingDays real(dp), intent(in) :: newTime integer(i4), intent(in) :: nTimeSteps integer(i4), intent(in) :: nTStepDay @@ -769,7 +780,7 @@ subroutine mrm_write_output_fluxes( & integer(i4), intent(in) :: month integer(i4), intent(in) :: year integer(i4), intent(in) :: timestep - logical, intent(in) :: mask11(:,:) + logical, intent(in) :: mask11(:, :) real(dp), intent(in) :: L11_qMod(:) ! local variables integer(i4) :: tIndex_out @@ -778,62 +789,63 @@ subroutine mrm_write_output_fluxes( & integer(i4) :: new_month ! month of next timestep (newTime) integer(i4) :: new_day ! day of next timestep (newTime) ! - if ( tt .EQ. 1 ) then - day_counter = day - month_counter = month - year_counter = year - average_counter = 0_i4 + if (tt .EQ. 1) then + day_counter = day + month_counter = month + year_counter = year + average_counter = 0_i4 end if - + ! update the counters - if (day_counter .NE. day ) day_counter = day + if (day_counter .NE. day) day_counter = day if (month_counter .NE. month) month_counter = month - if (year_counter .NE. year) year_counter = year - call caldat(int(newTime), yy=new_year, mm=new_month, dd=new_day) + if (year_counter .NE. year) year_counter = year + call caldat(int(newTime), yy = new_year, mm = new_month, dd = new_day) ! output only for evaluation period - tIndex_out = (tt-warmingDays_mrm*NTSTEPDAY) ! tt if write out of warming period + tIndex_out = (tt - warmingDays * NTSTEPDAY) ! tt if write out of warming period if ((tIndex_out .gt. 0_i4)) then - average_counter = average_counter + 1 - - ! create output dataset - if ( tIndex_out .EQ. 1 ) nc = OutputDataset(iBasin, mask11) - - ! update Dataset - call nc%updateDataset( & - 1 , & - size(L11_Qmod) , & - L11_Qmod & - ) - - ! determine write flag - writeout = .false. - if (timeStep_model_outputs .gt. 0) then - if ((mod(tIndex_out, timeStep_model_outputs) .eq. 0) .or. (tt .eq. nTimeSteps)) writeout = .true. - else - select case(timeStep_model_outputs) - case(0) ! only at last time step - if (tt .eq. nTimeSteps) writeout = .true. - case(-1) ! daily - if ((day_counter .ne. new_day) .or. (tt .eq. nTimeSteps)) writeout = .true. - case(-2) ! monthly - if ((month_counter .ne. new_month) .or. (tt .eq. nTimeSteps)) writeout = .true. - case(-3) ! yearly - if ((year_counter .ne. new_year) .or. (tt .eq. nTimeSteps)) writeout = .true. - case default ! no output at all - continue - end select - end if - - ! write data - if (writeout) call nc%writeTimestep(tIndex_out*timestep-1) - - ! close dataset - if (tt .eq. nTimeSteps) call nc%close() + average_counter = average_counter + 1 + + ! create output dataset + if (tIndex_out .EQ. 1) nc = OutputDataset(iBasin, mask11, nCells) + ! print*, 'After Init of OutputDatasetInit' + + ! update Dataset + call nc%updateDataset(& + 1, & + size(L11_Qmod), & + L11_Qmod & + ) + + ! determine write flag + writeout = .false. + if (timeStep_model_outputs .gt. 0) then + if ((mod(tIndex_out, timeStep_model_outputs) .eq. 0) .or. (tt .eq. nTimeSteps)) writeout = .true. + else + select case(timeStep_model_outputs) + case(0) ! only at last time step + if (tt .eq. nTimeSteps) writeout = .true. + case(-1) ! daily + if ((day_counter .ne. new_day) .or. (tt .eq. nTimeSteps)) writeout = .true. + case(-2) ! monthly + if ((month_counter .ne. new_month) .or. (tt .eq. nTimeSteps)) writeout = .true. + case(-3) ! yearly + if ((year_counter .ne. new_year) .or. (tt .eq. nTimeSteps)) writeout = .true. + case default ! no output at all + + end select + end if + + ! write data + if (writeout) call nc%writeTimestep(tIndex_out * timestep - 1) + + ! close dataset + if (tt .eq. nTimeSteps) call nc%close() end if - + end subroutine mrm_write_output_fluxes ! ------------------------------------------------------------------ @@ -891,49 +903,49 @@ end subroutine mrm_write_output_fluxes subroutine mrm_write_optifile(best_OF, best_paramSet, param_names) - use mo_mrm_file, only: file_opti, uopti - use mo_mrm_global_variables, only: dirConfigOut - use mo_message, only: message - use mo_string_utils, only: num2str + use mo_common_mhm_mrm_file, only : file_opti, uopti + use mo_common_variables, only : dirConfigOut + use mo_message, only : message + use mo_string_utils, only : num2str implicit none - real(dp), intent(in) :: best_OF - real(dp), dimension(:), intent(in) :: best_paramSet - character(len=*), dimension(:), intent(in) :: param_names + real(dp), intent(in) :: best_OF + real(dp), dimension(:), intent(in) :: best_paramSet + character(len = *), dimension(:), intent(in) :: param_names ! local variables - character(256) :: fName, formHeader, formParams - integer(i4) :: ii, err, n_params + character(256) :: fName, formHeader, formParams + integer(i4) :: ii, err, n_params ! number of parameters n_params = size(best_paramSet) ! open file fName = trim(adjustl(dirConfigOut)) // trim(adjustl(file_opti)) - open(uopti, file=fName, status='unknown', action='write', iostat=err, recl=(n_params+1)*40) - if( err .ne. 0 ) then - call message (' IOError while openening ',trim(fName)) - call message (' Error-Code ', num2str(err)) - stop + open(uopti, file = fName, status = 'unknown', action = 'write', iostat = err, recl = (n_params + 1) * 40) + if(err .ne. 0) then + call message (' IOError while openening ', trim(fName)) + call message (' Error-Code ', num2str(err)) + stop end if ! header - write(formHeader, *) '(a40,',n_params,'a40)' + write(formHeader, *) '(a40,', n_params, 'a40)' ! len(param_names(1))=256 but only 39 characters taken here ! write(uopti, formHeader) 'OF', (trim(adjustl(param_names(ii))), ii=1, n_params) - write(uopti, formHeader) 'OF', (trim(adjustl(param_names(ii)(1:39))), ii=1, n_params) + write(uopti, formHeader) 'OF', (trim(adjustl(param_names(ii)(1 : 39))), ii = 1, n_params) ! output - write(formParams, *) '( es40.14, ', n_params,'(es40.14) )' - write(uopti, formParams) best_OF, (best_paramSet(ii), ii=1, n_params) + write(formParams, *) '( es40.14, ', n_params, '(es40.14) )' + write(uopti, formParams) best_OF, (best_paramSet(ii), ii = 1, n_params) ! close file close(uopti) ! screen output call message() - call message(' Optimized parameters written to ', trim(fName) ) + call message(' Optimized parameters written to ', trim(fName)) end subroutine mrm_write_optifile @@ -992,65 +1004,64 @@ end subroutine mrm_write_optifile subroutine mrm_write_optinamelist(parameters, maskpara, parameters_name) - use mo_mrm_file, only: file_opti_nml, uopti_nml - use mo_mrm_global_variables, only: dirConfigOut - use mo_message, only: message - use mo_string_utils, only: num2str - use mo_common_variables, only: processMatrix + use mo_common_mhm_mrm_file, only : file_opti_nml, uopti_nml + use mo_common_variables, only : dirConfigOut, processMatrix + use mo_message, only : message + use mo_string_utils, only : num2str implicit none - real(dp), dimension(:,:), intent(in) :: parameters ! (min, max, opti) - logical, dimension(size(parameters,1)), intent(in) :: maskpara ! .true. if parameter was calibrated - character(len=*), dimension(size(parameters,1)), intent(in) :: parameters_name ! clear names of parameters + real(dp), dimension(:, :), intent(in) :: parameters ! (min, max, opti) + logical, dimension(size(parameters, 1)), intent(in) :: maskpara ! .true. if parameter was calibrated + character(len = *), dimension(size(parameters, 1)), intent(in) :: parameters_name ! clear names of parameters ! local variables - character(256) :: fName - character(3) :: flag - integer(i4) :: err - integer(i4) :: iPar + character(256) :: fName + character(3) :: flag + integer(i4) :: err + integer(i4) :: iPar ! open file fName = trim(adjustl(dirConfigOut)) // trim(adjustl(file_opti_nml)) - open(uopti_nml, file=fName, status='unknown', action='write', iostat=err) - if( err .ne. 0 ) then - call message (' IOError while openening ',trim(fName)) - call message (' Error-Code ', num2str(err)) - stop + open(uopti_nml, file = fName, status = 'unknown', action = 'write', iostat = err) + if(err .ne. 0) then + call message (' IOError while openening ', trim(fName)) + call message (' Error-Code ', num2str(err)) + stop end if - write(uopti_nml,*) '!global_parameters' - write(uopti_nml,*) '!PARAMETER lower_bound upper_bound value FLAG SCALING' - - write(uopti_nml,*) '! ', trim(adjustl('routing')) - - if (processMatrix(8, 1) .eq. 1_i4) write(uopti_nml,*) '&routing1' - if (ProcessMatrix(8, 1) .eq. 2_i4) write(uopti_nml,*) '&routing2' - - do iPar=1, size(parameters,1) - if (maskpara(iPar)) then - flag=' 1 ' - else - flag=' 0 ' - end if - write(uopti_nml,*) trim(adjustl(parameters_name(iPar))), ' = ', & - parameters(iPar,1), ' , ', & - parameters(iPar,2), ' , ', & - parameters(iPar,3), ' , ', & - flag, ', 1 ' + write(uopti_nml, *) '!global_parameters' + write(uopti_nml, *) '!PARAMETER lower_bound upper_bound value FLAG SCALING' + + write(uopti_nml, *) '! ', trim(adjustl('routing')) + + if (processMatrix(8, 1) .eq. 1_i4) write(uopti_nml, *) '&routing1' + if (ProcessMatrix(8, 1) .eq. 2_i4) write(uopti_nml, *) '&routing2' + + do iPar = 1, size(parameters, 1) + if (maskpara(iPar)) then + flag = ' 1 ' + else + flag = ' 0 ' + end if + write(uopti_nml, *) trim(adjustl(parameters_name(iPar))), ' = ', & + parameters(iPar, 1), ' , ', & + parameters(iPar, 2), ' , ', & + parameters(iPar, 3), ' , ', & + flag, ', 1 ' end do - write(uopti_nml,*) '/' - write(uopti_nml,*) ' ' + write(uopti_nml, *) '/' + write(uopti_nml, *) ' ' ! close file close(uopti_nml) ! screen output call message() - call message(' Optimized parameters written in namelist format to ', trim(fName) ) + call message(' Optimized parameters written in namelist format to ', trim(fName)) end subroutine mrm_write_optinamelist - + end module mo_mrm_write diff --git a/src/mRM/mo_mrm_write_fluxes_states.f90 b/src/mRM/mo_mrm_write_fluxes_states.f90 index 83546c2c..aba4cf7c 100755 --- a/src/mRM/mo_mrm_write_fluxes_states.f90 +++ b/src/mRM/mo_mrm_write_fluxes_states.f90 @@ -15,58 +15,56 @@ module mo_mrm_write_fluxes_states - use mo_kind , only: i4, dp - use mo_string_utils , only: num2str - use mo_mrm_global_variables , only: gridGeoRef, project_details, setup_description, simulation_type, & - Conventions, contact, mHM_details, history - use mo_mrm_constants , only: nodata_dp - use mo_netcdf , only: NcDataset, NcDimension, NcVariable + use mo_kind, only : i4, dp + use mo_common_variables, only : project_details, setup_description, simulation_type, & + Conventions, contact, mHM_details, history + use mo_common_constants, only : nodata_dp + use mo_netcdf, only : NcDataset, NcDimension, NcVariable implicit none type OutputVariable - type(NcVariable) :: nc !> NcDataset which contains the variable - logical :: avg = .false. !> average data before writing - logical, pointer :: mask(:,:) !> mask to reconstruct data - real(dp), allocatable :: data(:) !> store the data between writes - integer(i4) :: counter = 0 !> count the number of updateVariable calls - - contains - procedure, public :: updateVariable - procedure, public :: writeVariableTimestep + type(NcVariable) :: nc !> NcDataset which contains the variable + logical :: avg = .false. !> average data before writing + logical, pointer :: mask(:, :) !> mask to reconstruct data + real(dp), allocatable :: data(:) !> store the data between writes + integer(i4) :: counter = 0 !> count the number of updateVariable calls + + contains + procedure, public :: updateVariable + procedure, public :: writeVariableTimestep end type OutputVariable ! constructor interface interface OutputVariable - procedure newOutputVariable + procedure newOutputVariable end interface OutputVariable type OutputDataset - integer(i4) :: ibasin !> basin id - type(NcDataset) :: nc !> NcDataset to write - type(OutputVariable), allocatable :: vars(:) !> store all created (dynamic) variables - integer(i4) :: counter = 0 !> count written time steps + integer(i4) :: ibasin !> basin id + type(NcDataset) :: nc !> NcDataset to write + type(OutputVariable), allocatable :: vars(:) !> store all created (dynamic) variables + integer(i4) :: counter = 0 !> count written time steps - contains - procedure, public :: updateDataset - procedure, public :: writeTimestep - procedure, public :: close + contains + procedure, public :: updateDataset + procedure, public :: writeTimestep + procedure, public :: close end type OutputDataset ! constructor interface interface OutputDataset - procedure newOutputDataset + procedure newOutputDataset end interface OutputDataset - private - + public :: OutputDataset contains - + !------------------------------------------------------------------ ! NAME ! newOutputVariable @@ -118,18 +116,18 @@ module mo_mrm_write_fluxes_states ! David Schaefer, Nov 2017, added NcVariable initialization function newOutputVariable(nc, name, dtype, dims, ncells, mask, avg) result(out) - type(NcDataset), intent(in) :: nc - character(*), intent(in) :: name - character(*), intent(in) :: dtype - character(16), intent(in) :: dims(3) - integer(i4), intent(in) :: ncells - logical, intent(in), target :: mask(:,:) + type(NcDataset), intent(in) :: nc + character(*), intent(in) :: name + character(*), intent(in) :: dtype + character(16), intent(in) :: dims(3) + integer(i4), intent(in) :: ncells + logical, intent(in), target :: mask(:, :) logical, intent(in), optional :: avg - type(OutputVariable) :: out + type(OutputVariable) :: out allocate(out%data(ncells)) - out%nc = nc%setVariable(name, dtype, dims, deflate_level=1, shuffle=.true.) - out%data = 0 + out%nc = nc%setVariable(name, dtype, dims, deflate_level = 1, shuffle = .true.) + out%data = 0 out%mask => mask if (present(avg)) out%avg = avg end function newOutputVariable @@ -199,9 +197,9 @@ end function newOutputVariable !> \date June 2015 subroutine updateVariable(self, data) class(OutputVariable), intent(inout) :: self - real(dp) , intent(in) :: data(:) + real(dp), intent(in) :: data(:) - self%data = self%data + data + self%data = self%data + data self%counter = self%counter + 1 end subroutine updateVariable @@ -257,19 +255,19 @@ end subroutine updateVariable ! David Schaefer, Sep. 2015 - bugfix subroutine writeVariableTimestep(self, timestep) class(OutputVariable), intent(inout) :: self - integer(i4) , intent(in) :: timestep + integer(i4), intent(in) :: timestep if (self%avg) then - self%data = self%data / real(self%counter, dp) + self%data = self%data / real(self%counter, dp) end if call self%nc%setData(unpack(self%data, self%mask, nodata_dp), & - (/1,1,timestep/)) + (/1, 1, timestep/)) self%data = 0 self%counter = 0 - + end subroutine writeVariableTimestep - + !------------------------------------------------------------------ ! NAME ! newOutputDataset @@ -325,40 +323,43 @@ end subroutine writeVariableTimestep ! David Schaefer , Jun. 2015 - major rewrite ! Stephan Thober , Oct. 2015 - adapted to mRM ! David Schaefer , Nov. 2016 - moved NcVariable initialization to newOutputVariable - function newOutputDataset(ibasin, mask) result(out) + function newOutputDataset(ibasin, mask, nCells) result(out) - use mo_mrm_global_variables, only : outputFlxState_mrm - use mo_mrm_tools, only : get_basin_info_mrm + use mo_mrm_global_variables, only : outputFlxState_mrm integer(i4), intent(in) :: ibasin - logical, target :: mask(:,:) - type(OutputDataset) :: out + logical, intent(in), target :: mask(:, :) + integer(i4), intent(in) :: nCells + type(OutputDataset) :: out ! local - integer(i4) :: ii, ncols, nrows, ncells - character(3) :: dtype - character(16) :: dims1(3) - type(NcDataset) :: nc - type(OutputVariable) :: tmpvars(size(outputFlxState_mrm)) - - call get_basin_info_mrm(ibasin, 11, ncols, nrows, ncells=ncells) + integer(i4) :: ii + character(3) :: dtype + character(16) :: dims1(3) + type(NcDataset) :: nc + type(OutputVariable) :: tmpvars(size(outputFlxState_mrm)) dtype = "f64" - dims1 = (/"easting ", "northing","time "/) - nc = createOutputFile(ibasin) + dims1 = (/"easting ", "northing", "time "/) + nc = createOutputFile(ibasin) ii = 0 if (outputFlxState_mrm(1)) then - ii = ii + 1 - tmpvars(ii) = OutputVariable(& - nc, "Qrouted", dtype, dims1, ncells, mask, .true.) - call writeVariableAttributes(tmpvars(ii), "routed streamflow", "m3 s-1") + ii = ii + 1 + tmpvars(ii) = OutputVariable(& + nc, "Qrouted", dtype, dims1, nCells, mask, .true.) + call writeVariableAttributes(tmpvars(ii), "routed streamflow", "m3 s-1") end if - out = OutputDataset(ibasin, nc, tmpvars(1:ii)) + ! out = OutputDataset(ibasin, nc, tmpvars(1 : ii)) + allocate(out%vars(ii)) + out%vars = tmpvars(1:ii) + out%nc = nc + out%ibasin = ibasin + ! print*, 'Finished OutputDatasetInit' end function newOutputDataset - + !------------------------------------------------------------------ ! NAME ! updateDataset @@ -422,28 +423,28 @@ end function newOutputDataset ! David Schaefer , Jun. 2015 - major rewrite ! Stephan Thober , Oct 2015 - adapted to mRM subroutine updateDataset(self, sidx, eidx, & - L11_Qmod ) - - use mo_mrm_global_variables, only : outputFlxState_mrm + L11_Qmod) + + use mo_mrm_global_variables, only : outputFlxState_mrm class(OutputDataset), intent(inout), target :: self - integer(i4), intent(in) :: sidx, eidx + integer(i4), intent(in) :: sidx, eidx ! fluxes, - real(dp), intent(in) :: L11_Qmod(:) + real(dp), intent(in) :: L11_Qmod(:) ! local type(OutputVariable), pointer :: vars(:) - integer(i4) :: ii + integer(i4) :: ii ii = 0 - vars => self%vars + vars => self%vars if (outputFlxState_mrm(1)) then - ii = ii + 1 + ii = ii + 1 #ifdef pgiFortran - call updateVariable(vars(ii), L11_Qmod(sidx:eidx)) + call updateVariable(vars(ii), L11_Qmod(sidx : eidx)) #else - call vars(ii)%updateVariable(L11_Qmod(sidx:eidx)) + call vars(ii)%updateVariable(L11_Qmod(sidx : eidx)) #endif end if @@ -497,9 +498,9 @@ end subroutine updateDataset !> \date June 2015 subroutine writeTimestep(self, timestep) class(OutputDataset), intent(inout), target :: self - integer(i4), intent(in) :: timestep - integer(i4) :: ii - type(NcVariable) :: tvar + integer(i4), intent(in) :: timestep + integer(i4) :: ii + type(NcVariable) :: tvar self%counter = self%counter + 1 @@ -508,9 +509,9 @@ subroutine writeTimestep(self, timestep) call tvar%setData(timestep, (/self%counter/)) do ii = 1, size(self%vars) - call self%vars(ii)%writeVariableTimestep(self%counter) + call self%vars(ii)%writeVariableTimestep(self%counter) end do - + end subroutine writeTimestep !------------------------------------------------------------------ @@ -564,9 +565,9 @@ end subroutine writeTimestep ! Stephan Thober, Oct 2015 - adapted to mRM subroutine close(self) - use mo_String_utils, only: num2str - use mo_message, only: message - use mo_mrm_global_variables, only: dirOut + use mo_String_utils, only : num2str + use mo_message, only : message + use mo_common_variables, only : dirOut class(OutputDataset) :: self call self%nc%close() @@ -626,77 +627,82 @@ end subroutine close ! Stephan Thober, Oct 2015 - adapted to mRM function createOutputFile(ibasin) result(nc) - use mo_mrm_global_variables, only: dirOut, evalPer, level11 - use mo_mrm_file, only: version, file_mrm_output - use mo_julian, only: dec2date + use mo_mrm_global_variables, only : level11 + use mo_grid, only : mapCoordinates, geoCoordinates + use mo_common_variables, only : dirOut + use mo_common_mhm_mrm_variables, only : evalPer + use mo_mrm_file, only : version, file_mrm_output + use mo_julian, only : dec2date integer(i4), intent(in) :: ibasin - type(NcDataset) :: nc - type(NcDimension) :: dimids1(3) - type(NcVariable) :: var - integer(i4) :: day, month, year - character(1028) :: fname - character(128) :: unit, date, time, datetime - real(dp), allocatable :: northing(:), easting(:), lat(:,:), lon(:,:) + type(NcDataset) :: nc + type(NcDimension) :: dimids1(3) + type(NcVariable) :: var + integer(i4) :: day, month, year + character(1028) :: fname + character(128) :: unit, date, time, datetime + real(dp), allocatable :: northing(:), easting(:), lat(:, :), lon(:, :) fname = trim(dirOut(ibasin)) // trim(file_mrm_output) - call mapCoordinates(ibasin, level11, northing, easting) - call geoCoordinates(ibasin, level11, lat, lon) + call mapCoordinates(level11(ibasin), northing, easting) + call geoCoordinates(level11(ibasin), lat, lon) - nc = NcDataset(trim(fname),"w") + nc = NcDataset(trim(fname), "w") dimids1 = (/& - nc%setDimension("easting", size(easting)), & - nc%setDimension("northing", size(northing)), & - nc%setDimension("time", 0) & - /) + nc%setDimension("easting", size(easting)), & + nc%setDimension("northing", size(northing)), & + nc%setDimension("time", 0) & + /) ! time units - call dec2date(real(evalPer(ibasin)%julStart, dp), dd=day, mm=month, yy=year) - write(unit,"('hours since ', i4, '-' ,i2.2, '-', i2.2, 1x, '00:00:00')") year, month, day + call dec2date(real(evalPer(ibasin)%julStart, dp), dd = day, mm = month, yy = year) + write(unit, "('hours since ', i4, '-' ,i2.2, '-', i2.2, 1x, '00:00:00')") year, month, day ! time var = nc%setVariable("time", "i32", (/ dimids1(3) /)) call var%setAttribute("units", unit) - call var%setAttribute("long_name","time") + call var%setAttribute("long_name", "time") ! northing var = nc%setVariable("northing", "f64", (/ dimids1(2) /)) call var%setData(northing) - call var%setAttribute("units","m") - call var%setAttribute("long_name","y-coordinate in the given coordinate system") + call var%setAttribute("units", "m") + call var%setAttribute("long_name", "y-coordinate in the given coordinate system") ! easting var = nc%setVariable("easting", "f64", (/ dimids1(1) /)) call var%setData(easting) - call var%setAttribute("units","m") - call var%setAttribute("long_name","x-coordinate in the given coordinate system") + call var%setAttribute("units", "m") + call var%setAttribute("long_name", "x-coordinate in the given coordinate system") ! lon - var = nc%setVariable("lon","f64",dimids1(1:2)) + var = nc%setVariable("lon", "f64", dimids1(1 : 2)) call var%setData(lon) - call var%setAttribute("units","degerees_east") - call var%setAttribute("long_name","longitude") - call var%setAttribute("missing_value",nodata_dp) + call var%setAttribute("units", "degrees_east") + call var%setAttribute("long_name", "longitude") + call var%setAttribute("missing_value", nodata_dp) ! lat - var = nc%setVariable("lat","f64",dimids1(1:2)) + var = nc%setVariable("lat", "f64", dimids1(1 : 2)) call var%setData(lat) - call var%setAttribute("units","degerees_north") - call var%setAttribute("long_name","latitude") - call var%setAttribute("missing_value",nodata_dp) + call var%setAttribute("units", "degrees_north") + call var%setAttribute("long_name", "latitude") + call var%setAttribute("missing_value", nodata_dp) ! global attributes - call date_and_time(date=date, time=time) - write(datetime,"(a4,'-',a2,'-',a2,1x,a2,':',a2,':',a2)") date(1:4), & - date(5:6), date(7:8), time(1:2), time(3:4), time(5:6) - - call nc%setAttribute("project", project_details ) - call nc%setAttribute("setup_description",setup_description) - call nc%setAttribute("simulation_type",simulation_type) - call nc%setAttribute("Conventions",Conventions) - call nc%setAttribute("contact",contact) - call nc%setAttribute("mHM_details",trim(mHM_details)//", release mRMv"//trim(version)) - call nc%setAttribute("history", trim(datetime)//", "//history) + call date_and_time(date = date, time = time) + write(datetime, "(a4,'-',a2,'-',a2,1x,a2,':',a2,':',a2)") date(1 : 4), & + date(5 : 6), date(7 : 8), time(1 : 2), time(3 : 4), time(5 : 6) + + call nc%setAttribute("project", project_details) + call nc%setAttribute("setup_description", setup_description) + call nc%setAttribute("simulation_type", simulation_type) + call nc%setAttribute("Conventions", Conventions) + call nc%setAttribute("contact", contact) + call nc%setAttribute("mRM_details", trim(mHM_details) // ", release mRMv" // trim(version)) + call nc%setAttribute("history", trim(datetime) // ", " // history) + call nc%setAttribute("title", "mRMv"//trim(version)//" "//trim(simulation_type)//" outputs") + call nc%setAttribute("creation_date", datetime) end function createOutputFile @@ -747,245 +753,14 @@ end function createOutputFile !> \date June 2015 subroutine writeVariableAttributes(var, long_name, unit) type(OutputVariable), intent(in) :: var - character(*) , intent(in) :: long_name, unit + character(*), intent(in) :: long_name, unit - call var%nc%setAttribute("_FillValue",nodata_dp) - call var%nc%setAttribute("long_name",long_name) - call var%nc%setAttribute("unit",unit) - call var%nc%setAttribute("scale_factor",1.0_dp) - call var%nc%setAttribute("missing_value",nodata_dp) - call var%nc%setAttribute("coordinates","lat lon") + call var%nc%setAttribute("long_name", long_name) + call var%nc%setAttribute("unit", unit) + call var%nc%setAttribute("scale_factor", 1.0_dp) + call var%nc%setAttribute("missing_value", nodata_dp) + call var%nc%setAttribute("coordinates", "lat lon") end subroutine writeVariableAttributes - - - !------------------------------------------------------------------ - ! NAME - ! mapCoordinates - ! - ! PURPOSE - !> \brief Generate map coordinates - !> \details Generate map coordinate arrays for given basin and level - ! - ! CALLING SEQUENCE - ! call mapCoordinates(ibasin, level, y, x) - ! - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" -> basin number - !> \param[in] "type(geoGridRef) :: level" -> grid reference - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "real(:) :: y(:)" -> y-coordinates - !> \param[out] "real(dp) :: x(:)" -> x-coorindates - ! - ! INTENT(IN), OPTIONAL - ! None - ! - ! INTENT(INOUT), OPTIONAL - ! None - ! - ! INTENT(OUT), OPTIONAL - ! None - ! - ! RETURN - ! None - ! - ! RESTRICTIONS - ! None - ! - ! EXAMPLE - ! None - ! - ! LITERATURE - ! None - ! - ! HISTORY - !> \author Matthias Zink - !> \date Apr 2013 - ! Modified: - ! Stephan Thober, Nov 2013 - removed fproj dependency - ! David Schaefer, Jun 2015 - refactored the former subroutine CoordSystem - subroutine mapCoordinates(ibasin, level, y, x) - - implicit none - - integer(i4), intent(in) :: iBasin - type(gridGeoRef), intent(in) :: level - real(dp), intent(out), allocatable :: x(:), y(:) - integer(i4) :: ii, ncols, nrows - real(dp) :: cellsize - - cellsize = level%cellsize(ibasin) - nrows = level%nrows(ibasin) - ncols = level%ncols(ibasin) - - allocate(x(nrows), y(ncols)) - - x(1) = level%xllcorner(ibasin) + 0.5_dp * cellsize - do ii = 2, nrows - x(ii) = x(ii-1) + cellsize - end do - - ! inverse for Panoply, ncview display - y(ncols) = level%yllcorner(ibasin) + 0.5_dp * cellsize - do ii = ncols-1,1,-1 - y(ii) = y(ii+1) + cellsize - end do - - end subroutine mapCoordinates - - !------------------------------------------------------------------ - ! NAME - ! geoCoordinates - ! - ! PURPOSE - !> \brief Generate geographic coordinates - !> \details Generate geographic coordinate arrays for given basin and level - ! - ! CALLING SEQUENCE - ! call mapCoordinates(ibasin, level, y, x) - ! - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" -> basin number - !> \param[in] "type(gridGeoRef) :: level" -> grid reference - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - !> \param[out] "real(dp) :: lat(:,:)" -> lat-coordinates - !> \param[out] "real(dp) :: lon(:,:)" -> lon-coorindates - ! - ! INTENT(IN), OPTIONAL - ! None - ! - ! INTENT(INOUT), OPTIONAL - ! None - ! - ! INTENT(OUT), OPTIONAL - ! None - ! - ! RETURN - ! None - ! - ! RESTRICTIONS - ! None - ! - ! EXAMPLE - ! None - ! - ! LITERATURE - ! None - ! - ! HISTORY - !> \author Matthias Zink - !> \date Apr 2013 - ! Modified: - ! Stephan Thober, Nov 2013 - removed fproj dependency - ! David Schaefer, Jun 2015 - refactored the former subroutine CoordSystem - ! Stephan Thober, Sep 2015 - using mask to unpack coordinates - ! Stephan Thober, Oct 2015 - writing full lat/lon again - ! Stephan Thober, Oct 2015 - adapted to mRM - subroutine geoCoordinates(ibasin, level, lat, lon) - - use mo_mrm_global_variables, only : L11_rect_latitude, L11_rect_longitude - - implicit none - - integer(i4), intent(in) :: iBasin - type(gridGeoRef), intent(in) :: level - real(dp), intent(out), allocatable :: lat(:,:), lon(:,:) - integer(i4) :: ncols, nrows - integer(i4) :: ii, pos - - nrows = level%nrows(ibasin) - ncols = level%ncols(ibasin) - - pos = 1 - if ( ibasin .gt. 1 ) then - do ii = 1, ibasin -1 - pos = pos + level%ncols(ii) * level%nrows(ii) - end do - end if - - lat = reshape(L11_rect_latitude(pos:pos+nrows*ncols-1), (/nrows, ncols/)) - lon = reshape(L11_rect_longitude(pos:pos+nrows*ncols-1), (/nrows, ncols/)) - - end subroutine geoCoordinates - - !------------------------------------------------------------------ - ! NAME - ! fluxesUnit - ! - ! PURPOSE - !> \brief Generate a unit string - !> \details Generate the unit string for the output variable - !> netcdf attribute based on modeling timestep - ! - ! CALLING SEQUENCE - ! unit = fluxesUnit(iBasin) - ! - ! INTENT(IN) - !> \param[in] "integer(i4) :: iBasin" -> basin id - ! - ! INTENT(INOUT) - ! None - ! - ! INTENT(OUT) - ! None - ! - ! INTENT(IN), OPTIONAL - ! None - ! - ! INTENT(INOUT), OPTIONAL - ! None - ! - ! INTENT(OUT), OPTIONAL - ! None - ! - ! RETURN - ! \return character(16) - ! - ! RESTRICTIONS - ! None - ! - ! EXAMPLE - ! None - ! - ! LITERATURE - ! None - ! - ! HISTORY - !> \author David Schaefer - !> \date June 2015 - function fluxesUnit(ibasin) - - use mo_mrm_global_variables, only : simPer, NTSTEPDAY, timestep, timeStep_model_outputs_mrm - - integer(i4), intent(in) :: ibasin - character(16) :: fluxesUnit - real(dp) :: ntsteps - - if ( timestep*timestep_model_outputs_mrm .eq. 1 ) then - fluxesUnit = 'mm h-1' - else if (timestep_model_outputs_mrm > 1) then - fluxesUnit = 'mm '//trim(adjustl(num2str(timestep)))//'h-1' - else if (timestep_model_outputs_mrm .eq. 0) then - ntsteps = ( simPer(iBasin)%julEnd - simPer(iBasin)%julStart + 1 ) * NTSTEPDAY - fluxesUnit = 'mm '//trim(adjustl(num2str(nint(ntsteps))))//'h-1' - else if (timestep_model_outputs_mrm .eq. -1) then - fluxesUnit = 'mm d-1' - else if (timestep_model_outputs_mrm .eq. -2) then - fluxesUnit = 'mm month-1' - else if (timestep_model_outputs_mrm .eq. -3) then - fluxesUnit = 'mm a-1' - else - fluxesUnit = '' - end if - - end function fluxesUnit end module mo_mrm_write_fluxes_states diff --git a/src/mRM/mrm_driver.f90 b/src/mRM/mrm_driver.f90 index 51973b8d..fcafaadc 100644 --- a/src/mRM/mrm_driver.f90 +++ b/src/mRM/mrm_driver.f90 @@ -2,54 +2,60 @@ #ifndef MRM2MHM program mrm_driver - use mo_common_variables, only: global_parameters, global_parameters_name, optimize - use mo_finish, only: finish - use mo_kind, only: dp, i4 - use mo_message, only: message - use mo_mrm_eval, only: mrm_eval - use mo_mrm_global_variables, only: dirConfigOut - use mo_mrm_init, only: mrm_init - use mo_mrm_objective_function_runoff, only: single_objective_runoff - use mo_mrm_write, only: mrm_write, mrm_write_optifile, mrm_write_optinamelist - use mo_optimization, only: optimization - use mo_string_utils, only: num2str - use mo_timer, only: timers_init, timer_start, timer_stop, timer_get + use mo_common_mHM_mRM_variables, only : optimize, mrm_coupling_mode + use mo_common_variables, only : global_parameters, global_parameters_name, dirConfigOut + use mo_finish, only : finish + use mo_kind, only : dp, i4 + use mo_message, only : message + use mo_mrm_eval, only : mrm_eval + use mo_mrm_init, only : mrm_init + use mo_mrm_objective_function_runoff, only : single_objective_runoff + use mo_mrm_write, only : mrm_write, mrm_write_optifile, mrm_write_optinamelist + use mo_optimization, only : optimization + use mo_string_utils, only : num2str + use mo_timer, only : timers_init, timer_start, timer_stop, timer_get + use mo_mrm_file, only : file_namelist_mrm, unamelist_mrm, & + file_namelist_param_mrm, unamelist_param_mrm - implicit none - + ! variables for optimization - real(dp) :: funcbest ! best objective function achivied during optimization - integer(i4) :: itimer + real(dp) :: funcbest ! best objective function achivied during optimization + integer(i4) :: itimer logical, allocatable :: maskpara(:) ! true = parameter will be optimized = parameter(i,4) = 1 ! ! false = parameter will not be optimized = parameter(i,4) = 0 + procedure(mrm_eval), pointer :: eval + procedure(single_objective_runoff), pointer :: obj_func + ! -------------------------------------------------------------------------- ! INITIALIZE ! -------------------------------------------------------------------------- - call mrm_init() + mrm_coupling_mode = 0_i4 + call mrm_init(file_namelist_mrm, unamelist_mrm, file_namelist_param_mrm, unamelist_param_mrm) ! Start timings print*, 'start timer' call timers_init if (optimize) then - ! ----------------------------------------------------------------------- - ! OPTIMIZE - ! ----------------------------------------------------------------------- - call optimization(single_objective_runoff, dirConfigOut, funcbest, maskpara) - ! write a file with final objective function and the best parameter set - call mrm_write_optifile(funcbest, global_parameters(:,3), global_parameters_name(:)) - ! write a file with final best parameter set in a namelist format - call mrm_write_optinamelist(global_parameters, maskpara, global_parameters_name(:)) - deallocate(maskpara) + eval => mrm_eval + ! ----------------------------------------------------------------------- + ! OPTIMIZE + ! ----------------------------------------------------------------------- + call optimization(eval, obj_func, dirConfigOut, funcbest, maskpara) + ! write a file with final objective function and the best parameter set + call mrm_write_optifile(funcbest, global_parameters(:, 3), global_parameters_name(:)) + ! write a file with final best parameter set in a namelist format + call mrm_write_optinamelist(global_parameters, maskpara, global_parameters_name(:)) + deallocate(maskpara) else - ! ----------------------------------------------------------------------- - ! FORWARD RUN - ! ----------------------------------------------------------------------- - itimer = 1 - call timer_start(itimer) - call message(' perform forward run of mRM') - call mrm_eval(global_parameters(:,3)) - call timer_stop(itimer) - call message(' in ', trim(num2str(timer_get(itimer),'(F9.3)')), ' seconds.') + ! ----------------------------------------------------------------------- + ! FORWARD RUN + ! ----------------------------------------------------------------------- + itimer = 1 + call timer_start(itimer) + call message(' perform forward run of mRM') + call mrm_eval(global_parameters(:, 3)) + call timer_stop(itimer) + call message(' in ', trim(num2str(timer_get(itimer), '(F9.3)')), ' seconds.') end if ! -------------------------------------------------------------------------- ! WRITE OUTPUT @@ -58,11 +64,11 @@ program mrm_driver ! -------------------------------------------------------------------------- ! FINISH UP ! -------------------------------------------------------------------------- - call finish('mRM','Finished!') + call finish('mRM', 'Finished!') end program mrm_driver #else ! dummy module such that this file is never empty for compilation -module dummy +module dummy_mrm implicit none -end module dummy +end module dummy_mrm #endif diff --git a/test_basin/input/luse/lc_1981.asc b/test_basin/input/luse/lc_1981.asc new file mode 100644 index 00000000..0eaba452 --- /dev/null +++ b/test_basin/input/luse/lc_1981.asc @@ -0,0 +1,438 @@ +ncols 288 +nrows 432 +xllcorner 3973369 +yllcorner 2735847 +cellsize 500 +NODATA_value -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 2 3 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 3 3 3 3 2 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 3 2 2 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 2 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 2 3 3 2 2 3 3 -9999 -9999 3 3 -9999 -9999 -9999 -9999 -9999 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 2 2 3 3 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 2 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 2 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 2 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 2 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 3 3 3 3 3 1 1 2 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 1 1 1 3 3 3 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 2 3 3 3 2 2 3 2 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 2 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 1 1 1 3 3 3 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 3 3 3 3 3 3 3 3 1 2 3 3 3 1 3 3 3 3 1 3 3 3 1 3 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 2 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 3 3 3 3 2 3 3 3 3 1 3 1 1 3 3 3 3 3 1 3 3 3 3 3 3 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 2 3 1 3 3 -9999 3 3 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 2 1 1 3 3 2 3 1 1 1 1 1 1 1 2 2 2 3 3 1 3 3 2 3 3 2 2 3 3 3 3 3 3 1 3 1 3 3 3 1 3 3 3 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 3 1 3 2 3 1 3 3 3 3 3 3 1 1 1 1 3 1 2 2 2 3 3 3 3 2 3 2 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 2 2 1 1 1 1 1 3 1 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 1 -9999 1 1 1 3 3 3 3 3 3 3 3 2 2 1 1 1 1 3 1 1 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 2 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 3 1 3 3 3 3 3 3 1 3 2 3 3 3 1 3 3 3 2 3 1 1 1 3 3 3 1 3 3 3 3 1 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 3 1 2 2 2 3 3 3 1 1 3 3 3 3 3 3 3 2 2 3 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 2 3 1 3 3 3 3 3 3 1 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 1 3 3 2 3 3 3 1 1 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 3 1 3 3 3 1 1 3 3 1 1 3 3 3 3 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 2 3 3 3 1 3 3 3 3 1 1 1 1 3 3 1 1 1 3 3 3 3 3 2 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 2 3 3 1 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 3 3 3 2 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 2 2 2 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 1 1 3 3 3 3 1 2 3 3 1 1 3 3 3 3 1 1 1 1 1 1 3 2 2 2 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 3 1 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 3 3 1 2 1 1 3 3 3 3 3 2 3 3 3 2 2 2 3 3 2 2 2 3 3 3 2 3 3 3 3 3 1 3 3 3 3 1 1 1 1 3 2 2 3 3 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 3 3 2 2 3 3 2 3 3 3 2 2 2 2 2 2 2 2 3 3 2 3 2 2 3 3 3 3 3 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 2 3 2 3 1 3 1 1 1 1 2 3 1 3 3 3 2 3 2 2 3 3 2 2 2 2 2 2 2 2 3 3 2 2 3 3 1 3 1 1 3 1 1 1 3 1 1 1 1 1 3 1 1 3 1 3 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 2 2 2 1 3 3 1 1 1 2 3 1 2 3 1 1 2 1 3 2 2 3 2 2 2 2 2 2 2 3 2 2 2 3 2 3 3 1 1 3 3 3 3 1 3 2 3 3 1 1 1 1 3 3 2 3 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 1 1 2 1 2 2 1 1 1 3 1 3 2 2 3 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 1 1 3 3 2 3 1 2 3 3 1 1 3 1 1 3 3 3 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 2 2 2 1 2 1 1 3 3 1 1 1 3 1 2 2 2 3 2 2 2 3 2 2 3 3 3 3 2 3 3 1 3 3 3 3 1 1 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 2 2 1 1 2 2 2 2 2 3 3 3 3 1 1 3 2 2 2 2 2 2 2 3 3 2 2 2 2 2 3 3 3 2 3 1 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 2 2 2 2 1 3 2 2 1 1 1 1 3 2 2 3 2 2 2 3 1 3 1 1 1 3 3 1 1 3 2 3 1 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 2 3 3 3 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 2 2 2 3 3 2 1 2 2 1 1 1 3 3 2 2 2 1 3 1 3 1 1 1 3 1 3 3 1 1 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 3 2 2 2 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 3 1 3 3 1 1 3 3 1 1 1 1 3 3 3 2 3 3 3 1 3 3 3 3 1 1 1 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 3 3 3 3 3 3 3 1 1 1 1 2 2 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 1 1 1 1 1 3 3 3 2 2 3 3 3 3 1 3 2 3 1 1 3 3 3 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 1 3 2 2 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 2 2 1 3 3 1 1 1 2 2 2 2 2 2 2 2 2 3 2 2 2 3 2 3 3 3 3 3 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 2 3 2 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 2 2 3 1 3 3 1 2 1 1 1 2 2 2 2 2 2 2 3 2 2 2 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 2 2 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 2 2 1 2 3 2 2 3 3 3 3 2 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 2 2 3 3 3 1 3 3 1 1 1 3 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 2 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 1 1 1 2 2 2 2 3 3 3 2 3 3 2 3 3 3 2 2 2 1 2 3 1 1 3 3 3 2 1 2 2 2 3 3 3 3 3 3 3 1 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 3 1 1 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 1 1 1 3 3 2 2 2 3 3 3 3 2 2 3 3 3 3 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 1 3 3 3 3 2 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 1 1 1 3 2 2 2 3 3 3 2 2 2 2 3 3 3 1 1 1 2 3 3 3 2 3 3 3 3 3 3 1 1 1 3 3 3 2 2 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 3 3 3 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 2 2 1 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 3 2 2 3 3 3 3 3 3 2 2 2 3 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 3 3 3 3 3 2 2 3 3 1 3 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 1 3 3 3 3 3 3 2 2 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 2 2 3 1 3 3 2 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 1 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 2 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 2 3 2 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 2 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 2 3 2 3 2 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 3 2 3 3 2 2 3 2 2 2 3 3 2 3 2 3 3 1 1 2 2 3 3 1 1 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 3 2 3 3 2 3 2 2 2 2 2 3 2 3 3 1 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 2 3 3 3 3 3 1 1 1 1 1 1 3 2 1 1 1 1 1 1 3 1 1 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 2 3 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 2 3 3 3 2 1 1 1 1 1 1 1 2 1 1 3 2 1 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 1 1 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 1 1 3 3 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 3 2 2 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 3 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 3 3 2 2 2 2 2 3 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 2 2 2 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 1 1 2 2 3 3 3 3 3 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 3 2 2 2 1 2 2 2 3 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 2 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 2 2 2 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 1 1 3 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 2 2 2 2 3 1 3 3 3 2 2 2 2 2 3 3 3 2 3 3 3 3 3 3 1 1 1 3 3 1 3 3 3 3 3 3 1 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 3 3 3 2 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 2 1 1 1 1 3 3 1 1 2 1 1 1 1 1 3 1 3 3 2 3 3 1 3 1 2 2 2 2 3 3 3 3 2 2 3 2 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 2 3 3 3 3 3 1 3 3 3 3 1 1 3 1 1 2 2 3 1 1 2 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 2 2 3 2 2 3 3 3 2 2 2 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 2 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 3 2 1 1 1 2 3 2 2 2 2 1 2 1 1 1 1 1 1 1 1 3 3 3 1 1 1 2 3 3 3 2 2 3 3 3 3 2 2 3 3 3 2 2 3 1 1 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 3 3 3 1 1 1 3 3 2 3 1 3 3 2 3 3 1 2 3 2 3 3 3 2 2 3 3 3 3 3 1 1 3 3 3 3 2 3 1 1 1 1 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 3 3 3 2 2 2 3 3 2 3 3 3 3 2 3 1 1 1 3 2 3 3 1 2 3 3 3 3 2 2 3 3 3 3 3 2 2 2 3 3 3 1 1 1 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 3 2 3 1 2 2 2 2 2 2 3 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 1 2 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 2 2 3 3 3 3 3 2 3 2 2 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 2 3 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 2 3 3 3 3 1 2 2 2 2 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 3 1 3 3 2 2 3 3 2 2 3 3 3 3 3 2 3 3 3 1 1 3 3 3 3 3 3 3 1 1 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 2 3 3 1 2 2 1 1 2 3 3 3 3 3 3 1 3 2 2 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 2 2 3 3 3 3 3 3 3 3 1 1 1 2 3 3 1 1 2 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 1 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 1 1 1 3 1 1 1 3 2 3 3 2 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 3 2 3 3 3 3 3 3 2 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 3 3 1 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 2 2 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 2 3 3 3 3 2 3 3 3 3 3 3 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 3 3 3 2 2 3 2 2 2 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 1 1 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 3 3 1 1 1 3 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 3 2 3 3 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 3 2 2 3 3 2 2 3 2 2 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 1 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 2 2 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 3 3 1 2 2 2 2 2 2 3 3 2 3 3 1 3 3 3 3 3 3 3 1 3 3 3 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 3 3 3 3 2 2 2 2 2 2 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 2 2 3 3 3 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 3 1 1 3 3 3 1 1 1 2 3 3 3 2 2 2 2 2 3 3 3 1 3 1 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 3 2 2 2 2 2 2 2 3 1 1 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 3 3 3 3 1 1 3 3 3 3 3 2 2 2 1 2 2 2 2 2 2 1 2 2 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 3 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 3 2 3 3 2 3 3 3 3 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 3 1 1 2 1 3 1 3 1 1 1 1 2 2 2 2 3 2 2 2 2 2 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 1 1 1 2 3 2 3 3 3 3 1 3 2 2 2 2 2 2 2 3 2 2 2 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 2 2 3 1 1 3 3 1 1 3 1 1 3 3 3 3 3 3 2 3 1 3 3 1 3 1 1 2 2 3 3 2 2 3 2 3 2 3 3 2 2 2 3 2 2 2 2 2 3 2 1 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 2 2 2 2 2 2 2 2 3 3 3 2 2 2 2 2 2 2 2 2 2 2 3 2 2 3 3 3 2 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 2 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 3 1 1 1 2 3 3 3 3 3 2 2 2 2 2 2 2 2 2 3 2 2 2 3 2 3 3 3 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 2 2 2 2 2 2 2 3 2 2 2 3 2 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3 3 2 2 2 2 2 2 2 2 2 3 3 1 1 3 3 3 3 2 2 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 2 2 2 2 2 2 3 3 3 3 3 3 3 2 2 2 1 1 2 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 2 3 3 2 3 3 3 2 3 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 3 2 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 2 2 2 2 3 2 2 2 1 2 2 2 2 2 3 3 3 3 2 3 3 3 3 3 3 3 2 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 2 2 2 3 2 2 2 2 2 2 3 3 3 2 2 2 3 1 3 3 3 3 3 1 1 1 2 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 2 2 3 2 3 3 3 3 2 2 2 3 3 3 2 2 3 3 3 3 3 2 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 2 1 1 1 1 3 3 2 2 3 3 3 2 2 3 3 3 3 3 3 3 3 2 2 3 2 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 2 1 1 1 3 3 2 2 3 3 2 2 2 2 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 2 2 2 3 3 3 3 3 3 1 1 1 1 3 3 3 2 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 2 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 3 1 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 1 1 1 1 1 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 1 1 1 1 1 3 3 3 1 3 3 3 3 3 1 1 1 3 3 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 2 3 3 1 1 1 1 1 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 2 2 2 2 2 2 3 3 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 3 3 1 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 2 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 2 2 2 2 2 2 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 1 1 1 1 3 1 1 3 3 1 1 1 1 1 1 3 1 3 2 2 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 2 3 3 1 3 3 3 3 1 3 3 3 3 3 2 3 1 3 3 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 1 3 3 1 1 3 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 2 1 3 1 1 3 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 2 3 3 3 3 3 3 3 3 2 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 2 2 1 3 1 1 1 1 3 2 3 3 1 1 1 3 3 3 3 3 3 3 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 3 2 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 1 3 1 1 1 3 3 3 3 1 1 1 3 1 1 1 1 3 3 2 3 1 3 1 1 3 3 3 2 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 3 2 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 1 3 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 3 2 3 3 3 1 1 1 1 3 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 2 2 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 2 2 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 3 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 3 3 3 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 2 2 3 3 1 3 3 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 2 3 3 3 1 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 2 2 2 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 1 1 3 3 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 1 1 1 3 3 3 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 1 3 3 1 3 3 1 3 3 1 1 1 1 1 1 1 3 2 2 3 2 2 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 1 3 3 3 3 1 1 3 1 1 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 2 3 2 2 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 -9999 -9999 3 3 3 -9999 -9999 -9999 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 3 3 3 3 1 1 3 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 2 2 2 2 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 2 2 2 2 2 2 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 3 1 2 2 3 2 2 2 2 3 1 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 2 2 2 3 3 3 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 2 2 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 3 3 1 1 3 1 3 3 2 2 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 1 1 3 1 3 3 1 3 3 3 3 3 3 3 3 3 1 2 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 2 2 3 3 3 3 2 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 1 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 3 2 2 3 3 3 3 3 2 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 1 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 2 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 2 3 1 1 1 1 1 1 1 1 1 1 3 2 2 3 3 3 3 3 3 1 2 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 2 3 3 2 2 3 3 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 3 3 3 3 3 3 3 1 1 1 3 3 1 1 3 3 3 1 1 1 1 1 1 3 1 3 3 3 2 2 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 2 3 2 2 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 1 3 3 3 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 2 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 3 3 3 3 1 3 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 3 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 3 1 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 1 3 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 3 1 1 3 3 1 3 3 3 3 3 3 3 2 2 2 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 3 1 1 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 3 1 1 1 3 1 1 3 3 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 1 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 2 2 2 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 2 3 3 3 3 3 3 3 3 3 1 3 3 1 3 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 2 2 2 3 3 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 3 3 1 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 1 3 3 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 3 3 3 1 1 3 3 3 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 3 3 1 1 1 2 2 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 2 2 3 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 1 3 3 1 3 3 3 1 1 2 2 2 2 2 3 3 3 3 3 3 3 2 2 3 1 1 1 3 2 1 1 3 1 1 3 3 3 2 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 3 1 3 3 3 3 3 3 1 1 3 3 3 3 3 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 2 2 2 3 3 3 3 3 3 3 1 3 1 1 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 2 3 3 1 1 1 3 3 2 3 3 3 1 1 1 2 2 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 2 3 3 3 2 2 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 2 2 2 2 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 3 3 1 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 2 3 3 3 3 3 3 2 3 2 3 3 3 3 3 3 3 1 1 1 1 3 1 1 3 3 3 1 1 1 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 2 2 2 3 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 2 2 3 3 3 1 3 3 3 3 3 1 1 1 3 3 1 1 1 3 3 3 3 3 1 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 2 3 3 3 3 2 3 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 3 2 2 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 1 3 1 1 1 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 2 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 3 1 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 2 2 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 2 3 2 3 1 1 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 2 2 1 3 1 1 1 3 1 1 1 1 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 3 3 1 1 1 3 3 2 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 2 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 2 2 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 2 2 3 3 1 1 1 1 1 1 2 2 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 2 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 2 3 3 3 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 2 1 1 1 1 1 1 2 2 2 3 3 3 3 1 1 1 1 1 1 3 1 3 3 3 1 1 3 3 3 3 3 3 3 1 3 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 3 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 1 1 3 2 1 1 1 2 2 2 2 2 2 2 3 3 3 3 2 1 1 1 1 3 1 3 1 1 1 1 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 3 3 1 1 3 1 1 2 1 1 2 2 1 1 1 1 1 3 2 2 3 2 2 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 1 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 1 1 3 1 3 3 3 3 3 3 2 2 3 2 1 1 1 1 3 1 3 1 2 3 2 2 2 1 1 3 3 3 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 2 2 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 1 2 3 3 2 3 1 2 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 1 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 3 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 2 3 3 3 3 1 1 3 3 3 2 3 1 1 1 1 3 3 2 3 3 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 1 1 3 2 3 3 3 3 1 1 1 3 3 1 1 3 3 1 1 1 3 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 3 3 3 2 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 1 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 3 2 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 3 1 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 2 3 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 2 2 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 1 1 3 1 3 1 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 2 2 3 1 1 1 3 3 2 3 3 3 3 1 3 3 3 3 3 3 1 1 2 1 3 3 1 1 1 1 1 1 1 2 2 1 1 2 2 2 2 3 3 2 2 3 2 1 3 3 2 2 2 2 3 3 3 3 3 3 2 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 1 1 1 3 3 3 3 3 3 1 1 3 2 2 2 2 2 3 3 3 3 2 3 3 3 3 1 3 3 3 3 3 3 1 1 2 3 3 3 1 1 1 1 1 1 3 3 2 3 1 2 2 2 2 2 3 2 3 2 3 3 2 3 2 2 2 3 3 3 3 3 1 3 2 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 2 1 3 3 1 3 1 1 2 2 3 2 2 3 3 3 3 3 2 2 3 3 1 3 1 1 3 3 2 3 3 1 2 1 3 3 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 3 3 3 1 1 3 3 3 3 3 3 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 3 3 3 1 1 2 3 3 3 1 3 1 1 2 2 2 3 3 3 3 3 3 3 2 3 3 3 1 1 1 1 1 3 2 2 1 1 2 2 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 3 3 2 3 3 3 3 2 2 2 3 3 3 3 3 1 1 1 3 3 3 2 3 3 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 3 3 3 3 2 3 3 3 3 3 2 2 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 3 3 2 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 2 3 2 2 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 2 2 3 3 1 1 1 3 3 3 3 2 3 3 1 3 3 1 1 2 2 2 2 3 1 1 3 3 3 1 1 1 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 1 1 3 3 1 3 3 3 3 1 1 3 3 1 2 2 2 2 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 3 3 3 2 2 2 3 3 2 3 2 2 2 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 1 3 3 3 3 3 2 2 2 2 2 3 3 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 2 2 3 3 3 3 3 3 3 2 2 3 3 3 2 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 3 1 1 1 1 1 3 1 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 3 2 2 3 3 3 3 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 3 3 1 3 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 1 1 1 3 3 2 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 2 3 2 2 2 2 3 2 2 2 2 2 3 3 3 1 3 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 2 1 1 3 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 3 3 1 2 3 2 2 2 2 3 2 2 2 2 3 3 2 2 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3 1 3 1 2 2 2 2 2 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 2 2 2 2 3 3 3 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 2 2 2 2 2 2 2 2 3 3 3 2 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 2 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 3 3 1 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 2 3 3 1 1 1 1 3 3 3 3 1 2 1 3 1 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 3 2 2 3 2 3 2 3 2 2 2 3 2 2 2 3 3 3 3 3 3 1 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 3 3 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 1 1 3 2 2 2 2 2 2 3 3 3 3 3 2 2 2 2 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 3 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 2 2 3 1 3 3 3 3 3 3 3 2 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 3 3 3 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 3 2 3 3 3 3 1 3 3 3 3 3 3 2 2 3 3 3 3 3 2 3 3 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 3 3 3 3 1 2 3 2 3 1 1 3 3 1 1 3 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 3 3 3 1 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 1 1 1 1 1 3 3 1 3 2 2 2 3 3 3 1 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 2 3 3 3 3 3 2 3 3 2 2 3 1 1 1 1 1 2 3 2 2 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 1 1 1 2 2 3 3 3 3 3 1 3 3 3 3 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 2 3 3 2 3 1 1 1 1 1 3 2 3 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 2 2 2 3 1 1 1 3 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 1 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 -9999 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 2 2 2 2 3 3 3 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 2 3 2 2 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 2 2 2 2 2 3 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 1 3 3 1 3 3 2 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 1 3 3 2 3 2 3 1 2 2 2 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 2 3 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 2 2 2 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 3 2 3 2 1 1 1 1 2 3 3 1 1 2 1 3 3 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 3 3 3 2 2 3 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 2 2 1 3 1 1 1 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 2 3 2 1 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 3 3 3 3 2 3 3 3 3 3 3 3 3 3 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 2 3 2 2 3 3 1 1 1 1 1 3 3 3 3 3 1 3 2 3 3 3 2 2 3 3 1 1 1 1 3 2 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 2 3 3 3 3 3 3 3 3 1 1 1 3 3 2 2 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 2 3 3 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 2 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 2 3 2 3 3 3 3 3 2 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 2 3 3 3 3 3 3 1 3 1 1 1 1 1 3 3 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 1 1 1 3 2 2 2 3 2 1 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 2 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 1 1 1 3 3 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 3 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 2 2 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 2 3 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 1 1 3 3 3 1 3 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 3 3 3 1 3 3 3 3 1 3 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 3 3 2 3 3 3 3 3 1 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 2 2 3 3 2 3 3 3 3 1 1 3 3 2 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 1 2 2 3 3 1 1 3 1 1 1 1 1 3 3 2 2 3 3 3 3 2 3 3 1 3 3 3 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 3 2 3 1 1 3 3 3 3 1 3 3 3 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 3 3 3 2 2 2 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 3 3 2 2 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 3 2 1 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 1 1 2 2 3 3 3 3 3 3 3 1 1 1 3 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 2 1 1 1 1 1 1 1 3 3 2 3 2 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 2 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 2 3 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 2 2 2 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 3 3 3 1 3 2 3 3 3 3 3 3 3 3 3 1 1 3 3 3 2 2 2 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 3 3 3 3 1 1 3 1 1 1 2 2 3 3 3 3 3 3 3 3 3 1 1 3 2 3 3 3 3 2 2 2 2 2 2 1 3 3 3 3 3 3 3 2 3 3 3 3 1 1 1 3 3 2 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 2 2 2 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 1 3 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 2 3 2 2 3 3 3 2 2 2 3 3 3 3 3 3 3 1 1 1 3 3 3 2 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 2 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 2 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 2 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 3 1 1 1 1 3 3 3 3 3 2 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 3 3 3 3 3 1 1 1 3 1 1 3 3 3 3 3 2 3 3 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 2 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 1 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 2 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 1 1 1 1 1 1 1 3 1 1 3 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 3 3 1 3 3 1 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 2 1 2 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 3 3 2 3 3 3 1 1 3 1 1 1 3 3 1 1 3 2 2 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 1 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 2 1 1 1 3 3 3 2 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 2 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 2 3 3 2 2 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 2 3 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 1 1 1 3 3 3 2 3 3 3 3 3 3 2 3 2 3 3 2 2 2 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 1 1 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 2 2 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 2 3 2 3 3 3 3 2 2 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 3 3 3 2 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 2 1 2 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 3 1 1 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 2 3 3 3 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 3 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 3 2 2 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 1 3 3 1 3 3 3 3 3 3 3 2 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 1 3 3 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 3 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 2 3 3 3 3 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 2 2 3 1 3 1 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 2 3 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 3 1 3 3 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 2 1 3 3 1 3 3 3 3 3 3 3 3 1 1 3 1 1 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 3 2 2 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 1 1 3 3 3 2 2 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 2 3 3 3 3 1 3 1 1 1 1 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 2 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 1 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 3 1 3 2 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 3 1 3 3 3 3 2 3 1 1 1 3 3 3 3 1 1 3 3 3 3 3 1 3 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 1 1 1 3 2 3 1 1 1 3 2 3 3 1 1 1 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 2 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 1 3 3 3 1 3 3 3 1 3 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 2 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 3 3 3 1 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 1 1 3 3 3 3 1 3 3 3 3 3 1 3 3 1 1 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 3 1 1 3 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 1 3 3 3 1 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 3 3 1 3 1 1 3 3 2 3 3 3 3 3 3 1 3 1 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 2 3 3 3 1 1 1 1 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 2 3 1 1 1 3 3 3 3 3 3 1 3 1 1 2 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 3 3 3 1 1 1 3 3 3 1 1 3 3 3 3 2 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 1 1 1 1 1 1 3 2 2 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 1 3 3 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 3 1 3 1 1 1 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 1 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 3 3 3 1 3 3 1 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 1 3 1 1 1 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 2 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 2 2 3 3 1 1 3 3 3 3 3 3 3 3 3 1 2 1 1 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 2 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 3 1 3 1 1 1 1 3 3 2 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 3 3 1 1 1 1 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 2 2 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 2 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 1 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 2 2 3 2 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 3 2 2 2 2 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 2 3 1 1 3 3 1 1 2 2 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 3 2 2 3 3 2 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 2 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 2 3 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 3 1 1 1 1 1 1 1 3 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 2 2 2 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 3 3 3 3 2 3 3 3 1 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 2 2 2 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 1 1 2 1 1 1 1 1 1 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 1 3 3 2 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 3 1 1 2 2 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 2 3 2 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 1 1 1 1 1 1 3 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 2 2 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 1 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 2 3 3 3 1 1 1 1 1 3 2 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 1 3 3 1 1 1 1 3 3 3 1 3 1 3 1 1 3 3 1 1 1 3 3 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 3 3 3 2 2 3 2 3 1 1 1 1 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 1 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 1 3 3 3 2 3 2 3 3 1 1 1 1 1 1 1 3 3 3 2 3 3 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 1 1 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 1 3 3 2 3 2 1 1 3 1 1 3 3 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 2 2 3 3 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 3 1 1 3 3 2 2 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 1 1 1 3 1 1 3 3 3 1 1 1 1 3 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 1 1 2 1 1 1 1 3 2 3 3 1 1 1 3 1 1 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 3 3 3 3 3 2 2 2 2 2 1 3 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 3 1 3 3 1 1 3 2 3 1 1 3 1 2 3 1 1 1 3 3 1 1 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 1 1 1 1 3 1 3 3 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 2 3 3 3 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 1 3 3 3 3 1 3 3 3 3 3 3 2 2 1 1 1 3 1 1 3 3 3 1 1 3 1 1 1 1 1 1 1 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 2 3 1 3 3 3 1 1 1 1 3 3 3 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 1 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 3 3 3 3 3 1 1 2 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 1 2 2 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 1 1 1 3 1 3 1 3 3 1 3 3 2 1 1 1 1 3 3 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 1 1 3 2 3 1 3 1 1 1 1 3 1 3 1 3 3 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 3 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 1 3 3 1 1 1 1 3 3 3 2 2 2 2 3 1 3 1 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 1 1 1 3 3 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 2 3 1 1 1 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 2 2 2 2 2 3 3 3 3 3 3 1 1 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 2 2 2 2 1 3 3 3 3 3 3 1 1 1 3 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 2 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 2 3 3 2 2 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 3 3 1 2 2 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 2 3 3 2 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 1 1 2 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 1 1 1 1 1 2 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 1 2 3 3 3 3 3 3 3 2 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 2 3 3 3 1 3 3 3 3 1 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 2 2 1 3 1 1 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 1 3 1 1 2 2 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 2 3 3 3 3 1 1 1 3 3 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 1 1 3 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 2 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 2 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 1 1 1 3 1 1 1 1 3 3 3 2 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 3 3 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 1 3 2 3 3 3 3 3 3 3 1 1 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 1 1 1 1 3 3 1 1 3 3 1 1 3 2 3 3 3 3 3 3 3 1 1 1 3 3 3 1 3 3 3 3 1 3 3 1 1 3 3 3 3 1 1 1 1 1 3 3 3 1 3 2 2 2 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 2 2 2 3 3 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 1 3 2 3 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 1 3 2 2 2 1 3 3 3 1 1 1 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 1 3 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 1 2 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 2 1 3 3 1 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 2 2 2 3 1 1 3 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 1 2 2 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 1 1 3 3 1 1 3 3 3 3 2 2 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 1 1 3 2 2 2 3 3 3 3 1 3 3 3 1 1 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 1 3 3 3 1 3 3 2 3 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 3 3 3 1 1 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 3 2 2 2 2 3 3 2 1 1 1 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 1 1 3 3 3 3 3 3 3 3 1 3 3 3 3 2 3 3 3 3 1 3 3 3 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 2 2 2 2 1 2 2 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 2 3 3 2 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 2 2 3 3 2 3 3 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 2 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 2 2 3 2 3 1 1 1 1 3 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 3 3 3 3 3 3 3 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 3 2 3 3 1 3 3 3 1 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 3 3 3 3 3 1 3 1 1 1 2 2 2 2 3 1 1 1 1 1 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 3 2 3 1 3 3 3 3 3 1 1 1 1 2 3 1 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 2 3 3 1 1 3 1 3 1 3 3 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 2 1 3 2 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 2 2 3 3 3 3 3 3 3 2 1 1 1 1 3 3 3 1 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 3 3 3 3 2 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 3 3 2 1 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 3 3 3 3 1 3 3 1 1 3 3 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 1 1 1 3 3 2 2 3 1 1 3 1 1 3 3 3 3 3 1 3 3 3 1 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 3 3 3 1 3 1 1 1 3 3 1 3 3 1 1 1 3 3 3 3 3 1 1 3 1 3 3 2 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 3 2 2 3 3 1 1 3 3 1 3 3 3 3 3 1 3 3 3 3 1 1 3 3 1 1 3 1 1 1 3 3 1 3 3 3 3 3 1 1 3 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 1 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 1 1 3 2 2 2 3 2 2 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 3 3 3 1 1 3 3 1 1 3 3 3 3 1 1 1 3 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 2 3 2 3 1 1 3 3 1 1 1 3 1 3 3 1 1 2 3 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 2 2 2 2 2 2 3 3 3 3 3 3 2 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 1 1 3 3 3 1 3 1 1 1 1 1 1 3 3 1 1 3 1 3 3 3 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 2 3 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 2 3 3 1 1 1 3 2 2 2 2 3 2 3 3 3 1 1 1 1 3 3 1 1 1 1 3 3 1 3 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 1 3 3 3 3 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 3 3 2 2 2 2 3 1 1 3 1 1 1 1 1 3 1 1 1 1 3 3 3 3 3 3 2 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 1 3 3 1 1 3 1 3 3 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 2 3 2 3 3 3 1 1 1 1 1 1 1 1 3 1 3 3 1 1 3 3 2 2 3 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 1 3 1 3 3 1 3 3 1 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 1 3 1 1 3 2 2 3 3 2 1 1 3 3 2 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 3 3 1 1 1 1 1 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 1 3 3 2 2 3 3 3 1 3 3 3 3 3 3 3 3 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 1 3 1 3 3 2 2 2 2 3 2 1 3 3 3 1 3 2 2 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 2 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 3 1 1 1 1 1 3 3 3 1 1 3 1 2 3 3 3 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 1 3 1 3 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 3 3 3 3 1 3 3 3 3 3 1 1 1 1 3 3 3 2 3 2 3 2 3 1 3 2 2 2 2 3 2 2 3 3 3 3 3 3 3 3 2 3 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 3 3 3 1 3 3 1 3 1 1 1 3 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 3 3 1 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 3 3 1 3 3 3 3 1 3 3 3 1 1 1 1 1 3 1 1 3 2 3 3 3 1 1 1 1 2 2 2 2 2 2 2 3 2 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 2 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 3 3 1 3 3 1 1 1 1 2 3 2 2 2 2 2 2 3 3 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 2 2 3 3 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 2 2 3 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 2 3 3 1 3 3 3 3 2 2 3 1 1 1 2 2 2 2 2 2 2 2 2 3 3 1 1 1 3 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 1 1 1 3 3 3 1 3 3 1 1 1 1 3 3 3 3 3 1 3 3 3 3 1 1 1 3 1 1 3 2 2 3 1 1 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 2 2 2 1 3 2 3 3 3 2 2 1 1 1 2 2 2 2 2 3 2 2 2 3 1 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 3 3 3 1 3 3 3 3 3 3 2 3 1 1 3 2 3 3 1 1 1 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 2 2 3 2 1 1 1 1 1 1 1 1 2 2 2 2 3 3 2 3 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 3 3 3 2 3 2 3 3 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 3 2 3 2 3 3 3 3 2 2 2 3 3 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 3 3 1 2 2 3 3 3 3 1 3 3 3 3 1 3 3 2 1 3 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 2 2 3 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 3 1 1 1 3 3 1 3 1 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 2 3 1 3 1 1 1 1 3 3 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 2 3 1 1 1 1 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 2 3 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 3 1 3 3 1 3 3 2 1 1 1 3 1 1 1 1 3 3 3 3 3 3 3 2 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 1 1 1 1 2 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 3 3 3 1 2 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 3 3 1 1 3 3 3 3 1 1 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 1 1 1 3 3 3 1 3 1 1 1 1 1 1 2 2 2 3 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 1 3 3 3 3 3 1 3 3 3 1 3 1 3 1 1 1 1 1 1 1 2 1 1 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 2 1 2 2 3 1 1 1 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 2 2 3 1 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 1 1 1 3 1 3 3 1 3 3 1 3 3 3 3 3 3 1 3 1 1 1 1 1 3 3 1 3 3 3 1 1 1 3 3 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 3 1 3 3 3 3 3 1 1 2 2 2 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 3 3 2 2 1 1 1 1 3 1 1 3 3 3 3 1 3 3 3 1 3 1 3 3 3 1 1 1 3 3 3 1 3 3 1 1 3 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -9999 3 3 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 3 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 3 2 3 3 3 1 1 1 1 1 1 1 1 3 1 3 3 1 1 3 1 1 1 1 1 1 3 1 2 2 3 1 1 1 1 1 1 3 3 3 3 1 3 1 3 1 3 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 1 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 1 1 1 1 3 3 2 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 2 2 3 3 3 1 1 3 1 1 1 3 3 3 3 3 1 3 3 3 3 1 3 3 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 1 2 3 3 3 3 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 3 2 3 3 3 1 1 1 3 3 3 1 3 3 3 1 1 3 1 1 3 3 1 1 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 3 1 3 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 2 3 2 2 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 3 1 1 3 3 3 3 1 3 1 3 1 1 3 1 1 1 3 1 1 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 3 1 3 3 1 3 1 2 2 2 1 3 3 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 3 1 1 1 3 1 1 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 3 3 3 1 3 3 3 1 3 1 2 3 3 1 1 1 3 1 1 1 1 1 1 1 1 3 3 1 3 1 1 3 1 1 1 1 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 1 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 2 2 2 3 1 1 1 1 1 1 1 3 1 1 3 3 3 3 1 1 3 1 1 1 1 1 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 1 3 3 3 3 3 3 3 1 3 3 1 3 3 1 1 1 3 2 2 2 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 1 3 3 3 3 3 3 3 2 3 3 3 1 1 1 1 1 1 3 1 1 1 3 2 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 1 3 3 3 3 1 3 1 3 3 1 3 3 1 1 3 3 2 2 3 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 2 2 2 3 1 1 1 1 3 1 1 3 1 1 3 1 3 1 3 3 1 1 1 3 3 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 2 3 2 1 3 1 3 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 3 1 1 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 2 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 2 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 2 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 2 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 2 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 2 1 2 2 2 2 3 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 3 1 1 1 2 3 3 1 1 3 1 1 1 1 1 1 2 3 2 2 2 1 1 1 3 2 3 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 1 2 1 1 1 3 1 3 1 3 3 3 3 3 2 2 2 1 1 1 1 3 3 3 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 2 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 1 3 3 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 2 1 3 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 1 1 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 1 1 1 1 3 1 1 1 3 3 2 2 3 2 2 3 3 3 1 1 1 1 1 1 1 2 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 3 3 3 1 3 3 3 3 2 2 2 3 2 2 2 3 1 1 1 1 2 2 2 2 1 2 2 2 1 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 2 1 3 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 1 3 3 3 1 1 2 2 2 3 3 2 1 1 1 1 1 3 2 3 3 3 3 3 3 2 3 1 1 1 1 1 3 3 3 1 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 3 1 3 2 1 1 2 2 2 2 3 3 3 2 1 1 2 3 3 2 2 3 3 3 3 3 1 1 1 1 3 2 3 1 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 3 1 1 1 1 1 2 1 1 2 2 3 3 3 3 3 3 3 1 1 1 1 1 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 1 1 3 3 3 1 1 1 3 1 1 1 1 2 3 3 3 3 3 3 3 1 1 1 1 1 2 3 3 2 2 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 2 3 3 2 3 3 3 1 1 1 1 3 1 3 3 2 3 1 1 3 3 3 3 3 1 1 3 1 3 1 1 1 1 1 3 3 3 3 3 2 2 1 3 3 3 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 1 3 1 1 1 1 1 1 1 3 2 1 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 2 3 2 1 3 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 2 1 1 1 1 1 1 1 1 1 1 1 3 2 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 3 3 1 3 2 2 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 2 1 3 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 1 1 2 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 1 1 -9999 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 3 2 1 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 2 3 3 3 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 3 1 3 1 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 3 1 1 1 3 3 1 1 1 1 1 3 1 1 3 1 1 3 3 3 3 1 3 3 3 3 1 1 1 3 3 1 3 3 3 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 3 1 1 1 3 3 3 1 1 1 1 3 1 1 3 2 1 3 3 1 3 3 3 1 3 1 1 1 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 3 3 3 3 3 3 3 3 3 1 1 2 2 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 3 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 3 3 1 3 1 3 1 3 1 1 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 2 2 1 3 2 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 2 3 2 2 2 3 3 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 2 3 1 1 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 2 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 3 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 3 2 2 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 3 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 3 2 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 1 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 3 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 3 3 1 1 1 3 2 1 1 1 3 1 1 1 1 1 1 2 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 1 1 1 2 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 1 1 1 3 3 3 3 2 3 3 1 1 3 2 3 1 3 3 1 3 1 1 1 1 1 3 3 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 1 1 1 3 3 1 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 3 1 3 2 3 3 3 2 3 3 3 1 1 3 3 3 1 1 1 3 3 1 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 3 3 1 1 1 3 3 2 2 3 1 3 3 3 3 1 3 3 3 3 3 2 2 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 2 2 2 1 1 1 3 3 3 3 1 1 1 3 3 2 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 2 2 2 3 2 3 3 3 1 1 1 1 3 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 1 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 3 1 1 2 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 3 3 1 3 2 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 2 1 2 2 3 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 2 2 3 2 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 diff --git a/test_basin/input/luse/lc_1990.asc b/test_basin/input/luse/lc_1991.asc similarity index 100% rename from test_basin/input/luse/lc_1990.asc rename to test_basin/input/luse/lc_1991.asc diff --git a/test_basin/input/optional_data/tws_basin_1.txt b/test_basin/input/optional_data/tws_basin_1.txt index 0e546e22..be93d7df 100644 --- a/test_basin/input/optional_data/tws_basin_1.txt +++ b/test_basin/input/optional_data/tws_basin_1.txt @@ -1098,7 +1098,7 @@ end 1995 12 31 00 00 (YYYY MM DD HH MM) 1990 12 28 00 00 13.600 1990 12 29 00 00 13.600 1990 12 30 00 00 13.600 -1990 12 31 00 00 -9999.00 +1990 12 31 00 00 13.600 1991 01 01 00 00 27.000 1991 01 02 00 00 27.000 1991 01 03 00 00 27.000 diff --git a/test_basin/input/optional_data/tws_basin_2.txt b/test_basin/input/optional_data/tws_basin_2.txt index 8a5e7adc..be93d7df 100644 --- a/test_basin/input/optional_data/tws_basin_2.txt +++ b/test_basin/input/optional_data/tws_basin_2.txt @@ -369,7 +369,7 @@ end 1995 12 31 00 00 (YYYY MM DD HH MM) 1988 12 29 00 00 -7.500 1988 12 30 00 00 -7.500 1988 12 31 00 00 -7.500 -1989 01 01 00 00 -9999.0 +1989 01 01 00 00 21.000 1989 01 02 00 00 21.000 1989 01 03 00 00 21.000 1989 01 04 00 00 21.000 diff --git a/test_basin_2/input/luse/lc_1981.asc b/test_basin_2/input/luse/lc_1981.asc new file mode 100755 index 00000000..1e9ae7f6 --- /dev/null +++ b/test_basin_2/input/luse/lc_1981.asc @@ -0,0 +1,246 @@ +ncols 240 +nrows 240 +xllcorner 4597369 +yllcorner 2495847 +cellsize 500 +NODATA_value -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 -9999 -9999 1 3 1 1 1 1 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 2 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 3 1 3 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 3 3 3 1 1 3 3 3 2 2 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 1 3 3 3 3 2 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 1 3 3 3 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 2 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 1 1 3 1 1 3 3 1 1 3 1 1 1 1 3 3 3 3 1 3 1 1 3 3 1 1 1 3 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 1 3 3 1 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 1 1 3 1 3 3 3 3 1 1 1 1 3 3 2 2 2 3 3 3 3 3 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 2 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 2 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 1 3 1 1 3 3 2 3 3 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 3 3 3 2 1 1 1 2 2 2 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 1 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 1 3 3 3 3 3 3 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 3 1 3 3 3 3 2 2 3 3 3 3 3 1 2 2 2 2 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 1 3 3 3 2 2 3 1 1 3 1 1 1 1 1 2 3 2 2 2 2 2 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 1 1 1 1 1 1 1 1 3 3 3 2 3 3 1 1 1 3 3 2 2 3 3 3 1 1 1 1 3 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 1 3 3 2 -9999 2 3 1 1 3 3 3 1 1 3 3 3 2 2 2 2 2 2 2 3 1 1 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 2 2 -9999 -9999 3 1 3 3 2 3 1 3 3 3 3 2 2 2 2 2 2 3 1 1 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 -9999 -9999 -9999 -9999 -9999 3 3 2 2 2 2 2 3 3 2 2 2 2 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 2 2 2 2 3 3 1 1 1 1 1 3 3 1 1 3 3 1 1 3 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 2 2 2 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 3 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 1 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 3 1 3 3 2 3 3 3 3 3 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 3 1 3 3 1 3 3 3 2 3 1 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 2 2 2 3 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 2 2 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 2 1 2 2 2 2 2 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 2 2 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 2 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 3 3 2 2 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 2 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -9999 2 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 3 2 3 2 2 2 2 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 3 3 2 2 3 3 1 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 2 2 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 2 3 3 3 2 2 2 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 3 3 1 3 2 3 1 3 2 2 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 3 2 2 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 3 3 3 1 2 3 3 3 3 1 2 2 2 3 3 3 3 1 3 1 1 1 1 1 3 3 3 3 3 3 3 1 2 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 3 2 3 1 1 3 3 3 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 3 3 3 3 3 1 1 2 2 3 3 3 3 1 3 1 1 1 1 1 3 3 3 3 1 3 3 1 2 1 1 1 1 3 3 1 1 3 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 2 3 3 3 1 3 1 1 1 1 1 1 3 3 3 3 3 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 1 1 1 1 1 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 3 2 2 2 2 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 3 3 3 3 1 2 3 3 3 1 1 3 2 3 3 3 3 1 3 1 1 1 1 1 3 1 3 1 3 2 2 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 3 3 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 3 3 3 1 1 3 1 3 3 1 3 2 2 3 3 3 1 3 3 1 1 1 3 3 1 1 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 3 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 3 3 3 2 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 3 1 1 3 3 1 1 1 1 1 3 1 1 1 3 3 3 1 1 3 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 -9999 2 2 2 2 2 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 3 1 2 3 3 1 1 3 1 1 1 3 3 3 3 1 1 3 3 3 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 3 3 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 1 3 3 2 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 3 1 3 1 1 3 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 1 3 3 3 3 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 2 2 2 2 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 3 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 3 2 2 2 2 3 3 3 1 3 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 3 2 2 3 1 1 3 3 3 1 1 1 1 1 3 1 3 1 3 1 1 1 3 3 1 3 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 1 1 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 3 1 3 3 3 3 2 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 3 1 3 3 2 3 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 1 1 3 3 3 2 1 1 1 1 1 1 3 3 1 1 1 3 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 3 3 1 1 1 3 1 1 1 3 3 3 3 1 1 1 1 1 1 2 1 1 1 3 3 3 3 3 1 1 3 1 2 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 3 1 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 2 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 2 1 1 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 3 3 3 3 3 3 2 3 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 3 3 3 3 1 1 1 1 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 3 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 1 1 3 1 1 1 1 1 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 3 3 3 3 2 1 1 1 1 2 3 3 1 1 1 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 3 1 1 1 1 3 3 3 3 1 1 1 3 3 1 1 1 1 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 1 1 1 1 1 1 3 2 3 3 3 1 1 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 2 2 1 1 1 1 2 3 3 3 3 3 3 3 1 1 2 3 3 3 3 3 3 3 3 1 1 1 2 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 1 3 1 3 2 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 3 1 1 3 1 3 1 1 3 3 3 3 3 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 2 3 3 3 3 3 2 3 3 3 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 3 1 3 3 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 1 3 1 3 3 1 3 3 3 2 3 3 3 3 3 1 3 1 1 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 3 1 3 3 1 3 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 2 2 2 3 3 3 1 1 3 3 2 3 1 1 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 3 3 1 3 3 2 2 3 1 1 1 1 1 3 3 3 2 3 3 3 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 2 2 1 3 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 2 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 3 1 1 1 1 3 2 2 3 2 2 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 2 2 2 2 3 3 1 1 3 3 3 1 1 3 2 2 2 1 1 3 3 2 3 3 3 3 3 3 1 3 1 3 1 1 1 1 1 3 1 1 2 2 1 1 1 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 2 2 2 2 2 3 3 3 3 1 1 1 3 1 1 1 3 2 2 2 1 3 3 3 2 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 2 3 1 1 1 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 2 3 2 2 2 2 3 3 3 1 3 3 3 3 1 1 1 3 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 2 2 2 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 1 2 3 3 1 3 3 3 3 3 3 3 1 1 2 2 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 2 3 2 2 1 1 1 1 1 1 3 3 3 3 1 3 1 1 1 1 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 2 2 1 2 3 3 1 3 3 3 3 3 3 1 1 1 3 2 2 3 3 3 3 3 3 3 3 3 2 3 1 1 1 3 3 3 2 3 2 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 -9999 -9999 -9999 1 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 3 3 2 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 2 3 3 3 3 3 1 1 2 1 3 3 1 3 3 1 3 3 1 1 1 1 1 3 3 1 1 3 3 3 3 2 2 2 3 1 1 1 3 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 3 1 1 1 1 1 1 3 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 1 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 -9999 1 3 3 3 3 3 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 3 3 1 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 1 3 3 3 3 1 3 3 3 1 3 1 1 1 1 3 3 1 1 3 1 1 1 3 1 3 1 3 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 1 1 3 1 1 3 1 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 3 1 3 1 1 1 3 1 1 1 1 1 3 3 1 1 3 1 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 1 1 3 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 3 3 1 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 3 3 3 1 1 1 3 1 1 1 1 3 1 3 2 2 3 3 3 3 1 1 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 2 3 3 1 1 1 1 3 2 3 3 3 3 3 3 3 2 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 3 1 1 1 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 1 2 2 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 1 3 3 2 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 2 3 1 3 3 3 3 3 1 3 1 3 1 1 1 1 3 3 1 1 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 3 1 1 1 3 3 1 1 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 2 3 3 3 3 3 2 2 2 1 1 1 1 1 1 3 3 3 1 1 1 3 3 1 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 3 1 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 1 1 1 1 3 3 3 1 3 1 3 3 3 1 1 3 1 1 3 1 1 1 3 1 3 1 1 1 1 3 3 3 3 1 2 3 3 3 3 3 1 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 3 3 2 3 3 3 3 2 2 3 3 1 1 1 1 1 1 1 3 3 2 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 2 1 3 1 3 1 3 1 3 3 3 1 1 1 1 1 3 3 3 1 3 3 3 3 2 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 3 3 1 3 3 1 1 1 3 1 3 1 1 1 1 3 3 3 3 1 2 3 3 3 3 1 1 1 3 3 1 1 3 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 2 2 3 2 2 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 2 1 3 1 1 1 1 2 1 3 3 1 3 3 3 1 1 1 3 1 3 3 1 1 2 2 2 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 2 2 2 3 1 1 1 3 3 1 3 3 3 1 3 3 2 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 2 2 3 3 2 2 2 3 3 3 1 1 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 1 1 3 3 1 1 3 3 1 1 1 1 1 1 3 1 1 3 3 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 1 1 1 2 2 2 3 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 3 3 2 2 3 3 3 1 1 1 3 3 1 3 3 3 3 1 3 2 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 1 1 3 2 2 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 1 1 3 3 1 1 1 1 1 3 3 3 3 3 2 3 3 3 1 2 2 2 1 1 3 1 2 2 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 3 2 2 2 2 3 3 3 3 2 3 3 1 3 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 3 3 3 1 1 3 3 1 1 1 1 1 2 2 2 1 1 2 3 2 3 1 3 1 1 1 2 3 3 2 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 1 3 3 3 3 1 1 1 2 1 3 3 3 1 1 3 3 1 1 1 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 2 3 3 3 3 2 2 2 2 3 2 3 3 3 3 3 3 3 1 1 1 3 1 1 3 3 3 1 1 3 1 1 1 1 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 3 1 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 2 3 3 3 3 2 2 2 2 3 1 3 3 3 1 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 3 1 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 3 3 1 1 3 2 3 3 3 3 3 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 3 2 3 3 3 2 2 2 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 2 3 3 1 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 2 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 2 2 2 2 2 2 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 2 3 3 3 2 2 2 2 2 1 1 3 1 1 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 2 3 3 3 1 3 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 3 2 3 3 2 3 3 1 3 1 1 3 1 1 1 1 3 3 3 1 1 1 1 2 2 3 3 3 3 3 2 2 2 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 2 1 1 1 1 3 3 3 3 3 3 1 1 1 3 1 1 3 3 1 3 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 2 3 3 2 2 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 1 2 3 3 3 3 3 3 2 1 3 1 1 1 1 1 3 1 1 3 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 1 3 3 3 1 3 1 1 3 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 2 3 3 1 3 3 1 1 1 1 2 3 3 3 2 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 2 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 3 1 1 1 1 3 3 1 1 1 3 1 1 1 3 3 3 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 3 3 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 2 1 1 1 1 2 3 3 3 2 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 3 2 3 3 1 3 1 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 3 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 3 2 2 2 3 3 1 1 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 1 1 1 1 3 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 2 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 3 3 2 3 2 2 2 1 1 1 1 3 1 1 3 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 3 3 3 1 3 3 1 3 1 1 1 3 3 3 1 1 3 3 2 3 2 1 3 1 3 1 1 1 3 3 3 1 1 3 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 3 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 3 3 2 3 2 2 2 3 3 3 3 1 1 1 2 2 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 3 1 3 3 1 1 1 3 1 1 3 1 1 1 2 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 3 3 3 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 1 1 2 2 3 3 3 1 1 1 3 3 3 2 3 3 1 1 1 1 1 1 1 1 2 3 3 1 1 1 1 1 1 1 2 3 3 3 3 1 1 1 3 1 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 1 1 3 1 1 1 1 1 1 1 2 1 1 1 1 3 1 1 1 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 3 1 1 1 1 1 3 1 1 3 1 3 1 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 3 1 1 1 1 2 2 2 3 3 3 3 3 3 3 2 2 2 2 2 2 3 1 1 1 2 3 3 3 3 3 1 1 1 3 3 2 3 3 2 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 3 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 2 2 3 3 3 2 3 2 2 2 1 1 3 3 3 3 3 2 2 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 1 1 1 3 3 3 3 3 2 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 3 1 3 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 1 3 3 3 3 3 1 1 1 1 3 1 1 1 3 2 3 1 1 1 1 3 1 1 3 1 1 1 3 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 2 3 3 2 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 3 3 3 1 3 1 3 1 1 1 3 3 3 1 1 1 3 1 3 3 1 1 3 1 1 1 3 1 3 1 3 1 3 3 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 2 2 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 1 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 1 3 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 3 3 1 3 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 3 2 3 3 2 2 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 2 1 2 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 3 3 1 3 3 1 3 1 1 1 1 3 1 1 1 1 1 1 2 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 3 1 1 1 1 3 2 2 1 2 2 2 2 2 2 2 2 2 3 2 2 2 2 3 3 3 3 2 3 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 2 1 1 1 1 1 3 1 3 1 3 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 1 3 1 1 1 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 3 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 1 3 3 3 1 1 1 3 1 1 1 1 3 1 3 1 3 3 3 1 3 3 1 1 3 1 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 2 3 3 1 1 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 3 1 1 1 1 3 3 1 1 3 3 1 1 1 3 3 1 1 1 1 1 3 1 3 3 1 1 3 1 1 1 3 3 1 1 1 3 2 1 1 1 1 3 3 3 1 1 1 1 1 1 3 2 3 1 1 1 1 3 3 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1 3 3 1 1 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 2 3 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 3 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 3 3 1 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 3 3 1 1 1 1 1 3 1 3 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 1 1 1 1 1 1 3 1 3 3 3 3 1 1 3 3 1 1 1 1 1 3 3 3 1 3 1 1 3 3 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 1 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 3 1 3 1 3 3 1 3 1 1 1 1 1 3 1 1 3 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 1 3 1 3 3 1 1 1 1 1 3 3 1 1 1 3 1 1 3 3 3 3 1 1 3 3 1 1 3 1 3 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 3 2 3 3 3 3 2 2 3 2 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 2 3 1 2 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 3 1 1 1 1 1 1 3 3 3 1 1 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 3 2 3 1 1 1 3 1 3 1 1 1 1 1 1 3 1 3 3 1 3 3 1 3 1 3 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 2 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 2 2 1 1 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 2 2 3 3 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 3 3 1 1 3 1 1 3 3 1 3 1 1 1 1 1 3 1 3 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 2 1 3 1 2 2 2 2 2 3 3 2 3 2 2 2 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 -9999 -9999 1 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 3 1 1 3 3 3 1 1 3 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 2 3 3 1 3 3 2 3 2 3 2 3 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 3 1 1 3 3 1 3 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 3 2 3 1 3 3 3 2 3 3 3 2 2 3 2 1 1 3 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 3 1 3 3 1 3 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 1 1 3 1 3 3 1 1 1 3 1 1 3 1 1 1 1 1 3 3 3 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 3 1 1 1 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 1 1 1 3 1 1 1 3 1 1 3 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 3 3 3 3 1 1 1 2 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 1 1 3 1 3 1 1 1 1 3 3 3 1 1 1 1 1 3 3 1 3 1 3 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 1 1 1 1 1 1 3 1 1 3 1 3 3 1 1 1 3 3 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 1 3 1 1 1 1 3 3 3 3 1 1 3 1 3 1 1 1 1 1 3 3 3 3 1 3 1 1 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 2 2 1 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 3 2 1 1 3 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 3 3 1 3 3 1 3 1 3 1 3 1 1 1 3 1 3 1 1 1 1 3 3 3 3 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 3 1 1 3 1 1 3 3 3 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 1 3 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 1 1 1 3 1 3 3 1 1 1 1 1 1 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 3 1 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 2 3 3 3 3 1 1 3 1 1 3 3 3 3 1 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 1 1 1 1 1 3 3 3 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 1 1 2 2 3 3 3 1 3 3 3 1 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 3 3 3 3 1 1 3 3 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 2 2 2 3 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 3 1 1 1 3 1 1 1 1 1 1 3 3 2 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 3 3 2 2 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 3 1 1 1 3 1 1 3 3 3 1 1 1 3 1 1 1 1 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 3 3 3 3 3 1 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 3 1 3 3 3 3 1 3 3 1 1 1 3 1 1 1 1 1 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 2 3 3 3 3 3 2 2 3 3 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 2 3 3 3 3 3 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 3 1 1 1 1 1 1 1 3 1 3 3 1 2 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 3 1 1 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 1 3 3 3 3 1 1 1 1 1 3 3 1 1 2 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 2 3 3 2 2 1 1 1 3 1 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 3 1 3 1 2 3 3 1 1 1 3 3 3 3 3 3 2 1 3 3 3 3 3 3 1 3 3 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 3 3 1 3 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 1 3 1 3 3 3 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 1 3 3 3 3 2 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 3 1 3 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 3 1 3 3 1 3 1 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 3 3 1 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 3 1 1 1 1 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 3 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 3 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 3 3 1 1 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 3 3 2 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 2 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 3 1 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 3 1 1 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 1 1 3 3 3 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 3 1 1 1 1 1 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 3 1 1 3 3 1 1 1 3 3 1 3 1 3 3 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 1 3 1 1 3 1 1 1 1 3 3 1 1 1 3 1 1 2 2 3 3 1 2 2 3 3 3 3 3 3 1 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 3 3 1 1 3 1 1 3 3 1 3 3 3 1 1 3 3 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 1 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 3 1 1 3 3 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 2 2 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 1 3 1 1 1 1 3 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 3 1 1 -9999 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 1 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 3 3 3 -9999 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 3 1 3 3 3 3 3 1 3 -9999 -9999 -9999 3 3 1 1 1 2 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 2 3 3 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 3 3 3 3 3 1 -9999 -9999 -9999 -9999 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 2 2 3 3 3 1 1 3 3 3 3 2 3 1 1 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 3 1 1 1 3 3 1 1 1 3 1 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 3 3 3 3 3 -9999 -9999 -9999 -9999 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 2 1 1 1 1 3 3 2 3 3 2 3 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 1 1 1 1 1 3 3 1 3 3 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 1 1 1 1 1 1 2 3 3 3 3 3 1 3 1 1 3 3 1 1 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 1 3 3 1 3 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 2 1 1 3 1 3 3 3 3 1 1 1 1 1 1 1 3 3 1 1 3 3 3 1 3 3 3 1 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 2 2 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 3 1 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 3 1 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 3 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 3 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 1 1 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 3 1 1 1 3 3 3 3 1 -9999 -9999 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 3 3 3 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 3 1 3 1 3 3 1 1 3 3 3 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 -9999 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 diff --git a/test_basin_2/input/luse/lc_1991.asc b/test_basin_2/input/luse/lc_1991.asc new file mode 100755 index 00000000..d7449604 --- /dev/null +++ b/test_basin_2/input/luse/lc_1991.asc @@ -0,0 +1,246 @@ +ncols 240 +nrows 240 +xllcorner 4597369 +yllcorner 2495847 +cellsize 500 +NODATA_value -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 -9999 -9999 1 3 1 1 1 1 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 2 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 3 1 3 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 3 3 3 1 1 3 3 3 2 2 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 1 3 3 3 3 2 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 1 3 3 3 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 2 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 1 1 3 1 1 3 3 1 1 3 1 1 1 1 3 3 3 3 1 3 1 1 3 3 1 1 1 3 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 1 3 3 1 1 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 3 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 1 1 3 1 3 3 3 3 1 1 1 1 3 3 2 2 2 3 3 3 3 3 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 2 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 2 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 1 3 1 1 3 3 2 3 3 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 3 3 3 2 1 1 1 2 2 2 2 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 1 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 1 3 3 3 3 3 3 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 3 1 3 3 3 3 2 2 3 3 3 3 3 1 2 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 1 3 3 3 2 2 3 1 1 3 1 1 1 1 1 2 3 2 2 2 2 2 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 1 1 1 1 1 1 1 1 3 3 3 2 3 3 1 1 1 3 3 2 2 3 3 3 1 1 1 1 3 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 1 3 3 2 -9999 2 3 1 1 3 3 3 1 1 3 3 3 2 2 2 2 2 2 2 3 1 1 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 2 2 -9999 -9999 3 1 3 3 2 3 1 3 3 3 3 2 2 2 2 2 2 3 1 1 3 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 -9999 -9999 -9999 -9999 -9999 3 3 2 2 2 2 2 3 3 2 2 2 2 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 2 2 2 2 3 3 1 1 1 1 1 3 3 1 1 3 3 1 1 3 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 2 2 2 3 3 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 3 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 1 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 3 1 3 3 2 3 3 3 3 3 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 3 1 3 3 1 3 3 3 2 3 1 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 2 2 2 3 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 2 2 3 3 3 3 1 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 2 1 2 2 2 2 2 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 2 2 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 2 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 3 3 2 2 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 2 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -9999 2 2 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 3 2 3 2 2 2 2 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 3 3 2 2 3 3 1 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 2 2 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 2 3 3 3 2 2 2 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 3 3 1 3 2 3 1 3 2 2 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 3 2 2 3 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 3 3 3 1 2 3 3 3 3 1 2 2 2 3 3 3 3 1 3 1 1 1 1 1 3 3 3 3 3 3 3 1 2 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 3 2 3 1 1 3 3 3 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 3 3 3 3 3 1 1 2 2 3 3 3 3 1 3 1 1 1 1 1 3 3 3 3 1 3 3 1 2 1 1 1 1 3 3 1 1 3 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 2 3 3 3 1 3 1 1 1 1 1 1 3 3 3 3 3 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 1 1 1 1 1 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 3 2 2 2 2 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 3 3 3 3 1 2 3 3 3 1 1 3 2 3 3 3 3 1 3 1 1 1 1 1 3 1 3 1 3 2 2 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 3 3 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 3 3 3 1 1 3 1 3 3 1 3 2 2 3 3 3 1 3 3 1 1 1 3 3 1 1 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 3 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 3 3 3 2 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 3 1 1 3 3 1 1 1 1 1 3 1 1 1 3 3 3 1 1 3 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 -9999 2 2 2 2 2 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 3 1 2 3 3 1 1 3 1 1 1 3 3 3 3 1 1 3 3 3 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 3 3 2 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 1 3 3 2 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 3 1 3 1 1 3 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 1 3 3 3 3 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 2 2 2 2 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 3 3 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 1 1 1 1 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 2 2 3 3 2 2 2 2 3 3 3 1 3 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 3 2 2 3 1 1 3 3 3 1 1 1 1 1 3 1 3 1 3 1 1 1 3 3 1 3 1 1 3 3 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 1 1 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 3 1 3 3 3 3 2 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 3 1 3 3 2 3 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 1 1 3 3 3 2 1 1 1 1 1 1 3 3 1 1 1 3 1 1 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 3 3 1 1 1 3 1 1 1 3 3 3 3 1 1 1 1 1 1 2 1 1 1 3 3 3 3 3 1 1 3 1 2 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 3 1 3 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 2 3 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 2 1 1 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 3 3 3 3 3 3 2 3 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 3 3 3 3 1 1 1 1 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 3 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 1 1 3 1 1 1 1 1 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 3 3 3 3 2 1 1 1 1 2 3 3 1 1 1 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 3 1 1 1 1 3 3 3 3 1 1 1 3 3 1 1 1 1 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 2 3 3 3 3 3 1 1 3 1 3 3 3 3 3 3 1 1 1 1 1 1 3 2 3 3 3 1 1 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 2 2 1 1 1 1 2 3 3 3 3 3 3 3 1 1 2 3 3 3 3 3 3 3 3 1 1 1 2 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 1 1 3 1 3 2 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 3 1 1 3 1 3 1 1 3 3 3 3 3 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 2 3 3 3 3 3 2 3 3 3 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 3 1 3 3 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 1 3 1 3 3 1 3 3 3 2 3 3 3 3 3 1 3 1 1 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 3 1 3 3 1 3 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 2 2 2 3 3 3 1 1 3 3 2 3 1 1 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 3 3 1 3 3 2 2 3 1 1 1 1 1 3 3 3 2 3 3 3 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 2 2 1 3 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 2 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 1 3 1 1 1 1 3 2 2 3 2 2 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 2 2 2 2 3 3 1 1 3 3 3 1 1 3 2 2 2 1 1 3 3 2 3 3 3 3 3 3 1 3 1 3 1 1 1 1 1 3 1 1 2 2 1 1 1 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 3 3 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 2 2 2 2 2 3 3 3 3 1 1 1 3 1 1 1 3 2 2 2 1 3 3 3 2 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 2 3 1 1 1 3 3 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 2 3 2 2 2 2 3 3 3 1 3 3 3 3 1 1 1 3 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 2 2 2 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 2 3 3 3 3 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 1 2 3 3 1 3 3 3 3 3 3 3 1 1 2 2 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 2 3 2 2 1 1 1 1 1 1 3 3 3 3 1 3 1 1 1 1 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 3 3 3 3 1 3 3 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 2 2 1 2 3 3 1 3 3 3 3 3 3 1 1 1 3 2 2 3 3 3 3 3 3 3 3 3 2 3 1 1 1 3 3 3 2 3 2 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 -9999 -9999 -9999 1 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 2 2 3 3 2 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 2 3 3 3 3 3 1 1 2 1 3 3 1 3 3 1 3 3 1 1 1 1 1 3 3 1 1 3 3 3 3 2 2 2 3 1 1 1 3 3 3 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 3 1 1 1 1 1 1 3 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 1 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 -9999 1 3 3 3 3 3 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 3 3 1 1 1 3 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 3 1 3 3 3 3 1 3 3 3 1 3 1 1 1 1 3 3 1 1 3 1 1 1 3 1 3 1 3 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 1 1 3 1 1 3 1 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 3 1 3 1 1 1 3 1 1 1 1 1 3 3 1 1 3 1 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 3 1 1 3 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 3 1 1 3 1 1 1 1 1 1 1 3 3 3 2 3 3 3 3 1 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 1 3 3 3 1 3 1 3 1 1 1 1 3 1 3 2 2 3 3 3 3 1 1 3 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 2 3 3 1 1 1 1 3 2 3 3 3 3 3 3 3 2 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 3 1 1 1 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 1 2 2 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 1 3 3 2 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 2 3 1 3 3 3 3 3 1 3 1 3 1 1 1 1 3 3 1 1 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 3 1 1 1 3 3 1 1 2 3 3 3 3 1 1 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 2 3 3 3 3 3 2 2 2 1 1 1 1 1 1 3 3 3 1 1 1 3 3 1 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 3 1 3 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 1 1 1 1 3 3 3 1 3 1 3 3 3 1 1 3 1 1 3 1 1 1 3 1 3 1 1 1 1 3 3 3 3 1 2 3 3 3 3 3 1 3 3 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 3 3 2 3 3 3 3 2 2 3 3 1 1 1 1 1 1 1 3 3 2 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 2 1 3 1 3 1 3 1 3 3 3 1 1 1 1 1 3 3 3 1 3 3 3 3 2 2 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 3 3 1 3 3 1 1 1 3 1 3 1 1 1 1 3 3 3 3 1 2 3 3 3 3 1 1 1 3 3 1 1 3 1 3 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 2 2 3 2 2 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 2 1 3 1 1 1 1 2 1 3 3 1 3 3 3 1 1 1 3 1 3 3 1 1 2 2 2 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 2 2 2 3 1 1 1 3 3 1 3 3 3 1 3 3 2 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 2 2 3 3 2 2 2 3 3 3 1 1 3 3 3 3 3 3 3 1 1 3 3 1 3 3 3 3 1 1 3 3 1 1 3 3 1 1 1 1 1 1 3 1 1 3 3 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 1 1 1 2 2 2 3 2 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 2 2 2 3 3 2 2 3 3 3 1 1 1 3 3 1 3 3 3 3 1 3 2 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 1 1 3 2 2 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 3 1 1 3 3 1 1 1 1 1 3 3 3 3 3 2 3 3 3 1 2 2 2 1 1 3 1 2 2 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 3 2 2 2 2 3 3 3 3 2 3 3 1 3 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 3 3 3 1 1 3 3 1 1 1 1 1 2 2 2 1 1 2 3 2 3 1 3 1 1 1 2 3 3 2 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 1 3 3 3 3 1 1 1 2 1 3 3 3 1 1 3 3 1 1 1 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 2 3 3 3 3 2 2 2 2 3 2 3 3 3 3 3 3 3 1 1 1 3 1 1 3 3 3 1 1 3 1 1 1 1 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 3 1 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 2 3 3 3 3 2 2 2 2 3 1 3 3 3 1 1 3 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 2 3 1 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 3 3 1 1 3 2 3 3 3 3 3 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 3 2 3 3 3 2 2 2 1 1 1 2 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 2 3 3 1 1 1 3 1 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 2 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 2 2 2 2 2 2 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 2 3 3 3 2 2 2 2 2 1 1 3 1 1 3 3 3 1 1 1 3 3 3 3 3 3 1 3 3 2 3 3 3 1 3 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 3 2 3 3 2 3 3 1 3 1 1 3 1 1 1 1 3 3 3 1 1 1 1 2 2 3 3 3 3 3 2 2 2 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 2 1 1 1 1 3 3 3 3 3 3 1 1 1 3 1 1 3 3 1 3 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 1 1 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 2 3 3 2 2 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 1 2 3 3 3 3 3 3 2 1 3 1 1 1 1 1 3 1 1 3 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 1 3 3 3 1 3 1 1 3 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 2 3 3 1 3 3 1 1 1 1 2 3 3 3 2 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 2 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 3 1 1 1 1 3 3 1 1 1 3 1 1 1 3 3 3 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 3 3 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 2 1 1 1 1 2 3 3 3 2 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 3 2 3 3 1 3 1 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 3 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 3 3 3 2 2 2 3 3 1 1 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 1 1 1 1 3 1 1 1 1 3 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 2 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 1 1 3 3 1 1 1 3 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 3 3 2 3 2 2 2 1 1 1 1 3 1 1 3 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 1 1 1 3 3 3 1 3 3 1 3 1 1 1 3 3 3 1 1 3 3 2 3 2 1 3 1 3 1 1 1 3 3 3 1 1 3 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 1 1 3 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 3 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 1 1 1 1 3 3 2 3 2 2 2 3 3 3 3 1 1 1 2 2 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 3 1 3 3 1 1 1 3 1 1 3 1 1 1 2 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 3 1 1 3 3 3 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 1 1 2 2 3 3 3 1 1 1 3 3 3 2 3 3 1 1 1 1 1 1 1 1 2 3 3 1 1 1 1 1 1 1 2 3 3 3 3 1 1 1 3 1 3 3 3 3 3 3 3 3 1 1 3 3 1 3 3 1 1 3 1 1 1 1 1 1 1 2 1 1 1 1 3 1 1 1 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 3 1 1 1 1 1 3 1 1 3 1 3 1 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 3 1 1 1 1 2 2 2 3 3 3 3 3 3 3 2 2 2 2 2 2 3 1 1 1 2 3 3 3 3 3 1 1 1 3 3 2 3 3 2 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 1 3 3 3 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 3 1 1 1 1 1 3 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 1 1 3 1 1 1 1 1 1 1 1 2 2 3 3 3 2 3 2 2 2 1 1 3 3 3 3 3 2 2 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 1 1 1 3 3 3 3 3 2 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 3 1 3 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 3 3 3 2 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 1 3 1 3 3 3 3 3 1 1 1 1 3 1 1 1 3 2 3 1 1 1 1 3 1 1 3 1 1 1 3 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 3 3 3 2 3 3 2 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 3 3 3 1 3 1 3 1 1 1 3 3 3 1 1 1 3 1 3 3 1 1 3 1 1 1 3 1 3 1 3 1 3 3 1 1 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 2 2 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 3 3 3 1 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 1 1 3 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 3 3 1 3 1 1 3 3 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 3 2 3 3 2 2 3 3 3 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 2 1 2 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 3 3 1 3 3 1 3 1 1 1 1 3 1 1 1 1 1 1 2 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 3 3 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 3 1 1 1 1 3 2 2 1 2 2 2 2 2 2 2 2 2 3 2 2 2 2 3 3 3 3 2 3 3 3 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 2 1 1 1 1 1 3 1 3 1 3 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 1 3 1 1 1 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 3 1 1 3 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 1 1 1 1 1 3 3 3 1 1 1 3 1 1 1 1 3 1 3 1 3 3 3 1 3 3 1 1 3 1 3 3 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 2 3 3 1 1 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 3 1 1 1 1 3 3 1 1 3 3 1 1 1 3 3 1 1 1 1 1 3 1 3 3 1 1 3 1 1 1 3 3 1 1 1 3 2 1 1 1 1 3 3 3 1 1 1 1 1 1 3 2 3 1 1 1 1 3 3 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1 3 3 1 1 3 3 3 3 3 3 1 1 1 3 3 3 3 3 3 2 3 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 3 3 1 1 1 1 3 1 1 1 1 1 3 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3 1 1 3 3 1 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 3 3 1 1 1 1 1 3 1 3 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 1 1 1 1 1 1 3 1 3 3 3 3 1 1 3 3 1 1 1 1 1 3 3 3 1 3 1 1 3 3 1 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 3 3 1 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 2 3 3 3 3 3 1 1 1 3 1 3 1 3 3 1 3 1 1 1 1 1 3 1 1 3 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 1 3 1 3 3 1 1 1 1 1 3 3 1 1 1 3 1 1 3 3 3 3 1 1 3 3 1 1 3 1 3 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 3 2 3 3 3 3 2 2 3 2 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 3 1 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 2 3 1 2 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 3 1 1 1 1 1 1 3 3 3 1 1 3 1 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 3 3 2 3 1 1 1 3 1 3 1 1 1 1 1 1 3 1 3 3 1 3 3 1 3 1 3 1 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 3 3 3 2 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 2 2 1 1 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 2 2 3 3 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 3 3 1 1 3 1 1 3 3 1 3 1 1 1 1 1 3 1 3 1 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 3 3 3 1 1 3 1 1 3 1 1 3 1 1 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 2 1 3 1 2 2 2 2 2 3 3 2 3 2 2 2 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 -9999 -9999 1 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 3 1 1 3 3 3 1 1 3 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 2 3 3 1 3 3 2 3 2 3 2 3 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 3 1 3 1 1 3 3 1 3 3 3 3 1 1 1 1 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1 3 2 3 1 3 3 3 2 3 3 2 2 2 3 2 1 1 3 1 3 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 3 1 3 3 1 3 1 1 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 1 1 3 1 3 3 1 1 1 3 1 1 3 1 1 1 1 1 3 3 3 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 1 1 1 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 3 1 1 1 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 3 3 1 1 1 3 1 1 1 3 1 1 3 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 2 3 3 3 3 3 3 3 1 1 1 2 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 3 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 3 3 3 1 1 3 1 3 1 1 1 1 3 3 3 1 1 1 1 1 3 3 1 3 1 3 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 2 1 1 1 1 1 1 3 1 1 3 1 3 3 1 1 1 3 3 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 1 1 3 1 1 1 1 3 3 3 3 1 1 3 1 3 1 1 1 1 1 3 3 3 3 1 3 1 1 3 3 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 2 2 1 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 1 1 1 3 2 1 1 3 1 1 1 1 1 3 3 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 3 3 1 3 3 1 3 3 1 3 1 3 1 3 1 1 1 3 1 3 1 1 1 1 3 3 3 3 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 2 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 1 1 1 1 3 1 1 3 1 1 3 3 3 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 3 3 3 3 1 3 2 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 1 1 1 3 1 3 3 1 1 1 1 1 1 3 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 1 3 3 3 3 1 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 2 3 3 3 3 1 1 3 1 1 3 3 3 3 1 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 1 1 1 1 1 3 3 3 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 3 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 1 1 2 2 3 3 3 1 3 3 3 1 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 3 1 1 3 3 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 3 3 3 3 1 1 3 3 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 2 2 2 3 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 3 3 3 1 1 3 3 3 3 1 1 3 3 3 1 1 1 3 1 1 1 1 1 1 3 3 2 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 3 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 3 3 3 3 3 2 2 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 1 1 3 1 1 1 3 1 1 3 3 3 1 1 1 3 1 1 1 1 1 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 3 3 3 3 3 1 2 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 2 2 3 3 3 3 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 3 1 1 3 1 3 3 3 3 1 3 3 1 1 1 3 1 1 1 1 1 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 2 3 3 3 3 3 2 2 3 3 1 1 1 3 3 3 1 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 3 1 3 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 3 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 2 3 3 3 3 3 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 3 1 1 1 1 1 1 1 3 1 3 3 1 2 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 3 1 1 3 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 1 2 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 1 3 3 3 3 1 1 1 1 1 3 3 1 1 2 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 2 3 3 2 2 1 1 1 3 1 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 3 1 1 3 1 3 1 2 3 3 1 1 1 3 3 3 3 3 3 2 1 3 3 3 3 3 3 1 3 3 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 3 1 1 1 1 3 3 1 3 1 1 1 3 3 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 1 1 1 1 3 1 3 3 3 1 1 1 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 1 3 3 3 3 2 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 3 1 3 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 3 1 3 3 1 3 1 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 3 3 1 3 3 1 3 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 1 1 1 1 1 1 3 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 3 3 1 1 1 1 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 3 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 1 1 3 1 3 3 1 1 1 1 3 3 3 1 1 1 1 1 1 3 3 1 1 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 3 3 2 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 2 3 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 3 1 2 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 3 1 1 3 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 1 1 3 3 3 1 1 1 3 1 1 1 1 1 1 1 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 3 1 1 1 1 1 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 1 1 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 3 1 1 3 3 1 1 1 3 3 1 3 1 3 3 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 3 3 1 3 1 1 3 1 1 1 1 3 3 1 1 1 3 1 1 2 2 3 3 1 2 2 3 3 3 3 3 3 1 1 1 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 3 3 1 1 3 1 1 3 3 1 3 3 3 1 1 3 3 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 1 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 1 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 3 1 1 3 3 1 1 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 3 1 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 2 2 3 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 3 1 3 1 1 1 1 3 1 3 1 1 1 1 1 1 3 3 3 3 1 1 1 3 3 3 1 1 -9999 1 1 1 1 3 3 3 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 3 3 3 1 3 3 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 1 1 1 3 3 1 1 1 1 1 3 3 1 1 1 1 1 1 3 3 3 1 1 1 1 1 3 3 3 3 -9999 1 1 1 1 1 3 3 3 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 3 3 3 1 1 3 3 3 3 3 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 1 1 1 1 1 1 1 1 1 3 3 1 3 1 1 1 1 1 3 3 1 3 3 3 3 3 1 3 -9999 -9999 -9999 3 3 1 1 1 2 3 3 3 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 2 3 3 1 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 3 3 1 1 1 1 1 1 1 3 1 3 3 3 3 3 1 -9999 -9999 -9999 -9999 1 3 3 1 1 1 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 3 2 2 3 3 3 1 1 3 3 3 3 2 3 1 1 1 1 1 1 1 1 3 3 3 1 3 1 1 1 1 1 3 1 1 1 3 3 1 1 1 3 1 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 3 3 1 3 3 3 3 3 -9999 -9999 -9999 -9999 3 3 3 3 1 1 1 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 2 1 1 1 1 3 3 2 3 3 2 3 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 1 1 1 1 1 3 3 1 3 3 1 3 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 3 3 3 -9999 -9999 -9999 -9999 -9999 3 3 3 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 1 1 1 1 1 1 2 3 3 3 3 3 1 3 1 1 3 3 1 1 3 1 1 1 1 1 3 3 3 3 3 1 1 1 1 3 1 3 3 1 3 1 1 1 1 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 2 2 1 1 3 1 3 3 3 3 1 1 1 1 1 1 1 3 3 1 1 3 3 3 1 3 3 3 1 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 2 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 3 1 1 1 1 1 1 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 3 3 2 2 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 1 1 3 1 3 3 3 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 3 1 3 3 3 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 1 3 3 3 1 3 1 3 1 3 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 3 1 1 1 3 1 1 3 3 3 3 3 3 1 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 3 3 1 1 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 1 3 1 1 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 3 1 3 3 1 3 1 1 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 1 1 1 1 1 3 1 3 3 3 1 3 1 1 1 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 3 1 1 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 3 1 1 3 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 1 1 1 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 3 1 1 1 3 3 3 3 1 -9999 -9999 -9999 -9999 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 3 1 1 1 3 3 3 1 3 3 3 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 3 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 3 3 1 1 3 3 3 1 1 3 3 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 3 1 1 1 1 1 1 1 3 1 3 1 3 3 1 1 3 3 3 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 3 3 3 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 1 1 1 1 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 1 1 1 3 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 3 -9999 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 1 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 +-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999