compute_flow_diagnostics Subroutine

public subroutine compute_flow_diagnostics(mesh, flow, bc, params, fields, stats)

Aggregates global raw-divergence, kinetic-energy, and boundary-flux data.

stats%max_divergence and stats%rms_divergence are raw diagnostics. They are primary projection metrics for constant-density runs, but variable-density validation should use div(u)-S_projection diagnostics because the target is .

Arguments

Type IntentOptional Attributes Name
type(mesh_t), intent(in) :: mesh
type(flow_mpi_t), intent(in) :: flow
type(bc_set_t), intent(in) :: bc
type(case_params_t), intent(in) :: params
type(flow_fields_t), intent(in) :: fields
type(solver_stats_t), intent(inout) :: stats

Source Code

   subroutine compute_flow_diagnostics(mesh, flow, bc, params, fields, stats)
      type(mesh_t), intent(in) :: mesh
      type(flow_mpi_t), intent(in) :: flow
      type(bc_set_t), intent(in) :: bc
      type(case_params_t), intent(in) :: params
      type(flow_fields_t), intent(in) :: fields
      type(solver_stats_t), intent(inout) :: stats

      real(rk) :: local_ke, global_ke
      real(rk) :: local_rms, global_rms
      real(rk) :: local_flux, global_flux
      real(rk) :: local_sum_vec(3), global_sum_vec(3)
      integer :: c, ierr

      stats%max_divergence = flow_global_max_owned(flow, fields%div)

      local_rms = zero
      local_ke = zero

      do c = flow%first_cell, flow%last_cell
         local_rms = local_rms + fields%div(c) * fields%div(c)

         local_ke = local_ke + half * params%rho * mesh%cells(c)%volume * &
                    dot_product(fields%u(:, c), fields%u(:, c))
      end do

      call compute_boundary_flux(mesh, flow, bc, fields%face_flux, local_flux)

      local_sum_vec = [local_rms, local_ke, local_flux]
      call MPI_Allreduce(local_sum_vec, global_sum_vec, 3, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr)
      call check_mpi(ierr, 'diagnostic flow sums')

      global_rms = global_sum_vec(1)
      global_ke = global_sum_vec(2)
      global_flux = global_sum_vec(3)

      stats%rms_divergence = sqrt(global_rms / max(real(mesh%ncells, rk), one))
      stats%kinetic_energy = global_ke
      stats%net_boundary_flux = global_flux
   end subroutine compute_flow_diagnostics