Appends one row of global energy diagnostics.
The temperature and enthalpy means are volume weighted over owned cells. qrad integral is the domain integral of qrad dV [W].
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mesh_t), | intent(in) | :: | mesh | |||
| type(flow_mpi_t), | intent(in) | :: | flow | |||
| type(case_params_t), | intent(in) | :: | params | |||
| type(energy_fields_t), | intent(in) | :: | energy | |||
| integer, | intent(in) | :: | step | |||
| real(kind=rk), | intent(in) | :: | time | |||
| logical, | intent(in), | optional | :: | write_file |
subroutine write_energy_diagnostics_row(mesh, flow, params, energy, step, time, write_file) type(mesh_t), intent(in) :: mesh type(flow_mpi_t), intent(in) :: flow type(case_params_t), intent(in) :: params type(energy_fields_t), intent(in) :: energy integer, intent(in) :: step real(rk), intent(in) :: time logical, intent(in), optional :: write_file integer :: c, unit_id, ierr character(len=256 + 32) :: filename real(rk) :: vol, old_T real(rk) :: local_min_T, local_max_T, local_sum_T real(rk) :: local_min_h, local_max_h, local_sum_h real(rk) :: local_min_qrad, local_max_qrad, local_integral_qrad real(rk) :: local_volume real(rk) :: local_max_delta_T, local_delta_h2, local_h_old2 real(rk) :: global_min_T, global_max_T, global_sum_T real(rk) :: global_min_h, global_max_h, global_sum_h real(rk) :: global_min_qrad, global_max_qrad, global_integral_qrad real(rk) :: global_volume real(rk) :: global_max_delta_T, global_delta_h2, global_h_old2 real(rk) :: mean_T, mean_h, rel_h_residual logical :: do_write_file if (.not. params%enable_energy) return ! File diagnostics only. Terminal health output is handled in main.f90. do_write_file = params%write_diagnostics if (present(write_file)) do_write_file = write_file .and. params%write_diagnostics if (.not. allocated(energy%T) .or. .not. allocated(energy%h) .or. & .not. allocated(energy%h_old) .or. .not. allocated(energy%qrad)) then call fatal_error('energy', 'energy diagnostics requested but energy arrays are not allocated') end if local_min_T = huge(0.0_rk) local_max_T = -huge(0.0_rk) local_sum_T = zero local_min_h = huge(0.0_rk) local_max_h = -huge(0.0_rk) local_sum_h = zero local_min_qrad = huge(0.0_rk) local_max_qrad = -huge(0.0_rk) local_integral_qrad = zero local_volume = zero local_max_delta_T = zero local_delta_h2 = zero local_h_old2 = zero do c = 1, mesh%ncells if (.not. flow%owned(c)) cycle vol = mesh%cells(c)%volume local_volume = local_volume + vol local_min_T = min(local_min_T, energy%T(c)) local_max_T = max(local_max_T, energy%T(c)) local_sum_T = local_sum_T + energy%T(c) * vol local_min_h = min(local_min_h, energy%h(c)) local_max_h = max(local_max_h, energy%h(c)) local_sum_h = local_sum_h + energy%h(c) * vol local_min_qrad = min(local_min_qrad, energy%qrad(c)) local_max_qrad = max(local_max_qrad, energy%qrad(c)) local_integral_qrad = local_integral_qrad + energy%qrad(c) * vol if (allocated(energy%T_old)) then old_T = energy%T_old(c) else old_T = params%energy_reference_T + & (energy%h_old(c) - params%energy_reference_h) / params%energy_cp end if local_max_delta_T = max(local_max_delta_T, abs(energy%T(c) - old_T)) local_delta_h2 = local_delta_h2 + (energy%h(c) - energy%h_old(c))**2 * vol local_h_old2 = local_h_old2 + energy%h_old(c)**2 * vol end do call MPI_Allreduce(local_min_T, global_min_T, 1, MPI_DOUBLE_PRECISION, MPI_MIN, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing min_T') call MPI_Allreduce(local_max_T, global_max_T, 1, MPI_DOUBLE_PRECISION, MPI_MAX, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing max_T') call MPI_Allreduce(local_sum_T, global_sum_T, 1, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing sum_T') call MPI_Allreduce(local_min_h, global_min_h, 1, MPI_DOUBLE_PRECISION, MPI_MIN, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing min_h') call MPI_Allreduce(local_max_h, global_max_h, 1, MPI_DOUBLE_PRECISION, MPI_MAX, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing max_h') call MPI_Allreduce(local_sum_h, global_sum_h, 1, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing sum_h') call MPI_Allreduce(local_min_qrad, global_min_qrad, 1, MPI_DOUBLE_PRECISION, MPI_MIN, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing min_qrad') call MPI_Allreduce(local_max_qrad, global_max_qrad, 1, MPI_DOUBLE_PRECISION, MPI_MAX, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing max_qrad') call MPI_Allreduce(local_integral_qrad, global_integral_qrad, 1, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing integral_qrad') call MPI_Allreduce(local_volume, global_volume, 1, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing energy volume') call MPI_Allreduce(local_max_delta_T, global_max_delta_T, 1, MPI_DOUBLE_PRECISION, MPI_MAX, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing max_delta_T') call MPI_Allreduce(local_delta_h2, global_delta_h2, 1, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing delta_h2') call MPI_Allreduce(local_h_old2, global_h_old2, 1, MPI_DOUBLE_PRECISION, MPI_SUM, flow%comm, ierr) if (ierr /= MPI_SUCCESS) call fatal_error('energy', 'MPI failure reducing h_old2') if (global_volume > tiny_safe) then mean_T = global_sum_T / global_volume mean_h = global_sum_h / global_volume else mean_T = zero mean_h = zero end if rel_h_residual = sqrt(global_delta_h2) / max(sqrt(global_h_old2), tiny_safe) if (flow%rank /= 0) return if (do_write_file) then filename = trim(params%output_dir)//'/diagnostics/energy_diagnostics.csv' open(newunit=unit_id, file=trim(filename), status='old', position='append', action='write') write(unit_id,'(i0,12(",",es16.8))') step, time, global_min_T, global_max_T, mean_T, & global_min_h, global_max_h, mean_h, global_min_qrad, global_max_qrad, & global_integral_qrad, global_max_delta_T, rel_h_residual close(unit_id) end if end subroutine write_energy_diagnostics_row