Razdely
11. Prilozhenie E
11.1. Teksty programm na yazyke FORTRAN 90
Listing E 3.1. Modul' chteniya kataloga Hipparcos
MODULE HipMain IMPLICIT NONE ! Raspolozhenie polnoi versii kataloga Hipparcos CHARACTER(*), PARAMETER :: HipparcosName ='D:/HIP/hip\_main.dat' INTEGER, PARAMETER :: HipNumOfStars = 118218 ! Chislo zvezd INTEGER, PARAMETER :: u = 10 ! Nomer faila TYPE THipparcos SEQUENCE INTEGER(4) :: HIP ! Nomer zvezdy po Hipparocs ! Astrometricheskaya informaciya REAL(8) :: RAdeg,DEdeg ! ekvatorial'nye koordinaty v gradusah REAL(8) :: Plx ! trigonometricheskii parallaks v mas REAL(8) :: pmRa,pmDE ! sobstvennye dvizheniya ma*cos(d) i md CHARACTER(1) :: AstroRef ! Flag dlya kratnyh sistem ! Fotometricheskaya informaciya REAL(4) :: VMag ! Zvezdnaya vel. po shkale Dzhonsona REAL(4) :: B\_V ! Pokazatel' cveta B-V po shkale Dzhonsona ! Oshibki sootvetstvuyushih velichin REAL(8) :: sigma\_RAdeg,sigma\_DEdeg REAL(8) :: sigma\_Plx REAL(8) :: sigma\_pmRa,sigma\_pmDE CHARACTER(10) Sp ! Razvernutyi spektral'nyi klass LOGICAL NoRaDe ! Net dannyh o tochnyh koordinatah LOGICAL NoPlx ! Net dannyh o parallakse LOGICAL Nopm ! Net dannyh o sobstvennyh dvizheniyah LOGICAL NoVMag ! Net dannyh o zvezdnoi velichine LOGICAL NoB\_V ! Net dannyh o pokazatele cveta END TYPE THipparcos CONTAINS SUBROUTINE OpenHipparcosMain ! Otkrytie faila kataloga OPEN(u, file = HipparcosName) END SUBROUTINE OpenHipparcosMain SUBROUTINE CloseHipparcosMain ! Zakrytie faila kataloga CLOSE(u) END SUBROUTINE CloseHipparcosMain LOGICAL FUNCTION ReadHipparcosMain(s) ! Chtenie dannyh o zvezde TYPE(THipparcos), INTENT(out) :: s CHARACTER(450) hs ! Zapis' stroki kataloga IF (EOF(u)) THEN ReadHipparcosMain=.false. RETURN ELSE ReadHipparcosMain=.true. END IF READ(u,'(A450)') hs ! Chtenie odnoi stroki kataloga ! Sbrasyvaem flagi sobytii s.NoRaDe = .False. s.NoPlx =.False. s.Nopm =.False. s.NoVMag =.False. s.NoB\_V =.False. ! Interpretaciya s 12 bait, nachinaya s 3-go - eto nomer HIP read(hs(3:14),*) s.hip ! Chtenie koordinat: po 12 bait s 52 i s 65 pozicii ! Funkciya TRIM udalyaet iz stroki probely, a LEN vozvrashaet dlinu ! stroki, sootvetstvenno, esli eto 0, to v stroke tol'ko probely IF (LEN(TRIM(hs(52:63))) == 0) THEN s.NoRaDe=.true. s.RADeg=0.0 ! na vsyakii sluchai zapisyvaem 0 ELSE READ(hs(52:63),*) s.RAdeg END IF IF (LEN(TRIM(hs(65:76))) == 0) THEN s.NoRaDe=.true. s.DEDeg=0.0 ELSE read(hs(65:76),*) s.DEdeg END IF ! Chtenie parallaksa - 7 bait s 80-i pozicii IF (LEN(TRIM(hs(80:86))) == 0) THEN s.NoPlx=.true. s.Plx=0.0 ELSE read(hs(80:86),*) s.Plx END IF ! Chtenie sobstvennyh dvizhenii: po 8 bait s 88 i s 97 pozicii IF (LEN(TRIM(hs(88:95))) == 0) THEN s.NoPM=.true. s.pmRA=0.0 ELSE read(hs(80:86),*) s.pmRA END IF IF (LEN(TRIM(hs(88:95))) == 0) THEN s.NoPM=.true. s.pmDE=0.0 ELSE read(hs(97:104),*) s.pmDE END IF s.AstroRef=hs(78:78) ! Flag kratnoi zvezdy ! Chtenie zv.velichiny i pokazatelya cveta B-V po shkale Dzhonsona IF (LEN(TRIM(hs(42:46))) == 0) THEN s.NoVMag=.true. s.VMag=0.0 ELSE read(hs(42:46),*) s.VMag END IF IF (LEN(TRIM(hs(246:251))) == 0) THEN s.NoB\_V=.true. s.B\_V=0.0 ELSE read(hs(246:251),*) s.B\_V END IF ! Dannye ob oshibkah vsegda est', esli prisutstvuyut sami velichiny IF (.NOT. s.NoRADE) THEN read(hs(106:111),*) s.sigma\_RAdeg read(hs(113:118),*) s.sigma\_DEdeg ENDIF IF (.NOT. s.NoPlx) THEN read(hs(120:125),*) s.sigma\_Plx END IF IF (.NOT. s.Nopm) THEN read(hs(127:132),*) s.sigma\_pmRA read(hs(134:139),*) s.sigma\_pmDE END IF s.Sp=hs(436:445) ! Chtenie dannyh o spektral'nom klasse END FUNCTION ReadHipparcosMain END MODULE HipMain
Listing E 3.2. Podschet zvezd bez dannyh o koordinatah, sobstvennyh dvizheniyah i parallaksah
PROGRAM Test2 USE HipMain INTEGER(4) :: NoCoord = 0 ! Schetchik zvezd bez tochnyh koordinat INTEGER(4) :: NoProp = 0 ! Schetchik zvezd bez sobstv. dvizhenii INTEGER(4) :: NoPar = 0 ! Schetchik zvezd bez parallaksov TYPE(THipparcos) :: s CALL OpenHipparcosMain DO WHILE (ReadHipparcosMain(s)) ! Sravnenie logicheskih peremennyh IF (s.NoRADE) NoCoord= NoCoord+1 IF (s.Nopm) NoProp = NoProp+1 IF (s.NoPlx) NoPar = NoPar+1 END DO CALL CloseHipparcosMain print *,'No coord ',NoCoord print *,'No PM ',NoProp print *,'No Par ',NoPar read *,i END PROGRAM Test2
Listing E 3.3. Vychislenie raspredeleniya zvezd po absolyutnoi zvezdnoi velichine
PROGRAM AbsMagDistrib USE HipMain INTEGER, PARAMETER :: LOW = -12, HIGH=+12 TYPE(THipparcos) :: s; INTEGER(4) :: a(-12:+12) ! statistika INTEGER(4) :: i ! vspomogatel'naya peremennaya REAL(8) :: r ! rasstoyanie REAL(8) :: m ! absolyutnaya zvezdnaya velichina FORALL (i=-12:+12) A(i)=0 CALL OpenHipparcosMain(); DO WHILE (ReadHipparcosMain(s)) IF (s.NoPlx) CYCLE ! net dannyh o parall. IF (s.Plx<=0.0) CYCLE ! nepolozhitel'nyi parallaks IF (s.sigma\_plx/s.plx>0.5) CYCLE ! tochnost' huzhe 50\% r=1000.0/s.plx; ! Vychislenie rasstoyaniya v pk m=S.VMag-5.0*log10(r)+5.0 ! Vychisl. absolyutnoi zvezd. velichiny i=FLOOR(m+0.5) ! Opredelenie indeksa yacheiki massiva IF ( (i>=low) .and. (i<=high)) a(i)=a(i)+1 ! uv.na 1 END DO CALL CloseHipparcosMain() PRINT '(I3,1X,I7)',(i,a(i),i=-12,12) READ *,i END PROGRAM
Listing E 3.4. Vychislenie srednei absolyutnoi zvezdnoi velichiny zvezd, spisok kotoryh nahoditsya v faile lumin.txt
PROGRAM AVER
Use HipMain
TYPE(THipparcos) s
REAL(8) :: r ! rasstoyanie
REAL(8) :: m ! absolyutnaya zvezdnaya velichina
REAL(8) :: mav = 0.0 ! srednyaya absolyutnaya zvezdnaya velichina
INTEGER(4) :: n = 0 ! kolichestvo podhodyashih zvezd
CALL OpenHipparcosMain
! Inicializaciya kriteriya
print '(I6 " zvezd v kriterii.")',InitCriteria('lumin.txt')
DO WHILE (ReadHipparcosMain(s))
IF (s.NoPlx) CYCLE ! net dannyh o parall.
IF (s.plx<=0.0) CYCLE ! nepolozhitel'nyi parallaks
r=1000.0/s.plx ! Vychislenie rasstoyaniya v pk
m=S.VMag-5.0*log10(r)+5.0 ! Vychisl. abs. zvezd. velichiny
IF (inCelestia(s.HIP)) THEN ! Zvezda v spiske Celestia
mav=mav+m ! nakoplenie summy abs. zv. velichin
n=n+1 ! summirovanie chisla zvezd
END IF
END DO
CALL ClearCriteria ! Ochistka kriteriya
CALL CloseHipparcosMain
mav=mav/n ! Vychislenie srednego znacheniya
print '("Srednyaya absolyutnaya zvezdnaya velichina ",F6.2,".")',mav
print '("Obrabotano ",I6," zvezd.")',n
END PROGRAM
Listing E 3.5. Ishodnyi tekst funkcii InitCriteria, InCelestia, ClearCriteria
Dobavleniya v razdel opisanii modulya HipMain
INTEGER(4), ALLOCATABLE :: List(:) INTEGER(4) :: NList = 0
Dobavleniya v razdel procedur modulya HipMain
INTEGER(4) FUNCTION InitCriteria(name)
CHARACTER (*) :: name
INTEGER, PARAMETER :: t = 11 ! fail
INTEGER(4) :: i ! indeks dlya cikla do
OPEN(t, file = name, mode='read') ! Otkryvaem fail
DO i=1,2 ! Propusk dvuh pervyh strok
READ(t,*)
END DO
READ(t,*) NList ! V tret'ei stroke - kolichestvo zvezd
PRINT *,NList
ALLOCATE(List(NList)) ! Vydelenie pamyati pod spisok
DO i=4,12 ! Propusk s 4 po 12 stroku
READ(t,*)
END DO
DO i=1,NList ! Chtenie nomerov zvezd
READ(t,'(2X,I12)') List(i)
END DO
CLOSE(t)
InitCriteria=NList
END FUNCTION InitCriteria
! Ochistka kriteriya
SUBROUTINE ClearCriteria
DEALLOCATE(List)
NList=0
END SUBROUTINE ClearCriteria
! Funkciya proveryaet, est' li zvezda v spiske
LOGICAL FUNCTION InCelestia(n)
INTEGER(4) :: n
INTEGER(4) :: i
InCelestia=.false. ! ob'ekt poka ne naiden
IF (NList==0) return ! esli kriterii ne ustanovlen - vyhod
DO i=1,NList ! obhod zvezd v cikle do
IF (List(i)==n) THEN ! esli zvezda naidena v spiske
InCelestia=.true.
EXIT ! dosrochno prervat' cikl
END IF
END DO
END FUNCTION InCelestia
Listingi E 4.1-4.3. Procedury perevoda koordinat i otrisovki koordinatnoi setki (Perevod v ekrannye koordinaty ne trebuetsya, poskol'ku v standartnoi biblioteke fortrana mozhno vybrat' lyubuyu udobnuyu dekartovu sistemu s veshestvennymi znacheniyami koordinat)
MODULE Projection
USE DFLIB
IMPLICIT NONE
REAL(8), PARAMETER :: PI = 3.1415926535897932384626433832795
CONTAINS
SUBROUTINE Aitoff(l,b,x,y)
REAL(8), INTENT(IN) :: l,b ! Sfericheskie koordinaty v radianah
REAL(8), INTENT(OUT) :: x,y ! Dekartovy koordinaty
REAL(8) :: s, l1 ! Vspomogatel'nye peremennye
IF (l>PI) THEN ! Privedenie l v diapazon -Pi do +Pi
l1=l-2*Pi
ELSE
l1=l
END IF
S=sqrt(1.0+cos(b)*cos(l1/2)) ! Znamenatel' formul (4.1)
x=-2*cos(b)*sin(l1/2)/s
y=sin(b)/s
END SUBROUTINE Aitoff
REAL(8) FUNCTION radi(x) ! Perevod gradusov v radiany
INTEGER, INTENT(IN) :: x
radi=x/180.0*PI
END FUNCTION radi
REAL(8) FUNCTION rad(x) ! Perevod gradusov v radiany
REAL(8), INTENT(IN) :: x
rad=x/180.0*PI
END FUNCTION rad
SUBROUTINE AitoffGrid (Step,Gr)
INTEGER, INTENT(IN) :: Step ! Shag setki v gradusah
LOGICAL, INTENT(IN) :: Gr ! Flag - v gradusah ili v chasah
INTEGER :: i,j ! Peremennye ciklov do
REAL(8) :: l,b ! Galakticheskie koordinaty
REAL(8) :: x,y ! Dekartovy koordinaty
CHARACTER(8) s ! Stroka dlya podpisei
INTEGER :: h ! Dlya razmetki osei
TYPE (wxycoord) wxy
INTEGER(2) :: status2
INTEGER(4) :: status4
! Nanesenie setki meridianov
status4 = SetColorRGB({\#00FF00)
DO i=-180,+180,Step
l=radi(i) ! Perevod v radiany
DO j=-90,+90,5 ! Cikl postroeniya vdol' meridiana
! Vychislenie tochki meridiana
b=radi(j) ! Perevod v radiany shiroty
CALL Aitoff(l,b,x,y) ! Perevod v dekartovy koordinaty
! Esli tochka pervaya (j=-90), to pomeshaem graficheskii kursor
! v tochku (x,y) funkciei MoveTo\_W, esli tochka ne pervaya, to
! "procherchivaem" kursorom liniyu iz predydushei tochki
! v tochku (u,v) funkciei LineTo\_W.
IF (j==-90) THEN
CALL MoveTo\_W(x,y,wxy)
ELSE
status2=LineTo\_W(x,y);
END IF
END DO ! j
END DO ! i
! Nanesenie setki parallelei - analogichno predydushemu
DO j=-90,+90,Step
b=radi(j)
DO i=-180,+180,5 ! cikl postroeniya vdol' paralleli
l=radi(i)
CALL Aitoff(l,b,x,y);
IF (i==-180) THEN
CALL MoveTo\_W(x,y,wxy)
ELSE
status2=LineTo\_W(x,y)
END IF
END DO ! i
END DO ! j
status2=SetFont('t"Arial"h10')
status4 = SetColorRGB({\#FFFFFF)
! Podpisi meridianov vdol' ekvatora
DO i=-180,+180,Step
! Vychislenie koordinaty tochki vyvoda nadpisi
l=Radi(i);
CALL Aitoff(l,0.0\_8,x,y)
! Esli Gr istina, to razmetka v gradusah, inache - v chasah
IF (Gr) THEN
h=i
ELSE
h=i/15
IF (h<0) h=h+24;
END IF
write(s,'(I4)') h ! Preobrazovanie znacheniya h v tekst. stroku
Call MoveTo\_W(x, y, wxy)
Call OUTGTEXT(s)
END DO
! Podpisi parallelei vdol' nulevogo meridiana - analogichno
DO j=-90,+90,Step
IF (j /= 0) THEN ! Ekvator ne podpisyvaem
b=Radi(j);
CALL Aitoff(0.0\_8,b,x,y)
write(s,'(I4)') j
Call MoveTo\_W(x, y, wxy)
Call OUTGTEXT(s)
END IF
END DO
END SUBROUTINE AitoffGrid
SUBROUTINE Galaxy(a,d,l,b)
REAL(8), INTENT(in) :: a,d
REAL(8), INTENT(out) :: l,b
REAL(8) :: a1,sa,ca,sd,cd
REAL(8), PARAMETER :: Leo = 4.936829261 ! 282.85948083
REAL(8), PARAMETER :: L0 = 0.57477039907 ! 32.931918056
REAL(8), PARAMETER :: si = 0.88998807641 ! sin 62.871748611
REAL(8), PARAMETER :: ci = 0.45598379779 ! cos 62.871748611
a1=a-Leo
sa=sin(a1); ca=cos(a1)
sd=sin(d); cd=cos(d)
b=asin(sd*ci-cd*si*sa)
l=atan2(sd*si+cd*ci*sa,cd*ca)+L0
END SUBROUTINE Galaxy
END MODULE
Listing E 4.4. Postroenie raspredeleniya zvezd po nebesnoi sfere
Program Main
USE DFLIB
USE HipMain
USE Projection
IMPLICIT NONE
! Fizicheskoe razreshenie okna
INTEGER, PARAMETER :: MaxX = 1000, MaxY = 500
REAL(8), PARAMETER :: LowX = -2.1 , LowY = -1.05 ! Logicheskie
REAL(8), PARAMETER :: HighX= +2.1 , HighY= +1.05 ! koordinaty
REAL(8) :: l, b ! Galakticheskie koordinaty
REAL(8) :: x, y ! Dekartovy koordinaty
LOGICAL :: status1 ! Vspomogatel'nye velichiny
INTEGER(2) :: status2
INTEGER(4) :: status4
INTEGER(4) :: color ! Cvet zvezdy
TYPE(THipparcos) :: s
TYPE (windowconfig) :: wc ! Svoistva graficheskogo okna
TYPE (wxycoord) :: wxy ! Vspomogatel'naya velichina
wc.numxpixels = MaxX ! Zapolnenie struktury svoistv okna
wc.numypixels = MaxY
wc.numtextcols = -1
wc.numtextrows = -1
wc.numcolors = -1
wc.title = "Aitoff"C
wc.fontsize = \#0008000C ! 10 X 12
status1 = SETWINDOWCONFIG(wc) ! Inicializaciya grafiki
IF (.NOT. status1) status1 = SETWINDOWCONFIG(wc)
status2=SetWindow(.TRUE.,LowX, LowY, HighX, HighY)
status2=INITIALIZEFONTS( )
CALL AitoffGrid(30,.TRUE.)
CALL OpenHipparcosMain() ! Otkrytie kataloga i
status4=InitCriteria('I-II.txt') ! inicializaciya kriteriya
do while (ReadHipparcosMain(s)) ! Cikl chteniya zvezd
IF (inCelestia(s.HIP)) THEN ! Proverka kriteriya
SELECT CASE(S.SP(1:1)) ! Opredelenie cveta zvezdy
CASE ('O')
color = RGBTOINTEGER(90,64,255)
CASE ('B')
color = RGBTOINTEGER(128,128,255)
CASE ('A')
color = RGBTOINTEGER(255,255,255)
CASE ('F')
color = RGBTOINTEGER(255,255,128)
CASE ('G')
color = RGBTOINTEGER(255,230,40)
CASE ('K')
color = RGBTOINTEGER(255,160,0)
CASE ('M')
color = RGBTOINTEGER(255,0,0)
CASE default
color=0
END SELECT
! Perevod ekvatorial'nyh koordinat v radiany,
! a zatem v galakticheskie koordinaty
CALL Galaxy(rad(s.RADeg),rad(s.DEDeg),l,b)
! Vychislenie dekartovyh koordinat proekcii Aitofa
CALL Aitoff(l,b,x,y)
! Postavit' tochku (mozhno zamenit' na krug)
status4=SetPixelRGB\_w(x,y,color)
END IF
END DO
CALL ClearCriteria()
CALL CloseHipparcosMain()
! Sohranit' izobrazhenie v faile
status4=SaveImage("Aitoff.bmp"C,0,0,MaxX-1,Maxy-1)
END PROGRAM
Listing E 4.5. Formirovanie pryamougol'nyh koordinat zvezd
PROGRAM Main
USE HipMain
IMPLICIT NONE
CHARACTER(*),PARAMETER :: Criteria='O-B5' ! Imya faila kriteriya
INTEGER(4) :: n = 0 ! Schetchik
Type(THipparcos) :: s
REAL(8) :: r ! Rasstoyanie
REAL(8) :: l, b ! Galakticheskie koordinaty
REAL(8) :: x,y,z ! Dekartovy galakticheskie koordinaty
INTEGER, PARAMETER :: f = 14 ! Fail vyvoda rezul'tatov
OPEN(f, file=Criteria // '.DAT')
CALL OpenHipparcosMain()
! Fail spiska zvezd imeet rasshirenie .TXT
PRINT "(I6,' zvezd v kriterii')",InitCriteria(Criteria//'.txt')
do while (ReadHipparcosMain(s))
IF (s.NoPlx) CYCLE ! net dannyh o parall.
IF (s.plx<=0.0) CYCLE ! "plohoe" znachenie parallaksa
IF (s.sigma\_plx/s.plx>0.5) CYCLE ! nizkaya tochnost' par.
IF (inCelestia(s.HIP)) THEN
r=1000.0/s.plx ! Vychislenie rasstoyaniya v pk
IF (r>500.0) CYCLE ! Otbros dalekih zvezd
! Perevod v galakticheskie koordinaty
CALL Galaxy(rad(s.RADeg),rad(s.DEDeg),l,b)
x=r*cos(b)*cos(l) ! Vychislenie pryamougol'nyh
y=r*cos(b)*sin(l) ! galakticheskih koordinat
z=r*sin(b)
write(f,'(3F10.2)'), x,y,z ! Vyvod v fail
n=n+1 ! Uvelichenie schetchika na edinicu
END IF
END do
CALL ClearCriteria()
CALL CloseHipparcosMain()
Close(f)
print '(I6,"zvezd obrabotano.")',n
END PROGRAM
<< 10. Prilozhenie D | Oglavlenie | Literatura >>
|
Publikacii s klyuchevymi slovami:
astrometriya - katalogi - Hipparcos
Publikacii so slovami: astrometriya - katalogi - Hipparcos | |
Sm. takzhe:
Vse publikacii na tu zhe temu >> | |