i aware of ncdf package of r.
i trying plot wind speed , wind direction(4d) of wrfout netcdf file. variable function of (i,j,k,l).
new variables need created calculation shown in code. looping through 4 loops taking long. understand advanced looping techniques such plyr or tapply or mapply exist. examples these 2d array/matrix.
please suggest optimization package 4d array.
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 , vvin in staggerd grid input file #dim(uuin) (426,200,40,11) #dim(vvin) (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)) (l in 1:lmax) { (k in 1:kmax) { (j in 1:jmax) { (i in 1:imax) { #change u , v staggerd grid 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 , 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 } #end of j } #end of k } #end of l
Comments
Post a Comment