是否可以在R中处理4维netCDF文件?

时间:2015-07-17 11:03:04

标签: arrays r matrix multidimensional-array

我知道R的ncdf包。

我正在尝试绘制WRFout netCDF文件的风速和风向(4D)。 变量作为(i,j,k,l)的函数。

需要创建新变量作为代码中显示的计算。 循环4 for for循环需要太长时间。我理解先进的循环技术,如plyr或tapply或mapply存在。但这些示例仅适用于2D阵列/矩阵。

请建议4D阵列的优化包。

library(ncdf)
ncin <- open.ncdf("wrfout.nc")
imax <- 425  #No of grids in Longitude
jmax <- 200  #No of grids in Latitude
kmax <- 40   #Vertical layers
lmax <- 11   #Time
paiv <- atan(1.0)/45.0
#However, UUin and VVin are in staggerd grid from input file
#dim(UUin) is (426,200,40,11)
#dim(VVin) is (425,201,40,11) 
UUin <- get.var.ncdf(ncin,"U")
VVin <- get.var.ncdf(ncin,"V")
#Initialize arrays in normal grid 
UU <- array(0.0, c(imax,jmax,kmax,lmax))
VV <- array(0.0, c(imax,jmax,kmax,lmax))
Wspd <- array(0.0,c(imax,jmax,kmax,lmax))
Wdir <- array(0.0,c(imax,jmax,kmax,lmax))
for (l in 1:lmax) {
for (k in 1:kmax) {
for (j in 1:jmax) {
for (i in 1:imax) {
#Change U and V staggerd grid to regular grid
UU[i,j,k,l] <- 0.5*(UUin[i,j,k,l]+ UUin[i+1,j,k,l])
VV[i,j,k,l] <- 0.5*(VVin[i,j,k,l]+ VVin[i,j+1,k,l])       
#Now calculate wind speed and direction in regular grid
Wspd[i,j,k,l] <- sqrt(UU[i,j,k,l]*UU[i,j,k,l] + VV[i,j,k,l]* VV[i,j,k,l])
if (UU[i,j,k,l] == 0.0) 
{  # startif   
if(VV[i,j,k,l] < 0.0) 
Wdir[i,j,k,l] = 0.0     
else  
Wdir[i,j,k,l] = 180.0
}
else   
Wdir[i,j,k,l] = atan2(VV[i,j,k,l], UU[i,j,k,l]) / paiv
if(UU[i,j,k,l] < 0.0) {
Wdir[i,j,k,l] = 90.0 - Wdir[i,j,k,l]  
}  
else  
Wdir[i,j,k,l] = 270.0 - Wdir[i,j,k,l]  
if (Wdir[i,j,k,l] < 0.0) 
{      
Wdir[i,j,k,l] = Wdir[i,j,k,l] + 360.0
} 
if (Wdir[i,j,k,l] > 360.0) 
{
Wdir[i,j,k,l] = Wdir[i,j,k,l] - 360.0      
}    
}    #end of i 
}    #end of j 
}    #end of k 
}    #end of l 

0 个答案:

没有答案