105 lines
3.5 KiB
Text
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;
|
|
}
|
|
}
|
|
}
|