0
-
Source:ReadEnvironmentBell.f90
0
-
Graph:ReadEnvironmentBell.gcno
0
-
Data:ReadEnvironmentBell.gcda
1
-
!! Environment input file parsing and setup for BELLHOP
3
-
MODULE ReadEnvironmentBell
4
-
!! Provides environment file reading and initialization
11
-
USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY: ERROR_UNIT
18
73*
SUBROUTINE ReadEnvironment( FileRoot, ThreeD )
19
-
!! Reads and parses the main environment file
21
-
! Routine to read in and echo all the input data
22
-
! Note that default values of SSP, DENSITY, Attenuation will not work
25
-
USE SourceReceiverPositions
27
-
REAL (KIND=8), PARAMETER :: c0 = 1500.0
28
-
LOGICAL, INTENT(IN ) :: ThreeD
29
-
CHARACTER (LEN=80), INTENT(IN ) :: FileRoot
30
-
INTEGER :: NPts, NMedia, iostat
32
-
REAL (KIND=8) :: x( 2 ), t( 2 ), c, cimag, gradc( 2 ), crr, crz, czz, rho, sigma, Depth
33
-
CHARACTER (LEN= 2) :: AttenUnit
34
-
CHARACTER (LEN=10) :: PlotType
36
73
WRITE( PRTFile, * ) 'BELLHOP/BELLHOP3D'
37
73
WRITE( PRTFile, * )
39
-
! Open the environmental file
40
73*
OPEN( UNIT = ENVFile, FILE = TRIM( FileRoot ) // '.env', STATUS = 'OLD', IOSTAT = iostat, ACTION = 'READ' )
41
73
IF ( IOSTAT /= 0 ) THEN ! successful open?
42
#####
WRITE( PRTFile, * ) 'ENVFile = ', TRIM( FileRoot ) // '.env'
43
#####
CALL ERROUT( 'BELLHOP - READIN', 'Unable to open the environmental file' )
46
-
! Prepend model name to title
48
#####
Title( 1 : 11 ) = 'BELLHOP3D- '
49
#####
READ( ENVFile, * ) Title( 12 : 80 )
51
73
Title( 1 : 9 ) = 'BELLHOP- '
52
73
READ( ENVFile, * ) Title( 10 : 80 )
55
73
WRITE( PRTFile, * ) Title
57
73
READ( ENVFile, * ) freq
58
73
WRITE( PRTFile, '('' frequency = '', G11.4, '' Hz'', / )' ) freq
60
73
READ( ENVFile, * ) NMedia
61
73
WRITE( PRTFile, * ) 'Dummy parameter NMedia = ', NMedia
62
73
IF ( NMedia /= 1 ) CALL ERROUT( 'READIN', &
63
#####
'Only one medium or layer is allowed in BELLHOP; sediment layers must be handled using a reflection coefficient' )
65
73
CALL ReadTopOpt( Bdry%Top%HS%Opt, Bdry%Top%HS%BC, AttenUnit, FileRoot )
69
73
IF ( Bdry%Top%HS%BC == 'A' ) THEN
70
3
WRITE( PRTFile, "( //, ' z alphaR betaR rho alphaI betaI', / )" )
71
3
WRITE( PRTFile, "( ' (m) (m/s) (m/s) (g/cm^3) (m/s) (m/s)', / )" )
74
73
CALL TopBot( freq, AttenUnit, Bdry%Top%HS )
76
-
! ****** Read in ocean SSP data ******
78
72
READ( ENVFile, * ) NPts, Sigma, Bdry%Bot%HS%Depth
79
72
WRITE( PRTFile, * )
80
72
WRITE( PRTFile, FMT = "( ' Depth = ', F10.2, ' m' )" ) Bdry%Bot%HS%Depth
82
72
IF ( Bdry%Top%HS%Opt( 1 : 1 ) == 'A' ) THEN
83
#####
WRITE( PRTFile, * ) 'Analytic SSP option'
84
-
! following is hokey, should be set in Analytic routine
86
#####
SSP%z( 1 ) = 0.0
87
#####
SSP%z( 2 ) = Bdry%Bot%HS%Depth
89
216
x = [ 0.0D0, Bdry%Bot%HS%Depth ] ! tells SSP Depth to read to
91
72
CALL EvaluateSSP( x, t, c, cimag, gradc, crr, crz, czz, rho, freq, 'INI' )
94
71
Bdry%Top%HS%Depth = SSP%z( 1 ) ! Depth of top boundary is taken from first SSP point
95
-
! bottom depth should perhaps be set the same way?
98
71
Bdry%Bot%HS%Opt = ' ' ! initialize to blanks
99
71
READ( ENVFile, * ) Bdry%Bot%HS%Opt, Sigma
100
71
WRITE( PRTFile, * )
101
71
WRITE( PRTFile, FMT = "(33X, '( RMS roughness = ', G10.3, ' )' )" ) Sigma
103
11
SELECT CASE ( Bdry%Bot%HS%Opt( 2 : 2 ) )
105
71*
WRITE( PRTFile, * ) ' Bathymetry file selected'
106
-
CASE( '-', '_', ' ' )
108
71*
CALL ERROUT( 'READIN', 'Unknown bottom option letter in second position' )
111
71
Bdry%Bot%HS%BC = Bdry%Bot%HS%Opt( 1 : 1 )
112
71
CALL TopBot( freq, AttenUnit, Bdry%Bot%HS )
114
-
! *** source and receiver locations ***
116
71
CALL ReadSxSy( ThreeD ) ! Read source/receiver x-y coordinates
118
71
ZMin = SNGL( Bdry%Top%HS%Depth )
119
71
ZMax = SNGL( Bdry%Bot%HS%Depth )
120
-
! CALL ReadSzRz( ZMin + 100 * SPACING( ZMin ), ZMax - 100 * SPACING( ZMax ) ) ! not sure why I had this
121
71
CALL ReadSzRz( ZMin, ZMax )
122
71
CALL ReadRcvrRanges
123
71*
IF ( ThreeD ) CALL ReadRcvrBearings
124
71
CALL ReadfreqVec( freq, Bdry%Top%HS%Opt( 6:6 ) )
125
71
CALL ReadRunType( Beam%RunType, PlotType )
127
71
Depth = Zmax - Zmin ! water depth
128
71
CALL ReadRayElevationAngles( freq, Depth, Bdry%Top%HS%Opt, Beam%RunType )
129
71*
IF ( ThreeD ) CALL ReadRayBearingAngles( freq, Bdry%Top%HS%Opt, Beam%RunType )
131
71
WRITE( PRTFile, * )
132
71
WRITE( PRTFile, * ) '__________________________________________________________________________'
133
71
WRITE( PRTFile, * )
135
-
! Limits for tracing beams
137
71
IF ( ThreeD ) THEN
138
#####
READ( ENVFile, * ) Beam%deltas, Beam%Box%x, Beam%Box%y, Beam%Box%z
139
#####
Beam%Box%x = 1000.0 * Beam%Box%x ! convert km to m
140
#####
Beam%Box%y = 1000.0 * Beam%Box%y ! convert km to m
142
#####
IF ( Beam%deltas == 0.0 ) Beam%deltas = ( Bdry%Bot%HS%Depth - Bdry%Top%HS%Depth ) / 10.0 ! Automatic step size selection
143
-
! WRITE( PRTFile, '('' frequency = '', G11.4, '' Hz'', / )' ) freq
145
#####
WRITE( PRTFile, * )
146
#####
WRITE( PRTFile, fmt = '( '' Step length, deltas = '', G11.4, '' m'' )' ) Beam%deltas
147
#####
WRITE( PRTFile, * )
148
#####
WRITE( PRTFile, fmt = '( '' Maximum ray x-range, Box%x = '', G11.4, '' m'' )' ) Beam%Box%x
149
#####
WRITE( PRTFile, fmt = '( '' Maximum ray y-range, Box%y = '', G11.4, '' m'' )' ) Beam%Box%y
150
#####
WRITE( PRTFile, fmt = '( '' Maximum ray z-range, Box%z = '', G11.4, '' m'' )' ) Beam%Box%z
152
71
READ( ENVFile, * ) Beam%deltas, Beam%Box%z, Beam%Box%r
154
71
WRITE( PRTFile, * )
155
71
WRITE( PRTFile, fmt = '( '' Step length, deltas = '', G11.4, '' m'' )' ) Beam%deltas
156
71
WRITE( PRTFile, * )
157
71
WRITE( PRTFile, fmt = '( '' Maximum ray depth, Box%z = '', G11.4, '' m'' )' ) Beam%Box%z
158
71
WRITE( PRTFile, fmt = '( '' Maximum ray range, Box%r = '', G11.4, ''km'' )' ) Beam%Box%r
160
71
Beam%Box%r = 1000.0 * Beam%Box%r ! convert km to m
163
-
! *** Beam characteristics ***
164
71
Beam%Type( 4 : 4 ) = Beam%RunType( 7 : 7 ) ! selects beam shift option
166
#####
SELECT CASE ( Beam%Type( 4 : 4 ) )
168
#####
WRITE( PRTFile, * ) 'Beam shift in effect'
170
71
WRITE( PRTFile, * ) 'No beam shift in effect'
173
71
IF ( Beam%RunType( 1 : 1 ) /= 'R' ) THEN ! no worry about the beam type if this is a ray trace run
175
-
! Beam%Type( 1 : 1 ) is
176
-
! 'G' or '^' Geometric hat beams in Cartesian coordinates
177
-
! 'g' Geometric hat beams in ray-centered coordinates
178
-
! 'B' Geometric Gaussian beams in Cartesian coordinates
179
-
! 'b' Geometric Gaussian beams in ray-centered coordinates
180
-
! 'S' Simple Gaussian beams
181
-
! 'C' Cerveny Gaussian beams in Cartesian coordinates
182
-
! 'R' Cerveny Gaussian beams in Ray-centered coordinates
183
-
! Beam%Type( 2 : 2 ) controls the setting of the beam width
184
-
! 'F' space Filling
185
-
! 'M' minimum width
187
-
! Beam%Type( 3 : 3 ) controls curvature changes on boundary reflections
191
-
! Beam%Type( 4 : 4 ) selects whether beam shifts are implemented on boundary reflection
195
-
! Curvature change can cause overflow in grazing case
196
-
! Suppress by setting BeamType( 3 : 3 ) = 'Z'
198
60
Beam%Type( 1 : 1 ) = Beam%RunType( 2 : 2 )
199
60*
SELECT CASE ( Beam%Type( 1 : 1 ) )
200
-
CASE ( 'G', 'g' , '^', 'B', 'b', 'S' ) ! geometric hat beams, geometric Gaussian beams, or simple Gaussian beams
201
-
CASE ( 'R', 'C' ) ! Cerveny Gaussian Beams; read extra lines to specify the beam options
202
#####
READ( ENVFile, * ) Beam%Type( 2 : 3 ), Beam%epsMultiplier, Beam%rLoop
203
#####
WRITE( PRTFile, * )
204
#####
WRITE( PRTFile, * )
205
#####
WRITE( PRTFile, * ) 'Type of beam = ', Beam%Type( 1 : 1 )
207
#####
SELECT CASE ( Beam%Type( 3 : 3 ) )
209
#####
WRITE( PRTFile, * ) 'Curvature doubling invoked'
211
#####
WRITE( PRTFile, * ) 'Curvature zeroing invoked'
213
#####
WRITE( PRTFile, * ) 'Standard curvature condition'
215
#####
CALL ERROUT( 'READIN', 'Unknown curvature condition' )
218
#####
WRITE( PRTFile, * ) 'Epsilon multiplier', Beam%epsMultiplier
219
#####
WRITE( PRTFile, * ) 'Range for choosing beam width', Beam%rLoop
222
-
! LP: These values are not initialized if not written in the file,
223
-
! and Component is not always written in the test env files.
224
#####
Beam%Nimage = 1
225
#####
Beam%iBeamWindow = 4
226
#####
Beam%Component = 'P'
227
#####
READ( ENVFile, * ) Beam%Nimage, Beam%iBeamWindow, Beam%Component
228
#####
WRITE( PRTFile, * )
229
#####
WRITE( PRTFile, * ) 'Number of images, Nimage = ', Beam%Nimage
230
#####
WRITE( PRTFile, * ) 'Beam windowing parameter = ', Beam%iBeamWindow
231
#####
WRITE( PRTFile, * ) 'Component = ', Beam%Component
233
60*
CALL ERROUT( 'READIN', 'Unknown beam type (second letter of run type)' )
237
71
WRITE( PRTFile, * )
240
71
END SUBROUTINE ReadEnvironment
242
-
! **********************************************************************!
244
73*
SUBROUTINE ReadTopOpt( TopOpt, BC, AttenUnit, FileRoot )
246
-
CHARACTER (LEN= 6), INTENT( OUT ) :: TopOpt
247
-
CHARACTER (LEN= 1), INTENT( OUT ) :: BC ! Boundary condition type
248
-
CHARACTER (LEN= 2), INTENT( OUT ) :: AttenUnit
249
-
CHARACTER (LEN=80), INTENT( IN ) :: FileRoot
252
73
TopOpt = ' ' ! initialize to blanks
253
73
READ( ENVFile, * ) TopOpt
254
73
WRITE( PRTFile, * )
256
73
SSP%Type = TopOpt( 1 : 1 )
257
73
BC = TopOpt( 2 : 2 )
258
73
AttenUnit = TopOpt( 3 : 4 )
259
73
SSP%AttenUnit = AttenUnit
261
-
! SSP approximation options
263
2
SELECT CASE ( SSP%Type )
265
2
WRITE( PRTFile, * ) ' N2-linear approximation to SSP'
267
64
WRITE( PRTFile, * ) ' C-linear approximation to SSP'
269
1
WRITE( PRTFile, * ) ' PCHIP approximation to SSP'
271
3
WRITE( PRTFile, * ) ' Spline approximation to SSP'
273
3
WRITE( PRTFile, * ) ' Quad approximation to SSP'
274
3*
OPEN ( FILE = TRIM( FileRoot ) // '.ssp', UNIT = SSPFile, FORM = 'FORMATTED', STATUS = 'OLD', IOSTAT = iostat )
275
3*
IF ( IOSTAT /= 0 ) THEN ! successful open?
276
#####
WRITE( PRTFile, * ) 'SSPFile = ', TRIM( FileRoot ) // '.ssp'
277
#####
CALL ERROUT( 'BELLHOP - READIN', 'Unable to open the SSP file' )
280
#####
WRITE( PRTFile, * ) ' Hexahedral approximation to SSP'
281
#####
OPEN ( FILE = TRIM( FileRoot ) // '.ssp', UNIT = SSPFile, FORM = 'FORMATTED', STATUS = 'OLD', IOSTAT = iostat )
282
#####
IF ( IOSTAT /= 0 ) THEN ! successful open?
283
#####
WRITE( PRTFile, * ) 'SSPFile = ', TRIM( FileRoot ) // '.ssp'
284
#####
CALL ERROUT( 'BELLHOP - READIN', 'Unable to open the SSP file' )
287
#####
WRITE( PRTFile, * ) ' Analytic SSP option'
289
73*
CALL ERROUT( 'READIN', 'Unknown option for SSP approximation' )
292
-
! Attenuation options
294
#####
SELECT CASE ( AttenUnit( 1 : 1 ) )
296
#####
WRITE( PRTFile, * ) ' Attenuation units: nepers/m'
298
68*
WRITE( PRTFile, * ) ' Attenuation units: dB/mkHz'
300
#####
WRITE( PRTFile, * ) ' Attenuation units: dB/m'
302
5*
WRITE( PRTFile, * ) ' Attenuation units: dB/wavelength'
304
#####
WRITE( PRTFile, * ) ' Attenuation units: Q'
306
#####
WRITE( PRTFile, * ) ' Attenuation units: Loss parameter'
308
73*
CALL ERROUT( 'READIN', 'Unknown attenuation units' )
311
-
! optional addition of volume attenuation using standard formulas
313
#####
SELECT CASE ( AttenUnit( 2 : 2 ) )
315
#####
WRITE( PRTFile, * ) ' THORP volume attenuation added'
317
2
WRITE( PRTFile, * ) ' Francois-Garrison volume attenuation added'
318
2
READ( ENVFile, * ) T, Salinity, pH, z_bar
319
-
WRITE( PRTFile, "( ' T = ', G11.4, 'degrees S = ', G11.4, ' psu pH = ', G11.4, ' z_bar = ', G11.4, ' m' )" ) &
320
2*
T, Salinity, pH, z_bar
322
#####
WRITE( PRTFile, * ) ' Biological attenaution'
323
#####
READ( ENVFile, * ) NBioLayers
324
#####
WRITE( PRTFile, * ) ' Number of Bio Layers = ', NBioLayers
326
71*
DO iBio = 1, NBioLayers
327
#####
READ( ENVFile, * ) bio( iBio )%Z1, bio( iBio )%Z2, bio( iBio )%f0, bio( iBio )%Q, bio( iBio )%a0
328
#####
WRITE( PRTFile, * ) ' Top of layer = ', bio( iBio )%Z1, ' m'
329
#####
WRITE( PRTFile, * ) ' Bottom of layer = ', bio( iBio )%Z2, ' m'
330
#####
WRITE( PRTFile, * ) ' Resonance frequency = ', bio( iBio )%f0, ' Hz'
331
#####
WRITE( PRTFile, * ) ' Q = ', bio( iBio )%Q
332
#####
WRITE( PRTFile, * ) ' a0 = ', bio( iBio )%a0
336
73*
CALL ERROUT( 'READIN', 'Unknown top option letter in fourth position' )
339
6
SELECT CASE ( TopOpt( 5 : 5 ) )
341
73*
WRITE( PRTFile, * ) ' Altimetry file selected'
342
-
CASE ( '-', '_', ' ' )
344
73*
CALL ERROUT( 'READIN', 'Unknown top option letter in fifth position' )
347
1
SELECT CASE ( TopOpt( 6 : 6 ) )
349
73*
WRITE( PRTFile, * ) ' Development options enabled'
352
73*
CALL ERROUT( 'READIN', 'Unknown top option letter in sixth position' )
355
73
END SUBROUTINE ReadTopOpt
357
-
! **********************************************************************!
359
71*
SUBROUTINE ReadRunType( RunType, PlotType )
360
-
!! Reads and validates the run type parameters
362
-
! Read the RunType variable and echo with explanatory information to the print file
364
-
USE SourceReceiverPositions
366
-
CHARACTER (LEN= 7), INTENT( OUT ) :: RunType
367
-
CHARACTER (LEN=10), INTENT( OUT ) :: PlotType
369
71
READ( ENVFile, * ) RunType
370
71
WRITE( PRTFile, * )
372
11
SELECT CASE ( RunType( 1 : 1 ) )
374
11
WRITE( PRTFile, * ) 'Ray trace run'
376
18*
WRITE( PRTFile, * ) 'Eigenray trace run'
378
#####
WRITE( PRTFile, * ) 'Incoherent TL calculation'
380
#####
WRITE( PRTFile, * ) 'Semi-coherent TL calculation'
382
16
WRITE( PRTFile, * ) 'Coherent TL calculation'
384
26*
WRITE( PRTFile, * ) 'Arrivals calculation, ASCII file output'
386
#####
WRITE( PRTFile, * ) 'Arrivals calculation, binary file output'
388
71*
CALL ERROUT( 'READIN', 'Unknown RunType selected' )
391
#####
SELECT CASE ( RunType( 2 : 2 ) )
393
#####
WRITE( PRTFile, * ) 'Cartesian beams'
395
#####
WRITE( PRTFile, * ) 'Ray centered beams'
397
#####
WRITE( PRTFile, * ) 'Simple gaussian beams'
399
#####
WRITE( PRTFile, * ) 'Geometric gaussian beams in ray-centered coordinates'
401
3*
WRITE( PRTFile, * ) 'Geometric gaussian beams in Cartesian coordinates'
403
#####
WRITE( PRTFile, * ) 'Geometric hat beams in ray-centered coordinates'
405
68
RunType( 2 : 2 ) = 'G'
406
71
WRITE( PRTFile, * ) 'Geometric hat beams in Cartesian coordinates'
409
2
SELECT CASE ( RunType( 4 : 4 ) )
411
2
WRITE( PRTFile, * ) 'Point source (cylindrical coordinates)'
413
1
WRITE( PRTFile, * ) 'Line source (Cartesian coordinates)'
415
68
RunType( 4 : 4 ) = 'R'
416
71
WRITE( PRTFile, * ) 'Point source (cylindrical coordinates)'
419
1
SELECT CASE ( RunType( 5 : 5 ) )
421
1
WRITE( PRTFile, * ) 'Rectilinear receiver grid: Receivers at ( Rr( ir ), Rz( ir ) ) )'
422
1*
PlotType = 'rectilin '
424
#####
WRITE( PRTFile, * ) 'Irregular grid: Receivers at Rr( : ) x Rz( : )'
425
#####
IF ( Pos%NRz /= Pos%NRr ) CALL ERROUT( 'READIN', 'Irregular grid option selected with NRz not equal to Nr' )
426
#####
PlotType = 'irregular '
428
70
WRITE( PRTFile, * ) 'Rectilinear receiver grid: Receivers at Rr( : ) x Rz( : )'
429
70
RunType( 5 : 5 ) = 'R'
430
141
PlotType = 'rectilin '
433
#####
SELECT CASE ( RunType( 6 : 6 ) )
435
#####
WRITE( PRTFile, * ) 'N x 2D calculation (neglects horizontal refraction)'
437
#####
WRITE( PRTFile, * ) '3D calculation'
439
71
RunType( 6 : 6 ) = '2'
442
71
END SUBROUTINE ReadRunType
444
-
! **********************************************************************!
446
144*
SUBROUTINE TopBot( freq, AttenUnit, HS )
447
-
!! Handles top and bottom boundary conditions
449
-
REAL (KIND=8), INTENT( IN ) :: freq ! center / nominal frequency (wideband not supported)
450
-
CHARACTER (LEN=2), INTENT( IN ) :: AttenUnit
451
-
TYPE( HSInfo ), INTENT( INOUT ) :: HS
452
-
REAL (KIND=8) :: Mz, vr, alpha2_f ! values related to grain size
454
-
! Echo to PRTFile user's choice of boundary condition
456
70
SELECT CASE ( HS%BC )
458
70*
WRITE( PRTFile, * ) ' VACUUM'
460
#####
WRITE( PRTFile, * ) ' Perfectly RIGID'
462
72*
WRITE( PRTFile, * ) ' ACOUSTO-ELASTIC half-space'
464
#####
WRITE( PRTFile, * ) ' Grain size to define half-space'
466
2*
WRITE( PRTFile, * ) ' FILE used for reflection loss'
468
#####
WRITE( PRTFile, * ) ' Writing an IRC file'
470
#####
WRITE( PRTFile, * ) ' reading PRECALCULATED IRC'
472
144*
CALL ERROUT( 'TopBot', 'Unknown boundary condition type' )
475
-
! ****** Read in BC parameters depending on particular choice ******
481
72
SELECT CASE ( HS%BC )
482
-
CASE ( 'A' ) ! *** Half-space properties ***
484
72
READ( ENVFile, * ) zTemp, alphaR, betaR, rhoR, alphaI, betaI
485
-
WRITE( PRTFile, FMT = "( F10.2, 3X, 2F10.2, 3X, F6.2, 3X, 2F10.4 )" ) &
486
71
zTemp, alphaR, betaR, rhoR, alphaI, betaI
488
-
! dummy parameters for a layer with a general power law for attenuation
489
-
! these are not in play because the AttenUnit for this is not allowed yet
491
71
betaPowerLaw = 1.0
494
71
HS%cp = CRCI( zTemp, alphaR, alphaI, freq, freq, AttenUnit, betaPowerLaw, ft )
495
71
HS%cs = CRCI( zTemp, betaR, betaI, freq, freq, AttenUnit, betaPowerLaw, ft )
498
-
CASE ( 'G' ) ! *** Grain size (formulas from UW-APL HF Handbook)
500
-
! These formulas are from the UW-APL Handbook
501
-
! The code is taken from older Matlab and is unnecesarily verbose
502
-
! vr is the sound speed ratio
503
-
! rhor is the density ratio
504
#####
READ( ENVFile, * ) zTemp, Mz
505
#####
WRITE( PRTFile, FMT = "( F10.2, 3X, F10.2 )" ) zTemp, Mz
507
#####
IF ( Mz >= -1 .AND. Mz < 1 ) THEN
508
#####
vr = 0.002709 * Mz ** 2 - 0.056452 * Mz + 1.2778
509
#####
rhor = 0.007797 * Mz ** 2 - 0.17057 * Mz + 2.3139
510
#####
ELSE IF ( Mz >= 1 .AND. Mz < 5.3 ) THEN
511
#####
vr = -0.0014881 * Mz ** 3 + 0.0213937 * Mz ** 2 - 0.1382798 * Mz + 1.3425
512
#####
rhor = -0.0165406 * Mz ** 3 + 0.2290201 * Mz ** 2 - 1.1069031 * Mz + 3.0455
514
#####
vr = -0.0024324 * Mz + 1.0019
515
#####
rhor = -0.0012973 * Mz + 1.1565
518
#####
IF ( Mz >= -1 .AND. Mz < 0 ) THEN
519
#####
alpha2_f = 0.4556
520
#####
ELSE IF ( Mz >= 0 .AND. Mz < 2.6 ) THEN
521
#####
alpha2_f = 0.4556 + 0.0245 * Mz
522
#####
ELSE IF( Mz >= 2.6 .AND. Mz < 4.5 ) THEN
523
#####
alpha2_f = 0.1978 + 0.1245 * Mz
524
#####
ELSE IF( Mz >= 4.5 .AND. Mz < 6.0 ) THEN
525
#####
alpha2_f = 8.0399 - 2.5228 * Mz + 0.20098 * Mz ** 2
526
#####
ELSE IF( Mz >= 6.0 .AND. Mz < 9.5 ) THEN
527
#####
alpha2_f = 0.9431 - 0.2041 * Mz + 0.0117 * Mz ** 2
529
#####
alpha2_f = 0.0601
532
-
! AttenUnit = 'L' ! loss parameter
533
-
!!! following uses a reference sound speed of 1500 ???
534
-
!!! should be sound speed in the water, just above the sediment
535
-
! the term vr / 1000 converts vr to units of m per ms
536
#####
alphaR = vr * 1500.0
537
#####
alphaI = alpha2_f * ( vr / 1000 ) * 1500.0 * log( 10.0 ) / ( 40.0 * pi ) ! loss parameter Sect. IV., Eq. (4) of handbook
539
#####
HS%cp = CRCI( zTemp, alphaR, alphaI, freq, freq, 'L ', betaPowerLaw, ft )
542
-
WRITE( PRTFile, FMT = "( 'Converted sound speed =', 2F10.2, 3X, 'density = ', F10.2, 3X, 'loss parm = ', F10.4 )" ) &
543
#####
HS%cp, rhor, alphaI
545
-
CASE ( 'V', 'R', 'F', 'W', 'P' )
548
#####
WRITE( ERROR_UNIT, * ) 'TopBot: Unknown boundary condition type: ', HS%BC
549
144*
CALL ERROUT( 'TopBot', 'Unknown boundary condition type' )
552
143
END SUBROUTINE TopBot
554
-
! **********************************************************************!
556
71*
SUBROUTINE OpenOutputFiles( FileRoot, ThreeD )
557
-
!! Opens output files based on run type
559
-
! Write appropriate header information
561
-
USE SourceReceiverPositions
566
-
LOGICAL, INTENT( IN ) :: ThreeD
567
-
CHARACTER (LEN=80), INTENT( IN ) :: FileRoot
569
-
CHARACTER (LEN=10) :: PlotType
571
29
SELECT CASE ( Beam%RunType( 1 : 1 ) )
572
-
CASE ( 'R', 'E' ) ! Ray trace or Eigenrays
573
29*
OPEN ( FILE = TRIM( FileRoot ) // '.ray', UNIT = RAYFile, FORM = 'FORMATTED' )
574
29
WRITE( RAYFile, * ) '''', Title( 1 : 50 ), ''''
575
29
WRITE( RAYFile, * ) freq
576
29
WRITE( RAYFile, * ) Pos%NSx, Pos%NSy, Pos%NSz
577
29
WRITE( RAYFile, * ) Angles%Nalpha, Angles%Nbeta
578
29
WRITE( RAYFile, * ) Bdry%Top%HS%Depth
579
29
WRITE( RAYFile, * ) Bdry%Bot%HS%Depth
581
58
IF ( ThreeD ) THEN
582
#####
WRITE( RAYFile, * ) '''xyz'''
584
29
WRITE( RAYFile, * ) '''rz'''
587
-
CASE ( 'A' ) ! arrival file in ascii format
588
26*
OPEN ( FILE = TRIM( FileRoot ) // '.arr', UNIT = ARRFile, FORM = 'FORMATTED' )
590
26
IF ( ThreeD ) THEN
591
#####
WRITE( ARRFile, * ) '''3D'''
593
26
WRITE( ARRFile, * ) '''2D'''
596
26
WRITE( ARRFile, * ) freq
598
-
! write source locations
600
26
IF ( ThreeD ) THEN
601
#####
WRITE( ARRFile, * ) Pos%NSx, Pos%Sx( 1 : Pos%NSx )
602
#####
WRITE( ARRFile, * ) Pos%NSy, Pos%Sy( 1 : Pos%NSy )
603
#####
WRITE( ARRFile, * ) Pos%NSz, Pos%Sz( 1 : Pos%NSz )
605
26*
WRITE( ARRFile, * ) Pos%NSz, Pos%Sz( 1 : Pos%NSz )
608
-
! write receiver locations
610
26*
WRITE( ARRFile, * ) Pos%NRz, Pos%Rz( 1 : Pos%NRz )
611
26*
WRITE( ARRFile, * ) Pos%NRr, Pos%Rr( 1 : Pos%NRr )
612
26*
IF ( ThreeD ) THEN
613
#####
WRITE( ARRFile, * ) Pos%Ntheta, Pos%theta( 1 : Pos%Ntheta )
616
-
CASE ( 'a' ) ! arrival file in binary format
617
#####
OPEN ( FILE = TRIM( FileRoot ) // '.arr', UNIT = ARRFile, FORM = 'UNFORMATTED' )
619
#####
IF ( ThreeD ) THEN
620
#####
WRITE( ARRFile ) '''3D'''
622
#####
WRITE( ARRFile ) '''2D'''
625
#####
WRITE( ARRFile ) SNGL( freq )
627
-
! write source locations
629
#####
IF ( ThreeD ) THEN
630
#####
WRITE( ARRFile ) Pos%NSx, Pos%Sx( 1 : Pos%NSx )
631
#####
WRITE( ARRFile ) Pos%NSy, Pos%Sy( 1 : Pos%NSy )
632
#####
WRITE( ARRFile ) Pos%NSz, Pos%Sz( 1 : Pos%NSz )
634
#####
WRITE( ARRFile ) Pos%NSz, Pos%Sz( 1 : Pos%NSz )
637
-
! write receiver locations
639
#####
WRITE( ARRFile ) Pos%NRz, Pos%Rz( 1 : Pos%NRz )
640
#####
WRITE( ARRFile ) Pos%NRr, Pos%Rr( 1 : Pos%NRr )
641
#####
IF ( ThreeD ) THEN
642
#####
WRITE( ARRFile ) Pos%Ntheta, Pos%theta( 1 : Pos%Ntheta )
648
-
! following to set PlotType has already been done in READIN if that was used for input
649
16
SELECT CASE ( Beam%RunType( 5 : 5 ) )
651
16*
PlotType = 'rectilin '
653
#####
PlotType = 'irregular '
655
16*
PlotType = 'rectilin '
658
87*
CALL WriteHeader( TRIM( FileRoot ) // '.shd', Title, REAL( freq ), atten, PlotType )
661
71
END SUBROUTINE OpenOutputFiles
663
-
END MODULE ReadEnvironmentBell