home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
HAMRADIO
/
MICROMUF.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
2000-06-30
|
8KB
|
275 lines
PROGRAM MICROMUF (INPUT,OUTPUT);
{Micromuf - A program to computer the minimum and maximum usable frequencies
of a shortwave path between two specified coordinates. }
CONST PI = 3.14159265;
I = 'INVALID';
VAR a,n,yt,xt,yr,xr,r,x,h,y,u,q,la,ls,hp,sf,fe,se,re,cp,k,l,xz,mf,ff :REAL;
xh,z,fo,yf,ty,tl,yg,zo,yz,yn,yi,xn,sx,xs,wx,lh,lm,ab,rd,d,ex,man :REAL;
transmitter,receiver : string[20];
m,mh,ve,ho,t :integer;
correct :boolean;
key : char;
Function power(man,ex:real):real;
Begin
power:=EXP(ex*LN(man));
End;
Procedure interlat; { Intermediate Latitude & Longitude calculations }
Begin
q:=cos(u*rd)*cos(xt*rd)*sin(k*lm*rd);
x:=q+sin(xt*rd)*cos(k*lm*rd);
xn:=(arctan(x/sqrt(-x*x+1+1E-12)))*d;
q:=(cos(k*lm*rd)-sin(xt*rd)*sin(xn*rd));
yi:=(-arctan(x/sqrt(-x*x+1+1E-12))+(PI/2))*d;
if u < 180.0 then yi:=-yi;
yn:=yt+yi;
if yn > 180.0 then yn:=yn-360.0;
if yn <-180.0 then yn:=yn+360.0;
End;
Procedure mini_f2;
Begin
yz:=yn;
If yn<-160.0 then yz:=yn+360.0;
yg:=(20.0-yz)/50.0;
zo:=20.0*yg/(1+yg+sqr(yg))+5.0*sqr(1-yg/7.0);
z:=xn-zo;
tl:=t-yn/15.0;
if tl > 24.0 then tl:=tl-24.0;
if tl < 0.0 then tl:=tl+24.0;
mh:=m;
If z <= 0.0 then
Begin
z:=-z;
mh:=mh+6;
End;
xh:=cos(30.0*(mh-6.5)*rd); { 1 week delay on equinoxes }
sx:=(abs(xh)+xh)/2.0; { F-layer local summer variance}
wx:=(abs(xh)-xh)/2.0; { F-layer local winter variance}
If z > 77.5 then z:= 77.5;
ty:=tl;
If ty < 5.0 then ty:=tl+24.0;
yf:=(ty-14.0-sx*2.0+wx*2.0-r/175.0)*(7.0-sx*3.0+wx*4.0-r/(150.0-wx*75.0));
If abs(yf) > 60.0 then yf:=60.0;
x:=(1+r/(175.0+sx*175.0));
fo:=6.5*x*cos(yf*rd)*sqrt(cos((z-sx*5.0+wx*5.0)*rd));
ex:=-0.5;
sf:=power((1.0-sqr(cos(a*rd)*6367.0/(6367.0+h))),ex);
ff:=fo*sf;
End;
Procedure e_layer;
Begin
q:=sin(xn*rd)*sin(xs*rd);
x:=q+cos(xn*rd)*cos(xs*rd)*cos((yn-15.0*(t-12.0))*rd);
xz:=(-arctan(x/sqrt(-x*x+1+1E-12))+PI/2)*d;
If xz <= 85.0 then
Begin
ex:=(1.0/3.0);
fe:=3.4*(1.0+0.0016*r)*power(cos(xz*rd),ex);
End
Else
Begin
ex:=-0.5;
fe:=3.4*(1.0+0.0016*r)*power((xz-80.0),ex);
End;
se:=power(1.0-0.965*sqr(cos(a*rd)),ex);
ls:=0.028*sqr(fe)*se;
End;
Begin { Main Program }
rd:=PI/180;
d:=180/PI;
correct:=FALSE;
ClrScr;
Writeln (' *** MICROMUF *** ');
Writeln;
Writeln (' This program calculate the :');
Writeln (' * M. U. F. (Maximum Usable Frequency)');
Writeln;
Writeln (' * L. U. F. (Lowest Usable Frequency)');
Writeln;
Writeln (' of any shortwave sky-wave path.');
Writeln;
Writeln (' Calculations can be done for any month and sunspot number.');
Writeln;
Writeln;
Writeln ('Name transmitter location');
Readln (transmitter);
Writeln;
Repeat;
Writeln ('Transmitter longitude in degrees. (W=+, E=-)');
Readln (yt);
If (yt >=-180.0) and (yt <= 180.0) Then correct:=TRUE
Else Writeln(I);
Until correct = TRUE;
correct:=FALSE;
Writeln;
Repeat;
Writeln ('Transmitter lattitude in degrees. (N=+, S=-)');
Readln(xt);
If (xt >= -90.0) and (xt <= 90.0) Then correct:=TRUE
Else Writeln(I);
Until correct = TRUE;
correct:=FALSE;
Writeln;
Writeln ('Name receiver location.');
Readln(receiver);
Writeln;
Repeat;
Writeln ('Receiver longitude in degrees. (W=+, E=-)');
Readln(yr);
If (yr >= -180.0) and (yr <=180.0) Then correct:=TRUE
Else Writeln(I);
Until correct = TRUE;
correct:=FALSE;
Writeln;
Repeat;
Writeln ('Receiver lattitude in degrees. (N=+, S=-)');
readln(xr);
If (xr >=-90.0) and (xr<=90.0) Then correct:=TRUE
Else Writeln(I);
Until correct = TRUE;
correct:=FALSE;
Writeln;
Repeat;
Writeln ('Sunspot number.');
Readln (r);
If (r >= 1.0) and (r <=180.0) Then correct:=TRUE
Else Writeln(I);
Until correct = TRUE;
correct:=FALSE;
Writeln;
Repeat;
Writeln ('Month.');
Readln (m);
If (m >= 1) and (m <= 12) Then correct:=TRUE
Else Writeln(I);
Until correct = TRUE;
{ Geometry Calculations }
q:=sin(xt*rd)*sin(xr*rd);
x:=q+cos(xt*rd)*cos(xr*rd)*cos(yt*rd-yr*rd);
la:=(-arctan(x/sqrt(-x*x+1+1E-12))+(PI/2))*d;
l:=111.1*la;
q:=(sin(xr*rd)-sin(xt*rd)*cos(la*rd));
x:=q/cos(xt*rd)/sin(la*rd);
u:=(-arctan(x/sqrt(-x*x+1+1E-12))+(PI/2))*d;
If yt-yr <= 0 Then u:=360-u;
h:=275+r/2;
xs:=23.4*cos(30*(m-6.25)*rd);
n:=n+1;
lh:=l/n;
While lh > 4500.0 Do
Begin
n:=n+1;
lh:=l/n;
End; { While }
lm:=la/n;
a:=(arctan((cos(0.5*lm*rd)-6367.0/(h+6367.0))/sin(0.5*lm*rd)))*d;
While a < 1.5 Do
Begin
n:=n+1;
lh:=lh/n;
While lh > 4500.0 Do
Begin
n:=n+1;
lh:=l/n;
End; { While }
lm:=la/n;
a:=(arctan((cos(0.5*lm*rd)-6367.0/(h+6367.0))/sin(0.5*lm*rd)))*d;
End;
{ Plot chart on screen }
ClrScr;
Writeln ('From: ',transmitter,' to: ',receiver);
Write ('Month: ',m);
Writeln (' SSN: ',r:3:0,' Dist: ',Round(l+0.5),' KM');
Writeln ('Azim: ',Round(u+0.5),' degrees. F-hops: ',n:4:2);
ve:=4;
ho:=1;
GotoXY(ho,ve);
q:=34.0;
While q >=2.0 Do
Begin
Writeln ('I I',q:2:0); { 25 spaces }
q:=q-2.0;
End; { While }
Writeln ('---------------------------'); { 27 dashes }
Writeln (' 0 2 4 6 8 10 14 18 22 H (UTC)');
Writeln (' +: MUF -: LUF');
ve:=4;
ho:=32;
GotoXY(ho,ve);
Writeln ('mHz');
For t:=1 to 24 Do
Begin
ab:=0.0;
k:=0.5;
interlat;
mini_f2;
mf:=ff;
k:=n-0.5;
interlat;
mini_f2;
If ff < mf then mf := ff;
ve:=21-Round(mf/2.0+0.5);
ho:=t+1;
if ve < 4 then ve:=4;
GotoXY(ho,ve);
Writeln ('+');
While k <= n-0.25 Do
Begin
interlat;
e_layer;
ab:=ab+ls;
k:=k+0.5;
End;
ve:=20-Round(ab+0.5);
If ve < 4 Then ve:=4;
If ve > 20 Then ve:=20;
GotoXY(ho,ve);
Writeln('-');
End;
Writeln;
Writeln;
Writeln;
Writeln;
Writeln;
Write (' ----- Press a key to continue ----- ');
Readln (key);
End.
{ This program uses 'MINI-F2' devised by R. Fricker (BBC external
services) for FO-F calculations and L.M. Muggleton's formula for
FO-E calculations.
For the L.U.F. a minimum useable fieldstrength of 30 DBUV at the
receiver and 250 KW of transmitter power (aerial gain: 18 DBI) are
assumed. The L.U.F. is derived from absorption calculations based
on the work of Piggot, George, Samuel, and Bradley. In spite of the
program's simplicity it gives a good impression of the ionosphere's
behaviour and can be used for propagation predictions.
Hans Bakhuizen
Propagation Unit; Frequency Bureau
Radio Netherlands
P.O. Box 222
1200 JG Hilversum Holland
(C) Copyright Media Network June 1984
Translation from Basic into TURBO Pascal by Jonathan D Ogden on
September 26, 1986.
Jonathan D Ogden
402 e Daniel
Champaign, Il 61820 USA
}