![]() ![]() |
![]() |
File: [Development] / JSOC / proj / timed / apps / sub_GB_fitting_2002.f
(download)
Revision: 1.2, Sat Aug 4 18:36:18 2012 UTC (10 years, 10 months ago) by rick Branch: MAIN CVS Tags: Ver_LATEST, Ver_9-5, Ver_9-41, Ver_9-4, Ver_9-3, Ver_9-2, Ver_9-1, Ver_9-0, Ver_8-8, Ver_8-7, Ver_8-6, Ver_8-5, Ver_8-4, Ver_8-3, Ver_8-2, Ver_8-12, Ver_8-11, Ver_8-10, Ver_8-1, Ver_8-0, Ver_7-1, Ver_7-0, Ver_6-4, HEAD Changes since 1.1: +9 -3 lines modified for JSOC release 6.4 |
C SUBROUTINE TO COMPUTE THE TRAVEL TIMES c BASED ON THE DEFINITION c BY GIZON & BIRCH (2002) EQUATION A1 c VERSION 1.3, 07/26/2010 c AUTHOR SEBASTIEN COUVIDAT c After computing the travel-time maps (positive and negative times) c the code computes the mean value and rms variation of these times. c Times that are larger than a threshold (in absolute values) c are deemed dubious and are re-computed based on a neighbor average of the c cross-covariance. The threshold is equal to the rms variation time c a certain amount. This amount can be changed in the code c ISSUES TO SOLVE c the format of the cross-covariance file is assumed to be negative c times followed by positive times c MAKE SURE THAT kmmin-thresh >= 1, kpmin-thresh>=1, kmmax+thresh<=nt, c kmmin+thresh<=nt c COMPILE ON n00 WITH exe77 SUBROUTINE gbtimes02(correl2,correl3,nx,ny,nt,iii,tau) IMPLICIT REAL(a-h,o-z) PARAMETER (pi=3.141592653589793116) PARAMETER (naxis=3,nmax=4096) PARAMETER (dt=45.,nt2=1791,dt2=5.,nt3=63,nthresh=31,nt4=5) REAL correl2(nt,ny,nx),correl3(nt,ny,nx) REAL correl(nx,ny,nt),correltemp(nt),correlint(nt2),amaxi REAL taup(nx,ny),tp(nt3),tm(nt3),sinc(nt2,nt) REAL taum(nx,ny),correlref(nt),correlrefint(nt2),tau(nx,ny,2) REAL c0,c1,c2,alags(nt3),tpc(nt4),tmc(nt4),alagscp(nt4) REAL aminimump,aminimumm,ameanp,ameanm,rmsp,rmsm,threshold REAL time(nt2),time0(nt),temp,alagscm(7) CHARACTER*100 filename,filewrite DO 5 i=1,nx DO 5 j=1,ny DO 5 k=1,nt correl(i,j,k)=correl3(k,j,i) 5 CONTINUE threshold=5.0 nedge=8 c compute the time window to select the first-bounce skip CALL window(kpmin,kpmax,kmmin,kmmax,nt,nt2,iii,dt,dt2) c compute the reference cross-covariance c and avoid the edges (NB: can change the parameters) DO k=1,nt correlref(k) = 0. DO i=nedge,nx-nedge DO j=nedge,ny-nedge correlref(k)=correlref(k)+correl(i,j,k) ENDDO ENDDO correlref(k)=correlref(k)/(nx-2*nedge+1)/(ny-2*nedge+1) ENDDO c normalize the reference cross-covariance amaxi=MAXVAL(correlref) DO k=1,nt correlref(k)=correlref(k)/amaxi ENDDO DO 10 i=1,nx DO 10 j=1,ny DO 10 k=1,nt correl(i,j,k)=correl2(k,j,i) 10 CONTINUE c initialize some interpolation parameters DO i=1,nt2 time(i)=(i-1.)*dt2 ENDDO DO i=1,nt time0(i)=(i-1.)*dt ENDDO DO i=1,nt2 DO j=1,nt temp=pi*(time(i)-time0(j))/dt IF (temp .EQ. 0.) THEN sinc(i,j)=1. ELSE sinc(i,j)=SIN(temp)/temp ENDIF ENDDO ENDDO c interpolate in time the reference cross-covariance CALL interpolation(correlref,nt,correlrefint,sinc,nt2,kpmin, + kpmax,kmmin,kmmax,nthresh) DO i=1,nt3 alags(i)=(i-1-nthresh)*dt2 ENDDO c compute the travel times DO i=1,nx DO j=1,nx c normalize the cross-covariance DO k=1,nt correltemp(k)=correl(i,j,k)/amaxi ENDDO c interpolate in time the cross-covariance CALL interpolation(correltemp,nt,correlint,sinc,nt2, + kpmin,kpmax,kmmin,kmmax,nthresh) DO lag=1,nt3 tp(lag)=0. tm(lag)=0. ENDDO DO lag=-nthresh,nthresh DO k=kpmin,kpmax tp(lag+nthresh+1) = tp(lag+nthresh+1)+(correlint(k) + -correlrefint(k-lag))**2 ENDDO DO k=kmmin,kmmax tm(lag+nthresh+1) = tm(lag+nthresh+1)+(correlint(k) + -correlrefint(k-lag))**2 ENDDO ENDDO aminimump=10000. minipl=0 DO k=1,nt3 IF (tp(k) .LT. aminimump) THEN aminimump=tp(k) minipl=k ENDIF ENDDO aminimumm=10000. miniml=0 DO k=1,nt3 IF (tm(k) .LT. aminimumm) THEN aminimumm=tm(k) miniml=k ENDIF ENDDO c to avoid issues at the edges: IF(minipl .EQ. 1 .OR. minipl .EQ. 2) THEN minipl=(nt4+1)/2 ENDIF IF(miniml .EQ. 1 .OR. miniml .EQ. 2) THEN miniml=(nt4+1)/2 ENDIF IF(minipl .EQ. nt3 .OR. minipl .EQ. nt3-1) THEN minipl=nt3-2 ENDIF IF(miniml .EQ. nt3 .OR. miniml .EQ. nt3-1) THEN miniml=nt3-2 ENDIF DO k=1,nt4 tpc(k)=tp(minipl-(nt4+1)/2+k) tmc(k)=tm(miniml-(nt4+1)/2+k) alagscp(k)=alags(minipl-(nt4+1)/2+k) alagscm(k)=alags(miniml-(nt4+1)/2+k) ENDDO c fit the parabola CALL parabola(alagscp,tpc,nt4,c0,c1,c2) IF(c2 .EQ.0) c2=1.e-5 taup(i,j) = -c1/2./c2 CALL parabola(alagscm,tmc,nt4,c0,c1,c2) IF(c2 .EQ.0) c2=1.e-5 taum(i,j) = c1/2./c2 tau(i,j,1) = (taup(i,j)+taum(i,j))/2 tau(i,j,2) = taup(i,j)-taum(i,j) IF((ABS(tau(i,j,1)).GT.2*dt).AND.(i.GT.1).AND.(j.GT.1)) + tau(i,j,1)=0.5*(tau(i-1,j,1)+tau(i,j-1,1)) IF((ABS(tau(i,j,2)).GT.2*dt).AND.(i.GT.1).AND.(j.GT.1)) + tau(i,j,2)=0.5*(tau(i-1,j,1)+tau(i,j-1,1)) IF(ABS(tau(i,j,1)).GT.2*dt) tau(i,j,1)=0. IF(ABS(tau(i,j,2)).GT.2*dt) tau(i,j,2)=0. ENDDO ENDDO c compute the mean and square root of variance of the travel times ameanp=0. ameanm=0. DO i=1,nx DO j=1,ny ameanp=ameanp+taup(i,j) ameanm=ameanm+taum(i,j) ENDDO ENDDO ameanp=ameanp/nx/ny ameanm=ameanm/nx/ny rmsp=0. rmsm=0. DO i=1,nx DO j=1,ny rmsp=rmsp+(taup(i,j)-ameanp)**2 rmsm=rmsm+(taum(i,j)-ameanm)**2 ENDDO ENDDO rmsp=SQRT(rmsp/nx/ny) rmsm=SQRT(rmsm/nx/ny) threshold=threshold*MAX(rmsp,rmsm) C PRINT *,'mean values',ameanp,ameanm C PRINT *,'rms variations and threshold:',rmsp,rmsm,threshold c re-compute the outlier travel times except at the map edges DO i=2,nx-1 DO j=2,nx-1 IF( (ABS(taup(i,j)-ameanp) .GT. threshold) .OR. + (ABS(taum(i,j)-ameanm) .GT. threshold))THEN DO k=1,nt correltemp(k)=(correl(i,j,k)+correl(i-1,j,k) + +correl(i+1,j,k)+correl(i,j-1,k)+correl(i-1,j-1,k) + +correl(i+1,j-1,k)+correl(i,j+1,k)+correl(i-1,j+1,k) + +correl(i+1,j+1,k))/9./amaxi ENDDO CALL interpolation(correltemp,nt,correlint,sinc,nt2, + kpmin,kpmax,kmmin,kmmax,nthresh) DO lag=1,nt3 tp(lag)=0. tm(lag)=0. ENDDO DO lag=-nthresh,nthresh DO k=kpmin,kpmax tp(lag+nthresh+1) = tp(lag+nthresh+1)+ + (correlint(k)-correlrefint(k-lag))**2 ENDDO DO k=kmmin,kmmax tm(lag+nthresh+1) = tm(lag+nthresh+1)+ + (correlint(k)-correlrefint(k-lag))**2 ENDDO ENDDO aminimump=10000. minipl=0 DO k=1,nt3 IF (tp(k) .LT. aminimump) THEN aminimump=tp(k) minipl=k ENDIF ENDDO aminimumm=10000. miniml=0 DO k=1,nt3 IF (tm(k) .LT. aminimumm) THEN aminimumm=tm(k) miniml=k ENDIF ENDDO c to avoid issues at the edges: IF(minipl .EQ. 1 .OR. minipl .EQ. 2) THEN minipl=(nt4+1)/2 ENDIF IF(miniml .EQ. 1 .OR. miniml .EQ. 2) THEN miniml=(nt4+1)/2 ENDIF IF(minipl .EQ. nt3 .OR. minipl .EQ. nt3-1) THEN minipl=nt3-2 ENDIF IF(miniml .EQ. nt3 .OR. miniml .EQ. nt3-1) THEN miniml=nt3-2 ENDIF DO k=1,nt4 tpc(k)=tp(minipl-(nt4+1)/2+k) tmc(k)=tm(miniml-(nt4+1)/2+k) alagscp(k)=alags(minipl-(nt4+1)/2+k) alagscm(k)=alags(miniml-(nt4+1)/2+k) ENDDO c fit the parabola CALL parabola(alagscp,tpc,nt4,c0,c1,c2) IF(c2 .EQ. 0) c2=1.e-5 taup(i,j) = -c1/2./c2 CALL parabola(alagscm,tmc,nt4,c0,c1,c2) IF(c2 .EQ. 0) c2=1.e-5 taum(i,j) = c1/2./c2 tau(i,j,1) = (taup(i,j)+taum(i,j))/2. tau(i,j,2) = taup(i,j)-taum(i,j) IF((ABS(tau(i,j,1)).GT.2*dt).AND.(i.GT.1).AND.(j.GT.1)) + tau(i,j,1)=0.5*(tau(i-1,j,1)+tau(i,j-1,1)) IF((ABS(tau(i,j,2)).GT.2*dt).AND.(i.GT.1).AND.(j.GT.1)) + tau(i,j,2)=0.5*(tau(i-1,j,1)+tau(i,j-1,1)) IF(ABS(tau(i,j,1)).GT.2*dt) tau(i,j,1)=0. IF(ABS(tau(i,j,2)).GT.2*dt) tau(i,j,2)=0. ENDIF ENDDO ENDDO RETURN END c ------------------------------------------------------------------------------- c uses the Whittaker-Shannon interpolation formula: c optimal interpolation for 1) band-limited signals and 2) when the Nyquist frequency c is larger than the bandwidth SUBROUTINE interpolation(f,nt0,fi,sinc,nt,kpmin,kpmax,kmmin, + kmmax,nthresh) IMPLICIT REAL(a-h,o-z) INTEGER nt0,nt,i,j INTEGER kpmin,kpmax,kmmin,kmmax,nthresh REAL f(nt0),fi(nt) REAL sinc(nt,nt0) c we only care about the interpolated value around the time window DO i=kpmin-nthresh,kpmax+nthresh fi(i)=0. DO j=1,nt0 fi(i)=fi(i)+f(j)*sinc(i,j) ENDDO ENDDO DO i=kmmin-nthresh,kmmax+nthresh fi(i)=0. DO j=1,nt0 fi(i)=fi(i)+f(j)*sinc(i,j) ENDDO ENDDO RETURN END c ------------------------------------------------------------------------------- c routine to fit for a parabola SUBROUTINE parabola(x,y,n,c0,c1,c2) IMPLICIT REAL(a-h,o-z) INTEGER n,i REAL x(n),y(n),a11,a12,a13,a21,a22,a23,a31,a32,a33 REAL determinant,am11,am12,am13,am21,am22,am23,am31,am32,am33 REAL c0,c1,c2,sy,sxy,sxxy a11=n*1. a12=0. a13=0. a23=0. a33=0. sy =0. sxy=0. sxxy=0. do i=1,n a12=a12+x(i) a13=a13+x(i)**2 a23=a23+x(i)**3 a33=a33+x(i)**4 sy =sy+y(i) sxy=sxy+x(i)*y(i) sxxy=sxxy+x(i)*x(i)*y(i) enddo a21=a12 a22=a13 a31=a13 a32=a23 c Compute the minors/cofactors/adjoint matrix M am11=a22*a33-a32*a23 am21=(a21*a33-a31*a23)*(-1.) am31=a21*a32-a31*a22 am12=(a12*a33-a32*a13)*(-1.) am22=a11*a33-a31*a13 am32=(a11*a32-a31*a12)*(-1.) am13=a12*a23-a22*a13 am23=(a11*a23-a21*a13)*(-1.) am33=a11*a22-a21*a12 determinant=a11*a22*a33-a11*a32*a23-a12*a21*a33+a12*a31*a23 + +a13*a21*a32-a13*a31*a22 IF(determinant .EQ. 0) determinant=1.e-5 c0 = (am11*sy+am12*sxy+am13*sxxy)/determinant c1 = (am21*sy+am22*sxy+am23*sxxy)/determinant c2 = (am31*sy+am32*sxy+am33*sxxy)/determinant RETURN END c ---------------------------------------------------------------------------- SUBROUTINE window(kpmin,kpmax,kmmin,kmmax,nt,nt2,iii,dt,dt2) IMPLICIT REAL(a-h,o-z) INTEGER iii,k,nt,nt2,kpmin,kpmax,kmmin,kmmax REAL centrage,dt,dt2,time(nt2),width width=700.0 DO k=1,nt2 time(k) = ((k-1)-(nt-1)/2*nt2/nt)*dt2 ENDDO IF (iii .EQ. 1) THEN centrage=810. ELSE IF (iii .EQ. 2) THEN centrage=1130. ELSE IF (iii .EQ. 3) THEN centrage=1480. ELSE IF (iii .EQ. 4) THEN centrage=1750. ELSE IF (iii .EQ. 5) THEN centrage=1900. ELSE IF (iii .EQ. 6) THEN centrage=2050. ELSE IF (iii .EQ. 7) THEN centrage=2300. ELSE IF (iii .EQ. 8) THEN centrage=2520. ELSE IF (iii .EQ. 9) THEN centrage=2740. ELSE IF (iii .EQ. 10) THEN centrage=2990. ELSE IF (iii .EQ. 11) THEN centrage=3200. ENDIF C PRINT *,'CENTER OF TIME WINDOW',centrage kpmin=10000 kmmin=10000 kpmax=0 kmmax=0 DO k=1,nt2 IF ((ABS(time(k)-centrage) .LE. width) .AND. + (k .GE.(nt-1.)/2.*nt2/nt) .AND. (k .GT. kpmax)) THEN kpmax = k ENDIF IF ((ABS(time(k)-centrage) .LE. width) .AND. + (k .GE.(nt-1.)/2.*nt2/nt) .AND. (k .LT. kpmin)) THEN kpmin = k ENDIF IF ((ABS(time(k)+centrage) .LE. width) .AND. + (k .LT.(nt-1.)/2.*nt2/nt) .AND. (k .GT. kmmax)) THEN kmmax = k ENDIF IF ((ABS(time(k)+centrage) .LE. width) .AND. + (k .LT.(nt-1.)/2.*nt2/nt) .AND. (k .LT. kmmin)) THEN kmmin = k ENDIF ENDDO RETURN END
Karen Tian |
Powered by ViewCVS 0.9.4 |