MODULE module_gpspw_gst !------------------------------------------------------------------------------! ! Read in integrated precipitable water measurement from GPS stations coming ! from GST (gem file). ! ! F. VANDENBERGHE, March 2001 !------------------------------------------------------------------------------! USE module_date USE module_type USE module_inside USE module_per_type !------------------------------------------------------------------------------! ! Maximum Number of stations to be read INTEGER, PARAMETER :: nstations = 62 ! Format of GPS precipitable water observations CHARACTER (LEN=80) :: fmt_read PARAMETER (fmt_read = '(1X,A4,2X,A13,2X,F6.2,5(2X,F6.1),:)') ! Missing flag at reading REAL, PARAMETER :: missing_read = -9999.0 ! Data structure for input file reading TYPE station_gpspw_gst CHARACTER (LEN = 4) :: name CHARACTER (LEN = 13) :: date REAL :: pw_mm REAL :: err_pw REAL :: zwd_mm REAL :: pres_mb REAL :: tem_c REAL :: rh END TYPE station_gpspw_gst CONTAINS !------------------------------------------------------------------------------! SUBROUTINE read_gpspw_gst (filename, filenum, obs, n_obs, & total_number_of_obs, fatal_if_exceed_max_obs, & time_window_min, time_analysis, time_window_max,& ins, jew, missing_flag, print_gpspw_read) !------------------------------------------------------------------------------! IMPLICIT NONE CHARACTER (LEN=*), INTENT (in) :: filename INTEGER, INTENT (in) :: filenum INTEGER, INTENT (inout) :: n_obs INTEGER, INTENT (in) :: total_number_of_obs LOGICAL, INTENT (iN) :: fatal_if_exceed_max_obs TYPE (report), DIMENSION (:), INTENT (out) :: obs INTEGER, INTENT (in) :: ins, jew CHARACTER (LEN = 19), INTENT (in) :: time_window_min CHARACTER (LEN = 19), INTENT (in) :: time_analysis CHARACTER (LEN = 19), INTENT (in) :: time_window_max REAL, INTENT (out) :: missing_flag LOGICAL, INTENT (in) :: print_gpspw_read CHARACTER (LEN = 80) :: header CHARACTER (LEN = 19) :: date_mm5 CHARACTER (LEN = 14) :: date_char CHARACTER (LEN = 4) :: previous_name LOGICAL :: outside_domain LOGICAL :: outside_window LOGICAL :: outside, fatal INTEGER :: is, io_error INTEGER :: obs_num, ilines INTEGER :: num_empty, num_outside INTEGER :: num_unknown INTEGER :: ccyy, mm, dd, julian REAL :: lat, lon, elv REAL :: yic, xjc, yid, xjd CHARACTER (LEN = 80) :: file_name CHARACTER (LEN = 32), PARAMETER :: proc_name ='read_gpspw_gst ' CHARACTER ( LEN = 160) :: error_message INTEGER :: iunit TYPE (station_gpspw_gst) :: read_level INCLUDE 'missing.inc' !------------------------------------------------------------------------------! WRITE (UNIT = 0, FMT = '(A)') & "------------------------------------------------------------------------------" WRITE (UNIT = 0, FMT = '(A,A,/)') & "READ GPS OBSERVATIONS IN FILE: ", TRIM (filename) ! 0. OPEN DIGANOSTIC FILE ! ======================== IF (print_gpspw_read) THEN file_name = 'obs_gpspw_read.diag' iunit = 999 OPEN (UNIT = iunit , FILE = file_name , FORM = 'FORMATTED' , & ACTION = 'WRITE' , STATUS = 'REPLACE', IOSTAT = io_error ) IF (io_error .NE. 0 ) THEN CALL error_handler (331001, proc_name(1:32) // & "Unable to open output diagnostic file " // TRIM (file_name), & .true., .false.) ELSE WRITE (UNIT = 0, FMT = '(A,A,/)') & "Diagnostics in file ", TRIM (file_name) ENDIF ENDIF ! 1. OPEN INPUT FILE AND READ HEADER ! ================================== ! 1.1 Open input file ! --------------- OPEN (UNIT = filenum, FILE = filename, FORM='formatted', ACTION = 'read',& IOSTAT = io_error) IF (io_error .NE. 0 ) THEN CALL error_handler (331001, proc_name(1:32) // & "Unable to open input file " // TRIM (filename), .true., .false.) ENDIF ! 1.2 Skip first line header ! ---------------------- REWIND (filenum) READ (UNIT = filenum, FMT = '(A)', IOSTAT = io_error) header ! One line read ilines = 1 ! 2. READ DATA ! ============= ! 2.1 Reset read variables ! -------------------- previous_name = "****" obs_num = n_obs num_empty = 0 num_outside = 0 num_unknown = 0 ! 2. READ PW DATA: ! ================= read_obs:& DO WHILE (io_error .EQ. 0) ! 2.1 Read first time level of station ! -------------------------------- READ (UNIT = filenum, FMT = fmt_read, IOSTAT = io_error) read_level ! WRITE (UNIT = iunit, FMT = fmt_read) read_level IF (io_error /= 0 ) THEN EXIT read_obs ENDIF ! 1 line read ilines = ilines + 1 ! 2.2 Station code ! ------------ CALL name_to_number (is, read_level % name, lat, lon, elv) ! 2.3 If code unrecognized skip it ! ---------------------------- IF ((is .LE. 0) .OR. (is .GT. nstations)) THEN IF ((print_gpspw_read) .AND. & (read_level % name /= previous_name)) THEN WRITE (UNIT = iunit, FMT = '(A,A5,2X,A5,18X,2F9.3,1X,A)') & 'Found Name and ID =' , & TRIM (read_level % name), 'GTS00', lat, lon, '=> UNNOWN' num_unknown = num_unknown + 1 previous_name = read_level % name ENDIF CYCLE read_obs ENDIF ! 2.5 Correct date (remove 60mn, 24h etc.) ! ------------------------------------ CALL correct_date (read_level % date) ! 2.6 Record date at format CCYYMMDDHH AND CCYY-MM-DD_HH:MN:SS ! --------------------------------------------------------- WRITE (date_char,& '(A4,A2,A2,A2,A2,A2)') & read_level % date (1:4), read_level % date (5:6), & read_level % date (7:8), read_level % date (10:11),& read_level % date (12:13), '00' WRITE (date_mm5,& '(A4,"-",A2,"-",A2,"_",A2,":",A2,":"A2)') & read_level % date (1:4), read_level % date (5:6), & read_level % date (7:8), read_level % date (10:11),& read_level % date (12:13), '00' ! 2.7 Julian days ! ----------- READ (read_level % date (1:4),'(I2)') ccyy READ (read_level % date (5:6),'(I2)') mm READ (read_level % date (7:8),'(I2)') dd CALL julian_day (ccyy,mm,dd,julian,1) ! 2.8 Check domain and time window ! ---------------------------- CALL inside_domain (lat, lon, ins , jew , outside_domain , & xjc, yic, xjd, yid) CALL inside_window (date_char, time_window_min, time_window_max, & outside_window, iunit) outside = outside_domain .OR. outside_window ! 2.9 If station is not in domain or record not within time window, skip it ! --------------------------------------------------------------------- IF (outside) THEN num_outside = num_outside + 1 CYCLE read_obs ENDIF ! 2.10 If station is empty, skip it ! ---------------------------- IF (read_level % pw_mm <= missing_read) then num_empty = num_empty + 1 CYCLE read_obs ENDIF ! 2.11 If station is in domain and record within time window and can be stored ! ----------------------------------------------------------------------- IF ((obs_num .GE. total_number_of_obs) .AND. & (fatal_if_exceed_max_obs)) THEN error_message(1:60) = & 'Too many obs for the NAMELIST value of max_number_of_obs = ' WRITE (error_message(61:67),'(I7)') total_number_of_obs fatal = .TRUE. CALL error_handler (proc_name, & error_message (1:60), error_message (61:),fatal) ELSE IF ((obs_num .GE. total_number_of_obs) .AND. & (.NOT. fatal_if_exceed_max_obs)) THEN error_message(1:60) = & 'Too many obs for the NAMELIST value of max_number_of_obs = ' WRITE (error_message(61:67),'(I7)') total_number_of_obs fatal = .FALSE. CALL error_handler (proc_name, & error_message (1:60), error_message (61:),fatal) CLOSE ( iunit ) IF (print_gpspw_read) CLOSE ( iunit ) EXIT read_obs END IF ! 2.12 If station is in domain and record within time window, store it ! --------------------------------------------------------------- obs_num = obs_num + 1 ! 2.13 Station name, ID and location ! ---------------------------- WRITE (obs (obs_num) % location % id, '(A3,I2)') 'GTS',is obs (obs_num) % location % name = TRIM (read_level % name) obs (obs_num) % location % latitude = lat obs (obs_num) % location % longitude = lon obs (obs_num) % location % xjc = xjc obs (obs_num) % location % xjd = xjd obs (obs_num) % location % yic = yic obs (obs_num) % location % yid = yid ! 2.14 Station general info ! -------------------- obs (obs_num) % info % platform = 'FM-111 GPSPW' obs (obs_num) % info % source = 'TWP FROM GST' obs (obs_num) % info % elevation = elv obs (obs_num) % info % discard = .false. obs (obs_num) % info % is_sound = .false. ! 2.15 Record date and time ! -------------------- obs (obs_num) % valid_time % date_char = date_char obs (obs_num) % valid_time % date_mm5 = date_mm5 obs (obs_num) % valid_time % julian = julian ! 2.16 Total precipitable water from mm to cm ! -------------------------------------- IF (read_level % pw_mm <= missing_read) then num_empty = num_empty + 1 obs(obs_num) % ground % pw % data = missing_r obs(obs_num) % ground % pw % qc = missing obs(obs_num) % ground % pw % error = missing_r ELSE obs(obs_num) % ground % pw % data = read_level % pw_mm / 10. obs(obs_num) % ground % pw % qc = 0 obs(obs_num) % ground % pw % error = read_level % err_pw / 10. ENDIF ! 2.17 Set sea level pressure to surface pressure ! ------------------------------------------ IF (read_level % pres_mb <= missing_read) then obs(obs_num) % ground % slp % data = missing_r obs(obs_num) % ground % slp % qc = missing obs(obs_num) % ground % slp % error = missing_r ELSE obs(obs_num) % ground % slp % data = read_level % pres_mb * 100. obs(obs_num) % ground % slp % qc = 0 obs(obs_num) % ground % slp % error = 200. ENDIF ! 2.20 There's no upper level for GPSPW, unlink pointer ! ------------------------------------------------ NULLIFY (obs (obs_num) % surface) ! 2.21 Print station information ! ------------------------- IF ((print_gpspw_read) .AND. & (read_level % name /= previous_name)) THEN WRITE (UNIT = iunit, FMT = '(A,A5,1X,A23,2F9.3,1X,A)') & 'Found Name and ID = ' , & obs (obs_num) % location % name, & obs (obs_num) % location % id, & obs (obs_num) % location % latitude, & obs (obs_num) % location % longitude, & '=> GPS PW' ENDIF previous_name = read_level % name ENDDO read_obs ! 3. READ IS COMPLETE, CLOSE INPUT FILE AND WRITE DIAGNOSTIC ! =========================================================== ! 3.1 Close input file ! ---------------- WRITE (UNIT = 0, FMT = '(A)') 'Have reached end of observations file.' CLOSE (filenum) ! 3.2 Total number of observation accumulated per type ! ------------------------------------------------ ngpspws (icor+0) = obs_num+num_empty+num_outside-n_obs ngpspws (icor+1) = num_empty ngpspws (icor+2) = num_outside ! 3.3 Print number of reports ! ----------------------- WRITE (UNIT = 0, FMT = '(/,A)') & '------------------------------------------------------------------------------' WRITE (UNIT = 0, FMT = '(A)') 'GPS PW OBSERVATIONS READ:' WRITE (UNIT = 0,FMT = '(/,A,I6)') & 'Number of gpspw reports: ',ngpspws (icor) WRITE (UNIT = 0 , FMT = '(/,4(A,I8,/))' ) & "Number of observations read: ",obs_num+ & num_empty+ & num_outside-& n_obs, & "Number of empty observations: ",num_empty, & "Number of out of domain observations: ",num_outside,& "Number of observations for ingestion: ",obs_num-n_obs ! 3.4 Total number of observation accumulated ! --------------------------------------- n_obs = obs_num ! 3.5 Update missing data flag ! ------------------------ missing_flag = missing_r ! 3.6 Close diagnostic file, if open ! ------------------------------ IF (print_gpspw_read) CLOSE (iunit) END SUBROUTINE read_gpspw_gst !------------------------------------------------------------------------------! SUBROUTINE CORRECT_DATE (DATE) CHARACTER (LEN = 13) :: DATE SELECT CASE (DATE (10:13)) CASE ('0060'); DATE (10:13) = '0100' CASE ('0160'); DATE (10:13) = '0200' CASE ('0260'); DATE (10:13) = '0300' CASE ('0360'); DATE (10:13) = '0400' CASE ('0460'); DATE (10:13) = '0500' CASE ('0560'); DATE (10:13) = '0600' CASE ('0660'); DATE (10:13) = '0700' CASE ('0760'); DATE (10:13) = '0800' CASE ('0860'); DATE (10:13) = '0900' CASE ('0960'); DATE (10:13) = '1000' CASE ('1060'); DATE (10:13) = '1100' CASE ('1160'); DATE (10:13) = '1200' CASE ('1260'); DATE (10:13) = '1300' CASE ('1360'); DATE (10:13) = '1400' CASE ('1460'); DATE (10:13) = '1500' CASE ('1560'); DATE (10:13) = '1600' CASE ('1660'); DATE (10:13) = '1700' CASE ('1760'); DATE (10:13) = '1800' CASE ('1860'); DATE (10:13) = '1900' CASE ('1960'); DATE (10:13) = '2000' CASE ('2060'); DATE (10:13) = '2100' CASE ('2160'); DATE (10:13) = '2200' CASE ('2260'); DATE (10:13) = '2300' CASE ('2360'); WRITE (0,'(/,A,A,/)') ' Cannot correct date ', TRIM (date) END SELECT RETURN END SUBROUTINE CORRECT_DATE !------------------------------------------------------------------------------! SUBROUTINE number_to_name (is,nam,lat,lon,elv) INTEGER :: is CHARACTER (LEN = 8) :: nam REAL :: lat, lon, elv ! '(A9,3(A8;13.8)' !SITE LAT LON MSL[m] +- 7 cm SELECT CASE (is) ! name="cors.msl" CASE ( 1); nam = 'CCV3'; lat = 28.46022742; lon = -80.54523032; elv = 5.73440000 CASE ( 2); nam = 'MOB1'; lat = 30.22751840; lon = -88.02410277; elv = 9.31860000 CASE ( 3); nam = 'MNP1'; lat = 41.06710924; lon = -71.86044494; elv = 21.34320000 CASE ( 4); nam = 'ARP3'; lat = 27.83835188; lon = -97.05895714; elv = 10.35250000 CASE ( 5); nam = 'GAL1'; lat = 29.32988075; lon = -94.73680822; elv = 9.93060000 CASE ( 6); nam = 'ENG1'; lat = 29.87896260; lon = -89.94172710; elv = 7.80510000 CASE ( 7); nam = 'EKY1'; lat = 27.60041756; lon = -82.76032221; elv = 7.36550000 CASE ( 8); nam = 'MLF1'; lat = 32.09026075; lon = -87.39181193; elv = 37.15070000 CASE ( 9); nam = 'MIA3'; lat = 25.73280971; lon = -80.16016933; elv = 11.71400000 CASE (10); nam = 'MEM2'; lat = 35.46570750; lon = -90.20604725; elv = 74.79740000 CASE (11); nam = 'VIC1'; lat = 32.33141910; lon = -90.91979003; elv = 36.74060000 CASE (12); nam = 'SHK1'; lat = 40.47149210; lon = -74.01159656; elv = 8.28870000 CASE (13); nam = 'KYW1'; lat = 24.58227239; lon = -81.65303210; elv = 10.03320000 CASE (14); nam = 'CHA1'; lat = 32.75756603; lon = -79.84287364; elv = 5.41540000 CASE (15); nam = 'FMC1'; lat = 34.69739589; lon = -76.68311967; elv = 23.57790000 CASE (16); nam = 'MIA4'; lat = 25.73280980; lon = -80.16016956; elv = 11.72390000 CASE (17); nam = 'MOR1'; lat = 40.78952494; lon = -72.74628989; elv = 8.12490000 CASE (18); nam = 'DRV1'; lat = 36.95865624; lon = -76.55664184; elv = 13.90030000 CASE (19); nam = 'CLK1'; lat = 44.93562098; lon = -97.96068617; elv = 438.95100000 CASE (20); nam = 'WHN1'; lat = 42.73931476; lon = -103.32877941; elv = 1069.94000000 CASE (21); nam = 'SAV1'; lat = 32.13859989; lon = -81.69633426; elv = 39.46080000 CASE (22); nam = 'BLKV'; lat = 37.20601771; lon = -80.41452462; elv = 637.70400000 !name=ffsl.llh" CASE (23); nam = 'NLGN'; lat = 42.20674343; lon = -97.79529896 ; elv = 523.03000000 CASE (24); nam = 'SLAI'; lat = 41.90058327; lon = -93.69887039 ; elv = 317.44000000 CASE (25); nam = 'LMNO'; lat = 36.68544654; lon = -97.48073652 ; elv = 306.45000000 CASE (26); nam = 'AZCN'; lat = 36.83979329; lon = -107.91096134; elv = 1881.19000000 CASE (27); nam = 'BLK0'; lat = 37.20601771; lon = -80.41452462; elv = 637.62000000 CASE (28); nam = 'BLMM'; lat = 36.87978303; lon = -89.97252840; elv = 128.19000000 CASE (29); nam = 'BLRW'; lat = 43.23025339; lon = -90.53077843; elv = 222.27000000 CASE (30); nam = 'CNWM'; lat = 37.52283396; lon = -92.70349065; elv = 388.02000000 CASE (31); nam = 'DQUA'; lat = 34.11065741; lon = -94.28989785; elv = 196.58000000 CASE (32); nam = 'DSRC'; lat = 39.99143134; lon = -105.26103159; elv = 1669.06000000 CASE (33); nam = 'FBYN'; lat = 40.07687182; lon = -97.31281998; elv = 430.46000000 CASE (34); nam = 'GDAC'; lat = 37.77545215; lon = -102.18001253; elv = 1155.85000000 CASE (35); nam = 'HBRK'; lat = 38.30464964; lon = -97.29352379; elv = 439.85000000 CASE (36); nam = 'HKLO'; lat = 35.68275454; lon = -95.86338381; elv = 218.93000000 CASE (37); nam = 'HVLK'; lat = 37.65146778; lon = -99.10675913; elv = 646.27000000 CASE (38); nam = 'JTNT'; lat = 33.01720036; lon = -100.97714513; elv = 709.24000000 CASE (39); nam = 'LKWY'; lat = 44.56507693; lon = -110.40021843; elv = 2430.74000000 CASE (40); nam = 'LTHM'; lat = 39.57595873; lon = -94.17015452; elv = 293.41000000 CASE (41); nam = 'MBWW'; lat = 41.90358636; lon = -106.18653971; elv = 1996.07000000 CASE (42); nam = 'MRRN'; lat = 42.90428687; lon = -101.69641978; elv = 988.53000000 CASE (43); nam = 'NDBC'; lat = 30.35628084; lon = -89.61027680; elv = 14.37000000 CASE (44); nam = 'NDSK'; lat = 37.38077849; lon = -95.63823621; elv = 254.72000000 CASE (45); nam = 'OKOM'; lat = 34.09026377; lon = -88.86247819; elv = 131.87000000 CASE (46); nam = 'PATT'; lat = 31.77827283; lon = -95.71850951; elv = 119.80000000 CASE (47); nam = 'PLTC'; lat = 40.18159312; lon = -104.72593635; elv = 1518.71000000 CASE (48); nam = 'PRCO'; lat = 34.97986594; lon = -97.51924837; elv = 329.58000000 CASE (49); nam = 'RWDN'; lat = 40.08670106; lon = -100.65348014; elv = 796.73000000 CASE (50); nam = 'SEAW'; lat = 47.68700546; lon = -122.25630089; elv = 16.42000000 CASE (51); nam = 'SIO3'; lat = 32.86470196; lon = -117.25040572; elv = 69.58000000 CASE (52); nam = 'SYCN'; lat = 43.11572518; lon = -76.09339750; elv = 122.14000000 CASE (53); nam = 'TCUN'; lat = 35.08501981; lon = -103.60911953; elv = 1240.06000000 CASE (54); nam = 'VCIO'; lat = 36.07170788; lon = -99.21731449; elv = 650.17000000 CASE (55); nam = 'WDLM'; lat = 44.67221307; lon = -95.44858064; elv = 319.43000000 CASE (56); nam = 'WLCI'; lat = 40.80840811; lon = -87.05198607; elv = 212.42000000 CASE (57); nam = 'WNCI'; lat = 39.66461362; lon = -90.47674775; elv = 172.03000000 CASE (58); nam = 'WNFL'; lat = 31.89722826; lon = -92.78191095; elv = 92.70000000 CASE (59); nam = 'WSMN'; lat = 32.40713676; lon = -106.34982961; elv = 1226.17000000 CASE (60); nam = 'CENA'; lat = 65.49816527; lon = -144.67763059; elv = 271.78000000 CASE (61); nam = 'GNAA'; lat = 62.11238351; lon = -145.97021718; elv = 584.78000000 CASE (62); nam = 'TLKA'; lat = 62.30765593; lon = -150.42029462; elv = 151.28000000 CASE DEFAULT; nam = '0000'; lat = 0.00000000; lon = 0.00000000; elv = 0.00000000 ! WRITE (0,'(A,I3)') ' Unknown station sequence number ',is ! STOP ' in station_sequence' END SELECT RETURN END SUBROUTINE number_to_name !------------------------------------------------------------------------------! SUBROUTINE name_to_number (is,nam,lat,lon,elv) CHARACTER (LEN = 4) :: nam INTEGER :: is REAL :: lat, lon, elv ! '(A9,3(A8;13.8)' !SITE LAT LON MSL[m] +- 7 cm SELECT CASE (nam) ! name="cors.msl" CASE ('CCV3'); is = 1; lat = 28.46022742; lon = -80.54523032; elv = 5.73440000 CASE ('MOB1'); is = 2; lat = 30.22751840; lon = -88.02410277; elv = 9.31860000 CASE ('MNP1'); is = 3; lat = 41.06710924; lon = -71.86044494; elv = 21.34320000 CASE ('ARP3'); is = 4; lat = 27.83835188; lon = -97.05895714; elv = 10.35250000 CASE ('GAL1'); is = 5; lat = 29.32988075; lon = -94.73680822; elv = 9.93060000 CASE ('ENG1'); is = 6; lat = 29.87896260; lon = -89.94172710; elv = 7.80510000 CASE ('EKY1'); is = 7; lat = 27.60041756; lon = -82.76032221; elv = 7.36550000 CASE ('MLF1'); is = 8; lat = 32.09026075; lon = -87.39181193; elv = 37.15070000 CASE ('MIA3'); is = 9; lat = 25.73280971; lon = -80.16016933; elv = 11.71400000 CASE ('MEM2'); is = 10; lat = 35.46570750; lon = -90.20604725; elv = 74.79740000 CASE ('VIC1'); is = 11; lat = 32.33141910; lon = -90.91979003; elv = 36.74060000 CASE ('SHK1'); is = 12; lat = 40.47149210; lon = -74.01159656; elv = 8.28870000 CASE ('KYW1'); is = 13; lat = 24.58227239; lon = -81.65303210; elv = 10.03320000 CASE ('CHA1'); is = 14; lat = 32.75756603; lon = -79.84287364; elv = 5.41540000 CASE ('FMC1'); is = 15; lat = 34.69739589; lon = -76.68311967; elv = 23.57790000 CASE ('MIA4'); is = 16; lat = 25.73280980; lon = -80.16016956; elv = 11.72390000 CASE ('MOR1'); is = 17; lat = 40.78952494; lon = -72.74628989; elv = 8.12490000 CASE ('DRV1'); is = 18; lat = 36.95865624; lon = -76.55664184; elv = 13.90030000 CASE ('CLK1'); is = 19; lat = 44.93562098; lon = -97.96068617; elv = 438.95100000 CASE ('WHN1'); is = 20; lat = 42.73931476; lon = -103.32877941; elv = 1069.94000000 CASE ('SAV1'); is = 21; lat = 32.13859989; lon = -81.69633426; elv = 39.46080000 CASE ('BLKV'); is = 22; lat = 37.20601771; lon = -80.41452462; elv = 637.70400000 !name=ffsl.llh" CASE ('NLGN'); is = 23; lat = 42.20674343; lon = -97.79529896 ; elv = 523.03000000 CASE ('SLAI'); is = 24; lat = 41.90058327; lon = -93.69887039 ; elv = 317.44000000 CASE ('LMNO'); is = 25; lat = 36.68544654; lon = -97.48073652 ; elv = 306.45000000 CASE ('AZCN'); is = 26; lat = 36.83979329; lon = -107.91096134; elv = 1881.19000000 CASE ('BLK0'); is = 27; lat = 37.20601771; lon = -80.41452462; elv = 637.62000000 CASE ('BLMM'); is = 28; lat = 36.87978303; lon = -89.97252840; elv = 128.19000000 CASE ('BLRW'); is = 29; lat = 43.23025339; lon = -90.53077843; elv = 222.27000000 CASE ('CNWM'); is = 30; lat = 37.52283396; lon = -92.70349065; elv = 388.02000000 CASE ('DQUA'); is = 31; lat = 34.11065741; lon = -94.28989785; elv = 196.58000000 CASE ('DSRC'); is = 32; lat = 39.99143134; lon = -105.26103159; elv = 1669.06000000 CASE ('FBYN'); is = 33; lat = 40.07687182; lon = -97.31281998; elv = 430.46000000 CASE ('GDAC'); is = 34; lat = 37.77545215; lon = -102.18001253; elv = 1155.85000000 CASE ('HBRK'); is = 35; lat = 38.30464964; lon = -97.29352379; elv = 439.85000000 CASE ('HKLO'); is = 36; lat = 35.68275454; lon = -95.86338381; elv = 218.93000000 CASE ('HVLK'); is = 37; lat = 37.65146778; lon = -99.10675913; elv = 646.27000000 CASE ('JTNT'); is = 38; lat = 33.01720036; lon = -100.97714513; elv = 709.24000000 CASE ('LKWY'); is = 39; lat = 44.56507693; lon = -110.40021843; elv = 2430.74000000 CASE ('LTHM'); is = 40; lat = 39.57595873; lon = -94.17015452; elv = 293.41000000 CASE ('MBWW'); is = 41; lat = 41.90358636; lon = -106.18653971; elv = 1996.07000000 CASE ('MRRN'); is = 42; lat = 42.90428687; lon = -101.69641978; elv = 988.53000000 CASE ('NDBC'); is = 43; lat = 30.35628084; lon = -89.61027680; elv = 14.37000000 CASE ('NDSK'); is = 44; lat = 37.38077849; lon = -95.63823621; elv = 254.72000000 CASE ('OKOM'); is = 45; lat = 34.09026377; lon = -88.86247819; elv = 131.87000000 CASE ('PATT'); is = 46; lat = 31.77827283; lon = -95.71850951; elv = 119.80000000 CASE ('PLTC'); is = 47; lat = 40.18159312; lon = -104.72593635; elv = 1518.71000000 CASE ('PRCO'); is = 48; lat = 34.97986594; lon = -97.51924837; elv = 329.58000000 CASE ('RWDN'); is = 49; lat = 40.08670106; lon = -100.65348014; elv = 796.73000000 CASE ('SEAW'); is = 50; lat = 47.68700546; lon = -122.25630089; elv = 16.42000000 CASE ('SIO3'); is = 51; lat = 32.86470196; lon = -117.25040572; elv = 69.58000000 CASE ('SYCN'); is = 52; lat = 43.11572518; lon = -76.09339750; elv = 122.14000000 CASE ('TCUN'); is = 53; lat = 35.08501981; lon = -103.60911953; elv = 1240.06000000 CASE ('VCIO'); is = 54; lat = 36.07170788; lon = -99.21731449; elv = 650.17000000 CASE ('WDLM'); is = 55; lat = 44.67221307; lon = -95.44858064; elv = 319.43000000 CASE ('WLCI'); is = 56; lat = 40.80840811; lon = -87.05198607; elv = 212.42000000 CASE ('WNCI'); is = 57; lat = 39.66461362; lon = -90.47674775; elv = 172.03000000 CASE ('WNFL'); is = 58; lat = 31.89722826; lon = -92.78191095; elv = 92.70000000 CASE ('WSMN'); is = 59; lat = 32.40713676; lon = -106.34982961; elv = 1226.17000000 CASE ('CENA'); is = 60; lat = 65.49816527; lon = -144.67763059; elv = 271.78000000 CASE ('GNAA'); is = 61; lat = 62.11238351; lon = -145.97021718; elv = 584.78000000 CASE ('TLKA'); is = 62; lat = 62.30765593; lon = -150.42029462; elv = 151.28000000 CASE DEFAULT; is = 0; lat = 0.00000000; lon = 0.00000000; elv = 0.00000000 ! WRITE (0,'(A,A4)') ' Unknown station sequence name ',nam ! STOP ' in station_sequence' END SELECT RETURN END SUBROUTINE name_to_number !------------------------------------------------------------------------------! END MODULE module_gpspw_gst