subroutine cost_nd_forward(func,n,lot)
real(8),dimension(:),intent(inout) :: func
integer,intent(in) :: N,lot
real(8),dimension(:),allocatable :: wsave,work
integer :: L,lenwrk,lensav,lenr,inc,ier,jump
L=size(func)
if(mod(N*lot,L)/=0)stop "cost_Nd_forward: incommensurate values of parameters."
!
lenr = N*lot
lenwrk = lot*(N+1)
lensav = 2*N + int(log(dble(N))/log(2.d0)) + 4
jump = N
inc = 1
allocate(wsave(lensav),work(lenwrk))
call costmi(N,wsave,lensav,ier)
if(ier==2)stop "cost_Nd_forward: LENSAV not big enough"
if(ier==20)stop "cost_Nd_forward: error returned by lower level routine"
call costmf(lot,jump,N,inc,func,lenr,wsave,lensav,work,lenwrk,ier)
deallocate(wsave,work)
select case(ier)
case (0)
return
case (1)
stop "cost_Nd_forward: LENR not big enough"
case (2)
stop "cost_Nd_forward: LENSAV not big enough"
case (3)
stop "cost_Nd_forward: LENWRK not big enough"
case (4)
stop "cost_Nd_forward: INC,JUMP,N,LOT are not consistent"
case (20)
stop "cost_Nd_forward: input error returned by lower level routine"
end select
end subroutine cost_nd_forward