ocssw  1.0
/disk01/web/ocssw/build/src/l2gen/l1subpix.c
Go to the documentation of this file.
00001 /* -------------------------------------------------------------------- */
00002 /* l1subpix() - sub-samples and/or crops a level-1 record in place      */
00003 /*                                                                      */
00004 /* Returns 0 on succss, 1 on error.                                     */
00005 /*                                                                      */
00006 /* Notes: Only record fields which are filled by the L1 read routines   */
00007 /*        must be updated here.  All other fields will be filled later  */
00008 /*        using the sub-sampled geometry and radiances.                 */
00009 /*                                                                      */
00010 /* Written By: B. A. Franz                                              */
00011 /* -------------------------------------------------------------------- */
00012 
00013 #include <string.h>
00014 #include "filehandle.h"
00015 #include "l1_struc.h"
00016 
00017 int l1subpix(filehandle *l1file, l1str *l1rec)
00018 {
00019     int32_t sp = l1file->spix;
00020     int32_t ep = l1file->epix;
00021     int32_t dp = l1file->dpix;
00022 
00023     if ( (sp == 0) && (ep == l1file->npix-1) && dp == 1)
00024         return (0);
00025 
00026     if (sp > ep || dp < 1 || dp > (ep - sp + 1)) {
00027         fprintf(stderr,
00028         "-E- %s Line %d: subpixel specification error (sp=%d,ep=%d,dp=%d).\n",
00029         __FILE__,__LINE__,sp,ep,dp);
00030         return (1);
00031     }
00032 
00033     if (dp == 1) {
00034 
00035         int32_t length;
00036         int32_t j;
00037 
00038         l1rec->npix = ep - sp + 1;
00039     
00040     length  = l1rec->npix*sizeof(float);
00041 
00042         memmove(l1rec->pixnum,&l1rec->pixnum[sp],l1rec->npix*sizeof(int32_t));
00043         memmove(l1rec->nobs  ,&l1rec->nobs  [sp],l1rec->npix*sizeof(int32_t));
00044 
00045         memmove(l1rec->lon, &l1rec->lon [sp],length);
00046         memmove(l1rec->lat, &l1rec->lat [sp],length);
00047         memmove(l1rec->solz,&l1rec->solz[sp],length);
00048         memmove(l1rec->sola,&l1rec->sola[sp],length);
00049         memmove(l1rec->senz,&l1rec->senz[sp],length);
00050         memmove(l1rec->sena,&l1rec->sena[sp],length);
00051 
00052         memmove(l1rec->alpha,&l1rec->alpha[sp],length);
00053 
00054         memmove(l1rec->hilt   ,&l1rec->hilt   [sp],l1rec->npix*sizeof(char));
00055         memmove(l1rec->stlight,&l1rec->stlight[sp],l1rec->npix*sizeof(char));
00056         memmove(l1rec->navfail,&l1rec->navfail[sp],l1rec->npix*sizeof(char));
00057         memmove(l1rec->navwarn,&l1rec->navwarn[sp],l1rec->npix*sizeof(char));
00058 
00059         memmove(l1rec->Lt,     &l1rec->Lt    [sp*NBANDS],length*NBANDS);
00060         memmove(l1rec->Lt_unc, &l1rec->Lt_unc[sp*NBANDS],length*NBANDS);
00061 
00062         memmove(l1rec->sw_n,   &l1rec->sw_n   [sp*NBANDS],length*NBANDS);
00063         memmove(l1rec->sw_a,   &l1rec->sw_a   [sp*NBANDS],length*NBANDS);
00064         memmove(l1rec->sw_bb,  &l1rec->sw_bb  [sp*NBANDS],length*NBANDS);
00065 
00066         memmove(l1rec->Ltir, &l1rec->Ltir [sp*NBANDSIR],length*NBANDSIR);
00067         memmove(l1rec->Bt,   &l1rec->Bt   [sp*NBANDSIR],length*NBANDSIR);
00068 
00069         memmove(l1rec->rho_cirrus,&l1rec->rho_cirrus[sp],length);
00070 
00071 
00072     /* MERIS */
00073         memmove(l1rec->pixdet,&l1rec->pixdet[sp],l1rec->npix*sizeof(int32_t));
00074         memmove(l1rec->radcor, &l1rec->radcor[sp*NBANDS],length*NBANDS);
00075         memmove(l1rec->in_flags,&l1rec->in_flags[sp],l1rec->npix*sizeof(int32));
00076         for ( j = 0; j < l1rec->n_inprods; j++ )
00077             memmove(l1rec->in_prods[j], &l1rec->in_prods[j][sp],length);
00078 
00079     } else {
00080 
00081         int32_t i,j;
00082 
00083         l1rec->npix = (ep - sp)/dp + 1;
00084 
00085         for (i=0; i<l1rec->npix; i++) {
00086 
00087             l1rec->pixnum[i] = l1rec->pixnum[i*dp+sp];
00088 
00089             l1rec->lon [i] = l1rec->lon [i*dp+sp];
00090             l1rec->lat [i] = l1rec->lat [i*dp+sp];
00091             l1rec->solz[i] = l1rec->solz[i*dp+sp];
00092             l1rec->sola[i] = l1rec->sola[i*dp+sp];
00093             l1rec->senz[i] = l1rec->senz[i*dp+sp];
00094             l1rec->sena[i] = l1rec->sena[i*dp+sp];
00095 
00096             l1rec->alpha[i] = l1rec->alpha[i*dp+sp];
00097 
00098             l1rec->hilt   [i] = l1rec->hilt   [i*dp+sp];
00099             l1rec->stlight[i] = l1rec->stlight[i*dp+sp];
00100             l1rec->navfail[i] = l1rec->navfail[i*dp+sp];
00101             l1rec->navwarn[i] = l1rec->navwarn[i*dp+sp];
00102 
00103             l1rec->rho_cirrus[i] = l1rec->rho_cirrus[i*dp+sp];
00104 
00105             memmove(&l1rec->Lt   [i*NBANDS],
00106                    &l1rec->Lt   [(i*dp+sp)*NBANDS],NBANDS*sizeof(float));
00107 
00108             memmove(&l1rec->sw_n [i*NBANDS],
00109                    &l1rec->sw_n [(i*dp+sp)*NBANDS],NBANDS*sizeof(float));
00110             memmove(&l1rec->sw_a [i*NBANDS],
00111                    &l1rec->sw_a [(i*dp+sp)*NBANDS],NBANDS*sizeof(float));
00112             memmove(&l1rec->sw_bb[i*NBANDS],
00113                    &l1rec->sw_bb[(i*dp+sp)*NBANDS],NBANDS*sizeof(float));
00114 
00115             memmove(&l1rec->Ltir [i*NBANDSIR],
00116                    &l1rec->Ltir [(i*dp+sp)*NBANDSIR],NBANDSIR*sizeof(float));
00117 
00118             memmove(&l1rec->Bt   [i*NBANDSIR],
00119                    &l1rec->Bt   [(i*dp+sp)*NBANDSIR],NBANDSIR*sizeof(float));
00120 
00121         /* MERIS */
00122             l1rec->pixdet[i] = l1rec->pixdet[i*dp+sp];
00123             memmove(&l1rec->radcor   [i*NBANDS],
00124                    &l1rec->radcor   [(i*dp+sp)*NBANDS],NBANDS*sizeof(float));
00125 
00126             l1rec->in_flags[i] = l1rec->in_flags[i*dp+sp];
00127             for ( j = 0; j < l1rec->n_inprods; j++ )
00128                 l1rec->in_prods[j][i] = l1rec->in_prods[j][i*dp+sp];
00129 
00130     }
00131 
00132     }
00133 
00134     return (0);
00135 }
00136