@@ -402,11 +402,15 @@ def fov_sa(nc, keys, **kwargs):
402
402
# loadAtlanticMask_full(altmaskfile, maskname='tmaskatl', grid=grid)
403
403
404
404
# Load and mask vo and vso (vo * salinity)
405
- vso = np .ma .array (nc .variables ['vso' ][:]).squeeze () # #vso in PSU m/s
405
+ # vso = np.ma.array(nc.variables['vso'][:]).squeeze() # #vso in PSU m/s
406
406
vo = np .ma .array (nc .variables ['vo' ][:]).squeeze () # #vso in PSU m/s
407
-
407
+
408
+ #print(nc.variables['vso'], '\n', nc.variables['vo'])
408
409
# Calculate salinity and subtract reference salininty.
409
- sal0 = vso / vo - sal_ref
410
+ fn2 = nc .filename .replace ('grid_V' , 'grid_T' ).replace ('grid-V' , 'grid-T' )
411
+ nc2 = dataset (fn2 , 'r' )
412
+ sal0 = nc2 .variables ['so' ][:].squeeze ()
413
+ nc2 .close ()
410
414
411
415
# Calculate zonal cell length.
412
416
# Lon grid is evenly spaced, so only need one cell length per latitude.
@@ -418,14 +422,21 @@ def fov_sa(nc, keys, **kwargs):
418
422
mask_3d = np .stack (mask_3d , axis = 0 )
419
423
420
424
# check sizes
421
- if vso .shape != mask_3d .shape :
425
+ if sal0 .shape != mask_3d .shape :
422
426
print ('FOV: Shapes don\' t match' )
423
427
assert 0
424
428
425
429
# Apply masks to 3d data
426
- vo = np .ma .masked_where (vso .mask + mask_3d + (vo == 0. ), vo ) # shape alignment?
427
- sal0 = np .ma .masked_where (vso .mask + mask_3d + (sal0 == 0. ), sal0 ) # shape alignment?
430
+ vo = np .ma .masked_where (vo .mask + mask_3d + (vo == 0. ), vo ) # shape alignment?
431
+ sal0 = np .ma .masked_where (sal0 .mask + mask_3d + (sal0 == 0. ), sal0 ) # shape alignment?
432
+
433
+ #print('a sal0', sal0.shape, sal0.min(), sal0.max())
428
434
435
+ sal0 = sal0 - sal_ref
436
+ #print('b sal0', sal0.shape, sal0.min(), sal0.max())
437
+
438
+ #print('vo:', vo.shape, vo.min(), vo.max())
439
+ #print('c sal0', sal0.shape, sal0.min(), sal0.max())
429
440
# from matplotlib import pyplot
430
441
# for name, dat in zip(
431
442
# ['vo', 'sal0', 'xarea', 'lats', 'lons', 'mask2d', 'mask3d', 'alttmask',],
@@ -443,25 +454,27 @@ def fov_sa(nc, keys, **kwargs):
443
454
444
455
# calculate cross sectional area by multiplying zonal cell length by cell depth thickness
445
456
xarea = np .ma .masked_where (sal0 .mask , thkcello )
446
-
447
457
for (z , y , x ), thk in maenumerate (xarea ):
448
458
la = lats [y , x ]
449
459
xarea [z , y , x ] = thk * zonal_distances [la ]
450
- #xarea_sum = xarea.sum(axis=(0,2))
451
460
xarea_sum2 = xarea .sum (axis = 2 )
461
+ #print('xarea_sum2:', xarea_sum2.shape, xarea_sum2.min(), xarea_sum2.max())
452
462
453
- # Vbar = SUM( vo(x)*thickcello(x)*dx) / SUM( thickcello*dx)
454
463
464
+ # Calculate vobar and sobar.
465
+ # Vbar = SUM( vo(x)*thickcello(x)*dx) / SUM( thickcello*dx)
455
466
vobar = (vo * xarea ).sum (2 ) / xarea_sum2
467
+ #obar = vo.mean(2)
468
+ #print('vobar', vobar.shape, vobar.min(), vobar.max())
456
469
457
- print ('vobar' , vobar .shape , vobar .min (), vobar .max ())
458
-
470
+ #sobar = sal0.mean(2)
459
471
sobar = (sal0 * xarea ).sum (2 ) / xarea_sum2
460
- print ('sobar' , sobar .shape , sobar .min (), sobar .max ())
472
+ # print('sobar', sobar.shape, sobar.min(), sobar.max())
461
473
474
+ vsbar = (vobar * sobar * xarea_sum2 ).sum (0 )
475
+ #vsbar = (vobar*sobar * xarea.mean(2)).sum(0)
462
476
463
- vsbar = (vobar * sobar * xarea_sum2 ).sum (1 )
464
- print ('vsbar' , vsbar .shape , vsbar .min (), vsbar .max ())
477
+ #print('vsbar', vsbar.shape, vsbar.min(), vsbar.max(), vsbar.compressed())
465
478
466
479
total = vsbar .mean ()
467
480
@@ -484,12 +497,11 @@ def fov_sa(nc, keys, **kwargs):
484
497
#pyplot.close()
485
498
486
499
# Take the mean in the meridional area
487
- total = total .mean ()
500
+ # total = total.mean()
488
501
489
502
# Apply factors from paper.
490
503
output = (- 1. / sal_ref ) * total # 1/PSU * PSU m/s
491
- print (output )
492
- assert 0
504
+ output = output * 1e-6 # Convert m3 s-1 to Sv.
493
505
return output
494
506
495
507
0 commit comments