! Created by Andrey Debolskiy on 20.11.2024.

module scm_state_data
    implicit none
    type stateBLDataType
        real, allocatable:: u(:), v(:), temp(:), theta(:) ,qv(:)
        real, allocatable:: rho(:)
        real, allocatable :: lwp(:), cloud_frac(:), s_e(:)
        real, allocatable:: km(:), kh(:)
        real, allocatable:: vdctq(:)
        real, allocatable:: vdcuv(:)
        real :: HPBLA_diag
        real :: p0
        integer :: ktvdm=10
        integer :: ktvd
        integer :: kpbl
        integer :: ktop
        integer :: kmax
    end type stateBLDataType
    public scm_data_allocate
    public scm_data_deallocate
    public scm_data_copy
    contains
        subroutine scm_data_allocate(bl_data, kmax)
            implicit none
            type(stateBLDataType),intent(inout):: bl_data
            integer:: kmax
            bl_data%kmax = kmax
            allocate(bl_data%u(kmax))
            allocate(bl_data%v(kmax))
            allocate(bl_data%temp(kmax))
            allocate(bl_data%theta(kmax))
            allocate(bl_data%qv(kmax))
            allocate(bl_data%lwp(kmax))
            allocate(bl_data%cloud_frac(kmax))
            allocate(bl_data%s_e(kmax))
            allocate(bl_data%km(kmax))
            allocate(bl_data%kh(kmax))
            allocate(bl_data%vdcuv(kmax))
            allocate(bl_data%vdctq(kmax))
        end subroutine scm_data_allocate

        subroutine scm_data_deallocate(bl_data)
            implicit none
            type(stateBLDataType), intent(inout):: bl_data
            deallocate(bl_data%u)
            deallocate(bl_data%v)
            deallocate(bl_data%temp)
            deallocate(bl_data%theta)
            deallocate(bl_data%qv)
            deallocate(bl_data%lwp)
            deallocate(bl_data%cloud_frac)
            deallocate(bl_data%s_e)
            deallocate(bl_data%km)
            deallocate(bl_data%kh)
            deallocate(bl_data%vdcuv)
            deallocate(bl_data%vdctq)
        end subroutine scm_data_deallocate

        subroutine scm_data_copy(bl, bl_old)
            implicit none
            type(stateBLDataType),intent(in):: bl_old
            type(stateBLDataType),intent(out):: bl
            if (bl%kmax /= bl_old%kmax) then
                write(*,*) 'error in copy BLData: size is not compatible'
            else
                bl%u  = bl_old%u
                bl%v = bl_old%v
                bl%temp = bl_old%temp
                bl%theta = bl_old%theta
                bl%qv = bl_old%qv
                bl%lwp = bl_old%lwp
                bl%cloud_frac= bl_old%cloud_frac
                bl%s_e = bl_old%s_e
                bl%km = bl_old%km
                bl%kh = bl_old%kh
                bl%vdcuv = bl_old%vdcuv
                bl%vdctq = bl_old%vdctq
                bl%hpbla_diag = bl_old%hpbla_diag
                bl%p0 = bl_old%p0
                bl%ktvdm = bl_old%ktvdm
                bl%kpbl = bl_old%kpbl
                bl%ktop = bl_old%ktop
            end if

        end subroutine scm_data_copy
end module scm_state_data