C EVALPR.FOR SUBROUTINE EVALPR( RFILE, RCOUPL, NPROF, IPROF, PHIR, & SD, RD, NRD, ISHIFT, NR, CK, M, OPT, RNG, SUM2A, FREQ, & Z0L, C0L, Z1L, C1L, Z0R, C0R, Z1R, C1R, & ND0LR, Z0LR, CE0L, CE0R, & ND1LR, Z1LR, CE1L, CE1R, & Z0, C0, Z1, C1, Z0NRM, Z1NRM, & ALFA, EK, CKTAIL, MODAVR, ISO, MY, ADA, SPEED, EIGF, & A3, B3, C3, EE, ZZ, SSOLD, EXCH, PRDEP) C Computes pressure field using coupled mode theory C Normalized to pressure of point source at 1 meter C OPT = X Cartesian (X, Z) coordinates C OPT = R Cylindrical (R, Z) coordinates C Note number of propagating modes is reset after first segment. C Thus M restricts the number of modes in the source field but C thereafter energy is allowed to couple into higher-order modes. C Note flaws: C should half-space contribution include imaginary part? C C COMPLEX ARG, FACT COMPLEX CI, CZERO COMPLEX PRDEP( * ) PARAMETER ( CI= ( 0.0, 1.0 ), CZERO= ( 0.0, 0.0 ), & PI= 3.1415926 ) INTEGER COHRNT, INCRNT INCLUDE 'param.inc' INCLUDE 'acommon.inc' INCLUDE 'bcommon.inc' CHARACTER*4 OPT REAL RD( * ), RCOUPL( * ), RNG( * ), SUM2A( * ), & RFILE( * ) REAL PHIR(MODEN,*) COMPLEX PHIS( MODEN ), A( MODEN ), SUM, & CK( * ), CKTAIL( * ) COMPLEX CPL( NPOINT ), CPR( NPOINT ) COMMON /ACOEFF/ COLEFT, NSTART COMMON /MODEAD/ COHRNT, INCRNT COMMON /LUNIT/ LUPLP, LUPLT, LUPRT COMMON /TLUNIT/ LUTLC, LUTLI 100 FORMAT(1H ,I8.8,'.DAT ') 200 FORMAT(1X,' Marching toward range ',F10.1,'m - # modes=', I4) 300 FORMAT(1X,' Crossing interface at',F9.3, & ' km new mode_set at',F9.3,' km') 400 FORMAT(1X,/,' * * WARNING FOR NEXT SOURCE FREQUENCY: ', & ' MODE CUTOFF AT ',F8.3,' km') C Next two lines are introduced as a reminder in case we generate a Xfer C file C ARG= CMPLX( 0., -PI/4. ) C FACT= CEXP(ARG) C *** Ranges (in meters) where new profiles are used are obtained C *** from array RCOUPL IF ( RCOUPL( 1 ) .NE. 0.0 ) & STOP 'FATAL ERROR: First profile must start at zero range' RCOUPL( NPROF + 1 ) = 1.0E9 C *** Evaluate mode excitation coefficients, A(mode) *** IPROF = 0 NSD = 1 CALL START( IPROF, SD, RD, NSD, NRD, OPT, & CK, CKTAIL, EK, PHIS, PHIR, M, & M1, FREQ, & A, SUM2A, CPL, CPR, RCOUPL(2), & ALFA, MODAVR, & ADA, SPEED, EIGF, & A3, B3, C3, EE, ZZ, SSOLD, EXCH) IF( IPROF .GT. 1 ) THEN ISTART= 2 ELSE ISTART= 1 END IF RNG1 = RNG( 1 ) IF ( RNG( 1 ) .EQ. 0.0 ) RNG( 1 ) = RNG(2) C *** March forward in range *** IR = ISTART 2400 CONTINUE C C *** Crossing into new range segment? *** IF ( RNG( IR ) .GT. RCOUPL( IPROF + 1 ) ) THEN IPROF = IPROF + 1 C ------ Advance to interface IF ( IR .EQ. 1 ) THEN CALL ADVPHA( RCOUPL( IPROF ) , A, CK, M ) ELSE CALL ADVPHA( RCOUPL( IPROF ) - RNG( IR - 1 ), A, CK, M ) ENDIF C ------ Here's where we cross over IF ( IPROF .LE. NPROF ) THEN CP PRINT 300, RCOUPL(IPROF)*1.0E-3, RFILE(IPROF) CALL NEWMOD( *4000, RFILE(IPROF), & Z0L,C0L,Z1L,C1L,Z0R,C0R,Z1R,C1R, & ND0LR, Z0LR, CE0L, CE0R, & ND1LR, Z1LR, CE1L, CE1R, & Z0,C0,Z1,C1,Z0NRM,Z1NRM, & EK,ISO,MY,MAXMSH,MODEN, & ADA, SPEED, ZZ) CALL NEWPRO( NPROF, IPROF, RCOUPL, & CK, CKTAIL, EK, PHIR, M, RD, NRD, & A, SUM2A(IPROF), FREQ, CPL, CPR, & ALFA, MODAVR, & ADA, SPEED, EIGF, & A3, B3, C3, & EE, ZZ, SSOLD, EXCH) CP WRITE(LUPRT,200) RNG(IR), M ENDIF C ------ Are there other segments to cross? 2600 CONTINUE IF ( RNG( IR ) .GT. RCOUPL( IPROF + 1 ) ) THEN IPROF = IPROF + 1 CALL ADVPHA( RCOUPL( IPROF ) - RCOUPL( IPROF - 1 ), & A, CK, M ) IF ( IPROF .LE. NPROF ) THEN CP PRINT 300, RCOUPL(IPROF)*1.0E-3, RFILE(IPROF) CALL NEWMOD( *4000, RFILE(IPROF), & Z0L,C0L,Z1L,C1L,Z0R,C0R,Z1R,C1R, & ND0LR, Z0LR, CE0L, CE0R, & ND1LR, Z1LR, CE1L, CE1R, & Z0,C0,Z1,C1,Z0NRM,Z1NRM, & EK, ISO, MY, MAXMSH, MODEN, & ADA, SPEED, ZZ) CALL NEWPRO( NPROF, IPROF, RCOUPL, & CK, CKTAIL, EK, PHIR, M, RD, NRD, & A, SUM2A(IPROF), FREQ, CPL, CPR, & ALFA, MODAVR, & ADA, SPEED, EIGF, & A3, B3, C3, & EE, ZZ, SSOLD, EXCH) END IF CP WRITE(LUPRT,200) RNG(IR), M GOTO 2600 ENDIF C ------ Advance the remaining distance CALL ADVPHA( RNG( IR ) - RCOUPL( IPROF ), A, CK, M ) ELSE IF ( IR .EQ. 1 ) THEN CALL ADVPHA( RNG( IR ) , A, CK, M ) ELSE CALL ADVPHA( RNG( IR ) - RNG( IR - 1 ), A, CK, M ) ENDIF ENDIF C *** For each rcvr add up modal contributions *** PRDEP(1)= CZERO DO 2800 IRD = 1+ISHIFT, NRD SUM = CZERO DO 2700 MODE = 1, M SUM = SUM + A( MODE ) * PHIR( MODE, IRD - ISHIFT ) cfmc SUM = SUM + A( MODE ) * PHIR( MODE, IRD ) 2700 CONTINUE IF ( OPT(1:1) .EQ. 'R' ) SUM = SUM / SQRT( RNG( IR ) ) PRDEP(IRD)= CI*SUM 2800 CONTINUE WRITE(LUTLC) (PRDEP(IRD), IRD=1, NRD+ISHIFT) C ------ Next range step C IR = IR + 1 IF ( IR .LE. NR ) GO TO 2400 RNG( 1 ) = RNG1 RETURN 4000 CONTINUE RNG( 1 ) = RNG1 PRINT 400, 1.0e-3*RNG(IR) DO 4200 IRNG= IR, NR WRITE(LUTLC) ( CZERO, IRD=1, NRD) 4200 CONTINUE RETURN END