Append a new (non-state) variable to the variable system.
Non-state variables might depend on other variables, and do not modify the internal state variable counter.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_varSys_type), | intent(inout) | :: | me |
Variable system to append the state variable to. |
||
character(len=*), | intent(in) | :: | varname |
Variable to append to the state. |
||
character(len=*), | intent(in), | optional | :: | operType |
Operation type |
|
integer, | intent(in) | :: | nComponents |
Number of components in this variable. |
||
character(len=*), | intent(in), | optional | :: | input_varname(:) |
List of variable names, this variable depends on. (Might be empty). The variable will only be appended, if all invars are already found in the variable system. |
|
integer, | intent(in), | optional | :: | input_varIndex(:) |
Component index to access from input variable nComponents (Might be empty). The variable will only be appended, if all index are available in input_varname |
|
type(c_ptr), | intent(in) | :: | method_data |
Data that is required by the methods to obtain the variable. |
||
procedure(tem_varSys_proc_point), | pointer | :: | get_point |
Procedure which allows the retrieval of the variable at given points. |
||
procedure(tem_varSys_proc_element), | pointer | :: | get_element |
Procedure which allows the retrieval of the variable in an element. |
||
procedure(tem_varSys_proc_setParams), | optional, | pointer | :: | set_params |
Procedure which allows to set parameter in method_data |
|
procedure(tem_varSys_proc_getParams), | optional, | pointer | :: | get_params |
Procedure which allows to get parameter in method_data |
|
procedure(tem_varSys_proc_setupIndices), | pointer | :: | setup_indices |
Procedure to setup growing array of points, variable value in method_data and return index of points set |
||
procedure(tem_varSys_proc_getValOfIndex), | pointer | :: | get_valOfIndex |
Procedure which allows to retrieval of the variable at point or val array index |
||
integer, | intent(out), | optional | :: | pos |
Position of the variable in the system. |
|
logical, | intent(out), | optional | :: | wasAdded |
Indicator, if the variable was actually added to the system. |
subroutine tem_varSys_append_derVar(me, varname, operType, nComponents, &
& input_varname, input_varindex, &
& method_data, get_point, get_element, &
& set_params, get_params, setup_indices, &
& get_valOfIndex, pos, wasAdded )
! --------------------------------------------------------------------------!
!> Variable system to append the state variable to.
type(tem_varSys_type), intent(inout) :: me
!> Variable to append to the state.
character(len=*), intent(in) :: varname
!> Operation type
character(len=*), optional, intent(in) :: operType
!> Number of components in this variable.
integer, intent(in) :: nComponents
!> List of variable names, this variable depends on.
!!
!! (Might be empty). The variable will only be appended, if all invars are
!! already found in the variable system.
character(len=*), optional, intent(in) :: input_varname(:)
!> Component index to access from input variable nComponents
!!
!! (Might be empty). The variable will only be appended, if all index are
!! available in input_varname
integer, optional, intent(in) :: input_varIndex(:)
!> Data that is required by the methods to obtain the variable.
type(c_ptr), intent(in) :: method_data
!> Procedure which allows the retrieval of the variable at given points.
procedure(tem_varSys_proc_point), pointer :: get_point
!> Procedure which allows the retrieval of the variable in an element.
procedure(tem_varSys_proc_element), pointer :: get_element
!> Procedure which allows to set parameter in method_data
procedure(tem_varSys_proc_setParams), optional, pointer :: set_params
!> Procedure which allows to get parameter in method_data
procedure(tem_varSys_proc_getParams), optional, pointer :: get_params
!> Procedure to setup growing array of points, variable value
!! in method_data and return index of points set
procedure(tem_varSys_proc_setupIndices), pointer :: setup_indices
!> Procedure which allows to retrieval of the variable at point or val
!! array index
procedure(tem_varSys_proc_getValOfIndex), pointer :: get_valOfIndex
!> Position of the variable in the system.
integer, optional, intent(out) :: pos
!> Indicator, if the variable was actually added to the system.
logical, optional, intent(out) :: wasAdded
! --------------------------------------------------------------------------!
logical :: newVar, nonexisting_input
type(tem_varSys_op_type) :: var_access
integer :: iIn, nInputs, varPos, in_nComp, nVarIndex
integer, allocatable :: inpos(:), input_varIndex_loc(:)
! --------------------------------------------------------------------------!
if (present(input_varname)) then
nInputs = size(input_varname)
else
nInputs = 0
end if
if (present(input_varindex)) then
nVarIndex = size(input_varindex)
else
nVarIndex = 0
end if
allocate(inpos(nInputs))
allocate(input_varIndex_loc(nVarIndex))
nonexisting_input = .false.
! Check whether all input variables are present. If not, the variable can't
! be added, because variables it depends on are not present.
do iIn=1,nInputs
inpos(iIn) = PositionOfVal(me%varname, input_varname(iIn))
nonexisting_input = (inpos(iIn) <= 0)
if (nonexisting_input) then
write(logUnit(llerror),*) 'Variable ' // trim(varname) &
& // ' cant be added due to missing input variable ' &
& // trim(input_varname(iIn))
EXIT
end if
! allocate and set input_varIndex only if nVarIndex > 0
! input_varIndex is used only for one nInputs
if ( nVarIndex > 0 .and. nInputs == 1 ) then
! Check whether the component index requested from input_varname
! is available
in_nComp = me%method%val(inpos(iIn))%nComponents
if ( (maxval(input_varIndex) > in_nComp) .or. &
& (nVarIndex > in_nComp) ) then
write(logUnit(llerror),*) 'WARNING: Component index requested ' &
& // 'is not extractable from variable: ' &
& // trim(input_varname(iIn))
write(logUnit(llerror),*) ' Input variable name: ' &
& // trim(input_varname(iIn))
write(logUnit(llerror),*) ' nComponents of input_varname: ', &
& in_nComp
write(logUnit(llerror),*) ' Requested component index of ' &
& // 'input var: ', input_varIndex
EXIT
end if
! Copy input_varIndex
input_varIndex_loc = input_varIndex
end if
end do
if (nonexisting_input) then
varPos = 0
newVar = .false.
else
! All inputs are found in the variable system, thus this derived
! quantity can be added now.
call append( me = me%varname, &
& val = varname, &
& pos = varPos, &
& wasAdded = newVar )
if (newVar) then
write(logUnit(lldebug),*) 'Variable ' // trim(varname) &
& // ' was newly added'
var_access%mypos = varPos
if (present(operType)) then
var_access%operType = trim(operType)
else
var_access%operType = 'derived'
end if
var_access%nInputs = nInputs
var_access%nComponents = nComponents
allocate(var_access%state_varPos(0))
allocate(var_access%auxField_varPos(0))
allocate(var_access%input_varPos(nInputs))
var_access%input_varPos = inpos
allocate(var_access%input_varIndex(nVarIndex))
var_access%input_varIndex = input_varIndex_loc
var_access%method_data = method_data
var_access%get_point => get_point
var_access%get_element => get_element
if (present(set_params)) then
var_access%set_params => set_params
else
var_access%set_params => tem_varSys_setParams_dummy
end if
if (present(get_params)) then
var_access%get_params => get_params
else
var_access%get_params => tem_varSys_getParams_dummy
end if
var_access%setup_indices => setup_indices
var_access%get_valOfIndex => get_valOfIndex
call append( me = me%method, &
& val = var_access )
else
write(logUnit(lldebug),*) 'Variable ' // trim(varname) &
& // ' is already present'
end if
end if
if (present(pos)) pos = varPos
if (present(wasAdded)) wasAdded = newVar
end subroutine tem_varSys_append_derVar