subroutine Init_Scalar3D(this,interp,nVar,nElem)
implicit none
class(Scalar3D),intent(out) :: this
type(Lagrange),intent(in),target :: interp
integer,intent(in) :: nVar
integer,intent(in) :: nElem
! Local
integer(c_size_t) :: workSize
this%interp => interp
this%nVar = nVar
this%nElem = nElem
this%N = interp%N
this%M = interp%M
allocate(this%interior(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nelem,1:nvar), &
this%boundary(1:interp%N+1,1:interp%N+1,1:6,1:nelem,1:nvar), &
this%extBoundary(1:interp%N+1,1:interp%N+1,1:6,1:nelem,1:nvar), &
this%avgBoundary(1:interp%N+1,1:interp%N+1,1:6,1:nelem,1:nvar), &
this%boundarynormal(1:interp%N+1,1:interp%N+1,1:6,1:nelem,1:3*nvar))
this%interior = 0.0_prec
this%boundary = 0.0_prec
this%extBoundary = 0.0_prec
this%avgBoundary = 0.0_prec
this%boundarynormal = 0.0_prec
allocate(this%meta(1:nVar))
allocate(this%eqn(1:nVar))
call gpuCheck(hipMalloc(this%interior_gpu,sizeof(this%interior)))
call gpuCheck(hipMalloc(this%boundary_gpu,sizeof(this%boundary)))
call gpuCheck(hipMalloc(this%extBoundary_gpu,sizeof(this%extBoundary)))
call gpuCheck(hipMalloc(this%avgBoundary_gpu,sizeof(this%avgBoundary)))
call gpuCheck(hipMalloc(this%boundarynormal_gpu,sizeof(this%boundarynormal)))
workSize = (interp%N+1)*(interp%N+1)*(interp%M+1)*nelem*nvar*prec
call gpuCheck(hipMalloc(this%interpWork1,workSize))
workSize = (interp%N+1)*(interp%M+1)*(interp%M+1)*nelem*nvar*prec
call gpuCheck(hipMalloc(this%interpWork2,workSize))
call this%UpdateDevice()
call hipblasCheck(hipblasCreate(this%blas_handle))
endsubroutine Init_Scalar3D