-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeostrophicWind.py
87 lines (62 loc) · 2.84 KB
/
geostrophicWind.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/bin/python3
import logging
import sys
from pathlib import Path
import numpy as np
import numpy.core.records as rec
import constants as const
import utils
logger = logging.getLogger(__name__)
def main(casenames):
for casename in casenames:
logger.info(f'Processing geostrophic wind for case {casename}')
casedir = const.CASES_DIR / casename
outputdir = casedir / const.SOWFATOOLS_DIR
utils.create_directory(outputdir)
utils.configure_logging((outputdir / f'log.{Path(__file__).stem}'),
level=logging.DEBUG)
geodir = casedir / 'postProcessing/geostrophicWind'
timefolders = [timefolder for timefolder in geodir.iterdir()]
timefolders.sort(key=lambda x: float(x.name))
logger.info(f'Found {len(timefolders)} time folders')
for timefolder in timefolders:
fname = timefolder / 'faceSource.dat.gz'
logger.debug(f'Reading {fname}')
rawdata = np.genfromtxt(fname,dtype='str')
for i,val in np.ndenumerate(rawdata):
rawdata[i] = val.replace('(','').replace(')','')
rawdata = rawdata.astype('float')
if 'data' in locals():
data = np.vstack((data,rawdata))
else:
data = np.array(rawdata)
del rawdata
data = utils.remove_overlaps(data,0)
dt = np.empty_like(data[:,0])
dt[0] = data[0,0] - np.floor(data[0,0])
for i in range(1,len(dt)):
dt[i] = data[i,0] - data[i-1,0]
data = np.insert(data,1,dt,axis=1)
names = ['time','dt','Ux','Uy','Uz','Umag','UAvg']
dtype = [(name, 'float') for name in names]
header = ' '.join(names)
umag = np.linalg.norm(data[:,2:],axis=1)
data = np.column_stack((data,umag))
average = utils.calculate_moving_average(data,-1,1)
finalvalue = average[-1]
data = np.column_stack((data,average))
logging.getLogger('matplotlib').setLevel(logging.WARNING)
import matplotlib.pyplot as plt
plt.plot(data[:,0],umag)
plt.plot(data[:,0],average)
fname = outputdir / (f'{casename}_geostrophicWind.png')
logger.info(f'Saving file {fname.name}')
plt.savefig(fname)
data = np.array(rec.fromarrays(data.transpose(), dtype))
fname = outputdir / (f'{casename}_geostrophicWind.gz')
logger.info(f'Saving file {fname.name}')
np.savetxt(fname,data,header=header)
logger.info(f'Finished case {casename}.')
logger.info(f'Average geostrophic wind magnitude is {finalvalue:.2f}')
if __name__ == "__main__":
main(sys.argv[1:])