|
|
1.1 root 1: # simple contour plotting
2: # connect-the-dots, rather than approximate hyperbolas.
3: # contour (implicitly) perturbed downward by infinitesimal.
4: # extensively revised 12 Apr 1985
5: # added NaN 9 Jul 1985
6:
7: procedure g2co(w,d,n1,n2,f,nc,cl,NaN)
8: integer n1, n2, j0, j1, j2, nc
9: real w(6), d(2,2), f(n1,n2), cl(nc)
10: real c, dx(2), ll(2), NaN
11: integer j, jj, xp, nt
12: real fl, fh, t(2,4)
13: real swap
14: real xx(2,60)
15: dx(1)=(d(1,2)-d(1,1))/(n1-1)
16: dx(2)=(d(2,2)-d(2,1))/(n2-1)
17: xp=0
18: do j0 = 1,nc{
19: c=cl(j0)
20: do j1 = 1,n1-1{
21: ll(1)=d(1,1)+(j1-1)*dx(1)
22: do j2 = 1,n2-1{
23: ll(2)=d(2,1)+(j2-1)*dx(2)
24: #write(,j1:i(4),j2:i(4))
25: #write(,f(j1,j2+1):f(7,1),f(j1+1,j2+1):f(7,1))
26: #write(,f(j1,j2 ):f(7,1),f(j1+1,j2 ):f(7,1))
27:
28: # find intersections of contours with sides
29: nt=0
30: # ... west ...
31: fl=f(j1,j2)
32: fh=f(j1,j2+1)
33: if(fl<=NaN) next
34: if(fh<=NaN) next
35: if( (c-fl)*(c-fh)<0 |
36: c==fl & fh<c |
37: c==fh & fl<c ){
38: nt=nt+1
39: t(1,nt)=0
40: t(2,nt)=(c-fl)/(fh-fl)
41: }
42: # ... north ...
43: fl=fh
44: fh=f(j1+1,j2+1)
45: if(fh<=NaN) next
46: if( (c-fl)*(c-fh)<0 |
47: c==fl & fh<c |
48: c==fh & fl<c ){
49: nt=nt+1
50: t(1,nt)=(c-fl)/(fh-fl)
51: t(2,nt)=1
52: }
53: # ... south ...
54: fl=f(j1,j2)
55: fh=f(j1+1,j2)
56: if(fh<=NaN) next
57: if( (c-fl)*(c-fh)<0 |
58: c==fl & fh<c |
59: c==fh & fl<c ){
60: nt=nt+1
61: t(1,nt)=(c-fl)/(fh-fl)
62: t(2,nt)=0
63: }
64: # ... east ...
65: fl=fh
66: fh=f(j1+1,j2+1)
67: if( (c-fl)*(c-fh)<0 |
68: c==fl & fh<c |
69: c==fh & fl<c ){
70: nt=nt+1
71: t(1,nt)=1
72: t(2,nt)=(c-fl)/(fh-fl)
73: }
74:
75: # swap north and south to correctly match with east and west
76: if(nt==4){
77: if( t(1,2)>t(1,3) |
78: (t(1,2)==t(1,3) & f(j1,j2)<f(j1+1,j2)) ){
79: swap=t(1,2)
80: t(1,2)=t(1,3)
81: t(1,3)=swap
82: swap=t(2,2)
83: t(2,2)=t(2,3)
84: t(2,3)=swap
85: }
86: }
87:
88: if ( nt==2 | nt==4 ){
89: do jj=1,nt/2{
90: j=2*jj-1
91: if( t(1,j+1)!=t(1,j) | t(2,j+1)!=t(2,j) ){
92: xp=xp+2
93: xx(1,xp-1)=ll(1)+dx(1)*(t(1,j))
94: xx(2,xp-1)=ll(2)+dx(2)*(t(2,j))
95: xx(1,xp)=ll(1)+dx(1)*(t(1,j+1))
96: xx(2,xp)=ll(2)+dx(2)*(t(2,j+1))
97: }
98: }
99: }else if( nt!=0 ){
100: write(,"can't happen! nt=",nt,j1,j2)
101: write(,f(j1,j2+1),f(j1+1,j2+1))
102: write(,f(j1,j2 ),f(j1+1,j2 ))
103: stop
104: }
105:
106: if(xp>=50){
107: g2la(w,xx,xp)
108: xp=0
109: }
110:
111: } # do j2
112: } # do j1
113:
114: if(xp>0){
115: g2la(w,xx,xp)
116: xp=0
117: }
118: } # do j0
119: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.