Reads SSP data from the environmental file and convert to Nepers/m
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=8), | intent(in) | :: | Depth | |||
real(kind=8), | intent(in) | :: | freq |
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