|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7680 (0x1e00) Types: TextFile Names: »bshlmproctx«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦80900d603⟧ »giprocfile« └─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦80900d603⟧ »giprocfile« └─⟦this⟧
; bshlmproctx * page 1 26 09 77, 9.41; ; bshlm_proc ; ********** if listing.yes char 10 12 10 bshlm_proc = set 1 bshlm_proc = algol external long procedure bshlm_proc __________________________________ _ (reg_lab, mode, lat, az_dlat, s_dlng, dlng_s, az_2); value mode, lat, az_dlat, s_dlng; array reg_lab; integer mode; long lat, az_dlat, s_dlng, dlng_s, az_2; comment bshlm_proc (return) long result depending on mode. mode = 0 : the difference of latitude in the solution of the first geodetic main problem mode > 0 : the outgoing azimuth from station 1 towards station 2 reg_lab (call) array the values of the semimajor axis of the ellipsoid as a long in units of '-6 m in reg_lab(6), and the flattening as a real in reg_lab(7). the array is not changed by the procedure and no other elements are used mode (call) integer mode < 0 is interpreted as mode = 0. mode = 0 specifies a solution of the first (or direct) main problem. mode > 0 specifies a solution of the second (or inverse) main problem. mode=1 is the shortest line, mode = 2 is the line the other way around the earth. all following odd modes is mode//2 wrap-arounds of mode 1 and similarly for the even modes and mode 2 lat (call) long mode = 0 : the latitude of the station 1 mode > 0 : the m_e_a_n latitude of the stations az_dlat (call) long mode = 0 : the outgoing azimuth mode > 0 : the difference of latitude stat2 minus stat1 s_dlng (call) long mode = 0 : the distance from station 1 to station 2 mode > 0 : the difference of longitude stat2 minus stat1 dlng_s (return) long mode = 0 : the difference of longitude stat2 minus stat1 mode > 0 : the distance between the stat az_2 (return) long the azimuth at stat2 towards stat1; \f comment bshlmproctx * page 2 26 09 77, 9.41 0 1 2 3 4 5 6 7 8 9 ; comment all angles are geotype variables i.e. the interval -pi to pi is mapped on the integer interval -2**47 to 2**47 - 1. all distances are in units of '-6 m; begin real b0, f, e2, n1, B1, A1, S, dB, dL, A2; real procedure RED(a); value a; real a; begin long w; w:= a/rg; RED := w*rg; end RED; real procedure BSHLM1(B1, A1, S, dB, dL, A2); value B1, A1, S; real B1, A1, S, dB, dL, A2; begin real bm, s, S1, SP, PF, k, b1r, b2r, B2, dl, a1, a2, s1sf; array KES, KSE(1:3); integer i; b1r:=red(B1); bm:=bmax(b1r, A1, s1sf, PF, k, KSE); SP:=S/PF; KES(1):=-1+9*(k**2)/16; KES(2):=5*k/8; KES(3):=-29*(k**2)/48; S1:=s1sf+0.5*k*sum(i, KSE(i)*sin(2*i*s1sf)); s:=SP+0.5*k*sum(i, KES(i)*cos(2*i*(S1+SP))*sin(2*i*SP)); B2:=0.5*pi-red(2.0*sftr(A1, 0.5*pi-b1r, 2.0*s, A2, dl)); dL:=RED( dl-2.0*lmbd(s1sf, s, A1, dl, bm, k)); BSHLM1:=dB:=B2-B1; end BSHLM1; real procedure BSHLM2(mode, B, dB, dL, A1, S, A2); value mode, B, dB, dL; real B, dB, dL, S, A1, A2; integer mode; begin real bm, b1r, b2r, s1sf, s, SF, PF, dl, dl1, k, mm2pi, pimode, last_bm; array KSE(1:3); integer i, iter; iter := 0; pimode := (mode//2)*pi; mode := mode - 1; mm2pi := pi*(mode mod 2); b1r:=red(B-0.5*dB); b2r:=red(B+0.5*dB); dL:=RED(0.5*dL); for dl1:=dL, dL+lmbd(s1sf, s, A1, dl, bm, k) while abs(dl - dl1) > (abs dl+ abs s)*'-10 and iter<=10 000, dL + lmbd(s1sf, s, A1, dl, bm, k) do begin iter := iter + 1; if iter mod 1000 = 0 then begin write(out, nl, 1); writegeocr(out, dl1, false add 70); write(out, sp, 4); writegeocr(out, dl-dl1, false add 70); end; dl := if iter<10 then dl1 _ else (0.5*(dl + dl1)); s:=sftr(RED(2*dl), 0.5*pi-b1r, 0.5*pi-b2r, A2, A1); s:=pimode + (if mode mod 2 = 0 then s else -s); A1 := RED(A1 + mm2pi); A2 := RED(A2 + mm2pi); bm:=bmax(b1r, A1, s1sf, PF, k, KSE); last_bm := bm := if iter<10 then bm _ else (0.5*(bm + last_bm)); \f comment bshlmproctx * page 3 26 09 77, 9.41 0 1 2 3 4 5 6 7 8 9 ; if iter mod 1000=0 then begin write(out, nl, 1); writegeocr(out, bm, false add 70); end; end; S:=PF*(s+0.5*k* sum(i, KSE(i)*cos(2.0*i*(s1sf+s))*sin(2.0*i*s))); if iter>=10 000 then S := A1 := A2 := 0; BSHLM2 := A1; end BSHLM2; real procedure sftr(C, a, b, A, B); value C, a, b; real A, B, C, a, b; begin real svscs, svdss, cvscs, cvdss, cosCh, sinCh, sum, dif; sum:=0.5*(a+b); dif:=0.5*(a-b); C:=0.5*C; cosCh:=cos(C); sinCh:=sin(C); svscs:=cosCh*cos(dif); svdss:=cosCh*sin(dif); cvscs:=sinCh*cos(sum); cvdss:=sinCh*sin(sum); sum:=arg(cvscs, svscs); dif:=arg(cvdss, svdss); A:=RED(-sum-dif); B:=RED(sum-dif); sftr:=RED( arg(sqrt(svscs**2+cvscs**2), sqrt(svdss**2+cvdss**2))); end sftr; real procedure red(B); value B; real B; red:=arg(cos(B), (1-f)*sin(B)); real procedure bmax(b1, A1, s1sf, PF, k, KSE); value b1, A1; real b1, A1, s1sf, PF, k; array KSE; begin real c1, sc, ss, cosb1, bm, k1; cosb1:=cos(b1); c1:=abs(sin(A1)*cosb1); sc:=sin(b1); ss:=-cosb1*cos(A1); s1sf:=arg(sc, ss); bmax:=bm:=arg(c1, sqrt(ss**2+sc**2)); k1:=e2*sin(bm)**2/(1-e2*cos(bm)**2)/4.0; k:=k1:=k1*(1+k1*(2.0+k1*(5.0+k1*14.0))); PF:=b0*(2.0+0.5*k1**2)/(1-k1); KSE(1):=1-3*(k1**2)/8; KSE(2):=-k1/8; KSE(3):=(k1**2)/24; end bmax; real procedure sum(i, x); integer i; real x; begin real s; s:=0; for i:=3 step -1 until 1 do s:=s+x; sum:=s; end sum; real procedure lmbd(s1sf, s, A1, dl, bm, k); value s1sf, s, A1, dl, bm, k; real s1sf, s, A1, dl, bm, k; begin real ss; ss:=2*(s1sf + s); lmbd := (if A1 >= 0 then 0.5 else -0.5) *e2*cos(bm)*((n1-k/2*(1+k/2))*s -k/4*(cos(ss)*sin(2*s)-k/4*cos(2*ss)*sin(4*s))); end lmbd; \f comment bshlmproctx * page 4 26 09 77, 9.41 0 1 2 3 4 5 6 7 8 9 ; f := reg_lab(7); b0 := (long reg_lab(6))*'-6*(1-f); e2 := f*(2-f); n1 := 1 + f/(2-f); B1 := lat*rg; if mode <= 0 then begin comment direct problem; A1 := az_dlat*rg; S := s_dlng*'-6; bshlm_proc := BSHLM1(B1, A1, S, dB, dL, A2)/rg; dlng_s := dL/rg; az_2 := A2/rg; end direct probelm else begin comment inverse problem; dB := az_dlat*rg; dL := s_dlng*rg; bshlm_proc := BSHLM2(mode, B1, dB, dL, A1, S, A2)/rg; dlng_s := S*'6; az_2 := A2/rg; end inverse problem; end bshlm_proc; end if warning.yes (mode 0.yes message bshlm_proc not ok lookup bshlmproc) ▶EOF◀