diff options
Diffstat (limited to 'synthe/rotate.for')
-rw-r--r-- | synthe/rotate.for | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/synthe/rotate.for b/synthe/rotate.for new file mode 100644 index 0000000..fee679f --- /dev/null +++ b/synthe/rotate.for @@ -0,0 +1,378 @@ + PROGRAM ROTATE +c revised 4nov14 constants given D exponents +c revised 18jan05 +c default radius is 100 pixels instead of 50 +c differential rotation put in using solar expression +c VROT(LAT2)=(462-75*SIN(LAT)**2)-50*SIN(LAT)**4)*2*PI*RSUN/1.E9/1.E5 KM/S +c VROT(0)= 2.020 km/s equator +c VROT(1)= 1.474 km/s pole +c VROT(LAT)/VROT(0) = (1-75./462.*SIN(LAT)**2)-50./462.*SIN(LAT)**4) +c from Libbrecht, K.G. and Morrow, C.A. The solar rotation. pp. 479-500 in +c The Solar Interior and Atmosphere, eds. A.N. Cox, W.C. Livingston, and +c M. Matthews, Tucson: University of Arizona Press, 1991. +c All input rotation velocities are equitorial. Differential rotation +c velocities are specified by making the velocity negative. +c Thus 2 produces the approximate solar rotation, -2 produces the +c approximate solar differential rotation, and -2.020 +c matches the solar differential rotation expression above. +c + parameter (npiece=2000,npiece2=npiece*2,npiece3=npiece*3) + COMMON /HROT/H(500),HROT(npiece3) + COMMON /WT/MUNWT(10000),IVNWT(10000),WTNWT(10000) + DIMENSION CONT(npiece2) + DIMENSION WTMU(100) + DIMENSION XMU100(100),INT100(102) + EQUIVALENCE (INT100(101),FLUX),(INT100(102),CONTIN) + DIMENSION R(25),INTEN(26),XX(26) + REAL*8 TEFF,GLOG,TITLE(74),WBEGIN,RESOLU,XMU(20),WLEDGE(377) + REAL*8 QMU(40),Q2(2) + REAL*8 LINDAT8(14) + REAL*4 LINDAT(28) + REAL INT100 + REAL INTEN +C REAL*8 WEND + REAL*8 WEND,RATIO + DIMENSION VROT(25) + EQUIVALENCE (DUMMY,IDUMMY) + CHARACTER*5 ROTNAME(25) + DIMENSION APLOT(101) + DATA APLOT/101*1H / + DATA ROTNAME/'ROT1','ROT2','ROT3','ROT4','ROT5','ROT6','ROT7', + 1'ROT8','ROT9','ROT10','ROT11','ROT12','ROT13','ROT14','ROT15', + 2'ROT16','ROT17','ROT18','ROT19','ROT20','ROT21','ROT22', + 3'ROT23','ROT24','ROT25'/ + DO 7 I=1,100 + 7 XMU100(I)=FLOAT(I)*.01-.005 + LINOUT=30000 + LINOUT=300 + READ(5,1001)NROT,NRADIUS,(VROT(IROT),IROT=1,NROT) + 1001 FORMAT(I5,I5/(8F10.1)) +C IF(NRADIUS.EQ.0)NRADIUS=50 + IF(NRADIUS.EQ.0)NRADIUS=100 + WRITE(6,1002)NROT,NRADIUS,(VROT(IROT),IROT=1,NROT) + 1002 FORMAT(18H1ROTATION ,I3,I5,10F6.1/(10F6.1)) + REWIND 1 + READ(1)TEFF,GLOG,TITLE,WBEGIN,RESOLU,NWL,IFSURF,NMU,XMU,NEDGE,WLEDGE +C IFSURF=3 FOR ROTATED SPECTRUM + IFSURF=3 + WRITE(6,1010)TEFF,GLOG,TITLE + 1010 FORMAT( 5H TEFF,F7.0,7H GRAV,F7.3/7H TITLE ,74A1) + WRITE(6,1007)NMU,(XMU(IMU),IMU=1,NMU) + 1007 FORMAT(18H SURFACE INTENSITY,I3,10F6.3/10F6.3) + RATIO=1.+1./RESOLU + WEND=WBEGIN*RATIO**(NWL-1) + VSTEP=299792.458D0/RESOLU + WRITE(6,1005)WBEGIN,WEND,RESOLU,VSTEP + 1005 FORMAT(2F12.5,F12.1,F12.5) + NMU2=NMU+NMU +C + XX(1)=0. + NM1=NMU+1 + DO 11 MU=1,NMU + NN=NMU-MU+2 + 11 XX(NN)=XMU(MU) + CALL WTROT(0.,0.,0,NWT,WTMU,NRADIUS) + WRITE(6,777)WTMU + 777 FORMAT(1P10E12.3) + INTEN(1)=0. + DO 19 IWL=1,NWL + READ(1)(QMU(I),I=1,NMU2) + FLUX=0. + CONTIN=0. + DO 13 MU=1,NMU + NN=NMU-MU+2 + 13 INTEN(NN)=QMU(MU+NMU) + IDUMMY=MAP1(XX,INTEN,NM1,XMU100,INT100,100) + DO 14 I=1,100 + 14 CONTIN=CONTIN+INT100(I)*WTMU(I) + DO 15 MU=1,NMU + NN=NMU-MU+2 + 15 INTEN(NN)=QMU(MU) + IDUMMY=MAP1(XX,INTEN,NM1,XMU100,INT100,100) + DO 16 I=1,100 + 16 FLUX=FLUX+INT100(I)*WTMU(I) + WRITE(19)INT100 + 19 CONTINUE + NMU=1 +C + DO 500 IROT=1,NROT + OPEN(UNIT=9,NAME=ROTNAME(IROT),FORM='UNFORMATTED',STATUS='NEW') + REWIND 19 + VEL=ABS(VROT(IROT)) + NV=VEL/VSTEP+1.5 + NAV=NV/5+1 + NAVWT=NAV + ENDWT=0. + IF(MOD(NAV,2).EQ.0)ENDWT=.5 + IF(MOD(NAV,2).EQ.0)NAV=NAV+1 + NAV100=500-NAV/2 + NAVNAV=NAV100+NAV-1 + WRITE(6,1011)VEL,NV + 1011 FORMAT(5H1VROT,F10.1,I5) + write(6,778)NAV,NAV100,NAVNAV + 778 FORMAT(10I10) + IF(VEL.EQ.0.)GO TO 50 + CALL WTROT(VEL,VSTEP,NV,NWT,WTMU,NRADIUS) + WRITE(6,1013)NWT + 1013 FORMAT(4H NWT,I6) + DO 29 IWL=1,npiece3 + 29 HROT(IWL)=0. +C + WRITE(6,1117) + 1117 FORMAT(1H1) + WRITE(9)TEFF,GLOG,TITLE,WBEGIN,RESOLU,NWL,IFSURF,NMU,XMU, + 1NEDGE,WLEDGE,VEL,NV + REWIND 1 + DO 40 IWL=npiece+1,NWL+npiece,npiece + MAX=MIN0(npiece2,NWL+npiece2-IWL+1) + DO 30 J=npiece+1,MAX + KWL=IWL+J-npiece2-1 + READ(19)INT100 + CONT(J)=CONTIN + DO 25 I=1,NWT + MU=MUNWT(I) + IV=IVNWT(I) + W=WTNWT(I)*INT100(MU) + HROT(J-IV)=HROT(J-IV)+W + 25 HROT(J+IV)=HROT(J+IV)+W + 30 CONTINUE + IF(IWL.EQ.npiece+1)GO TO 37 + DO 33 J=1,npiece + QH=-(H(J+NAV100)+H(J+NAVNAV))*ENDWT + DO 330 K=NAV100,NAVNAV + 330 QH=QH+H(J+K) + Q2(1)=QH/FLOAT(NAVWT) + Q2(2)=CONT(J) + WRITE(9)Q2 + JWL=IWL+J-npiece2-1 + IF(JWL.GT.LINOUT)GO TO 33 + WAVE=WBEGIN*RATIO**(JWL-1) + RESID=Q2(1)/Q2(2) + IRESID=RESID*1000.+.5 + IPLOT=RESID*100.+1.5 + IPLOT=MAX0(1,MIN0(101,IPLOT)) + APLOT(IPLOT)=1HX + WRITE(6,2300)JWL,WAVE,IRESID,APLOT + 2300 FORMAT(1H ,I5,F11.4,I7,101A1) + APLOT(IPLOT)=(1H ) + 33 CONTINUE + 37 DO 34 J=1,npiece + 34 CONT(J)=CONT(J+npiece) + DO 350 J=1,500 + 350 H(J)=HROT(J+npiece-500) + DO 35 J=1,npiece2 + 35 HROT(J)=HROT(J+npiece) + DO 36 J=npiece2+1,npiece3 + 36 HROT(J)=0. + IF(KWL.LT.NWL)GO TO 40 + MAX=MIN0(npiece,NWL+npiece-IWL+1) + DO 38 J=1,MAX + QH=-(H(J+NAV100)+H(J+NAVNAV))*ENDWT + DO 380 K=NAV100,NAVNAV + 380 QH=QH+H(J+K) + Q2(1)=QH/FLOAT(NAVWT) + Q2(2)=CONT(J) + WRITE(9)Q2 + JWL=IWL+J-npiece-1 + IF(JWL.GT.LINOUT)GO TO 38 + WAVE=WBEGIN*RATIO**(JWL-1) + RESID=Q2(1)/Q2(2) + IRESID=RESID*1000.+.5 + IPLOT=RESID*100.+1.5 + IPLOT=MAX0(1,MIN0(101,IPLOT)) + APLOT(IPLOT)=1HX + WRITE(6,2300)JWL,WAVE,IRESID,APLOT + APLOT(IPLOT)=(1H ) + 38 CONTINUE + 40 CONTINUE + GO TO 400 + 50 WRITE(9)TEFF,GLOG,TITLE,WBEGIN,RESOLU,NWL,IFSURF,NMU,XMU, + 1NEDGE,WLEDGE,VEL,NV + WRITE(6,1117) + DO 55 IWL=1,NWL + READ(19)INT100 + Q2(1)=FLUX + Q2(2)=CONTIN + WRITE(9)Q2 + IF(IWL.GT.LINOUT)GO TO 55 + WAVE=WBEGIN*RATIO**(IWL-1) + RESID=FLUX/CONTIN + IRESID=RESID*1000.+.5 + IPLOT=RESID*100.+1.5 + IPLOT=MAX0(1,MIN0(101,IPLOT)) + APLOT(IPLOT)=1HX + WRITE(6,2300)IWL,WAVE,IRESID,APLOT + APLOT(IPLOT)=(1H ) + 55 CONTINUE + 400 REWIND 1 + READ(1) + DO 42 I=1,NWL + 42 READ(1) + READ(1)NLINES + WRITE(9)NLINES + DO 41 I=1,NLINES + READ(1)LINDAT8,LINDAT + WRITE(9)LINDAT8,LINDAT + 41 CONTINUE + 500 CLOSE(UNIT=9) + CLOSE(UNIT=2,DISPOSE='DELETE') + CALL EXIT + END + SUBROUTINE WTROT(VEL,VSTEP,NV,NWT,WTMU,NRAD) + COMMON /WT/MUNWT(10000),IVNWT(10000),WTNWT(10000) + DIMENSION WTMU(100) + REAL*4 LAT + DO 1 MU=1,100 + 1 WTMU(MU)=0. +C SYMMETRY ABOUT THE EQUATOR AND AXIS +C NRAD=100 +C NRAD=50 + RADIUS=NRAD +C CHOSEN TO YIELD HNU + W=4./4./3.14159/RADIUS**2 +C CENTER + CX=.5 + CY=.5 + N3=0 + DO 100 IX=1,NRAD + DO 100 IY=1,NRAD +C R IS THE PROJECTED RADIUS + R=SQRT((IX-CX)**2+(IY-CY)**2) + IF(R.GT.RADIUS)GO TO 100 + XMU=SQRT(RADIUS**2-R**2)/RADIUS + MU=XMU*100.+.9999999 + IF(MU.EQ.0)GO TO 100 + WTMU(MU)=WTMU(MU)+W + IF(VEL.EQ.0.)GO TO 100 +C RX IS THE RADIUS OF THE LATITUDE CIRCLE + RX=SQRT(RADIUS**2-(IY-CY)**2) +C VLAT IS THE VELOCITY AT THE LATITUDE + VLAT=RX/RADIUS*ABS(VEL) + IF(VEL.LT.0.)THEN + LAT=ACOS(RX/RADIUS) + VLAT=VLAT*(1.-75./462.*SIN(LAT)**2-50./462.*SIN(LAT)**4) + ENDIF +C VX IS THE PROJECTED VELOCITY + VX=(IX-CX)/RX*VLAT + IV=VX/VSTEP+.5 + IVMU=IV*1000+MU + N3=N3+1 + MUNWT(N3)=IVMU + 100 CONTINUE + IF(VEL.EQ.0.)RETURN + CALL INTSORT(MUNWT,N3) + ISAVE=-1 + NWT=0 +C POSITIVE AND NEGATIVE DOPPLER SHIFTS + W=W*.5 + DO 300 I=1,N3 + IVMU=MUNWT(I) + IF(IVMU.EQ.ISAVE)GO TO 310 + ISAVE=IVMU + IV=IVMU/1000 + MU=IVMU-IV*1000 + NWT=NWT+1 + IF(NWT.GT.10000)STOP 'MORE THAN 10000 POINTS' + MUNWT(NWT)=MU + IVNWT(NWT)=IV + WTNWT(NWT)=W + GO TO 300 + 310 WTNWT(NWT)=WTNWT(NWT)+W + 300 CONTINUE + RETURN + END + FUNCTION MAP1(XOLD,FOLD,NOLD,XNEW,FNEW,NNEW) + DIMENSION XOLD(1),FOLD(1),XNEW(1),FNEW(1) + L=2 + LL=0 + DO 50 K=1,NNEW + 10 IF(XNEW(K).LT.XOLD(L))GO TO 20 + L=L+1 + IF(L.GT.NOLD)GO TO 30 + GO TO 10 + 20 IF(L.EQ.LL)GO TO 50 + IF(L.EQ.2)GO TO 30 + IF(L.EQ.3)GO TO 30 + L1=L-1 + IF(L.GT.LL+1.OR.L.EQ.3)GO TO 21 + IF(L.GT.LL+1.OR.L.EQ.4)GO TO 21 + CBAC=CFOR + BBAC=BFOR + ABAC=AFOR + IF(L.EQ.NOLD)GO TO 22 + GO TO 25 + 21 L2=L-2 + D=(FOLD(L1)-FOLD(L2))/(XOLD(L1)-XOLD(L2)) + CBAC=FOLD(L)/((XOLD(L)-XOLD(L1))*(XOLD(L)-XOLD(L2)))+ + 1(FOLD(L2)/(XOLD(L)-XOLD(L2))-FOLD(L1)/(XOLD(L)-XOLD(L1)))/ + 2(XOLD(L1)-XOLD(L2)) + BBAC=D-(XOLD(L1)+XOLD(L2))*CBAC + ABAC=FOLD(L2)-XOLD(L2)*D+XOLD(L1)*XOLD(L2)*CBAC + IF(L.LT.NOLD)GO TO 25 + 22 C=CBAC + B=BBAC + A=ABAC + LL=L + GO TO 50 + 25 D=(FOLD(L)-FOLD(L1))/(XOLD(L)-XOLD(L1)) + CFOR=FOLD(L+1)/((XOLD(L+1)-XOLD(L))*(XOLD(L+1)-XOLD(L1)))+ + 1(FOLD(L1)/(XOLD(L+1)-XOLD(L1))-FOLD(L)/(XOLD(L+1)-XOLD(L)))/ + 2(XOLD(L)-XOLD(L1)) + BFOR=D-(XOLD(L)+XOLD(L1))*CFOR + AFOR=FOLD(L1)-XOLD(L1)*D+XOLD(L)*XOLD(L1)*CFOR + WT=0. + IF(ABS(CFOR).NE.0.)WT=ABS(CFOR)/(ABS(CFOR)+ABS(CBAC)) + A=AFOR+WT*(ABAC-AFOR) + B=BFOR+WT*(BBAC-BFOR) + C=CFOR+WT*(CBAC-CFOR) + LL=L + GO TO 50 + 30 IF(L.EQ.LL)GO TO 50 + L=AMIN0(NOLD,L) + C=0. + B=(FOLD(L)-FOLD(L-1))/(XOLD(L)-XOLD(L-1)) + A=FOLD(L)-XOLD(L)*B + LL=L + 50 FNEW(K)=A+(B+C*XNEW(K))*XNEW(K) + MAP1=LL-1 + RETURN + END + SUBROUTINE INTSORT(DATA,N) + INTEGER X,Z,DATA(1) + NTRY=0 + N1=2 + 15 DO 1 J=N1,N + Z=DATA(J) + IF(J-2)1,2,3 + 2 IF(Z-DATA(1))4,1,1 + 4 DATA(2)=DATA(1) + DATA(1)=Z + GO TO 1 + 3 K7=J-1 + IF(Z-DATA(K7))5,1,1 + 5 LFST=1 + LAST=K7 + 6 MID=(LFST+LAST)/2 + IF(Z-DATA(MID))7,8,9 + 7 IF(MID-LAST)10,8,8 + 10 LAST=MID + GO TO 6 + 8 NSTART=MID + GO TO 11 + 9 IF(LFST-MID)12,13,13 + 12 LFST=MID + GO TO 6 + 13 NSTART=MID+1 + 11 DO 14 I=NSTART,K7 + K9=J+NSTART-I + 14 DATA(K9)=DATA(K9-1) + DATA(NSTART)=Z + 1 CONTINUE + NTRY=NTRY+1 + DO 16 I=2,N + IF(DATA(I)-DATA(I-1))17,16,16 + 17 N1=I + IF(NTRY-5)15,15,18 + 16 CONTINUE + 18 RETURN + END |