tem_spacetime_lua_vector_for_coord Function

private function tem_spacetime_lua_vector_for_coord(fun_ref, coord, time, n, ncomp, conf) result(res)

This function invokes the Lua function for a given coordinate and returns an array valued result.

Note, that the returned object by the Lua function has to be a table, except if there is only one component. For arrays of length 1 the Lua return value has to be a simple scalar, not a table!

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: fun_ref

Reference of the function to open

real(kind=rk), intent(in) :: coord(n,3)

barycentric Ids of an elements. 1st index goes over number of elements and 2nd index goes over x,y,z coordinates

type(tem_time_type), intent(in) :: time

timer object incl. the current time information

integer, intent(in) :: n

number of return values

integer, intent(in) :: ncomp

number of components returned for each value

type(flu_State), intent(in), optional :: conf

lua state

Return Value real(kind=rk), (n,ncomp)

return value


Source Code

  function tem_spacetime_lua_vector_for_coord( fun_ref, coord, time, n, ncomp, &
    &                                          conf ) result(res)
    ! -------------------------------------------------------------------- !
    !> Reference of the function to open
    integer, intent(in) :: fun_ref
    !> number of return values
    integer, intent(in) :: n
    !> number of components returned for each value
    integer, intent(in) :: ncomp
    !> barycentric Ids of an elements.
    !! 1st index goes over number of elements and
    !! 2nd index goes over x,y,z coordinates
    real(kind=rk), intent(in) :: coord(n,3)
    !> timer object incl. the current time information
    type(tem_time_type), intent(in)  :: time
    !> return value
    real(kind=rk) :: res(n,ncomp)
    !> lua state
    type(flu_State), intent(in), optional :: conf
    ! -------------------------------------------------------------------- !
    type(aot_fun_type) :: fun
    integer :: iError(ncomp)
    integer :: i, j
    ! -------------------------------------------------------------------- !
    call aot_fun_open(L = conf, fun = fun, ref = fun_ref)

    do i=1,n
      do j=1,3
        call aot_fun_put(L=conf, fun=fun, arg=coord(i,j))
      end do
      call aot_fun_put(L=conf, fun=fun, arg=time%sim)
      call aot_fun_do(L=conf, fun=fun, nresults=1)
      call aot_top_get_val(L=conf, val=res(i,:), ErrCode=iError)
      if ( any(btest(iError,aoterr_Fatal)) ) then
        write(logunit(0),*) "ERROR Obtaining a space time function"
        write(logunit(0),*) "Probably wrong number of components returned"
        write(logunit(0),*) "or a scalar was return as a lua table"
        write(logunit(0),*) 'Expected nComp: ', nComp
        write(logunit(0),*) 'ErrorCodes: ', iError
        write(logunit(0),*) "Check return values of your Lua functions!"
        call tem_abort()
      end if
    end do

    call aot_fun_close(L = conf, fun = fun)

  end function tem_spacetime_lua_vector_for_coord