Loading of a variable, that is defined in terms of an operation on other variables.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_variable_type), | intent(inout) | :: | me |
The variable to read from the Lua script(conf) and fill |
||
type(flu_State) | :: | conf |
Lua handle connected to the script to read the table from |
|||
integer, | intent(in) | :: | parent |
A parent table handle in which to look the current operation table |
||
integer, | intent(out) | :: | iError |
iError .ne. 0 if operation is not loaded successfully. |
subroutine load_variable_operation( me, conf, parent, iError)
! --------------------------------------------------------------------------!
!> The variable to read from the Lua script(conf) and fill
type(tem_variable_type), intent(inout) :: me
!> Lua handle connected to the script to read the table from
type(flu_state) :: conf
!> A parent table handle in which to look the current operation table
integer, intent(in) :: parent
!> iError .ne. 0 if operation is not loaded successfully.
integer, intent(out) :: iError
! --------------------------------------------------------------------------!
integer :: oper_handle, iIn, nInvar
integer, allocatable :: vError(:)
! --------------------------------------------------------------------------!
call aot_table_open( L = conf, &
& parent = parent, &
& thandle = oper_handle, &
& key = 'operation' )
if (oper_handle == 0) then
iError = -1
write(logUnit(1),*) 'operation table not defined.'
return
end if
write(logUnit(5),*) ' Loading operation table '
! get operation kind
call aot_get_val( L = conf, &
& thandle = oper_handle, &
& val = me%operType, &
& ErrCode = iError, &
& key = 'kind' )
if (btest(iError, aoterr_Fatal)) then
write(logUnit(1),*) 'FATAL Error occured, while retrieving "kind" '// &
& 'from operation table :'
if ( btest( iError, aotErr_NonExistent )) &
& write(logUnit(1),*)'Variable not existent!'
if (btest(iError, aoterr_WrongType)) &
& write(logUnit(1),*)'Variable has wrong type!'
end if
write(logUnit(5),*) ' kind = '//trim(me%operType)
! Get the dependent variables
call aot_get_val( val = me%input_varName, &
& ErrCode = vError, &
& maxlength = 100, &
& L = conf, &
& thandle = oper_handle, &
& key = 'input_varname' )
if ( any(btest(vError, aoterr_Fatal)) ) then
write(logUnit(1),*) 'FATAL Error occured, while retrieving '
write(logUnit(1),*) '"input_varName" for operation' // trim(me%operType)
call tem_abort()
end if
! number of variables in input_varname
nInVar = size(me%input_varName)
write(logUnit(5),*) ' input_varname:'
do iIn = 1, nInVar
write(logUnit(5), *) ' ', iIN, trim(me%input_varName(iIn))
end do
deallocate(vError)
! Load operation specific infos
select case(trim(me%operType))
case ('reduction_transient')
call tem_reduction_transient_load(me = me%redTransConfig, &
& conf = conf, &
& parent = oper_handle )
case ('extract')
allocate(me%input_varIndex(me%nComponents))
allocate(vError(me%nComponents))
! Extraction of component index from input_varname is possible
! only when there is only one variable name in input_varname
if ( nInVar == 1 ) then
call aot_get_val( L = conf, &
& thandle = oper_handle, &
& val = me%input_varIndex, &
& ErrCode = vError, &
& key = 'input_varindex' )
if ( any(btest(vError, aoterr_Fatal)) .or. &
& any(me%input_varIndex <= 0) ) then
write(logUnit(1),*) 'FATAL Error occured, while retrieving '
write(logUnit(1),*) '"input_varindex" for extract operation'
write(logUnit(1),*) 'input_varindex: ',me%input_varIndex
call tem_abort()
end if
else
write(logUnit(1),*) 'Error loading component index for operation'//&
& ' kind extract'
write(logUnit(1),*) 'Size of input_varname: ', nInVar
write(logUnit(1),*) 'Extract component index from input_varname'//&
& 'works only when size(input_varname) == 1'
call tem_abort()
end if
write(logUnit(5),*) ' Component index to extract:', me%input_varIndex
end select
call aot_table_close( L = conf, thandle = oper_handle)
end subroutine load_variable_operation