C Written by Shunrong Zhang C Imported into Madrigal from modelRecovery/fullAnalytic/ C isrim.f on 10/21/2005 - Was revision 1.6 C C Modified to change COEFDIR to Madrigal path, added comment C on 4 = ion drift C C $Id: isrim.f 3375 2011-05-11 17:00:38Z brideout $ C C SUBROUTINE ISRIM(KINST,DOY,SLT,ALT,GLAT,F107,AP,IPAR,OUTPUT) C C INCOHERENT SCATTER RADAR IONOSPHERIC MODEL (ISRIM) C C ISRIMs have been developed from long-term datasets of seven C incoherent scatter radars spanning invariant latitudes from C 25 to 75 degrees in American, European and Asian longitudes C at Svalbard, Tromso, Sondrestrom, Millstone Hill, St. Santin, C Arecibo and Shigaraki. These models represent electron density, C ion and electron temperatures, and ion drifts in the E and F C regions, giving a comprehensive quantitative description of C ionospheric properties. C C REFERENCES C C Zhang, S.-R., J. M. Holt, A. P. van Eyken, M. McCready, C. C Amory-Mazaudier, S. Fukao, and M. Sulzer, Ionospheric local model C and climatology from long-term databases of multiple incoherent C scatter radars, Geophys. Res. Lett. 32, L20102, doi:10.1029/ C 2005GL023603, 2005. C C Zhang, S.-R., J. M. Holt, A. M. Zalucha, and C. Amory-Mazaudier, C Mid-latitude ionospheric plasma temperature climatology and C empirical model based on Saint Santin incoherent scatter radar data C from 1966-1987, J. Geophys. Res., 109, A11311, C doi:10.1029/2004JA010709, 2004. C C Holt, J. M., S.-R. Zhang, and M. J. Buonsanto, Regional and local C ionospheric models based on Millstone Hill incoherent scatter radar C data, Geophys. Res. Lett.,, 29(8), 10.1029/2002GL014678, 2002. C C C ONLINE VERSION C C http://madrigal.haystack.mit.edu/models/ C C C CONTACT INFO C C Dr. Shun-Rong Zhang (shunrong@haystack.mit.edu) C Dr. John M. Holt C MIT Haystack Observatory C Route 40, C Westford, MA 01886 C USA C PHONE: 781-981-5725; FAX: 781-981-5766 C C C REVISIONS C C Updated by SRZ, MAY 2007 -- C ALLOW FOR KINST = 30 FOR MH LOCAL MODEL C C Updated by SRZ, October 2005 -- C READ IN ALL COEFFICIENT FILES, INSTEAD OF READING IN C AS NEEDED FOR A SPECIFIC PARAMETER. THIS CHANGE IS TO ACCOMMODATE C THE MADRIGAL APPLICATIONS TO IMPROVE EFFICIENCY WHEN MULTIPLE C PARAMETERS ARE COMPUTERED. C C Updated by SRZ, May 2005 --- C ADD KINST (INSTRUMENT CODE); REMOVE THE FUNCTION OF OUTPUT(5) C C FIRST Version by SRZ, July 2002 --- C MILLSTONE HILL IONOSPHERIC MODEL C THIS SUBROUTINE RETURNS IONOSPHERIC PARAMETERS (NE, TE, AND TI) C BASED ON MILLSTONE HILL INCOHERENT SCATTER RADAR OBSERVATION MADE C DURING 1976-2001. C C C INPUTS C C KINST - STATION/INSTRUMENT CODE C 31 -> MILLSTONE HILL STEERABLE (regional model) C 32 -> MILLSTONE HILL ZENITH (local model) C 30 -> MILLSTONE HILL ZENITH (local model) C !! 10 -> JICAMARCA - NOT AVAILABLE!! C 20 -> ARECIBO C 25 -> MU RADAR C 40 -> ST. SANTIN C 72 -> EISCAT TROMSO C 80 -> SONDRESTROM (local) C 95 -> EISCAT SVALBARD C 0 -> AMERICA REGIONAL MODEL (GEODETC 15-70 DEGREES) C 1 -> WESTERN eUROPEAN MODEL (GEODETIC 45-78 DEGREES) C DOY: DAY NUMBER OF YEAR; DOUBLE PRECISION SCALAR C [ 1 - 365 ] (always = an int value) C SLT: LOCAL TIME (HOUR); DOUBLE PRECISION SCALAR C [ 0 - 24] C ALT: GEODETIC ALTITUDE (KM); DOUBLE PRECISION SCALAR C LOCAL MODEL: [100 - 1000]; for Millstone Hill C LOCAL MODEL: [200 - 500]; for Shigaraki C LOCAL MODEL: [100 - 600]; for other sites C REGIONAL MODEL: [100 - 600]: America/Europe C REGIONAL MODEL: [200 - 600]: Millstone Hill C GLAT: (ALSO AS OUTPUT IF LOCAL MODEL IS CALLED) C GEODETIC LATITUDE DEGREE, DOUBLE PRECISION SCALAR C NEEDED ONLY FOR REGIONAL MODELS C F107: SOLAR 10.7 CM FLUX FOR THE PREVIOUS DAY; C DOUBLE PRECISION SCALAR C AP: 3-HOUR AP INDEX AT 3 HOURS BEFORE THE CURRENT TIME; C DOUBLE PRECISION SCALAR C IPAR: IONOSPHERIC PARAMETER TO BE RETURNED; C INTEGER SCALAR C = 1, FOR NE C = 2, FOR TE C = 3, FOR TI C = 4, FOR PARALLEL ION DRIFT, + UPWARD C OUTPUT(4): FLAG FOR HMAX AND NMAX OUTPUT; C DOUBLE PRECISION SCALAR C SET OUTPUT(4) TO ANY VALUE >0, THEN OUTPUT(2) AND C OUTPUT(3) RETURN HMAX AND NMAX. C C OUTPUT C C OUTPUT: OUTPUT DATA; DOUBLE PRECISION ARRAY, 10 DIMS C OUTPUT(1): OUTPUT DATA; NE 1/M^3 FOR IPAR=1 C TE, K FOR IPAR=2 C TI, K FOR IPAR=3 C OUTPUT(2): HMAX, KM FOR IPAR=1 AND OUTPUT(4)>0 C OUTPUT(3): NMAX, 1/M^3 FOR IPAR=1 AND OUTPUT(4)>0 C OUTPUT(4): MODEL DIAGNOSTIC STATUS C = 0 NORMAL C = -1 STATION NOT INCLUDED C = -2 PARAMETER NOT INCLUDED C = -3 STATION AND PARAMETER NOT MATCH C GLAT: GEODETIC LATITUDE DEGREE, DOUBLE PRECISION SCALAR C ONLY WHEN A LOCAL MODEL IS COMPUTED C C .. Scalar Arguments .. DOUBLE PRECISION ALT,AP,DOY,F107,GLAT,SLT INTEGER IPAR,KINST C .. C .. Array Arguments .. DOUBLE PRECISION OUTPUT(10) C .. C .. Local Scalars .. DOUBLE PRECISION DMAX,HMAX INTEGER I,IAREA,IIPAR,IKINST,IKINST3,IKINST4,ISN,J,NCALLED,IND INTEGER LIAREA C LIAREA - last IAREA value CHARACTER*2 CPAR CHARACTER*128 COEFDIR,COEFILE,MADDIR C .. C .. Local Arrays .. DOUBLE PRECISION GLATS(11),DWK1,DWK2 INTEGER STA(4),STATUS3(4),STATUS4(4) CHARACTER*2 SNAME(11) C .. C .. External Subroutines .. EXTERNAL PARAMETER3D,PARAMETER4D,READCOEF,SETKNOTS3D, * SETKNOTS4D C .. C .. Save statement .. SAVE NCALLED,IKINST,IKINST3,IKINST4,IIPAR,LIAREA SAVE STATUS3,STATUS4 C .. IKINST is the kinst of the last instrument C .. IKINST3 is the kinst of the last local instrument C .. IKINST4 is the kinst of the last regional instrument C .. Coeff from both regional and local are cached C .. C .. Intrinsic Functions .. INTRINSIC INDEX C .. C .. Data statements .. C DATA SNAME/'AR','MU','MH','ST','TR','SO','ES','RM','EU','AM','M2'/ DATA GLATS/18D0,35D0,43D0,45D0,70D0,67D0,79D0,43D0,67D0,0D0,43D0/ DATA IKINST3/999/,IKINST4/999/,IIPAR/999/,LIAREA/999/ C .. C .. DIRECTORY OF COEFFICIENT FILES ............... C COEFDIR='coefiles/' C this line modified by B. Rideout C path should be automatically modified during installation MADDIR = 'MADROOT' IND = index(MADDIR, ' ') - 1 COEFDIR = MADDIR(1:IND) // '/source/madf/geolib/3D4DCoef/' C COEFDIR='/opt/madrigal/empiricalModels/3D4DCoef/' C .................................................. C C IAREA determines whether the local (2) or regional (1) used IAREA = 2 C OUTPUT(4) = 0D0 IF (KINST.EQ.30) KINST = 32 C add other instruments near Millstone IF (KINST.EQ.5340) KINST = 32 IF (KINST.EQ.5360) KINST = 32 IF (AP.GT.100) AP = 100D0 IF (KINST.EQ.31 .AND. OUTPUT(4) .LE. 0.0D0) THEN IAREA = 1 ELSE IF (KINST.EQ.31 .AND. OUTPUT(4) .GT. 0.0D0) THEN KINST = 32 END IF IF (KINST.EQ.0) IAREA = 1 IF (KINST.EQ.1) IAREA = 1 C determine the cofficient file name to be read CPAR = 'NO' IF (IPAR.EQ.1) CPAR = 'Ne' IF (IPAR.EQ.2) CPAR = 'Te' IF (IPAR.EQ.3) CPAR = 'Ti' IF (IPAR.EQ.4) CPAR = 'Vo' ISN = 999 IF (KINST.EQ.20) ISN = 1 IF (KINST.EQ.25) ISN = 2 IF (KINST.EQ.32) ISN = 3 IF (KINST.EQ.40) ISN = 4 IF (KINST.EQ.72) ISN = 5 IF (KINST.EQ.80) ISN = 6 IF (KINST.EQ.95) ISN = 7 IF (KINST.EQ.31 .AND. OUTPUT(4) .LE. 0.0D0) ISN = 8 IF (KINST.EQ.31 .AND. OUTPUT(4) .GT. 0.0D0) ISN = 3 IF (KINST.EQ.1) ISN = 9 IF (KINST.EQ.0) ISN = 10 IF (KINST.EQ.33) ISN = 11 C .. invalid inputs .. IF (ISN.EQ.999) OUTPUT(4) = -1D0 IF (CPAR.EQ.'NO') OUTPUT(4) = -2D0 IF (KINST.EQ.25 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.40 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.72 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.95 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.1 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.0 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.31 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 IF (KINST.EQ.33 .AND. CPAR.EQ.'Vo') OUTPUT(4) = -3D0 C C Altitude rules are unneeded if just want hmax, nmax IF (OUTPUT(4) .LE. 0.0D0) THEN IF (ALT.LT.100D0.OR.ALT.GT.1000D0) OUTPUT(4) = -4D0 C IF (ALT.LT.200D0.AND.IAREA.EQ.1) OUTPUT(4) = -4D0 IF (ALT.LT.200D0.AND.KINST.EQ.31) OUTPUT(4) = -4D0 IF (ALT.GT.600D0.AND.IAREA.EQ.1) OUTPUT(4) = -4D0 IF (ALT.LT.200D0.AND.KINST.EQ.25) OUTPUT(4) = -4D0 IF (ALT.GT.450D0.AND.KINST.EQ.25) OUTPUT(4) = -4D0 ELSE ALT=300.0D0 END IF IF (OUTPUT(4).LT.0D0) THEN OUTPUT(1) = -999D0 RETURN END IF C IF (IAREA.NE.1) GLAT = GLATS(ISN) COEFILE = COEFDIR(1:INDEX(COEFDIR,' ')-1)//SNAME(ISN) IF (IAREA.EQ.1) THEN COEFILE = COEFDIR(1:INDEX(COEFDIR,' ')-1)//SNAME(ISN) END IF C to check if the coefficient file has been read into common block IF (IAREA .NE. 1) THEN IF (IKINST3.NE.KINST) NCALLED = 0 ELSE IF (IKINST4.NE.KINST) NCALLED = 0 END IF IF (NCALLED.NE.12345) THEN IF (IAREA .NE. 1) THEN CALL READCOEF(0,COEFILE,IAREA,STATUS3) ELSE CALL READCOEF(0,COEFILE,IAREA,STATUS4) END IF NCALLED = 12345 END IF IF (IAREA .NE. 1) THEN DO I = 1,4 IF (STATUS3(I).NE.0 .AND. IPAR.EQ.I) THEN OUTPUT(1) = -999D0 OUTPUT(4) = -3D0 RETURN END IF END DO ELSE DO I = 1,4 IF (STATUS4(I).NE.0 .AND. IPAR.EQ.I) THEN OUTPUT(1) = -999D0 OUTPUT(4) = -3D0 RETURN END IF END DO END IF IF (IAREA .NE. 1) THEN IF (IIPAR.NE.IPAR .OR. KINST.NE.IKINST3 .OR. * LIAREA.NE.IAREA) THEN CALL READCOEF(IPAR,COEFILE,IAREA,STA) CALL SETKNOTS3D IKINST3 = KINST END IF ELSE IF (IIPAR.NE.IPAR .OR. KINST.NE.IKINST4 .OR. * LIAREA.NE.IAREA) THEN CALL READCOEF(IPAR,COEFILE,IAREA,STA) CALL SETKNOTS4D IKINST4 = KINST END IF END IF IKINST = KINST LIAREA = IAREA IIPAR = IPAR IF (IAREA.EQ.2) CALL PARAMETER3D(DOY,SLT,GLAT,ALT,F107,AP, * OUTPUT(1)) IF (IAREA.EQ.1) CALL PARAMETER4D(DOY,SLT,GLAT,ALT,F107,AP, * OUTPUT(1)) IF (IPAR.EQ.1 .AND. OUTPUT(1).LE.0D0) OUTPUT(4) = -5D0 IF (IPAR.EQ.1 .AND. OUTPUT(1).LE.0D0) OUTPUT(1) = -OUTPUT(1) IF (IPAR.EQ.1 .AND. KINST.EQ.31) OUTPUT(1) = OUTPUT(1)*1D12 IF (IPAR.EQ.1 .AND. KINST.NE.31) OUTPUT(1) = 10**OUTPUT(1) C find hmax and Nmax at 1 km resolution - only use local IF (IPAR.EQ.1 .AND. OUTPUT(4).GT.0.d0) THEN DWK1 = 0.0D0 DWK2 = 0.0D0 HMAX = 0.0D0 DMAX = -10.0D6 IF (SLT.LT.5.OR.SLT.GT.22) THEN IEND = 250 ELSE IEND = 200 END IF C first loop - rough search in 20 km steps - look for decrease DO I = 500,IEND,-20 DWK1 = I*1.d0 CALL PARAMETER3D(DOY,SLT,GLAT,DWK1,F107,AP,DWK2) IF (DWK2 .LT. DMAX .AND. DWK2 .GT. 0.0D0) THEN HMAX = DWK1 + 20.0D0 GOTO 100 ELSE DMAX = DWK2 END IF END DO C if we reach here no peak was found, set error values OUTPUT(2) = 0.0D0 OUTPUT(3) = 0.0D0 OUTPUT(4) = -999.D0 RETURN C second loop - fine search in 1 km steps 100 DO I = INT(HMAX)-15,INT(HMAX)+15,1 DWK1 = I*1.d0 CALL PARAMETER3D(DOY,SLT,GLAT,DWK1,F107,AP,DWK2) IF (DWK2 .GT. DMAX) THEN DMAX = DWK2 HMAX = DWK1 END IF END DO OUTPUT(2) = HMAX OUTPUT(3) = 10**DMAX OUTPUT(4) = -999.D0 END IF RETURN END C C ------------------------------------------------------------- C SUBROUTINE READCOEF(SW,COEFILEPATH,MODEL,STATUS) C C INPUT: SW, COEFILEPATH,IAREA C OUTPUT: STATUS(4) C SW: SW=0 IF ONLY READ COEFFICIENTS FROM FILES C SW.NE.0 IF ONLY LOAD COEFFICIENTS INTO COMMON BLOCKS C FOR THE SPECIFIC PARAMETER; I.E., C SW=1, NE C SW=2, TE C SW=3, TI C SW=4, VO C MODEL - 1 if regional model, 2 if local model C C .. Scalar Arguments .. INTEGER SW,MODEL CHARACTER*(*) COEFILEPATH C .. C .. Local Scalars .. INTEGER I,IAREA,IC,IPAR,J CHARACTER*2 CPAR CHARACTER*256 COEFILE C .. C .. Common blocks .. COMMON /BASINFO1/KKS,NX,NY,NS,NG COMMON /BASINFO13/KKS3,NX3,NY3,NS3,NG3 COMMON /BASINFO14/KKS4,NX4,NY4,NS4,NG4 COMMON /BASINFO2/XA,XB,YA,YB,SA,SB,GA,GB COMMON /BASINFO23/XA3,XB3,YA3,YB3,SA3,SB3,GA3,GB3 COMMON /BASINFO24/XA4,XB4,YA4,YB4,SA4,SB4,GA4,GB4 COMMON /COEF/COEFS,N,M,ICC COMMON /COEF3/COEFS3,N3,M3,ICC3 COMMON /COEF4/COEFS4,N4,M4,ICC4 COMMON /NODES/TT,WL,NBKL COMMON /NODES3/TT3,WL3,NBKL3 COMMON /NODES4/TT4,WL4,NBKL4 DOUBLE PRECISION GA,GB,SA,SB,XA,XB,YA,YB INTEGER ICC,KKS,M,N,NBKL,NG,NS,NX,NY DOUBLE PRECISION COEFS(10,5000),COEFS4(4,10,5000),GA4(4),GB4(4), * SA4(4),SB4(4),TT(100),TT4(4,100),WL(50), * WL4(4,50),XA4(4),XB4(4),YA4(4),YB4(4) DOUBLE PRECISION COEFS3(4,10,5000),GA3(4),GB3(4), * SA3(4),SB3(4),TT3(4,100), * WL3(4,50),XA3(4),XB3(4),YA3(4),YB3(4) INTEGER ICC4(4),KKS4(4),M4(4),N4(4),NBKL4(4),NG4(4),NS4(4),NX4(4), * NY4(4) INTEGER ICC3(4),KKS3(4),M3(4),N3(4),NBKL3(4),NG3(4),NS3(4),NX3(4), * NY3(4) C .. C .. Common blocks .. C .. C .. Array Arguments .. INTEGER STATUS(4) C .. C .. Intrinsic Functions .. INTRINSIC INDEX C .. IF (SW.EQ.0) THEN DO 20 J = 1,4 IF (J.EQ.1) CPAR = 'Ne' IF (J.EQ.2) CPAR = 'Te' IF (J.EQ.3) CPAR = 'Ti' IF (J.EQ.4) CPAR = 'Vo' IF (MODEL.EQ.2) THEN COEFILE = COEFILEPATH(1:INDEX(COEFILEPATH,' ')-1)// * 'Coef3D'//CPAR//'.out' ELSE COEFILE = COEFILEPATH(1:INDEX(COEFILEPATH,' ')-1)// * 'Coef4D'//CPAR//'.out' END IF OPEN (1,FILE=COEFILE(1:INDEX(COEFILE,' ')-1),STATUS='OLD', * IOSTAT=STATUS(J)) C READ (1,FMT=9000) IPAR,IAREA,N,M,ICC,KKS,NX,NY,NS,NG,XA,XB,YA,YB, C * SA,SB,GA,GB IF (STATUS(J).NE.0) GO TO 20 IF (MODEL.EQ.1) THEN C read in regional model READ (1,FMT=*) IPAR,IAREA,N4(J),M4(J),ICC4(J),KKS4(J), * NX4(J),NY4(J),NS4(J),NG4(J),XA4(J),XB4(J),YA4(J),YB4(J), * SA4(J),SB4(J),GA4(J),GB4(J) READ (1,FMT='(100F7.1)') (TT4(J,I),I=1,NY4(J)+KKS4(J)) DO I = 1,N4(J) READ (1,FMT=9010) (COEFS4(J,IC,I),IC=1,ICC4(J)) END DO NBKL4(J) = 0 WL4(J,1) = 0D0 READ (1,END=10,FMT='(I4)') NBKL4(J) IF (NBKL4(J).LE.0) GO TO 10 READ (1,FMT='(100F7.1)') (WL4(J,I),I=1, * NBKL4(J)+KKS4(J)+KKS4(J)-2) ELSE C read in local model READ (1,FMT=*) IPAR,IAREA,N3(J),M3(J),ICC3(J),KKS3(J), * NX3(J),NY3(J),NS3(J),NG3(J),XA3(J),XB3(J),YA3(J),YB3(J), * SA3(J),SB3(J),GA3(J),GB3(J) READ (1,FMT='(100F7.1)') (TT3(J,I),I=1,NY3(J)+KKS3(J)) DO I = 1,N3(J) READ (1,FMT=9010) (COEFS3(J,IC,I),IC=1,ICC3(J)) END DO NBKL3(J) = 0 WL3(J,1) = 0D0 READ (1,END=10,FMT='(I4)') NBKL3(J) IF (NBKL3(J).LE.0) GO TO 10 READ (1,FMT='(100F7.1)') (WL3(J,I),I=1, * NBKL3(J)+KKS3(J)+KKS3(J)-2) END IF 10 CLOSE (1) 9000 FORMAT (2i3,I6,I7,6I3,8F8.2) 9010 FORMAT (4D15.7) 20 CONTINUE END IF IF (SW.NE.0) THEN IF (MODEL.EQ.1) THEN KKS = KKS4(SW) NX = NX4(SW) NY = NY4(SW) NS = NS4(SW) NG = NG4(SW) XA = XA4(SW) XB = XB4(SW) YA = YA4(SW) YB = YB4(SW) SA = SA4(SW) SB = SB4(SW) GA = GA4(SW) GB = GB4(SW) N = N4(SW) M = M4(SW) ICC = ICC4(SW) NBKL = NBKL4(SW) DO I = 1,100 TT(I) = TT4(SW,I) END DO DO I = 1,50 WL(I) = WL4(SW,I) END DO DO I = 1,10 DO J = 1,5000 COEFS(I,J) = COEFS4(SW,I,J) END DO END DO ELSE KKS = KKS3(SW) NX = NX3(SW) NY = NY3(SW) NS = NS3(SW) NG = NG3(SW) XA = XA3(SW) XB = XB3(SW) YA = YA3(SW) YB = YB3(SW) SA = SA3(SW) SB = SB3(SW) GA = GA3(SW) GB = GB3(SW) N = N3(SW) M = M3(SW) ICC = ICC3(SW) NBKL = NBKL3(SW) DO I = 1,100 TT(I) = TT3(SW,I) END DO DO I = 1,50 WL(I) = WL3(SW,I) END DO DO I = 1,10 DO J = 1,5000 COEFS(I,J) = COEFS3(SW,I,J) END DO END DO END IF END IF RETURN END C C ------------------------------------------------------------- C SUBROUTINE SETKNOTS3D INCLUDE 'basis3.h' C .. Local Scalars .. INTEGER I,KS C .. C .. External Subroutines .. C .. C .. Common blocks .. COMMON /BASINFO1/KKS,NX,NY,NS,NG COMMON /BASINFO2/XA,XB,YA,YB,SA,SB,GA,GB COMMON /NODES/TT,WL,NBKL DOUBLE PRECISION GA,GB,SA,SB,XA,XB,YA,YB INTEGER KKS,NBKL,NG,NS,NX,NY DOUBLE PRECISION TT(100),WL(50) C .. KS = KKS DO I = 1,NY + KKS T2(I) = TT(I) END DO XA = 0.d0 XB = 2.0D0*3.1415926535897D0 SA = 0.d0 SB = 2.0D0*3.1415926535897D0 N1 = NX N2 = NY N3 = NS RETURN END C C ------------------------------------------------------------- C SUBROUTINE SETKNOTS4D INCLUDE 'basis4.h' C .. Local Scalars .. INTEGER I,KS C .. C .. External Subroutines .. C .. C .. Common blocks .. COMMON /BASINFO1/KKS,NX,NY,NS,NG COMMON /BASINFO2/XA,XB,YA,YB,SA,SB,GA,GB COMMON /NODES/TT,WL,NBKL DOUBLE PRECISION GA,GB,SA,SB,XA,XB,YA,YB INTEGER KKS,NBKL,NG,NS,NX,NY DOUBLE PRECISION TT(100),WL(50) C .. KS = KKS DO I = 1,NY + KKS T2(I) = TT(I) END DO C ... IF LATITUDINAL VARIATION IS A B-SPLINE .. C .. COMMENT OUT BELOW IF POLYNOMIA USED IF (NBKL.LE.0) THEN T4(1) = 12345D0 ELSE DO I = 1,NBKL + KKS + KKS - 2 T4(I) = WL(I) END DO END IF C .. XA = 0.d0 XB = 2.0D0*3.1415926535897D0 SA = 0.d0 SB = 2.0D0*3.1415926535897D0 N1 = NX N2 = NY N3 = NS N4 = NG RETURN END C C ------------------------------------------------------------- C SUBROUTINE PARAMETER3D(DOY,SLT,LAT,ALT,F107,AP,V3D) INCLUDE 'basis3.h' C .. Scalar Arguments .. DOUBLE PRECISION ALT,AP,DOY,F107,LAT,SLT,V3D C .. C .. Local Scalars .. DOUBLE PRECISION APM,F107M,TWOPI INTEGER I,IC C .. C .. Local Arrays .. DOUBLE PRECISION BAS(30000),WK(10),WK2(10) C .. C .. External Subroutines .. EXTERNAL SPLBAS3 C .. C .. Common blocks .. COMMON /COEF/COEFS,N,M,ICC INTEGER ICC,M,N DOUBLE PRECISION COEFS(10,5000) C .. TWOPI = 2.d0*3.1415926535897d0 IX1(1) = 1 IX2(1) = 1 IX3(1) = 1 X1(1) = SLT X2(1) = ALT X3(1) = DOY C for peridiocal spline X1(1) = X1(1)*TWOPI/24.d0 X3(1) = X3(1)*TWOPI/365.d0 C determine basis value, bas CALL SPLBAS3(N,1,X1(1),BAS) DO IC = 1,ICC WK(IC) = 0.d0 DO I = 1,N WK(IC) = WK(IC) + BAS(I)*COEFS(IC,I) END DO END DO F107M = 135.D0 APM = 15.D0 DO IC = 1,ICC WK2(IC) = 0.d0 END DO WK2(1) = 1.d0 WK2(2) = (F107-F107M)/100.d0 WK2(3) = (AP-APM)/10.d0 WK2(4) = WK2(2)*WK2(3) V3D = 0.d0 DO IC = 1,ICC V3D = V3D + WK(IC)*WK2(IC) END DO RETURN END C C ------------------------------------------------------------- C SUBROUTINE PARAMETER4D(DOY,SLT,LAT,ALT,F107,AP,V4D) INCLUDE 'basis4.h' C .. Scalar Arguments .. DOUBLE PRECISION ALT,AP,DOY,F107,LAT,SLT,V4D C .. C .. Local Scalars .. DOUBLE PRECISION APM,F107M,TWOPI INTEGER I,IC C .. C .. Local Arrays .. DOUBLE PRECISION BAS(30000),WK(10),WK2(10) C .. C .. External Subroutines .. EXTERNAL SPLBASP4 C .. C .. Common blocks .. COMMON /COEF/COEFS,N,M,ICC INTEGER ICC,M,N DOUBLE PRECISION COEFS(10,5000) C .. TWOPI = 2.d0*3.1415926535897d0 IX1(1) = 1 IX2(1) = 1 IX3(1) = 1 IX4(1) = 1 X1(1) = SLT X2(1) = ALT X3(1) = DOY X4(1) = LAT C for peridiocal spline X1(1) = X1(1)*TWOPI/24.d0 X3(1) = X3(1)*TWOPI/365.d0 C determine basis value, bas CALL SPLBASP4(N,1,X1(1),BAS) DO IC = 1,ICC WK(IC) = 0.d0 DO I = 1,N WK(IC) = WK(IC) + BAS(I)*COEFS(IC,I) END DO END DO C print*,t4(1),wk(1),coefs(1,1),coefs(2,1),coefs(3,1) F107M = 135.D0 APM = 15.D0 DO IC = 1,ICC WK2(IC) = 0.d0 END DO WK2(1) = 1.d0 WK2(2) = (F107-F107M)/100.d0 WK2(3) = (AP-APM)/15.d0 WK2(4) = WK2(2)*WK2(3) V4D = 0.d0 DO IC = 1,ICC V4D = V4D + WK(IC)*WK2(IC) END DO C WRITE(18,'(F8.1,1000E15.7)')ALT,(BAS(I),I=1,N) RETURN END