首先,我已经编写了这段代码,并且运行良好。
program test
implicit none
integer i,n
real dl, lambda
real tr, top, bot
integer, parameter :: imax = 1e4
real wl(50), f(50)
character infile*15, outfile*15
n=25
open(15,file='t1.txt')
open(16,file='out.txt')
do i = 1, n
read(15,*,end=100) wl(i), f(i)
enddo
100 continue
close(15)
top = 0
bot = 0
dl = (wl(n) - wl(1)) / real(imax)
do i = 0, imax-1
lambda = wl(1) + dl*i
call linear(lambda,wl,f,n,tr)
top = top + lambda*tr*dl
bot = bot + tr*dl
enddo
write(16,*) top/bot
stop
end
subroutine linear(xp,wl,f,n,yp)
implicit none
intent (in) :: xp,wl,f,n
intent (out) :: yp
integer, parameter :: imax = 1e4
real wl(50), f(50)
real xp,yp
integer i,n
do 10 i=1, n-1
if (xp .ge. wl(i) .and. xp .lt. wl(i+1)) then
yp = f(i)+((f(i+1)-f(i))/(wl(i+1)-wl(i)))*(xp-wl(i))
endif
10 enddo
return
end subroutine
此代码的作用是首先从t1.txt中读取数据并应用插值,
然后使用这些插值数据执行集成。
例如,wl(25)是最大值,而wl(1)是最小值。
通过使用最小值和最大值,我可以找到dl。
因此代码运行良好,没有任何错误。
(顺便说一句,在子例程中,我使用wl(50)和f(50)的原因是我只是随机声明了大于25的数据量,即t1.txt的行数)
但是,问题是我还有其他输入文件,例如t2.txt,t3.txt等。
文件的数据数量不同,这意味着
t1.txt具有25行wl和f
t2.txt有27行
...等等
要使集成部分适用于其他文件,我需要代码来查找最大数量 和最小wl自动将其分别应用于wl(n)和wl(1)。
因此,无论文件有多少行,集成部分都将始终有效。 (换句话说,我不必说n = 25的最大值,而用wl(1)的最小值)
我知道有一些可以找到最大值的东西,例如maxval(a), 但我认为我无法将其应用于此代码。
如果适合我想做的事,如何使用maxval?