signal_init Subroutine

private subroutine signal_init(me, sim, input_cfg, key, x)

Type Bound

signal_t

Arguments

Type IntentOptional Attributes Name
class(signal_t), intent(inout) :: me
type(simulation_t), intent(inout), target :: sim
type(input_t), intent(in) :: input_cfg
character(len=*), intent(in) :: key
real(kind=dp), intent(in), optional :: x(:)

Calls

proc~~signal_init~~CallsGraph proc~signal_init signal_t%signal_init interface~getprocaddress GetProcAddress proc~signal_init->interface~getprocaddress interface~is_nan is_nan proc~signal_init->interface~is_nan proc~input_dbl input_t%input_dbl proc~signal_init->proc~input_dbl proc~input_dbl1d input_t%input_dbl1d proc~signal_init->proc~input_dbl1d proc~input_dbl2d input_t%input_dbl2d proc~signal_init->proc~input_dbl2d proc~input_dict input_t%input_dict proc~signal_init->proc~input_dict proc~input_has_key input_t%input_has_key proc~signal_init->proc~input_has_key proc~input_keys1d input_t%input_keys1d proc~signal_init->proc~input_keys1d proc~input_str input_t%input_str proc~signal_init->proc~input_str proc~interpolate_vector interpolate_vector proc~signal_init->proc~interpolate_vector proc~merge_events merge_events proc~signal_init->proc~merge_events proc~is_nan_dbl is_nan_dbl interface~is_nan->proc~is_nan_dbl proc~is_nan_int is_nan_int interface~is_nan->proc~is_nan_int proc~input_dbl->proc~input_has_key proc~continue_if continue_if proc~input_dbl->proc~continue_if proc~get0d_hdf5 get0d_hdf5 proc~input_dbl->proc~get0d_hdf5 proc~input_node input_t%input_node proc~input_dbl->proc~input_node to_real to_real proc~input_dbl->to_real proc~input_dbl1d->proc~input_has_key interface~to_str to_str proc~input_dbl1d->interface~to_str proc~input_dbl1d->proc~continue_if proc~get1d_hdf5 get1d_hdf5 proc~input_dbl1d->proc~get1d_hdf5 proc~input_dbl1d->proc~input_node proc~select_scalar select_scalar proc~input_dbl1d->proc~select_scalar proc~input_dbl1d->to_real proc~input_dbl2d->proc~input_has_key proc~input_dbl2d->proc~continue_if proc~get2d_hdf5 get2d_hdf5 proc~input_dbl2d->proc~get2d_hdf5 proc~input_dbl2d->proc~input_node proc~select_list select_list proc~input_dbl2d->proc~select_list proc~input_dbl2d->proc~select_scalar proc~input_dbl2d->to_real proc~input_dict->proc~input_has_key proc~input_dict1d input_t%input_dict1d proc~input_dict->proc~input_dict1d proc~input_dict->proc~input_node get get proc~input_has_key->get proc~select_dict select_dict proc~input_has_key->proc~select_dict proc~input_keys1d->proc~select_dict proc~input_str->proc~input_has_key proc~input_str->proc~input_node proc~input_str->proc~select_scalar proc~interpolate interpolate proc~interpolate_vector->proc~interpolate proc~str_from_int str_from_int interface~to_str->proc~str_from_int proc~str_from_real str_from_real interface~to_str->proc~str_from_real proc~get0d_hdf5->proc~input_has_key proc~get0d_hdf5->proc~input_str h5close_f h5close_f proc~get0d_hdf5->h5close_f h5dclose_f h5dclose_f proc~get0d_hdf5->h5dclose_f h5dopen_f h5dopen_f proc~get0d_hdf5->h5dopen_f h5dread_f h5dread_f proc~get0d_hdf5->h5dread_f h5fclose_f h5fclose_f proc~get0d_hdf5->h5fclose_f h5fopen_f h5fopen_f proc~get0d_hdf5->h5fopen_f h5ltget_dataset_info_f h5ltget_dataset_info_f proc~get0d_hdf5->h5ltget_dataset_info_f h5open_f h5open_f proc~get0d_hdf5->h5open_f proc~get1d_hdf5->proc~input_has_key proc~get1d_hdf5->proc~input_str proc~get1d_hdf5->h5dclose_f proc~get1d_hdf5->h5dopen_f proc~get1d_hdf5->h5dread_f proc~get1d_hdf5->h5fclose_f proc~get1d_hdf5->h5fopen_f proc~get1d_hdf5->h5ltget_dataset_info_f proc~get2d_hdf5->proc~input_has_key proc~get2d_hdf5->proc~input_str proc~get2d_hdf5->h5dclose_f proc~get2d_hdf5->h5dopen_f proc~get2d_hdf5->h5dread_f proc~get2d_hdf5->h5fclose_f proc~get2d_hdf5->h5fopen_f proc~get2d_hdf5->h5ltget_dataset_info_f proc~input_dict1d->proc~input_has_key proc~input_dict1d->proc~input_node proc~input_dict1d->proc~select_dict proc~input_dict1d->proc~select_list get_string get_string proc~input_dict1d->get_string proc~input_node->get proc~input_node->proc~select_dict proc~dictionary_traverse dictionary_traverse proc~input_node->proc~dictionary_traverse proc~dictionary_traverse->proc~dictionary_traverse get_dictionary get_dictionary proc~dictionary_traverse->get_dictionary proc~abort_if abort_if proc~dictionary_traverse->proc~abort_if

Called by

proc~~signal_init~~CalledByGraph proc~signal_init signal_t%signal_init proc~boundary_init_part1 boundary_init_part1 proc~boundary_init_part1->proc~signal_init proc~channel_init_part1 channel_init_part1 proc~channel_init_part1->proc~signal_init proc~mesh2d_init_part1 mesh2D_init_part1 proc~mesh2d_init_part1->proc~signal_init proc~sim_init simulation_t%sim_init proc~sim_init->proc~signal_init proc~solid_init_part1 solid_init_part1 proc~solid_init_part1->proc~signal_init proc~strand_init_part1 strand_init_part1 proc~strand_init_part1->proc~signal_init program~reims_p reims_p program~reims_p->proc~boundary_init_part1 program~reims_p->proc~channel_init_part1 program~reims_p->proc~mesh2d_init_part1 program~reims_p->proc~sim_init program~reims_p->proc~solid_init_part1 program~reims_p->proc~strand_init_part1

Source Code

subroutine signal_init(me, sim, input_cfg, key, x)
    class(signal_t),             intent(inout) :: me
    type(simulation_t), target, intent(inout) :: sim
    type(input_t),              intent(in)    :: input_cfg
    character(*),               intent(in)    :: key
    real(dp), optional,         intent(in)    :: x(:)

    logical :: explicit
    type(input_t) :: cfg
    integer :: len_int,i,j,repeat_idx,order
    real(dp) :: delta
    real(dp), allocatable :: x_in(:),y_out(:,:)
    character(:), allocatable :: event
    character(:), allocatable :: init_str
    type(str_ptr), allocatable :: keys(:)

    ! if(.not. input_cfg%has_key(key)) ! TODO by Jacek????

    me%sim => sim
    me%x = [0._dp]
    if (present(x)) me%x = x
    me%time   = [-huge(0.0_dp), huge(0.0_dp)]
    me%gain   = spread([0._dp], 1, size(me%x))
    me%offset = spread([0._dp], 1, size(me%x))
    if (.not.input_cfg%has_key(key)) return 

    me%offset = spread([input_cfg%dbl(key,ieee_value(delta, ieee_quiet_nan))], &
                                                                  1, size(me%x))
                                                                 
    if(.not.is_nan(me%offset(1,1))) return

    me%offset(:,1) = input_cfg%dbl1d(key,me%offset(:,1))
    if(.not.is_nan(me%offset(1,1))) return

    cfg = input_cfg%dict(key)
    init_str=cfg%str('external','')
    do i = 1, size(lib_handles)     
        me%init_signal_ext_ptr = GetProcAddress(lib_handles(i),init_str // c_null_char)
        if (c_associated(me%init_signal_ext_ptr)) then
            call c_f_procpointer(me%init_signal_ext_ptr, me%init_signal_ext)
            exit
        endif
    enddo

    if(associated(me%init_signal_ext)) then
      ! serialization
      keys = cfg%keys1d()
      me%cfg_str = ''
      do i = 1, size(keys)
          me%cfg_str = me%cfg_str // keys(i)%p // c_null_char // cfg%str(keys(i)%p) // c_null_char
      end do
      return
    endif

    repeat_idx = cfg%int('repeat',0)
    order = cfg%int('order',0)
    event = cfg%str('event','no')
      
    if(cfg%has_key('time')) then
        me%time = cfg%dbl1d('time')
        if (present(x)) then
            me%offset = cfg%dbl2d('value')
        else
            me%offset = reshape(cfg%dbl1d('value'),[1,size(me%time)])
        endif
    else
        allocate(y_out(size(x),1))
        call interpolate_vector(cfg%dbl1d('x'),cfg%dbl1d('value'),x,y_out(:,1))
        me%offset = y_out
        return
    endif
      
    if(cfg%has_key('x').and.cfg%has_key('time')) then
        x_in = cfg%dbl1d('x')
        allocate(y_out(size(me%x),size(me%offset,2)))
        do i = 1, size(me%offset,2)
            call interpolate_vector(x_in,me%offset(:,i),me%x,y_out(:,i))
        enddo
        me%offset = y_out
    endif
      
    ! Handling repeated time series
    if(repeat_idx>0) then
        do while(me%time(size(me%time))<=me%sim%t_final)
            len_int = size(me%time)
            delta = me%time(len_int) + me%time(repeat_idx)
            me%time = [me%time, me%time(  repeat_idx:len_int) + delta]
            me%offset = reshape([me%offset, me%offset(:,repeat_idx:len_int)], &
                                                    [size(me%x),size(me%time)])
        enddo
    endif
    len_int = size(me%time)
    me%time = [me%time, huge(0._dp)]
    me%gain = spread(me%gain(:,1),2,len_int)
  
    ! Handling the order of interpolation
    if(order == 1) then
        do j = 1,size(me%x)
            me%gain(j,1:len_int-1) = [((me%offset(j,i+1) - &
                me%offset(j,i))/(me%time(i+1) - me%time(i)), i=1, len_int-1)]
            me%gain(j,len_int) = me%gain(j,len_int-1)
            me%offset(j,:) = me%offset(j,:) - (me%gain(j,:) * me%time(1:len_int))
        enddo
    endif
  
    ! Adding events to list
    if     (event == 'explicit') then; explicit = .true.
    elseif (event == 'implicit') then; explicit = .false.
    else; return
    endif
    call merge_events(me%sim%events_time, me%sim%events_expl, me%time, explicit)
end subroutine signal_init