ReadSSP Subroutine

public subroutine ReadSSP(Depth, freq)

Uses

  • proc~~readssp~~UsesGraph proc~readssp ReadSSP module~attenmod AttenMod proc~readssp->module~attenmod module~fatalerror FatalError module~attenmod->module~fatalerror

Reads SSP data from the environmental file and convert to Nepers/m

Arguments

Type IntentOptional Attributes Name
real(kind=8), intent(in) :: Depth
real(kind=8), intent(in) :: freq

Calls

proc~~readssp~~CallsGraph proc~readssp ReadSSP proc~crci CRCI proc~readssp->proc~crci proc~errout ERROUT proc~readssp->proc~errout proc~crci->proc~errout proc~franc_garr Franc_Garr proc~crci->proc~franc_garr

Called by

proc~~readssp~~CalledByGraph proc~readssp ReadSSP proc~ccubic cCubic proc~ccubic->proc~readssp proc~clinear cLinear proc~clinear->proc~readssp proc~cpchip cPCHIP proc~cpchip->proc~readssp proc~hexahedral Hexahedral proc~hexahedral->proc~readssp proc~n2linear n2Linear proc~n2linear->proc~readssp proc~quad Quad proc~quad->proc~readssp proc~evaluatessp EvaluateSSP proc~evaluatessp->proc~ccubic proc~evaluatessp->proc~clinear proc~evaluatessp->proc~cpchip proc~evaluatessp->proc~hexahedral proc~evaluatessp->proc~n2linear proc~evaluatessp->proc~quad proc~evaluatessp3d EvaluateSSP3D proc~evaluatessp3d->proc~ccubic proc~evaluatessp3d->proc~clinear proc~evaluatessp3d->proc~hexahedral proc~evaluatessp3d->proc~n2linear proc~bellhopcore BellhopCore proc~bellhopcore->proc~evaluatessp3d proc~influencecervenycart InfluenceCervenyCart proc~bellhopcore->proc~influencecervenycart proc~traceray3d TraceRay3D proc~bellhopcore->proc~traceray3d proc~traceray2d TraceRay2D proc~bellhopcore->proc~traceray2d proc~bellhopcore~2 BellhopCore proc~bellhopcore~2->proc~evaluatessp proc~bellhopcore~2->proc~influencecervenycart proc~traceray2d~2 TraceRay2D proc~bellhopcore~2->proc~traceray2d~2 proc~evaluatessp2d EvaluateSSP2D proc~evaluatessp2d->proc~evaluatessp3d proc~influencecervenycart->proc~evaluatessp proc~readenvironment ReadEnvironment proc~readenvironment->proc~evaluatessp proc~reflect2d~2 Reflect2D proc~reflect2d~2->proc~evaluatessp proc~reflect3d Reflect3D proc~reflect3d->proc~evaluatessp3d proc~step2d Step2D proc~step2d->proc~evaluatessp proc~step3d Step3D proc~step3d->proc~evaluatessp3d proc~traceray2d~2->proc~evaluatessp proc~traceray2d~2->proc~reflect2d~2 proc~traceray2d~2->proc~step2d proc~reflect2d Reflect2D proc~reflect2d->proc~evaluatessp2d proc~step2d~2 Step2D proc~step2d~2->proc~evaluatessp2d proc~traceray3d->proc~reflect3d proc~traceray3d->proc~step3d program~bellhop BELLHOP program~bellhop->proc~bellhopcore~2 program~bellhop->proc~readenvironment program~bellhop3d BELLHOP3D program~bellhop3d->proc~bellhopcore program~bellhop3d->proc~readenvironment proc~traceray2d->proc~reflect2d proc~traceray2d->proc~step2d~2

Source Code

  SUBROUTINE ReadSSP( Depth, freq )
    !! Reads SSP data from the environmental file and convert to Nepers/m

    USE AttenMod

    REAL     (KIND=8), INTENT(IN) :: freq, Depth

    WRITE( PRTFile, * )
    WRITE( PRTFile, * ) 'Sound speed profile:'

    WRITE( PRTFile, "( '      z         alphaR      betaR     rho        alphaI     betaI'    )" )
    WRITE( PRTFile, "( '     (m)         (m/s)      (m/s)   (g/cm^3)      (m/s)     (m/s)', / )" )

    SSP%NPts = 1

    DO iz = 1, MaxSSP

       READ(  ENVFile, *    ) SSP%z( iz ), alphaR, betaR, rhoR, alphaI, betaI
       WRITE( PRTFile, FMT="( F10.2, 3X, 2F10.2, 3X, F6.2, 3X, 2F10.4 )" ) SSP%z( iz ), alphaR, betaR, rhoR, alphaI, betaI

       SSP%c(   iz ) = CRCI( SSP%z( iz ), alphaR, alphaI, freq, freq, SSP%AttenUnit, betaPowerLaw, fT )
       SSP%rho( iz ) = rhoR

       ! verify that the depths are monotone increasing
       IF ( iz > 1 ) THEN
          IF ( SSP%z( iz ) <= SSP%z( iz - 1 ) ) THEN
              WRITE( PRTFile, * ) 'Bad depth in SSP: ', SSP%z( iz )
              CALL ERROUT( 'ReadSSP', 'The depths in the SSP must be monotone increasing' )
          END IF
       END IF

       ! compute gradient, cz
       IF ( iz > 1 ) SSP%cz( iz - 1 )  = ( SSP%c( iz ) - SSP%c( iz - 1 ) ) / &
                                         ( SSP%z( iz ) - SSP%z( iz - 1 ) )

       ! Did we read the last point?
       IF ( ABS( SSP%z( iz ) - Depth ) < 100. * EPSILON( 1.0e0 ) ) THEN
          SSP%Nz = SSP%NPts
          IF ( SSP%NPts == 1 ) THEN
              WRITE( PRTFile, * ) '#SSP points: ', SSP%NPts
              CALL ERROUT( 'ReadSSP', 'The SSP must have at least 2 points' )
          END IF

          RETURN
       ENDIF

       SSP%NPts = SSP%NPts + 1
    END DO

    ! Fall through means too many points in the profile
    WRITE( PRTFile, * ) 'Max. #SSP points: ', MaxSSP
    CALL ERROUT( 'ReadSSP', 'Number of SSP points exceeds limit' )

  END SUBROUTINE ReadSSP