15 use mpi,
only : mpi_max, mpi_min
41 type(model_state_type),
intent(inout),
target :: current_state
43 current_state%cfl_frequency=options_get_integer(current_state%options_database,
"cfl_frequency")
44 tollerance=options_get_real(current_state%options_database,
"cfl_tollerance")
45 cvismax=options_get_real(current_state%options_database,
"cfl_cvismax")
46 cvelmax=options_get_real(current_state%options_database,
"cfl_cvelmax")
47 dtmmax=options_get_real(current_state%options_database,
"cfl_dtmmax")
48 dtmmin=options_get_real(current_state%options_database,
"cfl_dtmmin")
49 rincmax=options_get_real(current_state%options_database,
"cfl_rincmax")
51 l_monitor_cfl = options_get_logical(current_state%options_database,
"cfl_monitor")
53 allocate(current_state%abswmax(current_state%local_grid%local_domain_end_index(z_index)))
60 type(model_state_type),
intent(inout),
target :: current_state
62 real(kind=default_precision) :: cfl_number
64 if (mod(current_state%timestep, current_state%cfl_frequency) == 1 .or. &
65 current_state%timestep-current_state%start_timestep .le. current_state%cfl_frequency)
then
66 current_state%cvel=0.0_default_precision
67 current_state%cvel_x=0.0_default_precision
68 current_state%cvel_y=0.0_default_precision
69 current_state%cvel_z=0.0_default_precision
73 current_state%cvel=(current_state%cvel_x*current_state%global_grid%configuration%horizontal%cx+current_state%cvel_y*&
74 current_state%global_grid%configuration%horizontal%cy+current_state%cvel_z)*current_state%dtm
75 current_state%cvis=current_state%cvis*(current_state%dtm * 4)
79 current_state%absolute_new_dtm=current_state%dtm
80 current_state%update_dtm=.false.
81 if (cfl_number .gt. 0.0_default_precision)
then
82 if (cfl_number .lt. (1.0_default_precision-
tollerance) .or. cfl_number .gt. (1.0_default_precision+
tollerance))
then
83 current_state%absolute_new_dtm=current_state%dtm/cfl_number
88 current_state%cvis=0.0_default_precision
96 type(model_state_type),
intent(inout),
target :: current_state
97 real(kind=default_precision),
intent(in) :: cfl_number
99 if (current_state%dtm .ne. current_state%absolute_new_dtm .and. &
100 (current_state%dtm .ne.
dtmmax .or. current_state%absolute_new_dtm .lt.
dtmmax))
then
102 current_state%update_dtm=.true.
104 current_state%dtm_new=min(current_state%dtm*(1.0_default_precision+
rincmax), current_state%absolute_new_dtm,
dtmmax)
107 if (current_state%parallel%my_rank==0)
then
108 if (log_get_logging_level() .eq. log_debug)
then
109 call log_log(log_debug,
"dtm changed from "//trim(conv_to_string(current_state%dtm, 5))//
" to "//&
110 trim(conv_to_string(current_state%dtm_new, 5)))
112 if (current_state%dtm_new .lt.
dtmmin)
then
113 call log_log(log_error,
"Timestep too small, dtmnew="//trim(conv_to_string(current_state%dtm_new, 5))//&
114 " dtmmin="//trim(conv_to_string(
dtmmin, 5)))
117 call log_log(log_info,
" --- CFL Monitoring Information --- ")
118 call log_log(log_info,
"dtm changed from "//trim(conv_to_string(current_state%dtm, 5))//
" to "//&
119 trim(conv_to_string(current_state%dtm_new, 5)))
120 if (cfl_number .gt. 0.0)
then
121 call log_log(log_info,
"cfl_number : "//trim(conv_to_string(cfl_number))//
" (change divisor)")
122 call log_log(log_info,
"cvis : "//trim(conv_to_string(current_state%cvis)) )
123 call log_log(log_info,
"cvel : "//trim(conv_to_string(current_state%cvel)) )
125 call log_log(log_info,
"dtm change due to ratcheting only. Target dtm unchanged.")
127 call log_log(log_info,
"target dtm : "//trim(conv_to_string(current_state%absolute_new_dtm)) )
139 type(model_state_type),
intent(inout),
target :: current_state
142 real(kind=default_precision) :: global_zumin, global_zumax, global_zvmin, &
143 global_zvmax, global_cvel_z, global_cvis
146 current_state%local_zumin=current_state%local_zumin+current_state%ugal
147 current_state%local_zumax=current_state%local_zumax+current_state%ugal
149 current_state%local_zumin=0.0_default_precision
150 current_state%local_zumax=0.0_default_precision
153 current_state%local_zvmin=current_state%local_zvmin+current_state%vgal
154 current_state%local_zvmax=current_state%local_zvmax+current_state%vgal
156 current_state%local_zvmin=0.0_default_precision
157 current_state%local_zvmax=0.0_default_precision
160 current_state%local_cvel_z=current_state%cvel_z
161 do k=2,current_state%local_grid%local_domain_end_index(z_index)-1
163 current_state%local_cvel_z=max(current_state%local_cvel_z, &
164 current_state%abswmax(k)*current_state%global_grid%configuration%vertical%rdzn(k+1))
167 current_state%local_cvel_z=0.0_default_precision
169 call get_global_values(current_state%local_zumin, current_state%local_zumax, current_state%local_zvmin, &
170 current_state%local_zvmax, current_state%local_cvel_z, current_state%cvis, &
171 global_zumin, global_zumax, global_zvmin, global_zvmax, global_cvel_z, global_cvis, current_state%parallel)
173 if (current_state%galilean_transformation)
then
174 if (.not.current_state%fix_ugal)current_state%ugal=0.5_default_precision*(global_zumin+global_zumax)
175 if (.not.current_state%fix_vgal)current_state%vgal=0.5_default_precision*(global_zvmin+global_zvmax)
177 current_state%ugal=0.0_default_precision
178 current_state%vgal=0.0_default_precision
180 current_state%cvel_z=global_cvel_z
181 current_state%cvel_x=max(abs(global_zumax-current_state%ugal), abs(global_zumin-current_state%ugal))
182 current_state%cvel_y=max(abs(global_zvmax-current_state%vgal), abs(global_zvmin-current_state%vgal))
183 current_state%cvis=global_cvis
200 subroutine get_global_values(local_zumin, local_zumax, local_zvmin, local_zvmax, local_cvel_z, local_cvis, &
201 global_zumin, global_zumax, global_zvmin, global_zvmax, global_cvel_z, global_cvis, parallel_state)
202 type(parallel_state_type),
intent(inout) :: parallel_state
203 real(kind=default_precision),
intent(in) :: local_zumin, local_zumax, local_zvmin, local_zvmax, local_cvel_z, local_cvis
204 real(kind=default_precision),
intent(out) :: global_zumin, global_zumax, global_zvmin, global_zvmax, global_cvel_z, global_cvis
208 call mpi_allreduce(local_zumax, global_zumax, 1, precision_type, mpi_max, parallel_state%monc_communicator, ierr)
209 call mpi_allreduce(local_zvmax, global_zvmax, 1, precision_type, mpi_max, parallel_state%monc_communicator, ierr)
210 call mpi_allreduce(local_cvel_z, global_cvel_z, 1, precision_type, mpi_max, parallel_state%monc_communicator, ierr)
211 call mpi_allreduce(local_cvis, global_cvis, 1, precision_type, mpi_max, parallel_state%monc_communicator, ierr)
212 call mpi_allreduce(local_zumin, global_zumin, 1, precision_type, mpi_min, parallel_state%monc_communicator, ierr)
213 call mpi_allreduce(local_zvmin, global_zvmin, 1, precision_type, mpi_min, parallel_state%monc_communicator, ierr)