Line data Source code
1 : !> \file mo_startup.f90
2 : !> \brief \copybrief mo_startup
3 : !> \details \copydetails mo_startup
4 :
5 : !> \brief Startup procedures for mHM.
6 : !> \details This module initializes all variables required to run mHM. This
7 : !> module needs to be run only one time at the beginning of a simulation if
8 : !> re-starting files do not exist.
9 : !> \authors Luis Samaniego, Rohini Kumar
10 : !> \date Dec 2012
11 : !> \copyright Copyright 2005-\today, the mHM Developers, Luis Samaniego, Sabine Attinger: All rights reserved.
12 : !! mHM is released under the LGPLv3+ license \license_note
13 : !> \ingroup f_mhm
14 : MODULE mo_startup
15 :
16 : USE mo_kind, ONLY : i4, dp
17 : use mo_message, only: message, error_message
18 :
19 : IMPLICIT NONE
20 :
21 : PRIVATE
22 :
23 : PUBLIC :: mhm_initialize ! initialization sequence
24 :
25 : CONTAINS
26 :
27 :
28 : !> \brief Initialize main mHM variables
29 : !> \details Initialize main mHM variables for a given domain.
30 : !! Calls the following procedures in this order:
31 : !! - Constant initialization.
32 : !! - Generate soil database.
33 : !! - Checking inconsistencies input fields.
34 : !! - Variable initialization at level-0.
35 : !! - Variable initialization at level-1.
36 : !! - Variable initialization at level-11.
37 : !! - Space allocation of remaining variable/parameters.
38 : !! Global variables will be used at this stage.
39 : !> \changelog
40 : !! - Luis Samaniego Mar 2008
41 : !! - fully distributed multilayer
42 : !! - Rohini Kumar Oct 2010
43 : !! - matrix to vector version
44 : !! - openmp parallelization
45 : !! - routing level 11
46 : !! - Luis Samaniego Jul 2012
47 : !! - removal of IMSL dependencies
48 : !! - Luis Samaniego Dec 2012
49 : !! - modular version
50 : !! - Rohini Kumar May 2013
51 : !! - code cleaned and error checks
52 : !! - Rohini Kumar Nov 2013
53 : !! - updated documentation
54 : !! - Stephan Thober Jun 2014
55 : !! - copied L2 initialization from mo_meteo_forcings
56 : !! - Stephan Thober Jun 2014
57 : !! - updated flag for read_restart
58 : !! - Stephan Thober Aug 2015
59 : !! - removed initialisation of routing
60 : !! - Rohini Kumar Mar 2016
61 : !! - changes for handling multiple soil database options
62 : !! - Robert Schweppe Jun 2018
63 : !! - refactoring and reformatting
64 : !! - Sebastian Müller Mar 2023
65 : !! - added separate read_nLAI_and_check_dims to correctly read nLAI from restart
66 : !> \authors Luis Samaniego, Rohini Kumar
67 : !> \date Dec 2012
68 28 : subroutine mhm_initialize
69 :
70 : use mo_common_mHM_mRM_variables, only : mhmFileRestartIn, read_restart
71 : use mo_common_restart, only : read_grid_info, read_nLAI_and_check_dims
72 : use mo_common_variables, only : level0, level1, domainMeta
73 : use mo_grid, only : set_domain_indices
74 : use mo_init_states, only : variables_alloc
75 : use mo_mpr_startup, only : init_eff_params, mpr_initialize
76 : use mo_mpr_global_variables, only: nLAI
77 :
78 : implicit none
79 :
80 : integer(i4) :: iDomain
81 :
82 : ! constants initialization
83 14 : call constants_init()
84 :
85 14 : if (read_restart) then
86 4 : allocate(level1(domainMeta%nDomains))
87 4 : allocate(level0(domainMeta%nDomains))
88 : ! read nLAI from restart files (-1 indicates first reading)
89 1 : nLAI = -1_i4
90 : else
91 13 : call mpr_initialize()
92 : end if
93 :
94 40 : do iDomain = 1, domainMeta%nDomains
95 :
96 26 : if (read_restart) then
97 : ! this reads only the domain properties
98 1 : if (domainMeta%L0DataFrom(iDomain) == iDomain) then
99 : ! only read level0 data if it is new
100 : ! similar to mo_common_read_data::read_dem
101 1 : call read_grid_info(mhmFileRestartIn(iDomain), "0", level0(iDomain))
102 : endif
103 1 : call read_grid_info(mhmFileRestartIn(iDomain), "1", level1(iDomain))
104 : ! read nLAI from restart
105 1 : call read_nLAI_and_check_dims(iDomain, mhmFileRestartIn(iDomain))
106 : ! Parameter fields have to be allocated in any case
107 1 : call init_eff_params(level1(iDomain)%nCells)
108 : end if
109 :
110 : ! State variables and fluxes
111 : ! have to be allocated and initialised in any case
112 40 : call variables_alloc(level1(iDomain)%nCells)
113 :
114 : end do
115 :
116 : ! if no restart, this is done already in MPR
117 14 : if (read_restart) then
118 : call set_domain_indices(level0, indices=domainMeta%L0DataFrom)
119 : call set_domain_indices(level1)
120 : end if
121 :
122 14 : end subroutine mhm_initialize
123 :
124 :
125 : !> \brief Initialize mHM constants
126 : !> \details transformation of time units & initialize constants
127 : !> \changelog
128 : !! - Rohini Kumar Jan 2013
129 : !! - Juliane Mai & Matthias Cuntz Nov 2013
130 : !! - check timeStep
131 : !! - Robert Schweppe Jun 2018
132 : !! - refactoring and reformatting
133 : !> \authors Luis Samaniego
134 : !> \date Dec 2012
135 14 : subroutine constants_init
136 14 : use mo_common_mHM_mRM_variables, only : timestep, c2TSTu, read_restart
137 : use mo_common_variables, only : processMatrix
138 : use mo_file, only : file_namelist_mhm_param
139 : use mo_global_variables, only : neutron_integral_AFast
140 : use mo_mpr_file, only : file_hydrogeoclass
141 : use mo_mpr_global_variables, only : GeoUnitList
142 : use mo_neutrons, only : TabularIntegralAFast
143 : use mo_string_utils, only : num2str
144 :
145 : implicit none
146 :
147 : !Fill Tabular for neutron flux integral
148 14 : if (processMatrix(10, 1) .eq. 2) then
149 0 : allocate(neutron_integral_AFast(10000 + 2))
150 0 : call TabularIntegralAFast(neutron_integral_AFast, 20.0_dp)
151 : else
152 14 : allocate(neutron_integral_AFast(1))
153 28 : neutron_integral_AFast(:) = 0.0_dp
154 : endif
155 :
156 : ! if reading restart, we don't need GeoUnitList
157 14 : if (.not. read_restart) then
158 : ! check if enough geoparameter are defined in mhm_parameter.nml
159 : ! this was formerly done after reading of data, but mHM and MPR are now seperate processes
160 13 : if ((processMatrix(9, 2)) .NE. size(GeoUnitList, 1)) then
161 : call error_message('***ERROR: Mismatch: Number of geological units in ', trim(adjustl(file_hydrogeoclass)), &
162 0 : ' is ', trim(adjustl(num2str(size(GeoUnitList, 1)))), raise=.false.)
163 : call error_message(' while it is ', trim(num2str(processMatrix(9, 2))), &
164 0 : ' in ', trim(file_namelist_mhm_param), '!')
165 : end if
166 : end if
167 :
168 14 : c2TSTu = real(timeStep, dp) / 24.0_dp ! from per timeStep to per day
169 :
170 14 : end subroutine constants_init
171 :
172 : END MODULE mo_startup
|