diff options
author | SriReddy-NOAA <Srinivas.Reddy@noaa.gov> | 2021-04-09 00:11:44 -0400 |
---|---|---|
committer | SriReddy-NOAA <Srinivas.Reddy@noaa.gov> | 2021-04-09 00:11:44 -0400 |
commit | e1fc5ad517ae4dc12c532841abe9e28b0486c954 (patch) | |
tree | f07205cb4ecd3bba207d38e951fffea37cc40533 /htdp.for | |
parent | 47aa45faf1c9503106c6a501d4b8c431fc2cc270 (diff) |
Version 3.2.8
Diffstat (limited to 'htdp.for')
-rw-r--r-- | htdp.for | 9123 |
1 files changed, 0 insertions, 9123 deletions
diff --git a/htdp.for b/htdp.for deleted file mode 100644 index 4c7baff..0000000 --- a/htdp.for +++ /dev/null @@ -1,9123 +0,0 @@ - PROGRAM HTDP - -************************************************************** -* NAME: HTDP (Horizontal Time-Dependent Positioning) -* -* WRITTEN BY: Richard A. Snay & Chris Pearson -* -* PURPOSE: Transform coordinates across time -* and between reference frames -* -**************************************************************** - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - - character HTDP_version*10 - CHARACTER OPTION*1 - character cont*5 - - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /VERSION/ HTDP_version - -C You must change HTDP version here if necessary - - HTDP_version = 'v3.2.7' - -*** Introduce variables for file id's - - LUIN = 5 -* interactive input - LUOUT = 6 -* interactive output - I1 = 11 -* input of velocity grid in GETVEL -* input of earthquake parameters in GETEQ -* input of blue-book BFILE in DLACE, VELOC, UPDATE and TRFPOS -* input of blue-book GFILE in UPDATE - I2 = 12 -* output of predicted displacements in DLACE -* output of predicted velocities in VELOC -* output of updated blue-book BFILE in UPDATE -* output of updated blue-book GFILE in UPDATE -* output of updated coordinates in UPDATE - I3 = 13 -* output of point-velocity records in VELOC - I4 = 14 -* storage of reference latitude & longitude & region - I5 = 15 -* storage of earthquake parameters -C OPEN(I5, FILE='TEMPQK' , ACCESS = 'DIRECT', RECL = 72, -C 1 FORM='UNFORMATTED') - I6 = 16 -* output of transformed blue-book BFILE in TRFPOS - -*** Obtain parameters defining crustal motion model - CALL MODEL - -*** Initialize transformation parameters between reference frames - CALL SETTP - -*** Initialize conversion table between reference frame identifiers - CALL SETRF - - WRITE(LUOUT,5) HTDP_version - 5 FORMAT( - 1 '********************************************************'/ - 1 '* HTDP (Horizontal Time-Dependent Positioning) *'/ - 1 '* SOFTWARE VERSION ',a10 / - 1 '* *'/) - WRITE(LUOUT,501) - 501 FORMAT( - 1 '* AUTHORS: Richard Snay, Chris Pearson & Jarir Saleh *'/ - 1 '* Email: ngs.cors.htdp@noaa.gov *'/ - 1 '* *'/ - 1 '********************************************************'/) - WRITE(LUOUT,10) - 10 FORMAT( - 1 ' This software incorporates numerical models that',/ - 3 ' characterize continuous crustal motion as well as ',/ - 3 ' the episodic motion associated with earthquakes.'/) - WRITE(LUOUT,11) - 11 FORMAT( - 5 ' The User Guide contains additional information and a set'/ - 5 ' of exercises to familiarize users with the software.'// - 5 ' Hit ENTER or RETURN to continue. ') - read(luin, '(a5)',err=51,iostat=ios) cont - if (ios /= 0) goto 51 - - 25 WRITE(LUOUT,26) - 26 FORMAT(' ***************************************'/ - 1 ' MAIN MENU:',/ - 6 ' 0... Exit software.',/ - 7 ' 1... Estimate displacements between two dates.'/ - 8 ' 2... Estimate velocities.'/ - 9 ' 3... Update positions and/or observations ' - & ,'to a specified date.'/ - & ' 4... Transform positions between reference frames. '/ - & ' 5... Transform velocities between reference frames. ') - 30 READ(LUIN,35,err=52,iostat=ios) OPTION - if (ios /= 0) goto 52 - 35 FORMAT(A1) - IF(OPTION .EQ. '0') THEN - GO TO 50 - ELSEIF(OPTION .EQ. '1') THEN - CALL DPLACE - ELSEIF(OPTION .EQ. '2') THEN - CALL VELOC - ELSEIF(OPTION .EQ. '3') THEN - CALL UPDATE(HTDP_version) - elseif(option .eq. '4') then - call TRFPOS - elseif(option .eq. '5') then - call TRFVEL - ELSE - WRITE(LUOUT,40) - 40 FORMAT(' Improper entry--select again ') - GO TO 30 - ENDIF - GO TO 25 - 50 CONTINUE - stop -C CLOSE(I5, STATUS = 'DELETE') - - 51 write (*,'(/)') - write (*,*) 'You did not hit enter : ios = ',ios - write (*,*) "ABNORMAL TERMINATION" - STOP - - 52 write (*,'(/)') - write (*,*) 'Problem with reading OPTION: ios = ',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - STOP - - END -***************************************************************************** - SUBROUTINE MODEL - -*** Obtain parameters defining crustal motion model - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /TIMREF/ ITREF - - A = 6.378137D06 - F = 1.D0 / 298.257222101D0 - E2 = 0.6694380022903146D-2 - AF = A / (1.D0 -F) - EPS = F*(2.D0 - F) / ((1.D0 -F)**2) - PI = 4.D0 * DATAN(1.D0) - RHOSEC = (180.D0 * 3600.D0) / PI - TWOPI = PI + PI - -C*** Set default reference epoch to Jan. 1, 2010 - IYRREF = 2010 - IMOREF = 1 - IDYREF = 1 - CALL IYMDMJ (IYRREF, IMOREF, IDYREF, MJD) - ITREF = MJD * 24 * 60 - - CALL GETBDY - - RETURN - END - -******************************************************************* - SUBROUTINE GETBDY - -*** Obtain coordinates for vertices that form the polygons -*** that correspond to the boundaries for the regions. -*** Region 1 is the San Andreas fault in central California -*** Region 2 is southern California -*** Region 3 is Northern California -*** Region 4 is the Pacific Noerthwest -*** Region 5 is western CONUS -*** Region 6 is CONUS -*** Region 7 is St. Elias, Alaska -*** Region 8 is south-central Alaska -*** Region 9 is southeast Alaska -*** Region 10 is All Mainland Alaska -*** Region 11 is the North American plate -*** Region 12 is the Caribbean plate -*** Region 13 is the Pacific plate -*** Region 14 is the Juan de Fuca plate -*** Region 15 is the Cocos plate -*** Region 16 is the Mariana plate -*** REGION 17 is the Philippine Sea plate - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NMREGN = 17) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /BNDRY/ X(4000), Y(4000), NPOINT(30) - - IEND = NPOINT(NMREGN + 1) - 1 - DO 10 J = 1, IEND - X(J) = (X(J) * 3600.D0)/RHOSEC - Y(J) = (Y(J) * 3600.D0)/RHOSEC - 10 CONTINUE - RETURN - END -******************************************************************* - SUBROUTINE GETREG(X0,YKEEP,JREGN) - -*** Determine the region containing a given point. - - IMPLICIT DOUBLE PRECISION(A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NMREGN = 17) - COMMON /BNDRY/ X(4000), Y(4000), NPOINT(30) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /CONST/ A, F, E2, EPS, AF, PI, TWOPI, RHOSEC - - Y0 = TWOPI - YKEEP - IF (Y0 .lt. 0.d0) Y0 = Y0 + TWOPI - IR = 0 - 1 IR = IR + 1 - IF(IR .GT. NMREGN) THEN - JREGN = 0 - RETURN - ENDIF - IBEGIN = NPOINT(IR) - NUMVER = NPOINT(IR + 1) - IBEGIN - CALL POLYIN(X0,Y0,X(IBEGIN),Y(IBEGIN), NUMVER, NTEST) - IF(NTEST .EQ. 0) GO TO 1 - JREGN = IR - - RETURN - END -******************************************************** - SUBROUTINE POLYIN (X0,Y0,X,Y,N,NPC) -C SUBROUTINE TO DETERMINE IF A POINT AT (X0,Y0) IS INSIDE OR -C OUTSIDE OF A CLOSED FIGURE DESCRIBED BY A SEQUENCE OF CONNECTED -C STRAIGHT LINE SEGMENTS WITH VERTICES AT X, Y. -C -C INPUT - -C X0, Y0 COORDINATES OF A POINT TO BE TESTED -C Y0 corresponds to longitude and must be a number -C between 0.0 and 2*PI -C X, Y ARRAYS CONTAINING THE VERTICES, IN ORDER, OF A -C CLOSED FIGURE DESCRIBED BY STRAIGHT LINE SEGMNENTS. -C FOR EACH 'I', THE STRAIGHT LINE FROM (XI),Y(I)) TO -C TO (X(I+1),Y(I+1)), IS AN EDGE OF THE FIGURE. -C N DIMENSION OF X AND Y, NUMBER OF VERTICES, AND NUMBER -C OF STRAIGHT LINE SEGMENTS IN FIGURE. -C OUTPUT - -C NPC NPC=0 WHEN X0,Y0 IS OUTSIDE OF FIGURE DESCRIBED -C BY X,Y -C NPC=1 WHEN X0,Y0 IS INSIDE FIGURE -C NPC=2 WHEN X0,Y0 IS ON BORDER OF FIGURE -C METHOD - -C A COUNT IS MADE OF THE NUMBER OF TIMES THE LINE FROM (X0,Y0) TO -C (X0,+ INFINITY) CROSSES THE BORDER OF THE FIGURE. IF THE COUNT -C IS ODD, THE POINT IS INSIDE; IF THE COUNT IS EVEN THE POINT -C IS OUTSIDE. -C LIMITATIONS - -C NONE. THE PROGRAM LOGIC IS VALID FOR ALL CLOSED FIGURES, -C NO MATTER HOW COMPLEX. -C ACCURACY - -C MAINTAINS FULL ACCURACY OF INPUT COORDINATES. -C - IMPLICIT INTEGER*4 (I-N) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION X(N),Y(N) - DATA I6/6/ - IS=0 - NPC=0 -C -C FIND STARTING POINT WHERE X(I).NE.X0 - IP=0 - 10 IP=IP+1 - IF ((X(IP)-X0) == 0) goto 12 - IF ((X(IP)-X0) < 0) goto 15 - IF ((X(IP)-X0) > 0) goto 16 -c IF (X(IP)-X0) 15,12,16 - 12 IF(IP.LE.N) GO TO 10 - WRITE(I6,6001) - 6001 FORMAT('0 POLYGON INPUT ERROR - ALL POINTS ON LINE X = X0') - STOP - 15 IL=-1 - GO TO 20 - 16 IL=1 - 20 XL=X(IP) - YL=Y(IP) -C -C SET UP SEARCH LOOP -C - IP1=IP+1 - IPN=IP+N - DO 100 II=IP1,IPN - I=II - IF(I.GT.N) I=I-N - IF(IL == 0) goto 50 - IF(IL < 0) goto 30 - IF(IL > 0) goto 40 -c IF(IL) 30,50,40 - - 30 IF(X(I)-X0 == 0) goto 32 - IF(X(I)-X0 < 0) goto 90 - IF(X(I)-X0 > 0) goto 34 -c 30 IF(X(I)-X0) 90,32,34 - 32 IS=-1 - GO TO 60 - 34 IL=1 - GO TO 80 - 40 IF(X(I)-X0 == 0) goto 44 - IF(X(I)-X0 < 0) goto 42 - IF(X(I)-X0 > 0) goto 90 -c 40 IF(X(I)-X0) 42,44,90 - 42 IL=-1 - GO TO 80 - 44 IS=1 - GO TO 60 - 50 IF(X(I)-X0 == 0) goto 55 - IF(X(I)-X0 < 0) goto 52 - IF(X(I)-X0 > 0) goto 54 -c 50 IF(X(I)-X0) 52,55,54 - 52 IL=-1 - IF(IS == 0) goto 140 - IF(IS < 0) goto 90 - IF(IS > 0) goto 80 -c IF(IS) 90,140,80 - 54 IL=1 - IF(IS == 0) goto 140 - IF(IS < 0) goto 80 - IF(IS > 0) goto 90 -c IF(IS) 80,140,90 - - 55 IF(Y(I)-Y0 == 0) goto 120 - IF(Y(I)-Y0 < 0) goto 57 - IF(Y(I)-Y0 > 0) goto 58 -c 55 IF(Y(I)-Y0) 57,120,58 - - 57 IF(YL-Y0 == 0) goto 120 - IF(YL-Y0 < 0) goto 90 - IF(YL-Y0 > 0) goto 120 -c 57 IF(YL-Y0) 90,120,120 - - 58 IF(YL-Y0 == 0) goto 120 - IF(YL-Y0 < 0) goto 120 - IF(YL-Y0 > 0) goto 90 -c 58 IF(YL-Y0) 120,120,90 -C - 60 IL=0 - IF(Y(I)-Y0 == 0) goto 120 - IF(Y(I)-Y0 < 0) goto 90 - IF(Y(I)-Y0 > 0) goto 90 -c IF(Y(I)-Y0) 90,120,90 - - 80 IF(YL-Y0+(Y(I)-YL)*(X0-XL)/(X(I)-XL) == 0) goto 120 - IF(YL-Y0+(Y(I)-YL)*(X0-XL)/(X(I)-XL) < 0) goto 90 - IF(YL-Y0+(Y(I)-YL)*(X0-XL)/(X(I)-XL) > 0) goto 85 -c 80 IF(YL-Y0+(Y(I)-YL)*(X0-XL)/(X(I)-XL)) 90,120,85 - 85 NPC=NPC+1 - 90 XL=X(I) - YL=Y(I) - 100 CONTINUE - NPC=MOD(NPC,2) - RETURN - 120 NPC=2 - RETURN - 140 WRITE(I6,6002) - 6002 FORMAT('0 POLYGON LOGIC ERROR - PROGRAM SHOULD NOT REACH THIS', - . ' POINT') - RETURN - END -***************************************************************** - SUBROUTINE RADR8T (YLAT,VN,VE,VNR,VER) - -C Convert horizontal velocities from mm/yr to rad/yr - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - - CALL RADII (YLAT,RADMER,RADPAR) -c write (*,*) "From RADR8T",RADMER,RADPAR - VNR = VN / (1000.D0 * RADMER) - VER = VE / (1000.D0 * RADPAR) -c write (*,*) "From RADR8T",VNR,VER - - RETURN - END -***************************************************************** - SUBROUTINE COMVEL(YLAT,YLON,JREGN,VN,VE,VU) -C -C Compute the NAD_83(CORS96) velocity at a point in mm/yr !Not anymore since 09/12/2014 - !Now the velocity refer to ITRF2008 - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NUMGRD = 10) - parameter (NMREGN = 17) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /FILES/ LUIN, LUOUT, I1,I2,I3,I4,I5,I6 - COMMON /VGRID/ B(210000) - DIMENSION WEI(2,2), VEL(2,2,3) - -c WRITE (6, 1001) JREGN -c1001 FORMAT( 'JREGN = ', I6) - - IF(JREGN .GT. NUMGRD .AND. JREGN .LE. NMREGN) THEN -*** Use tectonic plate model to compute velocity relative -*** to ITRF2008 - IPLATE = JREGN - NUMGRD - ELON = - YLON - HT = 0.D0 - CALL TOXYZ(YLAT, ELON, HT, X, Y, Z) - CALL PLATVL(IPLATE, X, Y, Z, VX, VY, VZ) - VX = VX * 1000.D0 - VY = VY * 1000.D0 - VZ = VZ * 1000.D0 -*** Convert ITRF2008 velocity to NAD_83(CORS96) velocity -c CALL VTRANF(X, Y, Z, VX, VY, VZ, 15, 1) !No Do not. Leave the velocity in ITRF2008 - CALL TOVNEU(YLAT, ELON, VX, VY, VZ, VN, VE, VU) - - ELSEIF(JREGN .GE. 1 .AND. JREGN .LE. NUMGRD) THEN - -C*** Get indices for the lower left hand corner of the grid -C*** and get the weights for the four corners - CALL GRDWEI (YLON, YLAT, JREGN, I, J, WEI) -c write (*,*) 'HHHHHHHHHHHHHHHHHHHHHHHHH',JREGN,WEI -c write (*,*) 'HHHHHHHHHHHHHHHHHHHHHHHHH',i,j - -C*** Get the velocity vectors at the four corners - CALL GRDVEC (JREGN, I, J, VEL, B) - - VN = WEI(1,1) * VEL(1,1,1) + WEI(1,2) * VEL(1,2,1) - * + WEI(2,1) * VEL(2,1,1) + WEI(2,2) * VEL(2,2,1) - - VE = WEI(1,1) * VEL(1,1,2) + WEI(1,2) * VEL(1,2,2) - * + WEI(2,1) * VEL(2,1,2) + WEI(2,2) * VEL(2,2,2) - - VU = WEI(1,1) * VEL(1,1,3) + WEI(1,2) * VEL(1,2,3) - * + WEI(2,1) * VEL(2,1,3) + WEI(2,2) * VEL(2,2,3) - -c write (*,*) 'From COMVEL ',VN,VE,VU -c write (*,*) 'From COMVEL ',I,J - -C*** If the point in one of the four Alaskan regions, -C*** then set its vertical velocity to 0.0 - IF(JREGN .GE. 7 .AND. JREGN .LE. 10) THEN - VU = 0.D0 - ENDIF - -C*** If the point is in one of the first ten regions, then -c*** the velocity grids contain the ITRF2008 velocity. -c*** Hence, the following code transforms this ITRF2008 velocity -c*** to the corresponding NAD 83 (CORS96) velocity. -C -c IF(JREGN .LE. NUMGRD) THEN !Starting09/12/2014, the velocities -c ELON = - YLON !coming out of this routine are in ITRF2008 -c HT = 0.D0 -c CALL TOXYZ(YLAT, ELON, HT, X, Y, Z) -c CALL TOVXYZ(YLAT, ELON, VN, VE, VU, VX, VY, VZ) -c CALL VTRANF( X, Y, Z, VX, VY, VZ, 15, 1) -c CALL TOVNEU(YLAT, ELON, VX, VY, VZ, VN, VE, VU) -c ENDIF - - ELSE - WRITE(LUOUT,100) JREGN - 100 FORMAT(' Improper region identifier ',I4,'in COMVEL.') - STOP - ENDIF - RETURN - END -**************************************** - SUBROUTINE PLATVL(IPLATE, X, Y, Z, VX, VY, VZ) -*** Compute the ITRF2008 velocity at point on plate = IPLATE -*** with coordinates X, Y, Z (in meters) -*** The resulting velocities--VX, VY, and VZ--will be in meters/yr -*** References -*** Altamimi et al. 2012 = JGR (Paper on ITRF2008 plate motion) -*** DeMets et al. 2010 = Geophysical Journal Int'l, vol 181, -*** Snay 2003 = SALIS, Vol 63, No 1 (Paper on Frames for Pacific) - - IMPLICIT DOUBLE PRECISION (A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) - DIMENSION WX(7), WY(7), WZ(7) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - -*** IPLATE = 1 --> North America (from Altamimi et al. 2012) -*** 2 --> Caribbean (from Altamimi et al. 2012) -*** 3 --> Pacific (from Altamimi et al. 2012) -*** 4 --> Juan de Fuca (from DeMets et al. 2010) -*** 5 --> Cocos (from DeMets et al. 2010) -*** 6 --> Mariana (from Snay, 2003) -*** 7 --> Philippine Sea (from DeMets et al. 2010) - DATA WX /0.170D-9, 0.238D-9, -1.993D-9, - 1 6.626D-9, -10.390D-9, -.097D-9, -0.841D-9/ - DATA WY /-3.209D-9, -5.275D-9, 5.023D-9, - 1 11.708D-9, -14.954D-9, .509D-9, 3.989D-9/ - DATA WZ /-0.485D-9, 3.219D-9,-10.501D-9, - 1 -10.615D-9, 9.148D-9,-1.682D-9, -10.626D-9/ - - IF (IPLATE .LE. 0 .OR. IPLATE .GT. 7) THEN - WRITE (LUOUT, 1) IPLATE - 1 FORMAT(' Improper plate ID in PLATVL = ', I6) - STOP - ENDIF - - VX = -WZ(IPLATE) * Y + WY(IPLATE) * Z - VY = WZ(IPLATE) * X - WX(IPLATE) * Z - VZ = -WY(IPLATE) * X + WX(IPLATE) * Y - -*** The parameters--WX, WY, and WZ--refer to ITRF2000 -*** for the Mariana Plate (Snay, 2003). Hence, -*** for this plate, VX, VY, and VZ, correspond to ITRF2000. -*** The following code converts these to ITRF2008 velocities for -*** this plate. - IF (IPLATE .EQ. 6) THEN - VX = VX*1000.d0 - VY = VY*1000.d0 - VZ = VZ*1000.d0 - CALL VTRANF(X, Y, Z, VX, VY, VZ, 11, 15) - VX = VX/1000.d0 - VY = VY/1000.d0 - VZ = VZ/1000.d0 -*** The following translations rates are added per Altamimi et al. (2012) -*** for the other six plates - ELSE - VX = 0.00041d0 + VX - VY = 0.00022d0 + VY - VZ = 0.00041d0 + VZ - ENDIF - - RETURN - END -********************************************************************** - SUBROUTINE PVPRNT(LATD,LATM,SLAT,LOND,LONM,SLON,VN,VE,VU) - -*** Print out a point-velocity (PV) record - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /FILES/ LUIN,LUOUT,I1,I2,I3,I4,I5, I6 - - LATS = IDINT(SLAT*100.D0 + 0.5D0) - LONS = IDINT(SLON*100.D0 + 0.5D0) - IVN = IDINT( VN*100.D0 + 0.5D0) - IVE = IDINT( VE*100.D0 + 0.5D0) - IVU = IDINT( VU*100.D0 + 0.5D0) - JVN = 300 - JVE = 300 - JVU = 500 - - WRITE(I3,10) LATD,LATM,LATS,LOND,LONM,LONS, - 1 IVN,JVN,IVE,JVE,IVU,JVU - 10 FORMAT('PV',I3,I2.2,I4.4,'N',I3,I2.2,I4.4,'W',6I6) - RETURN - END -**************************************************************************** - SUBROUTINE DSDA(LOCISN, LOCJSN, MIN1, MIN2, DS, DA) - -** Compute change in distance and change in azimuth. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - HTF = 0.0D0 - HTT = 0.0D0 - - READ(I4,REC=LOCISN,err=50,iostat=ios) YLATF,YLONF,VNF,VEF,VUF - if (ios /= 0) goto 50 - READ(I4,REC=LOCJSN,err=51,iostat=ios) YLATT,YLONT,VNT,VET,VUT - if (ios /= 0) goto 51 - - CALL COMPSN(YLATF1,YLONF1,HTF1,YLATF,YLONF,HTF, - 1 MIN1, VNF, VEF, VUF) - CALL COMPSN(YLATF2,YLONF2,HTF2,YLATF,YLONF,HTF, - 1 MIN2, VNF, VEF, VUF) - CALL COMPSN(YLATT1,YLONT1,HTT1,YLATT,YLONT,HTT, - 1 MIN1, VNT, VET, VUT) - CALL COMPSN(YLATT2,YLONT2,HTT2,YLATT,YLONT,HTT, - 1 MIN2, VNT, VET, VUT) - - CALL HELINV(YLATF1,YLONF1,YLATT1,YLONT1,FAZ1,BAZ1,S1) - CALL HELINV(YLATF2,YLONF2,YLATT2,YLONT2,FAZ2,BAZ2,S2) - DS = S2 - S1 - DA = FAZ2 - FAZ1 - RETURN - - 50 write (*,'(/)') - write (*,*) "wrong input for the 1st reading in DSDA:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 51 write (*,'(/)') - write (*,*) "wrong input for the 2nd reading in DSDA:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -********************************************************************* - SUBROUTINE HELINV(GLAT1,GLON1,GLAT2,GLON2,FAZ,BAZ,S) -C -C *** SOLUTION OF THE GEODETIC INVERSE PROBLEM AFTER T.VINCENTY. -C *** MODIFIED RAINSFORD WITH HELMERT ELLIPTICAL TERMS. -C *** EFFECTIVE IN ANY AZIMUTH AND AT ANY DISTANCE SHORT OF ANTIPODAL. -C *** STANDPOINT/FOREPOINT MUST NOT BE THE GEOGRAPHIC POLE . -C -C INPUT -C GLAT1 = Latitude of from point (radians, positive north) -C GLON1 = Longitude of from point (radians, positive west) -C GLAT2 = Latitude of to point (radians, positive north) -C GLON2 = Longitude of to point (radians, positive west) -C -C OUTPUT -C FAZ = Foward azimuth (radians, clockwise from north) -C BAZ = Back azimuth (radians, clockwise from north) -C S = Distance (meters) -C - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON/CONST/A,F,EPS2,EPS,AF,PI,TWOPI,RHOSEC - DATA TOL/0.5D-14/ - R = 1.0D0-F - TU1 = R*DSIN(GLAT1)/DCOS(GLAT1) - TU2 = R*DSIN(GLAT2)/DCOS(GLAT2) - CU1 = 1.0D0/DSQRT(TU1*TU1+1.0D0) - SU1 = CU1*TU1 - CU2 = 1.0D0/DSQRT(TU2*TU2+1.0D0) - S = CU1*CU2 - BAZ = S*TU2 - FAZ = BAZ*TU1 - X = GLON1-GLON2 - 100 SX = DSIN(X) - CX = DCOS(X) - TU1 = CU2*SX - TU2 = SU1*CU2*CX-BAZ - SY = DSQRT(TU1*TU1+TU2*TU2) - CY = S*CX+FAZ - Y = DATAN2(SY,CY) - SA = S*SX/SY - C2A = -SA*SA+1.0D0 - CZ = FAZ+FAZ - IF(C2A .GT. 0.0D0)CZ = -CZ/C2A+CY - E = CZ*CZ*2.0D0-1.0D0 - C = ((-3.0D0*C2A+4.0D0)*F+4.0D0)*C2A*F/16.0D0 - D = X - X = ((E*CY*C+CZ)*SY*C+Y)*SA - X = (1.0D0-C)*X*F+GLON1-GLON2 - IF(DABS(D-X) .GT. TOL)GO TO 100 - FAZ = DATAN2(-TU1,TU2) - BAZ = DATAN2(CU1*SX,BAZ*CX-SU1*CU2) - FAZ = FAZ + PI - BAZ = BAZ + PI - IF(FAZ .LT. 0.0D0)FAZ = FAZ+TWOPI - IF(BAZ .LT. 0.0D0)BAZ = BAZ+TWOPI - IF(FAZ .GT. TWOPI)FAZ = FAZ - TWOPI - IF(BAZ .GT. TWOPI)BAZ = BAZ - TWOPI - X = DSQRT((1.0D0/R/R-1.0D0)*C2A+1.0D0)+1.0D0 - X = (X-2.0D0)/X - C = 1.0D0-X - C = (X*X/4.0D0+1.0D0)/C - D = (0.375D0*X*X-1.0D0)*X - X = E*CY - S = 1.0D0-E-E - S = ((((SY*SY*4.0D0-3.0D0)*S*CZ*D/6.0D0-X)*D/4.0D0+CZ)*SY*D+Y) - 1 *C*A*R - RETURN - END -************************************************************************* - -c SUBROUTINE TODMSA(val,id,im,s) - -*** convert position radians to deg,min,sec -*** range is [-twopi to +twopi] - -c implicit double precision(a-h,o-z) -c IMPLICIT INTEGER*4 (I-N) -c common/CONST/A,F,E2,EP2,AF,PI,TWOPI,RHOSEC - -c 1 if(val.gt.twopi) then -c val=val-twopi -c go to 1 -c endif - -c 2 if(val.lt.-twopi) then -c val=val+twopi -c go to 2 -c endif - -c if(val.lt.0.d0) then -c isign=-1 -c else -c isign=+1 -c endif - -c s=dabs(val*RHOSEC/3600.D0) -c id=idint(s) -c s=(s-id)*60.d0 -c im=idint(s) -c s=(s-im)*60.d0 - -*** account for rounding error - -c is=idnint(s*1.d5) -c if(is.ge.6000000) then -c s=0.d0 -c im=im+1 -c endif -c if(im.ge.60) then -c im=0 -c id=id+1 -c endif - -c id = isign*id -c im = isign*im -c s = isign*s - -c return -c end -********************************************************* - SUBROUTINE TRFDAT(CARD,DATE,IREC12,IYEAR1,IYEAR2,MINS) - -C Convert blue-book date to time in minutes - - IMPLICIT DOUBLE PRECISION (A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) - CHARACTER CARD*80 - CHARACTER DATE*6 - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - - IF (IREC12 .EQ. 0) THEN - WRITE (LUOUT, 5) - 5 FORMAT(' ABORT: The blue-book needs a valid *12* record.') - STOP - ENDIF - - READ (DATE, 10,err=50,iostat=ios) IYEAR, MONTH, IDAY - if (ios /= 0) goto 50 - 10 FORMAT (3I2) - - IF ( IYEAR1 .LE. (1900 + IYEAR) .AND. - 1 (1900 + IYEAR) .LE. IYEAR2) THEN - IYEAR = 1900 + IYEAR - ELSEIF ( IYEAR1 .LE. (2000 + IYEAR) .AND. - 1 (2000 + IYEAR) .LE. IYEAR2) THEN - IYEAR = 2000 + IYEAR - ELSEIF ( IYEAR1 .LE. (1800 + IYEAR) .AND. - 1 (1800 + IYEAR) .LE. IYEAR2) THEN - IYEAR = 1800 + IYEAR - ELSE - WRITE (LUOUT, 20) CARD - 20 FORMAT(' ABORT: The following record has a date'/ - 1 ' which is inconsistent with the *12* record'/ - 1 3x, A80) - ENDIF - - IF (IYEAR .LE. 1906) THEN - WRITE (LUOUT, 30) - 30 FORMAT(' ***WARNING***'/ - 1 ' The blue-book file contains an observation that'/ - 1 ' predates 1906. The TDP model may not be valid'/ - 1 ' and the computed corrections may be erroneous.') - ENDIF - - IF (IDAY .EQ. 0) IDAY = 15 - - IF (MONTH .EQ. 0) THEN - MONTH = 7 - IDAY = 1 - ENDIF - -C CALL TOTIME(IYEAR,MONTH,IDAY, MINS) - CALL IYMDMJ(IYEAR,MONTH,IDAY, MJD) - MINS = MJD * 24 * 60 - RETURN - - 50 write (*,'(/)') - write (*,*) 'wrong IYEAR, IMONTH, IDAY:ios =',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - - END -********************************************************* - SUBROUTINE TNFDAT(DATE,MINS) - -C Convert blue-book date to time in years - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - character DATE*8 - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - READ(DATE,10) IYEAR,MONTH,IDAY - 10 FORMAT(I4,I2,I2) - IF(IYEAR .LE. 1906) THEN - WRITE(LUOUT,20) - 20 FORMAT(' ***WARNING***'/ - 1 ' The blue-book file contains an observation that'/ - 2 ' predates 1906. The TDP model is not valid and the'/ - 3 ' computed correction may be erroneous.') - ENDIF - IF(IDAY .EQ. 0) IDAY = 15 - IF(MONTH .EQ. 0) THEN - MONTH = 7 - IDAY = 1 - ENDIF -C CALL TOTIME(IYEAR,MONTH,IDAY,MINS) - CALL IYMDMJ(IYEAR,MONTH,IDAY,MJD) - MINS = MJD * 24 * 60 - RETURN - END -*************************************************************** -C SUBROUTINE GETTIM(MONTH, IDAY, IYEAR, DATE, MINS, TEST) -C -*** Read month-day-year and convert to decimal years -*** and Julian time in minutes -*** MONTH input - number from 1 to 12 -*** IDAY input - number from 1 to 31 -*** IYEAR input - must be after 1906 -*** DATE output - corresponding time in decimal years -*** MINS output - corresponding julian time in minutes -*** TEST output - if (true) then there is an error -C -C IMPLICIT DOUBLE PRECISION (A-H,O-Z) -C IMPLICIT INTEGER*4 (I-N) -C LOGICAL TEST -C COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - -C READ(LUIN,*) MONTH,IDAY,IYEAR - -C IF(IYEAR .le. 1906) THEN -C WRITE(LUOUT,10) -C 10 FORMAT(' The model is not valid for dates prior ', -C 1 'to 1906.'/) -C TEST = .TRUE. -C RETURN -C ENDIF - -C IF(MONTH .le. 0 .or. MONTH .gt. 12) THEN -C WRITE(LUOUT,20) -C 20 FORMAT(' Improper month specified.'/) -C TEST = .TRUE. -C RETURN -C ENDIF - -C IF(IDAY .le. 0 .or. IDAY .gt. 31) THEN -C WRITE(LUOUT,30) -C 30 FORMAT(' Improper day specified.'/) -C TEST = .TRUE. -C RETURN -C ENDIF - -C CALL TOTIME(IYEAR, MONTH, IDAY, MINS) -C CALL TOTIME(IYEAR, 1, 1, MIN00) -C DATE = DBLE(IYEAR) + DBLE(MINS - MIN00)/525600.D0 -C TEST = .FALSE. -C RETURN -C END - -C************************************************************************ - SUBROUTINE TOXYZ(glat,glon,eht,x,y,z) - -*** compute x,y,z -*** ref p.17 geometric geodesy notes vol 1, osu, rapp - - implicit double precision(a-h,o-z) - common/CONST/ a,f,e2,ep2,af,pi,twopi,rhosec - - slat=dsin(glat) - clat=dcos(glat) - w=dsqrt(1.d0-e2*slat*slat) - en=a/w - - x=(en+eht)*clat*dcos(glon) - y=(en+eht)*clat*dsin(glon) - z=(en*(1.d0-e2)+eht)*slat - - return - end -C************************************************************************ - logical function FRMXYZ(x,y,z,glat,glon,eht) - -*** convert x,y,z into geodetic lat, lon, and ellip. ht -*** ref: eq a.4b, p. 132, appendix a, osu #370 -*** ref: geom geod notes gs 658, rapp - - implicit double precision(a-h,o-z) - parameter(maxint=10,tol=1.d-13) - common/CONST/ a,f,e2,ep2,af,pi,twopi,rhosec - - ae2=a*e2 - -*** compute initial estimate of reduced latitude (eht=0) - - p=dsqrt(x*x+y*y) - icount=0 - tgla=z/p/(1.d0-e2) - -*** iterate to convergence, or to max # iterations - - 1 if(icount.le.maxint) then - tglax=tgla - tgla=z/(p-(ae2/dsqrt(1.d0+(1.d0-e2)*tgla*tgla))) - icount=icount+1 - if(dabs(tgla-tglax).gt.tol) go to 1 - -*** convergence achieved - - frmxyz=.true. - glat=datan(tgla) - slat=dsin(glat) - clat=dcos(glat) - glon=datan2(y,x) - w=dsqrt(1.d0-e2*slat*slat) - en=a/w - if(dabs(glat).le.0.7854d0) then - eht=p/clat-en - else - eht=z/slat-en+e2*en - endif - glon=datan2(y,x) - -*** too many iterations - - else - frmxyz=.false. - glat=0.d0 - glon=0.d0 - eht=0.d0 - endif - - return - end -********************************************************************* - SUBROUTINE RADII(YLAT,RADMER,RADPAR) -C -C Computes the radius of curvature in the meridian -C and the radius of curvature in a parallel of latitude -C - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COSLAT = DCOS(YLAT) - DENOM = DSQRT(1.D0 + EPS*COSLAT*COSLAT) - RADMER = AF/(DENOM**3) - RADPAR = AF*COSLAT/DENOM - RETURN - END -********************************************************************* - SUBROUTINE GETGRD(NAMEG,MINLAT,MAXLAT,ILAT,MINLON,MAXLON,ILON) - -*** Interactively obtain specifications for a grid. - - IMPLICIT INTEGER*4 (I-N) - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - CHARACTER NAMEG*10 - WRITE(LUOUT,200) - 200 FORMAT(' Enter name for grid (10 character max). ') - READ(LUIN,210,err=50,iostat=ios) NAMEG - if (ios /= 0) goto 50 - 210 FORMAT(A10) - WRITE(LUOUT,220) - 220 FORMAT(' Enter minimum latitude for grid in deg-min-sec'/ - 1 ' in free format (integer values only). ') - READ(LUIN,*,err=51,iostat=ios) ID1, IM1, IS1 - if (ios /= 0) goto 51 - WRITE(LUOUT,230) - 230 FORMAT(' Enter maximum latitude in same format. ') - READ(LUIN,*,err=52,iostat=ios) ID2, IM2, IS2 - if (ios /= 0) goto 52 - WRITE(LUOUT,240) - 240 FORMAT(' Enter latitude increment in seconds ', - 1 ' (integer value). ') - READ(LUIN,*,err=53,iostat=ios) ILAT - if (ios /= 0) goto 53 - WRITE(LUOUT,250) - 250 FORMAT(' Enter minimum longitude with positive being west. ') - READ(LUIN,*,err=54,iostat=ios) JD1, JM1, JS1 - if (ios /= 0) goto 54 - WRITE(LUOUT,260) - 260 FORMAT(' Enter maximum longitude. ') - READ(LUIN,*,err=55,iostat=ios) JD2, JM2, JS2 - if (ios /= 0) goto 55 - WRITE(LUOUT,270) - 270 FORMAT(' Enter longitude increment in seconds ', - 1 ' (integer value). ') - READ(LUIN,*,err=56,iostat=ios) ILON - if (ios /= 0) goto 56 - MINLAT = 3600*ID1 + 60*IM1 + IS1 - MAXLAT = 3600*ID2 + 60*IM2 + IS2 - MINLON = 3600*JD1 + 60*JM1 + JS1 - MAXLON = 3600*JD2 + 60*JM2 + JS2 - RETURN - - 50 write (*,'(/)') - write (*,*) "Wrong grid name in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 51 write (*,'(/)') - write (*,*) "Wrong min lat in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 52 write (*,'(/)') - write (*,*) "Wrong max lat in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 53 write (*,'(/)') - write (*,*) "Wrong ILAT in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 54 write (*,'(/)') - write (*,*) "Wrong min lon in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 55 write (*,'(/)') - write (*,*) "Wrong max lon in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 56 write (*,'(/)') - write (*,*) "Wrong ILON in GETGRD:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -********************************************************************* - SUBROUTINE GETLYN(NAMEG,XLAT,XLON,FAZ,BAZ,XMIN,XMAX,XINC) - -*** Interactively obtain the specifications for a line. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /FILES/ LUIN,LUOUT,I1,I2,I3,I4,I5,I6 - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - CHARACTER NAMEG*10 - - WRITE(LUOUT,100) - 100 FORMAT(' Enter name for line (10 character max.) ') - READ(LUIN,110,err=50,iostat=ios) NAMEG - if (ios /= 0) goto 50 - 110 FORMAT(A10) - WRITE(LUOUT,120) - 120 Format(' Specify the latitude for the origin of the line'/ - 1 ' in deg-min-sec in free format. For example'/ - 2 ' 35 17 28.3'/ - 3 ' Positive is north. ') - READ(LUIN,*,err=51,iostat=ios) LATD,LATM,SLAT - if (ios /= 0) goto 51 - XLAT = (DBLE(3600*LATD + 60*LATM)+SLAT)/RHOSEC - WRITE(LUOUT,130) - 130 FORMAT(' Specify the longitude for the origin of the line'/ - 1 ' in free format with west being positive. ') - READ(LUIN,*,err=52,iostat=ios) LOND,LONM,SLON - if (ios /= 0) goto 52 - XLON = (DBLE(3600*LOND+60*LONM)+SLON)/RHOSEC - WRITE(LUOUT,140) - 140 FORMAT(' Specify the orientation of the line clockwise from'/ - 1 ' north in decimal degrees, eg., 43.7. ') - READ(LUIN,*,err=53,iostat=ios) FAZ - if (ios /= 0) goto 53 - FAZ = 3600.D0*FAZ/RHOSEC - BAZ = FAZ + PI - IF(BAZ .GT. TWOPI) BAZ = BAZ - TWOPI - WRITE(LUOUT,150) - 150 FORMAT(' Specify minimum and maximum distance from origin in'/ - 1 ' meters, eg., -40000. 30000. '/ - 2 ' NOTE: negative distance corresponds to distance in'/ - 3 ' the opposite direction. ') - READ(LUIN,*,err=54,iostat=ios) XMIN,XMAX - if (ios /= 0) goto 54 - WRITE(LUOUT,160) - 160 FORMAT(' Specify distance increment in meters. ') - READ(LUIN,*,err=55,iostat=ios) XINC - if (ios /= 0) goto 55 - RETURN - - 50 write (*,'(/)') - write (*,*) 'Wrong name of line in GETLYN: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 51 write (*,'(/)') - write (*,*) 'Wrong LATD,LATM,SLAT in GETLYN: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 52 write (*,'(/)') - write (*,*) 'Wrong LOND,LONM,SLON in GETLYN: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 53 write (*,'(/)') - write (*,*) 'Wrong FAZ in GETLYN: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 54 write (*,'(/)') - write (*,*) 'Wrong min and max D in GETLYN: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 55 write (*,'(/)') - write (*,*) 'Wrong increment in GETLYN: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -******************************************************************* - SUBROUTINE DIRCT1(GLAT1,GLON1,GLAT2,GLON2,FAZ,BAZ,S) -C -C *** SOLUTION OF THE GEODETIC DIRECT PROBLEM AFTER T.VINCENTY -C *** MODIFIED RAINSFORD'S METHOD WITH HELMERT'S ELLIPTICAL TERMS -C *** EFFECTIVE IN ANY AZIMUTH AND AT ANY DISTANCE SHORT OF ANTIPODAL -C -C *** A IS THE SEMI-MAJOR AXIS OF THE REFERENCE ELLIPSOID -C *** FINV IS THE FLATTENING OF THE REFERENCE ELLIPSOID -C *** LATITUDES AND LONGITUDES IN RADIANS POSITIVE NORTH AND EAST -C *** AZIMUTHS IN RADIANS CLOCKWISE FROM NORTH -C *** GEODESIC DISTANCE S ASSUMED IN UNITS OF SEMI-MAJOR AXIS A -C -C *** PROGRAMMED FOR CDC-6600 BY LCDR L.PFEIFER NGS ROCKVILLE MD 20FEB75 -C *** MODIFIED FOR SYSTEM 360 BY JOHN G GERGEN NGS ROCKVILLE MD 750608 -C - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /CONST/ A,FINV,E2,EPI,AF,PI,TWOPI,RHOSEC - DATA EPS/0.5D-13/ - R=1.D0-FINV - TU=R*DSIN(GLAT1)/DCOS(GLAT1) - SF=DSIN(FAZ) - CF=DCOS(FAZ) - BAZ=0.D0 - IF(CF.NE.0.D0) BAZ=DATAN2(TU,CF)*2.D0 - CU=1.D0/DSQRT(TU*TU+1.D0) - SU=TU*CU - SA=CU*SF - C2A=-SA*SA+1.D0 - X=DSQRT((1.D0/R/R-1.D0)*C2A+1.D0)+1.D0 - X=(X-2.D0)/X - C=1.D0-X - C=(X*X/4.D0+1.D0)/C - D=(0.375D0*X*X-1.D0)*X - TU=S/R/A/C - Y=TU - 100 SY=DSIN(Y) - CY=DCOS(Y) - CZ=DCOS(BAZ+Y) - E=CZ*CZ*2.D0-1.D0 - C=Y - X=E*CY - Y=E+E-1.D0 - Y=(((SY*SY*4.D0-3.D0)*Y*CZ*D/6.D0+X)*D/4.D0-CZ)*SY*D+TU - IF(DABS(Y-C).GT.EPS)GO TO 100 - BAZ=CU*CY*CF-SU*SY - C=R*DSQRT(SA*SA+BAZ*BAZ) - D=SU*CY+CU*SY*CF - GLAT2=DATAN2(D,C) - C=CU*CY-SU*SY*CF - X=DATAN2(SY*SF,C) - C=((-3.D0*C2A+4.D0)*FINV+4.D0)*C2A*FINV/16.D0 - D=((E*CY*C+CZ)*SY*C+Y)*SA - GLON2=GLON1+X-(1.D0-C)*D*FINV - IF (GLON2.GE.TWOPI) GLON2=GLON2-TWOPI - IF(GLON2.LT.0.D0) GLON2=GLON2+TWOPI - BAZ=DATAN2(SA,BAZ)+PI - IF (BAZ.GE.TWOPI) BAZ=BAZ-TWOPI - IF (BAZ.LT.0.D0) BAZ=BAZ+TWOPI - RETURN - END -*********************************************************** - SUBROUTINE TOCHAR(ORIG,CHAR14) - -*** Convert double precision real number to character*14 - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - CHARACTER CHAR14*14 - - ORIG = ORIG*10000.D0 - WRITE(CHAR14,10) ORIG - 10 FORMAT(F14.0) - RETURN - END -********************************************************* - - SUBROUTINE DDXYZ(ISN, JSN, MIN1, MIN2, - 1 DDX, DDY, DDZ) - -** Compute change in DX,DY,DZ-vector from time MIN1 to MIN2. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - character PIDs*6 - parameter (nbbdim = 10000) - COMMON /ARRAYS/ HT(nbbdim), LOC(nbbdim),PIDs(nbbdim) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - READ(I4,REC=LOC(ISN),err=50,iostat=ios) GLATI,GLONI,VNI,VEI,VUI - if (ios /= 0) goto 50 - READ(I4,REC=LOC(JSN),err=51,iostat=ios) GLATJ,GLONJ,VNJ,VEJ,VUJ - if (ios /= 0) goto 51 - - CALL COMPSN(YLATI1,YLONI1,HTI1,GLATI,GLONI,HT(ISN), - 1 MIN1,VNI, VEI, VUI) - CALL COMPSN(YLATI2,YLONI2,HTI2,GLATI,GLONI,HT(ISN), - 1 MIN2, VNI, VEI, VUI) - CALL COMPSN(YLATJ1,YLONJ1,HTJ1,GLATJ,GLONJ,HT(JSN), - 1 MIN1, VNJ, VEJ, VUJ) - CALL COMPSN(YLATJ2,YLONJ2,HTJ2,GLATJ,GLONJ,HT(JSN), - 1 MIN2, VNJ, VEJ, VUJ) - - XLONI1 = -YLONI1 - XLONI2 = -YLONI2 - XLONJ1 = -YLONJ1 - XLONJ2 = -YLONJ2 - - CALL TOXYZ(YLATI1,XLONI1,HTI1,XI1,YI1,ZI1) - CALL TOXYZ(YLATI2,XLONI2,HTI2,XI2,YI2,ZI2) - CALL TOXYZ(YLATJ1,XLONJ1,HTJ1,XJ1,YJ1,ZJ1) - CALL TOXYZ(YLATJ2,XLONJ2,HTJ2,XJ2,YJ2,ZJ2) - - DDX = (XJ2 - XI2) - (XJ1 - XI1) - DDY = (YJ2 - YI2) - (YJ1 - YI1) - DDZ = (ZJ2 - ZI2) - (ZJ1 - ZI1) - - RETURN - - 50 write (*,'(/)') - write (*,*) "Failed in 1st read statement in DDXYZ:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 51 write (*,'(/)') - write (*,*) "Failed in 2nd read statement in DDXYZ:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -************************************************************* - SUBROUTINE DISLOC (YLAT,YLON,STRIKE,HL,EQLAT,EQLON, - & SS,DS,DIP,DEPTH,WIDTH,DNORTH,DWEST,DUP) - -*** Compute 3-dimensional earthquake displacement at point -*** using dislocation theory -* -* INPUT: -* YLAT = Latitude in radians (positive north) -* YLON = Longitude in radians (positive west) -* STRIKE = strike in radians clockwise from north such -* that the direction of dip is pi/2 radians -* counterclockwise from the direction of strike -* HL = Half-length in meters -* EQLAT = Latitude in radians of midpoint of the -* rectangle's upper edge (positive north) -* EQLON = Longitude in radians of midpoint of the -* rectangle's upper edge (positive west) -* SS = strike slip in meters (positive = right lateral) -* DS = dip slip in meters (positive = normal faulting) -* DIP = dip in radians -* DEPTH = Vertical depth of rectangle's upper edge -* in meters -* WIDTH = width of rectangle in meters -* -* OUTPUT: -* DNORTH = northward displacement in radians -* DWEST = westward displacement in radians -* DUP = upward displacement in meters -************** - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - -*** Compute radii of curvature at fault center - CALL RADII (EQLAT, RMER, RPAR) - -*** Compute planar coordinates in meters - DLAT = (YLAT - EQLAT) * RMER - DLON = (YLON - EQLON) * RPAR - COSSTR = DCOS(STRIKE) - SINSTR = DSIN(STRIKE) - X1 = COSSTR*DLAT - SINSTR*DLON - X2 = SINSTR*DLAT + COSSTR*DLON - -*** Compute displacements in fault-oriented coordinates - CALL OKADA(X1,X2,HL,DEPTH,WIDTH,DIP,U1SS,U2SS, - & U3SS,U1DS,U2DS,U3DS) - U1 = U1SS*SS + U1DS*DS - U2 = U2SS*SS + U2DS*DS - DUP = U3SS*SS + U3DS*DS - -*** Convert horizontal displacements to radians -*** in north-west coordinate system - DNORTH = ( COSSTR*U1 + SINSTR*U2) / RMER - DWEST = (-SINSTR*U1 + COSSTR*U2) / RPAR - - RETURN - END -**************************************************** - SUBROUTINE OKADA(X1,X2,XL,DU,W,DIP, - 1 U1SS,U2SS,U3SS,U1DS,U2DS,U3DS) - -************************************************************ -* This subroutine computes displacements at the point X1,X2 -* on the Earth's surface due to 1.0 meter of right-lateral -* strike slip (SS) and 1.0 meter of normal dip slip (DS) -* along a rectangular fault. -* -* The rectangular fault dips in the direction of the positive -* X2-axis. The rectangle's strike parallels the X1-axis. -* With the X3-axis directed upward out of the Earth, the X1-, -* X2-, and X3-axes form a right-handed system. -* -* The equations of dislocation theory are employed whereby -* Earth is represented an a homogeneous, isotropic half-space -* with a Poisson ratio of PNU. -* -* REFERENCE: Okada, Y., Surface deformation due to shear and -* tensile faults in a half-space, Bulletin of the -* Seismological Society of America, vol. 75, pp. 1135-1154 (1985) -* -* The X3 = 0 plane corresponds to the Earth's surface. The plane's -* origin is located directly above the midpoint of the rectangle's -* upper edge. -* -* INPUT: -* X1,X2 - Location in meters -* XL - Rectangle's half-length in meters -* DU - Vertical depth to rectangle's upper edge in meters -* (always positive or zero) -* W - Rectangle's width in meters -* DIP - Rectangle's dip in radians (always between 0 and PI/2 -* -* OUTPUT -* U1SS - Displacement in X1-direction due to 1.0 meters -* of right-lateral strike slip -* U2SS - Displacement in X2-direction due to 1.0 meters -* of right-lateral strike slip -* U3SS - Displacement in X3-direction due to 1.0 meters -* of right-lateral strike slip -* U1DS - Displacement in X1-direction due to 1.0 meters -* of normal dip slip -* U2DS - Displacement in X2-direction due to 1.0 meters -* of normal dip slip -* U3DS - Displacement in X3-direction due to 1.0 meters -* of normal dip slip -******************************************************************* - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - LOGICAL VERT - PI = 3.141593D0 - TWOPI = PI + PI - PNU = 0.25D0 - RATIO = 1.D0 - 2.D0*PNU - - IF(DABS(PI/2.D0 - DIP) .LT. .01D0)THEN - DIPK = -PI/2.D0 - VERT = .TRUE. - ELSE - DIPK = -DIP - VERT = .FALSE. - ENDIF - - SDIP = DSIN(DIPK) - CDIP = DCOS(DIPK) - P = X2*CDIP + DU*SDIP - Q = X2*SDIP - DU*CDIP - - PSI = X1 + XL - ETA = P - CALL OKADAW(PSI,ETA,Q,SDIP,CDIP,RATIO,TWOPI, - 1 VERT,U1SS,U2SS,U3SS,U1DS,U2DS,U3DS) - - PSI = X1 + XL - ETA = P - W - CALL OKADAW(PSI,ETA,Q,SDIP,CDIP,RATIO,TWOPI, - 1 VERT,C1SS,C2SS,C3SS,C1DS,C2DS,C3DS) - U1SS = U1SS - C1SS - U2SS = U2SS - C2SS - U3SS = U3SS - C3SS - U1DS = U1DS - C1DS - U2DS = U2DS - C2DS - U3DS = U3DS - C3DS - - PSI = X1 - XL - ETA = P - CALL OKADAW(PSI,ETA,Q,SDIP,CDIP,RATIO,TWOPI, - 1 VERT,C1SS,C2SS,C3SS,C1DS,C2DS,C3DS) - U1SS = U1SS - C1SS - U2SS = U2SS - C2SS - U3SS = U3SS - C3SS - U1DS = U1DS - C1DS - U2DS = U2DS - C2DS - U3DS = U3DS - C3DS - - PSI = X1 - XL - ETA = P - W - CALL OKADAW(PSI,ETA,Q,SDIP,CDIP,RATIO,TWOPI, - 1 VERT,C1SS,C2SS,C3SS,C1DS,C2DS,C3DS) - U1SS = U1SS + C1SS - U2SS = U2SS + C2SS - U3SS = U3SS + C3SS - U1DS = U1DS + C1DS - U2DS = U2DS + C2DS - U3DS = U3DS + C3DS - RETURN - END -************************************************************* - SUBROUTINE OKADAW(PSI,ETA,Q,SDIP,CDIP,RATIO,TWOPI, - 1 VERT,U1SS,U2SS,U3SS,U1DS,U2DS,U3DS) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - LOGICAL VERT - - YBAR = ETA*CDIP + Q*SDIP - DBAR = ETA*SDIP - Q*CDIP - R = DSQRT(PSI*PSI + ETA*ETA + Q*Q) - X = DSQRT(PSI*PSI + Q*Q) - IF(DABS(Q) .LE. 0.1d0) THEN - TERM = 0.D0 - ELSE - TERM = DATAN(PSI*ETA/(Q*R)) - ENDIF - - IF(VERT) THEN - F5 = -RATIO*PSI*SDIP/(R + DBAR) - F4 = -RATIO*Q/(R + DBAR) - F3 = 0.5D0*RATIO*(ETA/(R + DBAR) - 1 + YBAR*Q/((R + DBAR)*(R + DBAR)) - 2 - DLOG(R + ETA)) - F1 = -0.5D0*RATIO*PSI*Q/ - 1 ((R + DBAR)*(R + DBAR)) - ELSE - IF(DABS(PSI) .LE. 0.1D0) then - F5 = 0.d0 - ELSE - F5 = 2.D0*RATIO* - 1 DATAN((ETA*(X+Q*CDIP)+X*(R+X)*SDIP)/(PSI*(R+X)*CDIP)) - 2 /CDIP - ENDIF - F4 = RATIO*(DLOG(R+DBAR)-SDIP*DLOG(R+ETA))/CDIP - F3 = RATIO*(YBAR/(CDIP*(R+DBAR)) - DLOG(R+ETA)) - 1 + SDIP*F4/CDIP - F1 = -RATIO*(PSI/(CDIP*(R+DBAR))) - SDIP*F5/CDIP - ENDIF - F2 = -RATIO*DLOG(R+ETA) - F3 - - U1SS = -(PSI*Q/(R*(R+ETA)) - 1 + TERM + F1*SDIP)/TWOPI - U2SS = -(YBAR*Q/(R*(R+ETA)) - 1 + Q*CDIP/(R+ETA) - 2 + F2*SDIP)/TWOPI - U3SS = -(DBAR*Q/(R*(R+ETA)) - 1 + Q*SDIP/(R+ETA) - 2 + F4*SDIP)/TWOPI - U1DS = -(Q/R - F3*SDIP*CDIP)/TWOPI - U2DS = -(YBAR*Q/(R*(R+PSI)) - 1 + CDIP*TERM - F1*SDIP*CDIP)/TWOPI - U3DS = -(DBAR*Q/(R*(R+PSI)) - 1 + SDIP*TERM - F5*SDIP*CDIP)/TWOPI - RETURN - END -******************************************************************* - -C SUBROUTINE GRDCHK (POSX, POSY, INSIDE) - -C -C ROUTINE CHECKS IF THE POINT HAVING COORDINATES (POSX, POSY) -C IS WITHIN THE REGION SPANNED BY THE GRID -C -C IMPLICIT DOUBLE PRECISION (A-H,O-Z) -C IMPLICIT INTEGER*4 (I-N) -C LOGICAL INSIDE -C COMMON /CDGRID/ GRDLX, GRDUX, GRDLY, GRDUY, ICNTX, ICNTY - -C INSIDE = .TRUE. - -C IF (POSX .LT. GRDLX .OR. POSX .GT. GRDUX) THEN -C INSIDE = .FALSE. -C ENDIF -C IF (POSY .LT. GRDLY .OR. POSY .GT. GRDUY) THEN -C INSIDE = .FALSE. -C ENDIF - -C RETURN -C END - -******************************************************************* - - SUBROUTINE GRDWEI (YLON, YLAT, JREGN, I, J, WEI) - -C -C********1*********2*********3*********4*********5*********6*********7** -C -C NAME: GRDWEI -C VERSION: 9302.01 (YYMM.DD) -C WRITTEN BY: MR. C. RANDOLPH PHILIPP -C PURPOSE: THIS SUBROUTINE RETURNS THE INDICES OF THE LOWER-LEFT -C HAND CORNER OF THE GRID CELL CONTAINING THE POINT -C AND COMPUTES NORMALIZED WEIGHTS FOR -C BI-LINEAR INTERPOLATION OVER A PLANE -C -C INPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------ -C YLON LONGITUDE OF POINT IN RADIANS, POSITIVE WEST -C YLAT LATITUDE OF POINT IN RADIANS, POSITIVE NORTH -C JREGN ID OF GEOGRAPHIC REGION CONTAINING POINT -C -C OUTPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------- -C I, J THE COORDINATES OF LOWER LEFT CORNER OF THE GRID -C CONTAINING THE ABOVE POSITION -C WEI A TWO BY TWO ARRAY CONTAINING THE NORMALIZED WEIGHTS -C FOR THE CORNER VECTORS -C -C GLOBAL VARIABLES AND CONSTANTS: -C ------------------------------- -C NONE -C -C THIS MODULE CALLED BY: COMVEL -C -C THIS MODULE CALLS: NONE -C -C INCLUDE FILES USED: NONE -C -C COMMON BLOCKS USED: /CDGRID/, /CONST/ -C -C REFERENCES: SEE RICHARD SNAY -C -C COMMENTS: -C -C********1*********2*********3*********4*********5*********6*********7** -C MOFICATION HISTORY: -C::9302.11, CRP, ORIGINAL CREATION FOR DYNAP -C::9511.09, RAS, MODIFIED FOR HTDP -C::9712.05, RAS, MODIFIED TO ACCOUNT FOR MULTIPLE GRIDS -C********1*********2*********3*********4*********5*********6*********7** - -C**** COMPUTES THE WEIGHTS FOR AN ELEMENT IN A GRID - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NUMGRD = 10) - DIMENSION WEI(2,2) - COMMON /CDGRID/ GRDLX(NUMGRD), GRDUX(NUMGRD), - 1 GRDLY(NUMGRD), GRDUY(NUMGRD), - 1 ICNTX(NUMGRD), ICNTY(NUMGRD), NBASE(NUMGRD) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - -C*** Convert input coordinates to degrees - POSX = (TWOPI - YLON) * 180.D0 / PI - POSY = YLAT * 180.D0 / PI - -C*** Obtain indices for the lower-left corner of the cell -C*** containing the point - STEPX = (GRDUX(JREGN) - GRDLX(JREGN)) / ICNTX(JREGN) - STEPY = (GRDUY(JREGN) - GRDLY(JREGN)) / ICNTY(JREGN) - I = IDINT((POSX - GRDLX(JREGN))/STEPX) + 1 - J = IDINT((POSY - GRDLY(JREGN))/STEPY) + 1 -c write(6,1001) JREGN, I, J -c1001 format(1x, 'jregn = ', I5 / -c 1 1x, ' i = ', I5 / -c 1 1x, ' j = ', I5) - -C*** Compute the limits of the grid cell - GRLX = GRDLX(JREGN) + (I - 1) * STEPX - GRUX = GRLX + STEPX - GRLY = GRDLY(JREGN) + (J - 1) * STEPY - GRUY = GRLY + STEPY - -C*** Compute the normalized weights for the point - DENOM = (GRUX - GRLX) * (GRUY - GRLY) - WEI(1,1) = (GRUX - POSX) * (GRUY - POSY) / DENOM - WEI(2,1) = (POSX - GRLX) * (GRUY - POSY) / DENOM - WEI(1,2) = (GRUX - POSX) * (POSY - GRLY) / DENOM - WEI(2,2) = (POSX - GRLX) * (POSY - GRLY) / DENOM - - RETURN - END - -C********************************************************************* -C - SUBROUTINE GRDVEC (JREGN, I, J, VEL, B) -C -C********1*********2*********3*********4*********5*********6*********7** -C -C NAME: GRDVEC -C VERSION: 9302.01 (YYMM.DD) -C WRITTEN BY: MR. C. RANDOLPH PHILIPP -C PURPOSE: THIS SUBROUTINE RETRIEVES THE APPROXIMATE VALUES OF THE -C GRID NODE VELOCITIES FOR GRID (I,J) -C -C INPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------ -C JREGN ID OF GEOGRAPHIC REGION CORRESPONDING TO GRID -C I, J THE COORDINATES OF LOWER LEFT CORNER OF THE GRID -C CONTAINING THE ABOVE POSITION -C B THE ARRAY CONTAINING ALL THE APPROXIMATE VALUES -C FOR THE ADJUSTMENT -C -C OUTPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------- -C VEL A TWO BY TWO ARRAY CONTAINING THE VELOCITY VECTORS -C FOR THE CORNERS OF THE GRID -C -C GLOBAL VARIABLES AND CONSTANTS: -C ------------------------------- -C NONE -C -C THIS MODULE CALLED BY: COMVEL -C -C THIS MODULE CALLS: NONE -C -C INCLUDE FILES USED: NONE -C -C COMMON BLOCKS USED: NONE -C -C REFERENCES: SEE RICHARD SNAY -C -C COMMENTS: -C -C********1*********2*********3*********4*********5*********6*********7** -C MOFICATION HISTORY: -C::9302.11, CRP, ORIGINAL CREATION FOR DYNAP -C::9712.05, RAS, MODIFIED FOR HTDP (version 2.2) -C********1*********2*********3*********4*********5*********6*********7** - - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - DIMENSION VEL(2,2,3), B(*) - - DO 30 II = 0,1 - DO 20 IJ = 0,1 - DO 10 IVEC = 1, 3 - INDEX = IUNGRD(JREGN, I + II, J + IJ, IVEC) - VEL(II + 1, IJ + 1, IVEC) = B(INDEX) - 10 CONTINUE - 20 CONTINUE - 30 CONTINUE - - RETURN - END - -C*************************************************** - - SUBROUTINE RDEG (INPUT,VAL,CNEG) - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - - CHARACTER INPUT*10 - CHARACTER CNEG*1 - INTEGER DEG, MIN, ISEC - - DO 10 I = 1, 9 - IF (INPUT(I:I).EQ.' ') THEN - INPUT(I:I) = '0' - ENDIF - 10 CONTINUE - - READ (INPUT,20) DEG, MIN, ISEC - - 20 FORMAT(I3,I2,I4) - - SEC = ISEC/100.D0 - - VAL = (DEG + (MIN/60.D0) + (SEC/3600.D0) ) - - IF (INPUT(10:10).EQ.CNEG) THEN - VAL = -VAL - ENDIF - - RETURN - END - -C*************************************************** - - INTEGER FUNCTION IUNGRD(IREGN, I, J, IVEC) - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NUMGRD = 10) - COMMON /CDGRID/ GRDLX(NUMGRD), GRDUX(NUMGRD), - 1 GRDLY(NUMGRD), GRDUY(NUMGRD), - 1 ICNTX(NUMGRD), ICNTY(NUMGRD), NBASE(NUMGRD) - - IUNGRD = NBASE(IREGN) + - 1 3 * ((J - 1) * (ICNTX(IREGN) + 1) + (I - 1)) + IVEC - - RETURN - END - -C********************************************************* -C - SUBROUTINE TOMNT( IYR, IMON, IDAY, IHR, IMN, MINS ) -C -C********1*********2*********3*********4*********5*********6*********7** -C -C NAME: TOMNT (ORIGINALLY IYMDMJ) -C VERSION: 9004.17 -C WRITTEN BY: M. SCHENEWERK -C PURPOSE: CONVERT DATE TO MODIFIED JULIAN DATE PLUS UT -C -C INPUT PARAMETERS FROM THE ARGUEMENT LIST: -C ----------------------------------------- -C IDAY DAY -C IMON MONTH -C IYR YEAR -C -C OUTPUT PARAMETERS FROM ARGUEMENT LIST: -C -------------------------------------- -C MINS MODIFIED JULIAN DATE IN MINUTES -C -C -C LOCAL VARIABLES AND CONSTANTS: -C ------------------------------ -C A TEMPORARY STORAGE -C B TEMPORARY STORAGE -C C TEMPORARY STORAGE -C D TEMPORARY STORAGE -C IMOP TEMPORARY STORAGE -C IYRP TEMPORARY STORAGE -C -C GLOBAL VARIABLES AND CONSTANTS: -C ------------------------------ -C -C -C THIS MODULE CALLED BY: GENERAL USE -C -C THIS MODULE CALLS: DINT -C -C INCLUDE FILES USED: -C -C COMMON BLOCKS USED: -C -C REFERENCES: DUFFETT-SMITH, PETER 1982, 'PRACTICAL -C ASTRONOMY WITH YOUR CALCULATOR', 2ND -C EDITION, CAMBRIDGE UNIVERSITY PRESS, -C NEW YORK, P.9 -C -C COMMENTS: THIS SUBROUTINE REQUIRES THE FULL YEAR, -C I.E. 1992 RATHER THAN 92. -C -C********1*********2*********3*********4*********5*********6*********7** -C::LAST MODIFICATION -C::8909.06, MSS, DOC STANDARD IMPLIMENTED -C::9004.17, MSS, CHANGE ORDER YY MM DD -C********1*********2*********3*********4*********5*********6*********7** -C - IMPLICIT DOUBLE PRECISION(A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) -C - INTEGER*4 A, B, C, D - - IYRP = IYR -C -C........ 0.0 EXPLICIT INITIALIZATION -C - IF( IMON .LT. 3 ) THEN - IYRP= IYRP - 1 - IMOP= IMON + 12 - ELSE - IMOP= IMON - END IF -C -C........ 1.0 CALCULATION -C - A= IYRP*0.01D0 - B= 2 - A + DINT( A*0.25D0 ) - C= 365.25D0*IYRP - D= 30.6001D0*(IMOP + 1) - MINS = (B + C + D + IDAY - 679006) * (24 * 60) - & + (60 * IHR) + IMN -C - RETURN - END -***************************************************** - SUBROUTINE TOVNEU(GLAT,GLON,VX,VY,VZ,VN,VE,VU) - -*** Convert velocities from vx,vy,vz to vn,ve,vu - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - - SLAT = DSIN(GLAT) - CLAT = DCOS(GLAT) - SLON = DSIN(GLON) - CLON = DCOS(GLON) - - VN = -SLAT*CLON*VX - SLAT*SLON*VY + CLAT*VZ - VE = -SLON*VX + CLON*VY - VU = CLAT*CLON*VX + CLAT*SLON*VY + SLAT*VZ - - RETURN - END -*************************************************** - SUBROUTINE TOVXYZ(GLAT,GLON,VN,VE,VU,VX,VY,VZ) -*** Convert velocities from vn,ve,vu to vx,vy,vz - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - - SLAT = DSIN(GLAT) - CLAT = DCOS(GLAT) - SLON = DSIN(GLON) - CLON = DCOS(GLON) - - VX = -SLAT*CLON*VN - SLON*VE + CLAT*CLON*VU - VY = -SLAT*SLON*VN + CLON*VE + CLAT*SLON*VU - VZ = CLAT*VN + SLAT*VU - - RETURN - END -***************************************************** - SUBROUTINE DPLACE - -*** Predict displacements between two dates. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (numref = 16) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - CHARACTER CARD*80 - CHARACTER record*120 - CHARACTER NAMEF*30,NAME*30,NAMEBB*30, NAMEIF*30 - CHARACTER NAME24 - CHARACTER BLAB*17 - CHARACTER NAMEG*10 - CHARACTER TYPE*4 - CHARACTER OPTION*1,JN*1,JW*1, VOPT*1 - CHARACTER LATDIR*1, LONDIR*1 - CHARACTER ANSWER*1 - character frame1*24 - LOGICAL TEST - - BLAB = 'OUTSIDE OF REGION' - - WRITE(LUOUT,10) - 10 FORMAT( - 1 ' Displacements will be predicted from time T1 to time T2.') - WRITE(LUOUT,* ) ' Please enter T1 ' - 20 CALL GETMDY(MONTH1,IDAY1,IYEAR1,DATE1,MIN1,TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter T1? (y/n)' - read (luin,21,err=600,iostat=ios) ANSWER - if (ios /= 0) goto 600 - 21 format( A1 ) - IF (ANSWER .eq. 'y' .or. ANSWER .eq. 'Y') GO TO 20 - RETURN - ENDIF - WRITE(LUOUT,*) ' Please enter T2 ' - 35 CALL GETMDY(MONTH2,IDAY2,IYEAR2,DATE2,MIN2,TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter T2? (y/n) ' - read(luin,21,err=600,iostat=ios) ANSWER - if (ios /= 0) goto 600 - if (ANSWER .eq. 'y' .or. ANSWER .eq. 'Y') GO TO 35 - RETURN - ENDIF - - WRITE(LUOUT,45) - 45 FORMAT( - 1 ' Please enter the name for the file to contain'/ - 2 ' the predicted displacements. ') - READ(LUIN,50,err=601,iostat=ios) NAMEF - if (ios /= 0) goto 601 - 50 FORMAT(A30) - OPEN(I2,FILE=NAMEF,STATUS='UNKNOWN') - CALL HEADER - -*** Choosing reference frame for displacements - 56 WRITE(LUOUT,55) - 55 FORMAT(' ************************************************'/ - 1 ' Select the reference frame to be used for specifying'/ - 2 ' positions and displacements. '/) - call MENU1(iopt, frame1) - - IF(IOPT .GE. 1 .AND . IOPT .LE. numref) THEN - WRITE(I2,57) frame1 - 57 FORMAT(' DISPLACEMENTS IN METERS RELATIVE TO ', a24) - ELSE - WRITE(LUOUT,70) - 70 FORMAT(' Improper selection--try again. ') - GO TO 56 - ENDIF - - WRITE(I2,71) MONTH1,IDAY1,IYEAR1,MONTH2,IDAY2,IYEAR2, - 1 DATE1, DATE2 - 71 FORMAT ( - 1 ' FROM ',I2.2,'-',I2.2,'-',I4,' TO ', - 2 I2.2,'-',I2.2,'-',I4,' (month-day-year)'/ - 2 ' FROM ',F8.3, ' TO ',F8.3, ' (decimal years)'// - 3 'NAME OF SITE LATITUDE LONGITUDE ', - 4 ' NORTH EAST UP ') - 75 WRITE(LUOUT,80) - 80 FORMAT(' ********************************'/ - 1 ' Displacements will be predicted at each point whose',/ - 2 ' horizontal position is specified.',/ - 4 ' Please indicate how you wish to supply positions.'/ ) - 85 WRITE(LUOUT,86) - 86 FORMAT( - 5 ' 0. No more points. Return to main menu.'/ - 6 ' 1. Individual points entered interactively.'/ - 7 ' 2. Points on a specified grid.'/ - 8 ' 3. The *80* records in a specified blue-book file.'/ - 9 ' 4. Points on a specified line. ' / - 1 ' 5. Batch file of delimited records of form: ' / - 2 ' LAT,LON,TEXT ' / - 4 ' LAT = latitude in degrees (positive north/DBL PREC)' / - 5 ' LON = longitude in degrees (positive west/DBL PREC)' / - 7 ' TEXT = Descriptive text (CHARACTER*24) ' / - 8 ' Example: ' / - 9 ' 40.731671553,112.212671753,SALT AIR '/) - READ(LUIN,'(A1)',err=602,iostat=ios) OPTION - if (ios /= 0) goto 602 - - IF(OPTION .EQ. '0') THEN - GO TO 510 - ELSEIF(OPTION .EQ. '1') THEN - CALL GETPNT(LATD,LATM,SLAT,LATDIR,LOND,LONM,SLON, - 1 LONDIR,NAME24, X,Y,Z,YLAT,YLON,EHT) - ELON = - YLON - call GETVLY(YLAT,ELON,VX,VY,VZ,VN,VE,VU,VOPT,210) - if (vopt .eq. '0') then - call PREDV( ylat, ylon, eht, date1, iopt, - 1 jregn, vn, ve, vu) - if (jregn .eq. 0) then - write(luout, 140) - go to 85 - endif - endif - call NEWCOR(ylat, ylon, eht, min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) - 140 FORMAT(' ****************************************'/ - 1 ' A displacement can not be predicted because'/ - 1 ' the point is outside of the modeled region.'/ - 2 ' For additional displacements, please indicate how'/ - 3 ' you wish to supply the horizontal coordinates.'/) - WRITE(LUOUT,150) DN, DE,DU - 150 FORMAT(' *************************************'/ - 1 ' Northward displacement = ',F7.3,' meters.'/ - 1 ' Eastward displacement = ',F7.3,' meters.'/ - 1 ' Upward displacement = ',F7.3,' meters.'/ - 1 ' ****************************************'// - 2 ' For additional displacements, please indicate how'/ - 3 ' you wish to supply the horizontal coordinates.'/) - WRITE(I2,160) NAME24,LATD,LATM,SLAT,LATDIR, - 1 LOND,LONM,SLON,LONDIR,DN,DE,DU - 160 FORMAT(A24,1X,I2,1X,I2,1X,F8.5,1X,A1,2X, - 1 I3,1X,I2,1X,F8.5,1X,A1,1X,3F8.3) - ELSEIF(OPTION .EQ. '2') THEN - CALL GETGRD(NAMEG,MINLAT,MAXLAT,IDS,MINLON,MAXLON,JDS) - I = -1 - 280 I = I + 1 - LAT = MINLAT + I*IDS - IF(LAT .GT. MAXLAT) GO TO 296 - XLAT = DBLE(LAT)/RHOSEC - CALL TODMSS(XLAT,LATD,LATM,SLAT,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - J = -1 - 290 J = J + 1 - YLAT = XLAT - LON = MINLON + J*JDS - IF(LON .GT. MAXLON) GO TO 280 - YLON = DBLE(LON)/RHOSEC - CALL TODMSS(YLON,LOND,LONM,SLON,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - EHT = 0.D0 - call PREDV(ylat,ylon, eht, date1, iopt, - 1 jregn, vn, ve, vu) - IF(JREGN .eq. 0) THEN - WRITE(I2,291)NAMEG,I,J,LATD,LATM,SLAT,LATDIR,LOND, - 1 LOND,LONM,SLON,LONDIR,BLAB - 291 FORMAT(A10,2I4, 7X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3, - 1 1X,I2,1X,F8.5,1X,A1,1X,A17) - ELSE - call NEWCOR( ylat, ylon, eht, min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) - WRITE(I2,295)NAMEG,I,J,LATD,LATM,SLAT,LATDIR, - 1 LOND,LONM,SLON,LONDIR,DN,DE,DU - 295 FORMAT(A10,2I4, 7X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2, - 1 1X,F8.5,1X,A1,1X,3F8.3) - ENDIF - GO TO 290 - 296 WRITE(LUOUT,297) - 297 FORMAT(' ***********************************'/ - 1 ' Displacements have been calculated for the specified'/ - 2 ' grid. If you wish to calculate additional displacements,'/ - 3 ' please indicate how you will supply the coordinates.'/) - ELSEIF(OPTION .EQ. '3') THEN - VOPT = '0' - WRITE(LUOUT,300) - 300 FORMAT(' Enter name of blue-book file ') - READ(LUIN,310,err=603,iostat=ios) NAMEBB - if (ios /= 0) goto 603 - 310 FORMAT(A30) - OPEN(I1,FILE=NAMEBB,STATUS='OLD') - 320 READ(I1,330,END=350,err=604,iostat=ios) CARD - if (ios /= 0) goto 604 - 330 FORMAT(A80) - TYPE = CARD(7:10) - IF(TYPE .EQ. '*80*') THEN - READ(CARD,340,err=605,iostat=ios) NAME,LATD,LATM,SLAT,JN, - 1 LOND,LONM,SLON,JW - if (ios /= 0) goto 605 - 340 FORMAT(BZ,14X,A30,I2,I2,F7.5,A1,I3,I2,F7.5,A1) - NAME24 = NAME(1:24) -C IF(JN.EQ.'S' .OR. JW.EQ.'E')GO TO 320 - YLAT =(DBLE((LATD*60+LATM)*60)+SLAT)/RHOSEC - IF (JN .eq. 'S') YLAT = -YLAT - YLON =(DBLE((LOND*60+LONM)*60)+SLON)/RHOSEC - IF (JW .eq. 'E') YLON = -YLON - EHT = 0.D0 - call PREDV( ylat, ylon, eht, date1, iopt, - 1 jregn, vn, ve, vu) - IF(JREGN .EQ. 0) THEN - WRITE(I2,345)NAME24,LATD,LATM,SLAT,JN,LOND,LONM,SLON, - 1 JW,BLAB - 345 FORMAT(A24,1X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2,1X, - 1 F8.5,1X,A1,1X,A17) - ELSE - call NEWCOR( ylat, ylon, eht, min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) - WRITE(I2,160)NAME24,LATD,LATM,SLAT,JN,LOND,LONM,SLON, - 1 JW,DN,DE,DU - ENDIF - ENDIF - GO TO 320 - 350 CLOSE(I1,STATUS='KEEP') - WRITE(LUOUT,360) - 360 FORMAT(' ************************************'/ - 1 ' Displacements have been calculated for the specified'/ - 2 ' blue-book file. If you wish to calculate additional'/ - 3 ' displacements, please indicate how you will supply'/ - 4 ' the horizontal coordinates.'/) - ELSEIF(OPTION .EQ. '4') THEN - VOPT = '0' - CALL GETLYN(NAMEG,XLAT,XLON,FAZ,BAZ,XMIN,XMAX,XINC) - XLON = TWOPI - XLON - I = -1 - 400 I = I + 1 - S = XMIN + I*XINC - IF(S .GT. XMAX) GO TO 430 - IF(S .LT. 0.0D0) THEN - S1 = -S - AZ = BAZ - ELSE - S1 = S - AZ = FAZ - ENDIF - CALL DIRCT1(XLAT,XLON,YLAT,YLON,AZ,AZ1,S1) - YLON = TWOPI - YLON - CALL TODMSS(YLAT,LATD,LATM,SLAT,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - CALL TODMSS(YLON,LOND,LONM,SLON,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - EHT = 0.D0 - call PREDV( ylat, ylon, eht, date1, iopt, - 1 jregn, vn, ve, vu) - IF(JREGN .eq. 0) THEN - WRITE(I2,405)NAMEG,I,LATD,LATM,SLAT,LATDIR, - 1 LOND,LONM,SLON,LONDIR, BLAB - 405 FORMAT(A10,I4,11X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2,1X, - 1 F8.5,1X,A1,1X,A17) - ELSE - call NEWCOR( ylat, ylon, eht, min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) - WRITE(I2,410)NAMEG,I,LATD,LATM,SLAT,LATDIR,LOND,LONM, - 1 SLON,LONDIR,DN,DE,DU - 410 FORMAT(A10,I4,11X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2, - 1 1X,F8.5,1X,A1,1X,3F8.3) - ENDIF - GO TO 400 - 430 WRITE(LUOUT,440) - 440 FORMAT(' ***************************************'/ - 1 ' Displacements have been calculated for the specified'/ - 2 ' line. If you wish to calculate additional displacements,'/ - 3 ' please indicate how you will supply the coordinates.'/) - ELSEIF(OPTION .EQ. '5') THEN - VOPT = '0' - EHT = 0.0D0 - write(luout,450) - 450 format(' Enter name of batch file ') - read(luin, 451,err=606,iostat=ios) NAMEIF - if (ios /= 0) goto 606 - 451 format(a30) - open(I1,FILE=NAMEIF,STATUS='OLD') - 455 read(I1,'(a)',END=460,err=607,iostat=ios) record - if (ios /= 0) goto 607 -c write(i2, 457) record - call interprate_latlon_record (record,XLAT,XLON,name24) -c write (i2,456) xlat, xlon -c write(i2,457) record -c 457 format (a50) -c 456 format(1x,' xlat = ', f15.3, 'xlon = ', f15.3) - YLAT = (XLAT*3600.D0)/RHOSEC - YLON = (XLON*3600.D0)/RHOSEC - CALL TODMSS(YLAT,LATD,LATM,SLAT,ISIGN) - IF (ISIGN .EQ. 1) THEN - JN = 'N' - ELSE - JN = 'S' - ENDIF - CALL TODMSS(YLON, LOND,LONM,SLON,ISIGN) - IF (ISIGN .EQ. 1) THEN - JW = 'W' - ELSE - JW = 'E' - ENDIF - CALL PREDV(YLAT,YLON,EHT,DATE1,IOPT, - 1 JREGN,VN,VE,VU) - IF (JREGN .EQ. 0) THEN - Write(I2,345) NAME24,LATD,LATM,SLAT, JN, - 1 LOND,LONM,SLON,JW, BLAB - ELSE - CALL NEWCOR (YLAT, YLON, EHT, MIN1, MIN2, - 1 YLATT, YLONT, EHTNEW, DN,DE,DU,VN,VE,VU) - WRITE(I2, 160) NAME24, LATD, LATM, SLAT, JN, - 1 LOND, LONM, SLON, JW, DN, DE , DU - ENDIF - GO TO 455 - 460 CLOSE(I1, STATUS = 'KEEP') - write(LUOUT, 470) - 470 format(' ******************************************'/ - 1 ' Displacements have been calculated for the specified'/ - 1 ' file. If you wish to calculate additional displacements,'/ - 1 ' please indicate how you will supply the horizontal '/ - 1 ' coordinates.'/) - ELSE - WRITE(LUOUT,500) - 500 FORMAT(' Improper entry--select again. ') - ENDIF - GO TO 85 - 510 CONTINUE - CLOSE(I2, STATUS = 'KEEP') - RETURN - - 600 write (*,'(/)') - write (*,*) 'Wrong answer in DPLACE: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 601 write (*,'(/)') - write (*,*) 'Wrong file name in DPLACE: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 602 write (*,'(/)') - write (*,*) 'Wrong OPTION in DPLACE: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 603 write (*,'(/)') - write (*,*) 'Wrong bbname in DPLACE: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 604 write (*,'(/)') - write (*,*) 'Wrong CARD from bbfile in DPLACE:ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 605 write (*,'(/)') - write (*,*) 'Wrong CARD80 from bbfile in DPLACE:ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 606 write (*,'(/)') - write (*,*) 'Wrong batch file name in DPLACE:ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 607 write (*,'(/)') - write (*,*) 'Wrong record from batch in DPLACE:ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -******************************************************************** - SUBROUTINE VELOC - -*** Compute velocities at specified locations - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (numref = 16) - parameter (nrsrch = 0) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - CHARACTER CARD*80 - CHARACTER NAMEF*30,NAME*30,NAMEBB*30,PVFILE*30 - CHARACTER NAME24*24 - CHARACTER BLAB*17 - CHARACTER NAMEG*10 - CHARACTER TYPE*4 - CHARACTER OPTION*1,JN*1,JW*1,PVOUT*1 - CHARACTER LATDIR*1, LONDIR*1 - character frame1*24 - character record*120 - -*** temporary code to plot results **************** - character TEMPNA - - TEMPNA = ' ' - DUMMY = 0.0D0 -*** end of temporary code ************************* - - BLAB = 'OUTSIDE OF REGION' - - WRITE(LUOUT,10) - 10 FORMAT(' Please enter name for the file to contain the'/ - 1 ' predicted velocities. ') - READ(LUIN,20,err=700,iostat=ios) NAMEF - if (ios /= 0) goto 700 - 20 FORMAT(A30) - OPEN(I2,FILE=NAMEF,STATUS='UNKNOWN') - CALL HEADER - - if (nrsrch .eq. 1) then - WRITE(LUOUT,21) - 21 FORMAT( - 1 ' Do you want to create a file of point-velocity (PV)'/ - 1 ' records for use with the DYNAPG software (y/n)? ') - READ(LUIN,'(A1)',err=701,iostat=ios) PVOUT - if (ios /= 0) goto 701 - IF(PVOUT .EQ. 'Y' .OR. PVOUT .EQ. 'y') THEN - PVOUT = 'Y' - WRITE(LUOUT,22) - 22 FORMAT(' Enter name for the file that is to contain'/ - 1 ' the PV records. ') - READ(LUIN,'(A30)',err=702,iostat=ios) PVFILE - if (ios /= 0) goto 702 - OPEN(I3,FILE = PVFILE, STATUS = 'UNKNOWN') - ENDIF - else - PVOUT = 'N' - endif - -*** Choosing reference system for velocities - 1000 WRITE(LUOUT,1001) - 1001 FORMAT(' **************************************************'/ - 1 ' Select the reference frame to be used for specifying'/ - 2 ' positions and velocities. '/ -c 6 ' 0...Positions in NAD 83 and velocities relative to'/ -c 6 ' a specified point having a specified velocity.') - 6 ) - call MENU1(iopt, frame1) - if (iopt .ge. 1 .and. iopt .le. numref) then - WRITE(I2,1002) frame1 - 1002 FORMAT('VELOCITIES IN MM/YR RELATIVE TO ', a24 /) - RVN = 0.0D0 - RVE = 0.0D0 - RVU = 0.0D0 - ELSEIF(IOPT .EQ. 0) THEN - WRITE(LUOUT,1010) - CALL GETPNT(LATD,LATM,SLAT,LATDIR,LOND,LONM,SLON, - 1 LONDIR, NAME24, X,Y,Z,YLAT,YLON,EHT) - CALL GETREG(YLAT,YLON,JREGN) - IF(JREGN .EQ. 0 ) THEN - WRITE(LUOUT,1008) - 1008 FORMAT(' **********************************'/ - 1 ' Point is not in modeled region and it can not'/ - 1 ' be used as the reference location.'/) - GO TO 1000 - ENDIF - WRITE(I2,1009) - 1009 FORMAT('VELOCITIES IN MM/YR IN A REFERENCE FRAME FOR ', - 1 'WHICH THE FIRST POINT LISTED'/ - 2 'BELOW HAS THE VELOCITY AS LISTED'// - 4 '**************REFERENCE SITE') - 1010 FORMAT(' For the reference point...'/) - WRITE(LUOUT,1030) - 1030 FORMAT(' Enter northward velocity of reference location'/ - 1 ' in mm/yr. ') - READ(LUIN,*,err=703,iostat=ios) SVN - if (ios /= 0) goto 703 - WRITE(LUOUT,1040) - 1040 FORMAT(' Enter eastward velocity of reference location'/ - 1 ' in mm/yr. ') - READ(LUIN,*,err=703,iostat=ios) SVE - if (ios /= 0) goto 703 - WRITE(LUOUT,1050) - 1050 FORMAT(' Enter upward velocity of the reference location'/ - 1 ' in mm/yr. ') - READ(LUIN,*,err=703,iostat=ios) SVU - if (ios /= 0) goto 703 - CALL COMVEL(YLAT,YLON,JREGN,VN,VE,VU) - RVN = SVN - VN - RVE = SVE - VE - RVU = SVU - VU - GLON = -YLON - CALL TOVXYZ(YLAT,GLON,SVN,SVE,SVU,SVX,SVY,SVZ) - WRITE(I2,1060) NAME24,LATD,LATM,SLAT,LATDIR,SVN,LOND,LONM, - 1 SLON,LONDIR,SVE,EHT,SVU,X,SVX,Y,SVY,Z,SVZ - 1060 FORMAT(/10X,A24,/ - 1'LATITUDE = ',2I3,F9.5,1X,A1,' NORTH VELOCITY =',F7.2,' mm/yr'/ - 2'LONGITUDE = ',2I3,F9.5,1X,A1,' EAST VELOCITY =',F7.2,' mm/yr'/ - 3'ELLIPS. HT. = ',F10.3,' m', 6X,'UP VELOCITY =',F7.2,' mm/yr'/ - 4'X =',F13.3,' m',14X, 'X VELOCITY =',F7.2,' mm/yr'/ - 5'Y =',F13.3,' m',14X, 'Y VELOCITY =',F7.2,' mm/yr'/ - 6'Z =',F13.3,' m',14X, 'Z VELOCITY =',F7.2,' mm/yr') - WRITE(I2,1070) - 1070 FORMAT('******************************') - ELSE - write(luout, 1080) - 1080 format(' Improper selection -- try again. ') - GO TO 1000 - ENDIF - -*** Choosing input format for locations where velocities are to be predicted - WRITE(LUOUT,30) - 30 FORMAT(' ************************************************'/ - 1 ' Velocities will be predicted at each point whose'/ - 2 ' horizontal position is specified. Please indicate'/ - 4 ' how you wish to supply positions.'/) - 40 WRITE(LUOUT,50) - 50 FORMAT( - 1 ' 0... No more points. Return to main menu.'/ - 2 ' 1... Individual points entered interactively.'/ - 3 ' 2... Points on a specified grid.'/ - 4 ' 3... The *80* records in a specified blue-book file.'/ - 5 ' 4... Points on a specified line. '/ - 6 ' 5... Batch file of delimited records of form: '/ - 7 ' LAT,LON,TEXT '/ - 8 ' LAT = latitude in degrees (positive north/DBL PREC) '/ - 9 ' LON = longitude in degrees (positive west/DBL PREC) '/ - 1 ' TEXT = Descriptive text (CHARACTER*24) '/ - 1 ' Example: '/ - 2 ' 40.731671553,112.212671753,SALT AIR '/) - - READ(LUIN,60,err=704,iostat=ios) OPTION - if (ios /= 0) goto 704 - 60 FORMAT(A1) - - IF(OPTION .EQ. '0') THEN - GO TO 610 - ELSEIF(OPTION .EQ. '1') THEN - CALL GETPNT(LATD,LATM,SLAT,LATDIR,LOND,LONM,SLON, - 1 LONDIR, NAME24, X,Y,Z,YLAT,YLON,EHT) - CALL GTOVEL(YLAT,YLON,EHT,RVN,RVE,RVU, - 1 VN,VE,VU,VX,VY,VZ,JREGN,IOPT) - IF(JREGN .eq. 0 ) THEN - WRITE(LUOUT,80) - 80 FORMAT(' *************************************'/ - 1 ' A velocity can not be predicted because'/ - 1 ' the point is outside of the modeled region.'/ - 2 ' For additional velocities, please indicate how'/ - 3 ' you wish to supply the horizontal coordinates.'/) - ELSE - WRITE(LUOUT,90) VN, VE, VU, VX, VY, VZ - 90 FORMAT(' **************************************'/ - 1 ' Northward velocity = ',F6.2,' mm/yr'/ - 1 ' Eastward velocity = ',F6.2,' mm/yr'/ - 1 ' Upward velocity = ',F6.2,' mm/yr'// - 1 ' X-dim. velocity = ',F6.2,' mm/yr'/ - 1 ' Y-dim. velocity = ',F6.2,' mm/yr'/ - 1 ' Z-dim. velocity = ',F6.2,' mm/yr'/ - 1 ' **************************************'// - 2 ' For additional velocities, please indicate how'/ - 3 ' you wish to specify the horizontal coordinates.'/) - WRITE(I2,1060)NAME24,LATD,LATM,SLAT,LATDIR,VN,LOND,LONM, - 1 SLON, LONDIR, VE, EHT,VU,X,VX,Y,VY,Z,VZ - 100 FORMAT(A24,1X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2,1X,F8.5, - 1 1X,A1,1X,3F8.2) - IF(PVOUT .EQ. 'Y') THEN - CALL PVPRNT(LATD,LATM,SLAT,LOND,LONM,SLON,VN,VE,VU) - ENDIF - ENDIF - ELSEIF(OPTION .EQ. '2') THEN - EHT = 0.D0 - WRITE(I2,105) - 105 FORMAT( - 1 'NAME OF SITE',14X,'LATITUDE LONGITUDE ', - 2 ' NORTH EAST UP'/) - 106 FORMAT( - 1 'NAME OF LINE', 6X,'LATITUDE LONGITUDE ', - 2 ' NORTH EAST UP'/) - CALL GETGRD(NAMEG,MINLAT,MAXLAT,IDS,MINLON,MAXLON,JDS) - I = -1 - 110 I = I + 1 - LAT = MINLAT + I*IDS - IF(LAT .GT. MAXLAT) GO TO 150 - XLAT = DBLE(LAT)/RHOSEC - CALL TODMSS(XLAT,LATD,LATM,SLAT,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - J = -1 - 120 J = J + 1 - YLAT = XLAT - ON = MINLON + J*JDS - IF(LON .GT. MAXLON) GO TO 110 - YLON = DBLE(LON)/RHOSEC - CALL TODMSS(YLON,LOND,LONM,SLON,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - CALL GTOVEL(YLAT,YLON,EHT,RVN,RVE,RVU, - 1 VN,VE,VU,VX,VY,VZ,JREGN,IOPT) - IF(JREGN .EQ. 0 ) THEN - WRITE(I2,125)NAMEG,I,J,LATD,LATM,SLAT,LATDIR,LOND,LONM, - 1 SLON,LONDIR,BLAB - 125 FORMAT(A10,2I4, 7X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2, - 1 1X,F8.5,1X,A1, 1X,A17) - ELSE - -*** temporary code to plot results - ZLAT = DBLE(LATD) + DBLE(LATM)/60.D0 + SLAT/3600.D0 - ZLON = DBLE(LOND) + DBLE(LONM)/60.D0 + SLON/3600.D0 - ZLON = 360.D0 - ZLON - TOTVEL = DSQRT(VN*VN + VE*VE) - -*** code to create vectors to be plotted -c IF (TOTVEL .GE. 5.0D0 .AND. TOTVEL .LE. 50.D0) THEN -c TVE = VE/10.D0 -c TVN = VN/10.D0 -c WRITE(I2,129) ZLON,ZLAT,TVE,TVN,DUMMY,DUMMY,DUMMY, -c 1 TEMPNA -c 129 FORMAT(F10.6, 2x, F9.6, 2X, 5(F7.2, 2x), A8) -c ENDIF - -*** code to create contour plots -C WRITE(I2,129) ZLON, ZLAT, TOTVEL -C 129 FORMAT(F6.2, 1X, F6.2, 1X, F5.1) - -*** end of temporary code - -*** beginning of original code - WRITE(I2,130)NAMEG,I,J,LATD,LATM,SLAT,LATDIR, - 1 LOND,LONM,SLON,LONDIR,VN,VE,VU - 130 FORMAT(A10,2I4, 7X,I2,1X,I2,1X,F8.5,1X,A1,2X, - 1 I3,1X,I2,1X,F8.5,1X,A1,1X,3F8.2) -*** end of original code - - IF(PVOUT .EQ. 'Y') THEN - CALL PVPRNT(LATD,LATM,SLAT,LOND,LONM,SLON,VN,VE,VU) - ENDIF - ENDIF - GO TO 120 - 150 WRITE(LUOUT,160) - 160 FORMAT(' **********************************************'/ - 1 ' Velocities have been calculated for the specified grid.'/ - 2 ' If you wish to calculate additional velocities, please'/ - 3 ' indicate how you will specify positional coordinates.'/) - ELSEIF(OPTION .EQ. '3') THEN - EHT = 0.D0 - WRITE(I2,105) - WRITE(LUOUT,200) - 200 FORMAT(' Enter name of blue-book file. ') - READ(LUIN,210,err=705,iostat=ios) NAMEBB - if (ios /= 0) goto 705 - 210 FORMAT(A30) - OPEN(I1,FILE=NAMEBB,STATUS='OLD') - 220 READ(I1,230,END=250,err=706,iostat=ios) CARD - if (ios /= 0) goto 706 - 230 FORMAT(A80) - TYPE = CARD(7:10) - IF(TYPE .EQ. '*80*') THEN - READ(CARD,240,err=707,iostat=ios)NAME,LATD,LATM,SLAT,JN, - 1 LOND,LONM,SLON,JW - if (ios /= 0) goto 707 - 240 FORMAT(BZ,14X,A30,I2,I2,F7.5,A1,I3,I2,F7.5,A1) - NAME24 = NAME(1:24) - YLAT =(DBLE((LATD*60+LATM)*60)+SLAT)/RHOSEC - YLON =(DBLE((LOND*60+LONM)*60)+SLON)/RHOSEC - if (jn .eq. 'S') ylat = -ylat - if (jw .eq. 'E') ylon = -ylon - CALL GTOVEL(YLAT,YLON,EHT,RVN,RVE,RVU, - 1 VN,VE,VU,VX,VY,VZ,JREGN,IOPT) - IF(JREGN .EQ. 0 ) THEN - WRITE(I2,245)NAME24,LATD,LATM,SLAT,JN,LOND,LONM, - 1 SLON,JW,BLAB - 245 FORMAT(A24,1X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2, - 1 1X,F8.5,1X,A1,1X,A17) - ELSE - WRITE(I2,100)NAME24,LATD,LATM,SLAT,JN,LOND,LONM, - 1 SLON,JW,VN,VE,VU - IF(PVOUT .EQ. 'Y') THEN - CALL PVPRNT(LATD,LATM,SLAT,LOND,LONM,SLON,VN,VE,VU) - ENDIF - ENDIF - ENDIF - GO TO 220 - 250 CLOSE(I1,STATUS='KEEP') - WRITE(LUOUT,260) - 260 FORMAT(' ****************************************'/ - 1 ' Velocities have been calculated for the specified '/ - 2 ' blue-book file. If you wish to calculate additional'/ - 3 ' velocities, please indicate how you will supply the'/ - 4 ' horizontal coordinates.'/) - ELSEIF(OPTION .EQ. '4') THEN - EHT = 0.D0 - WRITE(I2,106) - CALL GETLYN(NAMEG,XLAT,XLON,FAZ,BAZ,XMIN,XMAX,XINC) - XLON = TWOPI - XLON - I = -1 - 300 I= I+1 - S = XMIN + I*XINC - IF(S .GT. XMAX) GO TO 330 - IF(S .LT. 0.0D0) THEN - S1 = -S - AZ = BAZ - ELSE - S1 = S - AZ = FAZ - ENDIF - CALL DIRCT1(XLAT,XLON,YLAT,YLON,AZ,AZ1,S1) - YLON = TWOPI - YLON - CALL TODMSS(YLAT,LATD,LATM,SLAT,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - CALL TODMSS(YLON,LOND,LONM,SLON,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - CALL GTOVEL(YLAT,YLON,EHT,RVN,RVE,RVU, - 1 VN,VE,VU,VX,VY,VZ,JREGN,IOPT) - IF(JREGN .EQ. 0 ) THEN - WRITE(I2,305)NAMEG,I,LATD,LATM,SLAT,LATDIR,LOND,LONM, - 1 SLON,LONDIR,BLAB - 305 FORMAT(A10,I4,3X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X, - 1 I2,1X,F8.5,1X,A1,1X,A17) - ELSE - WRITE(I2,310)NAMEG,I,LATD,LATM,SLAT,LATDIR,LOND,LONM,SLON, - 1 LONDIR,VN,VE,VU - 310 FORMAT(A10,I4,3X,I2,1X,I2,1X,F8.5,1X,A1,2X,I3,1X,I2,1X, - 1 F8.5,1X,A1,1X,3F8.2) - IF(PVOUT .EQ. 'Y') THEN - CALL PVPRNT(LATD,LATM,SLAT,LOND,LONM,SLON,VN,VE,VU) - ENDIF - ENDIF - GO TO 300 - 330 WRITE(LUOUT,340) - 340 FORMAT(' ***********************************************'/ - 1 ' Velocities have been calculated for the specified line.'/ - 2 ' If you wish to calculate additional velocities, please'/ - 3 ' indicate how you will specify positional coordinates.'/) - ELSEIF(OPTION .EQ. '5') THEN - EHT = 0.0D0 - WRITE(I2, 105) - WRITE(LUOUT,400) - 400 FORMAT(' Enter name of input file. ') - READ(LUIN,410,err=708,iostat=ios) NAMEBB - if (ios /= 0) goto 708 - 410 FORMAT(A30) - OPEN(I1,FILE=NAMEBB,STATUS='OLD') - 420 READ(I1,'(a)',END=450,err=709,iostat=ios) record - call interprate_latlon_record (record,XLAT,XLON,NAME24) - if (ios /= 0) goto 709 - YLAT = (XLAT*3600.D0)/RHOSEC - YLON = XLON*3600.d0/RHOSEC - CALL TODMSS(YLAT, LATD, LATM, SLAT, ISIGN) - IF (ISIGN .eq. 1) then - JN = 'N' - Else - JN = 'S' - endif - call TODMSS(YLON, LOND, LONM, SLON, ISIGN) - IF (ISIGN .eq. 1) then - JW = 'W' - else - JW = 'E' - endif - CALL GTOVEL(YLAT,YLON,EHT,RVN,RVE, RVU, - 1 VN,VE,VU,VX,VY,VZ,JREGN,IOPT) - IF (JREGN .eq. 0) then - write(I2,245)NAME24,LATD,LATM,SLAT,JN, - 1 LOND,LONM,SLON,JW,BLAB - ELSE - write(I2,100)NAME24,LATD,LATM,SLAT,JN, - 1 LOND,LONM,SLON,JW,VN,VE,VU - IF(PVOUT .EQ. 'Y') then - call PVPRNT(LATD,LATM,SLAT,LOND,LONM,SLON,VN,VE,VU) - ENDIF - ENDIF - GO TO 420 - 450 CLOSE(I1, STATUS = 'KEEP') - write(LUOUT, 460) - 460 format(' ********************************'/ - 1 ' Velocities have been calculated for the specified'/ - 2 ' file. if you wish to calculate additional velocities, '/ - 3 ' please indicate how you will supply the coordinates.'/) - ELSE - WRITE(LUOUT,600) - 600 FORMAT(' Improper entry--select again. ') - ENDIF - GO TO 40 - 610 CONTINUE - CLOSE(I2, STATUS = 'KEEP') - IF( PVOUT .EQ. 'Y') CLOSE(I3, STATUS = 'KEEP') - RETURN - - 700 write (*,'(/)') - write (*,*) 'Failed to read file name: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 701 write (*,'(/)') - write (*,*) 'Failed to read answer: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 702 write (*,'(/)') - write (*,*) 'Failed to read file name: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 703 write (*,'(/)') - write (*,*) 'Failed to read velocity: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 704 write (*,'(/)') - write (*,*) 'Failed to read OPTION: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 705 write (*,'(/)') - write (*,*) 'Failed to read name of bbfile: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 706 write (*,'(/)') - write (*,*) 'Failed to read card from bbfile: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 707 write (*,'(/)') - write (*,*) 'Failed to read card80 from bbfile: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 708 write (*,'(/)') - write (*,*) 'Failed to read file name: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 709 write (*,'(/)') - write (*,*) 'Failed to read bbfile: ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - - END -************************************************************************** - SUBROUTINE GTOVEL(YLAT,YLON,EHT,RVN,RVE,RVU, - 1 VN,VE,VU,VX,VY,VZ,JREGN,IOPT) - -*** Compute velocity in appropriate reference frame for point with -*** latitude YLAT (radians), longitude YLON (radians, positive west) -*** and ellipsoid height EHT (meters) in this reference frame. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - logical Is_iopt_NAD83 - - Is_iopt_NAD83 = (IOPT == 1) - -*** Get reference latitude RLAT and reference longitude RLON in NAD 83 -c IF(IOPT .EQ. 0 .OR. IOPT .EQ. 1) THEN !Not NAD83 antmore - IF(IOPT .EQ. 15) THEN - RLAT = YLAT - RLON = YLON - ELSE - ELON = -YLON - CALL TOXYZ(YLAT,ELON,EHT,X,Y,Z) - DATE = 2010.0d0 -c CALL XTONAD(X,Y,Z,RLAT,RLON,EHTNAD,DATE,IOPT) !Removed on 09/12/2014. The velocity grids are not converted to NAD83 anymore. - CALL XTO08 (X,Y,Z,RLAT,RLON,EHT08,DATE,IOPT) !They are in ITRF2008 - ENDIF - -*** Get velocity in NAD 83 !Not anymore since 09/12/2014. Now it is in ITRF2008 - CALL GETREG(RLAT,RLON,JREGN) - IF (JREGN .EQ. 0) RETURN - CALL COMVEL(RLAT,RLON,JREGN,VN,VE,VU) - - VN = VN + RVN - VE = VE + RVE - VU = VU + RVU - ELON = -YLON - CALL TOVXYZ(YLAT,ELON,VN,VE,VU,VX,VY,VZ) - -*** Convert velocity into another reference frame if needed -c IF(IOPT .NE. 0 .AND. IOPT .NE. 1) THEN !Commented out on 09/12/2014 - IF(IOPT .NE. 15) THEN - IF(Is_iopt_NAD83) THEN -c CALL VTRANF(X,Y,Z,VX,VY,VZ, 1, IOPT) !No longer NAD83 - CALL VTRANF(X,Y,Z,VX,VY,VZ, 15, IOPT) !No longer NAD83 - else - CALL VTRANF_IERS(X,Y,Z,VX,VY,VZ, 15, IOPT) !Now ITRF2008 - endif - CALL TOVNEU(YLAT, ELON, VX, VY, VZ, VN, VE, VU) - ENDIF - - RETURN - END -**************************************************************************** - SUBROUTINE XTO08 (X,Y,Z,RLAT,WLON,EHT08,DATE,IOPT) - -*** Converts X,Y,Z in specified datum to latitude and -*** longitude (in radians) and height (meters) in ITRF2008 -*** datum with longitude positive west. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - LOGICAL FRMXYZ - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - -*** Convert to cartesian coordinates in ITRF2008 -c if (iopt .eq. 0 .or. iopt .eq. 1) then - if (iopt .eq. 15) then - x2 = x - y2 = y - z2 = z - elseif (iopt .eq. 1) then - call toit94(x,y,z,x1,y1,z1,date,iopt) - call frit94(x1,y1,z1,x2,y2,z2,date,15) - else - call toit94_iers(x,y,z,x1,y1,z1,date,iopt) - call frit94_iers(x1,y1,z1,x2,y2,z2,date,15) - endif - -***Convert to geodetic coordinates - IF(.NOT.FRMXYZ(X2,Y2,Z2,RLAT,ELON,EHT08))STOP 666 - - WLON = -ELON - 100 IF(WLON .LT. 0.D0) THEN - WLON = WLON + TWOPI - GO TO 100 - ENDIF - -c write (*,*) "FROM XT08 ",RLAT*180.d0/pi,WLON*180.d0/pi,EHT08 - RETURN - END - -**************************************************************************** - SUBROUTINE XTONAD (X,Y,Z,RLAT,WLON,EHTNAD,DATE,IOPT) - -*** Converts X,Y,Z in specified datum to latitude and -*** longitude (in radians) and height (meters) in NAD 83 -*** datum with longitude positive west. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - LOGICAL FRMXYZ - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - -*** Convert to cartesian coordinates in NAD 83 - if (iopt .eq. 0 .or. iopt .eq. 1) then - x2 = x - y2 = y - z2 = z - else - call toit94(x,y,z,x1,y1,z1,date,iopt) - jopt = 1 - call frit94(x1,y1,z1,x2,y2,z2,date,jopt) - endif - -***Convert to geodetic coordinates - IF(.NOT.FRMXYZ(X2,Y2,Z2,RLAT,ELON,EHTNAD))STOP 666 - - WLON = -ELON - 100 IF(WLON .LT. 0.D0) THEN - WLON = WLON + TWOPI - GO TO 100 - ENDIF - RETURN - END - -****************************************************** - subroutine TRFPOS - -*** Transform position between reference frames - - implicit double precision (a-h,o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - parameter (nbbdim = 10000) - parameter (rad2deg = 180.d0/3.14159265358979d0) - - double precision lat,lon - character card*80,namebb*80,nameif*80,name24*80 - character record*120 - character namef*30 - character frame1*24, frame2*24 - character jn*1,jw*1,LATDIR*1,LONDIR*1 - character option*1, answer*1, vopt*1 - character PID*6,PIDs*6 - character HTDP_version*10 - LOGICAL FRMXYZ - LOGICAL TEST - LOGICAL Is_inp_NAD83,Is_out_NAD83 - LOGICAL Is_inp_NAD83PAC,Is_out_NAD83PAC - LOGICAL Is_inp_NAD83MAR,Is_out_NAD83MAR - logical am_I_in_or_near_AK - logical am_I_in_or_near_AS - logical am_I_in_or_near_CONUS - logical am_I_in_or_near_CQ - logical am_I_in_or_near_Guam - logical am_I_in_or_near_HI - logical am_I_in_or_near_PR - logical am_I_in_or_near_VQ - logical am_I_in_or_near_KW - - COMMON /CONST/ A, F, E2, EPS, AF, PI, TWOPI, RHOSEC - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /ARRAYS/ HT(nbbdim), LOC(nbbdim),PIDs(nbbdim) - COMMON /VERSION/ HTDP_version - - write(luout,80) - 80 format( - 1 ' Please enter the name for the file to contain'/ - 2 ' the transformed positions. ') - read(luin,'(a30)',err=600,iostat=ios) namef - if (ios /= 0) goto 600 - open(i2, file = namef, status = 'unknown') - CALL HEADER - - 95 write(luout,100) - 100 format (' *******************************************'/ - 1 ' Enter the reference frame of the input positions') - call MENU1(iopt1, frame1) - if (iopt1 .lt. 1 .or. iopt1 .gt. numref) then - write(luout,*) ' Improper selection -- try again. ' - go to 95 - endif - Is_inp_NAD83 = (iopt1 == 1 .and. frame1(1:3) /= "WGS") - Is_inp_NAD83PAC = (iopt1 == 12) - Is_inp_NAD83MAR = (iopt1 == 13) - - 105 write(luout,110) - 110 format (/' Enter the reference frame for the output positions') - call MENU1(iopt2, frame2) - if (iopt2 .lt. 1 .or. iopt2 .gt. numref) then - write(luout,*) ' Improper selection -- try again. ' - go to 105 - endif - Is_out_NAD83 = (iopt2 == 1 .and. frame1(1:3) /= "WGS") - Is_out_NAD83PAC = (iopt2 == 12) - Is_out_NAD83MAR = (iopt2 == 13) - - write(luout,120) - 120 format (/ - 1 ' Enter the reference date of the input positions.') - 121 CALL GETMDY(MONTH1, IDAY1, IYEAR1, DATE1, MIN1, TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter the date? (y/n)' - read(luin, '(A1)',err=601,iostat=ios) ANSWER - if (ios /= 0) goto 601 - if(ANSWER .eq. 'y' .or. ANSWER .eq. 'Y')GO TO 121 - RETURN - ENDIF - - write(luout,130) - 130 format(/ - 1 ' Enter the reference date for the output positions. ') - 131 CALL GETMDY(MONTH2, IDAY2, IYEAR2, DATE2, MIN2, TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter the date? (y/n)' - read(luin, '(A1)',err=601,iostat=ios) ANSWER - if (ios /= 0) goto 601 - if(ANSWER .eq. 'Y' .or. ANSWER .eq. 'y') GO TO 131 - RETURN - ENDIF - - write(i2, 150) frame1, month1, iday1, iyear1, date1, - 1 frame2, month2, iday2, iyear2, date2 - 150 format(' TRANSFORMING POSITIONS FROM ',A24,' (EPOCH = ', - 1 I2.2,'-',I2.2,'-',I4,' (',F9.4,'))'/26X, - 1 'TO ', A24, ' (EPOCH = ',I2.2,'-',I2.2,'-',I4,' (',F9.4,'))'/) -c 1 13X,'INPUT COORDINATES OUTPUT COORDINATES', -c 1 4x, 'INPUT VELOCITY' /) - - 160 write(luout, 170) - 170 format (/' ***************************************'/ - 1 ' Coordinates will be transformed at each specified point.'/ - 1 ' Please indicate how you wish to supply positions.'/ - 1 ' 0... No more points. Return to main menu.'/ - 1 ' 1... Individual points entered interactively.'/ - 1 ' 2... The *80* records in a specified blue-book file. '/ - 1 ' 3... Transform positions contained in batch file '/ - 1 ' of delimited records of the form: '/ - 1 ' LAT,LON,EHT,TEXT' / - 1 ' LAT = latitude in degrees (positive north/DBL PREC)'/ - 1 ' LON = longitude in degrees (positive west/DBL PREC)'/ - 1 ' EHT = ellipsoid height in meters (DBL PREC)'/ - 1 ' TEXT = Descriptive text (CHARACTER*24) '/ - 1 ' Example: '/ - 1 ' 40.731671553,112.212671753,34.241,SALT AIR '/ - 1 ' 4... Transform positions contained in batch file '/ - 1 ' of delimited records of the form: '/ - 1 ' X, Y, Z,TEXT' / - 1 ' X, Y, Z are Cartesian coordinates of the station'/ - 1 ' TEXT = Descriptive text (CHARACTER*24) '/ - 1 ' Example: '/ - 1 ' -86682.104,-5394026.861,3391189.647,SALT AIR '/ - 1 ' Necessary velocities predicted by HTDP '/ - 1 ' 5... Transform positions using velocities contained in a '/ - 1 ' batch file of delimited records of the form: '/ - 1 ' X, Y, Z, Vx, Vy, Vz, TEXT' / - 1 ' X, Y, Z are Cartesian coordinates of the station'/ - 1 ' Vx,Vy,Vz are Cartesian velocities in m/year '/ - 1 ' TEXT = Descriptive text (CHARACTER*24) '/ - 1 ' Example: '/ - 1'-86682.104,-5394026.861,3391189.647,-0.012,-0.001,-0.001,SALT'/) - - read(luin,'(a1)',err=602,iostat=ios) option - if (ios /= 0) goto 602 - -c write (*,*) "Starting to look at options" - - if (option .eq. '0') then - go to 500 - elseif (option .eq. '1') then - vxsave = 0.d0 - vysave = 0.d0 - vzsave = 0.d0 - vnsave = 0.d0 - vesave = 0.d0 - vusave = 0.d0 - 180 call GETPNT(latd, latm, slat, LATDIR, lond, lonm, slon, - 1 LONDIR, name24, x, y, z, ylat, ylon, eht) - -C Added by JS on 07/22/2015 to limit NAD83 to the US***************************************************** -C This was reversed on 05/11/2017 ***************************************************** - -c if (Is_inp_NAD83 .or. Is_out_NAD83) then -c lat = ylat*rad2deg ; lon = 360.d0 - ylon*rad2deg -c if (lon < 0.d0) lon = lon + 360.d0 -c if(.not. am_I_in_or_near_AK (lat,lon) .and. -c & .not. am_I_in_or_near_CONUS(lat,lon) .and. -c & .not. am_I_in_or_near_PR (lat,lon) .and. -c & .not. am_I_in_or_near_VQ (lat,lon)) then -c write (luout,'(10x,a,8x,a)') -c & "NAD83 (2011) is defined only in US territories",name24 -c stop -c endif -c endif - -c if(.not. am_I_in_or_near_AK (lat,lon) .and. -c & .not. am_I_in_or_near_AS (lat,lon) .and. -c & .not. am_I_in_or_near_CONUS(lat,lon) .and. -c & .not. am_I_in_or_near_CQ (lat,lon) .and. -c & .not. am_I_in_or_near_Guam (lat,lon) .and. -c & .not. am_I_in_or_near_HI (lat,lon) .and. -c & .not. am_I_in_or_near_PR (lat,lon) .and. -c & .not. am_I_in_or_near_VQ (lat,lon) .and. -c & .not. am_I_in_or_near_KW (lat,lon)) then -c write (luout,'(10x,a,8x,a)') -c & "FYI, NAD83 (2011) is defined only in US territories",name24 -c stop -c endif - -c if (Is_inp_NAD83MAR .or. Is_out_NAD83MAR) then -c lat = ylat*rad2deg ; lon = 360.d0 - ylon*rad2deg -c if (lon < 0.d0) lon = lon + 360.d0 -c if(.not. am_I_in_or_near_GUAM (lat,lon) .and. -c & .not. am_I_in_or_near_CQ (lat,lon)) then -c write (luout,'(10x,a,8x,a)') -c & "NAD83 (2011) is defined only in US territories",name24 -c stop -c endif -c endif - -C Until here on 07/22/2015 to limit NAD83 to the US****************************************************** - -C Added by JS on 09/10/2014 - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TOIT94(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94(x1, y1, z1, x2, y2, z2, date1, iopt2) - else - call TOIT94_IERS(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94_IERS(x1, y1, z1, x2, y2, z2, date1, iopt2) - endif - if (min1 .ne. min2) then !i.e., if the input and output dates are different - if(.not.FRMXYZ(x2,y2,z2,ylat1,elon1,eht1)) STOP 666 - ylon1 = -elon1 - if(ylon1 .lt. 0.d0) ylon1 = ylon1 + twopi -c write (*,*) ylon1*180.d0/pi,ylat1*180.d0/pi,eht1 - call GETVLY(ylat1,elon1,vx,vy,vz,vn,ve,vu,vopt,210) -c write (*,*) vx,vy,vz,vn,ve,vu - if (vopt .eq. '0') then - call PREDV(ylat1,ylon1,eht1,date1,iopt1,jregn,vn,ve,vu) -c write (*,*) jregn,vn,ve,vu - if (jregn .eq. 0) then - write(luout, 200) - 200 format(/' ****************************************'/ - 1 ' These coordinates can not be transformed to a different'/ - 1 ' date because the point is outside of the modeled region.'/) - go to 220 - else - call TOVXYZ( ylat1, elon1, vn, ve, vu, vx, vy, vz) -c write (*,*) vx,vy,vz,vn,ve,vu - endif - endif - vxsave = vx - vysave = vy - vzsave = vz - vnsave = vn - vesave = ve - vusave = vu - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF( x, y, z, vx, vy, vz, iopt1, iopt2) - else - call VTRANF_IERS( x, y, z, vx, vy, vz, iopt1, iopt2) - endif - call TOVNEU( ylat1, elon1, vx, vy, vz, vn, ve, vu) -c write (*,*) "Passed TOVNEU",vn, ve, vu - call NEWCOR( ylat1, ylon1, eht1, min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) -c write (*,*) "Passed NEWCOR",vn, ve, vu - call TOXYZ(ylatt,-ylont, ehtnew, xt, yt, zt) -c write (*,*) "Passed TOXYZ" - else - xt = x2 - yt = y2 - zt = z2 - if(.not.(FRMXYZ(xt,yt,zt,ylatt,elont,ehtnew))) STOP 666 - ylont = -elont - if(ylont .lt. 0.0d0) ylont = ylont + twopi -c write (*,*) ylont*180.d0/pi,ylatt*180.d0/pi,ehtnew - endif - - call PRNTTP(x, y, z, xt, yt, zt, ylat, ylatt, - 1 ylon, ylont, eht, ehtnew, name24, 1, - 2 vxsave, vysave, vzsave, vnsave, vesave, vusave) - - 220 write(luout,*) ' Transform more positions? (y/n) ' - read(luin,'(a1)',err=601,iostat=ios) answer - if (ios /= 0) goto 601 - if(answer .eq. 'Y' .or. answer .eq. 'y') go to 180 - close (i2, status = 'keep') - elseif (option .eq. '2') then !Blue book input and output - vxsave = 0.d0 - vysave = 0.d0 - vzsave = 0.d0 - vnsave = 0.d0 - vesave = 0.d0 - vusave = 0.d0 - write(luout, 300) - 300 format(/ - 1 ' Enter name of the blue-book file: ') - read(luin, '(a)',err=603,iostat=ios) namebb - if (ios /= 0) goto 603 - open (i1, file = namebb, status = 'old') - -*** Obtaining the ellipsoid heights from the blue book file - - do i = 1, nbbdim - ht(i) = 0.d0 - enddo - - 302 read (i1, '(a80)', end = 309,err=604,iostat=ios) card - if (ios /= 0) goto 604 - - if (card(7:10) .eq. '*80*') then -c read (card, 303) isn, eht -c 303 format (bz, 10x, i4, t70, f6.2) - read (card, 303,err=605,iostat=ios) PID,isn,eht - if (ios /= 0) goto 605 - 303 format (a6,4x,i4, t70, f6.2) - if (ht(isn) .eq. 0.d0) ht(isn) = eht - PIDs(isn) = PID - - elseif (card(7:10) .eq. '*86*') then - if (card(46:52) .ne. ' ') then - read (card, 304,err=606,iostat=ios) isn, eht - if (ios /= 0) goto 606 - 304 format (bz, 10x, i4, t46, f7.3) - ht(isn) = eht - else - read (card, 305,err=606,iostat=ios) isn, oht, ght - if (ios /= 0) goto 606 - 305 format (bz, 10x, i4, t17, f7.3, t36, f7.3) - ht(isn) = oht + ght - endif - endif - go to 302 - 309 rewind i1 -c open (i6,file='transformed_'//namebb) - -C write some comments in the transformed files - - call extract_name (namebb,iii) -c write (I2,1309) namebb(1:iii) -c write (I2,1309) trim(namebb) - 1309 format (/'The file, transformed_',a, - & ', contains the transformed input file.'/) - - write (i2,1310) HTDP_version - 1310 format (' ***CAUTION: This file was processed using HTDP', - & ' version ',a10, '***') - write (i2,1311) frame2 - 1311 format (' ***CAUTION: Coordinates in this file are in ', - & a24, '***') - WRITE (i2, 1312) MONTH2, IDAY2, IYEAR2, DATE2 - 1312 FORMAT(' ***CAUTION: Coordinates in this file have been ', - * 'updated to ',I2,'-',I2.2,'-',I4, '=(',F8.3,') ***'/) - -*** Reread blue book file to get latitudes and longitudes -*** and to perform transformations -*** and to write transformed lat and lon to the *80* records of the output bfile -*** and to write transformed ellip. h to the *86* records of the output bfile - - 310 read(i1, '(a80)', end = 390,err=604,iostat=ios) card - if (ios /= 0) goto 604 - if (card(7:10) .eq. '*80*') then -c write (*,'(a80)' ) card - read(card,320,err=605,iostat=ios) isn,name24(1:30),latd, - & latm,slat,jn,lond, lonm, slon, jw -c write (*,321) latd, latm, slat, jn, lond, lonm, slon, jw - - if (ios /= 0) goto 605 - 320 format(10x, i4, a30, i2, i2, f7.5, a1, - & i3, i2, f7.5, a1) - 321 format(i2, i2, f7.5, a1,3x, i3, i2, f7.5, a1) - ylat = (dble((latd*60 + latm)*60) + slat) / rhosec - ylon = (dble((lond*60 + lonm)*60) + slon) / rhosec - if (jn .eq. 'S') ylat = -ylat - if (jw .eq. 'E') ylon = -ylon - eht = ht(isn) - call TOXYZ(ylat, -ylon, eht, x, y, z) - -C Modified in 09/15/2014 by JS to accommodate the IERS 96-97 trans. par. - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TOIT94(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94(x1, y1, z1, x2, y2, z2, date1, iopt2) - else - call TOIT94_IERS(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94_IERS(x1, y1, z1, x2, y2, z2, date1, iopt2) - endif -C End changes - - if (min1 .ne. min2) then - if(.not.FRMXYZ(x2,y2,z2,ylat1,elon1,eht1)) STOP 666 - ylon1 = -elon1 - if (ylon1 .lt. 0.0d0) ylon1 = ylon1 + twopi - call PREDV(ylat1, ylon1, eht1, date1, iopt1, - 1 jregn, vn, ve, vu) - if (jregn .eq. 0) then - write(i2, 330) name24 - 330 format (/ 1x,a, - 1 ' is outside of the modeled region.'/) - go to 310 - else - call TOVXYZ(ylat1,elon1,vn,ve,vu,vx,vy,vz) - vxsave = vx - vysave = vy - vzsave = vz - vnsave = vn - vesave = ve - vusave = vu - -C Modified on 09/15/2014 by JS to accomodate the IERS trans. par. - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF(x,y,z,vx,vy,vz,iopt1,iopt2) - else - call VTRANF_IERS( x, y, z, vx, vy, vz, iopt1, iopt2) - endif -C End changes - call TOVNEU(ylat1,elon1,vx,vy,vz,vn,ve,vu) - call NEWCOR(ylat1,ylon1,eht1,min1,min2, - 1 ylatt,ylont,ehtnew,dn,de,dui,vn,ve,vu) - call TOXYZ(ylatt,-ylont,ehtnew,xt,yt,zt) - endif - else - xt = x2 - yt = y2 - zt = z2 - if(.not.FRMXYZ(xt,yt,zt,ylatt,elont,ehtnew))STOP 666 - ylont = -elont - if (ylont .lt. 0.0d0) ylont = ylont + twopi - endif -c call PRNTTP(x,y,z, xt,yt, zt, ylat, ylatt, -c 1 ylon, ylont, eht, ehtnew, name24, 0, -c 1 vxsave, vysave, vzsave, vnsave, vesave, vusave) - -C Now write output *80* records to the output bfile - - call TODMSS (ylatt,latdeg,latmin,seclat,isign) - latsec = nint(100000*seclat) - latdir = 'N' - if (isign .eq. -1) latdir = 'S' - call TODMSS (ylont,londeg,lonmin,seclon,isign) - lonsec = nint(100000*seclon) - londir = 'W' - if (isign .eq. -1) londir = 'E' - write (card(45:46),'(i2)') latdeg - write (card(47:48),'(i2)') latmin - write (card(49:55),'(i7)') latsec - do i=45,55 - if (card(i:i) == ' ') card(i:i) = '0' - enddo - write (card(56:56),'(a1)') latdir - - write (card(57:59),'(i3)') londeg - write (card(60:61),'(i2)') lonmin - write (card(62:68),'(i7)') lonsec - do i=57,68 - if (card(i:i) == ' ') card(i:i) = '0' - enddo - write (card(69:69),'(a1)') londir - write (i2,'(a)') card -c write (*,'(a)') card - -C Now write output *86* records - - elseif (card(8:9) == '86') then -c write (*,'(a)') card - write (card(46:52),'(i7)') nint(ehtnew*1000) - write (i2,'(a)') card -c write(*, '(a80)') card - else - write (i2,'(a)') card - endif - go to 310 - 390 close (i1, status = 'keep') -c close (i6, status = 'keep') - close (i2, status = 'keep') - - elseif (option .eq. '3') then - vxsave = 0.d0 - vysave = 0.d0 - vzsave = 0.d0 - vnsave = 0.d0 - vesave = 0.d0 - vusave = 0.d0 - write (luout, 400) - 400 format (' Enter name of input file: ') - read (luin,'(a)',err=608,iostat=ios) nameif - if (ios /= 0) goto 608 - open (i1, file = nameif, status = 'old') -C open (i6,file='transformed_'//nameif) - -C write some comments in the transformed files - - call extract_name (nameif,iii) -c write (I2,1309) nameif(1:iii) -c write (I2,1309) trim(nameif) - write (i2,1310) HTDP_version - write (i2,1311) frame2 - WRITE (I2, 1312) MONTH2, IDAY2, IYEAR2, DATE2 -c const = 180.d0/PI - - 410 read (i1,'(a)',end=450,err=607,iostat=ios) record - if (ios /= 0) goto 607 - call interprate_XYZ_record (record,xlat,xlon,eht,name24) - ylat = (xlat*3600.d0) / rhosec - ylon = (xlon*3600.d0) / rhosec - elon = -ylon - call TOXYZ(ylat, elon, eht, x, y, z) - -C Modified in 09/15/2014 by JS to accommodate the IERS 96-97 trans. par. - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TOIT94 (x,y,z,x1,y1,z1,date1,iopt1) - call FRIT94 (x1,y1,z1,x2,y2,z2,date1,iopt2) - else - call TOIT94_IERS(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94_IERS(x1, y1, z1, x2, y2, z2, date1, iopt2) - endif - -C End changes - - if (min1 .ne. min2) then - if(.not.FRMXYZ(x2,y2,z2,ylat1,elon1,eht1)) STOP 666 - ylon1 = -elon1 - if (ylon1 .lt. 0.d0) ylon1 = ylon1 + twopi - call PREDV (ylat1, ylon1, eht1, date1, iopt1, jregn, - 1 vn, ve, vu) - if (jregn .eq. 0) then - write(i2, 330) name24 - go to 410 - else - call TOVXYZ(ylat1,elon1,vn,ve,vu,vx,vy,vz) - vxsave = vx - vysave = vy - vzsave = vz - vnsave = vn - vesave = ve - vusave = vu - -C Modified on 09/15/2014 by JS to accomodate the IERS trans. par. - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF(x,y,z,vx,vy,vz,iopt1,iopt2) - else - call VTRANF_IERS( x, y, z, vx, vy, vz, iopt1, iopt2) - endif -C End changes - - call TOVNEU(ylat1, elon1,vx,vy,vz,vn,ve,vu) - call NEWCOR (ylat1, ylon1, eht1, min1, min2, - 1 ylatt,ylont,ehtnew,dn,de,du,vn,ve,vu) - call TOXYZ(ylatt,-ylont,ehtnew,xt,yt,zt) - endif - else - xt = x2 - yt = y2 - zt = z2 - if(.not.FRMXYZ(xt,yt,zt,ylatt,elont,ehtnew)) STOP 666 - ylont = -elont - if (ylont .lt. 0.d0) ylont = ylont + twopi - endif -c call PRNTTP(x,y,z,xt,yt,zt,ylat,ylatt,ylon,ylont,eht,ehtnew, -c 1 name24,0,vxsave,vysave,vzsave,vnsave,vesave,vusave) - outlat = ylatt*rad2deg - outlon = ylont*rad2deg - call extract_name (name24,iii) - -C Added by JS on 07/22/2015 to limit the use in NAD83 to the US -c Reversed on 05/11/2017 - -c if (Is_inp_NAD83 .or. Is_out_NAD83) then -c lat = ylat*rad2deg ; lon = 360.d0 - ylon*rad2deg -c if(.not. am_I_in_or_near_AK (lat,lon) .and. -c & .not. am_I_in_or_near_AS (lat,lon) .and. -c & .not. am_I_in_or_near_CONUS(lat,lon) .and. -c & .not. am_I_in_or_near_CQ (lat,lon) .and. -c & .not. am_I_in_or_near_Guam (lat,lon) .and. -c & .not. am_I_in_or_near_HI (lat,lon) .and. -c & .not. am_I_in_or_near_PR (lat,lon) .and. -c & .not. am_I_in_or_near_VQ (lat,lon) .and. -c & .not. am_I_in_or_near_KW (lat,lon)) then -c write (i2,'(10x,a,8x,a)') -c & "FYI, NAD83(2011) is defined only in US territories",name24 -c endif -c endif - write (i2,449) outlat,outlon,ehtnew,name24(1:iii) - -C Until here on 07/22/2015 to limit the use in NAD83 to the US - -c write (i6,449) outlat,outlon,ehtnew,trim(name24) - 449 format (2f16.10,f10.3,4x,a) - go to 410 - - 450 close(i1, status = 'keep') -c close(i6, status = 'keep') - close(i2, status = 'keep') - - elseif (option .eq. '4') then - vxsave = 0.d0 - vysave = 0.d0 - vzsave = 0.d0 - vnsave = 0.d0 - vesave = 0.d0 - vusave = 0.d0 - write (luout, 4001) -4001 format (' Enter name of input file: ') - read (luin, '(a)',err=600,iostat=ios) nameif - if (ios /= 0) goto 600 - open (i1, file = nameif, status = 'old') -c open (i6,file='transformed_'//nameif) - -C write some comments in the transformed files - - call extract_name (nameif,iii) -c write (i2,1309) nameif(1:iii) -c write (i2,1309) trim(nameif) -c write (i6,1310) HTDP_version -c write (i6,1311) frame2 -c WRITE (i6, 1312) MONTH2, IDAY2, IYEAR2, DATE2 -c const = 180.d0/PI - 411 read (i1,'(a)',end=451,err=607,iostat=ios) record - if (ios /= 0) goto 607 - call interprate_XYZ_record (record,x,y,z,name24) - if(.not.FRMXYZ(x,y,z,ylat,elon,eht)) STOP 666 - ylon = -elon - if (ylon .lt. 0.d0) ylon = ylon + twopi - -C Modified in 09/15/2014 by JS to accommodate the IERS 96-97 trans. par. - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TOIT94 (x,y,z,x1,y1,z1,date1,iopt1) - call FRIT94 (x1,y1,z1,x2,y2,z2,date1,iopt2) - else - call TOIT94_IERS(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94_IERS(x1, y1, z1, x2, y2, z2, date1, iopt2) - endif - -C End changes - - if (min1 .ne. min2) then - if(.not.FRMXYZ(x2,y2,z2,ylat1,elon1,eht1)) STOP 666 - ylon1 = -elon1 - if (ylon1 .lt. 0.d0) ylon1 = ylon1 + twopi - call PREDV (ylat1,ylon1,eht1,date1,iopt1,jregn,vn,ve,vu) - if (jregn .eq. 0) then - write(i2, 330) name24 - go to 411 - else - call TOVXYZ(ylat1,elon1,vn,ve,vu,vx,vy,vz) - vxsave = vx - vysave = vy - vzsave = vz - vnsave = vn - vesave = ve - vusave = vu - write (*,*) vn,ve,vu - write (*,*) vx,vy,vz - -C Modified on 09/15/2014 by JS to accomodate the IERS trans. par. - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF(x,y,z,vx,vy,vz,iopt1,iopt2) - else - call VTRANF_IERS( x, y, z, vx, vy, vz, iopt1, iopt2) - endif -C End changes - - call TOVNEU(ylat1, elon1,vx,vy,vz,vn,ve,vu) - write (*,*) vn,ve,vu - call NEWCOR (ylat1, ylon1, eht1, min1, min2, - 1 ylatt,ylont,ehtnew,dn,de,du,vn,ve,vu) - call TOXYZ(ylatt,-ylont,ehtnew,xt,yt,zt) - endif - else - xt = x2 - yt = y2 - zt = z2 - if(.not.FRMXYZ(xt,yt,zt,ylatt,elont,ehtnew)) STOP 666 - ylont = -elont - if (ylont .lt. 0.d0) ylont = ylont + twopi - endif -c call PRNTTP(x,y,z,xt,yt,zt,ylat,ylatt,ylon,ylont,eht,ehtnew, -c 1 name24,0,vxsave,vysave,vzsave,vnsave,vesave,vusave) - call extract_name (name24,iii) - -C Added by JS on 07/22/2015 to limit the use in NAD83 to the US - -c if (Is_inp_NAD83 .or. Is_out_NAD83) then -c lat = ylatt*rad2deg ; lon = 360.d0 - ylont*rad2deg -c if(.not. am_I_in_or_near_AK (lat,lon) .and. -c & .not. am_I_in_or_near_AS (lat,lon) .and. -c & .not. am_I_in_or_near_CONUS(lat,lon) .and. -c & .not. am_I_in_or_near_CQ (lat,lon) .and. -c & .not. am_I_in_or_near_Guam (lat,lon) .and. -c & .not. am_I_in_or_near_HI (lat,lon) .and. -c & .not. am_I_in_or_near_PR (lat,lon) .and. -c & .not. am_I_in_or_near_VQ (lat,lon) .and. -c & .not. am_I_in_or_near_KW (lat,lon)) then -c write (i2,'(10x,a,8x,a)') -c & "FYI, NAD83(2011) is defined only in US territories",name24 -c write (i2,1449) xt,yt,zt,name24(1:iii) -c endif -c else - write (i2,1449) xt,yt,zt,name24(1:iii) -c endif - -C Until here on 07/22/2015 to limit the use in NAD83 to the US - -c write (i6,1449) xt,yt,zt,trim(name24) - 1449 format (3f20.3,4x,a) - go to 411 - - 451 close(i1, status = 'keep') - close(i2, status = 'keep') - - elseif (option .eq. '5') then - vxsave = 0.d0 - vysave = 0.d0 - vzsave = 0.d0 - vnsave = 0.d0 - vesave = 0.d0 - vusave = 0.d0 - write (luout, 5001) -5001 format (' Enter name of input file: ') - read (luin, '(a)',err=600,iostat=ios) nameif - if (ios /= 0) goto 600 - open (i1, file = nameif, status = 'old') -c open (i6,file='transformed_'//nameif) - -C write some comments in the transformed files - - call extract_name (nameif,iii) -c write (i2,1309) nameif(1:iii) -c write (i2,1309) trim(nameif) -c write (i6,1310) HTDP_version -c write (i6,1311) frame2 -c WRITE (i6, 1312) MONTH2, IDAY2, IYEAR2, DATE2 -c const = 180.d0/PI - 511 read (i1,'(a)',end=551,err=607,iostat=ios) record - if (ios /= 0) goto 607 - call interprate_XYZVxVyVz_record (record,x,y,z,Vx,Vy,Vz,name24) -c write (*,*) X,Y,Z -c write (*,*) Vx,Vy,Vz - if(.not.FRMXYZ(x,y,z,ylat,elon,eht)) STOP 666 - ylon = -elon - if (ylon .lt. 0.d0) ylon = ylon + twopi - -C Modified in 09/15/2014 by JS to accommodate the IERS 96-97 trans. par. - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TOIT94 (x,y,z,x1,y1,z1,date1,iopt1) - call FRIT94 (x1,y1,z1,x2,y2,z2,date1,iopt2) - else - call TOIT94_IERS(x, y, z, x1, y1, z1, date1, iopt1) - call FRIT94_IERS(x1, y1, z1, x2, y2, z2, date1, iopt2) - endif - -C End changes on 09/15/2014 - - if (min1 .ne. min2) then - if(.not.FRMXYZ(x2,y2,z2,ylat1,elon1,eht1)) STOP 666 - ylon1 = -elon1 - if (ylon1 .lt. 0.d0) ylon1 = ylon1 + twopi -c call PREDV (ylat1,ylon1,eht1,date1,iopt1,jregn,vn,ve,vu) -c if (jregn .eq. 0) then -c write(i2, 330) name24 -c go to 411 -c else -c call TOVXYZ(ylat1,elon1,vn,ve,vu,vx,vy,vz) - - call TOVNEU(ylat1,elon1,vx,vy,vz,vn,ve,vu) - vxsave = vx - vysave = vy - vzsave = vz - vnsave = vn - vesave = ve - vusave = vu -c write (*,*) vn,ve,vu - -C Modified on 09/15/2014 by JS to accomodate the IERS trans. par. - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF(x,y,z,vx,vy,vz,iopt1,iopt2) - else - call VTRANF_IERS( x, y, z, vx, vy, vz, iopt1, iopt2) - endif -C End changes - - call TOVNEU(ylat1, elon1,vx,vy,vz,vn,ve,vu) - call NEWCOR (ylat1, ylon1, eht1, min1, min2, - 1 ylatt,ylont,ehtnew,dn,de,du,vn,ve,vu) - call TOXYZ(ylatt,-ylont,ehtnew,xt,yt,zt) -c endif - else - xt = x2 - yt = y2 - zt = z2 - if(.not.FRMXYZ(xt,yt,zt,ylatt,elont,ehtnew)) STOP 666 - ylont = -elont - if (ylont .lt. 0.d0) ylont = ylont + twopi - endif -c call PRNTTP(x,y,z,xt,yt,zt,ylat,ylatt,ylon,ylont,eht,ehtnew, -c 1 name24,0,vxsave,vysave,vzsave,vnsave,vesave,vusave) - call extract_name (name24,iii) - -C Added by JS on 07/22/2015 to limit the use in NAD83 to the US - -c if (Is_inp_NAD83 .or. Is_out_NAD83) then -c lat = ylatt*rad2deg ; lon = 360.d0 - ylont*rad2deg -c if(.not. am_I_in_or_near_AK (lat,lon) .and. -c & .not. am_I_in_or_near_AS (lat,lon) .and. -c & .not. am_I_in_or_near_CONUS(lat,lon) .and. -c & .not. am_I_in_or_near_CQ (lat,lon) .and. -c & .not. am_I_in_or_near_Guam (lat,lon) .and. -c & .not. am_I_in_or_near_HI (lat,lon) .and. -c & .not. am_I_in_or_near_PR (lat,lon) .and. -c & .not. am_I_in_or_near_VQ (lat,lon) .and. -c & .not. am_I_in_or_near_KW (lat,lon)) then -c write (i2,'(10x,a,8x,a)') -c & "FYI, NAD83(2011) is defined only in US territories",name24 -c write (i2,1449) xt,yt,zt,name24(1:iii) -c endif -c else - write (i2,1449) xt,yt,zt,name24(1:iii) -c endif - -C Until here on 07/22/2015 to limit the use in NAD83 to the US - -c write (i6,1449) xt,yt,zt,trim(name24) - go to 511 - - 551 close(i1, status = 'keep') - close(i2, status = 'keep') - else - write(luout,*) ' Improper selection -- try again. ' - go to 160 - endif - - 500 continue -c close(i2, status = 'keep') - return - - 600 write (*,'(/)') - write (*,*) "Wrong output file name in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 601 write (*,'(/)') - write (*,*) "Wrong answer in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 602 write (*,'(/)') - write (*,*) "Wrong option in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 603 write (*,'(/)') - write (*,*) "Wrong bbname in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 604 write (*,'(/)') - write (*,*) "Wrong card in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 605 write (*,'(/)') - write (*,*) "Failed to read 80 record in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 606 write (*,'(/)') - write (*,*) "Failed to read 86 record in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 607 write (*,*) "Failed reading input file in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 608 write (*,'(/)') - write (*,*) "Wrong input file name in TRFPOS: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - end -C*******************************************8***************************************************** - subroutine PRNTTP(x, y, z, x1, y1, z1, ylat, - 1 ylatt, ylon, ylont, eht, ehtnew, name24, iprint, - 2 vx, vy, vz, vn, ve, vu ) - -** Print updated and/or transformed parameters - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - CHARACTER NAME24*24 - CHARACTER LATDIR*1, LONDIR*1, LATDR*1, LONDR*1 - - CALL TODMSS(YLATT,LATDN,LATMN,SLATN,ISIGN) - LATDIR = 'N' - if (isign .eq. -1) LATDIR = 'S' - CALL TODMSS(YLONT,LONDN,LONMN,SLONN,ISIGN) - LONDIR = 'W' - if (isign .eq. -1) LONDIR = 'E' - - if (iprint .eq. 1) then - WRITE(LUOUT,1065)LATDN,LATMN,SLATN,LATDIR,LONDN,LONMN, - 1 SLONN,LONDIR, EHTNEW, X1,Y1,Z1 - 1065 FORMAT(' ****************************************'/ - 1 ' New latitude = ',I3,1X,I2,1X,F8.5,1X,A1 / - 2 ' New longitude = ',I3,1x,I2,1X,F8.5,1X,A1 / - 2 ' New Ellip. Ht. = ', F12.3 ,' meters' / - 3 ' New X = ',F12.3 ,' meters' / - 4 ' New Y = ',F12.3 ,' meters' / - 5 ' New Z = ',F12.3 ,' meters' / - 3 ' ****************************************'/) - endif - - call TODMSS(ylat,latd,latm,slat,isign) - latdr = 'N' - if(isign .eq. -1) latdr = 'S' - call TODMSS(ylon, lond,lonm,slon,isign) - londr = 'W' - if(isign .eq. -1) londr = 'E' - WRITE(I2,1070)NAME24, - 1 LATD,LATM,SLAT,latdr,LATDN,LATMN,SLATN,latdir,vn, - 1 LOND,LONM,SLON,londr,LONDN,LONMN,SLONN,londir,ve, - 1 EHT, EHTNEW, vu, X, X1, vx, - 1 Y, Y1, vy, Z, Z1, vz - 1070 FORMAT(1X,A24,/ - 1 2X, 'LATITUDE ',2(2X,I3,1X,I2.2,1X,F8.5,1X,A1,2X), - 1 2X, f8.2, ' mm/yr north' / - 1 2X, 'LONGITUDE ',2(2X,I3,1X,I2.2,1X,F8.5,1X,A1,2X), - 1 2X, f8.2, ' mm/yr east' / - 1 2X, 'ELLIP. HT.',2(6X,F14.3),' m ', - 1 f8.2, ' mm/yr up' / - 1 2X, 'X ',2(6X,F14.3),' m ', f8.2, ' mm/yr' / - 1 2X, 'Y ',2(6X,F14.3),' m ', f8.2, ' mm/yr' / - 1 2X, 'Z ',2(6X,F14.3),' m ', f8.2, ' mm/yr'/ ) - RETURN - END - -********************************************************** - subroutine SETTP - -*** Specify transformation parameters from ITRF94 -*** to other reference frames -************************************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 -C The latter parameters were added to HTDP in 09/2014. They will be used to transform between -C ITRF systems. They will not be used if the transformation involves NAD83 or WGS84 (transit). -C They will be used for the Pacific branches of NAD83. - - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /const/ a, f, e2, eps, af, pi, twopi, rhosec - common /tranpa/ tx(numref), ty(numref), tz(numref), - & dtx(numref), dty(numref), dtz(numref), - & rx(numref), ry(numref), rz(numref), - & drx(numref), dry(numref), drz(numref), - & scale(numref), dscale(numref), refepc(numref) - common /tranpa1/ tx1(numref), ty1(numref), tz1(numref), - & dtx1(numref), dty1(numref), dtz1(numref), - & rx1(numref), ry1(numref), rz1(numref), - & drx1(numref), dry1(numref), drz1(numref), - & scale1(numref), dscale1(numref), refepc1(numref) - -C Parameters computed with the IGS values of ITRF96==>ITRF97 - -*** From ITRF94 to NAD 83 - tx(1) = 0.9910d0 - ty(1) = -1.9072d0 - tz(1) = -.5129d0 - dtx(1) = 0.d0 - dty(1) = 0.d0 - dtz(1) = 0.d0 - rx(1) = 1.25033d-7 - ry(1) = 0.46785d-7 - rz(1) = 0.56529d-7 - drx(1) = 0.00258d-7 - dry(1) = -.03599d-7 - drz(1) = -.00153d-7 - scale(1) = 0.d0 - dscale(1) = 0.0d0 - refepc(1) = 1997.0d0 - -*** From ITRF94 to ITRF88 - tx(2) = 0.018d0 - ty(2) = 0.000d0 - tz(2) = -.092d0 - dtx(2) = 0.0d0 - dty(2) = 0.0d0 - dtz(2) = 0.0d0 - rx(2) = -.0001d0 / rhosec - ry(2) = 0.0d0 - rz(2) = 0.0d0 - drx(2) = 0.0d0 - dry(2) = 0.0d0 - drz(2) = 0.0d0 - scale(2) = 0.74d-8 - dscale(2) = 0.0d0 - refepc(2) = 1988.0d0 - -*** From ITRF94 to ITRF89 - tx(3) = 0.023d0 - ty(3) = 0.036d0 - tz(3) = -.068d0 - dtx(3) = 0.0d0 - dty(3) = 0.0d0 - dtz(3) = 0.0d0 - rx(3) = 0.0d0 - ry(3) = 0.0d0 - rz(3) = 0.0d0 - drx(3) = 0.0d0 - dry(3) = 0.0d0 - drz(3) = 0.0d0 - scale(3) = 0.43d-8 - dscale(3) = 0.0d0 - refepc(3) = 1988.0d0 - -*** From ITRF94 to ITRF90 - tx(4) = 0.018d0 - ty(4) = 0.012d0 - tz(4) = -.030d0 - dtx(4) = 0.0d0 - dty(4) = 0.0d0 - dtz(4) = 0.0d0 - rx(4) = 0.0d0 - ry(4) = 0.0d0 - rz(4) = 0.0d0 - drx(4) = 0.0d0 - dry(4) = 0.0d0 - drz(4) = 0.0d0 - scale(4) = 0.09d-8 - dscale(4) = 0.0d0 - refepc(4) = 1988.0d0 - -*** From ITRF94 to ITRF91 - tx(5) = 0.020d0 - ty(5) = 0.016d0 - tz(5) = -.014d0 - dtx(5) = 0.0d0 - dty(5) = 0.0d0 - dtz(5) = 0.0d0 - rx(5) = 0.0d0 - ry(5) = 0.0d0 - rz(5) = 0.0d0 - drx(5) = 0.0d0 - dry(5) = 0.0d0 - drz(5) = 0.0d0 - scale(5) = 0.06d-8 - dscale(5) = 0.0d0 - refepc(5) = 1988.0d0 - -*** From ITRF94 to ITRF92 - tx(6) = 0.008d0 - ty(6) = 0.002d0 - tz(6) = -.008d0 - dtx(6) = 0.0d0 - dty(6) = 0.0d0 - dtz(6) = 0.0d0 - rx(6) = 0.0d0 - ry(6) = 0.0d0 - rz(6) = 0.0d0 - drx(6) = 0.0d0 - dry(6) = 0.0d0 - drz(6) = 0.0d0 - scale(6) = -.08d-8 - dscale(6) = 0.0d0 - refepc(6) = 1988.0d0 - -*** From ITRF94 to ITRF93 - tx(7) = 0.006d0 - ty(7) = -.005d0 - tz(7) = -.015d0 - dtx(7) = -.0029d0 - dty(7) = 0.0004d0 - dtz(7) = 0.0008d0 - rx(7) = 0.00039d0 / rhosec - ry(7) = -.00080d0 / rhosec - rz(7) = 0.00096d0 / rhosec - drx(7) = .00011d0 / rhosec - dry(7) = .00019d0 / rhosec - drz(7) =-.00005d0 / rhosec - scale(7) = 0.04d-8 - dscale(7) = 0.0d0 - refepc(7) = 1988.0d0 - -*** From ITRF94 to ITRF96 - tx(8) = 0.d0 - ty(8) = 0.d0 - tz(8) = 0.d0 - dtx(8) = 0.d0 - dty(8) = 0.d0 - dtz(8) = 0.d0 - rx(8) = 0.d0 - ry(8) = 0.d0 - rz(8) = 0.d0 - drx(8) = 0.d0 - dry(8) = 0.d0 - drz(8) = 0.d0 - scale(8) = 0.d0 - dscale(8) = 0.0d0 - refepc(8) = 1996.0d0 - -*** From ITRF94 to ITRF97 (based on IGS adopted values) -*** According to IERS: ITRF97 = ITRF96 = ITRF94 - tx(9) = 0.00207d0 - ty(9) = 0.00021d0 - tz(9) = -0.00995d0 - dtx(9) = -0.00069d0 - dty(9) = 0.00010d0 - dtz(9) = -0.00186d0 - rx(9) = -0.00012467d0 / rhosec - ry(9) = 0.00022355d0 / rhosec - rz(9) = 0.00006065d0 / rhosec - drx(9) = -0.00001347d0 / rhosec - dry(9) = 0.00001514d0 / rhosec - drz(9) = -0.00000027d0 / rhosec - scale(9) = 0.93496d-9 - dscale(9) = 0.19201d-9 - refepc(9) = 1997.0d0 - -*** From ITRF94 to WGS 72 (composition of ITRF94 -> NAD_83 -> WGS_72) - tx(10) = 0.9910d0 - ty(10) = -1.9072d0 - tz(10) = -.5129d0 - 4.5d0 - dtx(10) = 0.d0 - dty(10) = 0.d0 - dtz(10) = 0.d0 - rx(10) = 1.25033d-7 - ry(10) = 0.46785d-7 - rz(10) = 0.56529d-7 + 26.85868d-7 - drx(10) = 0.00258d-7 - dry(10) = -.03599d-7 - drz(10) = -.00153d-7 - scale(10) = 0.d0 - 0.2263d-6 - dscale(10) = 0.0d0 - refepc(10) = 1997.0d0 - -*** From ITRF94 to ITRF00 -*** assumes that ITRF94 = ITRF96 and -*** uses IGS values for ITRF96 -> ITRF97 -*** and IERS values for ITRF97 -> ITRF00 - tx(11) = -.00463d0 - ty(11) = -.00589d0 - tz(11) = +.00855d0 - dtx(11) = -0.00069d0 - dty(11) = 0.00070d0 - dtz(11) = -0.00046d0 - rx(11) = -.00012467d0 / rhosec - ry(11) = 0.00022355d0 / rhosec - rz(11) = 0.00006065d0 / rhosec - drx(11) = -0.00001347d0 / rhosec - dry(11) = 0.00001514d0 / rhosec - drz(11) = 0.00001973d0 / rhosec - scale(11) = -0.61504d-9 - dscale(11) = 0.18201d-9 - refepc(11) = 1997.0d0 - -*** From ITRF94 to PACP00 -*** use PA/ITRF00 rotation rates from Beavan et al., (2002) - tx(12) = 0.9056d0 - ty(12) = -2.0200d0 - tz(12) = -0.5516d0 - dtx(12) = -.00069d0 - dty(12) = 0.00070d0 - dtz(12) = -0.00046d0 - rx(12) = 0.027616d0 / rhosec - ry(12) = 0.013692d0 / rhosec - rz(12) = 0.002773d0 / rhosec - drx(12) = -.000397d0 / rhosec - dry(12) = 0.001022d0 / rhosec - drz(12) = -.002166d0 / rhosec - scale(12) = -0.61504d-9 - dscale(12) = 0.18201d-9 - refepc(12) = 1997.0d0 - -*** From ITRF94 to MARP00 -*** Use velocity of GUAM - tx(13) = 0.9056d0 - ty(13) = -2.0200d0 - tz(13) = -0.5516d0 - dtx(13) = -0.00069d0 - dty(13) = 0.00070d0 - dtz(13) = -0.00046d0 - rx(13) = .028847d0 / rhosec - ry(13) = .010644d0 / rhosec - rz(13) = 0.008989d0 / rhosec - drx(13) = -0.000033d0 / rhosec - dry(13) = 0.000120d0 / rhosec - drz(13) = -0.000327d0 / rhosec - scale(13) = -0.61504d-9 - dscale(13) = 0.18201d-9 - refepc(13) = 1997.00d0 - -*** From ITRF94 to ITRF2005 -*** assumes that ITRF94 = ITRF96 -*** uses IGS values for ITRF96 -> ITRF97 -*** uses IERS values for ITRF97 -> ITRF2000 -*** uses IERS values for ITRF2000 -> ITRF2005 - tx(14) = -0.00533d0 - ty(14) = -0.00479d0 - tz(14) = 0.00895d0 - dtx(14) = -0.00049d0 - dty(14) = 0.00060d0 - dtz(14) = 0.00134d0 - rx(14) = -.00012467d0 / rhosec - ry(14) = 0.00022355d0 / rhosec - rz(14) = 0.00006065d0 / rhosec - drx(14) = -0.00001347d0 / rhosec - dry(14) = 0.00001514d0 / rhosec - drz(14) = 0.00001973d0 / rhosec - scale(14) = -0.77504d-9 - dscale(14) = 0.10201d-9 - refepc(14) = 1997.0d0 - -*** From ITRF94 to ITRF2008 (also IGS08 and IGB08) -*** assumes that ITRF94 = ITRF96 -*** uses IGS values for ITRF96 -> ITRF97 -*** uses IERS values for ITRF97 -> ITRF2000 -*** uses IERS values for ITRF2000-> ITRF2005 -*** uses IERS values for ITRF2005 -> ITRF2008 (and IGS08 and IGB08) - - tx(15) = -0.00243d0 - ty(15) = -0.00389d0 - tz(15) = 0.01365d0 - dtx(15) = -0.00079d0 - dty(15) = 0.00060d0 - dtz(15) = 0.00134d0 - rx(15) = -0.00012467d0 / rhosec - ry(15) = 0.00022355d0 / rhosec - rz(15) = 0.00006065d0 / rhosec - drx(15) = -0.00001347d0 / rhosec - dry(15) = 0.00001514d0 / rhosec - drz(15) = 0.00001973d0 / rhosec - scale(15) = -1.71504d-9 - dscale(15) = 0.10201d-9 - refepc(15) = 1997.0d0 - -*** From ITRF94 to ITRF2014 -*** assumes that ITRF94 = ITRF96 -*** uses IGS values for ITRF96 -> ITRF97 -*** uses IERS values for ITRF97 -> ITRF2000 -*** uses IERS values for ITRF2000-> ITRF2005 -*** uses IERS values for ITRF2005 -> ITRF2008 (and IGS08 and IGB08) -*** uses IERS values for ITRF2008 -> ITRF2014 - -c tx(16) = -0.00403d0 !Differs from ITRF2008 - tx(16) = -0.01430d0 -c ty(16) = -0.00579d0 !Differs from ITRF2008 - ty(16) = 0.00201d0 -c tz(16) = 0.01125d0 !Differs from ITRF2008 - tz(16) = 0.02867d0 - - dtx(16) = -0.00079d0 !Like ITRF2008 - dty(16) = 0.00060d0 !Like ITRF2008 - dtz(16) = 0.00144d0 !Differs from ITRF2008 - -c rx(16) = -0.00012467d0 / rhosec !Like ITRF2008 - rx(16) = -0.00029978d0 / rhosec -c ry(16) = 0.00022355d0 / rhosec !Like ITRF2008 - ry(16) = 0.00042037d0 / rhosec -c rz(16) = 0.00006065d0 / rhosec !Like ITRF2008 - rz(16) = 0.00031714d0 / rhosec - drx(16) = -0.00001347d0 / rhosec !Like ITRF2008 - dry(16) = 0.00001514d0 / rhosec !Like ITRF2008 - drz(16) = 0.00001973d0 / rhosec !Like ITRF2008 - -C scale(16) = -1.69504d-9 !Differs from ITRF2008, but only insignificantly - scale(16) = -0.36891d-9 - dscale(16) = 0.07201d-9 !Differs from ITRF2008, but only insignificantly - refepc(16) = 2010.0d0 !Differs from ITRF2008 - -C************************************************************************************************************************* -C Parameters computed with the IERS values of ITRF96==>ITRF97 - -*** From ITRF94 to NAD 83 - tx1(1) = 0.9910d0 - ty1(1) = -1.9072d0 - tz1(1) = -.5129d0 - dtx1(1) = 0.d0 - dty1(1) = 0.d0 - dtz1(1) = 0.d0 - rx1(1) = 1.25033d-7 - ry1(1) = 0.46785d-7 - rz1(1) = 0.56529d-7 - drx1(1) = 0.00258d-7 - dry1(1) = -.03599d-7 - drz(1) = -.00153d-7 - scale(1) = 0.d0 - dscale1(1) = 0.0d0 - refepc1(1) = 1997.0d0 - -*** From ITRF94 to ITRF88 - tx1(2) = 0.018d0 - ty1(2) = 0.000d0 - tz1(2) = -.092d0 - dtx1(2) = 0.0d0 - dty1(2) = 0.0d0 - dtz1(2) = 0.0d0 - rx1(2) = -.0001d0 / rhosec - ry1(2) = 0.0d0 - rz1(2) = 0.0d0 - drx1(2) = 0.0d0 - dry1(2) = 0.0d0 - drz1(2) = 0.0d0 - scale1(2) = 0.74d-8 - dscale1(2) = 0.0d0 - refepc1(2) = 1988.0d0 - -*** From ITRF94 to ITRF89 - tx1(3) = 0.023d0 - ty1(3) = 0.036d0 - tz1(3) = -.068d0 - dtx1(3) = 0.0d0 - dty1(3) = 0.0d0 - dtz1(3) = 0.0d0 - rx1(3) = 0.0d0 - ry1(3) = 0.0d0 - rz1(3) = 0.0d0 - drx1(3) = 0.0d0 - dry1(3) = 0.0d0 - drz1(3) = 0.0d0 - scale1(3) = 0.43d-8 - dscale1(3) = 0.0d0 - refepc1(3) = 1988.0d0 - -*** From ITRF94 to ITRF90 - tx1(4) = 0.018d0 - ty1(4) = 0.012d0 - tz1(4) = -.030d0 - dtx1(4) = 0.0d0 - dty1(4) = 0.0d0 - dtz1(4) = 0.0d0 - rx1(4) = 0.0d0 - ry1(4) = 0.0d0 - rz1(4) = 0.0d0 - drx1(4) = 0.0d0 - dry1(4) = 0.0d0 - drz1(4) = 0.0d0 - scale1(4) = 0.09d-8 - dscale1(4) = 0.0d0 - refepc1(4) = 1988.0d0 - -*** From ITRF94 to ITRF91 - tx1(5) = 0.020d0 - ty1(5) = 0.016d0 - tz1(5) = -.014d0 - dtx1(5) = 0.0d0 - dty1(5) = 0.0d0 - dtz1(5) = 0.0d0 - rx1(5) = 0.0d0 - ry1(5) = 0.0d0 - rz1(5) = 0.0d0 - drx1(5) = 0.0d0 - dry1(5) = 0.0d0 - drz1(5) = 0.0d0 - scale1(5) = 0.06d-8 - dscale1(5) = 0.0d0 - refepc1(5) = 1988.0d0 - -*** From ITRF94 to ITRF92 - tx1(6) = 0.008d0 - ty1(6) = 0.002d0 - tz1(6) = -.008d0 - dtx1(6) = 0.0d0 - dty1(6) = 0.0d0 - dtz1(6) = 0.0d0 - rx1(6) = 0.0d0 - ry1(6) = 0.0d0 - rz1(6) = 0.0d0 - drx1(6) = 0.0d0 - dry1(6) = 0.0d0 - drz1(6) = 0.0d0 - scale1(6) = -.08d-8 - dscale1(6) = 0.0d0 - refepc1(6) = 1988.0d0 - -*** From ITRF94 to ITRF93 - tx1(7) = 0.006d0 - ty1(7) = -.005d0 - tz1(7) = -.015d0 - dtx1(7) = -.0029d0 - dty1(7) = 0.0004d0 - dtz1(7) = 0.0008d0 - rx1(7) = 0.00039d0 / rhosec - ry1(7) = -.00080d0 / rhosec - rz1(7) = 0.00096d0 / rhosec - drx1(7) = .00011d0 / rhosec - dry1(7) = .00019d0 / rhosec - drz1(7) =-.00005d0 / rhosec - scale1(7) = 0.04d-8 - dscale1(7) = 0.0d0 - refepc1(7) = 1988.0d0 - -*** From ITRF94 to ITRF96 - tx1(8) = 0.d0 - ty1(8) = 0.d0 - tz1(8) = 0.d0 - dtx1(8) = 0.d0 - dty1(8) = 0.d0 - dtz1(8) = 0.d0 - rx1(8) = 0.d0 - ry1(8) = 0.d0 - rz1(8) = 0.d0 - drx1(8) = 0.d0 - dry1(8) = 0.d0 - drz1(8) = 0.d0 - scale1(8) = 0.d0 - dscale1(8) = 0.0d0 - refepc1(8) = 1996.0d0 - -*** From ITRF94 to ITRF97 (based on IERS adopted values) -*** According to IERS: ITRF97 = ITRF96 = ITRF94 - tx1(9) = 0.00000d0 - ty1(9) = 0.00000d0 - tz1(9) = 0.00000d0 - dtx1(9) = 0.00000d0 - dty1(9) = 0.00000d0 - dtz1(9) = 0.00000d0 - rx1(9) = 0.00000000d0 - ry1(9) = 0.00000000d0 - rz1(9) = 0.00000000d0 - drx1(9) = 0.00000000d0 - dry1(9) = 0.00000000d0 - drz1(9) = 0.00000000d0 - scale1(9) = 0.d0 - dscale1(9) = 0.d0 - refepc1(9) = 2000.0d0 - -*** From ITRF94 to WGS 72 (composition of ITRF94 -> NAD_83 -> WGS_72) - tx1(10) = 0.9910d0 - ty1(10) = -1.9072d0 - tz1(10) = -.5129d0 - 4.5d0 - dtx1(10) = 0.d0 - dty1(10) = 0.d0 - dtz1(10) = 0.d0 - rx1(10) = 1.25033d-7 - ry1(10) = 0.46785d-7 - rz1(10) = 0.56529d-7 + 26.85868d-7 - drx1(10) = 0.00258d-7 - dry1(10) = -.03599d-7 - drz1(10) = -.00153d-7 - scale1(10) = 0.d0 - 0.2263d-6 - dscale1(10) = 0.0d0 - refepc1(10) = 1997.0d0 - -*** From ITRF94 to ITRF00 -*** assumes that ITRF94 = ITRF96 and -*** uses IERS values for ITRF96 -> ITRF97 -*** and IERS values for ITRF97 -> ITRF00 - tx1(11) = -.00670d0 - ty1(11) = -.00430d0 - tz1(11) = +.02270d0 - dtx1(11) = 0.00000d0 - dty1(11) = 0.00060d0 - dtz1(11) = 0.00140d0 - rx1(11) = 0.00000000d0 / rhosec - ry1(11) = 0.00000000d0 / rhosec - rz1(11) = +0.00006000d0 / rhosec - drx1(11) = 0.00000000d0 / rhosec - dry1(11) = 0.00000000d0 / rhosec - drz1(11) = +0.00002000d0 / rhosec - scale1(11) = -1.58000d-9 - dscale1(11) = -0.01000d-9 - refepc1(11) = 2000.0d0 - -*** From ITRF94 to PACP00 -*** use PA/ITRF00 rotation rates from Beavan et al., (2002) - tx1(12) = 0.9035d0 - ty1(12) = -2.0202d0 - tz1(12) = -0.5417d0 - dtx1(12) = 0.00000d0 - dty1(12) = 0.00060d0 - dtz1(12) = 0.0014d0 - rx1(12) = 0.027741d0 / rhosec - ry1(12) = 0.013469d0 / rhosec - rz1(12) = 0.002712d0 / rhosec - drx1(12) = -.000384d0 / rhosec - dry1(12) = 0.001007d0 / rhosec - drz1(12) = -.002166d0 / rhosec - scale1(12) = -1.55000d-9 - dscale1(12) = -0.010000d-9 - refepc1(12) = 1997.0d0 - -*** From ITRF94 to MARP00 -*** Use velocity of GUAM - tx1(13) = 0.9035d0 - ty1(13) = -2.0202d0 - tz1(13) = -0.5417d0 - dtx1(13) = -0.00000d0 - dty1(13) = 0.00060d0 - dtz1(13) = 0.00140d0 - rx1(13) = .028971d0 / rhosec - ry1(13) = .01042d0 / rhosec - rz1(13) = 0.008928d0 / rhosec - drx1(13) = -0.00002d0 / rhosec - dry1(13) = 0.000105d0 / rhosec - drz1(13) = -0.000327d0 / rhosec - scale1(13) = -1.55000d-9 - dscale1(13) = -0.01000d-9 - refepc1(13) = 1997.00d0 - -*** From ITRF94 to ITRF2005 -*** assumes that ITRF94 = ITRF96 -*** uses IERS values for ITRF96 -> ITRF97 -*** uses IERS values for ITRF97 -> ITRF2000 -*** uses IERS values for ITRF2000 -> ITRF2005 - tx1(14) = -0.00680d0 - ty1(14) = -0.00350d0 - tz1(14) = 0.0285d0 - dtx1(14) = 0.00020d0 - dty1(14) = 0.00050d0 - dtz1(14) = 0.00320d0 - rx1(14) = 0.00000000d0 / rhosec - ry1(14) = 0.00000000d0 / rhosec - rz1(14) = +0.00006000d0 / rhosec - drx1(14) = 0.00000000d0 / rhosec - dry1(14) = 0.00000000d0 / rhosec - drz1(14) = +0.00002000d0 / rhosec - scale1(14) = -1.98000d-9 - dscale1(14) = -0.09000d-9 - refepc1(14) = 2000.0d0 - -*** From ITRF94 to ITRF2008 (also IGS08 and IGB08) -*** assumes that ITRF94 = ITRF96 -*** uses IERS values for ITRF96 -> ITRF97 -*** uses IERS values for ITRF97 -> ITRF2000 -*** uses IERS values for ITRF2000-> ITRF2005 -*** uses IERS values for ITRF2005 -> ITRF2008 (and IGS08 and IGB08) - tx1(15) = -0.00480d0 - ty1(15) = -0.00260d0 - tz1(15) = 0.03320d0 - dtx1(15) = -0.00010d0 - dty1(15) = 0.00050d0 - dtz1(15) = 0.00320d0 - rx1(15) = 0.00000000d0 / rhosec - ry1(15) = 0.00000000d0 / rhosec - rz1(15) = +0.00006000d0 / rhosec - drx1(15) = -0.00000000d0 / rhosec - dry1(15) = 0.00000000d0 / rhosec - drz1(15) = +0.00002000d0 / rhosec - scale1(15) = -2.92d-9 - dscale1(15) = -0.09d-9 - refepc1(15) = 2000.0d0 - -*** From ITRF94 to ITRF2014 -*** assumes that ITRF94 = ITRF96 -*** uses IERS values for ITRF96 -> ITRF97 -*** uses IERS values for ITRF97 -> ITRF2000 -*** uses IERS values for ITRF2000-> ITRF2005 -*** uses IERS values for ITRF2005 -> ITRF2008 (and IGS08 and IGB08) -*** uses IERS values for ITRF2008 -> ITRF2014 - -c tx1(16) = -0.00640d0 !Differ from ITRF2008 - tx1(16) = -0.00740d0 -c ty1(16) = -0.00450d0 !Differ from ITRF2008 - ty1(16) = 0.00050d0 -c tz1(16) = 0.03080d0 !Differ from ITRF2008 - tz1(16) = 0.06280d0 - - dtx1(16) = -0.00010d0 !Like ITRF2008 - dty1(16) = 0.00050d0 !Like ITRF2008 - dtz1(16) = 0.00330d0 !Differ from ITRF2008 - - rx1(16) = 0.00000000d0 / rhosec !Like ITRF2008 - ry1(16) = 0.00000000d0 / rhosec !Like ITRF2008 -c rz1(16) = +0.00006000d0 / rhosec !Like ITRF2008 - rz1(16) = +0.00026000d0 / rhosec - drx1(16) = -0.00000000d0 / rhosec !Like ITRF2008 - dry1(16) = 0.00000000d0 / rhosec !Like ITRF2008 - drz1(16) = +0.00002000d0 / rhosec !Like ITRF2008 - -c scale1(16) = -2.90d-9 !Differ from ITRF2008, but only insignificantly - scale1(16) = -3.80d-9 - dscale1(16) = -0.12d-9 !Differ from ITRF2008, but only insignificantly - - refepc1(16) = 2010.0d0 !Differ from ITRF2008 - - return - end -************************************************************* - subroutine frit94(x1, y1, z1, x2, y2, z2, date, jopt) - -*** Converts ITRF94 cartesian coordinates to cartesian -*** coordinates in the specified reference frame for the -*** given date -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - -*** (x1, y1, z1) --> input ITRF94 coordiates (meters) -*** (x2, y2, z2) --> output coordinates (meters) -*** date --> time (decimal years) to which the input & output -*** coordinates correspond -*** jopt --> input specifier of output reference frame - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /tranpa/ tx(numref), ty(numref), tz(numref), - & dtx(numref), dty(numref), dtz(numref), - & rx(numref), ry(numref), rz(numref), - & drx(numref), dry(numref), drz(numref), - & scale(numref), dscale(numref), refepc(numref) - - if (jopt .eq. 0) then - iopt = 1 - else - iopt = jopt - endif - - dtime = date - refepc(iopt) - tranx = tx(iopt) + dtx(iopt)*dtime - trany = ty(iopt) + dty(iopt)*dtime - tranz = tz(iopt) + dtz(iopt)*dtime - rotnx = rx(iopt) + drx(iopt)*dtime - rotny = ry(iopt) + dry(iopt)*dtime - rotnz = rz(iopt) + drz(iopt)*dtime - ds = 1.d0 + scale(iopt) + dscale(iopt)*dtime - - x2 = tranx + ds*x1 + rotnz*y1 - rotny*z1 - y2 = trany - rotnz*x1 + ds*y1 + rotnx*z1 - z2 = tranz + rotny*x1 - rotnx*y1 + ds*z1 -c write (*,*) "FROM TIIT94 ",dtime -c write (*,*) "FROM TIIT94 ",tx(iopt),ty(iopt),tz(iopt) -c write (*,*) "FROM TIIT94 ",dtx(iopt),dty(iopt),dtz(iopt) -c write (*,*) "FROM TIIT94 ",rx(iopt),ry(iopt),rz(iopt) -c write (*,*) "FROM TIIT94 ",drx(iopt),dry(iopt),drz(iopt) -c write (*,*) "FROM TIIT94 ",scale(iopt),dscale(iopt) -c write (*,*) "FROM TIIT94 ",x2,y2,z2 - - return - end -************************************************************************************* - subroutine frit94_IERS (x1, y1, z1, x2, y2, z2, date, jopt) - -*** Converts ITRF94 cartesian coordinates to cartesian -*** coordinates in the specified reference frame for the -*** given date -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - -*** (x1, y1, z1) --> input ITRF94 coordiates (meters) -*** (x2, y2, z2) --> output coordinates (meters) -*** date --> time (decimal years) to which the input & output -*** coordinates correspond -*** jopt --> input specifier of output reference frame - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /tranpa1/ tx1(numref), ty1(numref), tz1(numref), - & dtx1(numref), dty1(numref), dtz1(numref), - & rx1(numref), ry1(numref), rz1(numref), - & drx1(numref), dry1(numref), drz1(numref), - & scale1(numref), dscale1(numref), refepc1(numref) - - - if (jopt .eq. 0) then - iopt = 1 - else - iopt = jopt - endif - - dtime = date - refepc1(iopt) - tranx = tx1(iopt) + dtx1(iopt)*dtime - trany = ty1(iopt) + dty1(iopt)*dtime - tranz = tz1(iopt) + dtz1(iopt)*dtime - rotnx = rx1(iopt) + drx1(iopt)*dtime - rotny = ry1(iopt) + dry1(iopt)*dtime - rotnz = rz1(iopt) + drz1(iopt)*dtime - ds = 1.d0 + scale1(iopt) + dscale1(iopt)*dtime - - x2 = tranx + ds*x1 + rotnz*y1 - rotny*z1 - y2 = trany - rotnz*x1 + ds*y1 + rotnx*z1 - z2 = tranz + rotny*x1 - rotnx*y1 + ds*z1 -c write (*,*) "FROM TIIT94_IERS ",dtime -c write (*,*) "FROM TIIT94_IERS ",tx1(iopt),ty1(iopt),tz1(iopt) -c write (*,*) "FROM TIIT94_IERS ",dtx1(iopt),dty1(iopt),dtz1(iopt) -c write (*,*) "FROM TIIT94_IERS ",rx1(iopt),ry1(iopt),rz1(iopt) -c write (*,*) "FROM TIIT94_IERS ",drx1(iopt),dry1(iopt),drz1(iopt) -c write (*,*) "FROM TIIT94_IERS ",scale1(iopt),dscale1(iopt) -c write (*,*) "FROM TIIT94_IERS ",x2,y2,z2 - - return - end - -*********************************************************** - subroutine toit94(x1, y1, z1, x2, y2, z2, date, jopt) - -*** Converts cartesian coordinates in a specified reference -*** to ITRF94 cartesian coordinates for the given date -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - -*** (x1, y1, z1) --> input coordiates (meters) -*** (x2, y2, z2) --> output ITRF94 coordinates (meters) -*** date --> time (decimal years) to which the input & output -*** coordinates correspond -*** jopt --> input specifier of input reference frame - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /tranpa/ tx(numref), ty(numref), tz(numref), - & dtx(numref), dty(numref), dtz(numref), - & rx(numref), ry(numref), rz(numref), - & drx(numref), dry(numref), drz(numref), - & scale(numref), dscale(numref), refepc(numref) - - if (jopt .eq. 0) then - iopt = 1 - else - iopt = jopt - endif - - dtime = date - refepc(iopt) - tranx = -(tx(iopt) + dtx(iopt)*dtime) - trany = -(ty(iopt) + dty(iopt)*dtime) - tranz = -(tz(iopt) + dtz(iopt)*dtime) - rotnx = -(rx(iopt) + drx(iopt)*dtime) - rotny = -(ry(iopt) + dry(iopt)*dtime) - rotnz = -(rz(iopt) + drz(iopt)*dtime) - ds = 1.d0 - (scale(iopt) + dscale(iopt)*dtime) - - x2 = tranx + ds*x1 + rotnz*y1 - rotny*z1 - y2 = trany - rotnz*x1 + ds*y1 + rotnx*z1 - z2 = tranz + rotny*x1 - rotnx*y1 + ds*z1 -c write (*,*) "TO TIIT94 ",dtime -c write (*,*) "TO TIIT94 ",tx(iopt),ty(iopt),tz(iopt) -c write (*,*) "TO TIIT94 ",dtx(iopt),dty(iopt),dtz(iopt) -c write (*,*) "TO TIIT94 ",rx(iopt),ry(iopt),rz(iopt) -c write (*,*) "TO TIIT94 ",drx(iopt),dry(iopt),drz(iopt) -c write (*,*) "TO TIIT94 ",scale(iopt),dscale(iopt) -c write (*,*) "TO TIIT94 ",x2,y2,z2 - - return - end - -***************************************************************** - subroutine toit94_IERS(x1, y1, z1, x2, y2, z2, date, jopt) - -*** Converts cartesian coordinates in a specified reference -*** to ITRF94 cartesian coordinates for the given date -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - -*** (x1, y1, z1) --> input coordiates (meters) -*** (x2, y2, z2) --> output ITRF94 coordinates (meters) -*** date --> time (decimal years) to which the input & output -*** coordinates correspond -*** jopt --> input specifier of input reference frame - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /tranpa1/ tx1(numref), ty1(numref), tz1(numref), - & dtx1(numref), dty1(numref), dtz1(numref), - & rx1(numref), ry1(numref), rz1(numref), - & drx1(numref), dry1(numref), drz1(numref), - & scale1(numref), dscale1(numref), refepc1(numref) - - - if (jopt .eq. 0) then - iopt = 1 - else - iopt = jopt - endif - - dtime = date - refepc1(iopt) - tranx = -(tx1(iopt) + dtx1(iopt)*dtime) - trany = -(ty1(iopt) + dty1(iopt)*dtime) - tranz = -(tz1(iopt) + dtz1(iopt)*dtime) - rotnx = -(rx1(iopt) + drx1(iopt)*dtime) - rotny = -(ry1(iopt) + dry1(iopt)*dtime) - rotnz = -(rz1(iopt) + drz1(iopt)*dtime) - ds = 1.d0 - (scale1(iopt) + dscale1(iopt)*dtime) - - x2 = tranx + ds*x1 + rotnz*y1 - rotny*z1 - y2 = trany - rotnz*x1 + ds*y1 + rotnx*z1 - z2 = tranz + rotny*x1 - rotnx*y1 + ds*z1 -c write (*,*) "TO TIIT94_IERS ",dtime -c write (*,*) "TO TIIT94_IERS ",tx1(iopt),ty1(iopt),tz1(iopt) -c write (*,*) "TO TIIT94_IERS ",dtx1(iopt),dty1(iopt),dtz1(iopt) -c write (*,*) "TO TIIT94_IERS ",rx1(iopt),ry1(iopt),rz1(iopt) -c write (*,*) "TO TIIT94_IERS ",drx1(iopt),dry1(iopt),drz1(iopt) -c write (*,*) "TO TIIT94_IERS ",scale1(iopt),dscale1(iopt) -c write (*,*) "TO TIIT94_IERS ",x2,y2,z2 - - return - end -***************************************************************** - subroutine MENU1(kopt, mframe) - -** Write out options for reference frames - - implicit integer*4 (i-n) - character mframe*24, nframe*24 - dimension nframe(24) - dimension iframe(24) - common /files/ luin, luout, i1, i2, i3, i4, i5, i6 - - iframe(1) = 1 - nframe(1) = 'NAD_83(2011/CORS96/2007)' - iframe(2) = 12 - nframe(2) = 'NAD_83(PA11/PACP00) ' - iframe(3) = 13 - nframe(3) = 'NAD_83(MA11/MARP00) ' - iframe(4) = 10 - nframe(4) = 'WGS_72 ' - iframe(5) = 1 - nframe(5) = 'WGS_84(transit) ' -c iframe(6) = 6 (This was incorrect in all versions of HTDP) - iframe(6) = 5 - nframe(6) = 'WGS_84(G730) ' - iframe(7) = 8 - nframe(7) = 'WGS_84(G873) ' - iframe(8) = 11 - nframe(8) = 'WGS_84(G1150) ' - iframe(9) = 15 - nframe(9) = 'WGS_84(G1674) ' -c iframe(10)= 4 -c nframe(10)= 'PNEOS_90 or NEOS_90 ' - iframe(10)= 15 - nframe(10)= 'WGS_84(G1762) ' - iframe(11)= 5 - nframe(11)= 'SIO/MIT_92 ' - iframe(12)= 2 - nframe(12)= 'ITRF88 ' - iframe(13)= 3 - nframe(13)= 'ITRF89 ' - iframe(14)= 4 - nframe(14)= 'ITRF90 ' - iframe(15)= 5 - nframe(15)= 'ITRF91 ' - iframe(16)= 6 - nframe(16)= 'ITRF92 ' - iframe(17)= 7 - nframe(17)= 'ITRF93 ' - iframe(18)= 8 - nframe(18)= 'ITRF94 ' - iframe(19)= 8 - nframe(19)= 'ITRF96 ' - iframe(20)= 9 - nframe(20)= 'ITRF97 or IGS97 ' - iframe(21)= 11 - nframe(21)= 'ITRF2000 or IGS00/IGb00 ' - iframe(22)= 14 - nframe(22)= 'ITRF2005 or IGS05 ' - iframe(23)= 15 - nframe(23)= 'ITRF2008 or IGS08/IGB08 ' - iframe(24)= 16 - nframe(24)= 'ITRF2014 or IGS14 ' - - write(luout, 100) - 100 format( - 1' 1...NAD_83(2011/CORS96/2007) (North American plate fixed) '/ - 1' 2...NAD_83(PA11/PACP00) (Pacific plate fixed) '/ - 1' 3...NAD_83(MA11/MARP00) (Mariana plate fixed) '/ - 1' '/ -c 1' 4...WGS_72 '/ - 1' 5...WGS_84(transit) (NAD_83(2011) used) 15...ITRF91 '/ - 1' 6...WGS_84(G730) (ITRF91 used) 16...ITRF92 '/ - 1' 7...WGS_84(G873) (ITRF94 used) 17...ITRF93 '/ - 1' 8...WGS_84(G1150) (ITRF2000 used) 18...ITRF94 '/ - 1' 9...WGS_84(G1674) (ITRF2008 used) 19...ITRF96 '/ -c 1' 10...PNEOS_90 or NEOS_90 (ITRF90 used) 20...ITRF97 or IGS97'/ - 1' 10...WGS_84(G1762) (IGb08 used) 20...ITRF97 or IGS97'/ - 1' 11...SIO/MIT_92 (ITRF91 used) 21...ITRF2000 or IGS00/IGb00'/ - 1' 12...ITRF88 22...ITRF2005 or IGS05 '/ - 1' 13...ITRF89 23...ITRF2008 or IGS08/IGb08'/ - 1' 14...ITRF90 or (PNEOS90/NEOS90) 24...ITRF2014 or IGS14 '/ ) -c 1' 14...ITRF90 '/ ) - - read (luin, *,err=50,iostat=ios) iopt - if (ios /= 0) goto 50 - if ( 1 .le. iopt .and. iopt .le. 24) then - mframe = nframe(iopt) - kopt = iframe(iopt) - else - mframe = ' ' - kopt = iopt - endif - return - - 50 write (*,*) 'Failed to read option in MENU1:ios=',ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - end - -*************************************************************** - SUBROUTINE UPDATE(HTDP_version) - -** Update positions and/or observations to a specified date. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (numref = 16) - parameter (nbbdim = 10000) - CHARACTER OLDBB*30,NEWBB*30, NAMEIF*30 - CHARACTER NAME24*24 - CHARACTER OPT*1,ANSWER*1,BBTYPE*1,VOPT*1 - CHARACTER LATDIR*1, LONDIR*1, LATDR*1, LONDR*1 - character frame1*24, frame2*24 - character HTDP_version*10 - LOGICAL TEST - LOGICAL Is_iopt_NAD83 - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /CAUTION/ MONTH2, IDAY2, IYEAR2, DATE2,frame1 - - WRITE(LUOUT,20) - 20 FORMAT(' ********************************************'/ - 1 ' Please enter the time to which the updated'/ - 1 ' positions and/or observations are to correspond.') - 15 CALL GETMDY(MONTH2,IDAY2,IYEAR2,DATE2,MIN2,TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter the time? (y/n)' - read (luin, '(A1)',err=500,iostat=ios) ANSWER - if (ios /= 0) goto 500 - if (ANSWER .eq. 'y' .or. ANSWER .eq. 'Y') GO TO 15 - RETURN - ENDIF - -** Choosing reference frame for positions - 35 WRITE(LUOUT,30) - 30 FORMAT(' **************************************************'/ - 1 ' Select the reference frame to be used for specifying'/ - 2 ' positions. '/) - call MENU1( iopt, frame1) - IF(IOPT .LT. 1 .OR. IOPT .GT. numref) THEN - WRITE(LUOUT,40) - 40 FORMAT(' Improper selection--try again. ') - GO TO 35 - ENDIF - Is_iopt_NAD83 = (iopt == 1) - - 999 WRITE(LUOUT,1000) - 1000 FORMAT(' ******************************'/ - 1 ' Select option:'/ - 2 ' 0...No more updates. Return to main menu.'/ - 3 ' 1...Update positions for individual points', - 4 ' entered interactively.'/ - 5 ' 2...Update positions for blue book stations.'/ - 6 ' 3...Update values for blue book observations.'/ - 7 ' 4...Update both the positions for blue book', - 8 ' stations'/ - 9 ' and the values for blue book', - 9 ' observations.'/ - 9 ' 5...Update positions contained in batch file '/ - 9 ' of delimited records of the form: '/ - 9 ' LAT,LON,EHT,"TEXT" ' / - 9 ' LAT = latitude in degrees (positive north/DBL PREC)'/ - 9 ' LON = longitude in degrees (positive west/DBL PREC)'/ - 9 ' EHT = ellipsoid height in meters (DBL PREC)'/ - 9 ' TEXT = Descriptive text (CHARACTER*24) '/ - 9 ' Example: '/ - 9 ' 40.731671553,112.212671753,34.241,"SALT AIR" '/) - READ(LUIN,'(A1)',err=501,iostat=ios) OPT - if (ios /= 0) goto 501 - IF(OPT .eq. '0') THEN - RETURN - ELSEIF(OPT .eq. '1') THEN - WRITE(LUOUT,1020) - 1020 FORMAT(' ************************************'/ - 1 ' Enter the time', - 2 ' to which the input positions will correspond. ') - 1025 CALL GETMDY(MONTH1,IDAY1,IYEAR1,DATE1,MIN1,TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter the time? (y/n)' - read(luin,'(A1)',err=500,iostat=ios) ANSWER - if (ios /= 0) goto 500 - if(ANSWER .eq. 'Y' .or. ANSWER .eq. 'y') GO TO 1025 - RETURN - ENDIF - WRITE(LUOUT,1030) - 1030 FORMAT(' ENTER file to save updated positions. ') - READ(LUIN,'(A30)',err=502,iostat=ios) NEWBB - if (ios /= 0) goto 502 - OPEN(I2,FILE=NEWBB,STATUS='UNKNOWN') - CALL HEADER - - WRITE(I2,1031) frame1 - 1031 FORMAT(' UPDATED POSITIONS IN ', a24) - - WRITE(I2,1040) MONTH1,IDAY1,IYEAR1,MONTH2,IDAY2,IYEAR2, - 1 DATE1, DATE2 - 1040 FORMAT(' FROM ',I2,'-',I2.2,'-',I4, - 1 ' TO ',I2,'-',I2.2,'-',I4,' (month-day-year)'/ - 1 ' FROM ',F8.3, ' TO ',F8.3, ' (decimal years)'// - 2 16X,'OLD COORDINATE NEW COORDINATE', - 3 4X,'VELOCITY DISPLACEMENT',/) - 1050 CALL GETPNT(LATD,LATM,SLAT,LATDIR,LOND,LONM,SLON, - 1 LONDIR, NAME24, X,Y,Z,YLAT,YLON,EHT) - ELON = -YLON - call GETVLY(YLAT,ELON,VX,VY,VZ,VN,VE,VU,VOPT,210) - IF ( VOPT .EQ. '0') then - call PREDV( ylat, ylon, eht, date1, iopt, - 1 jregn, vn, ve, vu) - IF(JREGN .eq. 0) THEN - WRITE(LUOUT,1060) - 1060 FORMAT(' **************************************'/ - 1 ' Can not update the position of this point'/ - 2 ' because it is outside of the modeled region.'/) - GO TO 1075 - ELSE - call TOVXYZ(ylat,elon,vn,ve,vu,vx,vy,vz) - ENDIF - ENDIF - call NEWCOR(ylat,ylon,eht,min1,min2, - 1 ylatt,ylont,ehtnew,dn,de,du,vn,ve,vu) - CALL TODMSS(YLATT,LATDN,LATMN,SLATN,ISIGN) - LATDR = 'N' - IF (ISIGN .eq. -1) LATDR = 'S' - CALL TODMSS(YLONT,LONDN,LONMN,SLONN,ISIGN) - LONDR = 'W' - IF (ISIGN .eq. -1) LONDR = 'E' - ELONT = -YLONT - CALL TOXYZ(YLATT,ELONT,EHTNEW,X1,Y1,Z1) - DX = X1 - X - DY = Y1 - Y - DZ = Z1 - Z - WRITE(LUOUT,1065)LATDN,LATMN,SLATN,LATDR,LONDN,LONMN,SLONN, - 1 LONDR, EHTNEW, X1,Y1,Z1 - 1065 FORMAT(' ****************************************'/ - 1 ' Updated latitude = ',I3,I3,1X,F8.5,1X,A1 / - 2 ' Updated longitude = ',I3,I3,1X,F8.5,1X,A1 / - 2 ' Updated Ellip. Ht. = ', F12.3 ,' meters' / - 3 ' Updated X = ',F12.3 ,' meters' / - 4 ' Updated Y = ',F12.3 ,' meters' / - 5 ' Updated Z = ',F12.3 ,' meters' / - 3 ' ****************************************'/) - WRITE(I2,1070)NAME24, - 1 LATD,LATM,SLAT,LATDIR,LATDN,LATMN,SLATN,LATDR,vn,DN, - 1 LOND,LONM,SLON,LONDIR,LONDN,LONMN,SLONN,LONDR,ve,DE, - 1 EHT, EHTNEW, vu,DU, X, X1, vx,DX, - 1 Y, Y1, vy,DY, Z, Z1, vz,DZ - 1070 FORMAT(1X,A24,/ - 1 1X, 'LATITUDE ',2(2X,I3,I3.2,1X,F8.5,1X,A1), - 1 F8.2, ' mm/yr', f8.3, ' m north'/ - 1 1X, 'LONGITUDE ',2(2X,I3,I3.2,1X,F8.5,1x,A1), - 1 f8.2, ' mm/yr',f8.3,' m east'/ - 1 1X, 'ELLIP. HT.',2(6X,F13.3), - 1 f8.2, ' mm/yr',F8.3,' m up'/ - 1 1X, 'X ',2(6X,F13.3), - 1 f8.2, ' mm/yr',F8.3,' m '/ - 1 1X, 'Y ',2(6X,F13.3), - 1 f8.2, ' mm/yr',f8.3, ' m'/ - 1 1X, 'Z ',2(6X,F13.3), - 1 f8.2, ' mm/yr',F8.3,' m'/) - 1075 WRITE(LUOUT,1080) - 1080 FORMAT(' Update more positions? (y/n) ') - READ(LUIN,'(A1)',err=500,iostat=ios) ANSWER - if (ios /= 0) goto 500 - IF(ANSWER .eq. 'Y' .or. ANSWER .eq. 'y') GO TO 1050 - CLOSE(I2,STATUS='KEEP') - RETURN - -*** Updating a blue book - - ELSEIF(OPT .eq. '2' .or. OPT .eq. '3' .or. OPT .eq. '4') THEN - - if (nbbdim .eq. 10000) then - 90 WRITE(LUOUT,91) - 91 FORMAT( - 1 ' Identify type of blue book:'/ - 2 ' 1...Standard (4-digit SSN)'/ - 3 ' 2...Non-standard (5-digit SSN) ') - READ(LUIN,'(A1)',err=503,iostat=ios) BBTYPE - if (ios /= 0) goto 503 - IF(BBTYPE .NE. '1' .AND. BBTYPE .NE. '2') GO TO 90 - else - BBTYPE = '1' - endif - - WRITE(LUOUT,100) - 100 FORMAT(' Enter name of the blue book file to be updated.'/) - READ(LUIN,110,err=502,iostat=ios) OLDBB - if (ios /= 0) goto 502 - 110 FORMAT(A30) - WRITE(LUOUT,120) - 120 FORMAT(' Enter name for the new blue book file that is to '/ - 1 'contain the updated information.'/) - READ(LUIN,110,err=502,iostat=ios) NEWBB - if (ios /= 0) goto 502 - OPEN(I1,FILE = OLDBB , STATUS = 'OLD') - - OPEN(I4, ACCESS = 'DIRECT', RECL = 40, - 1 FORM = 'UNFORMATTED', STATUS = 'SCRATCH') - - IF(OPT .eq. '2' .or. OPT .eq. '4') THEN - WRITE(LUOUT,122) - 122 FORMAT(' *********************************************'/ - 1 ' Enter the time', - 1 ' to which the input positions correspond.'/) - 123 CALL GETMDY(MONTH1,IDAY1,IYEAR1,DATE1,MIN1,TEST) - IF(TEST) then - write(luout,*) ' Do you wish to re-enter the time? (y/n)' - read(luin, '(A1)',err=500,iostat=ios) ANSWER - if (ios /= 0) goto 500 - IF (ANSWER .eq. 'y' .or. ANSWER .eq. 'Y') GO TO 123 - RETURN - ENDIF - ENDIF - -*** Retrieve geodetic positions from old blue-book file - - IF(BBTYPE .EQ. '1') THEN - CALL GETPO4(IOPT, DATE1) - ELSEIF(BBTYPE .EQ. '2') THEN - CALL GETPO5(IOPT, DATE1) - ENDIF - -*** Create new blue book file - - OPEN(I2,FILE = NEWBB, STATUS = 'UNKNOWN') - - write (i2,127) HTDP_version - 127 format (' ***CAUTION: This file was processed using HTDP', - & ' version ',a10, '***') - write (i2,128) frame1 - 128 format (' ***CAUTION: Coordinates in this file are in ', - & a24, '***') - IF (OPT .EQ. '2' .OR. OPT .EQ. '4') THEN - WRITE(I2, 129) MONTH2, IDAY2, IYEAR2, DATE2 - 129 FORMAT(' ***CAUTION: Coordinates in this file have been ', - * 'updated to ',I2,'-',I2.2,'-',I4, ' = (',F8.3,') ***') - ENDIF - -c IF (OPT .EQ. '3' .OR. OPT .EQ. '4') THEN -c WRITE(I2, 130) MONTH2, IDAY2, IYEAR2, DATE2 -c 130 FORMAT(' ***CAUTION: Observations in this file have been ', -c * 'updated to ',I2,'-',I2.2,'-',I4, ' = (',F8.3,') ***') -c ENDIF - - IF(BBTYPE .EQ. '1') THEN - CALL UPBB4(MIN1,MIN2,OPT,IOPT) - ELSEIF(BBTYPE .EQ. '2') THEN - CALL UPBB5(MIN1,MIN2,OPT,IOPT) - ENDIF - CLOSE(I1, STATUS = 'KEEP') - CLOSE(I2, STATUS = 'KEEP') - -*** Update G-FILE - - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - 605 WRITE(LUOUT,610) - 610 FORMAT(/' Is there a G-FILE to be updated? (y/n) ') - READ(LUIN,'(A1)',err=500,iostat=ios) ANSWER - if (ios /= 0) goto 500 - IF(ANSWER .eq. 'N' .or. ANSWER .eq. 'n') THEN - CONTINUE - ELSEIF(ANSWER .eq. 'Y' .or. ANSWER .eq. 'y')THEN - WRITE(LUOUT,620) - 620 FORMAT(' Enter name of old G-FILE to be updated. ') - READ(LUIN,'(A30)',err=502,iostat=ios) OLDBB - if (ios /= 0) goto 502 - WRITE(LUOUT,630) - 630 FORMAT(' Enter name for the new updated G-FILE. ') - READ(LUIN,'(A30)',err=502,iostat=ios) NEWBB - if (ios /= 0) goto 502 - OPEN(I1,FILE=OLDBB,STATUS='OLD') - OPEN(I2,FILE=NEWBB,STATUS='UNKNOWN') - WRITE(I2,130) MONTH2, IDAY2, IYEAR2, DATE2 - 130 FORMAT(' ***CAUTION: Observations in this file have been ', - * 'updated to ',I2,'-',I2.2,'-',I4, ' = (',F8.3,') ***') - - 634 WRITE(LUOUT, 632) - 632 FORMAT(/' ***************************'/ - * ' To what reference frame should the GPS'/ - * ' vectors be transformed?'/ - * ' -1...Do not transform GPS vectors.') - CALL MENU1(kopt, frame2) - IF(KOPT .LT. -1 .OR. KOPT .GT. numref) THEN - WRITE(LUOUT, 40) - GO TO 634 - ELSEIF (1 .LE. KOPT .AND. KOPT .LE. numref) then - write( I2, 640) frame2 - 640 format( ' ***CAUTION: All GPS interstation vectors', - 1 ' have been transformed to ', a24, ' ***') - write( I2, 641) HTDP_version - 641 format(' ***CAUTION: Observations were transformed using' - 1 ,' HTDP version ', a10, ' ***') - ENDIF - - IF(BBTYPE .EQ. '1') THEN - CALL UPGFI4(DATE2, MIN2, IOPT, KOPT, - * MONTH2, IDAY2, IYEAR2) - ELSEIF(BBTYPE .EQ. '2') THEN - CALL UPGFI5(DATE2, MIN2, IOPT, KOPT, - * MONTH2, IDAY2, IYEAR2) - ENDIF - CLOSE(I1, STATUS = 'KEEP') - CLOSE(I2, STATUS = 'KEEP') - ELSE - WRITE(LUOUT,700) - GO TO 605 - ENDIF - ENDIF - CLOSE(I4, STATUS = 'DELETE') - RETURN - ELSEIF (OPT .eq. '5') then - write (luout, 710) - 710 format(' Enter name of input file ') - read( luin, 711,err=502,iostat=ios) NAMEIF - if (ios /= 0) goto 502 - 711 format( a30 ) - open(I1, FILE=NAMEIF, STATUS = 'OLD') - write(luout, 1020) - 720 call GETMDY(MONTH1,IDAY1,IYEAR1,DATE1,MIN1,TEST) - if(TEST) then - write(luout,*) ' Do you wish to re-enter the time? (y/n)' - read(luin, '(A1)',err=500,iostat=ios) ANSWER - if (ios /= 0) goto 500 - if(ANSWER .eq. 'Y' .or. ANSWER .eq. 'y') GO TO 720 - RETURN - endif - write(luout, 1030) - read(luin, '(a30)',err=502,iostat=ios)NEWBB - if (ios /= 0) goto 502 - open(I2, FILE=NEWBB, STATUS='UNKNOWN') - CALL HEADER - write(I2, 1031) frame1 - write(I2, 1040) MONTH1,IDAY1,IYEAR1, - 1 MONTH2,IDAY2,IYEAR2,DATE1,DATE2 - 730 read(I1,*,END = 750,err=504,iostat=ios) XLAT, XLON, EHT, NAME24 - if (ios /= 0) goto 504 - YLAT = (XLAT*3600.d0) / rhosec - Ylon = (XLON*3600.d0) / rhosec - ELON = -YLON - call TODMSS(ylat,latd,latm,slat,ISIGN) - if (ISIGN .eq. 1) then - latdir = 'N' - else - latdir = 'S' - endif - call TODMSS (ylon,lond,lonm,slon,isign) - if (isign .eq. 1) then - londir = 'W' - else - londir = 'E' - endif - call PREDV(ylat,ylon,eht,date1,iopt,jregn,vn,ve,vu) - if(jregn .eq. 0) then - write(I2, 735) name24, latd,latm,slat,latdir, - 1 lond,lonm,slon,londir - 735 format(1x,a24,/ - 1 1x, 'LATITUDE ', 2x,i3,i3.2,1x,f8.5,1x,a1,3x, - 1 'POINT LOCATED OUTSIDE OF MODELED REGION'/ - 1 1x, 'LONGITUDE ', 1x,i3,i3.2,1x,f8.5,1x,a1 /) - else - call TOVXYZ(ylat,elon,vn,ve,vu,vx,vy,vz) - call NEWCOR(ylat,ylon,eht,min1,min2,ylatt,ylont,ehtnew, - 1 dn,de,du,vn,ve,vu) - call TODMSS(YLATT,latdn,latmn,slatn,isign) - latdr = 'N' - if (isign .eq. -1) latdr = 'S' - call TODMSS(ylont,londn,lonmn,slonn,isign) - londr = 'W' - if (isign .eq. -1) londr = 'E' - call TOXYZ(ylat,elon,eht,x,y,z) - elont = -ylont - call TOXYZ(ylatt,elont,ehtnew,x1,y1,z1) - dx = x1 - x - dy = y1 - y - dz = z1 - z - write(I2, 1070) NAME24, latd,latm,slat,latdir, - 1 latdn,latmn,slatn,latdr,vn,dn, - 1 lond,lonm,slon,londir,londn,lonmn,slonn,londr,ve,de, - 1 eht,ehtnew,vu,du, x, x1,vx,dx, - 1 y, y1,vy,dy, z, z1, vz,dz - endif - go to 730 - 750 close(I1, STATUS='KEEP') - close(I2, status = 'KEEP') - return - ELSE - WRITE(LUOUT,700) - 700 FORMAT(' Improper entry !'/) - GO TO 999 - ENDIF - - 500 write (*,'(/)') - write (*,*) "Failed to read answer in UPDATE:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 501 write (*,'(/)') - write (*,*) "Failed to read OPTION in UPDATE:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 502 write (*,'(/)') - write (*,*) "Failed to read file name in UPDATE:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 503 write (*,'(/)') - write (*,*) "Failed to read BBTYPE in UPDATE:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 504 write (*,'(/)') - write (*,*) "Failed to read input in UPDATE:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -******************************************************************* - SUBROUTINE GETPO4(IOPT, DATE) - -*** Retrieve geodetic coordinates from the blue book - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (nbbdim = 10000) - CHARACTER JN*1,JW*1 - CHARACTER TYPE*4 - CHARACTER CARD*80 - CHARACTER PIDs*6 - - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /ARRAYS/ HT(nbbdim),LOC(nbbdim),PIDs(nbbdim) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - DO 100 I = 1, 10000 - LOC(I) = 0 - HT(I) = 0.D0 - 100 CONTINUE - - JREC = 0 - 125 READ(I1,130,END=160,err=200,iostat=ios) CARD - if (ios /= 0) goto 200 - 130 FORMAT(A80) - TYPE = CARD(7:10) - IF(TYPE .EQ. '*80*') THEN - JREC = JREC + 1 - READ(CARD,140,err=201,iostat=ios) ISN,LATD,LATM,SLAT,JN,LOND, - & LONM,SLON,JW,OH - if (ios /= 0) goto 201 - 140 FORMAT(BZ,10X,I4,T45,2I2,F7.5,A1,I3,I2,F7.5,A1,F6.2) - LOC(ISN) = JREC -C HT(ISN) = HT(ISN) + OH - IF ( HT(ISN) .EQ. 0.D0 ) HT(ISN) = OH -c write (*,*) SLAT,SLON,HT(ISN) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - YLAT = (DBLE((LATD*60+LATM)*60)+SLAT)/RHOSEC - YLON = (DBLE((LOND*60+LONM)*60)+SLON)/RHOSEC - IF(JN .EQ. 'S') YLAT = -YLAT - IF(JW .EQ. 'E') YLON = -YLON -c write (*,*) ylat,ylon !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - call PREDV( ylat, ylon, ht(isn), date, iopt, - 1 IDG, vn, ve, vu) -c write (*,*) 'IDG ',IDG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - IF(IDG .eq. 0) THEN - WRITE(LUOUT,150) CARD - 150 FORMAT(' **WARNING** The following point is outside of ', - 1 'the modeled region.'/ - 2 ' It will be assumed that this point has not moved.'/A80/) - ENDIF - WRITE(I4, REC = JREC) YLAT, YLON, VN, VE, VU -C ELSEIF(TYPE .eq. '*84*') THEN -C READ(CARD,155) ISN,GH -C 155 FORMAT(BZ,10X,I4,T70,F6.2) -C HT(ISN) = HT(ISN) + GH - ELSEIF(TYPE .eq. '*86*') THEN - IF(CARD(46:52) .ne. ' ') THEN - READ(CARD,156,err=202,iostat=ios) ISN, EHT - if (ios /= 0) goto 202 - 156 FORMAT(BZ,10X,I4,T46,F7.3) - HT(ISN) = EHT - ELSE - READ(CARD,157,err=202,iostat=ios) ISN, OHT, GHT - if (ios /= 0) goto 202 - 157 FORMAT(BZ,10X,I4,T17,F7.3,T36,F7.3) - HT(ISN) = OHT + GHT - ENDIF - ENDIF - GO TO 125 - 160 REWIND I1 - RETURN - - 200 write (*,'(/)') - write (*,*) "Failed 1st reading in GETPO4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 201 write (*,'(/)') - write (*,*) "Failed reading *80* record in GETPO4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 202 write (*,'(/)') - write (*,*) "Failed reading *86* record in GETPO4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -****************************************************************** - SUBROUTINE GETPO5(IOPT, DATE) - -*** Retrieve geodetic position from blue book with 5-digit SSN - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (nbbdim = 10000) - CHARACTER JN*1,JW*1 - CHARACTER TYPE*3 - CHARACTER CARD*80 - CHARACTER PIDs*6 - - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /ARRAYS/ HT(nbbdim),LOC(nbbdim),PIDs(nbbdim) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - DO 100 I = 1, 10000 - LOC(I) = 0 - HT(I) = 0.D0 - 100 CONTINUE - - JREC = 0 - - 125 READ(I1,130,END=160,err=200,iostat=ios) CARD - if (ios /= 0) goto 200 - 130 FORMAT(A80) - TYPE = CARD(7:9) - IF(TYPE .EQ. '*80') THEN - JREC = JREC + 1 - READ(CARD,140,err=201,iostat=ios) ISN,LATD,LATM,SLAT,JN,LOND, - & LONM,SLON,JW,OH - if (ios /= 0) goto 200 - 140 FORMAT(BZ, 9X,I5,T45,2I2,F7.5,A1,I3,I2,F7.5,A1,F6.2) - LOC(ISN) = JREC -C HT(ISN) = HT(ISN) + OH - IF ( HT(ISN) .EQ. 0.D0 ) HT(ISN) = OH - YLAT = (DBLE((LATD*60+LATM)*60)+SLAT)/RHOSEC - YLON = (DBLE((LOND*60+LONM)*60)+SLON)/RHOSEC - IF(JN .EQ. 'S') YLAT = -YLAT - IF(JW .EQ. 'E') YLON = -YLON - call PREDV( ylat, ylon, ht(isn), date, iopt, - 1 idg, vn, ve, vu) - IF(IDG .eq. 0) THEN - WRITE(LUOUT,150) CARD - 150 FORMAT(' **WARNING** The following point is outside of ', - 1 'the modeled region.'/ - 2 ' It will be assumed that this point has not moved.'/A80/) - ENDIF - WRITE(I4, REC = JREC) YLAT, YLON, VN, VE, VU -C ELSEIF(TYPE .eq. '*84') THEN -C READ(CARD,155) ISN,GH -C 155 FORMAT(BZ, 9X,I5,T70,F6.2) -C HT(ISN) = HT(ISN) + GH - ELSEIF(TYPE .eq. '*86') THEN - IF(CARD(46:52) .ne. ' ') THEN - READ(CARD,156,err=202,iostat=ios) ISN, EHT - if (ios /= 0) goto 202 - 156 FORMAT(BZ, 9X,I5,T46,F7.3) - HT(ISN) = EHT - ELSE - READ(CARD,157,err=202,iostat=ios) ISN, OHT, GHT - if (ios /= 0) goto 202 - 157 FORMAT(BZ, 9X,I5,T17,F7.3,T36,F7.3) - HT(ISN) = OHT + GHT - ENDIF - ENDIF - GO TO 125 - 160 REWIND I1 - RETURN - - 200 write (*,'(/)') - write (*,*) "Failed 1st reading in GETPO4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 201 write (*,'(/)') - write (*,*) "Failed reading *80* record in GETPO4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 202 write (*,'(/)') - write (*,*) "Failed reading *86* record in GETPO4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -****************************************************************** - SUBROUTINE UPBB4(MIN1,MIN2,OPT,IOPT) - -*** Update blue book - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - - parameter (nbbdim = 10000) - - CHARACTER CARD*80 - CHARACTER DATE*6 - CHARACTER TYPE*4 - CHARACTER OPT*1,JN*1,JW*1 - CHARACTER LATDIR*1, LONDIR*1 - CHARACTER PIDs*6 - LOGICAL TEST, TEST1 - COMMON /ARRAYS/ HT(nbbdim),LOC(nbbdim) ,PIDs(nbbdim) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - -C*** To update classical observations an *12* record -C*** is needed to identify the correct century, as -C*** classical observation records contain only a 2-digit year - IREC12 = 0 - - 170 READ(I1,175,END=600,err=700,iostat=ios) CARD - if (ios /= 0) goto 700 - 175 FORMAT(A80) - TYPE = CARD(7:10) - IF(TYPE .EQ. '*A1*' .OR. - 1 TYPE .EQ. '*AA*' .OR. - 1 TYPE .EQ. '*10*' .OR. - 1 TYPE .EQ. '*11*' .OR. - 1 TYPE .EQ. '*13*' .OR. - 1 TYPE .EQ. '*21*' .OR. - 1 TYPE .EQ. '*25*' .OR. - 1 TYPE .EQ. '*26*' .OR. - 1 TYPE .EQ. '*27*' .OR. - 1 TYPE .EQ. '*28*' .OR. - 1 TYPE .EQ. '*29*' ) THEN - CONTINUE - ELSEIF(TYPE .EQ. '*31*' .OR. - 1 TYPE .EQ. '*40*' .OR. - 1 TYPE .EQ. '*41*' .OR. - 1 TYPE .EQ. '*42*' .OR. - 1 TYPE .EQ. '*45*' .OR. - 1 TYPE .EQ. '*46*' .OR. - 1 TYPE .EQ. '*47*' .OR. - 1 TYPE .EQ. '*70*' .OR. - 1 TYPE .EQ. '*81*' .OR. - 1 TYPE .EQ. '*82*' .OR. - 1 TYPE .EQ. '*83*' .OR. - 1 TYPE .EQ. '*84*' .OR. - 1 TYPE .EQ. '*85*' .OR. - 1 TYPE .EQ. '*86*' .OR. - 1 TYPE .EQ. '*90*') THEN - CONTINUE - - ELSEIF (TYPE .EQ. '*12*') THEN - IF( CARD(11:14) .EQ. ' ' .OR. - 1 CARD(17:20) .EQ. ' ') THEN - WRITE ( LUOUT, 176 ) - 176 FORMAT( ' ERROR: The *12* record does not contain'/ - 1 ' appropriate dates.') - ELSE - READ ( CARD, 177,err=701,iostat=ios) IYEAR1, IYEAR2 - if (ios /= 0) goto 701 - 177 FORMAT ( 10X, I4, 2X, I4) - IF ( (IYEAR2 - IYEAR1) .LT. 0 .OR. - 1 (IYEAR2 - IYEAR1) .GT. 99 ) THEN - WRITE (LUOUT, 178) - 178 FORMAT(' ERROR: The dates in the *12* record are in'/ - 1 ' error. Either they span more than 99 years or '/ - 1 ' the end date preceedes the start date.'/ - 1 ' If they span more than 99 years, then the Bluebook'/ - 1 ' will need to divided into two or more bluebooks'/ - 1 ' with the observations in each spanning no more'/ - 1 ' than 99 years.') - ELSE - IREC12 = 1 - ENDIF - ENDIF - -*** Regular distance - - ELSEIF(TYPE .EQ. '*50*' .OR. - 1 TYPE .EQ. '*51*' .OR. - 1 TYPE .EQ. '*52*') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4')THEN - READ(CARD,180,err=702,iostat=ios) ISN,DATE,JSN,OBS - if (ios /= 0) goto 702 - 180 FORMAT(BZ,10X,I4,T35,A6,T46,I4,T64,F9.4) - CALL CHECK(ISN,JSN,CARD,TEST) - IF(TEST) THEN - CALL TRFDAT(CARD,DATE,IREC12,IYEAR1,IYEAR2,MINO) - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - IOBS = IDNINT((OBS+DS)*10000.D0) - WRITE(CARD(64:72),190) IOBS - 190 FORMAT(I9) - ENDIF - ENDIF - -*** Azimuth - - ELSEIF(TYPE .EQ. '*60*' .OR. TYPE .EQ. '*61*') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - READ(CARD,200,err=703,iostat=ios)ISN,DATE,JSN,IDEG,MIN,SEC - if (ios /= 0) goto 703 - 200 FORMAT(BZ,10X,I4,T40,A6,T51,I4,T64,I3,I2,F3.1) - CALL CHECK(ISN,JSN,CARD,TEST) - IF(TEST) THEN - CALL TRFDAT(CARD,DATE,IREC12, IYEAR1, IYEAR2, MINO) - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - OBS = (DBLE((IDEG*60+MIN)*60)+SEC)/RHOSEC - OBS = OBS + DA - IF(OBS .GE. TWOPI) THEN - OBS = OBS - TWOPI - ELSEIF(OBS .LT. 0.D0) THEN - OBS = OBS + TWOPI - ENDIF - CALL TODMSS(OBS,IDEG,MIN,SEC,ISIGN) - ISEC = IDNINT(SEC*10.D0) - WRITE(CARD(64:71),210) IDEG,MIN,ISEC - 210 FORMAT(I3,I2.2,I3.3) - ENDIF - ENDIF - -*** Direction observation - - ELSEIF(TYPE .EQ. '*20*') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - READ(CARD,220,err=704,iostat=ios) ISN0,LIST0,DATE,JSN - if (ios /= 0) goto 704 - 220 FORMAT(BZ,10X,I4,I2,T40,A6,T51,I4) - CALL CHECK(ISN0,JSN,CARD,TEST) - CALL TRFDAT(CARD,DATE,IREC12, IYEAR1, IYEAR2, MINO) - IF(TEST) THEN - CALL DSDA(LOC(ISN0),LOC(JSN),MINO,MIN2,DS,DA0) - ELSE - DA0 = 0.D0 - ENDIF - ENDIF - ELSEIF(TYPE .EQ. '*22*') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - READ(CARD,230,err=705,iostat=ios) ISN,LIST,JSN,IDEG,MIN,SEC - if (ios /= 0) goto 705 - 230 FORMAT(BZ,10X,I4,I2,T51,I4,T64,I3,I2,F4.2) - IF(LIST.NE.LIST0 .OR. ISN.NE.ISN0) THEN - WRITE(LUOUT,240) CARD - 240 FORMAT(' Blue-book file has incorrect structure.'/ - 1 ' A *22* record disagrees with its corresponding'/ - 2 ' *20* record. The record reads:'/A80) - STOP - ENDIF - CALL CHECK(ISN,JSN,CARD,TEST) - IF(TEST) THEN - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - OBS=(DBLE((IDEG*60+MIN)*60)+SEC)/RHOSEC - OBS = OBS + DA - DA0 - IF(OBS .GT. TWOPI) THEN - OBS = OBS - TWOPI - ELSEIF(OBS .LT. 0.D0) THEN - OBS = OBS + TWOPI - ENDIF - CALL TODMSS(OBS,IDEG,MIN,SEC,ISIGN) - ISEC = IDNINT(SEC*100.D0) - WRITE(CARD(64:72),250) IDEG,MIN,ISEC - 250 FORMAT(I3.3,I2.2,I4.4) - ENDIF - ENDIF - -*** Long distance - - ELSEIF(TYPE .EQ. '*53*' .OR. - 1 TYPE .EQ. '*54*') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - READ(CARD,260,err=706,iostat=ios) ISN,DATE,JSN,OBS - if (ios /= 0) goto 706 - 260 FORMAT(BZ,10X,I4,T35,A6,T46,I4,T64,F10.3) - CALL CHECK(ISN,JSN,CARD,TEST) - IF(TEST) THEN - CALL TRFDAT(CARD,DATE,IREC12, IYEAR1, IYEAR2, MINO) - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - IOBS = IDNINT((OBS + DS)*1000.D0) - WRITE(CARD(64:73),270) IOBS - 270 FORMAT(I10) - ENDIF - ENDIF - -*** Horizontal angle - - ELSEIF(TYPE .EQ. '*30*' .OR. - 1 TYPE .EQ. '*32*') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - READ(CARD,280,err=707,iostat=ios) ISN,JSN,IDEG,MIN,SEC,KSN - if (ios /= 0) goto 707 - 280 FORMAT(BZ,10X,I4,T51,I4,T64,I3,I2,F3.1,I4) - IF(TYPE.EQ.'*30*') THEN - DATE = CARD(40:45) - CALL TRFDAT(CARD,DATE,IREC12, IYEAR1, IYEAR2, MINO) - ENDIF - CALL CHECK(ISN,JSN,CARD,TEST) - CALL CHECK(ISN,KSN,CARD,TEST1) - IF(TEST .and. TEST1) THEN - CALL DSDA(LOC(ISN), LOC(JSN), - 1 MINO, MIN2, DS, DA0) - CALL DSDA(LOC(ISN), LOC(KSN), - 1 MINO, MIN2, DS, DA) - OBS=(DBLE((IDEG*60+MIN)*60)+SEC)/RHOSEC - OBS = OBS + DA - DA0 - IF(OBS .GE. TWOPI) THEN - OBS = OBS - TWOPI - ELSEIF(OBS .LT. 0.D0) THEN - OBS = OBS + TWOPI - ENDIF - CALL TODMSS(OBS,IDEG,MIN,SEC,ISIGN) - ISEC = IDNINT(SEC*10.D0) - WRITE(CARD(64:71),290)IDEG,MIN,SEC - 290 FORMAT(I3.3,I2.2,I3.3) - ENDIF - ENDIF - -*** position record - - ELSEIF(TYPE .EQ. '*80*') THEN - IF(OPT .eq. '2' .or. OPT .eq. '4') THEN - READ(CARD,300,err=708,iostat=ios) ISN,LATD,LATM, - & SLAT,JN,LOND,LONM,SLON,JW - if (ios /= 0) goto 708 - 300 FORMAT(BZ,10X,I4,T45,2I2,F7.5,A1,I3,I2,F7.5,A1) - YLAT = (DBLE((LATD*60+LATM)*60)+SLAT)/RHOSEC - YLON = (DBLE((LOND*60+LONM)*60)+SLON)/RHOSEC - IF(JN .EQ. 'S') YLAT = -YLAT - IF(JW .EQ. 'E') YLON = -YLON -C READ(I4, REC = LOC(ISN)) RLAT, RLON, IDG - READ(I4, REC = LOC(ISN),err=709,iostat=ios) RLAT, - & RLON, VN, VE, VU - if (ios /= 0) goto 709 - call NEWCOR( ylat, ylon, ht(isn), min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) -C CALL NWCORD(YLAT,YLON,HT(ISN), -C 1 RLAT,RLON,IDG,MIN1,MIN2, -C 1 YLATT,YLONT,EHTNEW,DN,DE,DU,IOPT) - CALL TODMSS(YLATT,LATDN,LATMN,SLATN,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - CALL TODMSS(YLONT,LONDN,LONMN,SLONN,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - LATS = IDNINT(SLATN*100000.D0) - LONS = IDNINT(SLONN*100000.D0) - WRITE(CARD(45:56),310) LATDN,LATMN,LATS,LATDIR - 310 FORMAT(I2,I2.2,I7.7,A1) - WRITE(CARD(57:69),320) LONDN,LONMN,LONS,LONDIR - 320 FORMAT(I3,I2.2,I7.7,A1) - ENDIF - -*** Unrecognized blue book record - - ELSE -c WRITE(LUOUT,500) TYPE - 500 FORMAT(' This software does not recognize an ',A4,/ - 1 ' record. The record will be copied to the new'/ - 2 ' file without change.') - ENDIF - WRITE(I2,175) CARD - GO TO 170 - 600 CONTINUE - RETURN - - 700 write (*,'(/)') - write (*,*) "Failed to read card in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 701 write (*,'(/)') - write (*,*) "Failed to read card *12* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 702 write (*,'(/)') - write (*,*) "Failed to read *50,51,52* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 703 write (*,'(/)') - write (*,*) "Failed to read *60,61* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 704 write (*,'(/)') - write (*,*) "Failed to read *20* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 705 write (*,'(/)') - write (*,*) "Failed to read *22* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 706 write (*,'(/)') - write (*,*) "Failed to read *53,54* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 707 write (*,'(/)') - write (*,*) "Failed to read *30,32* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 708 write (*,'(/)') - write (*,*) "Failed to read *80* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 709 write (*,'(/)') - write (*,*) "Failed to read I4 of *80* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -*************************************************************** - SUBROUTINE UPBB5(MIN1,MIN2,OPT,IOPT) - -*** Update 5-digit blue book - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (nbbdim = 10000) - CHARACTER CARD*212 - CHARACTER SUBCRD*80 -C CHARACTER DATE*6 - CHARACTER DATE8*8 - CHARACTER TYPE*3 - CHARACTER OPT*1,SIGN*1,JN*1,JW*1 - CHARACTER LATDIR*1,LONDIR*1 - CHARACTER PIDs*6 - LOGICAL TEST - COMMON /ARRAYS/ HT(nbbdim),LOC(nbbdim) ,PIDs(nbbdim) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - - 170 READ(I1,175,END=600,err=700,iostat=ios) CARD - if (ios /= 0) goto 700 - 175 FORMAT(A212) - SUBCRD = CARD(1:80) - TYPE = CARD(7:9) - IF(TYPE .EQ. '*A1' .OR. - 1 TYPE .EQ. '*AA' .OR. - 1 TYPE .EQ. '*10' .OR. - 1 TYPE .EQ. '*11' .OR. - 1 TYPE .EQ. '*12' .OR. - 1 TYPE .EQ. '*13' .OR. - 1 TYPE .EQ. '*21' .OR. - 1 TYPE .EQ. '*25' .OR. - 1 TYPE .EQ. '*26' .OR. - 1 TYPE .EQ. '*27' .OR. - 1 TYPE .EQ. '*28' .OR. - 1 TYPE .EQ. '*29' ) THEN - CONTINUE - ELSEIF(TYPE .EQ. '*31' .OR. - 1 TYPE .EQ. '*40' .OR. - 1 TYPE .EQ. '*41' .OR. - 1 TYPE .EQ. '*42' .OR. - 1 TYPE .EQ. '*45' .OR. - 1 TYPE .EQ. '*46' .OR. - 1 TYPE .EQ. '*47' .OR. - 1 TYPE .EQ. '*70' .OR. - 1 TYPE .EQ. '*81' .OR. - 1 TYPE .EQ. '*82' .OR. - 1 TYPE .EQ. '*83' .OR. - 1 TYPE .EQ. '*84' .OR. - 1 TYPE .EQ. '*85' .OR. - 1 TYPE .EQ. '*86' .OR. - 1 TYPE .EQ. '*90') THEN - CONTINUE - -*** Regular distance - - ELSEIF(TYPE .EQ. '*50' .OR. - 1 TYPE .EQ. '*51' .OR. - 1 TYPE .EQ. '*52') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4')THEN -C READ(CARD,180) ISN,DATE,JSN,OBS -C 180 FORMAT(BZ, 9X,I5,T35,A6,T46,I5,T64,F9.4) - READ(CARD,180,err=702,iostat=ios) ISN,JSN,OBS,DATE8 - if (ios /= 0) goto 702 - 180 FORMAT(BZ, 9X,I5,T46,I5,T64,F9.4,T101,A8) - CALL CHECK(ISN,JSN,SUBCRD,TEST) - IF(TEST) THEN - CALL TNFDAT(DATE8,MINO) - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - IOBS = IDNINT((OBS+DS)*10000.D0) - WRITE(CARD(64:72),190) IOBS - 190 FORMAT(I9) - WRITE(CARD(174:181),191) DS - 191 FORMAT(F8.4) - ENDIF - ENDIF - -*** Azimuth - - ELSEIF(TYPE .EQ. '*60' .OR. TYPE .EQ. '*61') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN -C READ(CARD,200) ISN,DATE,JSN,IDEG,MIN,SEC -C 200 FORMAT(BZ, 9X,I5,T40,A6,T51,I5,T64,I3,I2,F3.1) - READ(CARD,200,err=703,iostat=ios) ISN,JSN,IDEG,MIN, - & SEC,DATE8 - if (ios /= 0) goto 703 - 200 FORMAT(BZ, 9X,I5,T51,I5,T64,I3,I2,F3.1,T101,A8) - CALL CHECK(ISN,JSN,SUBCRD,TEST) - IF(TEST) THEN - CALL TNFDAT(DATE8,MINO) - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - OBS = (DBLE((IDEG*60+MIN)*60)+SEC)/RHOSEC - OBS = OBS + DA - IF(OBS .GE. TWOPI) THEN - OBS = OBS - TWOPI - ELSEIF(OBS .LT. 0.D0) THEN - OBS = OBS + TWOPI - ENDIF - CALL TODMSS(OBS,IDEG,MIN,SEC,ISIGN) - ISEC = IDNINT(SEC*10.D0) - WRITE(CARD(64:71),210) IDEG,MIN,ISEC - 210 FORMAT(I3,I2.2,I3.3) - IF(DA .GE. 0.0D0) THEN - SIGN = ' ' - ELSE - SIGN = '-' - ENDIF - ANGLE = DABS(DA) - CALL TODMSS(ANGLE,IDEG,MIN,SEC,ISIGN) - ISEC1 = SEC - ISEC2 = IDNINT((SEC - DBLE(ISEC1)) * 100.D0) - WRITE(CARD(152:162),211)SIGN,IDEG,MIN,ISEC1,ISEC2 - 211 FORMAT(A1,I3.3,I2.2,I2.2,'.',I2.2) - ENDIF - ENDIF - -*** Direction observation - - ELSEIF(TYPE .EQ. '*20') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN -C READ(CARD,220) ISN0,LIST0,DATE,JSN -C 220 FORMAT(BZ, 9X,I5,I2,T40,A6,T51,I5) - READ(CARD,220,err=704,iostat=ios) ISN0,LIST0,JSN,DATE8 - if (ios /= 0) goto 704 - 220 FORMAT(BZ, 9X,I5,I2,T51,I5,T101,A8) - CALL CHECK(ISN0,JSN,SUBCRD,TEST) - CALL TNFDAT(DATE8,MINO) - IF(TEST) THEN - CALL DSDA(LOC(ISN0),LOC(JSN),MINO,MIN2,DS,DA0) - ELSE - DA0 = 0.D0 - ENDIF - CARD(132:142) = ' 0000000.00' - ENDIF - ELSEIF(TYPE .EQ. '*22') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN - READ(CARD,230,err=705,iostat=ios) ISN,LIST,JSN,IDEG, - & MIN,SEC - if (ios /= 0) goto 705 - 230 FORMAT(BZ, 9X,I5,I2,T51,I5,T64,I3,I2,F4.2) - IF(LIST.NE.LIST0 .OR. ISN.NE.ISN0) THEN - WRITE(LUOUT,240) CARD - 240 FORMAT(' Blue-book file has incorrect structure.'/ - 1 ' A *22* record disagrees with its corresponding'/ - 2 ' *20* record. The record reads:'/A212) - STOP - ENDIF - CALL CHECK(ISN,JSN,SUBCRD,TEST) - IF(TEST) THEN - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - ELSE - DA = 0.D0 - ENDIF - OBS=(DBLE((IDEG*60+MIN)*60)+SEC)/RHOSEC - OBS = OBS + DA - DA0 - IF(OBS .GT. TWOPI) THEN - OBS = OBS - TWOPI - ELSEIF(OBS .LT. 0.D0) THEN - OBS = OBS + TWOPI - ENDIF - CALL TODMSS(OBS,IDEG,MIN,SEC,ISIGN) - ISEC = IDNINT(SEC*100.D0) - WRITE(CARD(64:72),250) IDEG,MIN,ISEC - 250 FORMAT(I3.3,I2.2,I4.4) - IF((DA-DA0) .GE. 0.D0) THEN - SIGN = ' ' - ELSE - SIGN = '-' - ENDIF - ANGLE = DABS(DA - DA0) - CALL TODMSS(ANGLE,IDEG,MIN,SEC,ISIGN) - ISEC1 = SEC - ISEC2 = IDNINT((SEC-DBLE(ISEC1))*100.D0) - WRITE(CARD(132:142),251) SIGN,IDEG,MIN,ISEC1,ISEC2 - 251 FORMAT(A1,I3.3,I2.2,I2.2,'.',I2.2) - ENDIF - -*** Long distance - - ELSEIF(TYPE .EQ. '*53' .OR. - 1 TYPE .EQ. '*54') THEN - IF(OPT .eq. '3' .or. OPT .eq. '4') THEN -C READ(CARD,260) ISN,DATE,JSN,OBS -C 260 FORMAT(BZ, 9X,I5,T35,A6,T46,I5,T64,F10.3) - READ(CARD,260,err=706,iostat=ios) ISN,JSN,OBS,DATE8 - if (ios /= 0) goto 706 - 260 FORMAT(BZ, 9X,I5,T46,I5,T64,F10.3,T101,A8) - CALL CHECK(ISN,JSN,SUBCRD,TEST) - IF(TEST) THEN - CALL TNFDAT(DATE8,MINO) - CALL DSDA(LOC(ISN),LOC(JSN),MINO,MIN2,DS,DA) - IOBS = IDNINT((OBS + DS)*1000.D0) - WRITE(CARD(64:73),270) IOBS - 270 FORMAT(I10) - CORR = IDNINT(DS*10000.D0) - WRITE(CARD(174:181),271) CORR - 271 FORMAT(F8.4) - ENDIF - ENDIF - -*** position record - - ELSEIF(TYPE .EQ. '*80') THEN - IF(OPT .eq. '2' .or. OPT .eq. '4') THEN - READ(CARD,300,err=708,iostat=ios) ISN,LATD,LATM, - & SLAT,JN,LOND,LONM,SLON,JW - if (ios /= 0) goto 708 - 300 FORMAT(BZ,9X,I5,T45,2I2,F7.5,A1,I3,I2,F7.5,A1) - YLAT = (DBLE((LATD*60+LATM)*60)+SLAT)/RHOSEC - YLON = (DBLE((LOND*60+LONM)*60)+SLON)/RHOSEC - IF(JN .EQ. 'S') YLAT = -YLAT - IF(JW .EQ. 'E') YLON = -YLON -C READ(I4, REC = LOC(ISN)) RLAT, RLON, IDG -C CALL NWCORD(YLAT,YLON,HT(ISN), -C 1 RLAT,RLON,IDG,MIN1,MIN2, -C 1 YLATT,YLONT,EHTNEW,DN,DE,DU,IOPT) - READ(I4, REC = LOC(ISN),err=709,iostat=ios) RLAT, RLON, - & VN, VE, VU - if (ios /= 0) goto 709 - call NEWCOR( ylat, ylon, ht(isn), min1, min2, - 1 ylatt, ylont, ehtnew, dn, de, du, vn, ve, vu) - CALL TODMSS(YLATT,LATDN,LATMN,SLATN,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - CALL TODMSS(YLONT,LONDN,LONMN,SLONN,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - LATS = IDNINT(SLATN*100000.D0) - LONS = IDNINT(SLONN*100000.D0) - WRITE(CARD(45:56),310) LATDN,LATMN,LATS,LATDIR - 310 FORMAT(I2,I2.2,I7.7,A1) - WRITE(CARD(57:69),320) LONDN,LONMN,LONS,LONDIR - 320 FORMAT(I3,I2.2,I7.7,A1) - ENDIF - -*** Unrecognized blue book record - - ELSE - WRITE(LUOUT,500) TYPE - 500 FORMAT(' This software does not recognize an ',A3,/ - 1 ' record. The record will be copied to the new'/ - 2 ' file without change.') - ENDIF - WRITE(I2,175) CARD - GO TO 170 - 600 CONTINUE - RETURN - - 700 write (*,'(/)') - write (*,*) "Failed to read card in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 701 write (*,'(/)') - write (*,*) "Failed to read card *12* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 702 write (*,'(/)') - write (*,*) "Failed to read *50,51,52* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 703 write (*,'(/)') - write (*,*) "Failed to read *60,61* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 704 write (*,'(/)') - write (*,*) "Failed to read *20* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 705 write (*,'(/)') - write (*,*) "Failed to read *22* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 706 write (*,'(/)') - write (*,*) "Failed to read *53,54* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 707 write (*,'(/)') - write (*,*) "Failed to read *30,32* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 708 write (*,'(/)') - write (*,*) "Failed to read *80* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 709 write (*,'(/)') - write (*,*) "Failed to read I4 of *80* in UPBB4:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -*************************************************************** - SUBROUTINE CHECK(ISN,JSN,CARD,TEST) - -*** Check if stations have *80* records - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (nbbdim = 10000) - CHARACTER CARD*80 - CHARACTER PIDs*6 - LOGICAL TEST - COMMON /ARRAYS/ HT(nbbdim),LOC(nbbdim),PIDs(nbbdim) - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - TEST = .TRUE. - - IF(LOC(ISN) .eq. 0) THEN - WRITE(LUOUT,100) ISN, CARD - 100 FORMAT(' No *80* record for SSN = ',I4/A80/) - TEST = .FALSE. - ENDIF - - IF(LOC(JSN) .eq. 0) THEN - WRITE(LUOUT,100) JSN, CARD - TEST = .FALSE. - ENDIF - - RETURN - END -C************************************************* - SUBROUTINE UPGFI4(DATE2, MIN2, IOPT, KOPT, - * MONTH, IDAY, IYEAR) - -*** Update G-FILE of blue book - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) -c CHARACTER*80 CARD - CHARACTER CARD*120 - CHARACTER TYPE*1 - CHARACTER NRF*2 - CHARACTER ZT*2 - CHARACTER CHAR14*14 - LOGICAL TEST - LOGICAL Is_inp_NAD83,Is_out_NAD83,Is_out1_NAD83 - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - ZT = 'ZT' - -*** Obtain blue-book reference frame identifier -*** corresponding to KOPT (output frame for vectors) - IF (KOPT .NE. -1) THEN - CALL RFCON1(KOPT, NBBREF) - WRITE(NRF,10) NBBREF - 10 FORMAT(I2.2) - ENDIF - - 90 READ(I1,100,END=200,err=300,iostat=ios) CARD - if (ios /= 0) goto 300 -c 100 FORMAT(A80) - 100 FORMAT(A120) - TYPE = CARD(1:1) - IF(TYPE .eq. 'A') THEN - IF (CARD(79:80) .EQ. ZT) THEN - WRITE(LUOUT, 103) - 103 FORMAT( - 1 ' *****************************************************'/ - 1 ' * ERROR: The input GFILE contains the letters, ZT, *'/ - 1 ' * in columns 79-80 of its A-record. This indicates *'/ - 1 ' * that the GPS vectors in this file have already *'/ - 1 ' * been updated to a common date. This software *'/ - 1 ' * will not further modify the GPS vectors. *'/ - 1 ' *****************************************************'/) - RETURN - ENDIF - WRITE(CARD(79:80),101) ZT - 101 FORMAT(A2) - WRITE(CARD(4:11), 102) IYEAR, MONTH, IDAY - 102 FORMAT(I4, I2.2, I2.2) - WRITE(CARD(12:19), 102) IYEAR, MONTH, IDAY - - ELSEIF(TYPE .eq. 'B') THEN - READ(CARD,110,err=301,iostat=ios)IYEAR1,MONTH1,IDAY1, - 1 IYEAR2,MONTH2,IDAY2,IBBREF - if (ios /= 0) goto 301 - 110 FORMAT(1X,I4,I2,I2,4X,I4,I2,I2,30X,I2) -C CALL TOTIME(IYEAR1,MONTH1,IDAY1,MINO1) -C CALL TOTIME(IYEAR1, 1, 1, MIN00) -C DECYR1 = DBLE(IYEAR1) + DBLE(MINO1 - MIN00)/525600.D0 -C CALL TOTIME(IYEAR2,MONTH2,IDAY2,MINO2) -C CALL TOTIME(IYEAR2, 1, 1, MIN00) -C DECYR2 = DBLE(IYEAR2) + DBLE(MINO2 - MIN00)/525600.D0 - - CALL IYMDMJ(IYEAR1,MONTH1,IDAY1,MJD1) - MINO1 = MJD1 * 24 * 60 - CALL IYMDMJ(IYEAR1, 1, 1, MJD0) - DECYR1 = DBLE(IYEAR1) + DBLE(MJD1 - MJD0)/365.D0 - CALL IYMDMJ(IYEAR2,MONTH2,IDAY2, MJD2) - MINO2 = MJD2 * 24 * 60 - CALL IYMDMJ(IYEAR2, 1, 1, MJD0) - DECYR2 = DBLE(IYEAR2) + DBLE(MJD2 - MJD0)/365.D0 - MINO = (MINO1 + MINO2) / 2 - DECYR = (DECYR1 + DECYR2) / 2.D0 - CALL RFCON(IBBREF, JREF) !JREF is the current frame or frame of input - IF (KOPT .NE. -1) THEN - CARD(52:53) = NRF - ENDIF - Is_inp_NAD83 = (JREF == 1) - Is_out_NAD83 = (IOPT == 1) !IOPT is the frame of the positions - Is_out1_NAD83 = (KOPT == 1) !IOPT is the frame of the positions - ELSEIF(TYPE .eq. 'C') THEN - READ(CARD,120,err=302,iostat=ios)ISN,JSN,DX,DY,DZ - if (ios /= 0) goto 302 - 120 FORMAT(BZ,1X,2I4,F11.4,5X,F11.4,5X,F11.4) - - CALL CHECK(ISN, JSN, CARD, TEST) - IF (TEST) THEN - CALL DDXYZ(ISN, JSN, - 1 MINO, MIN2, DDX, DDY, DDZ) -*** Convert vector from JREF to IOPT frame - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TRAVEC (DX, DY, DZ, DECYR, JREF, IOPT) - else - call TRAVEC_IERS (DX, DY, DZ, DECYR, JREF, IOPT) - endif - DX = DX + DDX - DY = DY + DDY - DZ = DZ + DDZ - -*** Convert GPS vector from IOPT to KOPT reference frame - IF (KOPT .NE. -1) THEN - if (Is_out_NAD83 .or. Is_out1_NAD83) then - CALL TRAVEC(DX, DY, DZ, DATE2, IOPT, KOPT) - else - CALL TRAVEC_IERS(DX, DY, DZ, DATE2, IOPT, KOPT) - endif - ELSE - if (Is_inp_NAD83 .or. Is_out_NAD83) then - CALL TRAVEC(DX, DY, DZ, DATE2, IOPT, JREF) - else - CALL TRAVEC_IERS(DX, DY, DZ, DATE2, IOPT, JREF) - endif - ENDIF - -*** Rewrite GPS observational record - CALL TOCHAR(DX,CHAR14) - CARD(10:20) = CHAR14(3:13) - - CALL TOCHAR(DY,CHAR14) - CARD(26:36) = CHAR14(3:13) - - CALL TOCHAR(DZ,CHAR14) - CARD(42:52) = CHAR14(3:13) - ENDIF - - ELSEIF(TYPE .eq. 'F') THEN - READ(CARD,140,err=303,iostat=ios)ISN,JSN,DX,DY,DZ - if (ios /= 0) goto 303 - 140 FORMAT(BZ,1X,2I4,F13.4,5X,F13.4,5X,F13.4) - - CALL CHECK(ISN, JSN, CARD, TEST) - IF (TEST) THEN - CALL DDXYZ(ISN, JSN, - 1 MINO, MIN2, DDX, DDY, DDZ) - - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call TRAVEC( DX, DY, DZ, DECYR, JREF, IOPT) - else - call TRAVEC_IERS( DX, DY, DZ, DECYR, JREF, IOPT) - endif - - DX = DX + DDX - DY = DY + DDY - DZ = DZ + DDZ - -*** Convert GPS vector to output reference frame - IF (KOPT .NE. -1) THEN - if (Is_out_NAD83 .or. Is_out1_NAD83) then - CALL TRAVEC(DX, DY, DZ, DATE2, IOPT, KOPT) - else - CALL TRAVEC_IERS (DX, DY, DZ, DATE2, IOPT, KOPT) - endif - ELSE - if (Is_out_NAD83 .or. Is_out1_NAD83) then - CALL TRAVEC(DX, DY, DZ, DATE2, IOPT, JREF) - else - CALL TRAVEC_IERS (DX, DY, DZ, DATE2, IOPT, JREF) - endif - ENDIF - -*** Rewrite GPS observational record - CALL TOCHAR(DX,CHAR14) - CARD(10:22) = CHAR14(1:13) - - CALL TOCHAR(DY,CHAR14) - CARD(28:40) = CHAR14(1:13) - - CALL TOCHAR(DZ,CHAR14) - CARD(46:58) = CHAR14(1:13) - ENDIF - ENDIF - WRITE(I2,100) CARD - GO TO 90 - 200 CONTINUE - RETURN - - 300 write (*,'(/)') - write (*,*) "Failed to read gfile in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 301 write (*,'(/)') - write (*,*) "Failed to read B card in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 302 write (*,'(/)') - write (*,*) "Failed to read C card in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 303 write (*,'(/)') - write (*,*) "Failed to read F card in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -********************************************************* - SUBROUTINE UPGFI5(DATE2, MIN2, IOPT, KOPT, - * MONTH, IDAY, IYEAR) - -*** Update G-FILE of 5-digit blue book - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - CHARACTER CARD*180 - CHARACTER SUBCRD*80 - CHARACTER TYPE*1 - CHARACTER NRF*2 - CHARACTER ZT*2 - CHARACTER CHAR14*14 - LOGICAL TEST - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - ZT = 'ZT' - -*** Obtain blue-book reference frame identifier -*** corresponding to IOPT - IF (KOPT .NE. -1) THEN - CALL RFCON1(KOPT, NBBREF) - WRITE(NRF, 10) NBBREF - 10 FORMAT(I2.2) - ENDIF - - 90 READ(I1,100,END=200,err=300,iostat=ios) CARD - if (ios /= 0) goto 300 - 100 FORMAT(A180) - TYPE = CARD(1:1) - - IF (TYPE .eq. 'A') THEN - IF (CARD(79:80) .EQ. ZT) THEN - WRITE(LUOUT, 103) - 103 FORMAT( - 1 ' *****************************************************'/ - 1 ' * ERROR: The input GFILE contains the letters, ZT, *'/ - 1 ' * in columns 79-80 of its A-record. This indicates *'/ - 1 ' * that the GPS vectors in this file have already *'/ - 1 ' * been updated to a common date. This software *'/ - 1 ' * will not further modify the GPS vectors. *'/ - 1 ' *****************************************************'/) - RETURN - ENDIF - WRITE(CARD(79:80), 101) ZT - 101 FORMAT(A2) - WRITE(CARD(4:11), 102) IYEAR, MONTH, IDAY - 102 FORMAT(I4, I2.2, I2.2) - WRITE(CARD(12:19), 102) IYEAR, MONTH, IDAY - - ELSEIF(TYPE .eq. 'B') THEN - READ(CARD,110,err=301,iostat=ios)IYEAR1,MONTH1,IDAY1, - 1 IYEAR2,MONTH2,IDAY2,IBBREF - if (ios /= 0) goto 301 - 110 FORMAT(1X,I4,I2,I2,4X,I4,I2,I2,30X,I2) -C CALL TOTIME(IYEAR1,MONTH1,IDAY1,MINO1) -C CALL TOTIME(IYEAR1, 1, 1, MIN00) -C DECYR1 = DBLE(IYEAR1) + DBLE(MINO1 - MIN00)/525600.D0 -C CALL TOTIME(IYEAR2,MONTH2,IDAY2,MINO2) -C CALL TOTIME(IYEAR2, 1, 1, MIN00) - CALL IYMDMJ(IYEAR1,MONTH1,IDAY1,MJD1) - MINO1 = MJD1 * 24 * 60 - CALL IYMDMJ(IYEAR1, 1, 1, MJD0) - DECYR1 = DBLE(IYEAR1) + DBLE(MJD1 - MJD0)/365.D0 - CALL IYMDMJ(IYEAR2, MONTH2,IDAY2, MJD2) - MINO2 = MJD2 * 24 * 60 - CALL IYMDMJ(IYEAR2, 1, 1, MJD0) - DECYR2 = DBLE(IYEAR2) + DBLE(MJD2 - MJD0)/365.D0 -C DECYR2 = DBLE(IYEAR2) + DBLE(MINO2 - MIN00)/525600.D0 - MINO = (MINO1 + MINO2) / 2 - DECYR = (DECYR1 + DECYR2) / 2.D0 - CALL RFCON(IBBREF, JREF) - IF (KOPT .NE. -1) THEN - CARD(52:53) = NRF - ENDIF - - ELSEIF(TYPE .eq. 'F') THEN - READ(CARD,140,err=303,iostat=ios)ISN,DX,DY,DZ,JSN - if (ios /= 0) goto 303 - 140 FORMAT(BZ,1X,I5,3X,F13.4,5X,F13.4,5X,F13.4,T81,I5) - - SUBCRD = CARD(1:80) - CALL CHECK(ISN, JSN, SUBCRD, TEST) - IF (TEST) THEN - CALL DDXYZ(ISN, JSN, - 1 MINO,MIN2,DDX, DDY, DDZ) - - call TRAVEC( DX, DY, DZ, DECYR, JREF, IOPT) - - DX = DX + DDX - DY = DY + DDY - DZ = DZ + DDZ - -*** Convert GPS vector to outout reference frame - IF (KOPT .NE. -1) THEN - CALL TRAVEC(DX, DY, DZ, DATE2, IOPT, KOPT) - ELSE - CALL TRAVEC(DX, DY, DZ, DATE2, IOPT, JREF) - ENDIF - -*** Rewrite GPS observational record - CALL TOCHAR(DX,CHAR14) - CARD(10:22) = CHAR14(1:13) - - CALL TOCHAR(DY,CHAR14) - CARD(28:40) = CHAR14(1:13) - - CALL TOCHAR(DZ,CHAR14) - CARD(46:58) = CHAR14(1:13) - - ISHIFT = IDNINT(DDX * 10000.D0) - WRITE(CARD(115:121),150) ISHIFT - 150 FORMAT(I7) - - ISHIFT = IDNINT(DDY * 10000.D0) - WRITE(CARD(125:131),150) ISHIFT - - ISHIFT = IDNINT(DDZ * 10000.D0) - WRITE(CARD(135:141),150) ISHIFT - ENDIF - - ENDIF - WRITE(I2,100) CARD - GO TO 90 - 200 CONTINUE - RETURN - - 300 write (*,'(/)') - write (*,*) "Failed to read gfile in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 301 write (*,'(/)') - write (*,*) "Failed to read B card in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 302 write (*,'(/)') - write (*,*) "Failed to read C card in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 303 write (*,'(/)') - write (*,*) "Failed to read F card in UPGFIG:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -********************************************************* - SUBROUTINE TODMSS(val,id,im,s,isign) - -*** convert position radians to deg,min,sec -*** range is [-twopi to +twopi] - - implicit double precision(a-h,o-z) - IMPLICIT INTEGER*4 (I-N) - common/CONST/A,F,E2,EP2,AF,PI,TWOPI,RHOSEC - - 1 if(val.gt.twopi) then - val=val-twopi - go to 1 - endif - - 2 if(val.lt.-twopi) then - val=val+twopi - go to 2 - endif - - if(val.lt.0.d0) then - isign=-1 - else - isign=+1 - endif - - s=dabs(val*RHOSEC/3600.D0) - id=idint(s) - s=(s-id)*60.d0 - im=idint(s) - s=(s-im)*60.d0 - -*** account for rounding error - - is=idnint(s*1.d5) - if(is.ge.6000000) then - s=0.d0 - im=im+1 - endif - if(im.ge.60) then - im=0 - id=id+1 - endif - - return - end -********************************************************* - SUBROUTINE SETRF - -*** Specify arrays that may be used to convert -*** a reference frame identifier in the blue book -*** to a reference frame identifier in HTDP and back - - IMPLICIT INTEGER*4 (I-N) - parameter ( numref = 16 ) - COMMON /REFCON/ IRFCON(36), JRFCON(numref) - -*** From blue book identifier to HTDP indentifier -*** WGS 72 Precise -c IRFCON(1) = 10 - IRFCON(1) = 1 -C HTDP no longer supports WGS 72. Hence, if a BlueBook -C file contains WGS 72 coordinates, HTDP treats these -C coordinates as if they were NAD 83(2011)coordinates. - -*** WGS 84 (orig) Precise (set equal to NAD 83) - IRFCON(2) = 1 - -*** WGS 72 Broadcast -c IRFCON(3) = 10 - IRFCON(3) = 1 -C HTDP no longer supports WGS 72. Hence, if a BlueBook -C file contains WGS 72 coordinates, HTDP treats these -C coordinates as if they were NAD 83(2011)coordinates. - -*** WGS 84 (orig) Broadcast (set equal to NAD 83) - IRFCON(4) = 1 - -*** ITRF89 - IRFCON(5) = 3 - -*** PNEOS 90 or NEOS 91.25 (set equal to ITRF90) - IRFCON(6) = 4 - -*** NEOS 90 (set equal to ITRF90) - IRFCON(7) = 4 - -*** ITRF91 - IRFCON(8) = 5 - -*** SIO/MIT 92.57 (set equal to ITRF91) - IRFCON(9) = 5 - -*** ITRF91 - IRFCON(10) = 5 - -*** ITRF92 - IRFCON(11) = 6 - -*** ITRF93 - IRFCON(12) = 7 - -*** WGS 84 (G730) Precise (set equal to ITRF91) - IRFCON(13) = 5 - -*** WGS 84 (G730) Broadcast (set equal to ITRF91) - IRFCON(14) = 5 - -*** ITRF94 - IRFCON(15) = 8 - -*** WGS 84 (G873) Precise (set equal to ITRF94) - IRFCON(16) = 8 - -*** WGS 84 (G873) Broadcast (set equal to ITRF94) - IRFCON(17) = 8 - -*** ITRF96 - IRFCON(18) = 8 - -*** ITRF97 - IRFCON(19) = 9 - -*** IGS97 - IRFCON(20) = 9 - -*** ITRF00 - IRFCON(21) = 11 - -*** IGS00 - IRFCON(22) = 11 - -*** WGS 84 (G1150) - IRFCON(23) = 11 - -*** IGb00 - IRFCON(24) = 11 - -*** ITRF2005 - IRFCON(25) = 14 - -*** IGS05 - IRFCON(26) = 14 - -*** IGS08 - IRFCON(27) = 15 - -*** IGB08 - IRFCON(28) = 15 - -*** ITRF2008 - IRFCON(29) = 15 - -*** WGS84 (G1674) - IRFCON(30) = 15 - -*** WGS84 (G1762) - IRFCON(31) = 15 - -*** ITRF2014 - IRFCON(32) = 16 - -*** IGB14 - IRFCON(33) = 16 - -*** NAD83 (2011/2007/CORS96/FBN/HARN) - IRFCON(34) = 1 - -*** NAD83 (PA11) - IRFCON(35) = 12 - -*** NAD83 (MA11) - IRFCON(36) = 13 - -*** From HTDP identifier to blue book identifier -*** NAD 83 (set equal to WGS 84 (transit)) -c JRFCON(1) = 2 - JRFCON(1) = 34 - -*** ITRF88 (set equal to ITRF89) - JRFCON(2) = 5 - -*** ITRF89 - JRFCON(3) = 5 - -*** ITRF90 (set equal to NEOS 90) - JRFCON(4) = 7 - -*** ITRF91 - JRFCON(5) = 8 - -*** ITRF92 - JRFCON(6) = 11 - -*** ITRF93 - JRFCON(7) = 12 - -*** ITRF96 (= ITRF94) - JRFCON(8) = 18 - -*** ITRF97 - JRFCON(9) = 19 - -*** WGS 72 - JRFCON(10) = 1 - -*** ITRF00 - JRFCON(11) = 21 - -*** NAD 83 (PACP00) or NAD 83 (PA11) -c JRFCON(12) = 0 -c JRFCON(12) = 2 - JRFCON(12) = 35 -C Michael Dennis requested that HTDP identify -C NAD 83 (PA11) coordinates as WGS 84(transit) -C coordinates in the Bluebook context - -*** NAD 83 (MARP00) or NAD 83 (MA11) -c JRFCON(13) = 0 -c JRFCON(13) = 2 - JRFCON(13) = 36 -C Michael Dennis requested that HTDP identify -C NAD 83 (MA11) coordinates as WGS 84(transit) -C coordinates in the Bluebook context - -*** ITRF2005 or IGS05 - JRFCON(14) = 26 - -*** ITRF2008 or IGS08 - JRFCON(15) = 27 - -*** IGB08 - JRFCON(15) = 28 - -*** ITRF2014 or IGS14 - JRFCON(16) = 33 - - RETURN - END -*************************************************** - SUBROUTINE RFCON(IBBREF, JREF) - -*** Convert reference frame identifier from -*** system used in the blue-book to the -*** system used in HTDP - - IMPLICIT INTEGER*4 (I-N) - parameter ( numref = 16 ) - COMMON /REFCON/ IRFCON(36), JRFCON(numref) - - IF (1 .LE. IBBREF .AND. IBBREF .LE. 36) THEN - JREF = IRFCON(IBBREF) - ELSE - WRITE(6, 10) IBBREF - 10 FORMAT(' Improper reference frame identifier (=', - 1 I4, ')' / - 1 ' appearing in B-record of the G-FILE') - STOP - ENDIF - - RETURN - END -******************************************************* - SUBROUTINE RFCON1(JREF, IBBREF) - -*** Convert reference frame identifier from -*** system used in HTDP to the system -*** used in the blue-book - - IMPLICIT INTEGER*4 (I-N) - parameter ( numref = 16 ) - COMMON /REFCON/ IRFCON(36), JRFCON(numref) - - IF (JREF .EQ. 0) THEN - I = 1 - ELSE - I = JREF - ENDIF - - IF(1. LE. I .AND. I .LE. numref) THEN - IBBREF = JRFCON(I) - IF ( IBBREF .eq. 0) THEN - write(6,5) JREF - 5 format(' ERROR: The BlueBook does not recognize '/ - * 'this reference frame, HTDP ID = ',I2) - stop - ENDIF - - ELSE - WRITE(6, 10) JREF - 10 FORMAT(' Improper reference frame identifier (=', - * I4, ')' / 'appearing in routine RFCON1') - STOP - ENDIF - - RETURN - END -***************************************************************** - - subroutine TRAVEC(dxi, dyi, dzi, date, jopt1, jopt2) - -*** Transform GPS or other vector from one reference frame to another -*** for the given date -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - -*** (dxi, dyi, dzi) --> (input) components of input vector in meters -*** --> (output) components of transformed vector in meters - -*** date --> (input) time (decimal years) to which the input & output -*** vectors correspond - -*** jopt1 --> (input) specifier of reference frame for input vector -*** jopt2 --> (input) specifier of reference frame for output vector - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /tranpa/ tx(numref), ty(numref), tz(numref), - & dtx(numref), dty(numref), dtz(numref), - & rx(numref), ry(numref), rz(numref), - & drx(numref), dry(numref), drz(numref), - & scale(numref), dscale(numref), refepc(numref) - -*** Transform input vector to ITRF94 reference frame - if (jopt1 .eq. 0) then - iopt = 1 - else - iopt = jopt1 - endif - - dtime = date - refepc(iopt) - rotnx = -(rx(iopt) + drx(iopt)*dtime) - rotny = -(ry(iopt) + dry(iopt)*dtime) - rotnz = -(rz(iopt) + drz(iopt)*dtime) - ds = 1.d0 - (scale(iopt) + dscale(iopt)*dtime) - - dxt = + ds*dxi + rotnz*dyi - rotny*dzi - dyt = - rotnz*dxi + ds*dyi + rotnx*dzi - dzt = + rotny*dxi - rotnx*dyi + ds*dzi - -*** Transform ITRF94 vector to new reference frame - if (jopt2 .eq. 0) then - iopt = 1 - else - iopt = jopt2 - endif - - dtime = date - refepc(iopt) - rotnx = rx(iopt) + drx(iopt)*dtime - rotny = ry(iopt) + dry(iopt)*dtime - rotnz = rz(iopt) + drz(iopt)*dtime - ds = 1.d0 + scale(iopt) + dscale(iopt)*dtime - - dxi = + ds*dxt + rotnz*dyt - rotny*dzt - dyi = - rotnz*dxt + ds*dyt + rotnx*dzt - dzi = + rotny*dxt - rotnx*dyt + ds*dzt - - return - end - -*********************************************************** - - subroutine TRAVEC_IERS(dxi, dyi, dzi, date, jopt1, jopt2) - -*** Transform GPS or other vector from one reference frame to another -*** for the given date, using the IERS 96-97 transformation parameters -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - -*** (dxi, dyi, dzi) --> (input) components of input vector in meters -*** --> (output) components of transformed vector in meters - -*** date --> (input) time (decimal years) to which the input & output -*** vectors correspond - -*** jopt1 --> (input) specifier of reference frame for input vector -*** jopt2 --> (input) specifier of reference frame for output vector - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - - common /tranpa1/ tx1(numref), ty1(numref), tz1(numref), - & dtx1(numref), dty1(numref), dtz1(numref), - & rx1(numref), ry1(numref), rz1(numref), - & drx1(numref), dry1(numref), drz1(numref), - & scale1(numref), dscale1(numref), refepc1(numref) - - -*** Transform input vector to ITRF94 reference frame - if (jopt1 .eq. 0) then - iopt = 1 - else - iopt = jopt1 - endif - - dtime = date - refepc1(iopt) - rotnx = -(rx1(iopt) + drx1(iopt)*dtime) - rotny = -(ry1(iopt) + dry1(iopt)*dtime) - rotnz = -(rz1(iopt) + drz1(iopt)*dtime) - ds = 1.d0 - (scale1(iopt) + dscale1(iopt)*dtime) - - dxt = + ds*dxi + rotnz*dyi - rotny*dzi - dyt = - rotnz*dxi + ds*dyi + rotnx*dzi - dzt = + rotny*dxi - rotnx*dyi + ds*dzi - -*** Transform ITRF94 vector to new reference frame - if (jopt2 .eq. 0) then - iopt = 1 - else - iopt = jopt2 - endif - - dtime = date - refepc1(iopt) - rotnx = rx1(iopt) + drx1(iopt)*dtime - rotny = ry1(iopt) + dry1(iopt)*dtime - rotnz = rz1(iopt) + drz1(iopt)*dtime - ds = 1.d0 + scale1(iopt) + dscale1(iopt)*dtime - - dxi = + ds*dxt + rotnz*dyt - rotny*dzt - dyi = - rotnz*dxt + ds*dyt + rotnx*dzt - dzi = + rotny*dxt - rotnx*dyt + ds*dzt - - return - end - -*********************************************************** - SUBROUTINE GETPNT(LATD,LATM,SLAT,LATDIR,LOND,LONM,SLON, - 1 LONDIR, NAME, X,Y,Z,XLAT,XLON,EHT) - -*** Interactively obtain name and coordinates for a point. -*** Output longitude will be positive west. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - CHARACTER NAME*24 - CHARACTER COPT*1,LATDIR*1,LONDIR*1 - LOGICAL FRMXYZ - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - - WRITE(LUOUT,100) - 100 FORMAT(' Enter name for point (24 character max). ') - READ(LUIN,105,err=200,iostat=ios) NAME - if (ios /= 0) goto 200 - 105 FORMAT(A24) - - 110 WRITE(LUOUT,111) - 111 FORMAT(' How do you wish to specify positional coordinates:'/ - 1 ' 1...geodetic latitude, longitude, ellipsoid height'/ - 2 ' 2...Cartesian (X,Y,Z) coordinates. ') - READ(LUIN,'(A1)',err=201,iostat=ios) COPT - if (ios /= 0) goto 201 - - IF(COPT .EQ. '1') THEN - WRITE(LUOUT,115) - 115 FORMAT( - 1 ' Enter latitude degrees-minutes-seconds in free format'/, - 2 ' with north being positive. For example, 35,17,28.3 '/ - 2 ' For a point in the southern hemisphere, enter a minus sign'/ - 3 ' before each value. For example, -35,-17,-28.3') - READ(LUIN,*,err=202,iostat=ios) LATD, LATM, SLAT - if (ios /= 0) goto 202 - WRITE(LUOUT,120) - 120 FORMAT( - 1 ' Enter longitude degrees-minutes-seconds in free format'/, - 2 ' with west being positive. To express a longitude measured'/ - 3 ' eastward, enter a minus sign before each value.') - READ(LUIN,*,err=203,iostat=ios) LOND, LONM, SLON - if (ios /= 0) goto 203 - WRITE(LUOUT, 125) - 125 FORMAT( - 1 ' Enter ellipsoid height in meters. (Note that'/, - 1 ' predicted motions are independent of this height.) ') - READ(LUIN,*,err=204,iostat=ios) EHT - if (ios /= 0) goto 204 - XLAT = (DBLE((LATD*60 + LATM)*60) + SLAT)/RHOSEC - LATDIR = 'N' - IF (XLAT .lt. 0.0D0) then - LATD = - LATD - LATM = - LATM - SLAT = - SLAT - LATDIR = 'S' - ENDIF - XLON = (DBLE((LOND*60 + LONM)*60) + SLON)/RHOSEC - ELON = -XLON - CALL TOXYZ(XLAT,ELON,EHT,X,Y,Z) - LONDIR = 'W' - IF (XLON .lt. 0.0D0) then - LOND = -LOND - LONM = -LONM - SLON = -SLON - LONDIR = 'E' - ENDIF - - ELSEIF(COPT .EQ. '2') THEN - WRITE(LUOUT,130) - 130 FORMAT(' Enter X coordinate in meters. ') - READ(LUIN,*,err=205,iostat=ios) X - if (ios /= 0) goto 205 - WRITE(LUOUT,140) - 140 FORMAT(' Enter Y coordinate in meters. ') - READ(LUIN,*,err=206,iostat=ios) Y - if (ios /= 0) goto 206 - WRITE(LUOUT,150) - 150 FORMAT(' Enter Z coordinate in meters. ') - READ(LUIN,*,err=207,iostat=ios) Z - if (ios /= 0) goto 207 - IF(.NOT.FRMXYZ(X,Y,Z,XLAT,XLON,EHT)) STOP 666 - XLON = -XLON - IF(XLON .LT. 0.0D0) XLON = XLON + TWOPI - CALL TODMSS(XLAT,LATD,LATM,SLAT,ISIGN) - LATDIR = 'N' - IF (ISIGN .eq. -1) LATDIR = 'S' - CALL TODMSS(XLON,LOND,LONM,SLON,ISIGN) - LONDIR = 'W' - IF (ISIGN .eq. -1) LONDIR = 'E' - ELSE - WRITE(LUOUT,*) ' Improper response -- try again. ' - GO TO 110 - ENDIF - - RETURN - - 200 write (*,'(/)') - write (*,*) "Failed to read point name: ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 201 write (*,'(/)') - write (*,*) "Failed to read Coord. form option:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 202 write (*,'(/)') - write (*,*) "Failed to read latitude:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 203 write (*,'(/)') - write (*,*) "Failed to read longitude:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 204 write (*,'(/)') - write (*,*) "Failed to read ellipsoidal height:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 205 write (*,'(/)') - write (*,*) "Failed to read the X coordinate:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 206 write (*,'(/)') - write (*,*) "Failed to read the Y coordinate:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 207 write (*,'(/)') - write (*,*) "Failed to read the Z coordinate:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -***************************************************************** - SUBROUTINE GETVLY(GLAT, GLON, VX, VY, VZ, - 1 VNORTH, VEAST, VUP, VOPT, IFORM) - -*** Interactively obtain velocity for a point - - IMPLICIT DOUBLE PRECISION (A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) - CHARACTER VOPT*1 - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - 200 CONTINUE - IF (IFORM .eq. 210) then - WRITE(LUOUT, 210) - 210 FORMAT(' What is the velocity of this site relative to '/ - 1 ' the input reference frame:'/ - 1 ' 0...use velocity predicted by this software.'/ - 1 ' 1...user will specify the north-east-up'/ - 1 ' components of site velocity.'/ - 1 ' 2...user will specify the global x-y-z'/ - 1 ' components of site velocity.' ) - else - write(luout, 211) - 211 FORMAT(' How do you wish to specify the velocity: '/ - 1 ' 1...north-east-up components.'/ - 1 ' 2...global x-y-z components.' ) - endif - - READ(LUIN, '(A1)',err=300,iostat=ios) VOPT - if (ios /= 0) goto 300 - - IF (VOPT .EQ. '0') THEN - CONTINUE - ELSEIF (VOPT .EQ. '1') THEN - WRITE(LUOUT, 220) - 220 FORMAT( ' Enter north-south component of velocity in mm/yr'/ - 1 ' with north being positive and south being negative') - READ(LUIN, *,err=301,iostat=ios) VNORTH - if (ios /= 0) goto 301 - WRITE(LUOUT, 221) - 221 FORMAT( ' Enter east-west component of velocity in mm/yr'/ - 1 ' with east being positive and west being negative') - READ(LUIN, *,err=302,iostat=ios) VEAST - if (ios /= 0) goto 302 - WRITE(LUOUT, 222) - 222 FORMAT( ' Enter vertical component of velocity in mm/yr'/ - 1 ' with up being positive and down being negative'/ - 1 ' or enter 0.0 if unknown.') - READ(LUIN, *,err=303,iostat=ios) VUP - if (ios /= 0) goto 303 - CALL TOVXYZ( GLAT, GLON, VNORTH, VEAST, VUP, VX, VY, VZ) - ELSEIF (VOPT .EQ. '2') THEN - WRITE(LUOUT, *) ' Enter x-component of velocity in mm/yr.' - READ(LUIN, *,err=304,iostat=ios) VX - if (ios /= 0) goto 304 - WRITE(LUOUT, *) ' Enter y-component of velocity in mm/yr.' - READ(LUIN, *,err=305,iostat=ios) VY - if (ios /= 0) goto 305 - WRITE(LUOUT, *) ' Enter z-component of velocity in mm/yr.' - READ(LUIN, *,err=306,iostat=ios) VZ - if (ios /= 0) goto 306 - CALL TOVNEU(GLAT, GLON, VX, VY, VZ, VNORTH, VEAST, VUP) - ELSE - WRITE(LUOUT, *) 'Improper response -- try again. ' - GO TO 200 - ENDIF - RETURN - - 300 write (*,'(/)') - write (*,*) "Failed to read form of velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 301 write (*,'(/)') - write (*,*) "Failed to read North velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 302 write (*,'(/)') - write (*,*) "Failed to read East velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 303 write (*,'(/)') - write (*,*) "Failed to read Up velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 304 write (*,'(/)') - write (*,*) "Failed to read X velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 305 write (*,'(/)') - write (*,*) "Failed to read Y velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 306 write (*,'(/)') - write (*,*) "Failed to read Z velocity:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END - -************************************************************************ - SUBROUTINE COMPSN(YLATT,YLONT,HTT,YLAT,YLON,HT, - 1 MIN,VN, VE, VU) - -*** Compute the position of a point at specified time -*** Upon input VN, VE, and VU are in mm/yr - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NDLOC = 2195) - - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /TIMREF/ ITREF - COMMON /QPARM/ STRIKE(NDLOC), HL(NDLOC), EQLAT(NDLOC), - 1 EQLON(NDLOC), SSLIP(NDLOC), DSLIP(NDLOC), - 1 DIP(NDLOC), DEPTH(NDLOC), WIDTH(NDLOC), - 1 EQLATR(50),EQLONR(50),EQRAD(50), - 1 ITEQK(50),NLOC(50),NFP(50),NUMEQ - COMMON /FILES/ LUIN,LUOUT, I1, I2, I3, I4, I5, I6 - -** Compute the contribution due to constant velocity - DTIME = DBLE(MIN - ITREF) / 525960.D0 - CALL RADR8T(YLAT,VN,VE,VNR,VER) - YLATT = YLAT + VNR*DTIME - YLONT = YLON - VER*DTIME - HTT = HT + ((VU * DTIME) /1000.D0) -c write (*,*) "FROM COMPSN ",YLATT*180.d0/pi,YLONT*180.d0/pi, -c & HTT -c write (*,*) "FROM COMPSN ",ITREF,MIN,DTIME - -** Compute the contribution due to earthquakes. -** It is assumed that the components of displacement, -** DNORTH,DWEST,DUP, do not vary from one reference -** frame to another given the accuracy of dislocation -** models. - DO 10 I = 1, NUMEQ - IF(ITEQK(I) .GT. ITREF) THEN - NTIME = 1 - ELSE - NTIME = 0 - ENDIF - IF(MIN .LT. ITEQK(I)) NTIME = NTIME - 1 - IF(NTIME .NE. 0) THEN - CALL RADII(EQLATR(I),RADMER,RADPAR) - DDLAT = (YLAT - EQLATR(I))*RADMER - DDLON = (YLON - EQLONR(I))*RADPAR - DIST = DSQRT(DDLAT*DDLAT + DDLON*DDLON) - IF(DIST .LE. EQRAD(I)) THEN - ISTART = NLOC(I) - IEND = NLOC(I) + NFP(I) - 1 - DO 5 JREC = ISTART,IEND - CALL DISLOC(YLAT,YLON,STRIKE(JREC),HL(JREC), - & EQLAT(JREC),EQLON(JREC),SSLIP(JREC), - & DSLIP(JREC),DIP(JREC),DEPTH(JREC), - & WIDTH(JREC),DNORTH,DWEST,DUP) - YLATT = YLATT + NTIME*DNORTH - YLONT = YLONT + NTIME*DWEST - HTT = HTT + NTIME*DUP - 5 CONTINUE - ENDIF - ENDIF - 10 CONTINUE - -*** Compute contribution due to postseismic deformation - CALL PSDISP(YLAT, YLON, MIN, DNORTH, DEAST, DUP) -c write (*,*) "FROM COMPSN DISP ",DNORTH, DEAST, DUP - CALL RADII (YLAT, RMER, RPAR) - YLATT = YLATT + DNORTH/RMER - YLONT = YLONT - DEAST/RPAR - HTT = HTT + DUP - RETURN - END -*************************************************************** - SUBROUTINE NEWCOR(YLAT,YLON,HTOLD,MIN1,MIN2, - 1 YLAT3,YLON3,HTNEW,DN,DE,DU,VN, VE, VU) - -*** Predict coordinates at time MIN2 given coordinates at time MIN1. -*** Predict displacements from time MIN1 to time MIN2. - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - - HT = HTOLD - - CALL COMPSN(YLAT1,YLON1,HT1,YLAT,YLON,HT, - 1 MIN1,VN, VE, VU) - - CALL COMPSN(YLAT2,YLON2,HT2,YLAT,YLON,HT, - 1 MIN2, VN, VE, VU) - - YLAT3 = YLAT + YLAT2 - YLAT1 - YLON3 = YLON + YLON2 - YLON1 - HTNEW = HT + HT2 - HT1 -c write (*,*) "FROM NEWCOR ",YLAT3*180.d0/pi,YLON3*180.d0/pi, -c & HTNEW - - CALL RADII(YLAT,RADMER,RADPAR) - - DN = RADMER * (YLAT2 - YLAT1) - DE = -RADPAR * (YLON2 - YLON1) - DU = HT2 - HT1 -c write (*,*) "FROM NEWCOR displacement ",DN,DE,DU -c write (*,*) "FROM NEWCOR ",YLAT*180.d0/pi,YLON*180.d0/pi,HT -c write (*,*) "FROM NEWCOR ",YLAT1*180.d0/pi,YLON1*180.d0/pi,HT1 -c write (*,*) "FROM NEWCOR ",YLAT2*180.d0/pi,YLON2*180.d0/pi,HT2 -c write (*,*) "FROM NEWCOR ",YLAT3*180.d0/pi,YLON3*180.d0/pi,HTNEW - - RETURN - END -****************************************************************** - subroutine PREDV (ylat,ylon,eht,date,iopt,jregn,vn,ve,vu) - -** Predict velocity in iopt reference frame - -** ylat input - north latitude (radians) -** ylon input - west longitude (radians) -** eht input - ellipsoid height (meters) -** date input - date (decimal years) -** iopt input - reference frame -** jregn output - deformation region -** vn output - northward velocity in mm/yr -** ve output - eastward velocity in mm/yr -** vu output - upward velocity in mm/yr - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - logical Is_iopt_NAD83 - -** Get reference latitude (RLAT) and reference longitude (RLON) - -C The following 2 lines were added on 07/22/2015 after Rich found this bug - elon = -ylon - call TOXYZ(ylat, elon, eht, x, y, z) - -c IF(IOPT .EQ. 0 .OR. IOPT .EQ. 1) THEN !Velocity grids are No longer in NAD83 - IF(IOPT .EQ. 15) THEN !They are in ITRF2008 - RLAT = YLAT - RLON = YLON - ELSE -c elon = -ylon !Was a bug, commented out on 07222015 -c call TOXYZ(ylat, elon, eht, x, y, z) !Was a bug, commented out on 07222015 -c CALL XTONAD(X,Y,Z,RLAT,RLON,EHTNAD,DATE,IOPT) !No longer NAD83 - CALL XTO08 (X,Y,Z,RLAT,RLON,EHTNAD,DATE,IOPT) !Positions should be in ITRF2008 - ENDIF - -** Get deformation region - - CALL GETREG(RLAT,RLON,JREGN) -c write (*,*) JREGN - IF (JREGN .EQ. 0) THEN - VN = 0.D0 - VE = 0.D0 - VU = 0.D0 - RETURN - ENDIF - CALL COMVEL( RLAT, RLON, JREGN, VN, VE, VU) !Those velocities are in ITRF2008 - -** Convert velocity to reference of iopt, if iopt != NAD83 !No, was in ITRF2008, not in NAD83 (since 09/12/2014) - - Is_iopt_NAD83 = (iopt == 1) -c IF (IOPT .NE. 0 .AND. IOPT .NE. 1) THEN - IF (IOPT .NE. 15) THEN - CALL TOVXYZ( YLAT, ELON, VN, VE, VU, VX, VY, VZ) - if (Is_iopt_NAD83) then -c CALL VTRANF( X, Y, Z, VX, VY, VZ, 1, IOPT) - CALL VTRANF( X, Y, Z, VX, VY, VZ, 15, IOPT) - else - CALL VTRANF_IERS( X, Y, Z, VX, VY, VZ, 15, IOPT) - endif - CALL TOVNEU( YLAT, ELON, VX, VY, VZ, VN, VE, VU) - ENDIF -c write (*,*) "From PREDV ",VN, VE, VU - - RETURN - END - -**************************************************************** - subroutine TRFVEL - -*** Transform velocities from one reference frame to another - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - parameter (numref = 16) - character nameif*80,name24*80 - character namef*30 - character frame1*24, frame2*24 - character option*1 - character vopt*1, LATDIR*1,LONDIR*1 - character record*120 - LOGICAL Is_inp_NAD83,Is_out_NAD83 - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /CONST/ A, F, E2, EPS, AF, PI, TWOPI, RHOSEC - - write( luout, 100) - 100 format( - 1 ' Please enter the name of the file to contain '/ - 1 ' the transformed velocities. ') - read( luin, '(a30)',err=600,iostat=ios) namef - if (ios /= 0) goto 600 - - open( i2, file = namef, status = 'unknown') - CALL HEADER - - 105 write( luout, 110) - 110 format( /'*******************************'/ - 1 ' Enter the reference frame of the input velocities.') - call MENU1(iopt1, frame1) - if (iopt1 .lt. 1 .or. iopt1 .gt. numref) then - write( luout, *) ' Improper selection -- try again.' - go to 105 - endif - Is_inp_NAD83 = (iopt1 == 1) - - 115 write( luout, 120) - 120 format( /' Enter the reference frame for the output velocities.') - call MENU1(iopt2, frame2) - if (iopt2 .lt. 1 .or. iopt2 .gt. numref) then - write( luout, *) 'Improper selection -- try again.' - go to 115 - endif - Is_out_NAD83 = (iopt2 == 1) - - write( i2, 125) frame1, frame2 - 125 format( ' TRANSFORMING VELOCITIES FROM ', A24, ' TO ', a24// - 1 16X, ' INPUT VELOCITIES OUTPUT VELOCITIES'/) - - 130 write( luout, 140) - 140 format( /'**********************************'/ - 1 ' Velocities will be transformed at each specified point.'/ - 1 ' Please indicate how you wish to input points.'/ - 1 ' 0...No more points. Return to main menu.'/ - 1 ' 1...Individual points entered interactively.'/ - 1 ' 2...Transform velocities contained in batch file '/ - 1 ' of delimited records of the form: '/ - 1 ' LAT,LON,VN,VE,VU,TEXT ' / - 1 ' LAT = latitude in degrees (positive north/DBL PREC)'/ - 1 ' LON = longitude in degrees (positive west/DBL PREC)'/ - 1 ' VN = northward velocity in mm/yr (DBL PREC) '/ - 1 ' VE = eastwars velocity in mm/yr (DBL PREC) '/ - 1 ' VU = upward velocity in mm/yr (DBL PREC) '/ - 1 ' TEXT = descriptive text (CHARACTER*24) '/ - 1 ' Example: '/ - 1 ' 40.731671553,112.212671753, 3.7,3.8,-2.4,SALT AIR '/) - read( luin,'(a1)',err=601,iostat=ios) option - if (ios /= 0) goto 601 - if (option .eq. '0') then - go to 500 - elseif (option .eq. '1') then - call GETPNT( latd, latm, slat, LATDIR, lond, lonm, slon, - 1 LONDIR, name24, x, y, z, ylat, ylon, eht) - elon = - ylon - call GETVLY( ylat, elon, vx, vy, vz, vn, ve, vu, vopt, 211) - vx1 = vx - vy1 = vy - vz1 = vz - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF( x, y, z, vx1, vy1, vz1, iopt1, iopt2) - else - call VTRANF_IERS( x, y, z, vx1, vy1, vz1, iopt1, iopt2) - endif - call TOVNEU( ylat, elon, vx1, vy1, vz1, vn1, ve1, vu1) - xlat = (ylat*rhosec)/3600.d0 - xlon = (ylon*rhosec)/3600.d0 - call PRNTVL(vn, ve, vu, vx, vy, vz, vn1, ve1, vu1, - 1 vx1, vy1, vz1, name24, 1,xlat, xlon) - - go to 130 - elseif (option .eq. '2') then - eht = 0.d0 - write (luout, 200) - 200 format(/' Enter name of input file: ') - read(luin, '(a)',err=602,iostat=ios) nameif - if (ios /= 0) goto 602 - - open (i1, file = nameif, status = 'old') - 210 read(i1,'(a)',end = 220,err=603,iostat=ios) record -c 210 read(i1, *, end = 220,err=603,iostat=ios) xlat, xlon,vn,ve,vu, name24 - call interprate_velocity_record (record,xlat,xlon,vn,ve, - & vu,name24) - if (ios /= 0) goto 603 - ylat = (xlat*3600.d0) / rhosec - ylon = (xlon*3600.d0) / rhosec - elon = -ylon - call TOXYZ (ylat, elon, eht, x, y, z) - call TOVXYZ (ylat, elon, vn,ve,vu,vx,vy,vz) - vx1 = vx - vy1 = vy - vz1 = vz - if (Is_inp_NAD83 .or. Is_out_NAD83) then - call VTRANF ( x, y, z, vx1, vy1, vz1, iopt1, iopt2) - else - call VTRANF_IERS ( x, y, z, vx1, vy1, vz1, iopt1, iopt2) - endif - call TOVNEU (ylat, elon, vx1, vy1, vz1, vn1, ve1, vu1) - call PRNTVL (vn, ve,vu,vx,vy,vz,vn1,ve1,vu1,vx1,vy1,vz1, - 1 name24, 0, xlat, xlon) - go to 210 - 220 close (i1, status = 'keep') - endif - 500 continue - close (i2, status = 'keep') - return - - 600 write (*,'(/)') - write (*,*) "Failed to read file name in TRFVEL:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 601 write (*,'(/)') - write (*,*) "Failed to read option in TRFVEL:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 602 write (*,'(/)') - write (*,*) "Failed to read input file name in TRFVEL:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 603 write (*,'(/)') - write(*,*)"Failed to read input file format in TRFVEL:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - end -******************************************************************* - SUBROUTINE VTRANF(X,Y,Z,VX,VY,VZ, IOPT1, IOPT2) - -*** Convert velocity from reference frame of IOPT1 to -*** reference frame of IOPT2. -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (numref = 16) - common /tranpa/ tx(numref), ty(numref), tz(numref), - & dtx(numref), dty(numref), dtz(numref), - & rx(numref), ry(numref), rz(numref), - & drx(numref), dry(numref), drz(numref), - & scale(numref), dscale(numref), refepc(numref) - - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - IF(IOPT1 .le. numref .and. IOPT2. le. numref - & .and. IOPT1 .gt. 0 .and. IOPT2 .gt. 0 ) THEN - -*** Convert from mm/yr to m/yr - VX = VX /1000.d0 - VY = VY / 1000.d0 - VZ = VZ / 1000.d0 - -*** From IOPT1 to ITRF94 -*** (following equations use approximations assuming -*** that rotations and scale change are small) - WX = -drx(iopt1) - WY = -dry(iopt1) - WZ = -drz(iopt1) - DS = -dscale(iopt1) - VX = VX - dtx(iopt1) + DS*X + WZ*Y - WY*Z - VY = VY - dty(iopt1) - WZ*X +DS*Y + WX*Z - VZ = VZ - dtz(iopt1) + WY*X - WX*Y + DS*Z - -*** From ITRF94 to IOPT2 reference frame -*** (following equations use approximations assuming -*** that rotations and scale change are small) - WX = drx(iopt2) - WY = dry(iopt2) - WZ = drz(iopt2) - DS = dscale(iopt2) - VX = VX + dtx(iopt2) + DS*X + WZ*Y - WY*Z - VY = VY + dty(iopt2) - WZ*X + DS*Y + WX*Z - VZ = VZ + dtz(iopt2) + WY*X - WX*Y + DS*Z - -*** FROM m/yr to mm/yr - VX = VX * 1000.d0 - VY = VY * 1000.d0 - VZ = VZ * 1000.d0 - - ELSE - write(luout,*) ' Improper reference frame in routine vtranf' - stop - ENDIF -c write (*,*) "Inside VTRANF ",Vx,Vy,Vz - - RETURN - END -****************************************************** - SUBROUTINE VTRANF_IERS(X,Y,Z,VX,VY,VZ, IOPT1, IOPT2) - -*** Convert velocity from reference frame of IOPT1 to -*** reference frame of IOPT2. -**************** -C Important note: -C The parameters in common block tranpa are computed using the IGS values of ITRF96==>ITRF97 -C The parameters in common block tranpa1 are computed using the IERS values of ITRF96==>ITRF97 - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (numref = 16) - common /tranpa1/ tx1(numref), ty1(numref), tz1(numref), - & dtx1(numref), dty1(numref), dtz1(numref), - & rx1(numref), ry1(numref), rz1(numref), - & drx1(numref), dry1(numref), drz1(numref), - & scale1(numref), dscale1(numref), refepc1(numref) - - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - IF(IOPT1 .le. numref .and. IOPT2. le. numref - & .and. IOPT1 .gt. 0 .and. IOPT2 .gt. 0 ) THEN - -*** Convert from mm/yr to m/yr - VX = VX /1000.d0 - VY = VY / 1000.d0 - VZ = VZ / 1000.d0 - -*** From IOPT1 to ITRF94 -*** (following equations use approximations assuming -*** that rotations and scale change are small) - WX = -drx1(iopt1) - WY = -dry1(iopt1) - WZ = -drz1(iopt1) - DS = -dscale1(iopt1) - VX = VX - dtx1(iopt1) + DS*X + WZ*Y - WY*Z - VY = VY - dty1(iopt1) - WZ*X +DS*Y + WX*Z - VZ = VZ - dtz1(iopt1) + WY*X - WX*Y + DS*Z - -*** From ITRF94 to IOPT2 reference frame -*** (following equations use approximations assuming -*** that rotations and scale change are small) - WX = drx1(iopt2) - WY = dry1(iopt2) - WZ = drz1(iopt2) - DS = dscale1(iopt2) - VX = VX + dtx1(iopt2) + DS*X + WZ*Y - WY*Z - VY = VY + dty1(iopt2) - WZ*X + DS*Y + WX*Z - VZ = VZ + dtz1(iopt2) + WY*X - WX*Y + DS*Z - -*** FROM m/yr to mm/yr - VX = VX * 1000.d0 - VY = VY * 1000.d0 - VZ = VZ * 1000.d0 - - ELSE - write(luout,*) ' Improper reference frame in routine vtranf' - stop - ENDIF - - RETURN - END -****************************************************** - subroutine PRNTVL(VN, VE, VU, VX, VY, VZ, VN1, VE1, VU1, - 1 VX1, VY1, VZ1, NAME24, IPRINT,XLAT,XLON) - -*** Print transformed velocities - - implicit double precision (a-h, o-z) - implicit integer*4 (i-n) - character name24*80 - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - if (iprint .eq. 1) then - write( luout, 100) vn1, ve1, vu1, vx1, vy1, vz1 - 100 format( ' ****************************************'/ - 1 ' New northward velocity = ', f8.2, ' mm/yr' / - 1 ' New eastward velocity = ', f8.2, ' mm/yr'/ - 1 ' New upward velocity = ', f8.2, ' mm/yr'/ - 1 ' New x velocity = ', f8.2, ' mm/yr'/ - 1 ' New y velocity = ', f8.2, ' mm/yr'/ - 1 ' New z velocity = ', f8.2, ' mm/yr'/) - endif - - write( i2, 200) name24, xlat, xlon, - 1 vn, vn1, ve, ve1, vu, vu1, - 1 vx, vx1, vy, vy1, vz, vz1 - 200 format(1x, a24 / - 1 1x, 'latitude = ',F14.9,2x,'longitude = ',F14.9 / - 1 5x, 'northward velocity ', f8.2, 6x, f8.2, ' mm/yr' / - 1 5x, 'eastward velocity ', f8.2, 6x, f8.2, ' mm/yr' / - 1 5x, 'upward velocity ', f8.2, 6x, f8.2, ' mm/yr' / - 1 5x, 'x velocity ', f8.2, 6x, f8.2, ' mm/yr' / - 1 5x, 'y velocity ', f8.2, 6x, f8.2, ' mm/yr' / - 1 5x, 'z velocity ', f8.2, 6x, f8.2, ' mm/yr' /) - - return - end -******************************************************************* - SUBROUTINE HEADER - - IMPLICIT DOUBLE PRECISION (A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) - character HTDP_version*10 - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - COMMON /VERSION/ HTDP_version - - WRITE(I2, 10) HTDP_version - 10 FORMAT(' HTDP (VERSION ',a,') OUTPUT' / ) - RETURN - END -********************************************* - SUBROUTINE GETMDY(MONTH, IDAY, IYEAR, DATE, MINS, TEST) - -*** Read month-day-year and convert to decimal years -*** and Julian time in minutes -*** MONTH output - number from 1 to 12 -*** IDAY output - number from 1 to 31 -*** IYEAR output - must be after 1906 -*** DATE output - corresponding time in decimal years -*** MINS output - corresponding julian time in minutes -*** TEST output - if (true) then there is an error - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - DIMENSION M(12) - LOGICAL TEST - CHARACTER TOPT*1 - COMMON /FILES/ LUIN, LUOUT, I1, I2, I3, I4, I5, I6 - - M(1) = 31 - M(2) = 28 - M(3) = 31 - M(4) = 30 - M(5) = 31 - M(6) = 30 - M(7) = 31 - M(8) = 31 - M(9) = 30 - M(10) = 31 - M(11) = 30 - M(12) = 31 - - 3 WRITE (LUOUT,1) - 1 FORMAT (' How do you wish to enter the time?'/ - 1 ' 1. month-day-year in free format'/ - 1 ' for example, 5,12,1979'/ - 1 ' represents May 12, 1979'/ - 1 ' 2. decimal year'/ - 1 ' for example the entry 1979.359'/ - 1 ' represents UTC midnight at the begining'/ - 1 ' of May 12, 1979.'/) - - READ (LUIN,5,err=100,iostat=ios) TOPT - if (ios /= 0) goto 100 - 5 format (A1) - - IF (TOPT .EQ. '1') Then - write (luout,*) ' Enter month-day-year ' - READ(LUIN,*,err=101,iostat=ios) MONTH,IDAY,IYEAR - if (ios /= 0) goto 101 - - IF(IYEAR .le. 1906) THEN - WRITE(LUOUT,10) - 10 FORMAT(' The model is not valid for dates prior ', - 1 'to 1906.'/) - TEST = .TRUE. - RETURN - ENDIF - - IF(MONTH .le. 0 .or. MONTH .gt. 12) THEN - WRITE(LUOUT,20) - 20 FORMAT(' Improper month specified.'/) - TEST = .TRUE. - RETURN - ENDIF - - IF(IDAY .le. 0 .or. IDAY .gt. 31) THEN - WRITE(LUOUT,30) - 30 FORMAT(' Improper day specified.'/) - TEST = .TRUE. - RETURN - ENDIF - - CALL IYMDMJ(IYEAR, MONTH, IDAY, MJD) - CALL IYMDMJ(IYEAR, 1, 1, MJD0) - IYEAR1 = IYEAR + 1 - CALL IYMDMJ(IYEAR1, 1, 1, MJD1) - DAY = DBLE(MJD - MJD0) - DENOM = DBLE(MJD1 - MJD0) - DATE = DBLE(IYEAR) + (DAY / DENOM) - MINS = MJD * 24 * 60 - TEST = .FALSE. - RETURN - - ELSEIF (TOPT .EQ. '2') then - write(luout,*) ' Enter decimal year ' - READ (LUIN, *,err=102,iostat=ios) DATE - if (ios /= 0) goto 102 - - IF (DATE .lt. 1906.0d0) then - write (luout, 10) - TEST = .TRUE. - RETURN - ENDIF -**** add small increment to circumvent round-off error -c DATE = DATE + 0.0004D0 -**** - IYEAR = DATE - CALL IYMDMJ(IYEAR, 1, 1, MJD0) - IYEAR1 = IYEAR + 1 - CALL IYMDMJ(IYEAR1, 1, 1, MJD1) - LEAP = 0 - IF ((MJD1 - MJD0) .eq. 366) LEAP = 1 - REMDAY = (DATE - IYEAR)* (MJD1 - MJD0) - IBEGIN = 0 - ITOTAL = 31 - IF (REMDAY .LT. ITOTAL) then - MONTH = 1 - IDAY = REMDAY - IBEGIN + 1 - CALL IYMDMJ(IYEAR,MONTH,IDAY,MJD) - MINS = MJD * 24 * 60 - TEST = .FALSE. - RETURN - ENDIF - IBEGIN = ITOTAL - ITOTAL = ITOTAL + LEAP - DO I = 2, 12 - ITOTAL = ITOTAL + M(I) - IF (REMDAY .LT. ITOTAL) then - MONTH = I - IDAY = REMDAY - IBEGIN + 1 - TEST = .FALSE. - CALL IYMDMJ(IYEAR,MONTH,IDAY,MJD) - MINS = MJD * 24 * 60 - RETURN - ENDIF - IBEGIN = ITOTAL - ENDDO - Write(LUOUT, 60) - 60 Format (' Error could not convert Decimal years to ' - 1 ,'month-day-year') - TEST = .TRUE. - RETURN - ELSE - write (luout, 70) - 70 format (' Improper entry') - Go TO 3 - ENDIF - - 100 write (*,'(/)') - write (*,*) "Failed to read option in GETDMY:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 101 write (*,'(/)') - write (*,*) "Wrong MDY input in GETDMY:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - 102 write (*,'(/)') - write (*,*) "Wrong decimal year in GETDMY:ios=",ios - write (*,*) "ABNORMAL TERMINATION" - write (*,*) "PLEASE CHECK YOUR INPUT FILE AND TRY AGAIN" - stop - - END -************************************ - SUBROUTINE IYMDMJ( IYR, IMON, IDAY, MJD ) -C -C********1*********2*********3*********4*********5*********6*********7** -C -C NAME: IYMDMJ -C VERSION: Sep. 17, 2010 -C WRITTEN BY: R. SNAY (after M. SCHENEWERK) -C PURPOSE: CONVERT DATE TO MODIFIED JULIAN DATE -C -C INPUT PARAMETERS FROM THE ARGUEMENT LIST: -C ----------------------------------------- -C IDAY DAY -C IMON MONTH -C IYR YEAR -C -C OUTPUT PARAMETERS FROM ARGUEMENT LIST: -C -------------------------------------- -C MJD MODIFIED JULIAN DATE -C -C -C LOCAL VARIABLES AND CONSTANTS: -C ------------------------------ -C A TEMPORARY STORAGE -C B TEMPORARY STORAGE -C C TEMPORARY STORAGE -C D TEMPORARY STORAGE -C IMOP TEMPORARY STORAGE -C IYRP TEMPORARY STORAGE -C -C GLOBAL VARIABLES AND CONSTANTS: -C ------------------------------ -C -C -C THIS MODULE CALLED BY: GENERAL USE -C -C THIS MODULE CALLS: DINT -C -C INCLUDE FILES USED: -C -C COMMON BLOCKS USED: -C -C REFERENCES: DUFFETT-SMITH, PETER 1982, 'PRACTICAL -C ASTRONOMY WITH YOUR CALCULATOR', 2ND -C EDITION, CAMBRIDGE UNIVERSITY PRESS, -C NEW YORK, P.9 -C -C COMMENTS: THIS SUBROUTINE REQUIRES THE FULL YEAR, -C I.E. 1992 RATHER THAN 92. -C -C********1*********2*********3*********4*********5*********6*********7** -C::LAST MODIFICATION -C::8909.06, MSS, DOC STANDARD IMPLIMENTED -C::9004.17, MSS, CHANGE ORDER YY MM DD -C********1*********2*********3*********4*********5*********6*********7** -C - IMPLICIT DOUBLE PRECISION(A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) -C - INTEGER*4 A, B, C, D - - IYRP = IYR -C -C........ 0.0 EXPLICIT INITIALIZATION -C - IF( IMON .LT. 3 ) THEN - IYRP= IYRP - 1 - IMOP= IMON + 12 - ELSE - IMOP= IMON - END IF -C -C........ 1.0 CALCULATION -C - A= IYRP*0.01D0 - B= 2 - A + DINT( A*0.25D0 ) - C= 365.25D0*IYRP - D= 30.6001D0*(IMOP + 1) - MJD = (B + C + D + IDAY - 679006) -C - RETURN - END -***************************************************** - SUBROUTINE PSDISP(YLAT, YLON, MIN, DNORTH, DEAST, DUP) -******** -* Compute total postseismic displacement for all earthquakes -* -* INPUT -* YLAT latitude of point in radians, positive north -* YLON longitude of point in radians, positive west -* MIN modified julian date of reference epoch for new coordinates -* in minutes -* -* DNORTH Total northward postseismic displacement at point during -* period from ITREF to MIN in meters -* DEAST TOTAL eastward postseismic displacement -* DUP Total upward postseismic displacement -******* - - IMPLICIT DOUBLE PRECISION (A-H, O-Z) - IMPLICIT INTEGER*4 (I-N) - LOGICAL INSIDE - - parameter (NUMPSG = 1) - COMMON /CONST/ A, F,E2,EPS,AF,PI,TWOPI,RHOSEC - COMMON /TIMREF/ ITREF - COMMON /PSGRID/ PSGLX(NUMPSG), PSGUX(NUMPSG), - 1 PSGLY(NUMPSG), PSGUY(NUMPSG), - 1 ICNTPX(NUMPSG), ICNTPY(NUMPSG), NBASEP(NUMPSG) - COMMON /PGRID/ PS(18000) - DIMENSION ITEQ(NUMPSG) - DIMENSION TAU(NUMPSG) - DIMENSION WEI(2,2) - DIMENSION AMP(2,2,3) - -*** Relaxation constant (in years) for 2002 Denali earthquake - TAU(1) = 5.0D0 - -*** Modofied Julian Date (in minutes) for the 2002 Denali earthquake - IYEAR = 2002 - IMO = 11 - IDAY = 3 - CALL IYMDMJ(IYEAR,IMO,IDAY, MJD) - ITEQ(1) = MJD*60*24 - - DNORTH = 0.0D0 - DEAST = 0.0D0 - DUP = 0.0D0 - - DO K = 1, NUMPSG -*** Check if the point is inside the grid - POSX = YLON*180.d0/PI - POSX = 360.d0 - POSX - IF (POSX .GT. 360.D0) POSX = POSX - 360.D0 - POSY = YLAT*180.D0/PI - CALL GRDCHK(POSX, POSY, PSGLX(K), PSGUX(K), - 1 PSGLY(K), PSGUY(K), INSIDE) - - IF (INSIDE ) THEN -*** Get the indices for the lower left-hand corner of the grid - CALL PSGWEI(POSX,POSY,K,I,J,WEI) -*** Get the displacement amplitude at the four corners - CALL GRDAMP(K,I,J,AMP,PS) - - ANORTH = WEI(1,1)*AMP(1,1,1) + WEI(1,2)*AMP(1,2,1) - 1 + WEI(2,1)*AMP(2,1,1) + WEI(2,2)*AMP(2,2,1) - AEAST = WEI(1,1)*AMP(1,1,2) + WEI(1,2)*AMP(1,2,2) - 1 + WEI(2,1)*AMP(2,1,2) + WEI(2,2)*AMP(2,2,2) - AUP = WEI(1,1)*AMP(1,1,3) + WEI(1,2)*AMP(1,2,3) - 1 + WEI(2,1)*AMP(2,1,3) + WEI(2,2)*AMP(2,2,3) - -c write (6, 30) anorth, aeast, aup -c 30 format (1x, 3f15.5) - -*** Convert amplitudes from mm to meters - ANORTH = ANORTH / 1000.D0 - AEAST = AEAST / 1000.D0 - AUP = AUP / 1000.D0 - - IF (MIN .GT. ITEQ(K)) THEN - DTIME = DBLE(MIN - ITEQ(K))/(60.D0*24.D0*365.D0) - FACTOR = 1.D0 - DEXP(-DTIME/TAU(K)) - DNORTH = DNORTH + ANORTH*FACTOR - DEAST = DEAST + AEAST*FACTOR - DUP = DUP + AUP*FACTOR - ENDIF - IF (ITREF .GT. ITEQ(K)) THEN - DTIME = DBLE(ITREF - ITEQ(K))/(60.D0*24.D0*365.D0) - FACTOR = 1.D0 - DEXP(-DTIME/TAU(K)) - DNORTH = DNORTH - ANORTH*FACTOR - DEAST = DEAST - AEAST*FACTOR - DUP = DUP - AUP*FACTOR - ENDIF - ENDIF - ENDDO - RETURN - END - -**************************************************** - SUBROUTINE GRDCHK (POSX, POSY, GRDLX, GRDUX, - 1 GRDLY, GRDUY, INSIDE) - -C -C ROUTINE CHECKS IF THE POINT HAVING COORDINATES (POSX, POSY) -C IS WITHIN THE REGION SPANNED BY THE GRID -C - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - LOGICAL INSIDE - - INSIDE = .TRUE. - - IF (POSX .LT. GRDLX .OR. POSX .GT. GRDUX) THEN - INSIDE = .FALSE. - ENDIF - IF (POSY .LT. GRDLY .OR. POSY .GT. GRDUY) THEN - INSIDE = .FALSE. - ENDIF - - RETURN - END -******************************************************************* - SUBROUTINE PSGWEI (POSX, POSY, K, I, J, WEI) - -C -C********1*********2*********3*********4*********5*********6*********7** -C -C PURPOSE: THIS SUBROUTINE RETURNS THE INDICES OF THE LOWER-LEFT -C HAND CORNER OF THE GRID CELL CONTAINING THE POINT -C AND COMPUTES NORMALIZED WEIGHTS FOR -C BI-LINEAR INTERPOLATION OVER A PLANE -C -C INPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------ -C POSX LONGITUDE OF POINT IN DEGREES, POSITIVE EAST -C POSY LATITUDE OF POINT IN DEGREES, POSITIVE NORTH -C K ID OF EARTHQUAKE GRID -C -C OUTPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------- -C I, J THE COORDINATES OF LOWER LEFT CORNER OF THE GRID -C CONTAINING THE ABOVE POSITION -C WEI A TWO BY TWO ARRAY CONTAINING THE NORMALIZED WEIGHTS -C FOR THE CORNER VECTORS -C -C GLOBAL VARIABLES AND CONSTANTS: -C ------------------------------- -C NONE -C -C THIS MODULE CALLED BY: PSDISP -C -C THIS MODULE CALLS: NONE -C -C INCLUDE FILES USED: NONE -C -C COMMON BLOCKS USED: /PSGRID/, /CONST/ -C -C REFERENCES: SEE RICHARD SNAY -C -C COMMENTS: -C -C********1*********2*********3*********4*********5*********6*********7** -C MOFICATION HISTORY: -C::9302.11, CRP, ORIGINAL CREATION FOR DYNAP -C::9511.09, RAS, MODIFIED FOR HTDP -C::9712.05, RAS, MODIFIED TO ACCOUNT FOR MULTIPLE GRIDS -C********1*********2*********3*********4*********5*********6*********7** - -C**** COMPUTES THE WEIGHTS FOR AN ELEMENT IN A GRID - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NUMPSG = 1) - DIMENSION WEI(2,2) - COMMON /PSGRID/ PSGLX(NUMPSG), PSGUX(NUMPSG), - 1 PSGLY(NUMPSG), PSGUY(NUMPSG), - 1 ICNTPX(NUMPSG), ICNTPY(NUMPSG), NBASEP(NUMPSG) - COMMON /CONST/ A,F,E2,EPS,AF,PI,TWOPI,RHOSEC - -C*** Obtain indices for the lower-left corner of the cell -C*** containing the point - STEPX = (PSGUX(K) - PSGLX(K)) / ICNTPX(K) - STEPY = (PSGUY(K) - PSGLY(K)) / ICNTPY(K) - I = IDINT((POSX - PSGLX(K))/STEPX) + 1 - J = IDINT((POSY - PSGLY(K))/STEPY) + 1 -c write(6,1001) K, I, J -c1001 format(1x, 'quake = ', I5 / -c 1 1x, ' i = ', I5 / -c 1 1x, ' j = ', I5) - -C*** Compute the limits of the grid cell - GRLX = PSGLX(K) + (I - 1) * STEPX - GRUX = GRLX + STEPX - GRLY = PSGLY(K) + (J - 1) * STEPY - GRUY = GRLY + STEPY - -C*** Compute the normalized weights for the point - DENOM = (GRUX - GRLX) * (GRUY - GRLY) - WEI(1,1) = (GRUX - POSX) * (GRUY - POSY) / DENOM - WEI(2,1) = (POSX - GRLX) * (GRUY - POSY) / DENOM - WEI(1,2) = (GRUX - POSX) * (POSY - GRLY) / DENOM - WEI(2,2) = (POSX - GRLX) * (POSY - GRLY) / DENOM - - RETURN - END - -C********************************************************************* - SUBROUTINE GRDAMP (K, I, J, AMP, PS) -C********1*********2*********3*********4*********5*********6*********7** -C -C PURPOSE: THIS SUBROUTINE RETRIEVES THE AMPLITUDES OF THE FOUR -C GRID NODES OFGRID K WHERE I,J ARE THE INDICES OF -C THE LOWER LEFT HAND CORNER -C -C INPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------ -C -C K ID OF EARTHQUAKE CORRESPONDING TO GRID -C I, J THE COORDINATES OF LOWER LEFT CORNER OF THE GRID -C CONTAINING THE ABOVE POSITION -C PS THE ARRAY CONTAINING ALL THE GRIDDED AMPLITUDES -C -C OUTPUT PARAMETERS FROM ARGUMENT LIST: -C ------------------------------------- -C AMP A TWO BY TWO ARRAY CONTAINING THE 3D AMPLITUDES -C FOR THE CORNERS OF THE GRID -C -C GLOBAL VARIABLES AND CONSTANTS: -C ------------------------------- -C NONE -C -C THIS MODULE CALLED BY: PSDISP -C -C THIS MODULE CALLS: NONE -C -C INCLUDE FILES USED: NONE -C -C COMMON BLOCKS USED: NONE -C -C REFERENCES: SEE RICHARD SNAY -C -C COMMENTS: -C -C********1*********2*********3*********4*********5*********6*********7** -C MOFICATION HISTORY: -C::2011.08.17, RAS, ORIGINAL CREATION FOR TRANS4D -C********1*********2*********3*********4*********5*********6*********7** - - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - DIMENSION AMP(2,2,3), PS(*) - - DO 30 II = 0,1 - DO 20 IJ = 0,1 - DO 10 IVEC = 1, 3 - INDEX = IPSGRD(K, I + II, J + IJ, IVEC) - AMP(II + 1, IJ + 1, IVEC) = PS(INDEX) - 10 CONTINUE - 20 CONTINUE - 30 CONTINUE - - RETURN - END - -C*************************************************** - INTEGER FUNCTION IPSGRD(IGRID, I, J, IVEC) - - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - IMPLICIT INTEGER*4 (I-N) - parameter (NUMPSG = 1) - COMMON /PSGRID/ PSGLX(NUMPSG), PSGUX(NUMPSG), - 1 PSGLY(NUMPSG), PSGUY(NUMPSG), - 1 ICNTPX(NUMPSG), ICNTPY(NUMPSG), NBASEP(NUMPSG) - - IPSGRD = NBASEP(IGRID) + - 1 3 * ((J - 1) * (ICNTPX(IGRID) + 1) + (I - 1)) + IVEC - - RETURN - END -C--------------------------------------------------------------------- - subroutine extract_name (name,i) - -C In f90, use trim(name) to truncate all spaces after the name. -C But "trim" were not available in f77. This is what this subroutine is for - - implicit none - integer*4 i - character name*80,scratch*80 - - do i=80,1,-1 - if (name(i:i) /= ' ') exit - enddo - scratch = name(1:i) - name = scratch - - return - end -C----------------------------------------------------------------------------------- - subroutine interprate_XYZ_record (record,x,y,z,name) - - implicit none - - integer*4 i,j,length - real*8 x,y,z - character name*80,record*120,record1*120,chars*120 - character xxxx*80,yyyy*80,zzzz*80 - - record1 = trim(adjustl(record)) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == ' ') then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get x or phi - - xxxx = '0' - do i=1,length - if (chars(i:i) == '1') then - xxxx(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (xxxx,*) x - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get y or lamda - - yyyy = '0' - do i=1,length - if (chars(i:i) == '1') then - yyyy(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (yyyy,*) y - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get z or h - - zzzz = '0' - do i=1,length - if (chars(i:i) == '1') then - zzzz(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (zzzz,*) z - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get name - - name = trim(record1) - -C Done - - return - end -C----------------------------------------------------------------------------------- - subroutine interprate_XYZVxVyVz_record (record,x,y,z,Vx,Vy,Vz, - & name) - - implicit none - - integer*4 i,j,length - real*8 x,y,z,Vx,Vy,Vz - character name*80,record*120,record1*120,chars*120 - character xxxx*80,yyyy*80,zzzz*80 - - record1 = trim(adjustl(record)) - length = len_trim(record1) - chars = ' ' - - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == ' ') then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get x or phi - - xxxx = '0' - do i=1,length - if (chars(i:i) == '1') then - xxxx(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (xxxx,*) x - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get y or lamda - - yyyy = '0' - do i=1,length - if (chars(i:i) == '1') then - yyyy(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (yyyy,*) y - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get z or h - - zzzz = '0' - do i=1,length - if (chars(i:i) == '1') then - zzzz(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (zzzz,*) z - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get Vx - - xxxx = '0' - do i=1,length - if (chars(i:i) == '1') then - xxxx(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (xxxx,*) Vx - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get Vy - - yyyy = '0' - do i=1,length - if (chars(i:i) == '1') then - yyyy(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (yyyy,*) Vy - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get z or h - - zzzz = '0' - do i=1,length - if (chars(i:i) == '1') then - zzzz(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (zzzz,*) Vz - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo -C Get name - - name = trim(record1) - -C Done - - return - end -C----------------------------------------------------------------------------------- - subroutine interprate_latlon_record (record,x,y,name) - - implicit none - - integer*4 i,j,length - real*8 x,y,z - character name*24,record*120,record1*120,chars*120 - character xxxx*80,yyyy*80,zzzz*80 - - record1 = trim(adjustl(record)) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == ' ') then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get x or phi - - xxxx = '0' - do i=1,length - if (chars(i:i) == '1') then - xxxx(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (xxxx,*) x - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get y or lamda - - yyyy = '0' - do i=1,length - if (chars(i:i) == '1') then - yyyy(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (yyyy,*) y - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get name - - name = trim(record1) - -C Done - - return - end -C----------------------------------------------------------------------------------- - subroutine interprate_velocity_record (record,x,y,vn,ve, - & vu,name) - - implicit none - - integer*4 i,j,length - real*8 x,y,vn,ve,vu - character name*80,record*120,record1*120,chars*120 - character xxxx*80,yyyy*80,vnnn*80,veee*80,vuuu*80 - - record1 = trim(adjustl(record)) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == ' ') then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get x or phi - - xxxx = '0' - do i=1,length - if (chars(i:i) == '1') then - xxxx(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) !adjust left then trim all trailing spaces - read (xxxx,*) x - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get y or lamda - - yyyy = '0' - do i=1,length - if (chars(i:i) == '1') then - yyyy(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (yyyy,*) y - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get vn - - vnnn = '0' - do i=1,length - if (chars(i:i) == '1') then - vnnn(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (vnnn,*) vn - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get ve - - veee = '0' - do i=1,length - if (chars(i:i) == '1') then - veee(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (veee,*) ve - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get vu - - vuuu = '0' - do i=1,length - if (chars(i:i) == '1') then - vuuu(i:i) = record1(i:i) - record1(i:i) = ' ' - elseif (chars(i:i) == '0') then - exit - endif - enddo - record = trim(adjustl(record1)) - read (vuuu,*) vu - if (record(1:1) == ',') then - record(1:1) = ' ' - endif - record1 = adjustl(record) - length = len_trim(record1) - chars = ' ' - do i=1,length - if (record1(i:i) == ' ' .or. record1(i:i) == ',' .or. - & record1(i:i) == " ") then - chars(i:i) = '0' - else - chars(i:i) = '1' - endif - enddo - -C Get name - - name = trim(record1) - -C Done - - return - end -C----------------------------------------------------------------------------------- - logical function am_I_in_or_near_CONUS (fi,la) - - implicit none - - integer*4 nrows,ncols,xcell,ycell,rec_num - integer*2 sea,code,code_UL,code_UR,code_LL,code_LR - real*8 fi,la,fi_max,la_min,dlamda,dfi,fi_min - real*8 fi1,la1,fi2,la2,la_max - - character grid*80 -c logical am_I_in_or_near_CONUS,CONUS_on_land - logical CONUS_on_land - -C Constants - - parameter (fi_max = 50.d0, - & fi_min = 23.5d0, - & la_min = 235.d0, - & la_max = 295.d0, - & sea = 0) - -C Initialize this function - - am_I_in_or_near_CONUS = .false. - -C If clearly outside Conus - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_CONUS = .true. - return - endif - - return - end -C----------------------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_AK(fi,la) - -C Given your latitude and longitude, this little routine tells you if you -C are in Alaska (AK) or within 10 km of its boundaries. - -C "AK_direct_cell_by_cell_1min" is an unformatted direct access file of nowrs*ncols records -C each record is of length 2 bytes (integer*2), which contains a geographic code defined as follows: - -C 1) The AK code is 278 -C 2) The codes for Canada are 265 to 276 -C 4) The code for sea is 0 - -C Geographic conditions to be in or near AK: - -C 1) The point is on land in AK - -C a) code is 278 - -C 2) In the Canada near the AK: - -C a) code = 265 to 276 -C c) Point is no more than 10km from AK - -C 3) In the sea near AK: - -C a) code = 0 -C c) Point is no more than 10km from AK - - implicit none - - integer*4 nrows,ncols,xcell,ycell,rec_num - integer*2 sea,code,code_UL,code_UR,code_LL,code_LR - real*8 fi,la,fi_max,dlamda,dfi,la_max - real*8 fi1,la1,fi2,la2,la_min,fi_min - - character grid*27,path*46 -c logical am_I_in_or_near_AK,AK_on_land - logical AK_on_land - -C Constants - - parameter (nrows = 1291, - & ncols = 3511, - & dfi = 1.d0/60.d0, - & dlamda = 1.d0/60.d0, - & fi_max = 71.5d0, - & fi_min = 50.d0, - & la_min = 172.d0, - & la_max = 230.5d0, - & sea = 0) - -C Initialize this function - - am_I_in_or_near_AK = .false. - -C When it is clearly not AK - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_AK = .true. - return - endif - -C On 1/22/2016 I disabled the following code following Giovanni's suggestion -C and for simplicity and portability - - return - end -C---------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_HI(fi,la) - -C Given your latitude and longitude, this little routine tells you if you -C are in the Hawaian Islands (Hawaii, Kahoolawe,Kauai,Lanai,Maui,Molokai, Nihau and Oahu) -C or within 5 km of their coastlines. - -C "HI_Hawaii.gmt", "HI_Kahoolawe.gmt", "HI_Kauai.gmt", "HI_Lanai.gmt", "HI_Maui.gmt", "HI_Molokai.gmt", -C "HI_Nihau.gmt" and "HI_Oahu.gmt" are ASCII files that contain coastline polygons for the islands. -C Each polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - implicit none - - integer*4 i,NPC,n_Hawaii,n_Kahoolawe,n_Kauai,n_Lanai,n_Maui - integer*4 n_Molokai,n_Nihau,n_Oahu - - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min -c logical am_I_in_or_near_HI,Hawaii,Kahoolawe,Kauai,Lanai - logical Hawaii,Kahoolawe,Kauai,Lanai - logical Maui,Molokai,Nihau,Oahu - logical UL,UR,LL,LR - -C Constants - - parameter (n_Hawaii = 329, - & n_Kahoolawe = 143, - & n_Kauai = 107, - & n_Lanai = 52, - & n_Maui = 205, - & n_Molokai = 114, - & n_Nihau = 68, - & n_Oahu = 123, - & fi_max = 24.d0, - & fi_min = 18.d0, - & la_min = 199.d0, - & la_max = 207.d0) - - real*8 X1(n_Hawaii) ,Y1(n_Hawaii) !I am not sure the cheap compilers in subversion can handle dynamic memory - real*8 X2(n_Kahoolawe) ,Y2(n_Kahoolawe) - real*8 X3(n_Kauai) ,Y3(n_Kauai) - real*8 X4(n_Lanai) ,Y4(n_Lanai) - real*8 X5(n_Maui) ,Y5(n_Maui) - real*8 X6(n_Molokai) ,Y6(n_Molokai) - real*8 X7(n_Nihau) ,Y7(n_Nihau) - real*8 X8(n_Oahu) ,Y8(n_Oahu) - -C Initialize this function - - am_I_in_or_near_HI = .false. - -C When it is clearly not HI - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_HI = .true. - return - endif - -C On 1/22/2016 I disabled the following code following Giovanni's suggestion -C and to simplify. - - return - end -C------------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_PR(fi,la) - -C Given your latitude and longitude, this little routine tells you if you -C are in Puerto Rico Islands (the main Island, Culebra, Desecheo, Mona or Viequez) -C or within 10 km of their coastlines. - -C "PR_PuertoRico.gmt", "PR_Culebra", "PR_Mona.gmt", "PR_Viequez.gmt", and PR_"Desecheo.gmt" -C are ASCII files that contain coastline polygons for each one of the 5 PR islands. -C Each polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - - implicit none - - integer*4 i,NPC,n_PR,n_Culebra,n_Mona,n_Desecheo,n_Viequez - - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min -c logical am_I_in_or_near_PR,PR - logical PR - logical Culebra,Mona,Desecheo,Viequez - logical UL,UR,LL,LR - -C Constants - - parameter (n_PR = 228, - & n_Culebra = 185, - & n_Mona = 52, - & n_Desecheo = 34, - & n_Viequez = 309, - & fi_max = 19.d0, - & fi_min = 17.d0, - & la_max = 295.d0, - & la_min = 292.d0) - - real*8 X1(n_PR) ,Y1(n_PR) !I am not sure the cheap compilers in subversion can handle dynamic memory - real*8 X2(n_Culebra) ,Y2(n_Culebra) - real*8 X3(n_Mona) ,Y3(n_Mona) - real*8 X4(n_Desecheo),Y4(n_Desecheo) - real*8 X5(n_Viequez) ,Y5(n_Viequez) - -C Initialize this function - - am_I_in_or_near_PR = .false. - -C When it is clearly not PR - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_PR = .true. - return - endif - -C On 1/22/2016 I disabled the following code following Giovanni's suggestion -C and for simplicity. - - return - end -C------------------------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_VQ(fi,la) - -C Given your latitude and longitude, this little routine tells you if you are in -C the Virgin Islands (St. Croix, St John and St Thomas) or within 10 km of their coastlines. - -C "VQ_StCroix.gmt", "VQ_StJohn.gmt" and "VQ_StThomas.gmt" are ASCII files that -C contain coastline polygons for each one of the 3 VQ islands. -C Each polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - - implicit none - - integer*4 i,NPC,n_VQ,n_StCroix,n_StJohn,n_StThomas - - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min -c logical am_I_in_or_near_VQ - logical StCroix,StJohn,StThomas - logical UL,UR,LL,LR - -C Constants - - parameter (n_StCroix = 142, - & n_StJohn = 356, - & n_StThomas = 304, - & fi_max = 18.4d0, - & fi_min = 15.5d0, - & la_max = 295.6d0, - & la_min = 295.d0) - - real*8 X1(n_StCroix) ,Y1(n_StCroix) !I am not sure the cheap compilers in subversion can handle dynamic memory - real*8 X2(n_StJohn ) ,Y2(n_StJohn ) - real*8 X3(n_StThomas),Y3(n_StThomas) - -C Initialize this function - - am_I_in_or_near_VQ = .false. - -C When it is clearly not VQ - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_VQ = .true. - return - endif - -C On 1/22/2016 the following code was disabled following Giovanni's suggestion -C and for simplicity - - return - end -C------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_CQ (fi,la) - -C Given your latitude and longitude, this little routine tells you if you are in -C the North Mariana Islands (Saipan, Tinian and Rota) or within 10 km of their coastlines. - -C "CQ_Rota.gmt", "CQ_Saipan.gmt" and "CQ_Tinian.gmt" are ASCII files that -C contain coastline polygons for each one of the 3 CQ islands. -C Each polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - - implicit none - - integer*4 i,NPC,n_CQ,n_Saipan ,n_Tinian,n_Rota - - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min -c logical am_I_in_or_near_CQ - logical Saipan,Tinian,Rota - logical UL,UR,LL,LR - -C Constants - - parameter (n_Saipan = 122, - & n_Tinian = 70, - & n_Rota = 80, - & fi_max = 15.6d0, - & fi_min = 13.8d0, - & la_max = 146.d0, - & la_min = 144.8d0) - - real*8 X1(n_Saipan ),Y1(n_Saipan ) !I am not sure the cheap compilers in subversion can handle dynamic memory - real*8 X2(n_Tinian ),Y2(n_Tinian ) - real*8 X3(n_Rota ),Y3(n_Rota ) - -C Initialize this function - - am_I_in_or_near_CQ = .false. - -C When it is clearly not CQ - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_CQ = .true. - return - endif - -C On 1/22/2016 the following code was disabled following Giovanni's suggestion -C and for simplicity - - return - end -C------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_AS(fi,la) - -C Given your latitude and longitude, this little routine tells you if you are in -C the American Samoa Islands (Ofu, Rose, Tau and Tutila) or within 10 km of their coastlines. - -C "AS_Ofu.gmt", "AS_Rose.gmt" and " AS_Tau.gmt" and "AS_Tutila.gmt" are ASCII files that -C contain coastline polygons for each one of the 4 AS islands. -C Each polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - - implicit none - - integer*4 i,NPC,n_AS,n_Ofu,n_Rose,n_Tau,n_Tutila - - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min -c logical am_I_in_or_near_AS - logical Ofu,Rose,Tau,Tutila - logical UL,UR,LL,LR - -C Constants - - parameter (n_Ofu = 64, - & n_Rose = 8, - & n_Tau = 76, - & n_Tutila = 239, - & fi_max = -13.7d0, - & fi_min = -14.7d0, - & la_max = 190.8d0, - & la_min = 189.d0) - - real*8 X1(n_Ofu ) ,Y1(n_Ofu ) !not sure the cheap compilers in subversion can handle dynamic memory - real*8 X2(n_Rose) ,Y2(n_Rose) - real*8 X3(n_Tau ) ,Y3(n_Tau ) - real*8 X4(n_Tutila),Y4(n_Tutila) - -C Initialize this function - - am_I_in_or_near_AS = .false. - -C When it is clearly not AS - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_AS = .true. - return - endif - -C On 1/22/2016 the following code was disabled following Giovanni's suggestion -C and for simplicity - - return - end -C------------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_Guam(fi,la) - -C Given your latitude and longitude, this little routine tells you if you are in -C the Guam Island or within 5 km of its coastlines. - -C "GQ_Guam.gmt", is an ASCII file that contains coastline polygons Guam. -C This polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - - implicit none - - integer*4 i,NPC,n_GQ - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min -c logical am_I_in_or_near_Guam - logical GQ - logical UL,UR,LL,LR - -C Constants - - parameter (n_GQ = 300, - & fi_max = 13.7d0, - & fi_min = 13.d0, - & la_max = 145.d0, - & la_min = 144.5d0) - - real*8 X1(n_GQ) ,Y1(n_GQ) !I am not sure the cheap compilers in subversion can handle dynamic memory - -C Initialize this function - - am_I_in_or_near_Guam = .false. - -C When it is clearly not Guam - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_Guam = .true. - return - endif - -C On 1/22/2016 the following code was disabled following Giovanni's suggestion -C and for simplicity - - return - end -C---------------------------------------------------------------------------------------------- - logical function am_I_in_or_near_KW(fi,la) - -C Given your latitude and longitude, this little routine tells you if you are in -C the a little square around Kwajalein of the Marshal islands - -C "Kwajalein.gmt", is an ASCII file that contains a rectangle around Kwajalein. -C This polygon is closed, starts and ends at the same point. -C File format: (East) longitude and latitude in decimal degrees. - - - implicit none - - integer*4 i,NPC,n_KW - - real*8 fi,la,fi1,la1,fi2,la2,fi_max,fi_min,la_max,la_min - -c logical am_I_in_or_near_KW - logical KW - logical UL,UR,LL,LR - -C Constants - - parameter (n_KW = 5, - & fi_max = 10.5d0, - & fi_min = 5.d0 , - & la_max = 174.d0, - & la_min = 165.7d0) - - real*8 X1(n_KW) ,Y1(n_KW) !I am not sure the cheap compilers in subversion can handle dynamic memory - -C Initialize this function - - am_I_in_or_near_KW = .false. - -C When it is clearly not KW - - if (fi>fi_max.or.fi<fi_min.or.la>la_max.or.la<la_min) then - return - else - am_I_in_or_near_KW = .true. - return - endif - -C On 1/22/2016 the following code was disabled following Giovanni's suggestion -C and for simplicity - - return - end |