52 SUBROUTINE spline1_fit(n,x,f, &
82 INTEGER,
INTENT(IN) :: &
85 REAL(KIND=rspec),
INTENT(IN) :: &
89 REAL(KIND=rspec),
INTENT(INOUT) :: &
100 INTEGER,
INTENT(IN),
OPTIONAL :: &
126 i,ib,imax,imin,kbc1,kbcn
128 REAL(KIND=rspec) :: &
129 a1,an,b1,bn,el21,elnn1,hn,q,t,wk(1:n)
139 IF(
PRESENT(k_bc1))
THEN
141 IF(k_bc1 >= -1 .AND. &
142 k_bc1 <= 7) kbc1=k_bc1
162 ELSEIF(kbc1 == 2)
THEN
167 ELSEIF(kbc1 == 5)
THEN
170 a1=(f(1,2)-f(1,1))/(x(2)-x(1))
172 ELSEIF(kbc1 == 6)
THEN
175 b1=2*((f(1,3)-f(1,2))/(x(3)-x(2))-(f(1,2)-f(1,1))/(x(2)-x(1)))/(x(3)-x(1))
184 IF(
PRESENT(k_bcn))
THEN
186 IF(k_bcn >= -1 .AND. &
187 k_bcn <= 7) kbcn=k_bcn
195 IF(kbcn == 0) imax=n-1
207 ELSEIF(kbcn == 2)
THEN
212 ELSEIF(kbcn == 5)
THEN
215 an=(f(1,n)-f(1,n-1))/(x(n)-x(n-1))
217 ELSEIF(kbcn == 6)
THEN
220 bn=2*((f(1,n)-f(1,n-1))/(x(n)-x(n-1)) &
221 -(f(1,n-1)-f(1,n-2))/(x(n-1)-x(n-2)))/(x(n)-x(n-2))
236 f(2,1)=(f(1,2)-f(1,1))/(x(2)-x(1))
252 f(3,2)=(f(1,2)-f(1,1))/f(4,1)
257 f(2,i)=2*(f(4,i-1)+f(4,i))
258 f(3,i+1)=(f(1,i+1)-f(1,i))/f(4,i)
259 f(3,i)=f(3,i+1)-f(3,i)
271 f(2,1)=2*(f(4,1)+f(4,n-1))
272 f(3,1)=(f(1,2)-f(1,1))/f(4,1)-(f(1,n)-f(1,n-1))/f(4,n-1)
278 ELSEIF((kbc1 == 1) .OR. &
284 f(3,1)=(f(1,2)-f(1,1))/f(4,1)-a1
286 ELSEIF((kbc1 == 2) .OR. (kbc1 == 4) .OR. (kbc1 == 6))
THEN
293 ELSEIF(kbc1 == 7)
THEN
297 f(3,1)=f(3,3)/(x(4)-x(2))-f(3,2)/(x(3)-x(1))
298 f(3,1)=f(3,1)*f(4,1)**2/(x(4)-x(1))
303 f(2,2)=f(4,1)+2*f(4,2)
304 f(3,2)=f(3,2)*f(4,2)/(f(4,1)+f(4,2))
309 IF((kbcn == 1) .OR. &
315 f(3,n)=-(f(1,n)-f(1,n-1))/f(4,n-1)+an
317 ELSEIF((kbcn == 2) .OR. &
326 ELSEIF(kbcn == 7)
THEN
330 f(3,n)=f(3,n-1)/(x(n)-x(n-2))-f(3,n-2)/(x(n-1)-x(n-3))
331 f(3,n)=-f(3,n)*f(4,n-1)**2/(x(n)-x(n-3))
333 ELSEIF(kbc1 /= -1)
THEN
336 f(2,n-1)=2*f(4,n-2)+f(4,n-1)
337 f(3,n-1)=f(3,n-1)*f(4,n-2)/(f(4,n-1)+f(4,n-2))
357 f(2,i)=f(2,i)-t*f(4,i-1)
358 f(3,i)=f(3,i)-t*f(3,i-1)
359 wk(i)=wk(i)-t*wk(i-1)
362 f(2,n-1)=f(2,n-1)-q*wk(i-1)
363 f(3,n-1)=f(3,n-1)-q*f(3,i-1)
368 wk(n-1)=wk(n-1)+f(4,n-2)
373 f(2,n-1)=f(2,n-1)-t*wk(n-2)
374 f(3,n-1)=f(3,n-1)-t*f(3,n-2)
377 f(3,n-1)=f(3,n-1)/f(2,n-1)
378 f(3,n-2)=(f(3,n-2)-wk(n-2)*f(3,n-1))/f(2,n-2)
383 f(3,i)=(f(3,i)-f(4,i)*f(3,i+1)-wk(i)*f(3,n-1))/f(2,i)
396 IF((i == n-1) .AND. &
399 t=(f(4,i-1)-f(4,i))/f(2,i-1)
419 IF((i == imin+1) .AND. &
422 f(2,i)=f(2,i)-t*(f(4,i-1)-f(4,i-2))
426 f(2,i)=f(2,i)-t*f(4,i-1)
430 f(3,i)=f(3,i)-t*f(3,i-1)
435 f(3,imax)=f(3,imax)/f(2,imax)
444 f(3,i)=(f(3,i)-(f(4,i)-f(4,i-1))*f(3,i+1))/f(2,i)
448 f(3,i)=(f(3,i)-f(4,i)*f(3,i+1))/f(2,i)
459 IF((kbc1 <= 0) .OR. &
462 f(3,1)=(f(3,2)*(f(4,1)+f(4,2))-f(3,3)*f(4,1))/f(4,2)
467 IF((kbcn <= 0) .OR. &
470 f(3,n)=f(3,n-1)+(f(3,n-1)-f(3,n-2))*f(4,n-1)/f(4,n-2)
480 f(2,i)=(f(1,i+1)-f(1,i))/f(4,i)-f(4,i)*(f(3,i+1)+2*f(3,i))
481 f(4,i)=(f(3,i+1)-f(3,i))/f(4,i)
498 f(2,n)=f(2,n-1)+hn*(f(3,n-1)+hn*f(4,n-1)/2)
499 f(3,n)=f(3,n-1)+hn*f(4,n-1)
502 IF((kbcn == 1) .OR. &
509 ELSEIF((kbcn == 2) .OR. &
522 END SUBROUTINE spline1_fit
524 SUBROUTINE spline1_eval(k_vopt,n,u,x,f, &
544 INTEGER,
INTENT(IN) :: &
550 REAL(KIND=rspec),
INTENT(IN) :: &
556 INTEGER,
INTENT(INOUT) :: &
561 REAL(KIND=rspec),
INTENT(OUT) :: &
572 REAL(KIND=rspec) :: &
578 CALL spline1_search(x,n,u, &
606 IF(k_vopt(1) /= 0)
THEN
609 value(j)=f(1,i)+dx*(f(2,i)+dx/2*(f(3,i)+f(4,i)*dx/3))
614 IF(k_vopt(2) /= 0)
THEN
617 value(j)=f(2,i)+dx*(f(3,i)+f(4,i)*dx/2)
622 IF(k_vopt(3) /= 0)
THEN
625 value(j)=f(3,i)+dx*f(4,i)
629 END SUBROUTINE spline1_eval
631 SUBROUTINE spline1_interp(k_vopt,n0,x0,f,n1,x1,value, &
643 INTEGER,
INTENT(IN) :: &
651 REAL(KIND=rspec),
INTENT(IN) :: &
656 REAL(KIND=rspec),
INTENT(INOUT) :: &
668 CHARACTER(len=*),
INTENT(OUT) :: &
671 INTEGER,
INTENT(OUT) :: &
677 REAL(KIND=rspec),
INTENT(OUT) :: &
685 INTEGER,
INTENT(IN),
OPTIONAL :: &
720 message=
'SPLINE1_INTERP/WARNING(1):no points in output array'
729 message=
'SPLINE1_INTERP/ERROR(2):<2 points in source array'
737 IF(
PRESENT(k_bc1) .AND. &
740 CALL spline1_fit(n0,x0,f, &
744 ELSEIF(
PRESENT(k_bc1))
THEN
746 CALL spline1_fit(n0,x0,f, &
749 ELSEIF(
PRESENT(k_bcn))
THEN
751 CALL spline1_fit(n0,x0,f, &
756 CALL spline1_fit(n0,x0,f)
767 CALL spline1_eval(k_vopt,n0,x1(j),x0,f,i,value(1:3,j))
776 END SUBROUTINE spline1_interp
778 SUBROUTINE spline1_integ(k_order,n0,x0,f,n1,x1, &
792 INTEGER,
INTENT(IN) :: &
798 REAL(KIND=rspec),
INTENT(IN) :: &
806 CHARACTER(len=*),
INTENT(OUT) :: &
809 INTEGER,
INTENT(OUT) :: &
815 REAL(KIND=rspec),
INTENT(OUT) :: &
823 REAL(KIND=rspec) :: &
830 IF(n1 <= 0)
GOTO 9999
851 IF(x1(i) < x0(j+1))
THEN
858 ELSEIF(x1(i) == x0(j+1))
THEN
865 ELSEIF(x1(i) > x0(j+1))
THEN
877 IF(k_order == 1)
THEN
880 add= dx*(xold*f(1,j) &
881 +dx*((xold*f(2,j)+f(1,j))/2 &
882 +dx*((xold*f(3,j)/2+f(2,j))/3 &
883 +dx*((xold*f(4,j)/3+f(3,j))/8 &
889 add=dx*(f(1,j)+dx*(f(2,j)+dx*(f(3,j)+dx*f(4,j)/4)/3)/2)
904 message=
'LINEAR1_INTEG/ERROR:target node out of range'
921 END SUBROUTINE spline1_integ
923 SUBROUTINE spline1_search(x,n,xl, &
937 INTEGER,
INTENT(IN) :: &
940 REAL(KIND=rspec),
INTENT(IN) :: &
945 INTEGER,
INTENT(INOUT) :: &
969 ELSEIF(xl <= x(2))
THEN
977 ELSEIF(xl <= x(n))
THEN
998 DO WHILE(xl > x(jhi))
1012 DO WHILE(xl <= x(jlo))
1025 DO WHILE(jhi-jlo > 1)
1029 IF(xl > x(jmid))
THEN
1050 END SUBROUTINE spline1_search
1052 END MODULE spline1_mod