awips2/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xtnd
Steve Harris 9f8cb727a5 12.4.1-10 baseline
Former-commit-id: bf53d06834caa780226121334ac1bcf0534c3f16
2012-05-01 18:06:13 -05:00

105 lines
3.5 KiB
Text

void xtnd_sndg(void)
/*************************************************************/
/* XTND_SNDG */
/* John Hart NSSFC KCMO */
/* */
/* This routine will extend a sounding to 50mb, if the */
/* sounding made it at least to 150mb. */
/* */
/* An isothermal/hydrostatic layer is assumed above the */
/* last observed level. */
/*************************************************************/
{
short above, below;
double nm1, nm2, nm4;
if (sndg[numlvl-1][1] <= 150.0 && sndg[numlvl-1][1] >= 100.0) {
sndg[numlvl][0] = -999.0;
sndg[numlvl][1] = 75.0;
sndg[numlvl][3] = i_temp(150);
sndg[numlvl][4] = i_dwpt(150);
sndg[numlvl][5] = i_wdir(150);
sndg[numlvl][6] = i_wspd(150);
above = numlvl-1;
below = numlvl-2;
nm1 = sndg[above][2] - sndg[below][2];
nm2 = log( sndg[below][1] / sndg[above][1] );
nm4 = log( sndg[below][1] / sndg[numlvl][1] );
sndg[numlvl][2] = (float)(sndg[below][2] + (( nm4 / nm2) * nm1));
numlvl++;
sndg[numlvl][0] = -999.0;
sndg[numlvl][1] = 50.0;
sndg[numlvl][3] = i_temp(150);
sndg[numlvl][4] = i_dwpt(150);
sndg[numlvl][5] = i_wdir(150);
sndg[numlvl][6] = i_wspd(150);
above = numlvl-1;
below = numlvl-2;
nm1 = sndg[above][2] - sndg[below][2];
nm2 = log( sndg[below][1] / sndg[above][1] );
nm4 = log( sndg[below][1] / sndg[numlvl][1] );
sndg[numlvl][2] = (float)(sndg[below][2] + (( nm4 / nm2) * nm1));
numlvl++;
}
}
void interp_sndg(void)
/*************************************************************/
/* INTERP_SNDG */
/* John Hart NSSFC KCMO */
/* */
/* This routine take the current sounding array and */
/* interpolate it to 25mb increments. */
/*************************************************************/
{
float nsndg[200][7], sfclvl, pres, cint, p1;
short newnum, i, j;
cint = 25.0;
/* ----- Copy surface conditions to new array ----- */
newnum = 0;
sfclvl = sndg[sfc()][1];
nsndg[newnum][0] = i_omeg( sfclvl );
nsndg[newnum][1] = sfclvl;
nsndg[newnum][2] = i_hght( sfclvl );
nsndg[newnum][3] = i_temp( sfclvl );
nsndg[newnum][4] = i_dwpt( sfclvl );
nsndg[newnum][5] = i_wdir( sfclvl );
nsndg[newnum][6] = i_wspd( sfclvl );
/* ----- Determine first interpolated level above surface ----- */
pres = (float)((short)((sfclvl / cint) + 0) * cint);
if( pres == sfclvl ) { pres -= cint; }
/* ----- Interpolate NSNDG array to prescribed increments ----- */
for (p1 = pres; p1 >= sndg[numlvl-1][1]; p1 -= cint) {
newnum++;
nsndg[newnum][0] = i_omeg(p1);
nsndg[newnum][1] = p1;
nsndg[newnum][2] = i_hght(p1);
nsndg[newnum][3] = i_temp(p1);
nsndg[newnum][4] = i_dwpt(p1);
nsndg[newnum][5] = i_wdir(p1);
nsndg[newnum][6] = i_wspd(p1);
}
/* ----- Copy NSNDG to SNDG array ----- */
for (i=0; i <= newnum; i++) {
for (j=0; j<=6; j++) {
sndg[i][j] = nsndg[i][j];
}
}
numlvl = newnum + 1;
/* ----- NULL out two levels above highest observation ----- */
for (i=numlvl; i <= numlvl + 2; i++) {
for (j=0; j<=6; j++) {
sndg[i][j] = -999.0;
}
}
}