This commit is contained in:
cvs
2002-08-22 13:16:56 +00:00
parent 615a1e3634
commit c95a7bbd9f

711
tecs/tecs_plot.f Normal file
View File

@ -0,0 +1,711 @@
subroutine tecs_plot(auxpar)
character(len=*) auxpar
integer dmax, nmax, tmax, amax, nmenu, chartperiod, naux
parameter (dmax=400, nmax=9, tmax=8, amax=3, nmenu=13, chartperiod=5, naux=1)
integer minRange, maxRange, oneDay
parameter (minRange=60, maxRange=7*24*3600, oneDay=24*3600)
integer zoom, right, live
parameter (zoom=1, right=2, live=3)
real winmin, undef
parameter (winmin=60., undef=-1.125/1024./1024./1024.)
real*4 x1,x2,xmin,xmax,ymin(2),ymax(2),window
real*4 xd(dmax, nmax),yd(dmax,nmax), yy0(nmax), yy1(nmax)
real*4 ylast1,ylast2,y1,y2
real*4 ex,ey,fx,fy,row,ticks,tim0,tim1,menuwid
integer l,j,i,n,t,leng,i1,i2,rl,startday,thisday
integer ncol, nset, mode
integer first,last,step,tbase,lastj
integer colorList(nmax)/5,3,2,4,6,8,14,15,8/
integer color(nmax)
integer retLen(nmax)
integer sel/0/, sel1, sel2, auxsel/1/
character key*1
character text(2,nmenu)*16/ &
'L' ,'live off' &
,'z' ,'sel. zoom' &
,'+' ,'zoom in' &
,'-' ,'zoom out' &
,'x' ,'show all' &
,'2d' ,'2 days' &
,'1h' ,'1 hour' &
,'15m' ,'15 min' &
,'31.7t','goto date' &
,'c' ,'show P/He/Aux' &
,'s' ,'select T' &
,'f' ,'write file' &
,'q' ,'quit'/
character weekdays(7)*4/'Mon','Tue','Wed','Thu','Fri','Sat','Sun'/
character buf*8, device*8, name*40, filnam*128, numb*16, title*64, pars*64
character(len=4) tpar(tmax)/'Te', 'Tr', 'Tm', 'Ts', 'T1', 'T2', 'T3', 'T4'/
character(len=4) apar(amax)/'P', 'He', 'Aux'/
character(len=16) parnam(nmax)
logical gap, done
logical saveit
integer iret, lund, numl, mon, day
integer pars_len, title_len, text_len, name_len
! functions
integer sys_gmt_off, myc_now, myc_time, myc_date, get_data, tecs_get_mult, tecs_get_par
data window/0./
if (window==0) window=1800.
saveit=.false.
mode=live
call pgopen(' ')
call pgqinf('TYPE', device, l)
if (device=='NULL') then
call pgclos
call pgopen('?')
call pgqinf('TYPE', device, l)
if (device=='NULL') then
print *,'No PGPLOT-Device defined'
goto 9
endif
endif
call pgqcol(i,ncol)
! print *,i,ncol,' colors ',device
if (ncol>=8 .and. device /= 'VT125') then
call pgscr(0, 1.0, 1.0, 1.0)
call pgscr(1, 0.0, 0.0, 0.0)
call pgscr(2, 1.0, 0.0, 0.0)
call pgscr(3, 0.0, 1.0, 0.0)
call pgscr(4, 0.0, 0.0, 1.0)
call pgscr(5, 0.0, 1.0, 1.0)
call pgscr(6, 1.0, 0.0, 1.0)
call pgscr(7, 1.0, 1.0, 0.0)
call pgscr(8, 1.0, 0.5, 0.0)
endif
call pgask(.false.)
call pgupdt
l=0
x1=0
step=0
do i=1,amax
if (auxpar == apar(i)) then
auxsel=i
endif
enddo
1 pars=' '
nset=0
do i=1,tmax
nset=nset+1
color(nset)=colorList(i)
parnam(nset)=tpar(i)
call str_trim(pars, pars, pars_len)
pars=pars(1:pars_len)//' '//parnam(nset)
enddo
nset=nset+1
color(nset)=colorList(3)
parnam(nset)=apar(auxsel)
call str_trim(pars, pars, pars_len)
pars=pars(1:pars_len)//' '//parnam(nset)
iret=tecs_get_mult(pars, t, nset, yy0)
if (iret < 0) goto 99
if (window == 0) then
last=t
step=maxRange/dmax
window=maxRange
first=t-min(dmax*step-1,maxRange-step)
else if (mode >= right) then
step=window/(dmax-2)+0.99
last=t
first=t-min(dmax*step-1,nint(window))
else
if (mode==zoom) then
x2=(x1+x2+window)/2
x1=x2-window
endif
if (x1 .gt. x2-minRange) x1=x2-minRange
step=(x2-x1)/(dmax-2)+0.99
last=x2+tbase
first=x1-step+tbase
endif
if (step == 0) step=1
if (step>60) then ! normalize step
step=(step+59)/60*60
else if (step>30) then
step=60
elseif (step>20) then
step=30
else
step=(step+4)/5*5
endif
first=last-(last-first+step-1)/step*step ! round first
! print *,step,last-first
tbase=first-mod(first,7*oneDay)
iret=get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retLen)
if (iret < 0) goto 99
x2 = last - tbase
if (mode >= right) then
x1=x2-window
else
x1 = first - tbase
endif
tim0=t-tbase
do i=1,nset
leng=retLen(i)
do while (leng > 1 .and. yd(leng,i) == undef)
leng=leng-1
enddo
if (leng == 1) leng=0
retLen(i)=leng
if (mode==live .and. leng>0) then
xd(leng,i)=tim0
yd(leng,i)=yy0(i)
endif
enddo
if (sel /= 0) then
do while (sel < nset .and. retLen(sel) == 0)
sel=sel+1
enddo
if (sel >= nset) sel = 0
endif
if (saveit) goto 9
if (mode==live) then
x2=max(tim0,x2)+min(1800., window*0.5)
endif
if (window>50*3600) then
ticks=8*3600
elseif (window>25*3600) then
ticks=4*3600
else
ticks=0.0 ! automatic
endif
i1=1
i2=nset-naux
if (sel==0) then
sel1=i1
sel2=i2
else
sel1=sel
sel2=sel
endif
do rl=1,2
if (mode==zoom .and. rl==1) then
ymin(1)=y1
ymax(1)=y2
else
ymin(rl)=1e30
ymax(rl)=-1e30
ylast1=ymin(rl)
ylast2=ymax(rl)
do i=sel1,sel2
do j=1,retLen(i)
if (yd(j,i)/=undef) then
ymin(rl)=min(ymin(rl),yd(j,i))
ymax(rl)=max(ymax(rl),yd(j,i))
endif
enddo
do j=max(1,retLen(i)-4),retLen(i)
if (yd(j, i)/=undef) then
ylast1=min(ylast1,yd(j, i))
ylast2=max(ylast2,yd(j, i))
endif
enddo
enddo
ey=(ymax(rl)-ymin(rl))
fy=abs(ymax(rl))
ymax(rl)=ymax(rl)+max(fy*0.0075,ey*0.01)
ymin(rl)=ymin(rl)-max(fy*0.005,ey*0.01)
if (mode==live) then
ymin(rl)=min(ymin(rl),max(0.0,ylast1-ey*0.4))
ymax(rl)=max(ymax(rl),ylast2+ey*0.4)
endif
endif
if (ymax(rl) < ymin(rl)) then
ymax(rl)=1.0
ymin(rl)=0
elseif (ymax(rl) == ymin(rl)) then
ymax(rl)=ymin(rl)*1.00001+1.0
ymin(rl)=-1.0e-3
endif
call set_win(rl,x1,x2,ymin(rl),ymax(rl))
do i=i1,i2
call pgsci(color(i))
l=0
lastj=1
do j=1,retLen(i)
if (yd(j,i)==undef) then
if (j>lastj) then
call pgline(j-lastj, xd(lastj,i), yd(lastj,i))
endif
lastj=j+1
else
l=j
endif
enddo
if (retLen(i) > lastj) call pgline(retLen(i)+1-lastj, xd(lastj,i), yd(lastj,i))
retLen(i)=l
enddo
call pgsci(1)
if (rl == 1) then
call pgsch(1.0)
call pgtbox('ZHXYBINST', ticks, 0, 'BCINMST', 0.0, 0)
call pgtbox('C', 0.0, 0, ' ', 0.0, 0)
ey=0.0
do i=i1,i2
if (retLen(i) > 0) then
name=parnam(i)
if (name=='Tm') then
name='Main Sensor'
elseif (name=='Ts') then
name='Sample Sensor'
elseif (name=='Tr') then
name='SetPoint'
endif
call str_trim(name, name, name_len)
if (sel == i) then
name=name(1:name_len)//'*'
call str_trim(name, name, name_len)
endif
call pglen(5, name(1:name_len), fx, fy)
call pgsci(color(i))
call pgmtxt ('L', 2.5, ey, 0.0, name(1:name_len))
ey=ey+fy+0.04
endif
enddo
call pgsci(1)
call pgmtxt ('L', 2.5, ey, 0.0, 'T [K]')
else
call pgsch(0.7)
call pgtbox('ZCIST', ticks, 0, 'BCVINMST', 0.0, 0)
call pgtbox('B', 0.0, 0, ' ', 0.0, 0)
call pgsci(color(nset))
call pgsch(1.0)
if (parnam(nset) == 'P' .or. parnam(nset) == 'p') then
call pgmtxt ('L', 2.5, 0.5, 0.5, 'Power [W]')
elseif (parnam(nset) == 'He') then
title='%'
iret=tecs_get_par('heUnits', title, 0)
call str_trim(title, title, title_len)
call pgmtxt ('L', 2.5, 0.5, 0.5, 'Helium ['//title(1:title_len)//']')
else
call pgmtxt ('L', 2.5, 0.5, 0.5, parnam(nset))
endif
endif
i1=nset-naux+1
i2=nset
sel1=i1
sel2=i2
enddo
call pgsch(0.7)
rl=1
call set_win(rl,x1,x2,ymin(rl),ymax(rl))
call pgsci(1)
call pgsclp(0)
if (mode==live) then
text(2,1)='live off'
else
text(2,1)='live on'
endif
text(2,10)='show '//apar(mod(auxsel,3)+1)
menuwid=0.0
do i=1,nmenu
call str_trim(text(2,i), text(2,i), text_len)
call pglen(5, text(2,i)(1:text_len), fx, fy)
call pgmtxt('T', 3.0, menuwid, 0.0, '|'//text(1,i))
call pgmtxt('T', 2.5, menuwid, 0.0, '|')
call pgmtxt('T', 2.0, menuwid, 0.0, '|'//text(2,i))
menuwid=menuwid+fx+0.01
enddo
call pgmtxt('T', 3.0, menuwid, 0.0, '|')
call pgmtxt('T', 2.5, menuwid, 0.0, '|')
call pgmtxt('T', 2.0, menuwid, 0.0, '|')
menuwid=menuwid+0.01
call pgsch(0.8)
done=.false.
row=(ymax(rl)-ymin(rl))/30.
ey=ymin(rl)-row*3.5
i=max(0,int((x1+oneDay/2)/oneDay))
do
ex=(i+0.5)*oneDay
if (ex > x2) EXIT
done=.true.
write(buf,'(i8.8)') myc_date(nint(ex)+tbase)
call pgptxt(ex, ey, 0.0, 0.5, weekdays(mod(i,7)+1)//buf(7:8)//'.'//buf(5:6))
ex=ex-12*3600
if (ex > x1) then
call pgmove(ex, ey)
call pgdraw(ex, ey+row)
endif
ex=ex+oneDay
if (ex < x2) then
call pgmove(ex, ey)
call pgdraw(ex, ey+row)
endif
i=i+1
enddo
if (.not. done) then
n=nint(x2)/oneDay*oneDay
i=nint(x1)-n
j=nint(x2)-n
if (i < 0) then
if (-i > j) then
ex=0.0
i=nint(x1)+tbase
else
ex=1.0
i=nint(x2)+tbase
endif
else
ex=0.5
i=nint(x2)+tbase
endif
thisday=mod(i/oneDay,7)+1
write(buf,'(i8.8)') myc_date(i)
! call pgptxt((x1+x2)/2, ey, 0.0, ex, weekdays(mod(thisday,7)+1)//buf(7:8)//'.'//buf(5:6))
call pgmtxt('B', 3.5, ex, ex, weekdays(thisday)//buf(7:8)//'.'//buf(5:6))
endif
iret=tecs_get_par('device', title, 0)
if (iret < 0) goto 99
i=index(title, '(')
if (i > 2 ) then
title=title(1:i-1)
else
title='test - no device'
endif
call pgmtxt('T', -1.5, 0.02, 0.0, title)
call pgsclp(1)
call purge_keys ! purge buffer
numl=0
numb=' '
7 ex=undef
if (mode==live) then
! if (device(1:1)=='X') then
! call pgmtxt('T', 0.5, 0.0, 0.0, 'LIVE MODE (click on text window before pressing any further key)')
! endif
! call get_key(key, 0, chartperiod)
i=chartperiod-mod(myc_now(), chartperiod)
call get_cursor(ex, ey, key, -i)
do while (key == char(0) .or. key == ' ') ! no key or space key pressed
iret=tecs_get_mult(pars, t, nset, yy1)
if (iret<0) goto 99
tim1=t-tbase
if (tim1 > x2) then
call pgpage
window=x2-x1
goto 1
endif
if (tim1 > tim0) then
i1=1
i2=nset-naux
do rl=1,2
call set_win(rl,x1,x2,ymin(rl),ymax(rl))
do i=i1,i2
if (yy0(i) /= undef .and. yy1(i) /= undef) then
if ((sel==0 .or. sel==i) .and. (yy1(i) < ymin(rl) .or. yy1(i) > ymax(rl))) then
call pgpage
window=x2-x1
goto 1
endif
call pgsci(color(i))
call pgmove(tim0, yy0(i))
call pgdraw(tim1, yy1(i))
endif
yy0(i)=yy1(i)
enddo
i1=nset-naux+1
i2=nset
enddo
tim0=tim1
endif
i=chartperiod-mod(myc_now(), chartperiod)
call get_cursor(ex, ey, key, -i)
enddo
else
call get_cursor(ex, ey, key, 0)
endif
rl=1
call set_win(rl,x1,x2,ymin(rl),ymax(rl))
8 if (key>='a') key=char(ichar(key)-32)
if (key=='-') then
window=min(window*2, 8.0*oneDay)
if (mode==zoom) then
x1=x1-(x2-x1)/2
x2=x2+(x2-x1)/3
y1=y1-(y2-y1)/2
y2=y2+(y2-y1)/3
endif
elseif (key=='X') then
window=0
mode=0
elseif (key=='+' .or. key==',') then
window=max(winmin,window/2)
if (mode==zoom) then
if (ex==undef) then
ex=(x1+x2)/2
ey=(min(y2,ymax(1))+max(y1,ymin(1)))/2
end if
fx=max(winmin,x2-x1)
fy=max(y2-y1,1e-3,y2*1e-5)
x1=ex-fx/4
x2=ex+fx/4
y1=ey-fy/4
y2=ey+fy/4
endif
elseif (key=='Z') then
call pgsci(1)
if (ex==undef) then
call pgmtxt('T', 0.5, 0.0, 0.0, 'click on two opposite corners of a selection rectangle')
call get_cursor(ex, ey, key, 0)
else
call pgmtxt('T', 0.5, 0.0, 0.0, 'click on second corner of selection rectangle')
endif
call pgsci(6)
xmin=x1
xmax=x2
call pgmove(xmin, ey)
call pgdraw(xmax, ey)
call pgmove(ex, ymin(rl))
call pgdraw(ex, ymax(rl))
if (device(1:1) .eq. 'X') then
fx=ex
fy=ey
call get_cursor(fx, fy, key, 2)
else
call get_cursor(fx, fy, key, 0)
endif
x1=max(xmin,min(ex,fx))
x2=min(xmax,max(ex,fx))
if (x1>=x2) then
x1=xmin
x2=xmax
endif
window=x2-x1
y1=max(ymin(1),min(ey,fy))
y2=min(ymax(1),max(ey,fy))
if (y1>=y2) then
y1=ymin(1)
y2=ymax(1)
endif
mode=zoom
elseif (key >= '0' .and. key <= '9' .or. key == '.') then ! number
if (numl .lt. len(numb)) then
numl=numl+1
numb(numl:numl)=key
call pgsci(1)
call pgsch(0.8)
call pgmtxt('T', 2.0, menuwid, 0.0, numb(1:numl))
endif
! call get_cursor(ex, ey, key, -chartperiod)
! if (key/=char(0)) goto 8
if (mode==zoom) mode=0
goto 7
elseif (key == 'D') then
ex=1
read(numb, *, iostat=i) ex
window=min(maxRange,max(minRange, nint(oneDay*ex)))
if (mode < right) mode=right
x1=0
elseif (key == 'H') then
ex=1
read(numb, *, iostat=i) ex
window=min(maxRange,max(minRange, nint(3600*ex)))
if (mode < right) mode=right
x1=0
elseif (key == 'M') then
ex=1
read(numb, *, iostat=i) ex
window=min(maxRange,max(minRange, nint(60*ex)))
if (mode < right) mode=right
x1=0
elseif (key == 'T' .or. numl>0 .and. (key==char(13) .or. key==char(10))) then
j=index(numb,'.')
day=0
if (j > 1 .and. j < numl) then
read(numb(1:j-1), *, iostat=i) day
mon=0
read(numb(j+1:numl), *, iostat=i) mon
tbase = myc_time(day+mon*100)
else
read(numb, *, iostat=i) day
tbase = myc_time(day)
endif
x1=0
x2=oneDay
window=x2
mode=0
elseif (key == 'L') then
if (mode == live) then
mode=right
else
mode=live
endif
elseif (key == 'F') then
saveit=.true.
elseif (key=='Q' .or. key==char(13) .or. key==char(10)) then
goto 9
elseif (key == 'S') then
sel=sel+1
if (sel > tmax) sel=0
if (mode==zoom) mode=0
elseif (key == 'C') then
auxsel=auxsel+1
if (auxsel > amax) auxsel=1
elseif (mode==live) then
goto 7
endif
numl=0
numb=' '
call pgpage
goto 1
99 call tecs_write_msg(6)
9 continue
call pgclos
call purge_keys
print *
if (saveit) then
lund=41
print '(x,a,$)', 'Filename: '
read(*,'(a)') filnam
open(lund, file=filnam, status='unknown') ! , carriagecontrol='list')
l=0
i2=0
do i1=1,nset
if (i1 > nset-naux) then
j=i1
else
j=nset-i1+(1-naux)
endif
gap=.false.
do i=1,retLen(j)
if (yd(i,j)==undef) then
if (gap) then
write(lund, '(f9.4,2a)') xd(i,j)/3600., char(9), ' '
gap=.false.
endif
else
if (i2/=i1) then
if (l > 0) write(lund, *)
call str_trim(parnam(j), parnam(j), text_len)
write(lund, *) ' time [h]',char(9), ' ',parnam(j)(1:text_len)
l=l+1
i2=i1
endif
write(lund, '(f9.4,a,f9.4)') xd(i,j)/3600., char(9), max(-999.,min(9999.,yd(i,j)))
l=l+1
gap=.true.
endif
enddo
enddo
close(lund)
print *, l, ' lines written to ',filnam(1:48)
endif
end subroutine
subroutine get_cursor(x, y, key, mode)
character*1 key
real*4 x, y
integer mode
integer with_timeout/-1/
integer l
character res*32
if (with_timeout<0) then
with_timeout=0
call pgqinf('VERSION', res, l)
if (res(l:l)=='+') then
call pgqinf('TYPE', res, l)
if (res(1:1)=='X') then
with_timeout=1
end if
end if
end if
if (with_timeout>0 .or. mode>=0) then
call pgband(mode, 0, x, y, x, y, key)
else
call sys_get_key(key, -mode)
endif
end subroutine
subroutine purge_keys
character key*1
key=' '
do while (key/=char(0))
call sys_get_key(key, 0)
end do
end subroutine
subroutine set_win(rl, x1, x2, y1, y2)
integer rl
real x1, x2, y1, y2
if (rl == 1) then
call pgsvp(0.07,0.93,0.3,0.9)
else
call pgsvp(0.07,0.93,0.01,0.20)
endif
call pgswin(x1,x2,y1,y2)
end subroutine
integer function get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retlen)
character pars*(*)
integer first, last, step, tbase, dmax, nmax, retlen(nmax)
real*4 xd(dmax,nmax), yd(dmax,nmax)
integer oneDay, maxn
parameter (oneDay = 24*3600, maxn=9)
integer tecs_get_data
integer i,j,rl(maxn),m,k,n,mm
if (nmax > maxn) stop 'get_data: nmax>maxn'
if (last-first <= oneDay) then
get_data=tecs_get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retLen)
else
do j=1,nmax
retlen(j)=0
enddo
m=0
do i=first/oneDay,last/oneDay
get_data=tecs_get_data(pars, max(first,i*oneDay), min(last,(i+1)*oneDay-step), step, tbase &
, xd(m+1, 1), yd(m+1, 1), dmax, nmax, rl)
if (get_data<0) return
mm=0
do j=1,nmax
n=retlen(j)
do k=m+1,m+rl(j)
n=n+1
xd(n,j)=xd(k,j)
yd(n,j)=yd(k,j)
enddo
retlen(j)=n
mm=max(mm,n)
enddo
! print *,mm-m,' points read'
m=mm
enddo
endif
end function