Skip to content
Snippets Groups Projects
Commit 8603d1ec authored by Evgeny Mortikov's avatar Evgeny Mortikov
Browse files

scm output update

parent 89d4bccc
No related branches found
No related tags found
No related merge requests found
......@@ -19,6 +19,7 @@ set(SOURCES
obl_grid.f90
obl_tslice.f90
obl_state.f90
obl_output.f90
obl_time_and_space.f90
obl_common_phys_parameters.f90
obl_math.f90
......
......@@ -6,4 +6,4 @@
!#define OBL_USE_GRID_DATATYPE
!#define OBL_USE_TSLICE_OUTPUT
#define OBL_USE_TSLICE_OUTPUT
......@@ -14,6 +14,7 @@ program obl_main
use obl_tslice
#endif
use obl_state
use obl_output
use obl_time_and_space
use obl_initial_conditions
use obl_forcing_and_boundary
......@@ -46,11 +47,6 @@ program obl_main
! turbulence closure parameters
type(pacanowskiParamType) :: param_pacanowski
#ifdef OBL_USE_TSLICE_OUTPUT
! time slice
type (oblTimeSlice) :: output_Theta, output_Salin
#endif
real :: t !< time, [s]
integer :: nt !< number of time steps
integer :: nf !< number of time steps for forcing
......@@ -78,6 +74,8 @@ program obl_main
!1 - pacanowski-philander, 2 - pacanowski-philander+,
!3 - k-epsilon explicit, 4 - k-epsilon semiimplicit, 5 - inmom
integer, parameter :: output_mode = 1 ! 1 -- netcdf, 2 -- ascii, 3 -- tecplot
real :: Rho_dyn_surf, Rho_dyn_bot !< density dynamic, [kg / m**3]
real :: mld !< mixed layer depth, [m]
......@@ -116,18 +114,7 @@ program obl_main
real, allocatable :: time_hrs(:)
real, allocatable :: time_hrs_tslice(:)
real, allocatable :: Theta_write(:,:)
real, allocatable :: Salin_write(:,:)
real, allocatable :: U_write(:,:)
real, allocatable :: V_write(:,:)
real, allocatable :: Rho_write(:,:)
real, allocatable :: N2_write(:,:)
real, allocatable :: S2_write(:,:)
real, allocatable :: Ri_grad_write(:,:)
real, allocatable :: Kh_write(:,:)
real, allocatable :: Km_write(:,:)
real, allocatable :: mld_write(:)
real, allocatable :: Theta_C_write(:,:)
real, allocatable :: lab_mld_write(:)
closure_mode = 4 !< 1 - pacanowski-philander, 2 - pacanowski-philander+, 3 - k-epsilon explicit, 4 - k-epsilon semiimplicit, 5 - inmom
......@@ -255,18 +242,8 @@ program obl_main
allocate(time_hrs(1:nt))
allocate(time_hrs_tslice(1:nt))
allocate(Theta_write(nz, nt))
allocate(Salin_write(nz, nt))
allocate(U_write(nz, nt))
allocate(V_write(nz, nt))
allocate(Rho_write(nz, nt))
allocate(N2_write(nz, nt))
allocate(S2_write(nz, nt))
allocate(Ri_grad_write(nz, nt))
allocate(Kh_write(nz, nt))
allocate(Km_write(nz, nt))
allocate(mld_write(nt))
allocate(Theta_C_write(nz, nt))
allocate(lab_mld_write(nt))
! initialization of main fields
......@@ -390,32 +367,16 @@ program obl_main
call get_lab_mld(lab_mld, u_dynH, N2_0, time_current, z)
endif
!do k = 1, nz
! Theta (k) = Theta(k) + Theta_0
!end do
Theta_write(:, i) = Theta_dev
Salin_write(:, i) = Salin_dev
U_write(:, i) = U
V_write(:, i) = V
Rho_write(:, i) = Rho !Rho_dev
N2_write(:, i) = N2
S2_write(:, i) = S2
Ri_grad_write(:, i) = Ri_grad
Kh_write(:, i) = Kh
Km_write(:, i) = Km
mld_write(i) = mld
!lab_mld_write(i) = lab_mld
!write(199,*) time_current, mld, lab_mld
!write(20,*) time_current, Theta_dev(nz) + Theta_ref
!> advancing time
!> advance time
i = i + 1
time_current = time_current + dt
time_hrs(i) = time_current / 3600.0
!> advance screen output
if (mod(i, nscreen) == 0) then
write(*, '(a,g0)') ' mld = ', mld
write(*, '(a,g0)') ' Theta(surface) = ', Theta_dev(grid%cz) + Theta_ref
......@@ -424,77 +385,58 @@ program obl_main
write(*, '(a)') '-------------------------------------------------'
endif
! time slice output
#ifdef OBL_USE_TSLICE_OUTPUT
!> advance file output
if (mod(i, noutput) == 0) then
call push_profile_to_tslice(output_Theta, Theta_dev, nz)
call push_profile_to_tslice(output_Salin, Salin_dev, nz)
call push_state_vec(nz)
time_hrs_tslice(output_Theta%num) = time_current / 3600.0
endif
#endif
enddo
Theta_C_write = Theta_write - 273.15
Theta_write = Theta_write + Theta_ref
Salin_write = Salin_write + Salin_ref
!Rho_write = Rho_write + Rho_ref
output_Theta%data(:,1:output_Theta%num) = output_Theta%data(:,1:output_Theta%num) + Theta_ref
output_Salin%data(:,1:output_Salin%num) = output_Salin%data(:,1:output_Salin%num) + Salin_ref
output_TinC%data(:,1:output_TinC%num) = output_TinC%data(:,1:output_TinC%num) + Theta_ref - 273.15
if (output_mode.eq.1) then
write(*, *) ' >> writing netcdf output ...'
#ifndef OBL_USE_TSLICE_OUTPUT
! Writing 2D arrays (variables with depth and time)
call write_2d_real_nc(Theta_write, 'output.nc', meta_theta)
call write_2d_real_nc(Salin_write, 'output.nc', meta_salin)
call write_2d_real_nc(U_write, 'output.nc', meta_u)
call write_2d_real_nc(V_write, 'output.nc', meta_v)
call write_2d_real_nc(Rho_write, 'output.nc', meta_rho)
call write_2d_real_nc(N2_write, 'output.nc', meta_n2)
call write_2d_real_nc(S2_write, 'output.nc', meta_s2)
call write_2d_real_nc(Ri_grad_write, 'output.nc', meta_ri_grad)
call write_2d_real_nc(Kh_write, 'output.nc', meta_kh)
call write_2d_real_nc(Km_write, 'output.nc', meta_km)
call write_2d_real_nc(Theta_C_write, 'output.nc', meta_theta_C)
#endif
call write_netcdf
! Writing 1D arrays (scalar variables over time)
call write_1d_real_nc(mld_write, 'output.nc', meta_mld)
call write_1d_real_nc(lab_mld_write, 'output.nc', meta_lab_mld)
!call write_1d_real_nc(Tau_x_surf, 'output.nc', meta_tau_u)
!call write_1d_real_nc(Tau_y_surf, 'output.nc', meta_tau_v)
call write_1d_real_nc(lab_mld_write, 'output.nc', meta_lab_mld)
endif
if (output_mode.eq.2) then
write(*, *) ' >> writing ascii output ...'
#ifndef OBL_USE_TSLICE_OUTPUT
! Writing 2D arrays (variables with depth and time) to ASCII files
call write_2d_real_ascii(Theta_write, 'output_Theta.txt', meta_theta)
call write_2d_real_ascii(Salin_write, 'output_Salin.txt', meta_salin)
call write_2d_real_ascii(U_write, 'output_U.txt', meta_u)
call write_2d_real_ascii(V_write, 'output_V.txt', meta_v)
call write_2d_real_ascii(Rho_write, 'output_Rho.txt', meta_rho)
call write_2d_real_ascii(N2_write, 'output_N2.txt', meta_n2)
call write_2d_real_ascii(S2_write, 'output_S2.txt', meta_s2)
call write_2d_real_ascii(Ri_grad_write, 'output_Ri_grad.txt', meta_ri_grad)
call write_2d_real_ascii(Kh_write, 'output_Kh.txt', meta_kh)
call write_2d_real_ascii(Km_write, 'output_Km.txt', meta_km)
#endif
call write_ascii
! Writing 1D arrays (scalar variables over time) to ASCII files
!call write_1d_real_ascii(mld_write, 'output_mld.txt', meta_mld)
!call write_1d_real_ascii(lab_mld_write, 'output_lab_mld.txt', meta_lab_mld)
call write_1d_real_ascii(mld_write, 'output_mld.txt', meta_mld)
call write_1d_real_ascii(lab_mld_write, 'output_lab_mld.txt', meta_lab_mld)
!call write_1d_real_ascii(Tau_x_surf, 'output_tau_u.txt', meta_tau_u)
!call write_1d_real_ascii(Tau_y_surf, 'output_tau_v.txt', meta_tau_v)
endif
if (output_mode.eq.3) then
write(*, *) ' >> writing tecplot output ...'
! time slice output
call write_tecplot(grid%z, time_hrs_tslice)
! Writing 1D arrays (scalar variables over time) to Tecplot files
call write_1d_real_plt(mld_write, time_hrs, 'output_mld.plt', meta_mld)
call write_1d_real_plt(lab_mld_write, time_hrs, 'output_lab_mld.plt', meta_lab_mld)
!call write_1d_real_ascii(Tau_x_surf, 'output_tau_u.txt', meta_tau_u)
!call write_1d_real_ascii(Tau_y_surf, 'output_tau_v.txt', meta_tau_v)
#ifdef OBL_USE_TSLICE_OUTPUT
! time slice output
call write_2d_real_ascii(output_Theta%data(:,1:output_Theta%num), 'Theta_tslice.txt', meta_theta)
call write_2d_real_ascii(output_Salin%data(:,1:output_Salin%num), 'Salin_tslice.txt', meta_salin)
call write_2d_real_plt(output_Theta%data(:,1:output_Theta%num), grid%z, time_hrs_tslice(1:output_Theta%num), 'Theta_tslice.plt', meta_theta)
#endif
endif
!close(199)
!close(20)
......@@ -537,20 +479,13 @@ program obl_main
deallocate(time_hrs)
deallocate(time_hrs_tslice)
deallocate(Theta_write)
deallocate(Salin_write)
deallocate(U_write)
deallocate(V_write)
deallocate(Rho_write)
deallocate(N2_write)
deallocate(S2_write)
deallocate(Ri_grad_write)
deallocate(Kh_write)
deallocate(Km_write)
deallocate(mld_write)
deallocate(Theta_C_write)
deallocate(lab_mld_write)
!> removing time slice data
call output_cleanup
! > removing grid data
call deallocate_grid(grid)
......
module obl_output
!< @brief obl output def.
! --------------------------------------------------------------------------------
! modules used
! --------------------------------------------------------------------------------
use obl_tslice
! directives list
implicit none
private
! public interface
! --------------------------------------------------------------------------------
public :: push_state_vec
public :: output_cleanup
public :: write_netcdf, write_ascii, write_tecplot
! --------------------------------------------------------------------------------
!> @brief state output
type(oblTimeSlice), public :: output_Theta, output_Salin
type(oblTimeSlice), public :: output_Rho
type(oblTimeSlice), public :: output_U, output_V
type(oblTimeSlice), public :: output_N2, output_S2, output_Ri_grad
type(oblTimeSlice), public :: output_Km, output_Kh
type(oblTimeSlice), public :: output_TinC
contains
! --------------------------------------------------------------------------------
subroutine push_state_vec(cz)
!> @brief allocate state vector
! ----------------------------------------------------------------------------
use obl_state
integer, intent(in) :: cz
! ----------------------------------------------------------------------------
call push_profile_to_tslice(output_Theta, Theta_dev, cz)
call push_profile_to_tslice(output_Salin, Salin_dev, cz)
call push_profile_to_tslice(output_Rho, Rho, cz)
call push_profile_to_tslice(output_U, U, cz)
call push_profile_to_tslice(output_V, V, cz)
call push_profile_to_tslice(output_N2, N2, cz)
call push_profile_to_tslice(output_S2, S2, cz)
call push_profile_to_tslice(output_Ri_grad, Ri_grad, cz)
call push_profile_to_tslice(output_Km, Km, cz)
call push_profile_to_tslice(output_Kh, Kh, cz)
call push_profile_to_tslice(output_TinC, Theta_dev, cz)
end subroutine push_state_vec
! --------------------------------------------------------------------------------
subroutine write_netcdf
!> @brief write netcdf data
! ----------------------------------------------------------------------------
use io
use io_metadata
! ----------------------------------------------------------------------------
call write_2d_real_nc(output_Theta%data(:,1:output_Theta%num), 'output.nc', meta_theta)
call write_2d_real_nc(output_Salin%data(:,1:output_Salin%num), 'output.nc', meta_salin)
call write_2d_real_nc(output_Rho%data(:,1:output_Rho%num), 'output.nc', meta_rho)
call write_2d_real_nc(output_U%data(:,1:output_U%num), 'output.nc', meta_u)
call write_2d_real_nc(output_V%data(:,1:output_V%num), 'output.nc', meta_v)
call write_2d_real_nc(output_N2%data(:,1:output_N2%num), 'output.nc', meta_n2)
call write_2d_real_nc(output_S2%data(:,1:output_S2%num), 'output.nc', meta_s2)
call write_2d_real_nc(output_Ri_grad%data(:,1:output_Ri_grad%num), 'output.nc', meta_ri_grad)
call write_2d_real_nc(output_Km%data(:,1:output_Km%num), 'output.nc', meta_km)
call write_2d_real_nc(output_Kh%data(:,1:output_Kh%num), 'output.nc', meta_kh)
call write_2d_real_nc(output_TinC%data(:,1:output_TinC%num), 'output.nc', meta_theta_C)
end subroutine write_netcdf
! --------------------------------------------------------------------------------
subroutine write_ascii
!> @brief write ascii data
! ----------------------------------------------------------------------------
use io
use io_metadata
! ----------------------------------------------------------------------------
call write_2d_real_ascii(output_Theta%data(:,1:output_Theta%num), 'output_Theta.txt', meta_theta)
call write_2d_real_ascii(output_Salin%data(:,1:output_Salin%num), 'output_Salin.txt', meta_salin)
call write_2d_real_ascii(output_Rho%data(:,1:output_Rho%num), 'output_Rho.txt', meta_rho)
call write_2d_real_ascii(output_U%data(:,1:output_U%num), 'output_U.txt', meta_u)
call write_2d_real_ascii(output_V%data(:,1:output_V%num), 'output_V.txt', meta_v)
call write_2d_real_ascii(output_N2%data(:,1:output_N2%num), 'output_N2.txt', meta_n2)
call write_2d_real_ascii(output_S2%data(:,1:output_S2%num), 'output_S2.txt', meta_s2)
call write_2d_real_ascii(output_Ri_grad%data(:,1:output_Ri_grad%num), 'output_Ri_grad.txt', meta_ri_grad)
call write_2d_real_ascii(output_Km%data(:,1:output_Km%num), 'output_Km.txt', meta_km)
call write_2d_real_ascii(output_Kh%data(:,1:output_Kh%num), 'output_Kh.txt', meta_kh)
call write_2d_real_ascii(output_TinC%data(:,1:output_TinC%num), 'output_TinC.txt', meta_theta_C)
end subroutine write_ascii
! --------------------------------------------------------------------------------
subroutine write_tecplot(zcoord, tcoord)
!> @brief write tecplot data
! ----------------------------------------------------------------------------
use io
use io_metadata
use obl_io_plt
real, allocatable, intent(in) :: zcoord(:)
real, allocatable, intent(in) :: tcoord(:)
! ----------------------------------------------------------------------------
call write_2d_real_plt(output_Theta%data(:,1:output_Theta%num), zcoord, tcoord(1:output_Theta%num), 'Theta_tslice.plt', meta_theta)
call write_2d_real_plt(output_Salin%data(:,1:output_Salin%num), zcoord, tcoord(1:output_Salin%num), 'Salin_tslice.plt', meta_salin)
call write_2d_real_plt(output_Rho%data(:,1:output_Rho%num), zcoord, tcoord(1:output_Rho%num), 'Rho_tslice.plt', meta_rho)
call write_2d_real_plt(output_U%data(:,1:output_U%num), zcoord, tcoord(1:output_U%num), 'U_tslice.plt', meta_u)
call write_2d_real_plt(output_V%data(:,1:output_V%num), zcoord, tcoord(1:output_V%num), 'V_tslice.plt', meta_v)
call write_2d_real_plt(output_N2%data(:,1:output_N2%num), zcoord, tcoord(1:output_N2%num), 'N2_tslice.plt', meta_n2)
call write_2d_real_plt(output_S2%data(:,1:output_S2%num), zcoord, tcoord(1:output_S2%num), 'S2_tslice.plt', meta_s2)
call write_2d_real_plt(output_Ri_grad%data(:,1:output_Ri_grad%num), zcoord, tcoord(1:output_Ri_grad%num), 'Ri_grad_tslice.plt', meta_ri_grad)
call write_2d_real_plt(output_Km%data(:,1:output_Km%num), zcoord, tcoord(1:output_Km%num), 'Km_tslice.plt', meta_km)
call write_2d_real_plt(output_Kh%data(:,1:output_Kh%num), zcoord, tcoord(1:output_Kh%num), 'Kh_tslice.plt', meta_kh)
call write_2d_real_plt(output_TinC%data(:,1:output_TinC%num), zcoord, tcoord(1:output_TinC%num), 'TinC_tslice.plt', meta_theta_C)
end subroutine write_tecplot
! --------------------------------------------------------------------------------
subroutine output_cleanup
!> @brief cleanup output data
! ----------------------------------------------------------------------------
! ----------------------------------------------------------------------------
call deallocate_tslice(output_Theta)
call deallocate_tslice(output_Salin)
call deallocate_tslice(output_Rho)
call deallocate_tslice(output_U)
call deallocate_tslice(output_V)
call deallocate_tslice(output_N2)
call deallocate_tslice(output_S2)
call deallocate_tslice(output_Ri_grad)
call deallocate_tslice(output_Km)
call deallocate_tslice(output_Kh)
call deallocate_tslice(output_TinC)
end subroutine output_cleanup
end module
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment