this function can be used for continuous output in connection
with the output-subroutine for dop853. it provides an
approximation to the ii
-th component of the solution at x
.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(dop853_class), | intent(in) | :: | me | |||
integer, | intent(in) | :: | ii | |||
real(kind=wp), | intent(in) | :: | x |
function contd8(me,ii,x) result(y)
implicit none
class(dop853_class),intent(in) :: me
integer,intent(in) :: ii
real(wp),intent(in) :: x
real(wp) :: y
real(wp) :: conpar, s, s1
integer :: i,j,nd,ierr
! compute place of ii-th component
i = 0
do j = 1, me%nrdens
if ( me%icomp(j)==ii ) i = j
end do
if ( i==0 ) then
!always report this message, since it is an invalid use of the code.
if (me%iprint==0) then
ierr = error_unit
else
ierr = me%iprint
end if
write (ierr,*) &
' Error in contd8: no dense output available for component:', ii
y = 0.0_wp
else
nd = me%nrdens
s = (x-me%xold)/me%hout
s1 = 1.0_wp - s
conpar = me%cont(i+nd*4) + &
s*(me%cont(i+nd*5)+ &
s1*(me%cont(i+nd*6)+s*me%cont(i+nd*7)))
y = me%cont(i) + &
s*(me%cont(i+nd)+ &
s1*(me%cont(i+nd*2)+&
s*(me%cont(i+nd*3)+s1*conpar)))
end if
end function contd8