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)