C NEWPRO.FOR SUBROUTINE NEWPRO( NPROF, IPROF, RCOUPL, & CK, CKTAIL, EK, PHIR, MR, RD, NRD, & A, SUM2, FREQ, CPL, P, & ALFA, MODAVR, & ADA, SPEED, EIGF, & A3, B3, C3, & EE, ZZ, SSOLD, EXCH) DOUBLE PRECISION DH0I, DSEDI, EKM DOUBLE PRECISION FRQ C For a given profile number: C read in modes for current segment C project the pressure field onto the new modes C extract values of the modes at rcvr depths COMPLEX CZERO PARAMETER ( CZERO= (0.0, 0.0 ), MAXMED = 50 ) INCLUDE 'param.inc' INCLUDE 'acommon.inc' INTEGER EXTPOL INTEGER IRD( MAXNRD ) REAL ETIME, CPSEC(2) REAL CPUBEG, CPUEND REAL CPEIGV, CPEIGF, CPNEWP, CPFILE CHARACTER BCBOTR * 1, BCTOPR * 1 CHARACTER*8 MODEL REAL RD( * ), W( MAXNRD ), & RHO( MAXMED ), DEPTH( MAXMED ) REAL RCOUPL( * ) LOGICAL EXCH(*) REAL ALFA(*), MODAVR(*) DOUBLE PRECISION EK( * ) DOUBLE PRECISION ADA(*), SPEED(*), EIGF(*) DOUBLE PRECISION A3(*), B3(*), C3(*) DOUBLE PRECISION EE(*), ZZ(*), SSOLD(*) REAL PHIR(MODEN,*) COMPLEX*8 SUM COMPLEX CK( * ), CKTAIL( * ) COMPLEX P( * ), CPL( * ), A( * ), & GAMTR, GAMBR, PHITR, PHIBR, & KTOP2R, KBOT2R, TAIL, PHITMP, & PHITLN( MODEN ), PHIBLN( MODEN ), & GAMTLN( MODEN ), GAMBLN( MODEN ) COMPLEX SNAPCK COMPLEX PEKRT COMPLEX AEXT, CI COMMON /ENRGY/ MATCH COMMON /FLAGG/ PLANE, NOVOL, NOLOSS, NOCYL, LARGE, SUMPL COMMON /FLAGPL/ FIRST, FLAGP, FLAGPU, EXTPOL, CORREC COMMON /LUNIT/ LUPLP, LUPLT, LUPRT COMMON /MODEL/ MODEL COMMON /N/ MINMOD, MAXMOD, MODCUT, HBEAM, BPHVEL COMMON /TIMING/ CPEIGV, CPEIGF, CPNEWP, CPFILE DATA CI / (0.0, 1.0 )/ c 200 FORMAT(1X,' Evaluating excitation coeffs for interface at ', c & F9.3,' km',/, c & ' Left extreme ',F9.3,' km Right extreme ',f9.3,' km',/, c & ' SUM2**2 = ',E12.6) 200 FORMAT(1X,' Evaluating excitation coeffs for interface at ', & F9.3,' km') CPUBEG= ETIME(CPSEC) IF ( NRD. GT. MAXNRD ) THEN WRITE(LUPRT,*) 'NRD > MAXNRD in routine NEWPRO',NRD,MAXNRD STOP END IF C *** Get pressure along left the interface *** IF( MATCH .EQ. 3) THEN C IMPEDANCE MATCHING CALL PLEFTS( RHO, DEPTH, NMEDIA, & MR, CPL, P, NL, NR, NTOT, & BCTOPR, RHOTR, KTOP2R, DEPTTR, & BCBOTR, RHOBR, KBOT2R, DEPTBR, & ML, FREQ ) ELSE IF( MATCH .EQ. 2) THEN C REDUCED PRESSURE MATCHING CALL PLEFTR( RHO, DEPTH, NMEDIA, & MR, CPL, P, NL, NR, NTOT, & BCTOPR, RHOTR, KTOP2R, DEPTTR, & BCBOTR, RHOBR, KBOT2R, DEPTBR, & ML, FREQ ) ELSE C PRESSURE MATCHING CALL PLEFT( RHO, DEPTH, NMEDIA, & MR, CPL, P, NL, NR, NTOT, & BCTOPR, RHOTR, KTOP2R, DEPTTR, & BCBOTR, RHOBR, KBOT2R, DEPTBR, & ML, FREQ ) END IF CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC IF( IPROF .LT. NPROF ) THEN DELTAR= RCOUPL( IPROF + 1 ) - RCOUPL( IPROF ) ELSE DELTAR= 0.0 END IF DO 1000 IZ= 1, NR CPL( IZ )= CZERO 1000 CONTINUE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C *** Read in eigenfunctions and extract receiver values *** C Compute weights for mode interpolation at rcvr depths CALL WEIGHT( ZR, NTOT, RD, NRD, W, IRD ) sum2 = 0.0 MODFIL = 30 FRQ= DBLE( FREQ ) MH0I= AMH0(CURRNT) - 1 MSEDI= AMSED(CURRNT) DH0I= ADH0(CURRNT) DSEDI= ADSED(CURRNT) EIGF( 1 )= 0.0 DO 9000 MODE = 1, MR CALL EIGVEC( MODE, MH0I, MSEDI, DH0I, DSEDI, & FRQ, ALFA(MODE), & MINMOD, MODAVR, & ADA, SPEED, EIGF(2), & A3, B3, C3, EE, ZZ, SSOLD, EXCH, & EKM, EIGVL(MODE), EK(MODE) ) IF( NOLOSS .GT. 0 ) ALFA(MODE)= 0.0 CKTAIL(MODE)= CMPLX(SNGL(EKM), -ALFA(MODE)) CK(MODE)= CMPLX(SNGL(EK(MODE)), -ALFA(MODE)) IF( MODEL(1:7) .EQ. 'C-SNAP ' ) THEN SNAPCK = CMPLX( SNGL(EKM**2), 0.0 ) C SNAPCK = CMPLX( REAL( CKTAIL( MODE )**2 ), 0.0 ) ELSE SNAPCK = CK( MODE ) ** 2 END IF IF ( BCTOPR .EQ. 'A' ) THEN PHITR = CMPLX( SNGL(EIGF( 1 )), 0.0 ) GAMTR = PEKRT( SNAPCK - KTOP2R ) ENDIF IF ( BCBOTR .EQ. 'A' ) THEN PHIBR = CMPLX( SNGL(EIGF( NR )), 0.0 ) GAMBR = PEKRT( SNAPCK - KBOT2R ) ENDIF C --- Compute new amplitudes: C A = Integral[ P( z ) * PHI( z ) dz ] C (Repeat for each mode PHI to produce excitation coef. A) C Integral is done using trapezoidal rule SUM = CZERO DO 6000 IZ = 1, NTOT C ------ Calculate PHITMP at that depth PHITMP = CZERO ZT = ZR( IZ ) IF ( ZT .GT. DEPTBR ) THEN IF ( BCBOTR .EQ. 'A' ) PHITMP = PHIBR * & EXP( -GAMBR * ( ZT - DEPTBR ) ) ELSE IF ( ZT .LT. DEPTTR ) THEN IF ( BCTOPR .EQ. 'A' ) PHITMP = PHITR * & EXP( -GAMTR * ( DEPTTR - ZT ) ) ELSE PHITMP = CMPLX( SNGL(EIGF( IZ )), 0.0 ) ENDIF SUM = SUM + P(IZ ) * PHITMP 6000 CONTINUE C *** Compute the contribution from tails in the halfspaces *** IF ( BCTOPR .EQ. 'A' ) THEN SUM = SUM + TAIL( ZR( 1 ), PHITL, GAMTL, DEPTTL, ML, & PHITR / RHOTR, GAMTR, DEPTTR ) ENDIF IF ( BCBOTR .EQ. 'A' ) THEN SUM = SUM + TAIL( ZR( NTOT ), PHIBL, GAMBL, DEPTBL, ML, & PHIBR / RHOBR, GAMBR, DEPTBR ) END IF A( MODE ) = SUM sum2 = sum2 + abs( sum )**2 C *** Subtabulate modes at receiver depths *** DO 8000 IR = 1, NRD PHIR( MODE, IR ) = 0. IF ( RD( IR ) .LT. DEPTTR ) THEN C ------ Rcvr in upper halfspace IF ( BCTOPR .EQ. 'A' ) PHIR( MODE, IR ) = real(PHITR * & EXP( -GAMTR * ( DEPTTR - RD( IR ) ) ) ) ELSE IF ( RD( IR ) .GT. DEPTBR ) THEN C ------ Rcvr in lower halfspace IF ( BCBOTR .EQ. 'A' ) PHIR( MODE, IR ) = real(PHIBR * & EXP( -GAMBR * ( RD( IR ) - DEPTBR ) )) ELSE IZ = IRD( IR ) PHIR( MODE, IR ) = real(CMPLX( SNGL(EIGF( IZ )) + & W( IR ) * ( SNGL(EIGF( IZ+1 )) - & SNGL(EIGF( IZ )) ), 0.0 ) ) ENDIF 8000 CONTINUE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C Compute pressure at the new interface "deltar" km away C IF( IPROF .LT. NPROF ) THEN AEXT= A( MODE ) * EXP( -CI * CK( MODE ) * DELTAR ) DO 8200 IZ= 1, NR CPL( IZ )= CPL( IZ ) + SNGL(EIGF( IZ )) * AEXT 8200 CONTINUE C ------ Halfspace information ------ PHITLN( MODE ) = AEXT * SNGL(EIGF( 1 )) PHIBLN( MODE ) = AEXT * SNGL(EIGF( NR )) GAMTLN( MODE ) = CZERO GAMBLN( MODE ) = CZERO IF ( BCTOPR .EQ. 'A' ) GAMTLN( MODE ) = GAMTR IF ( BCBOTR .EQ. 'A' ) GAMBLN( MODE ) = GAMBR C END IF CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 9000 CONTINUE DO 8300 MODE = 1, MR PHITL(MODE)= PHITLN(MODE) PHIBL(MODE)= PHIBLN(MODE) GAMTL(MODE)= GAMTLN(MODE) GAMBL(MODE)= GAMBLN(MODE) 8300 CONTINUE DEPTTL= DEPTTR DEPTBL= DEPTBR CLOSE( MODFIL ) C WRITE(LUPRT,200) RCOUPL(IPROF)*1.0E-3, RFILE(IPROF-1), C & RFILE(IPROF), SUM2 IF(FLAGPU .LT. 1.0) WRITE(LUPRT,200) RCOUPL(IPROF)*1.0E-3 C CALL STATST( A, MODAVR, MR, SUM2 ) CALL STATST( A, MR, SUM2 ) CPUEND= ETIME(CPSEC) CPNEWP= CPNEWP + CPUEND - CPUBEG C *********************************************** ML= MR C *********************************************** RETURN END