c
c c c C How the subroutine is activated: GX2DVF is called from C GXS2SR in g1 s2 if the user has NOT created a file called C 'RADI.DAT' in the local directory containing the required C radiation exchange matrix. C C Limitations: 1-d and 2-d cartesian/bfc coordinates only. Note C that the coding assumes that the radiative exchange C coefficients provided by the user must include emissivities and C the Stefan-Boltzmann constant. C Click here c for full information C----------------------------------------------------------------- SUBROUTINE GX2DVF INCLUDE 'patcmn' INCLUDE 'farray' INCLUDE 'grdloc' INCLUDE 'satgrd' INCLUDE 'grdear' INCLUDE 'satear' INCLUDE 'parear' PARAMETER (NPNAM=200) PARAMETER (NLG=100, NIG=100, NRG=200, NCG=100) PARAMETER (JRTMAX=5) C.... maximal number of viewfactor matrices = C maximal vnumber of spectral bands for str. media PARAMETER (JLMX=5) C.... maximal number of radiating patches PARAMETER (JPTHMX=50) C.... number of spectral intervals PARAMETER (JSPMX=60) C.... number of spectral intervals PARAMETER (JBNDMX=7) C.... maximal number of different materials in this C calculation (to limit the storage for optical data) PARAMETER (JMTLIM=10) C.... range of material numbers in data file PARAMETER (JMTIND=500) C COMMON/LGRND/LG(NLG)/IGRND/IG(NIG)/RGRND/RG(NRG)/CGRND/CG(NCG) LOGICAL LG CHARACTER*4 CG C C.... Common LUSF for zero location of F-array COMMON/LUSF/L0RPNO,L0AVRF,L0AVTS,L0AVSH,L0RC,L0CC,L0CCF, 1 L0QFLX,L0RFAC,L0COND,L0WPNO,L0CP1,L0HTC,L0AE,L0AN,L0AS,L0AH, 1 L0EXRD,L0EXLN,L0QEXT,L0XCOF,L0KDM,L0NTS C CHARACTER*6 NAMSUB LOGICAL STPRPS,STEMMS,STEPOR,STNPOR,STHPOR,QEQ,QNE,GBHMTX C INTEGER JINT(JSPMX),JSTRNT(JSPMX),JMTCTR(JMTIND) REAL GRELP(JPTHMX,JBNDMX),GSURF(JPTHMX,JBNDMX) REAL OPT(JMTLIM,JSPMX,9),GE(JPTHMX,JSPMX),GR(JPTHMX,JSPMX) C.... New array providing the spectral weight C for every surface must be introduced REAL GW(JPTHMX,JSPMX) LOGICAL JSPFLG,SURFL C REAL GCOR1(100,100),GCOR2(100,100) REAL A(JPTHMX,JPTHMX),B(JPTHMX,JPTHMX),R(JPTHMX,JPTHMX) C... Local arrays, integers etc. REAL GVIEW(JPTHMX,JPTHMX,JLMX),GPATA(JPTHMX) REAL GLOJ1R(JRTMAX),GLOJ2R(JRTMAX) REAL GHIJ1R(JRTMAX),GHIJ2R(JRTMAX) REAL GLOI1R(JRTMAX),GLOI2R(JRTMAX) REAL GHII1R(JRTMAX),GHII2R(JRTMAX) REAL GCNTBF(JLMX,JRTMAX,JRTMAX),GTEST(JLMX),GDIR(2) LOGICAL BEFORE,ABSORP INTEGER J2DDIR(7) INTEGER JSHFT1(2,2),JSHFT2(2,2) INTEGER J2DLO1(2,2),J2DLO2(2,2),J2DHI1(2,2),J2DHI2(2,2) INTEGER J2DA1(2,2,2),J2DA2(2,2,2),J2DB1(2,2,2,3),J2DB2(2,2,2,3) INTEGER J2DSH1(2,2,2,3),J2DSH2(2,2,2,3),J2DTYP(2,3,7,3) DATA JSHFT1 / -1, 0, 1, 0 / DATA JSHFT2 / 0,-1, 0, 1 / DATA J2DSH1 /1, 0,-1, 0, 1, 0,-1, 0, 0,-1, 0,-1, 0, 1, 0, 1, 1 0, 1, 0, 1, 0,-1, 0,-1 / DATA J2DSH2 /0, 1, 0,-1, 0, 1, 0,-1,-1, 0,-1, 0, 1, 0, 1, 0, 1 1, 0, 1, 0,-1, 0,-1, 0 / DATA J2DLO1 /0,0,1,0/ DATA J2DLO2 /0,0,0,1/ DATA J2DHI1 /0,1,1,1/ DATA J2DHI2 /1,0,1,1/ DATA J2DA1 / 1,0,0,0,1,1,0,1 / DATA J2DA2 / 0,1,0,0,1,1,1,0 / DATA J2DB1 / 1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,1,0,1,1,1,0,0,1,0 / DATA J2DB2 / 1,1,1,0,0,1,0,0,0,0,0,1,1,0,1,1,1,0,1,1,0,0,0,1 / DATA J2DTYP 1 / 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,6,7,7,6,5,5,6,7, 1 7,6,6,6,4,5,5,4,7,7,4,5,5,4, 1 0,0,0,0,0,0,2,2,6,7,7,6,3,3,6,7,7,6,0,0,0,0,0,0,0,0,0,0, 1 0,0,6,6,2,3,3,2,7,7,2,3,3,2, 1 0,0,0,0,0,0,2,2,4,5,5,4,3,3,4,5,5,4,4,4,2,3,3,2,5,5,2,3, 1 3,2,0,0,0,0,0,0,0,0,0,0,0,0 / C C.... number of testrays on every test surface, defines accuracy C of search for obstructions to the second approxmation JRT = 2 C NAMSUB = 'VIEW2D' OPEN(3,FILE='rad.dat',STATUS='UNKNOWN') IZ = 1 GVIEW=0.0; R=0.0 STPRPS =.FALSE. STEMMS =.FALSE. STEPOR =.FALSE. STNPOR =.FALSE. STHPOR =.FALSE. JPRPS = LBNAME('PRPS') JEMMS = LBNAME('EMMS') JEPOR = LBNAME('EPOR') JNPOR = LBNAME('NPOR') JHPOR = LBNAME('HPOR') IF(STORE(JPRPS)) STPRPS =.TRUE. IF(STORE(JEMMS)) STEMMS =.TRUE. IF(STORE(JEPOR)) STEPOR =.TRUE. IF(STORE(JNPOR)) STNPOR =.TRUE. IF(STORE(JHPOR)) STHPOR =.TRUE. IF(.NOT.NULLPR) THEN WRITE(LUPR1,*) 'Print-out from sub-routine VIEW2D' CALL WRITST WRITE(LUPR1,*) 'Store PRPS=',STPRPS WRITE(LUPR1,*) 'Store EMMS=',STEMMS WRITE(LUPR1,*) 'Store EPOR=',STEPOR WRITE(LUPR1,*) 'Store NPOR=',STNPOR WRITE(LUPR1,*) 'Store HPOR=',STHPOR ENDIF LURAD=3 LURAD=LUPR1 JSPFLG = .false. GBHMTX = .false. IF(.NOT.NULLPR) THEN WRITE(LUPR1,*) 'GBHMTX=',GBHMTX WRITE(LUPR1,*) 'JSPECF=',JSPFLG ENDIF C C.... Loop through all patches to obtain patch numbers for radiative C patches. At present assumes that one patch for each thermal zone. C This calculation is repeated in GXS2SR. C NTZ=0 DO 100 IPAT=1,NUMPAT C C.... It is assumed that internal radiative thermal zones have C PATCH name commencing with '@RI' for internal radiation. C IF(NAMPAT(IPAT)(1:3).EQ.'@RI') THEN NTZ = NTZ + 1 F(L0RPNO+NTZ) = FLOAT(IPAT) ENDIF 100 CONTINUE C C.... Coherence length of the radiation. Default value: GCOHL=1.E-03 C IF(CARTES) THEN IF(NX.EQ.1.OR.NY.EQ.1.OR.NZ.EQ.1) THEN C----------------------------------------------------------------------- C.... 1D or 2D cartesian viewfactors, begin | C----------------------------------------------------------------------- C.... GCOR1(I1=1,N1+1) and GCOR2(I2=1,N2+1) contain the cordinates of C faces in the '1' and '2' directions. IF(NZ.EQ.1) THEN C.... If domain is x or y (1-d), or if domain is x-y (2-d) CALL SUB4(J2DDIR(2),1,J2DDIR(3),1,J2DDIR(4),2,J2DDIR(5),2) CALL SUB3(JN1,NX,JN2,NY,JM6,3) IF(.NOT.BFC) THEN DO 10101 I1=0,JN1 DO 10101 I2=0,JN2 GCOR1(I1+1,I2+1) = F(L0F(LXYXU)+1+NY*(I1-1)) GCOR2(I1+1,I2+1) = F(L0F(LXYYV)+I2) 10101 CONTINUE ELSE DO 10111 I1=1,JN1+1 DO 10111 I2=1,JN2+1 GCOR1(I1,I2) = XC(I1,I2,1) GCOR2(I1,I2) = YC(I1,I2,1) 10111 CONTINUE ENDIF ELSEIF(NY.EQ.1) THEN C.... if domain is x or z (1-d), or if domain is x-z (2-d) CALL SUB4(J2DDIR(2),1,J2DDIR(3),1,J2DDIR(6),2,J2DDIR(7),2) CALL SUB3(JN1,NX,JN2,NZ,JM6,2) IF(.NOT.BFC) THEN DO 10102 I1=0,JN1 DO 10102 I2=0,JN2 GCOR1(I1+1,I2+1) = F(L0F(LXYXU)+I1) GCOR2(I1+1,I2+1) = F(L0F(LZZW) +I2) 10102 CONTINUE ELSE DO 10112 I1=1,JN1+1 DO 10112 I2=1,JN2+1 GCOR1(I1,I2) = XC(I1,1,I2) GCOR2(I1,I2) = ZC(I1,1,I2) 10112 CONTINUE ENDIF ELSEIF(NX.EQ.1) THEN C.... If domain is y or z (1-d), or if domain is y-z (2-d) CALL SUB4(J2DDIR(4),1,J2DDIR(5),1,J2DDIR(6),2,J2DDIR(7),2) CALL SUB3(JN1,NY,JN2,NZ,JM6,1) IF(.NOT.BFC) THEN DO 10103 I1=0,JN1 DO 10103 I2=0,JN2 GCOR1(I1+1,I2+1) = F(L0F(LXYYV)+I1) GCOR2(I1+1,I2+1) = F(L0F(LZZW) +I2) 10103 CONTINUE ELSE DO 10113 I1=1,JN1+1 DO 10113 I2=1,JN2+1 GCOR1(I1,I2) = YC(1,I1,I2) GCOR2(I1,I2) = ZC(1,I1,I2) 10113 CONTINUE ENDIF ENDIF IF(.NOT.BFC) THEN DO 10104 I1=1,JN1+1 10104 GCOR2(I1,1) = 0.0 DO 10105 I2=1,JN2+1 10105 GCOR1(1,I2) = 0.0 ENDIF C C.... 1-d - length in 'second' dimension needs to be set to a C very large number for purpose of viewfactor calculation IF(JN1.EQ.1) THEN DO 10106 I2=1,JN2+1 10106 GCOR1(2,I2) = 1.E5 ENDIF IF(JN2.EQ.1) THEN DO 10107 I1=1,JN1+1 10107 GCOR2(I1,2) = 1.E5 ENDIF C IF(STEMMS) THEN JMTCNT = 0 C.... Loop over patches to find surface information begins DO 1201 JTZ=1,NTZ IF(NZ.EQ.1) THEN CALL GETPTC(NAMPAT(NINT(F(L0RPNO+JTZ))),TYPE, 1 JJ1F,JJ1L,JJ2F,JJ2L,JDMY,JDMY,JDMY,JDMY) ELSEIF(NY.EQ.1) THEN CALL GETPTC(NAMPAT(NINT(F(L0RPNO+JTZ))),TYPE, 1 JJ1F,JJ1L,JDMY,JDMY,JJ2F,JJ2L,JDMY,JDMY) ELSEIF(NX.EQ.1) THEN CALL GETPTC(NAMPAT(NINT(F(L0RPNO+JTZ))),TYPE, 1 JDMY,JDMY,JJ1F,JJ1L,JJ2F,JJ2L,JDMY,JDMY) ENDIF JJTYPE = MOD(INT(TYPE),15) C C.... The patch NAMPAT(F(L0RPNO+JTZ)) contains the following CO and C VA for the variable EMMS1: C C CO = material label of surface C C | radiation temperature (different from surf.temp), IF GRDTMP > 0.0 C VA =| 0.0, indicates that rad. temp. equals surf.temp , IF GRDTMP = 0.0 C | thickness of the surface layer in micron , IF GRDTMP < 0.0 C CALL GETCOV(NAMPAT(NINT(F(L0RPNO+JTZ))), 1 LBNAME('EMMS'),GMAT,GRDTMP) IF(GMAT.LT.100.) PRINT*,'SURFACE',JTZ,' CANNOT BE A GAS!' JMAT = INT(GMAT) C C.... This variable counts the materials present in the calculation C as a function of the material label IF(JMTCTR(JMAT).EQ.0) THEN JMTCNT = JMTCNT+1 JMTCTR(JMAT) = JMTCNT ENDIF C C.... Store a surface layer thickness eventually present C (in unused part of array) SURFL =.FALSE. IF(GRDTMP.LT.0.0) THEN GSURF(JTZ,3) = ABS(GRDTMP) SURFL =.TRUE. ENDIF C.... Store material label = GMAT (in unused part of array) GSURF(JTZ,2) = GMAT C.... Store radiation temperature MAX(GRDTMP,F(L0FAVTS+JTZ)) C in unused part of array IF(GRDTMP.GE.0.0) GSURF(JTZ,5) = GRDTMP GSURF(JTZ,5) = MAX(GRDTMP,300.) C C.... Calculation of min and max surface temperature TMPMIN and TMPMAX C of the present calculation, initialization: IF(JTZ.EQ.1) THEN TMPMIN = GSURF(JTZ,5) TMPMAX = GSURF(JTZ,5) ENDIF C.... Update of TMPMIN and TMPMAX TMPMIN = MIN(TMPMIN,GSURF(JTZ,5)) TMPMAX = MAX(TMPMAX,GSURF(JTZ,5)) C C.... Next comes the calculation of absorption length inside the str. C medium for this calculation, move patch inside the str. medium C (except when the patch is already inside conductive material) C IF(STPRPS) THEN L0PRPS = L0F(JPRPS) ICELL = JJ2F+NY*(JJ1F-1) IF(NZ.NE.1) THEN L0PRPS = L0F(ANYZ(JPRPS,JJ2F)) ICELL = JJ1F ENDIF M1J = J2DDIR(JJTYPE) M2J = MOD(JJTYPE-1,2)+1 JJTYPE = JJTYPE-2*MOD(JJTYPE,2)+1 JJ1F = JJ1F+JSHFT1(M1J,M2J) JJ1L = JJ1L+JSHFT1(M1J,M2J) JJ2F = JJ2F+JSHFT2(M1J,M2J) JJ2L = JJ2L+JSHFT2(M1J,M2J) ICELL = JJ2F+NY*(JJ1F-1) IF(NZ.NE.1) THEN L0PRPS = L0F(ANYZ(JPRPS,JJ2F)) ICELL = JJ1F ENDIF ENDIF C C.... In case of SURFL, find out whether it is LAYER ON SOLID or a THIN WALL C IF(SURFL) THEN IMATC = 1000 IF(JJ1F.EQ.0.OR.JJ1F.EQ.JN1+1 1 .OR.JJ1F.EQ.0.OR.JJ1F.EQ.JN1+1) THEN IMATC = 0 ELSE IMATC = F(L0PRPS+ICELL) ENDIF IF(IMATC.LT.100) THEN C.... If Thinwall, store 1.0 in otherwise unused array GRELP(JTZ,1) = 1. C.... The material behind the surface is NOT SOLID. Hence the surface C defines a THIN WALL the absorption length must not be calculated, C but the patch must be transformed back M1J = J2DDIR(JJTYPE) M2J = MOD(JJTYPE-1,2)+1 JJTYPE = JJTYPE-2*MOD(JJTYPE,2)+1 JJ1F = JJ1F+JSHFT1(M1J,M2J) JJ1L = JJ1L+JSHFT1(M1J,M2J) JJ2F = JJ2F+JSHFT2(M1J,M2J) JJ2L = JJ2L+JSHFT2(M1J,M2J) ICELL = JJ2F+NY*(JJ1F-1) IF(NZ.NE.1) THEN L0PRPS = L0F(ANYZ(JPRPS,JJ2F)) ICELL = JJ1F ENDIF C.... The thickness of the thin wall gives the absorption length IF(JMAT.GE.400) THEN GLNGTH = ABS(GRDTMP) ELSE GLNGTH = 1.E+06 ENDIF GO TO 1218 ENDIF ENDIF C C.... Surface and volume material can be different. The volume material C is indicated by the value of PRPS in the cell. The calculation of C the absorption length GLNGTH is only done, when the surface C material is semitransparent and the volume material is C semitransparent. The calculation of the absorption length is done, C until the volume material changes or ends. C IF(JMAT.LT.400) THEN C.... Surface material is opaque, the absorption length is large compared C with the thickness. GLNGTH = 1.e+06 ELSE C.... Surface material is semitransparent IMATO = F(L0PRPS+ICELL) C.... Volume material label is stored GSURF(JTZ,4) = IMATO IF(IMATO.NE.JMAT) THEN IF(IMATO.LT.400) THEN C.... Surface is semitransparent, but solid opaque. C No calculation of absorption length GLNGTH = 1.e+06 GO TO 1218 ELSE C.... Solid is semitransparent and of different material. C Check, whether a thickness of the surface layer was given. IF(.NOT.SURFL) CALL SET_ERR(445, * 'Error. THICKNESS OF LAYER NOT GIVEN.',1) C IF(.NOT.SURFL) STOP 'THICKNESS OF LAYER NOT GIVEN ' ENDIF ENDIF C.... Go from (jj1,jj2) inside the str. medium JJ1 = JJ1F+(JJ1L-JJ1F)/2 JJ2 = JJ2F+(JJ2L-JJ2F)/2 M1J = J2DDIR(JJTYPE) M2J = MOD(JJTYPE-1,2)+1 C.... The initial coordinates are B1 = GCOR1(JJ1+J2DB1(M1J,M2J,1,2), 1 JJ2+J2DB2(M1J,M2J,1,2)) B2 = GCOR2(JJ1+J2DB1(M1J,M2J,1,2), 1 JJ2+J2DB2(M1J,M2J,1,2)) M3 = (3+INT(SIGN(1.,GDIR(3-M1J))))/2 1219 J1OLD = JJ1 J2OLD = JJ2 C.... Move to next cell JJ1 = JJ1+J2DSH1(M1J,M2J,M3,1) JJ2 = JJ2+J2DSH2(M1J,M2J,M3,1) IF(JJ1.NE.0.AND.JJ1.NE.JN1+1 1 .AND.JJ2.NE.0.AND.JJ2.NE.JN2+1) THEN ICELL = JJ2+NY*(JJ1-1) IF(NZ.NE.1) THEN L0PRPS = L0F(ANYZ(JPRPS,JJ2)) ICELL = JJ1 ENDIF IMATC=F(L0PRPS+ICELL) IF(IMATC.EQ.IMATO) GO TO 1219 ENDIF C.... End of str. material reached, calculate length of path A1 = GCOR1(J1OLD+J2DA1(M1J,M2J,1), 1 J2OLD+J2DA2(M1J,M2J,1)) A2 = GCOR2(J1OLD+J2DA1(M1J,M2J,1), 1 J2OLD+J2DA2(M1J,M2J,1)) GLNGTH = SQRT((A1-B1)**2+(A2-B2)**2) ENDIF C C.... Store the patch no. in EMMS in the following way to make accessible C the correct patchnumber avoiding the problem of double counting. C 1218 DO 1215 J1=JJ1F,JJ1L IF(J1.EQ.0.OR.J1.EQ.JN1+1) GO TO 1215 DO 1216 J2=JJ2F,JJ2L IF(J2.EQ.0.OR.J2.EQ.JN2+1) GO TO 1216 C.... Direct f_array addressing of EMMS L0EMMS = L0F(JEMMS) ICELL = J2+NY*(J1-1) IF(NZ.NE.1) THEN L0EMMS = L0F(ANYZ(JEMMS,J2)) ICELL = J1 ENDIF IF(QNE(F(L0EMMS+ICELL),0.0)) THEN GRELP(INT(F(L0EMMS+ICELL)),JJTYPE) = JTZ GRELP( JTZ ,JJTYPE) = JTZ ELSE GRELP(JTZ,JJTYPE) = JTZ IF(.NOT.SURFL) 1 GRELP(JTZ,(JJTYPE-2*MOD(JJTYPE,2)+1))=-1. C C.... This indicates that a ray enters a region with EMMS(jj1,jj2)=0, but C the previous EMMS(j1old,j2old) referenced to a patchnumber -1.0, C the ray DID NOT leave a solid region, but is still in it. C F(L0EMMS+ICELL) = FLOAT(JTZ) ENDIF GSURF(INT(GRELP(INT(F(L0EMMS+ICELL)),JJTYPE)),1)= 1 GLNGTH C C.... The patchnumber belonging to a cell (j1,j2) and a face JJTYPE C of the cell (normal in the inside direction) can now be accessed C in the following way: look for the patchnumber in EMMS(J1,J2). C Now look in the array GRELP(EMMS(J1,J2),JJTYPE). This contains C the patchnumber of the proper patch, double counting is avoided. C We call this patchnumber 'THE RELATIVE PATCHNUMBER JJTYPE'. C The absorption length of patch JTZ is stored in GSURF(JTZ,1), C the radiation temperature was stored in GSURF(JTZ,5) 1216 CONTINUE 1215 CONTINUE 1201 CONTINUE C.... loop over patches to find surface information ends IF(.NOT.NULLPR) WRITE(LURAD,*) 'EMMS' DO 1205 I=1,JN1 IF(.NOT.NULLPR) WRITE(LURAD,*) 1 (F(L0EMMS+J+NY*(I-1)),J=1,JN2) 1205 CONTINUE C C.... JMTLBL is the material label, extending the PHOENICS convension, C fluid: 0SUBROUTINE GSPECT(JL,JBAND,JINT,JSTRNT,JMTCTR, 1 JSPFLG,JMTINC,TMPMIN,TMPMAX,OPT) C C.... Maximal number of viewfactor matrices = maximal C number of spectral bands for str. media PARAMETER (JLMX=5) C.... Number of spectral intervals PARAMETER (JSPMX=60) C.... Maximal number of different materials in this calculation C (to limit the storage for optical data) PARAMETER (JMTLIM=10) C.... Range of material numbers in data file PARAMETER (JMTIND=500) INTEGER JINT(JSPMX),JSTRNT(JSPMX) INTEGER JMTCTR(JMTIND) REAL OPT(JMTLIM,JSPMX,9) C.... a new array providing the spectral weight for every C surface must be introduced LOGICAL RDFLAG,JSPFLG CHARACTER*9 GLINE CHARACTER*80 BUFF COMMON /LDATA/ LDAT1(31),NULLPR,LDAT2(30),DISTIL,LDAT3(21) LOGICAL LDAT1,NULLPR,LDAT2,DISTIL,LDAT3 C---------------------------------------------------------------------- C DATA IN THE DATA FILE 'optical.data' C C Data file contains the complex refractive index: C n(v,T) + i k(v,T) C Spectral dependence is represented in JSPMX=60 intervals: C the spectrum in the range 2=log10( 10**2 *cm ) to C 5=log10( 10**5 *cm ) is equally divided C into 60 spectral intervals C Temperature dependence is contained in the power series representation: C n(i,T) = ni(0) + ni(1)*((T-300)/1000) + C ni(2)*((T-300)/1000)**2 + C ni(3)*((T-300)/1000)**3 C k(i,T) = ki(0) + ki(1)*((T-300)/1000) + C ki(2)*((T-300)/1000)**2 + C ki(3)*((T-300)/1000)**3 C C 1. line: # comment C 2. line: materiallabel, const. EMMSsivity, const. reflectivity, C label of reflection law, param. 1, param. 2, param. 3, param. 4 C number of band (default), n(0), n(1), n(2), n(3), C k(0), k(1), k(2), k(3), C interval number (not used) C 3. line: data for 1. spectral interval C ... ... C 62. line: data for 60. spectral interval C C NEXT MATERIAL C 63. line: # comment C 64. line: materiallabel, label of reflection law, parameter 1, C parameter 2, parameter 3, parameter 4 C 65. line: data for 1. spectral interval C ... ... C 124. line: data for 60. spectral interval C NEXT MATERIAL C ...... C----------------------------------------------------------------------- C Read only the data of materials, which are present in the actual C problem, into the array OPT( counter,spectralinterval,property ) OPEN(2,FILE='optical.data') C lurad=14 JMTINC = 0 DO 10 J=1,JMTIND RDFLAG =.FALSE. READ(2,'(a)',END=11) GLINE IF(GLINE.EQ.'endofdata') GO TO 11 READ(2,*) JMTLBL,GECNST,GRCNST C DO 20 JMAT=1,JMTIND IF(JMTCTR(JMAT).NE.0.AND.JMAT.EQ.JMTLBL) RDFLAG =.TRUE. 20 CONTINUE C IF(RDFLAG) THEN IF(JSPFLG) THEN JMTINC = JMTINC + 1 IF(JMTINC.GT.JMTLIM) CALL SET_ERR(449, * 'Error. Too many materials.',1) C IF(JMTINC.GT.JMTLIM) STOP 'too many materials!' DO 30 JIN=1,JSPMX READ(2,*) (OPT(JMTCTR(JMTLBL),JIN,JPROP),JPROP=1,9) JDMY = INT(OPT(JMTCTR(JMTLBL),JIN,1)) IF(JMTLBL.GE.400) THEN JINT(JIN) = JINT(JIN) +JDMY JSTRNT(JIN) = JSTRNT(JIN)+JDMY ELSE JINT(JIN) = JINT(JIN) +JDMY ENDIF 30 CONTINUE ELSE OPT(JMTCTR(JMTLBL),1,1) = GECNST OPT(JMTCTR(JMTLBL),1,2) = GRCNST DO 40 JIN=1,JSPMX READ(2,*) 40 CONTINUE ENDIF ELSE DO 41 JIN=1,JSPMX READ(2,*) 41 CONTINUE ENDIF 10 CONTINUE 11 CLOSE(2) C C.... Calculate the lowest spectral interval from the lowest temperature C in the problem, and the highest spectral interval from the highest C temperature in the problem JDMY = INT(20*(LOG10(TMPMIN/0.3668)-2.9)) IF(JDMY.LT.0) THEN WRITE(BUFF,'(A,1X,1PE10.3)') 'MINIMAL TEMPERATURE=',TMPMIN CALL PUT_LINE(BUFF,.false.) CALL PUT_LINE('WARNING, MINIMAL TEMPERATURE BELOW LIMIT',.true.) ENDIF INTMIN = MAX(0,JDMY)+1 JDMY = INT(20*(LOG10(TMPMAX/0.3668)-1.4)) IF(JDMY.GT.59) THEN WRITE(BUFF,'(A,1X,1PE10.3)') 'MAXIMAL TEMPERATURE=',TMPMAX CALL PUT_LINE(BUFF,.false.) CALL PUT_LINE('WARNING, MAXIMAL TEMPERATURE ABOVE LIMIT',.true.) ENDIF INTMAX = MAX(0,JDMY)+1 C C.... Calculate the bandstructure from the default values from C 'optical.data' the bands for str. materials and for the whole C calculation must be determined. C.... JINT(I) contains the band number for the spectral interval I C JSTRNT(I) contains the band number for the spectral interval C I of a str. medium C DO 1301 I=1,JSPMX-1 JINT(I) = MIN(1,JINT(I+1)-JINT(I))* 1 MAX(0,SIGN(1,I-INTMIN))*MAX(0,SIGN(1,INTMAX-I-1)) JSTRNT(I) = MIN(1,JSTRNT(I+1)-JSTRNT(I))* 1 MAX(0,SIGN(1,I-INTMIN))*MAX(0,SIGN(1,INTMAX-I-1)) 1301 CONTINUE JINT(JSPMX) = 0 JSTRNT(JSPMX) = 0 DO 1302 I=INTMAX,INTMIN+1,-1 JINT(I) = JINT(I-1) JSTRNT(I) = JSTRNT(I-1) 1302 CONTINUE JINT(INTMIN) = 1 JSTRNT(INTMIN) = 1 DO 1303 I=INTMIN+1,INTMAX JINT(I) = JINT(I-1)+JINT(I) JSTRNT(I) = JSTRNT(I-1)+JSTRNT(I) 1303 CONTINUE C.... Simplification, if there is no spectral dependence required IF(.NOT.JSPFLG) THEN DO 1304 I=1,JSPMX JINT(I) = 1 JSTRNT(I) = 1 1304 CONTINUE JL = 1 JBAND = 1 ENDIF C.... Number of spectral bands for str. medium and hence number of C viewfactormatrices JL = JSTRNT(INTMAX) C.... Number of spectral bands for the surfaces and hence for the C radiation exchange JBAND = JINT(INTMAX) C IF(JL.GT.JLMX) CALL SET_ERR(450, * 'Error. Increase JLMX to allow more view factor matrices.',1) C IF(JL.GT.JLMX)STOP'increase JLMX to allow more viewfactormatrices' C IF(.NOT.NULLPR) THEN WRITE(LURAD,*) 1 '&&&&&& output from the spectral calculations &&&&&&' 1,' SPECTRAL DEPENDENCE=',JSPFLG WRITE(LURAD,*) JMTINC,' different materials in this calcul.n' WRITE(LURAD,*) JL,' bands for str. materials' WRITE(LURAD,*) JBAND,' bands for all materials' WRITE(LURAD,*) 'the band-structure for str. materials is:' WRITE(LURAD,*) (JSTRNT(J),J=1,JSPMX) WRITE(LURAD,*) 'the band-structure for all materials is:' WRITE(LURAD,*) (JINT(J),J=1,JSPMX) ENDIF C END C---------------------------------------------------------------------- c SUBROUTINE GBAND(NTZ,JL,JBAND,JINT,JSTRNT,JMTCTR,GCOHL, 1 JSPFLG,SURFL,GRELP,GSURF,GR,GE,GW,OPT) COMMON /LDATA/ LDAT1(31),NULLPR,LDAT2(30),DISTIL,LDAT3(21) LOGICAL LDAT1,NULLPR,LDAT2,DISTIL,LDAT3 C C.... Maximal number of radiating patches PARAMETER (JPTHMX=50) C.... Number of spectral intervals PARAMETER (JSPMX=60) C.... Number of spectral intervals PARAMETER (JBNDMX=7) C.... Maximal number of different materials in this C calculation (to limit the storage for optical data) PARAMETER (JMTLIM=10) C.... Range of material numbers in data file PARAMETER (JMTIND=500) C INTEGER JINT(JSPMX),JSTRNT(JSPMX) INTEGER JMTCTR(JMTIND) REAL OPT( JMTLIM , JSPMX , 9 ) REAL GRELP(JPTHMX,JBNDMX),GSURF(JPTHMX,JBNDMX) REAL GE(JPTHMX,JSPMX),GR(JPTHMX,JSPMX) C.... a new array providing the spectral weight for every surface C must be introduced REAL GW(JPTHMX,JSPMX) LOGICAL JSPFLG,SURFL,QNE,QEQ,QGT C.... unit: cm K DATA CC2 / 1.438769 / C----------------------------------------------------------------------- C.... Patchwise arrays GRELP(NTZ,JBNDMX) and GSURF(NTZ,JBNDMX) C contain the following information: C C.... The last entries of the array GE: C GRELP(JTZ,7) = relative patch# from direction 7, JTZ is value of EMMS C GRELP(JTZ,6) = relative patch# from direction 6, JTZ is value of EMMS C GRELP(JTZ,5) = relative patch# from direction 5, JTZ is value of EMMS C GRELP(JTZ,4) = relative patch# from direction 4, JTZ is value of EMMS C GRELP(JTZ,3) = relative patch# from direction 3, JTZ is value of EMMS C GRELP(JTZ,2) = relative patch# from direction 2, JTZ is value of EMMS C GRELP(JTZ,1) = 1. for thinwall, 0. otherwise C C.... The first entries of the array GE: C GE(JTZ,1) = the EMMSsivity of the 1. spectral band C GE(JTZ,2) = the EMMSsivity of the 2. spectral band C ... C GE(JTZ,JBAND) = the EMMSsivity of the last spectral band C C.... The last entries of the array GR: C GSURF(JTZ,4) = the material label of material below layer C GSURF(JTZ,3) = eventually the thickness of a surface layer C GSURF(JTZ,2) = the material label C GSURF(JTZ,1) = the absorption length of the radiation in the patch C GSURF(JTZ,5) = the radiation temperature of the patch C C.... The first entries of the array GE: C GR(JTZ,1) = the reflectivity of the 1. spectral band C GR(JTZ,2) = the reflectivity of the 2. spectral band C ... C GR(JTZ,JBAND) = the reflectivity of the last spectral band C C.... Since the number of spectral bands will be much smaller than C the number of spectral intervals, there will be no overwriting. C----------------------------------------------------------------------- C lurad=14 IF(.NOT.NULLPR) WRITE(LURAD,*) 1 '&&& information contained in the patchwise arrays &&&' C C.... Loop over patches to determine surface properties of the bands starts DO 1202 JTZ=1,NTZ C GE(JTZ,JBAND) contains the EMMSsivity of patch JTZ in the band JBAND, C GR(JTZ,JBAND) contains the reflectivity of patch JTZ in the band JBAND C 1-GR-GE is then the transmissivity of patch JTZ in the band JBAND C IF(.NOT.NULLPR) 1 WRITE(LURAD,*)'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& patch ', 1 jtz,' &&' C IF(JSPFLG) THEN C.... Spectral dependence activated C JBANDO = 1 DO 1212 JS=1,JSPMX IF(JINT(JS).EQ.0) GO TO 1212 C C.... Establish ref. from the label of the spectr. band to the label of the C view-factor matrix JINTJS = JINT(JS) JSTRNT(JINTJS) = JSTRNT(JS) C IF(JINTJS.NE.JBANDO) THEN C.... finish interval averaging of the previous band by normalization with C energy fraction in band GE(JTZ,JBANDO) = GE(JTZ,JBANDO)/GW(JTZ,JBANDO) GR(JTZ,JBANDO) = GR(JTZ,JBANDO)/GW(JTZ,JBANDO) GW(JTZ,JINTJS) = 0.0 GE(JTZ,JINTJS) = 0.0 GR(JTZ,JINTJS) = 0.0 ENDIF C C.... GWAVNO is the wavenumber of the upper end of the interval C mult. of GWAVNO with 10**(-1.0/20.)=0.891250938 C gives the waven. of the lower end of the interval C mult. of GWAVNO with 10**(-0.5/20.)=0.944060876 C gives the waven. of the middle of the interval C PLINT is the fraction of radiation in the spectral interval GWAVNO = 10**(2.+FLOAT(JS)/20.) GT = GSURF(JTZ,5) PLINT = FRACT(CC2*GWAVNO*0.891250938/GT)- 1 FRACT(CC2*GWAVNO/GT) GWAVNO = GWAVNO*0.944060876 C C.... extract n + i k of bulk from the coefficients in OPT(JM,JS,JPROP) JM = JMTCTR(INT(GSURF(JTZ,2))) GN = OPT(JM,JS,2)+OPT(JM,JS,3)*1.E-03*(GT-300.) 1 +OPT(JM,JS,4)*1.E-06*(GT-300.)**2 1 +OPT(JM,JS,5)*1.E-09*(GT-300.)**3 GK = OPT(JM,JS,6)+OPT(JM,JS,7)*1.E-03*(GT-300.) 1 +OPT(JM,JS,8)*1.E-06*(GT-300.)**2 1 +OPT(JM,JS,9)*1.E-09*(GT-300.)**3 GLNGTH=GSURF(JTZ,1) IF(INT(GSURF(JTZ,2)).LT.400) GLNGTH=1.E+06 GLAYER = 0.0 IF(SURFL.AND.QNE(GRELP(JTZ,1),1.0)) THEN C.... (when GRELP(JTZ,1) = 1. the surface is not a SURFL but a THINWALL) C extract ns + i ks of layer from the coefficients in OPT(JM,JS,JPROP) JMS = JMTCTR(INT(GSURF(JTZ,4))) GNS = OPT(JMS,JS,2)+OPT(JMS,JS,3)*1.E-03*(GT-300.) 1 +OPT(JMS,JS,4)*1.E-06*(GT-300.)**2 1 +OPT(JMS,JS,5)*1.E-09*(GT-300.)**3 GKS = OPT(JMS,JS,6)+OPT(JMS,JS,7)*1.E-03*(GT-300.) 1 +OPT(JMS,JS,8)*1.E-06*(GT-300.)**2 1 +OPT(JMS,JS,9)*1.E-09*(GT-300.)**3 GLAYER=GSURF(JTZ,3) ENDIF C C.... Calculation of TRANSMITTANCE, REFLECTANCE and EMITTANCE when the C coherence lenght of the radiation COHL (specified in the beginning C of GX2DVF, the parameter should be 0.1 mm be default) is larger C than the wavelength of radiation, interference effects in the layer C (if one is present) are included. Normal incidence of radiation is C assumed here. CALL COATNG(0.0,GWAVNO,GCOHL,GLAYER,GLNGTH, 1 GN,GK,GNS,GKS,GEM,GRES) C IF(.NOT.NULLPR) THEN WRITE(LURAD,*)'** band=',jintjs,', mat=',GSURF(JTZ,2) 1 ,', T=',gt,', v[1/cm]=',gwavno,', n=',gn,', k=',gk ENDIF C C.... Sum the properties of the interval to the band properties GW(JTZ,JINTJS) = GW(JTZ,JINTJS)+PLINT GE(JTZ,JINTJS) = GE(JTZ,JINTJS)+GEM*PLINT GR(JTZ,JINTJS) = GR(JTZ,JINTJS)+GRES*PLINT C.... Keep the bandnumber for the final normalization JBANDO = JINTJS 1212 CONTINUE C.... Normalization of the last band must not be forgotten GE(JTZ,JBANDO) = GE(JTZ,JBANDO)/GW(JTZ,JBANDO) GR(JTZ,JBANDO) = GR(JTZ,JBANDO)/GW(JTZ,JBANDO) ELSE C.... No spectral dependence activated GW(JTZ,1) = 1.0 GE(JTZ,1) = OPT(JMTCTR(INT(GSURF(JTZ,2))),1,1) GR(JTZ,1) = OPT(JMTCTR(INT(GSURF(JTZ,2))),1,2) ENDIF IF(.NOT.NULLPR) THEN IF(INT(GSURF(JTZ,2)).GE.100) THEN WRITE(LURAD,*) '****** WALL:' WRITE(LURAD,*) 'the absorption length=',GSURF(JTZ,1) WRITE(LURAD,*) 'relative patch# 7=',GRELP(JTZ,7) WRITE(LURAD,*) 'relative patch# 6=',GRELP(JTZ,6) WRITE(LURAD,*) 'relative patch# 5=',GRELP(JTZ,5) WRITE(LURAD,*) 'relative patch# 4=',GRELP(JTZ,4) WRITE(LURAD,*) 'relative patch# 3=',GRELP(JTZ,3) WRITE(LURAD,*) 'relative patch# 2=',GRELP(JTZ,2) IF(QGT(GSURF(JTZ,3),0.0)) WRITE(LURAD,*) 'SURFL' IF(QEQ(GRELP(JTZ,1),1.0)) WRITE(LURAD,*) 'THINWALL' ELSE WRITE(LURAD,*) 'SOLID WALL:' ENDIF WRITE(LURAD,*) '****** band dependent properties' WRITE(LURAD,*) 'PL(average) ',(GW(JTZ,JS),JS=1,JBAND) WRITE(LURAD,*) 'EM(average) ',(GE(JTZ,JS),JS=1,JBAND) WRITE(LURAD,*) 'RES(average) ',(GR(JTZ,JS),JS=1,JBAND) WRITE(LURAD,*) 'TRS(average) ', 1 (1.-GR(JTZ,JS)-GE(JTZ,JS),JS=1,JBAND) ENDIF C 1202 CONTINUE C IF(.NOT.NULLPR) WRITE(LURAD,*) 1 '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&' C END C---------------------------------------------------------------------- FUNCTION FRACT(ARG) C---------------------------------------------------------------------- C.... fract is the energy of black body radiation C from 0 to V = CC2*GWAVNO/GTEMP. C---------------------------------------------------------------------- REAL(8) PI,V,ACT,SM,F1 DATA PI/3.141592654D0/ V=DBLE(ARG) IF(V.GE.2.0D0) THEN ACT=0. DO 5 M=1,100 SM=DBLE(M) F1=(DEXP(-SM*V)/SM**4)*(((SM*V+3.0D0)*SM*V+6.0D0)*SM*V+6.0D0) ACT=ACT+F1 IF(DABS(F1).LE.1.D-07) GO TO 10 5 CONTINUE 10 ACT=ACT*(15.D0/PI**4) ELSE ACT = 1.0D0-(15.D0/PI**4)*V**3*(1.D0/3.D0-V/8.D0+V**2/60.D0- 1 V**4/5040.D0+V**6/272160.D0-V**8/13305600.D0) ENDIF FRACT=SNGL(ACT) END C----------------------------------------------------------------------- c SUBROUTINE COATNG(GSNTH,GWAVNO,GCOHL,GLAYER,GLNGTH, 1 GN,GK,GNS,GKS,GEM,GRES) C COMPLEX I,AMPLTD,D2,D3,RS,RP,TS,TP COMPLEX RS1,RS2,RS3,TS1,TS2,TS3,RP1,RP2,RP3,TP1,TP2,TP3 COMPLEX CD2,CD3,SALP,SBET,SRHO,SSIG,SEPS,PALP,PBET,PRHO,PSIG,PEPS COMPLEX G1CMPX,G2CMPX,G3CMPX COMPLEX GSNTH1,GSNTH2,GSNTH3,GCSTH1,GCSTH2,GCSTH3 LOGICAL QEQ DATA PI /3.14159265/ I=CMPLX( 0.0 , 1.0 ) C IF(QEQ(GLAYER,0.0)) THEN C.... Complex refractive index G1CMPX=CMPLX(1.0,0.0) G2CMPX=CMPLX(GN,-GK) GSNTH1=CMPLX( GSNTH , 0.0 ) C.... Snell's law GSNTH2 = GSNTH1*G1CMPX/G2CMPX GCSTH1 = CSQRT(1.0-GSNTH1**2) GCSTH2 = CSQRT(1.0-GSNTH2**2) C.... Assume planeparallel layer of gas(=1) | bulk(=2) | gas(=1) RS1 = AMPLTD(1,G1CMPX,G2CMPX,GCSTH1,GCSTH2) RP1 = AMPLTD(3,G1CMPX,G2CMPX,GCSTH1,GCSTH2) RS12 = CABS(RS1)**2 RP12 = CABS(RP1)**2 T2 = EXP(-4.*PI*GK*GLNGTH*GWAVNO/REAL(GCSTH2)) C.... S-polarized R123 = 1.0-(RS12*T2)**2 RS = RS12+((1.-RS12)*T2)**2*RS12/R123 TS = T2*(1.0-RS12)**2/R123 C.... P-polarized R123 = 1.0-(RP12*T2)**2 RP = RP12+((1.-RP12)*T2)**2*RP12/R123 TP = T2*(1.0-RP12)**2/R123 ELSE C.... Complex refractive index G1CMPX = CMPLX(1.0,0.0) G2CMPX = CMPLX(GNS,-GKS) G3CMPX = CMPLX(GN,-GK) GSNTH1 = CMPLX(GSNTH,0.0) C.... Snell's law GSNTH2 = GSNTH1*G1CMPX/G2CMPX GSNTH3 = GSNTH2*G2CMPX/G3CMPX GCSTH1 = CSQRT(1.0-GSNTH1**2) GCSTH2 = CSQRT(1.0-GSNTH2**2) GCSTH3 = CSQRT(1.0-GSNTH3**2) C.... Complex phases D2 = 2.0*PI*GLAYER*GWAVNO*GCSTH2*G2CMPX D3 = 2.0*PI*GLNGTH*GWAVNO*GCSTH3*G3CMPX C.... Complex amplitudes: assume planeparallel layer of C gas(=1) | coating(=2) | bulk(=3) | gas(=1) RS1 = AMPLTD(1,G1CMPX,G2CMPX,GCSTH1,GCSTH2) RS2 = AMPLTD(1,G2CMPX,G3CMPX,GCSTH2,GCSTH3) RS3 = AMPLTD(1,G3CMPX,G1CMPX,GCSTH3,GCSTH1) RP1 = AMPLTD(3,G1CMPX,G2CMPX,GCSTH1,GCSTH2) RP2 = AMPLTD(3,G2CMPX,G3CMPX,GCSTH2,GCSTH3) RP3 = AMPLTD(3,G3CMPX,G1CMPX,GCSTH3,GCSTH1) TS1 = AMPLTD(2,G1CMPX,G2CMPX,GCSTH1,GCSTH2) TS2 = AMPLTD(2,G2CMPX,G3CMPX,GCSTH2,GCSTH3) TS3 = AMPLTD(2,G3CMPX,G1CMPX,GCSTH3,GCSTH1) TP1 = AMPLTD(4,G1CMPX,G2CMPX,GCSTH1,GCSTH2) TP2 = AMPLTD(4,G2CMPX,G3CMPX,GCSTH2,GCSTH3) TP3 = AMPLTD(4,G3CMPX,G1CMPX,GCSTH3,GCSTH1) C IF(GCOHL.GT.GLAYER) THEN C----------------------------------------------------------------------- C.... When coherence length greater than layer thickness, C interference in layer CD2 = CEXP(-I*D2) CD3 = CEXP(-I*D3) RD3 = CABS(CD3) C SALP = RS1+RS2*CD2 SBET = RS3*(CD2+RS1*RS2)*RD3 SRHO = 1.0+RS1*RS2*CD2 SSIG = RS1*RS3*(1.+CD2)*RD3 SEPS = TS1*TS2*TS3*CD2*CD3 PALP = RP1+RP2*CD2 PBET = RP3*(CD2+RP1*RP2)*RD3 PRHO = 1.0+RP1*RP2*CD2 PSIG = RP1*RP3*(1.+CD2)*RD3 PEPS = TP1*TP2*TP3*CD2*CD3 C.... Squared amplitudes, averaged over the phase in the bulk IF(CABS(SRHO).LE.CABS(SSIG)) CALL SET_ERR(451, * 'Error. WRONG INTEGRAL, SET COHL=0.',1) C IF(CABS(SRHO).LE.CABS(SSIG))STOP 'WRONG INTEGRAL, SET COHL=0.' RS=(CABS(SALP)**2+CABS(SBET)**2)/(CABS(SRHO)**2-CABS(SSIG)**2) 1 -2.*REAL(SALP*CONJG(SBET)*SRHO*CONJG(SSIG))/ 1 ((CABS(SRHO)**2-CABS(SSIG)**2)*CABS(SRHO)**2) TS=CABS(SEPS)**2/(CABS(SRHO)**2-CABS(SSIG)**2) C IF(CABS(PRHO).LE.CABS(PSIG)) CALL SET_ERR(452, * 'Error. WRONG INTEGRAL, SET COHL=0.',1) C IF(CABS(PRHO).LE.CABS(PSIG))STOP 'WRONG INTEGRAL, SET COHL=0.' RP=(CABS(PALP)**2+CABS(PBET)**2)/(CABS(PRHO)**2-CABS(PSIG)**2) 1 -2.*REAL(PALP*CONJG(PBET)*SRHO*CONJG(PSIG))/ 1 ((CABS(PRHO)**2-CABS(PSIG)**2)*CABS(PRHO)**2) TP=CABS(PEPS)**2/(CABS(PRHO)**2-CABS(PSIG)**2) ELSE C----------------------------------------------------------------------- C.... Otherwise no interference in layer and bulk RS12 = CABS(RS1)**2 RS23 = CABS(RS2)**2 RS31 = CABS(RS3)**2 RP12 = CABS(RP1)**2 RP23 = CABS(RP2)**2 RP31 = CABS(RP3)**2 T2 = EXP(-4.*PI*GKS*GLAYER*GWAVNO/REAL(GCSTH2)) T3 = EXP(-4.*PI*GK *GLNGTH*GWAVNO/REAL(GCSTH3)) C.... S-polarized R123 = 1.0-RS12*T2**2*RS23 R231 = 1.0-RS23*T3**2*RS31 T23 = T2*(1.0-RS23)*T3 RS = RS12 + (1.0-RS12)**2*T2**2*RS23/R123 + 1 (1.-RS12)**2*T23**2*RS31/(R123*(R123*R231-RS12*T23**2*RS31)) TS=(1.-RS12)*T23*(1.-RS31)/(R123*(R123*R231-RS12*T23**2*RS31)) C.... P-polarized R123 = 1.0-RP12*T2**2*RP23 R231 = 1.0-RP23*T3**2*RP31 T23 = T2*(1.0-RP23)*T3 RP = RP12 + (1.-RP12)**2*T2**2*RP23/R123 + 1 (1.-RP12)**2*T23**2*RP31/(R123*(R123*R231-RP12*T23**2*RP31)) TP=(1.-RP12)*T23*(1.-RP31)/(R123*(R123*R231-RP12*T23**2*RP31)) ENDIF ENDIF C GRES = 0.5*(RS+RP) GTES = 0.5*(TS+TP) GEM = 1.0-GRES-GTES C END C----------------------------------------------------------------------- COMPLEX FUNCTION AMPLTD(IA,G1CMPX,G2CMPX,GCSTH1,GCSTH2) COMPLEX G1CMPX,G2CMPX,GCSTH1,GCSTH2 C C.... IA=1: r_s = reflectivity s-polarized C IA=2: t_s = transmissivity s-polarized C IA=3: r_p = reflectivity p-polarized C IA=4: t_p = transmissivity p-polarized C IF(IA.EQ.1) THEN AMPLTD = (GCSTH1*G1CMPX-GCSTH2*G2CMPX)/ 1 (GCSTH1*G1CMPX+GCSTH2*G2CMPX) ELSEIF(IA.EQ.2) THEN AMPLTD = 2.0*GCSTH1*G1CMPX/(GCSTH1*G1CMPX+GCSTH2*G2CMPX) ELSEIF(IA.EQ.3) THEN AMPLTD = (GCSTH1*G2CMPX-GCSTH2*G1CMPX)/ 1 (GCSTH1*G2CMPX+GCSTH2*G1CMPX) ELSEIF(IA.EQ.4) THEN AMPLTD = 2.0*GCSTH1*G1CMPX/(GCSTH2*G1CMPX+GCSTH1*G2CMPX) ENDIF END C----------------------------------------------------------------------- c SUBROUTINE GAUSSJ(A,N,NP,B,M,MP) C.... From W H Press, B P Flannery, S A Teukolsky, and W T Vetterling: C 'Numerical Recipes in FORTRAN' PARAMETER (JPTHMX=50) DIMENSION A(JPTHMX,JPTHMX),B(JPTHMX,JPTHMX) DIMENSION IPIV(JPTHMX),INDXR(JPTHMX),INDXC(JPTHMX) LOGICAL QEQ DO 11 J=1,N IPIV(J)=0 11 CONTINUE DO 22 I=1,N BIG=0. DO 13 J=1,N IF(IPIV(J).NE.1) THEN DO 12 K=1,N IF(IPIV(K).EQ.0) THEN IF(ABS(A(J,K)).GE.BIG) THEN BIG=ABS(A(J,K)) IROW=J ICOL=K ENDIF ELSEIF(IPIV(K).GT.1) THEN GOTO 999 ENDIF 12 CONTINUE ENDIF 13 CONTINUE IPIV(ICOL)=IPIV(ICOL)+1 IF(IROW.NE.ICOL) THEN DO 14 L=1,N DUM=A(IROW,L) A(IROW,L)=A(ICOL,L) A(ICOL,L)=DUM 14 CONTINUE DO 15 L=1,M DUM=B(IROW,L) B(IROW,L)=B(ICOL,L) B(ICOL,L)=DUM 15 CONTINUE ENDIF INDXR(I)=IROW INDXC(I)=ICOL IF(QEQ(A(ICOL,ICOL),0.0)) GOTO 999 PIVINV=1./A(ICOL,ICOL) A(ICOL,ICOL)=1. DO 16 L=1,N A(ICOL,L)=A(ICOL,L)*PIVINV 16 CONTINUE DO 17 L=1,M B(ICOL,L)=B(ICOL,L)*PIVINV 17 CONTINUE DO 21 LL=1,N IF(LL.NE.ICOL) THEN DUM=A(LL,ICOL) A(LL,ICOL)=0. DO 18 L=1,N A(LL,L)=A(LL,L)-A(ICOL,L)*DUM 18 CONTINUE DO 19 L=1,M B(LL,L)=B(LL,L)-B(ICOL,L)*DUM 19 CONTINUE ENDIF 21 CONTINUE 22 CONTINUE DO 24 L=N,1,-1 IF(INDXR(L).NE.INDXC(L)) THEN DO 23 K=1,N DUM=A(K,INDXR(L)) A(K,INDXR(L))=A(K,INDXC(L)) A(K,INDXC(L))=DUM 23 CONTINUE ENDIF 24 CONTINUE RETURN 999 CALL WRTCHS('Singular Matrix in GAUSSJ in gx2dvf.for') CALL SET_ERR(297, * 'Error. Singular Matrix in GAUSSJ in gx2dvf.for.',3) C CALL EAROUT(3) END c