ADAS Subroutine b8scom
C SUBROUTINE B8SCOM( NDTEM , NDTRN , NDLEV , NDMET , & IL , WA , NPL , BWNOA , & NMET , IMETR , NORD , IORDR , & NV , SCEF , SCOM , & MAXT , TEA , & ICNTS , ISTRN , IS1A , IS2A , & LSSETA, SGRDA , ESGRDA , & SMETA , ESMETA , SORDA , ESORDA , & LTRNG & ) C----------------------------------------------------------------------- C C ****************** FORTRAN77 SUBROUTINE: B8SCOM ********************* C C PURPOSE: TO ESTABLISH IONISATION RATE COEFFICIENTS Z --> Z+1 FOR A C SET OF TEMPERATURES GIVEN BY THE ARRAY 'TEA()' USING CUBIC C SPLINES ON A SET OF RATE COEFFICIENTS COVERING THE C TEMPERATURES GIVEN BY THE ARRAY 'SCEF()'. C C IONISATION DATA COMES EITHER FROM AN INTERACTIVE SEARCH VIA C THE ADAS208/ADAS502 ROUTE OR DIRECTLY FROM THE INPUT ADF04 C FILE. C C THE OUTPUT IS SEPARATED INTO THE METASTABLE PART (SMETA)AND C THE ORDINARY LEVEL PART (SORDA) APPROPRIATELY INDEXED. C EXPONENTIAL FACTORS (ESMETA AND (ESORDA) ARE KEPT SEPARATE C FROM THE REMAINDER OF THE RATE COEFFICIENTS. C C IONISATION TYPE IS SELECTED VIA 'ICNTS' & 'ISTRN' C C RATE COEFFICIENTS ARE GIVEN FOR A NUMBER OF IONISING LEVELS C AND THE ARRAY 'SGRDA(,,)' REPRESENTS COEFFTS. FOR COMB- C INATIONS OF TEMPERATURE, IONISING LEVEL INDEX AND FINAL C PARENT INDEX. C C SPLINE IS CARRIED OUT USING LOG(RATE COEFFICIENT VALUES) C C CALLING PROGRAM: ADAS208 C C SUBROUTINE: C C INPUT : (I*4) NDTEM = MAXIMUM NUMBER OF TEMPERATURES ALLOWED C INPUT : (I*4) NDTRN = MAXIMUM NUMBER OF TRANSITIONS ALLOWED C INPUT : (I*4) NDLEV = MAXIMUM NUMBER OF ENERGY LEVELS ALLOWED C INPUT : (I*4) NDMET = MAXIMUM NUMBER OF METASTABLES ALLOWED C INPUT : (I*4) IL = NUMBER OF ENERGY LEVELS C INPUT : (R*8) WA() = ENERGY LEVELS RELATIVE TO LOWEST(CM-1) C INPUT : (I*4) NPL = NUMBER OF PARENTS C INPUT : (R*8) BWNOA() = PARENT ENERGIES RELATIVE TO RECOMBINED C ION GROUND LEVEL (CM-1) C C INPUT : (I*4) NMET = NUMBER OF RECOMBINED METASTABLES C INPUT : (I*4) IMETR() = INDICES OF METASTABLES IN FULL LEVEL LIST C INPUT : (I*4) NORD = NUMBRE OF ORDINARY EXCITED LEVELS C INPUT : (I*4) IORDR() = INDICES OF ORDINARY LEVELS IN FULL LEVEL LIST C C INPUT : (I*4) NV = NUMBER OF TEMPERATURES REPRESENTED IN THE C INPUT DATA SET. C INPUT : (R*8) SCEF() = TEMPERATURES REPRESENTED IN INPUT DATA SET C INPUT : (R*8) SCOM(,)= RATE COEFF. REPRESENTED IN INPUT DATA SET C 1st DIMENSION: TEMPERATURE INDEX ('SCEF') C 2nd DIMENSION: IONISATION INDEX C (SEE: 'ISTRN()') C C INPUT : (I*4) MAXT = NUMBER OF ISPF SELECTED TEMPERATURES FOR C OUTPUT. C INPUT : (R*8) TEA() = ISPF SELECTED TEMPERATURES FOR OUTPUT. C C INPUT : (I*4) ICNTS = NUMBER OF SELECTED IONISATIONS C INPUT : (I*4) ISTRN() = INDEX VALUES IN MAIN TRANSITION ARRAY WHICH C REPRESENT IONISATIONS OF THE SELECTED C TYPE - USED TO SELECT APPROPRIATE RATE COEFFTS C FOR IONISATION Z --> Z+1 TYPE. C INPUT : (I*4) IS1A( )= PARENT INDEX. C DIMENSION: 'TRANSITION'/IONISATION INDEX C INPUT : (I*4) IS2A() = IONISING LEVELS INDICES. C DIMENSION: 'TRANSITION'/IONISATION INDEX C C INPUT : (I*4) LSSETA(,)=.TRUE. => IONISATION DATA FROM ADAS502 ROUTE C .FALSE. => NOT AVAILABLE FROM ADAS502 ROUTE C 1ST DIM: METASTABLE INDEX FROM MET. LIST C 2ND DIM: PARENT INDEX C INPUT : (R*8) SGRDA(,,)= INPUT IONISATION RATE COEFFT. VALUES. C FROM THE ADAS208/ADAS502 LOOP C (EXCLUDING EXPONENTIAL TEMPERATURE FACTOR) C 1st DIMENSION: TEMPERATURE INDEX ('TOUT') C 2nd DIMENSION: IONISING LEVEL INDEX. C 3RD DIMENSION: PARENT INDEX. C INPUT : (R*8) ESGRDA(,,)= IONISATION RATE COEFFT. EXPONENTIAL FACTORS C FROM THE ADAS208/ADAS502 LOOP C 1st DIMENSION: TEMPERATURE INDEX ('TOUT') C 2nd DIMENSION: IONISING LEVEL INDEX. C 3RD DIMENSION: PARENT INDEX. C C OUTPUT: (R*8) SMETA(,,)= SPLINED IONISATION RATE COEFFT. VALUES. C FOR THE METASTABLES C (EXCLUDING EXPONENTIAL TEMPERATURE FACTOR) C 1st DIMENSION: TEMPERATURE INDEX ('TOUT') C 2nd DIMENSION: IONISING METASTABLE INDEX. C 3RD DIMENSION: PARENT INDEX. C OUTPUT: (R*8) ESMETA(,,)= SPLINED IONISATION RATE COEFFT. C EXPONENTIAL TEMPERATURE FACTORS. C 1st DIMENSION: TEMPERATURE INDEX ('TOUT') C 2nd DIMENSION: IONISING METASTABLE INDEX. C 3RD DIMENSION: PARENT INDEX. C OUTPUT: (R*8) SORDA(,,)= SPLINED IONISATION RATE COEFFT. VALUES. C FOR THE ORDINARY LEVELS C (EXCLUDING EXPONENTIAL TEMPERATURE FACTOR) C 1st DIMENSION: TEMPERATURE INDEX ('TOUT') C 2nd DIMENSION: IONISING ORDINARY LEVEL INDEX. C 3RD DIMENSION: PARENT INDEX. C OUTPUT: (R*8) ESORDA(,,)= SPLINED IONISATION RATE COEFFT. C EXPONENTIAL TEMPERATURE FACTORS. C 1st DIMENSION: TEMPERATURE INDEX ('TOUT') C 2nd DIMENSION: IONISING ORDINARY LEVEL INDEX. C 3RD DIMENSION: PARENT INDEX. C C OUTPUT: (L*4) LTRNG() = .TRUE. => TEMPERATURE VALUES WITHIN RANGE C READ FROM INPUT COPASE DATA SET. C = .FALSE.=>TEMPERATURE VALUE NOT WITHIN RANGE C READ FROM INPUT COPASE DATA SET. C 1st DIMENSION: TEMPERATURE INDEX. C C C (I*4) NTDSN = PARAMETER = MAXIMUM NUMBER OF TEMPERATURES C ALLOWED IN INPUT DATA SET = 14 C (I*4) NLTEM = PARAMETER = MUST BE >= 'NDTEM' C C (I*4) IOPT = SPLINE END CONDITIONS/EXTRAPOLATION CONTROL C SWITCH - SEE 'XXSPLE' C I.E. DEFINES THE BOUNDARY DERIVATIVES. C (VALID VALUES = 0, 1, 2, 3, 4) C (I*4) I = GENERAL INDEX C (I*4) ICAP = CAPTURING LEVEL INDEX BEING ASSESSED. C (I*4) IC = RECOMBINATION ARRAY INDEX C (I*4) IP = PARENT INDEX C (I*4) IT = TEMPERATURE ARRAY INDEX C C (R*8) DYIN() = INTERPOLATED DERIVATIVES C DIMENSION: TEMPERATURE INDEX ('TIN()') C C (L*4) LSETX = .TRUE. => X-AXES ('TIN()' VALUES) NEED TO C SET IN 'XXSPLE'. C .FALSE. => X-AXES ('TIN()' VALUES) HAVE C BEEN SET IN 'XXSPLE'. C (NOTE: 'LSETX' IS RESET BY 'XXSPLE') C C (R*8) LSCOM() = LOG ( 'SCOM(,)' ) FOR GIVEN IONISING LEVEL C DIMENSION: TEMPERATURE INDEX ('SCEF()') C (R*8) LSGRD()= LOG ( SPLINED IONIS RATE COEFTS ) C DIMENSION: TEMPERATURE INDEX ('TEA()' ) C C C ROUTINES: C ROUTINE SOURCE BRIEF DESCRIPTION C ------------------------------------------------------------ C XXSPLE ADAS SPLINE SUBROUTINE (WITH EXTRAP. INFO) C C C AUTHOR: HP SUMMERS, UNIVERSITY OF STRATHCLYDE C TEL. 0141-548-4196 C C DATE: 14/09/99 C C C VERSION : 1.2 C DATE : 19/12/2000 C MODIFIED : Martin O'Mullane C - Excluded S values GT 1.0 from the spline fit in order C to compensate for numerical problems at low temperatures. C C VERSION : 1.3 C DATE : 17/02/2006 C MODIFIED : Martin O'Mullane C - Te values for S-line splining may not be the same C so set lsetx to TRUE before call to xxsple. C - Set unused values in redscef and redlscom to 0.0. C C----------------------------------------------------------------------- C C----------------------------------------------------------------------- INTEGER ICNTS, IL, IMETR(NDMET) INTEGER IORDR(NDLEV), IS1A(NDLEV) INTEGER IS2A(NDLEV), ISTRN(NDTRN), MAXT INTEGER NDLEV, NDMET, NDTEM, NDTRN INTEGER NMET, NORD, NPL, NV LOGICAL LSSETA(NDMET,NDMET), LTRNG(NDTEM) REAL*8 BWNOA(NDMET) REAL*8 ESGRDA(NDTEM,NDMET,NDMET) REAL*8 ESMETA(NDTEM,NDMET,NDMET) REAL*8 ESORDA(NDTEM,NDLEV,NDMET) REAL*8 SCEF(NDTEM), SCOM(NTDSN,NDTRN) REAL*8 SGRDA(NDTEM,NDMET,NDMET) REAL*8 SMETA(NDTEM,NDMET,NDMET) REAL*8 SORDA(NDTEM,NDLEV,NDMET), TEA(NDTEM) REAL*8 WA(NDLEV)