if(UorV==0)// U-wind: length of the row (2d array)
{
next=nlon;
latE=nlat-1;lonE=nlon;
}
else// V-wind:
{
next=1;
latE=nlat;lonE=nlon-1;
}
if(cdoDebugExt>=20)
cdoPrint("destaggerUorV(): (nlon=%d, nlat=%d); [latE=%d, lonE=%d, next=%d]; (positive order destaggering)",nlon,nlat,latE,lonE,next);
for(intlev=0;lev<klev;lev++)
{
for(intlat=0;lat<latE;lat++)
{
for(intlon=0;lon<lonE;lon++)
{
u0=fu[idx];
u1=fu[idx+next];
u_dstg=0.5*(u0+u1);
fuOut[idx]=u_dstg;
idx++;
}
if(lonE<nlon)// the last column we let as it is
{
u0=fu[idx];
fuOut[idx]=u0;
idx++;
}
}
if(latE<nlat)// the last row we let as it is
for(intlon=0;lon<nlon;lon++)
{
u0=fu[idx];
fuOut[idx]=u0;
idx++;
}
}
}
static
void*DestaggerUV()
{
intnrecs;
intrecID,varID,levelID;
intvarID,levelID;
intvarID1=-1,varID2=-1;
intzaxisID1=-1,zaxisID2=-1;
intvarID1stg=-1,varID2stg=-1;
intlevel,gridsize;
inti;
intgridsize;
intchcodes[MAXARG];
char*chvars[MAXARG];
charvarname[CDI_MAX_NAME];
doubledestagGridOffsets[MAXARG];
intindex;
intgridID1=-1,gridID2=-1;
intgridID0=-1;
intgridID;
intnmiss;
intlcopy=FALSE;
boollcopy=false;
intUorV;
intnlon=0,nlat=0,ntr=-1;
intcode,param;
intzaxisID,ltype,nlevs;
intpnum,pcat,pdis;
intnlon=0,nlat=0;
double*ivar=NULL,*ovar=NULL;
doubledxU=0,dyU=0,dxV=0,dyV=0;
...
...
@@ -213,16 +310,19 @@ void *DestaggerUV()
intnvars=vlistNvars(vlistID1);
for(varID=0;varID<nvars;varID++)
{
param=vlistInqVarParam(vlistID1,varID);/* vlistInqVarParam(int vlistID, int varID): Get the parameter number of a Variable */
intparam=vlistInqVarParam(vlistID1,varID);
intpnum,pcat,pdis;
cdiDecodeParam(param,&pnum,&pcat,&pdis);
code=pnum;
zaxisID=vlistInqVarZaxis(vlistID1,varID);
ltype=zaxis2ltype(zaxisID);
nlevs=zaxisInqSize(zaxisID);
vlistInqVarName(vlistID1,varID,varname);/* vlistInqVarName(int vlistID, int varID, char *name): Get the name of a Variable */
intcode=pnum;
intzaxisID=vlistInqVarZaxis(vlistID1,varID);
intltype=zaxis2ltype(zaxisID);
intnlevs=zaxisInqSize(zaxisID);
vlistInqVarName(vlistID1,varID,varname);
intgridIDx=vlistInqVarGrid(vlistID1,varID);
strtolower(varname);
if(cdoDebugExt>=20)cdoPrint("Var.id [%4d] with grib code:3%d and has name: %6s; level type: %3d; number of levels: %3d; gridID: %d; zaxisID: %d",varID,code,varname,ltype,nlevs,gridIDx,zaxisID);
if(cdoDebugExt>=20)
cdoPrint("Var.id [%4d] with grib code:3%d and has name: %6s; level type: %3d; number of levels: %3d; gridID: %d; zaxisID: %d",
varID,code,varname,ltype,nlevs,gridIDx,zaxisID);
CheckVarIsU(varID,varname,code);
CheckVarIsV(varID,varname,code);
...
...
@@ -236,12 +336,13 @@ void *DestaggerUV()
if(VarsUVareStaggered){
gridID1=vlistInqVarGrid(vlistID1,varID1);
gridID2=vlistInqVarGrid(vlistID1,varID2);
if(cdoDebugExt)cdoPrint("Found STAGGERED U & V: varID1=%d (gridID1=%d), varID2=%d (gridID2=%d)",varID1,gridID2,varID2,gridID1);
if(cdoDebugExt)
cdoPrint("Found STAGGERED U & V: varID1=%d (gridID1=%d), varID2=%d (gridID2=%d)",varID1,gridID2,varID2,gridID1);
varID1stg=varID1;
varID2stg=varID2;
}
}
/* search for a reference (non-staggered) grid */
// search for a reference (non-staggered) grid
// We take temperature for example as the new (horizontal) grid for de-staggered uv
// If there will be no temperature field we will define grid the grid
if(lvar)// We have a list of variables
...
...
@@ -260,42 +361,27 @@ void *DestaggerUV()
if((varID1stg==-1)&&(varID2stg==-1))
{
cdoPrint("NOTE: We did not find any staggered U,V wind components. Performing file-copy.");