5.13.2-dev0
mHM
The mesoscale Hydrological Model
Loading...
Searching...
No Matches
mo_optimization_types.f90
Go to the documentation of this file.
1!> \file mo_optimization_types.f90
2!> \copydoc mo_optimization_types
3
4!> \brief Type definitions for optimization routines
5!> \author Maren Kaluza
6!> \date Nov 2019
7!> \copyright Copyright 2005-\today, the mHM Developers, Luis Samaniego, Sabine Attinger: All rights reserved.
8!! mHM is released under the LGPLv3+ license \license_note
9!> \ingroup f_common
11 use mo_kind, only : i4, dp
12
13 ! Written Maren Kaluza, November 2019
14
15 IMPLICIT NONE
16
17 public :: optidata, optidata_sim
18
19 private
20
21 !> \brief optional data, such as sm, neutrons, et, tws
22 !> \details data type for observed data, providing metadata
23 !! for simulated data
24 !! dim1 = number grid cells L1
25 !! dim2 = number of meteorological time steps
27 real(dp), dimension(:, :), allocatable :: dataobs !< observed data
28 logical, dimension(:, :), allocatable :: maskobs !< mask of observed data
29 character(256) :: dir !< directory where to read opti data
30 integer(i4) :: timestepinput !< time step of optional data
31 character(256) :: varname !< variable name
32 end type optidata
33
34 !> \brief type for simulated optional data
36 real(dp), dimension(:, :), allocatable :: datasim !< simulation data
37 integer(i4) :: averagetimestep !< the current timestep
38 !< the simulated opti data is written to
39 integer(i4) :: averagecounter !< set to 0 on average, incremented on add
40
41 contains
42 procedure :: init => optidata_sim_init
43 procedure :: destroy => optidata_sim_destroy
44 procedure :: increment_counter => optidata_sim_increment_counter
45 procedure :: add => optidata_sim_add
46 procedure :: average => optidata_sim_average
47 procedure :: average_per_timestep => optidata_sim_average_per_timestep
48 procedure :: average_add => optidata_sim_average_add
49 end type optidata_sim
50
51 contains
52
53 subroutine optidata_sim_init(this, optidataObs)
54 class(optidata_sim), intent(inout) :: this
55 type(optidata), intent(in) :: optidataObs
56
57 allocate(this%dataSim(size(optidataobs%dataObs, dim = 1), size(optidataobs%dataObs, dim = 2)))
58 this%dataSim(:, :) = 0.0_dp ! has to be intialized with zero because later summation
59 this%averageTimestep = 1
60 this%averageCounter = 0
61 end subroutine optidata_sim_init
62
63 subroutine optidata_sim_destroy(this)
64 class(optidata_sim), intent(inout) :: this
65
66 deallocate(this%dataSim)
67 end subroutine optidata_sim_destroy
68
69 subroutine optidata_sim_increment_counter(this, timeStepInput, is_new_day, is_new_month, is_new_year)
70 class(optidata_sim), intent(inout) :: this
71 integer(i4), intent(in) :: timeStepInput
72 logical, intent(in) :: is_new_day
73 logical, intent(in) :: is_new_month
74 logical, intent(in) :: is_new_year
75
76 select case(timestepinput)
77 case(-1) ! daily
78 if (is_new_day) then
79 this%averageTimestep = this%averageTimestep + 1
80 end if
81 case(-2) ! monthly
82 if (is_new_month) then
83 this%averageTimestep = this%averageTimestep + 1
84 end if
85 case(-3) ! yearly
86 if (is_new_year) then
87 this%averageTimestep = this%averageTimestep + 1
88 end if
89 end select
90
92
93 subroutine optidata_sim_add(this, data_sim)
94 class(optidata_sim), intent(inout) :: this
95 real(dp), dimension(:), intent(in) :: data_sim
96
97 this%dataSim(:, this%averageTimestep) = &
98 this%dataSim(:, this%averageTimestep) + data_sim(:)
99 end subroutine optidata_sim_add
100
101 subroutine optidata_sim_average(this)
102 class(optidata_sim), intent(inout) :: this
103
104 this%dataSim(:, this%averageTimestep) = &
105 this%dataSim(:, this%averageTimestep) / real(this%averageCounter, dp)
106 this%averageTimestep = this%averageTimestep + 1
107 this%averageCounter = 0
108 end subroutine optidata_sim_average
109
110 subroutine optidata_sim_average_per_timestep(this, timeStepInput, is_new_day, is_new_month, is_new_year)
111 class(optidata_sim), intent(inout) :: this
112 integer(i4), intent(in) :: timeStepInput
113 logical, intent(in) :: is_new_day
114 logical, intent(in) :: is_new_month
115 logical, intent(in) :: is_new_year
116
117 select case(timestepinput)
118 case(-1) ! daily
119 if (is_new_day) then
120 call this%average()
121 end if
122 case(-2) ! monthly
123 if (is_new_month) then
124 call this%average()
125 end if
126 case(-3) ! yearly
127 if (is_new_year) then
128 call this%average()
129 end if
130 end select
132
133 subroutine optidata_sim_average_add(this, data_sim)
134 class(optidata_sim), intent(inout) :: this
135 real(dp), dimension(:), intent(in) :: data_sim
136
137 call this%add(data_sim(:))
138 this%averageCounter = this%averageCounter + 1
139 end subroutine optidata_sim_average_add
140
141END MODULE mo_optimization_types
Type definitions for optimization routines.
subroutine optidata_sim_average_add(this, data_sim)
subroutine optidata_sim_add(this, data_sim)
subroutine optidata_sim_increment_counter(this, timestepinput, is_new_day, is_new_month, is_new_year)
subroutine optidata_sim_average(this)
subroutine optidata_sim_init(this, optidataobs)
subroutine optidata_sim_average_per_timestep(this, timestepinput, is_new_day, is_new_month, is_new_year)
subroutine optidata_sim_destroy(this)
type for simulated optional data
optional data, such as sm, neutrons, et, tws