2017-10-24 3 views
0

현재 횡단면 해석을 수행하기 위해 WRF 출력 데이터에서 3 차원 전장을 계산하기 위해 python 스크립트를 실행하려고합니다. 필자는 이미 비교 대상이되는 Petterson 's Formula의 2 차원 버전을 사용하고 있지만, 3 차원 버전은 2 차원 버전의 사소한 부분 만 캡쳐하고 있습니다.Python에서 WRF 출력으로 3D Frontogenesis 계산하기

나는 3 차원 frontogenesis을 계산하는 데 사용하고 공식은 다음과 같습니다

EQN 2 내 두 차원 코드 (925 고전력 증폭기)를 생산하는 내용의 예 이미지입니다 : 그라데이션 용어입니다 EQN 1

Image 1 Image 2

,536,913 :

그리고 여기는 동일한 이차원 (고전력 증폭기 925) 표면까지 보간 삼차원 코드의

적어도 일부 정확한 정보가 이미지의 동일한 지역에 표시된다는 사실은 내가 적어도 올바른 방향으로 가고 있으며 어딘가에 약간의 오류가 있음을 보여줍니다. 내가 본 바로는, 내 파이썬 코드는 여기에, 적어도 np.gradient 기능의 작동 방식에 대한 이해하여 올바른 표시 frontogenesis 계산 코드 : 참조, DX를하고

# Fetch the fields we need 
p = getvar(ncFile, "pressure") * 100 # Convert to Pa 
z = getvar(ncFile, "z") 
ua = getvar(ncFile, "ua") 
va = getvar(ncFile, "va")   
theta = getvar(ncFile, "theta") 
omega = getvar(ncFile, "omega") 

dz = np.gradient(z, axis=0) 
dp = np.gradient(p, axis=0) 

theta_gradient = np.sqrt((np.gradient(theta, dx, axis=2))**2 + (np.gradient(theta, dy, axis=1))**2 + (np.gradient(theta, axis=0)/dz)**2) 

zonal_gradient = (-1 * np.gradient(theta, dx, axis=2)) * ((np.gradient(ua, dx, axis=2) * np.gradient(theta, dx, axis=2)) + (np.gradient(va, dx, axis=2) * np.gradient(theta, dy, axis=1))) 
meridional_gradient = (-1 * np.gradient(theta, dy, axis=1)) * ((np.gradient(ua, dy, axis=1) * np.gradient(theta, dx, axis=2)) + (np.gradient(va, dy, axis=1) * np.gradient(theta, dy, axis=1))) 
vertical_gradient = (-1 * (np.gradient(theta, axis=0)/dp)) * ((np.gradient(omega, dx, axis=2) * np.gradient(theta, dx, axis=2)) + (np.gradient(omega, dy, axis=1) * np.gradient(theta, dy, axis=1))) 

F3D = 1.08e9 * (1/theta_gradient) * (zonal_gradient + meridional_gradient + vertical_gradient) 
return F3D 

을 dy 용어는 NetCDF 파일 자체에서 직접 가져옵니다 (속성 DX와 DY 모두 4000m로 정의되어 있습니다)

나는 netCDF를 가져 오는 getvar를 사용하여 wrf-python 라이브러리를 사용하여 데이터를 가져옵니다 파일. NetCDF 파일은 표준 numpy 배열과 비슷한 배열 구조를 사용합니다.

따라서 축 인수의 순서는 정확해야합니다 (z = 0, y (y = 0, y = 1, x = 2).

내 교수진 중 한 사람이 그라디언트의 가장자리가 계산 내부에 문제가있을 수 있다고 생각하지만 각 점은 가장자리와 별도로 계산되므로 차이가 없어야하지만 이것은 제가 100 % 확실하지 않은 것입니다.

계산 결과가 위의 이미지와 같이 잘못된 결과를 산출하는 이유를 아는 사람이 있습니까?

+0

여기에 약간의 업데이트가 있습니다. 나는 오늘 개별적으로 용어를 계산하는 것을 시도하기로 결심했다. 그리고 나는 내가 여기의 문제 위에 있다고 생각한다. 그래디언트 항의 분모에 대해 z [n + 1] - z [n-1]을 처리해야하는 여기서 dz 항은 실제로 z [n + 1] - z [n]을 수행합니다. dp 용어는 dz와 dp로 나눈 부분 미분 항을 버리는 똑같은 일을합니다. – Phantom139

답변

0

머리를 조금 더 부딪 히자 문제를 해결할 수있었습니다. 전체 단위 분석을 고려하여 보여 주도록하십시오!

잠재적 인 온도의 기울기의 용어는 수직 축을 z로 고려한 반면, 오메가에 대한 수직적 인 기울기의 용어는 p를 고려했습니다. 오메가가 수직적 인 압력 단위이기 때문에 잠재적 인 온도 구배에 대한 나의 용어 선택이 올바르지 않습니다. z에서 p로 파생 변수를 교환하면 문제의 전반을 수정할 수 있습니다.

두 번째로, 파생 상품을 수직 방향으로 계산할 때는 해당 numpy를 고려해야합니다.구배 두 데이터 포인트를 통해 여행을 가정하며, 따라서 잘못 2로 결과를 분할 그래서 분석의 내측 및 외측 지점 처리하는 기능 래퍼 생성 : 이후

def calc_center_difference(A, ax): 
    gradient = np.gradient(A, axis=ax) 
    gradient *= 2.0 
    if ax == 0: 
     gradient[0,:,:] /= 2.0 
     gradient[-1,:,:] /= 2.0 
    elif ax == 1: 
     gradient[:,0,:] /= 2.0 
     gradient[:,-1,:] /= 2.0 
    elif ax == 2: 
     gradient[:,:,0] /= 2.0 
     gradient[:,:,-1] /= 2.0 
    else: 
     return ValueError("Invalid axis passed to calc_center_difference") 
    return gradient 

를, I는 스왑 래퍼 함수 인스턴스를 사용하여 dz 또는 dp를 고려한 파생어 인스턴스를 사용하여 조건이 올바르게 계산되었는지 확인합니다. 모든 것이 작동합니다!

여기 파이썬에서 전체 3D frontogenesis을 계산할 수 있습니다 내 이전 함수의 수정 된 형태이다 :

# Input netcdf 
# - [bottom_top, north_south, west_east] 
def three_d_fronto(ncFile): 
    # Fetch the fields we need 
    p = to_np(getvar(ncFile, "pressure") * 100) 
    z = to_np(getvar(ncFile, "z")) 
    ua = to_np(getvar(ncFile, "ua")) 
    va = to_np(getvar(ncFile, "va"))  
    theta = to_np(getvar(ncFile, "theta")) 
    omega = to_np(getvar(ncFile, "omega")) 

    dz = calc_center_difference(z, 0) 
    dp = calc_center_difference(p, 0) 

    theta_gradient = np.sqrt((np.gradient(theta, dx, axis=2))**2 + (np.gradient(theta, dy, axis=1))**2 + (calc_center_difference(theta, 0)/dp)**2) 
    zonal_gradient = (-1 * np.gradient(theta, dx, axis=2)) * ((np.gradient(ua, dx, axis=2) * np.gradient(theta, dx, axis=2)) + (np.gradient(va, dx, axis=2) * np.gradient(theta, dy, axis=1))) 
    meridional_gradient = (-1 * np.gradient(theta, dy, axis=1)) * ((np.gradient(ua, dy, axis=1) * np.gradient(theta, dx, axis=2)) + (np.gradient(va, dy, axis=1) * np.gradient(theta, dy, axis=1))) 
    vertical_gradient = (-1 * (calc_center_difference(theta, 0)/dp)) * ((np.gradient(omega, dx, axis=2) * np.gradient(theta, dx, axis=2)) + (np.gradient(omega, dy, axis=1) * np.gradient(theta, dy, axis=1))) 

    F3D = 1.08e9 * (1/theta_gradient) * (zonal_gradient + meridional_gradient + vertical_gradient) 
    return F3D 

을 말씀 드리면, 당신은이 기능을 사용하려면 설치 WRF-파이썬 라이브러리가 필요합니다.

관련 문제