49 subroutine optimization(eval, objective, dirConfigOut, funcBest, maskpara)
51 use mo_anneal,
only : anneal
58 use mo_dds,
only : dds
59 use mo_mcmc,
only : mcmc, mcmc_stddev
60 use mo_message,
only : message, error_message
61 use mo_sce,
only : sce
62 use mo_string_utils,
only : num2str
63 use mo_timer,
only : timer_get, timer_start, &
65 use mo_xor4096,
only : get_timeseed
81 real(dp),
intent(out) :: funcbest
85 logical,
intent(out),
allocatable,
dimension(:) :: maskpara
93 real(dp),
allocatable,
dimension(:, :) :: burnin_paras
96 real(dp),
allocatable,
dimension(:, :) :: mcmc_paras
104 real(dp),
allocatable,
dimension(:, :) :: local_parameters
107 logical,
allocatable,
dimension(:) :: local_maskpara
113 character(256) :: tfile
116 character(256) :: pfile
122 call message(
' Start optimization')
130 allocate(maskpara(npara))
134 maskpara(ii) = .false.
138 optimize_target%eval_pointer => eval
139 optimize_target%obj_pointer => objective
144 allocate(local_maskpara(npara + 2))
148 local_maskpara(1 : npara) = maskpara(:)
149 local_parameters(npara + 1, 1) = 0.001_dp
150 local_parameters(npara + 1, 2) = 100._dp
151 local_parameters(npara + 1, 3) = 1._dp
152 local_parameters(npara + 1, 4) = 1._dp
153 local_parameters(npara + 1, 5) = 0._dp
154 local_parameters(npara + 2, 1) = 0.001_dp
155 local_parameters(npara + 2, 2) = 10._dp
156 local_parameters(npara + 2, 3) = 0.1_dp
157 local_parameters(npara + 2, 4) = 1._dp
158 local_parameters(npara + 2, 5) = 0._dp
159 local_maskpara(npara + 1 :) = .true.
163 local_maskpara(npara + 1 :) = .false.
167 allocate(local_maskpara(npara))
169 local_maskpara = maskpara
173 if (
seed .gt. 0_i8)
then
176 call get_timeseed(iseed)
181 call message(
' Use MCMC')
183 tfile = trim(adjustl(
dirconfigout)) //
'mcmc_tmp_parasets.nc'
190 call message(
' Use MCMC')
191 call mcmc(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), mcmc_paras, burnin_paras, &
192 paraselectmode_in = 2_i4, tmp_file = tfile, &
193 maskpara_in = local_maskpara, &
196 seed_in = iseed, loglike_in = .true., printflag_in = .true.)
199 call error_message(
'ERROR: A restart of this optimization method is not implemented yet!')
201 call message(
' Use MCMC_STDDEV')
202 call mcmc_stddev(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), mcmc_paras, burnin_paras, &
203 paraselectmode_in = 2_i4, tmp_file = tfile, &
204 maskpara_in = local_maskpara, &
205 seed_in = iseed, loglike_in = .true., printflag_in = .true.)
207 call error_message(
"Error objective: This opti_function is either not implemented yet.")
211 call message(
' Use DDS')
213 tfile = trim(adjustl(
dirconfigout)) //
'dds_results.out'
216 call error_message(
'ERROR: A restart of this optimization method is not implemented yet!')
220 local_parameters(:, 3) = dds(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), &
222 tmp_file = tfile, comm =
domainmeta%comMaster, mask = local_maskpara, &
225 local_parameters(:, 3) = dds(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), &
227 tmp_file = tfile, mask = local_maskpara, &
232 call message(
' Use Simulated Annealing')
234 tfile = trim(adjustl(
dirconfigout)) //
'anneal_results.out'
237 call error_message(
'ERROR: A restart of this optimization method is not implemented yet!')
242 local_parameters(:, 3) = anneal(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), &
243 temp =
sa_temp, seeds = (/iseed, iseed + 1000_i8, iseed + 2000_i8/), nitermax =
niterations, &
244 tmp_file = tfile, maskpara = local_maskpara, &
248 local_parameters(:, 3) = anneal(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), &
249 seeds = (/iseed, iseed + 1000_i8, iseed + 2000_i8/), nitermax =
niterations, &
250 tmp_file = tfile, maskpara = local_maskpara, &
254 call message(
' Use SCE')
256 tfile = trim(adjustl(
dirconfigout)) //
'sce_results.out'
257 pfile = trim(adjustl(
dirconfigout)) //
'sce_population.out'
260 local_parameters(:, 3) = sce(optimize_target, local_parameters(:, 3), local_parameters(:, 1 : 2), &
262 parallel = .false., mymask = local_maskpara, &
267 tmp_file = tfile, popul_file = pfile, &
270 call error_message(
'mRM',
'This optimization method is not implemented.')
273 call message(
' in ', trim(num2str(timer_get(
itimer),
'(F9.3)')),
' seconds.')
276 maskpara(:) = local_maskpara(1 : npara)
278 deallocate(local_parameters)
279 deallocate(local_maskpara)