118 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | program fcal | ||
|  | 
 | ||
|  | ! Compute Intercept (A) and Slope (B) for a series of FreqCal measurements.  | ||
|  |   parameter(NZ=1000) | ||
|  |   implicit real*8 (a-h,o-z) | ||
|  |   real*8 fd(NZ),deltaf(NZ),r(NZ) | ||
|  |   character infile*50 | ||
|  |   character line*80 | ||
|  |   character cutc*8 | ||
|  | 
 | ||
|  |   nargs=iargc() | ||
|  |   if(nargs.ne.1) then | ||
|  |      print*,'Usage:   fcal <infile>' | ||
|  |      print*,'Example: fcal fmtave.out' | ||
|  |      go to 999 | ||
|  |   endif | ||
|  |   call getarg(1,infile) | ||
|  | 
 | ||
|  |   open(10,file=infile,status='old',err=997) | ||
|  |   open(12,file='fcal.out',status='unknown') | ||
|  |   open(13,file='fcal.plt',status='unknown') | ||
|  | 
 | ||
|  |   i=0 | ||
|  |   do j=1,9999 | ||
|  |      read(10,1000,end=10) line | ||
|  | 1000 format(a80) | ||
|  |      i0=index(line,' 0 ') | ||
|  |      i1=index(line,' 1 ') | ||
|  |      if(i0.le.0 .and. i1.le.0) then | ||
|  |         read(line,*,err=5) f,df | ||
|  |         ncal=1 | ||
|  |         i=i+1 | ||
|  |         fd(i)=f | ||
|  |         deltaf(i)=df | ||
|  |      else if(i1.gt.0) then | ||
|  |         i=i+1 | ||
|  |         read(line,*,err=5) f,df,ncal,nn,rr,cutc | ||
|  |         fd(i)=f | ||
|  |         deltaf(i)=df | ||
|  |         r(i)=0.d0 | ||
|  |      endif | ||
|  | 5    continue | ||
|  |   enddo | ||
|  | 
 | ||
|  | 10 iz=i | ||
|  |   if(iz.lt.2) go to 998 | ||
|  |   call fit(fd,deltaf,r,iz,a,b,sigmaa,sigmab,rms) | ||
|  | 
 | ||
|  |   write(*,1002)  | ||
|  | 1002 format('    Freq      DF     Meas Freq     Resid'/        & | ||
|  |             '   (MHz)     (Hz)      (MHz)        (Hz)'/        & | ||
|  |             '-----------------------------------------')        | ||
|  |   do i=1,iz | ||
|  |      fm=fd(i) + 1.d-6*deltaf(i) | ||
|  |      calfac=1.d0 + 1.d-6*deltaf(i)/fd(i) | ||
|  |      write(*,1010) fd(i),deltaf(i),fm,r(i) | ||
|  |      write(13,1010) fd(i),deltaf(i),fm,r(i) | ||
|  | 1010 format(f8.3,f9.3,f14.9,f9.3,2x,a6) | ||
|  |   enddo | ||
|  |   calfac=1.d0 + 1.d-6*b | ||
|  |   err=1.d-6*sigmab | ||
|  | 
 | ||
|  |   if(iz.ge.3) then | ||
|  |      write(*,1100) a,b,rms | ||
|  | 1100 format(/'A:',f8.2,' Hz    B:',f9.4,' ppm    StdDev:',f7.3,' Hz') | ||
|  |   if(iz.gt.2) write(*,1110) sigmaa,sigmab | ||
|  | 1110 format('err:',f6.2,9x,f9.4,23x,f13.9) | ||
|  |   else | ||
|  |      write(*,1120) a,b | ||
|  | 1120 format(/'A:',f8.2,' Hz    B:',f9.4) | ||
|  |   endif | ||
|  | 
 | ||
|  |   write(12,1130) a,b | ||
|  | 1130 format(f10.4) | ||
|  | 
 | ||
|  |   go to 999 | ||
|  | 
 | ||
|  | 997 print*,'Cannot open input file: ',infile | ||
|  |   go to 999 | ||
|  | 998 print*,'Input file must contain at least 2 valid measurement pairs' | ||
|  | 
 | ||
|  | 999 end program fcal | ||
|  | 
 | ||
|  | subroutine fit(x,y,r,iz,a,b,sigmaa,sigmab,rms) | ||
|  |   implicit real*8 (a-h,o-z) | ||
|  |   real*8 x(iz),y(iz),r(iz) | ||
|  | 
 | ||
|  |   sx=0.d0 | ||
|  |   sy=0.d0 | ||
|  |   sxy=0.d0 | ||
|  |   sx2=0.d0 | ||
|  |   do i=1,iz | ||
|  |      sx=sx + x(i) | ||
|  |      sy=sy + y(i) | ||
|  |      sxy=sxy + x(i)*y(i) | ||
|  |      sx2=sx2 + x(i)*x(i) | ||
|  |   enddo | ||
|  |   delta=iz*sx2 - sx*sx | ||
|  |   a=(sx2*sy - sx*sxy)/delta | ||
|  |   b=(iz*sxy - sx*sy)/delta | ||
|  | 
 | ||
|  |   sq=0.d0 | ||
|  |   do i=1,iz | ||
|  |      r(i)=y(i) - (a + b*x(i)) | ||
|  |      sq=sq + r(i)**2 | ||
|  |   enddo | ||
|  |   rms=0. | ||
|  |   sigmaa=0. | ||
|  |   sigmab=0. | ||
|  |   if(iz.ge.3) then | ||
|  |      rms=sqrt(sq/(iz-2)) | ||
|  |      sigmaa=sqrt(rms*rms*sx2/delta) | ||
|  |      sigmab=sqrt(iz*rms*rms/delta) | ||
|  |   endif | ||
|  | 
 | ||
|  |   return | ||
|  | end subroutine fit |