이번에는 합성 풍속과 풍향을 구해보겠습니다
평균 풍속 풍향이라고만 하면 하루동안 측정한 자료를 모아서 24시간으로 나누면 되지 않냐 생각하실 수도 있습니다
풍속은 1시간마다 측정하여 24로 나누는 산술평균 방법을 사용해도 괜찮지만
방향을 포함하고 있는 풍향은 얘기가 좀 다릅니다
벡터 형태이기 때문에 방향이 정말 중요합니다
![](https://blog.kakaocdn.net/dn/Upgw3/btrPy9fLGRD/td2Tu8gWsYwwkcLwlibGwk/img.png)
바람의 성분)
바람 벡터를 동서 성분과 남북 성분으로 나누어서 주로 생각합니다
쉽게 표현하기 위해 동서 성분은 u성분, 남북 성분을 v성분이라고 부릅니다
합성 풍향 풍속을 구하기 위해서는 평균 풍향 풍속을 먼저 구해야합니다
![](https://blog.kakaocdn.net/dn/caVdM2/btrPzjJkAcs/5kkbM0pLqajLrii3ob8KD0/img.png)
원래는 이런 공식을 사용해서 구한 다음 해야하지만 조금 더 쉬운 공식을 사용하겠습니다
그전에 기상학적 바람 벡터와 수학적 바람벡터부터 알아보겠습니다
기상학적 바람 벡터와 수학적 바람 벡터)
![](https://blog.kakaocdn.net/dn/buXk8U/btrPyKmZSVa/PyMlSVkTT2ETMW7Ycp1GS0/img.png)
자 여기 기상학적으로 표현된 바람 벡터 그림이 있습니다
기상학적으로는 풍향을 나타낼 때 불어오는 곳을 기준으로 표현합니다
s 방향에서 불어가면 남풍, w 방향에서 불어가면 서풍 이렇게 말이죠
북쪽을 0도로 잡고 시계방향으로 각도가 증가합니다
북쪽이 0도, 동쪽이 90도, 남쪽이 180도, 서쪽이 270도
하지만 이걸 수학적인 벡터로 표현하면 많이 달라집니다
![](https://blog.kakaocdn.net/dn/KCC1F/btrPxIwNNbm/tLFL1OdDnMZOWtRzoE8o9k/img.png)
수학적으로 바람을 표현하면 불어가는 방향을 나타내는 것입니다
사방위가 반대인 이유는 위에서 아래로 부는 바람이 북풍이기 때문에
북풍 벡터다 라는 뜻을 보여주기 위한 겁니다
각도 표시도 조금 다릅니다
기상학적 바람에서는 북풍이 0도 였지만 수학적으로는 사분면 개념을 사용하기 때문에
서쪽을 기준으로 반시계 방향으로
서쪽이 0도, 남쪽이 90도, 동쪽이 180도, 북쪽이 270도 이렇게 표현을 합니다
지금까지 이걸 왜 설명했냐 하면 포트란에 바람의 각도를 입력시킬때는 수학적인 바람표현이 필요하지만
기상청이 제공하는 자료는 기상학적인 바람 표현이기 때문입니다
동쪽을 예로 들어서 설명해보면 기상학적인 바람표기는 0도 이지만 수학적 표기는 270도인 것이죠
이걸로 봤을 때 각도 변환을 270 - 기상학적 바람을 해주어야 한 다는 것을 알 수 있습니다
이렇게 변환된 각도를 가지고
![](https://blog.kakaocdn.net/dn/ncHKH/btrPzAYuaA2/OycUiPN0IRO33o9m8dfaI0/img.png)
위의 공식을 이용해서 u성분과 v성분을 구할 수 있는것이죠
이번 작업은 개념 설명도 길고 코드도 쪼금 길어서 포스팅을 2개로 나눠서 하겠습니다
너무 길면 읽기 힘드니까요
첫번째에서 코드에 각도가 왜 저렇게 들어갔는지 이해하시고
두번째로 넘어오시면 좋을 것 같습니다
혹시 코드를 개인적으로 해석해보실 분들을 위해 코드는 마지막에 적어두겠습니다
REAL, DIMENSION(24) :: ws, wd
REAL, DIMENSION(24) :: u, v, cpwd
REAL, parameter :: pi = 4. * atan(1.)
REAL :: ap1, ap2, ap3, ap4
CHARACTER(2), parameter :: ug=char(int(Z'C2'))//char(int(Z'B0'))
open(1, file = 'time.dat')
open(2, file = 'time2.dat')
write(2, 60) 'u component', 'v compnent', 'compose component'
60 format(a, 3x, a, 3x, a)
do i = 1, 24
read(1, 10) ws(i), wd(i)
10 format(6x, f3.1, 1x, f3.0)
u(i) = ws(i) * cos((270. - wd(i)) * (pi/180))
v(i) = ws(i) * sin((270. - wd(i)) * (pi/180))
cpwd(i) = atan2(v(i), u(i))
ap1 = ap1 + u(i)
ap2 = ap2 + v(i)
ap3 = ap3 + cpwd(i)
write(2, 20) u(i), v(i), cpwd(i)
20 format(f10.4, 2x, f10.4, 5x, f10.4)
end do
rp1 = ap1/24.
rp2 = ap2/24.
rp3 = (270. - ((atan2(rp2, rp1)) * (180/pi))) - 360.
write(2, 30) "compose u direction componet :", rp1
30 format(a,f10.4, 1x, 'm/s')
write(2, 40) "compose v direction component :", rp2
40 format(a, f10.4, 1x, 'm/s')
write(2, 50) "compose wind speed :", sqrt(rp1**2 + rp2**2)
50 format(a,f10.4, 1x, 'm/s')
write(2, 70) 'compose wind direction', rp3, ug
70 format(a, f8.2, 1x, a)
end
'Fortran' 카테고리의 다른 글
작업7 : Fortran으로 파장 별 방출에너지 구하기 (0) | 2022.10.26 |
---|---|
작업6 : Fortran으로 합성 풍속 풍향 구하기2 (0) | 2022.10.26 |
작업4 : Fortran으로 시간방정식 계산하기 (0) | 2022.10.26 |
작업3: Fortran으로 태양의 적위 계산하기 (0) | 2022.10.26 |
작업2 : 이심률 구하기 (3) | 2022.10.18 |