tem_polygon_material_multi_load Subroutine

public subroutine tem_polygon_material_multi_load(me, conf, thandle)

get the z component

read list of vertices

how many lists provided, here we just have one here we need to read out the kind and than point to the specific movement of the polygon

Arguments

Type IntentOptional Attributes Name
type(tem_polygon_material_type), intent(out) :: me

Polygon data structure to fill with information provided by the user in config.

type(flu_State) :: conf

Handle to the Lua script containing the polygon definition

integer, intent(in), optional :: thandle

Handle for the table containing the polygon definition.


Calls

proc~~tem_polygon_material_multi_load~~CallsGraph proc~tem_polygon_material_multi_load tem_polygon_material_multi_load aot_get_val aot_get_val proc~tem_polygon_material_multi_load->aot_get_val aot_table_close aot_table_close proc~tem_polygon_material_multi_load->aot_table_close aot_table_length aot_table_length proc~tem_polygon_material_multi_load->aot_table_length aot_table_open aot_table_open proc~tem_polygon_material_multi_load->aot_table_open proc~tem_abort tem_abort proc~tem_polygon_material_multi_load->proc~tem_abort mpi_abort mpi_abort proc~tem_abort->mpi_abort

Called by

proc~~tem_polygon_material_multi_load~~CalledByGraph proc~tem_polygon_material_multi_load tem_polygon_material_multi_load proc~load_spacetime_predefined load_spacetime_predefined proc~load_spacetime_predefined->proc~tem_polygon_material_multi_load proc~tem_load_spacetime_single tem_load_spacetime_single proc~tem_load_spacetime_single->proc~load_spacetime_predefined proc~tem_load_spacetime_single->proc~tem_load_spacetime_single interface~tem_load_spacetime tem_load_spacetime interface~tem_load_spacetime->proc~tem_load_spacetime_single proc~tem_load_spacetime_table tem_load_spacetime_table interface~tem_load_spacetime->proc~tem_load_spacetime_table proc~tem_load_spacetime_table->proc~tem_load_spacetime_single proc~tem_variable_load_single tem_variable_load_single proc~tem_variable_load_single->interface~tem_load_spacetime proc~tem_variable_loadmapping_single tem_variable_loadMapping_single proc~tem_variable_loadmapping_single->interface~tem_load_spacetime

Source Code

  subroutine tem_polygon_material_multi_load(me, conf, thandle)
    ! ----------------------------------------------------------------------
    !> Polygon data structure to fill with information provided
    !! by the user in config.
    type(tem_polygon_material_type), intent(out) :: me

    !> Handle to the Lua script containing the polygon definition
    type(flu_state) :: conf

    !> Handle for the table containing the polygon definition.
    integer, intent(in), optional :: thandle
    ! ----------------------------------------------------------------------
    real(kind=rk), allocatable :: defout(:)
    integer :: vertex_table, valtable, vertices_table
    integer :: movement_table, parameter_table
    integer :: iVertex, ipoly
    integer :: iError
    integer, allocatable :: vError(:)
    integer :: iError_v(2)
    ! ----------------------------------------------------------------------

    write(logUnit(1),*) 'Loading predefined function for multi body polygon:'

    valtable =0
    !> get the z component
    call aot_get_val( L       = conf,    &
      &               thandle = thandle, &
      &               key     = 'zmin',  &
      &               val     = me%zmin, &
      &               default = 0.0_rk,  &
      &               ErrCode = iError   )

    if (btest(iError, aoterr_fatal)) then
      write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
      write(logunit(1),*) '      get a value for zmin!'
      write(logunit(1),*) '      This also applies if no inval is provided.'
      call tem_abort()
    end if
    call aot_get_val( L       = conf,    &
      &               thandle = thandle, &
      &               key     = 'zmax',  &
      &               val     = me%zmax, &
      &               default = 0.0_rk,  &
      &               ErrCode = iError   )
    if (btest(iError, aoterr_fatal)) then
      write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
      write(logunit(1),*) '      get a value for zmax!'
      write(logunit(1),*) '      This also applies if no inval is provided.'
      call tem_abort()
    end if
    !> read list of vertices
    call aot_table_open( L       = conf,          &
      &                  parent  = thandle,       &
      &                  key     = 'vertices',    &
      &                  thandle = vertices_table )

    if (vertices_table == 0) then
      write(logunit(1),*) 'ERROR in tem_polygon_material_load: No vertices'
      write(logunit(1),*) '      defined, unable to set up a polynomial!'
      write(logunit(1),*) '      Please define vertices tables with lists of'
      write(logunit(1),*) '      2D points.'
      call tem_abort()
    end if

     me%nPoly = aot_table_length( L       = conf,          &
       &                          thandle = vertices_table )
    !> how many lists provided, here we just have one
    allocate(me%poly_list(me%npoly))
    do iPoly = 1, me%npoly
      call aot_table_open( L       = conf,           &
        &                  parent  = vertices_table, &
        &                  pos     = ipoly,          &
        &                  thandle = vertex_table    )
      if (vertex_table == 0) then
        write(logunit(1),*) 'ERROR in tem_polygon_material_load: No vertices'
        write(logunit(1),*) '      Please define vertex tables with lists of'
        write(logunit(1),*) '      2D points.'
        call tem_abort()
      end if
      me%poly_list(ipoly)%nVertices = aot_table_length( L       = conf,        &
        &                                               thandle = vertex_table )

      allocate(me%poly_list(ipoly)%vertex(me%poly_list(ipoly)%nVertices, 2))
      do iVertex=1,me%poly_list(ipoly)%nVertices
        call aot_get_val( val     = me%poly_list(ipoly)%vertex(iVertex, :), &
          &               ErrCode = iError_v,                               &
          &               L       = conf,                                   &
          &               thandle = vertex_table,                           &
          &               pos     = iVertex                                 )
        if (any(iError_v /= 0)) then
          write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
          write(logunit(1),*) '      obtain vertex ', iVertex, '!'
          write(logunit(1),*) '      Vertices have to be vectors of length 2,'
          write(logunit(1),*) '      with real numbers as entries.'
          call tem_abort()
        end if
      end do
      call aot_table_close( L       = conf,        &
        &                   thandle = vertex_table )
    end do

    call aot_table_close( L       = conf,          &
      &                   thandle = vertices_table )

    call aot_table_open( L       = conf,          &
      &                  parent  = thandle,       &
      &                  key     = 'movement',    &
      &                  thandle = movement_table )
    if (movement_table == 0) then
      write(logunit(1),*) 'ERROR in tem_polygon_material_load: No movement'
      write(logunit(1),*) '      defined, unable to continue!'
      write(logunit(1),*)                                         &
        & '      Please define movement table with a movement kind'
      call tem_abort()
    end if

    call aot_get_val( L         = conf,                    &
      &               thandle   = movement_table,          &
      &               key       = 'movement_kind',         &
      &               val       = me%moving%movement_kind, &
      &               default   = 'No movement',           &
      &               ErrCode   = iError                   )

    call aot_table_close( L       = conf,          &
      &                   thandle = movement_table )

    select case(me%moving%movement_kind)
      case( 'lin_multi_body_2d', 'lin_multi_body_3d')
        call aot_table_open( L       = conf,            &
          &                  parent  = thandle,         &
          &                  key     = 'lin_parameter', &
          &                  thandle = parameter_table  )
        if (parameter_table == 0) then
          write(logunit(1),*)                                   &
            & 'ERROR in tem_polygon_material_load: lin_parameter'
          write(logunit(1),*) '      not defined, unable to set movement!'
          write(logunit(1),*) '      Define lin_parameter table for multi body'
          call tem_abort()
        end if
        me%nComponents = aot_table_length( L       = conf,           &
          &                                thandle = parameter_table )

        call aot_table_close( L       = conf,           &
          &                   thandle = parameter_table )

        allocate(me%moving%lin_parameter(me%nComponents))
        call aot_get_val( L         = conf,                    &
          &               thandle   = thandle,                 &
          &               key       = 'lin_parameter',         &
          &               val       = me%moving%lin_parameter, &
          &               maxlength = me%nComponents,          &
          &               ErrCode   = VError                   )

        if (any(btest(vError, aoterr_Fatal))) then
          write(logunit(1),*)                                 &
            & 'ERROR in tem_polygon_material_load: No movement'
          write(logunit(1),*)                                      &
            & '      values defined, unable to set up the movement!'
          write(logunit(1),*)                    &
            & '      Please define lin_parameter!'
          write(logunit(1),*)                                       &
            & '      For linear movement set velocity in X,Y for 2D!'
          call tem_abort()
        end if
      case( 'sin_multi_body_2d','sin_multi_body_3d')
        call aot_table_open( L       = conf,            &
          &                  parent  = thandle,         &
          &                  key     = 'sin_parameter', &
          &                  thandle = parameter_table  )
        if (parameter_table == 0) then
          write(logunit(1),*)                                   &
            & 'ERROR in tem_polygon_material_load: sin_parameter'
          write(logunit(1),*) '      not defined, unable to set movement!'
          write(logunit(1),*)                                        &
            & '      Please define sin_parameter table for multi body'
          call tem_abort()
        end if
        me%nComponents = aot_table_length( L       = conf,           &
          &                                thandle = parameter_table )

        call aot_table_close( L       = conf,        &
          &                   thandle = parameter_table )

        allocate(me%moving%sin_parameter(me%nComponents))
        call aot_get_val( L         = conf,                    &
          &               thandle   = thandle,                 &
          &               key       = 'sin_parameter',         &
          &               val       = me%moving%sin_parameter, &
          &               maxlength = me%nComponents,          &
          &               ErrCode   = VError                   )

        if (any(btest(vError, aoterr_Fatal))) then
          write(logunit(1),*) 'ERROR in tem_polygon_material_load: No movement'
          write(logunit(1),*)                                      &
            & '      values defined, unable to set up the movement!'
          write(logunit(1),*) '      Please define sin_parameter!'
          write(logunit(1),*)                                         &
            & '      For sinefuction set amplitude and frequency in X,'
          write(logunit(1),*) '      than the information for the Y direction!'
        end if

      case( 'rot_multi_body_2d','rot_multi_body_3d')
        call aot_table_open( L       = conf,            &
          &                  parent  = thandle,         &
          &                  key     = 'rot_parameter', &
          &                  thandle = parameter_table  )
        if (parameter_table == 0) then
          write(logunit(1),*)                                   &
            & 'ERROR in tem_polygon_material_load: rot_parameter'
          write(logunit(1),*) '      not defined, unable to set movement!'
          write(logunit(1),*) '      Please define rot_parameter table'
          call tem_abort()
        end if
        me%nComponents = aot_table_length( L       = conf,           &
              &                            thandle = parameter_table )

        call aot_table_close( L       = conf,        &
          &                   thandle = parameter_table )

        allocate(me%moving%rot_parameter(me%nComponents))
        call aot_get_val( L         = conf,                    &
          &               thandle   = thandle,                 &
          &               key       = 'rot_parameter',         &
          &               val       = me%moving%rot_parameter, &
          &               maxlength = me%nComponents,          &
          &               ErrCode   = VError                   )

        if (any(btest(vError, aoterr_Fatal))) then
          write(logunit(1),*) 'ERROR in tem_polygon_material_load: No movement'
          write(logunit(1),*)                                      &
            & '      values defined, unable to set up the movement!'
          write(logunit(1),*) '      Please define rot_parameter!'
          write(logunit(1),*)                                         &
            & '      For rotation provide the X and Y direction of the'
          write(logunit(1),*) '      rotation_point and the rotation speed! '
        end if
      case default
        write(logUnit(1),*) 'NO movement prescribed for the polygon'
      end select
      deallocate(vError)
      write(logUnit(1),*) 'The multi geometry movement is defined by: ', &
        & me%moving%movement_kind

    !! here we need to read out the kind and than point to the specific
    !! movement of the polygon
    call aot_table_open( L       = conf,    &
      &                  parent  = thandle, &
      &                  key     = 'inval', &
      &                  thandle = valtable )

    if (valtable  == 0) then
      ! inval not provided as a table, try to read it as a scalar.
      allocate(me%inval(1))
      call aot_get_val( L         = conf,        &
        &               thandle   = thandle,     &
        &               key       = 'inval',     &
        &               val       = me%inval(1), &
        &               default   = 1.0_rk,      &
        &               ErrCode   = iError       )

      if (btest(iError, aoterr_Fatal)) then
        write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
        write(logunit(1),*) '      get value for inval!'
        call tem_abort()
      end if

      me%nComponents = 1
      allocate(me%outval(me%nComponents))

      ! Outval needs to be consistent with the inval definition, if inval was
      ! defined as a scalar, outval also has to be a scalar!
      ! We do not check for tables with single entries in this case.
      call aot_get_val( L       = conf,         &
        &               thandle = thandle,      &
        &               key     = 'outval',     &
        &               val     = me%outval(1), &
        &               default = 0.0_rk,       &
        &               ErrCode = iError        )

      if (btest(iError, aoterr_fatal)) then
        write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
        write(logunit(1),*) '      get a value for outval!'
        write(logunit(1),*) '      Note, that outval needs be a scalar, as'
        write(logunit(1),*) '      inval is provided as a scalar.'
        write(logunit(1),*) '      This also applies if no inval is provided.'
        call tem_abort()
      end if

    else

      ! Intable is a table, close it an read it into an array.
      call aot_table_close(L = conf, thandle = valtable)

      ! Value to use inside the polygon
      call aot_get_val( L         = conf,     &
        &               thandle   = thandle,  &
        &               key       = 'inval',  &
        &               val       = me%inval, &
        &               maxlength = 20,       &
        &               default   = [1.0_rk], &
        &               ErrCode   = vError    )

      if (any(btest(vError, aoterr_Fatal))) then
        write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
        write(logunit(1),*) '      get values for inval!'
        call tem_abort()
      end if
      me%nComponents = size(me%inval)
      deallocate(vError)

      ! Definition of outval needs to be consistent with inval, it has to have
      ! the same number of components, and also needs to be a vector.
      ! However, we define a default of all zeroes, so if outval is 0 for all
      ! components, this definition can be omitted in the user definition.
      allocate(me%outval(me%nComponents))
      allocate(vError(me%nComponents))
      allocate(defout(me%nComponents))

      defout = 0.0_rk

      ! Value to use outside the polygon
      call aot_get_val( L       = conf,      &
        &               thandle = thandle,   &
        &               key     = 'outval',  &
        &               val     = me%outval, &
        &               default = defout,    &
        &               ErrCode = vError     )

      if (any(btest(vError,aoterr_Fatal))) then
        write(logunit(1),*) 'ERROR in tem_polygon_material_load: Not able to'
        write(logunit(1),*) '      get a value for outval!'
        write(logunit(1),*) '      Note, that outval needs to have the same'
        write(logunit(1),*) '      length as inval.'
        call tem_abort()
      end if

      deallocate(vError)
      deallocate(defout)

    end if
  end subroutine tem_polygon_material_multi_load