23 using namespace netCDF;
24 using namespace netCDF::exceptions;
29 #define MAX_SOLZ (88 * 100)
68 cout <<
"l1bgen_oci " <<
VERSION <<
" ("
69 << __DATE__ <<
" " << __TIME__ <<
")" << endl;
77 "Digital Object Identifier (DOI) string");
79 "processing version string");
81 "$OCDATAROOT/common/gebco_ocssw_v2020.nc",
82 "Digital elevation map file");
84 "Generate radiances");
86 "Definitive ephemeris file name");
90 string cal_lut_filename;
91 string geo_lut_filename;
106 string CALDIR = getenv(
"OCVARROOT");
107 CALDIR.append(
"/oci/cal/OPER/");
108 vector<string> lut_files;
111 struct dirent *caldirptr;
112 if ((caldir = opendir(CALDIR.c_str())) !=
NULL) {
113 while ((caldirptr = readdir(caldir)) !=
NULL) {
114 lut_files.push_back(
string(caldirptr->d_name));
131 struct stat fstat_buffer;
135 for(
const string& lut : lut_files) {
136 if (lut.find(
"PACE_OCI_L1B_LUT") != std::string::npos) {
137 cal_lut_filename = CALDIR;
138 cal_lut_filename.append(lut);
143 if (cal_lut_filename.empty() || (stat (cal_lut_filename.c_str(), &fstat_buffer) != 0)) {
144 cout <<
"Error: input CAL LUT file: " << cal_lut_filename.c_str() <<
" does not exist\n";
150 for(
const string& lut : lut_files) {
151 if (lut.find(
"PACE_OCI_GEO_LUT") != std::string::npos) {
152 geo_lut_filename = CALDIR;
153 geo_lut_filename.append(lut);
158 if (geo_lut_filename.empty() || (stat (geo_lut_filename.c_str(), &fstat_buffer) != 0)) {
159 cout <<
"Error: input GEO LUT file: " << geo_lut_filename.c_str() <<
" does not exist\n";
181 if ((stat (dem_file.c_str(), &fstat_buffer) != 0)) {
182 cout <<
"Error: DEM file: " << dem_file.c_str() <<
" does not exist\n";
189 NcFile *calLUTfile =
new NcFile( cal_lut_filename, NcFile::read);
191 NcGroup gidCommon, gidBlue, gidRed, gidSWIR;
192 gidCommon = calLUTfile->getGroup(
"common");
193 gidBlue = calLUTfile->getGroup(
"blue");
194 gidRed = calLUTfile->getGroup(
"red");
195 gidSWIR = calLUTfile->getGroup(
"SWIR");
205 float spass[
NIWAVE] = {45, 80, 30, 30, 15, 75, 75, 50, 75};
207 NcDim timeDim = calLUTfile->getDim(
"number_of_times");
208 if(timeDim.isNull()) {
209 cout <<
"Error: could not read number_of_times from " << cal_lut_filename <<
"\n";
212 size_t numTimes = timeDim.getSize();
214 double *K2t = (
double*)malloc(numTimes *
sizeof(
double));
218 var = gidCommon.getVar(
"blue_wavelength");
221 var = gidCommon.getVar(
"blue_F0");
224 var = gidCommon.getVar(
"red_wavelength");
227 var = gidCommon.getVar(
"red_F0");
230 var = gidCommon.getVar(
"SWIR_wavelength");
233 var = gidCommon.getVar(
"SWIR_F0");
236 var = gidCommon.getVar(
"K2t");
245 uint32_t bbanddim, rbanddim, sbanddim, nldim, poldim;
251 NcDim K3Tdim = calLUTfile->getDim(
"number_of_temperatures");
253 float *K3T =
new float[K3Tdim.getSize()];
254 var = gidCommon.getVar(
"K3T");
266 float hysttime[9][4];
269 var = gidSWIR.getVar(
"hyst_time_const");
270 var.getVar( &hysttime[0][0]);
271 var = gidSWIR.getVar(
"hyst_amplitude");
272 var.getVar( &hystamp[0][0]);
279 geolocate_oci( l1a_filename, geo_lut_filename, geoLUT, l1b_filename, dem_file,
280 radiance, doi, ephFile, pversion);
283 outfile.l1bfile =
new NcFile( l1b_filename, NcFile::write);
285 outfile.ncGrps[0] =
outfile.l1bfile->getGroup(
"sensor_band_parameters");
286 outfile.ncGrps[1] =
outfile.l1bfile->getGroup(
"scan_line_attributes");
287 outfile.ncGrps[2] =
outfile.l1bfile->getGroup(
"geolocation_data");
288 outfile.ncGrps[3] =
outfile.l1bfile->getGroup(
"navigation_data");
289 outfile.ncGrps[4] =
outfile.l1bfile->getGroup(
"observation_data");
297 att =
outfile.l1bfile->getAtt(
"earth_sun_distance_correction");
298 att.getValues(&distcorr);
300 NcDim nscanl1b_dim =
outfile.l1bfile->getDim(
"number_of_scans");
301 uint32_t nscanl1b = nscanl1b_dim.getSize();
303 NcDim ccd_pixels_dim =
outfile.l1bfile->getDim(
"ccd_pixels");
304 uint32_t ccd_pixels = ccd_pixels_dim.getSize();
306 double *evtime =
new double[nscanl1b];
307 var =
outfile.ncGrps[1].getVar(
"time");
312 unsigned char *qualFlag;
318 solz =
new short[nscanl1b*ccd_pixels];
319 var =
outfile.ncGrps[2].getVar(
"solar_zenith");
322 csolz =
new float[nscanl1b*ccd_pixels];
323 for (
size_t i=0;
i<nscanl1b*ccd_pixels;
i++)
326 qualFlag =
new unsigned char[nscanl1b*ccd_pixels];
327 var =
outfile.ncGrps[2].getVar(
"quality_flag");
328 var.getVar(qualFlag);
332 NcFile *l1afile =
new NcFile( l1a_filename, NcFile::read);
336 ncGrps[0] = l1afile->getGroup(
"scan_line_attributes");
337 ncGrps[1] = l1afile->getGroup(
"spatial_spectral_modes");
338 ncGrps[2] = l1afile->getGroup(
"engineering_data");
339 ncGrps[3] = l1afile->getGroup(
"science_data");
343 att = l1afile->getAtt(
"time_coverage_start");
344 att.getValues(tstart);
345 cout <<
"time_coverage_start: " << tstart << endl;
347 att = l1afile->getAtt(
"time_coverage_end");
349 cout <<
"time_coverage_end: " << tend << endl;
354 iss.str(tstart.substr(0,4));
355 iss >>
iyr; iss.clear();
356 iss.str(tstart.substr(5,2));
357 iss >>
imn; iss.clear();
358 iss.str(tstart.substr(8,2));
362 int32_t iyr32, idy32;
366 NcDim blue_dim = l1afile->getDim(
"blue_bands");
367 uint32_t bbands = blue_dim.getSize();
368 NcDim red_dim = l1afile->getDim(
"red_bands");
369 uint32_t rbands = red_dim.getSize();
372 NcDim nscan_dim = l1afile->getDim(
"number_of_scans");
373 uint32_t
nscan = nscan_dim.getSize();
375 NcDim mcescan_dim = l1afile->getDim(
"number_of_mce_scans");
376 uint32_t nmcescan = mcescan_dim.getSize();
378 double *sstime =
new double[
nscan];
379 var = ncGrps[0].getVar(
"scan_start_time");
383 var = ncGrps[0].getVar(
"spin_ID");
386 uint8_t *hside =
new uint8_t[
nscan];
387 var = ncGrps[0].getVar(
"HAM_side");
390 uint32_t nscan_good=0;
393 sstime[nscan_good] = sstime[
i];
394 hside[nscan_good] = hside[
i];
400 short *tfl =
new short[nscan_good]();
406 NcDim ntaps_dim = l1afile->getDim(
"number_of_taps");
407 uint32_t ntaps = ntaps_dim.getSize();
408 NcDim spatzn_dim = l1afile->getDim(
"spatial_zones");
409 uint32_t spatzn = spatzn_dim.getSize();
411 int16_t *
dtype =
new int16_t[spatzn];
412 var = ncGrps[1].getVar(
"spatial_zone_data_type");
415 int16_t *
lines =
new int16_t[spatzn];
416 var = ncGrps[1].getVar(
"spatial_zone_lines");
419 int16_t *iagg =
new int16_t[spatzn];
420 var = ncGrps[1].getVar(
"spatial_aggregation");
423 int16_t *bagg =
new int16_t[ntaps];
424 var = ncGrps[1].getVar(
"blue_spectral_mode");
427 int16_t *ragg =
new int16_t[ntaps];
428 var = ncGrps[1].getVar(
"red_spectral_mode");
437 double revpsec, secpline;
439 int32_t *mspin =
new int32_t[nmcescan];
440 int32_t *ot_10us =
new int32_t[nmcescan];
441 uint8_t *enc_count =
new uint8_t[nmcescan];
444 NcDim nenc_dim = l1afile->getDim(
"encoder_samples");
445 uint32_t nenc = nenc_dim.getSize();
447 float **hamenc =
new float *[nmcescan];
448 hamenc[0] =
new float[nenc*nmcescan];
449 for (
size_t i=1;
i<nmcescan;
i++) hamenc[
i] = hamenc[
i-1] + nenc;
451 float **rtaenc =
new float *[nmcescan];
452 rtaenc[0] =
new float[nenc*nmcescan];
453 for (
size_t i=1;
i<nmcescan;
i++) rtaenc[
i] = rtaenc[
i-1] + nenc;
456 read_mce_tlm( l1afile, geoLUT, ncGrps[2], nmcescan, nenc, ppr_off, revpsec,
457 secpline, board_id, mspin, ot_10us, enc_count,
458 &hamenc[0], rtaenc, iret);
460 float clines[32400], slines[4050];
461 uint16_t pcdim, psdim;
463 double ev_toff, deltc[32400], delts[4050];
465 get_ev( secpline,
dtype,
lines, iagg, pcdim, psdim, ev_toff, clines, slines,
466 deltc, delts, dark, iret);
468 cout <<
"No science collect in file: " << l1a_filename.c_str() << endl;
474 for (
size_t i=0;
i<spatzn;
i++) {
485 size_t *ia =
new size_t[ntaps];
489 uint32_t bib=1, bbb=1;
491 if (
get_nib_nbb( ntaps, ia, ntb, bagg, bib, bbb) == 2)
492 cout <<
"All blue taps disabled" << endl;
495 float **bamat =
new float*[bib];
496 float **bgmat =
new float*[512];
499 get_agg_mat( ia, bagg, ntb, bib, bbb, bamat, bgmat);
502 cout <<
"Number of blue bands in file: " << l1a_filename.c_str() <<
503 " not consistent with spectral aggregation" << endl;
506 }
else if ( bib < 4) cout <<
"No blue bands in file: " <<
507 l1a_filename.c_str() << endl;
511 uint32_t rib=1, rbb=1;
513 if (
get_nib_nbb( ntaps, ia, ntb, ragg, rib, rbb) == 2)
514 cout <<
"All red taps disabled" << endl;
516 float **ramat =
new float*[rib];
517 float **rgmat =
new float*[512];
520 get_agg_mat( ia, ragg, ntb, rib, rbb, ramat, rgmat);
523 cout <<
"Number of red bands in file: " << l1a_filename.c_str() <<
524 " not consistent with spectral aggregation" << endl;
527 }
else if ( rib < 4) cout <<
"No red bands in file: " << l1a_filename.c_str()
537 for (
size_t i=0;
i<spatzn;
i++) {
543 cout <<
"No dark collect in file: " << l1a_filename.c_str() << endl;
548 int16_t ldc=0, lds=0;
549 for (
size_t i=0;
i<(size_t) kd;
i++) {
555 int16_t ndc =
lines[kd] / iagg[kd];
556 int16_t nds =
lines[kd] / 8;
570 iagg[ka], bagg, blue_lut, &bgmat[0], bgains);
574 iagg[ka], ragg, red_lut, &rgmat[0], rgains);
576 float **sgmat =
new float*[swb];
577 for (
size_t i=0;
i<swb;
i++) {
578 sgmat[
i] =
new float[swb];
579 for (
size_t j=0;
j<swb;
j++) {
580 if (
i ==
j) sgmat[
i][
j] = 1.0;
else sgmat[
i][
j] = 0.0;
583 make_oci_gains( swb, swb,
iyr,
jd, evtime[0], numTimes, K2t, board_id, -1,
NULL,
584 swir_lut, &sgmat[0], sgains);
587 float *bibf0 =
new float[bib];
588 for (
size_t i=0;
i<bib;
i++) {
590 for (
size_t j=0;
j<512;
j++) {
591 bibf0[
i] += bf0[
j]*bgmat[
j][
i];
595 float *b1bf0 =
new float[bbb];
596 for (
size_t i=0;
i<bbb;
i++) {
598 for (
size_t j=0;
j<bib;
j++) {
599 b1bf0[
i] += bibf0[
j]*bamat[
j][
i];
604 float *ribf0 =
new float[rib];
605 for (
size_t i=0;
i<rib;
i++) {
607 for (
size_t j=0;
j<512;
j++) {
608 ribf0[
i] += rf0[
j]*rgmat[
j][
i];
612 float *r1bf0 =
new float[rbb];
613 for (
size_t i=0;
i<rbb;
i++) {
615 for (
size_t j=0;
j<rib;
j++) {
616 r1bf0[
i] += ribf0[
j]*ramat[
j][
i];
621 uint16_t ntemps = bgains.
ldims[1] + sgains.
ldims[1];
623 float **caltemps =
new float *[nscan_good];
624 caltemps[0] =
new float[ntemps*nscan_good];
625 for (
size_t i=1;
i<nscan_good;
i++) caltemps[
i] = caltemps[
i-1] + ntemps;
627 for (
size_t i=0;
i<nscan_good;
i++)
628 for (
size_t j=1;
j<ntemps;
j++)
629 caltemps[
i][
j] = 0.0;
631 uint16_t nctemps = bgains.
ldims[1];
638 start.push_back(ldc);
641 dims[0] = nscan_good; dims[1] = bib; dims[2] = ndc;
642 uint16_t ***bdark = make3dT<uint16_t>(dims);
643 dims[0] = nscan_good; dims[1] = rib; dims[2] = ndc;
644 uint16_t ***rdark = make3dT<uint16_t>(dims);
650 count.push_back(nscan_good);
651 count.push_back(bib);
652 count.push_back(ndc);
654 var = ncGrps[3].getVar(
"sci_blue");
657 var.getAtt(
"_FillValue").getValues(&bfill);
662 count.push_back(nscan_good);
663 count.push_back(rib);
664 count.push_back(ndc);
666 var = ncGrps[3].getVar(
"sci_red");
669 var.getAtt(
"_FillValue").getValues(&rfill);
672 dims[0] = nscan_good; dims[1] = swb; dims[2] = nds;
673 uint32_t ***sdark = make3dT<uint32_t>(dims);
680 start.push_back(lds);
683 count.push_back(nscan_good);
684 count.push_back(swb);
685 count.push_back(nds);
687 var = ncGrps[3].getVar(
"sci_SWIR");
690 var.getAtt(
"_FillValue").getValues(&sfill);
699 uint32_t bicount[3] = {1,bib,(uint32_t) pcdim};
700 uint32_t ricount[3] = {1,rib,(uint32_t) pcdim};
701 uint32_t sicount[3] = {1,swb,(uint32_t) psdim};
702 uint32_t bcount[3] = {bbb,1,(uint32_t) pcdim};
703 uint32_t rcount[3] = {rbb,1,(uint32_t) pcdim};
704 uint32_t scount[3] = {swb,1,(uint32_t) psdim};
707 float **bdn =
new float *[bib];
708 bdn[0] =
new float[pcdim*bib];
709 for (
size_t i=1;
i<bib;
i++) bdn[
i] = bdn[
i-1] + pcdim;
711 float **rdn =
new float *[rib];
712 rdn[0] =
new float[pcdim*rib];
713 for (
size_t i=1;
i<rib;
i++) rdn[
i] = rdn[
i-1] + pcdim;
715 float **sdn =
new float *[swb];
716 sdn[0] =
new float[psdim*swb];
717 for (
size_t i=1;
i<swb;
i++) sdn[
i] = sdn[
i-1] + psdim;
719 float **bcal =
new float *[bib];
720 bcal[0] =
new float[pcdim*bib];
721 for (
size_t i=1;
i<bib;
i++) bcal[
i] = bcal[
i-1] + pcdim;
723 float **rcal =
new float *[rib];
724 rcal[0] =
new float[pcdim*rib];
725 for (
size_t i=1;
i<rib;
i++) rcal[
i] = rcal[
i-1] + pcdim;
727 float **scal =
new float *[swb];
728 scal[0] =
new float[psdim*swb];
729 for (
size_t i=1;
i<swb;
i++) scal[
i] = scal[
i-1] + psdim;
732 uint8_t *bsat =
new uint8_t[bib];
733 uint8_t **bqual =
new uint8_t *[bbb];
734 bqual[0] =
new uint8_t[pcdim*bbb];
735 for (
size_t i=1;
i<bbb;
i++) bqual[
i] = bqual[
i-1] + pcdim;
737 uint8_t *rsat =
new uint8_t[rib];
738 uint8_t **rqual =
new uint8_t *[rbb];
739 rqual[0] =
new uint8_t[pcdim*rbb];
740 for (
size_t i=1;
i<rbb;
i++) rqual[
i] = rqual[
i-1] + pcdim;
742 uint8_t *ssat =
new uint8_t[swb];
743 uint8_t **squal =
new uint8_t *[swb];
744 squal[0] =
new uint8_t[psdim*swb];
745 for (
size_t i=1;
i<swb;
i++) squal[
i] = squal[
i-1] + psdim;
748 double *thetap =
new double[pcdim];
749 double *thetas =
new double[psdim];
751 float **pview =
new float *[pcdim];
752 pview[0] =
new float[3*pcdim];
753 for (
size_t i=1;
i<pcdim;
i++) pview[
i] = pview[
i-1] + 3;
755 float **sview =
new float *[psdim];
756 sview[0] =
new float[3*psdim];
757 for (
size_t i=1;
i<psdim;
i++) sview[
i] = sview[
i-1] + 3;
759 uint16_t **bsci =
new uint16_t *[bib];
760 bsci[0] =
new uint16_t[pcdim*bib];
761 for (
size_t i=1;
i<bib;
i++) bsci[
i] = bsci[
i-1] + pcdim;
763 uint16_t **rsci =
new uint16_t *[rib];
764 rsci[0] =
new uint16_t[pcdim*rib];
765 for (
size_t i=1;
i<rib;
i++) rsci[
i] = rsci[
i-1] + pcdim;
767 uint32_t **ssci =
new uint32_t *[swb];
768 ssci[0] =
new uint32_t[psdim*swb];
769 for (
size_t i=1;
i<swb;
i++) ssci[
i] = ssci[
i-1] + psdim;
771 float **bcalb =
new float *[bbb];
772 bcalb[0] =
new float[pcdim*bbb];
773 for (
size_t i=1;
i<bbb;
i++) bcalb[
i] = bcalb[
i-1] + pcdim;
775 float **rcalb =
new float *[rbb];
776 rcalb[0] =
new float[pcdim*rbb];
777 for (
size_t i=1;
i<rbb;
i++) rcalb[
i] = rcalb[
i-1] + pcdim;
784 for (
size_t iscn=0; iscn<nscan_good; iscn++) {
786 if ((iscn % 50) == 0) cout <<
"Calibrating scan: " << iscn << endl;
789 if ( hside[iscn] == 0 || hside[iscn] == 1) {
794 ev_toff,
spin[iscn], hside[iscn],
795 clines, deltc, revpsec, ppr_off, board_id, nmcescan, mspin,
796 enc_count, &hamenc[0], &rtaenc[0], pview, thetap, iret);
798 for (
size_t k=0;
k<pcdim;
k++) thetap[
k] *= 180/
M_PI;
802 ev_toff,
spin[iscn], hside[iscn],
803 slines, delts, revpsec, ppr_off, board_id, nmcescan, mspin,
804 enc_count, &hamenc[0], &rtaenc[0], sview, thetas, iret);
806 for (
size_t k=0;
k<psdim;
k++) thetas[
k] *= 180/
M_PI;
810 start.push_back(iscn);
815 count.push_back(pcdim);
817 var =
outfile.ncGrps[3].getVar(
"CCD_scan_angles");
821 var =
outfile.ncGrps[3].getVar(
"SWIR_scan_angles");
828 start.push_back(iscn);
833 count.push_back(bicount[0]);
834 count.push_back(bicount[1]);
835 count.push_back(bicount[2]);
838 var = ncGrps[3].getVar(
"sci_blue");
843 float *bdc =
new float[bib];
847 get_oci_dark<uint16_t>( iscn, nscan_good, hside, ndsc, nskp,
848 iagg[ka], iagg[kd], ntaps, bagg, fill32,
849 ndc, bdark, bib, bdc, iret);
851 float *k3 =
new float[bib];
853 for (
size_t j=0;
j<bib;
j++) {
854 for (
size_t k=0;
k<pcdim;
k++) {
857 if (bsci[
j][
k] == bfill) {
864 bdn[
j][
k] = bsci[
j][
k] - bdc[
j];
865 bcal[
j][
k] = k3[
j] * bgains.
K1K2[
j][hside[iscn]] * bdn[
j][
k];
873 float **k4 =
new float *[bib];
874 k4[0] =
new float[pcdim*bib];
875 for (
size_t i=1;
i<bib;
i++) k4[
i] = k4[
i-1] + pcdim;
878 float **k5 =
new float *[bib];
879 k5[0] =
new float[pcdim*bib];
880 for (
size_t i=1;
i<bib;
i++) k5[
i] = k5[
i-1] + pcdim;
883 for (
size_t j=0;
j<bib;
j++) {
884 for (
size_t k=0;
k<pcdim;
k++) {
885 if(bcal[
j][
k] != -32767)
886 bcal[
j][
k] *= k4[
j][
k] * k5[
j][
k];
897 for (
size_t j=0;
j<bbb;
j++) {
898 for (
size_t k=0;
k<pcdim;
k++) {
900 for (
size_t l=0; l<bib; l++)
901 if (bcal[l][
k] != -32767) sum += bamat[l][
j]*bcal[l][
k];
905 bcalb[
j][
k] *=
M_PI*distcorr/(b1bf0[
j]*csolz[iscn*pcdim+
k]);
907 bcalb[
j][
k] = -32767;
913 for (
size_t k=0;
k<pcdim;
k++) {
914 for (
size_t j=0;
j<bib;
j++) {
918 for (
size_t j=0;
j<bbb;
j++) {
921 for (
size_t l=0; l<bib; l++) sum += bamat[l][
j]*bsat[l];
922 if ( sum > 0) bqual[
j][
k] = 1;
928 start.push_back(iscn);
932 count.push_back(bcount[0]);
933 count.push_back(bcount[1]);
934 count.push_back(bcount[2]);
938 var =
outfile.ncGrps[4].getVar(
"rhot_blue");
940 var =
outfile.ncGrps[4].getVar(
"Lt_blue");
943 var =
outfile.ncGrps[4].getVar(
"qual_blue");
952 start.push_back(iscn);
957 count.push_back(ricount[0]);
958 count.push_back(ricount[1]);
959 count.push_back(ricount[2]);
961 var = ncGrps[3].getVar(
"sci_red");
966 float *rdc =
new float[rib];
969 get_oci_dark<uint16_t>( iscn, nscan_good, hside, ndsc, nskp,
970 iagg[ka], iagg[kd], ntaps, ragg, fill32,
971 ndc, rdark, rib, rdc, iret);
973 float *k3 =
new float[rib];
976 for (
size_t j=0;
j<rib;
j++) {
977 for (
size_t k=0;
k<pcdim;
k++) {
980 if (rsci[
j][
k] == rfill) {
987 rdn[
j][
k] = rsci[
j][
k] - rdc[
j];
988 rcal[
j][
k] = k3[
j] * rgains.
K1K2[
j][hside[iscn]] * rdn[
j][
k];
996 float **k4 =
new float *[rib];
997 k4[0] =
new float[pcdim*rib];
998 for (
size_t i=1;
i<rib;
i++) k4[
i] = k4[
i-1] + pcdim;
1001 float **k5 =
new float *[rib];
1002 k5[0] =
new float[pcdim*rib];
1003 for (
size_t i=1;
i<rib;
i++) k5[
i] = k5[
i-1] + pcdim;
1007 for (
size_t j=0;
j<rib;
j++) {
1008 for (
size_t k=0;
k<pcdim;
k++) {
1009 if(rcal[
j][
k] != -32767)
1010 rcal[
j][
k] *= k4[
j][
k] * k5[
j][
k];
1020 for (
size_t j=0;
j<rbb;
j++) {
1021 for (
size_t k=0;
k<pcdim;
k++) {
1023 for (
size_t l=0; l<rib; l++)
1024 if (rcal[l][
k] != -32767) sum += ramat[l][
j]*rcal[l][
k];
1028 rcalb[
j][
k] *=
M_PI*distcorr/(r1bf0[
j]*csolz[iscn*pcdim+
k]);
1030 rcalb[
j][
k] = -32767;
1036 for (
size_t k=0;
k<pcdim;
k++) {
1037 for (
size_t j=0;
j<rib;
j++) {
1041 for (
size_t j=0;
j<rbb;
j++) {
1044 for (
size_t l=0; l<rib; l++) sum += ramat[l][
j]*rsat[l];
1045 if ( sum > 0) rqual[
j][
k] = 1;
1051 start.push_back(iscn);
1055 count.push_back(rcount[0]);
1056 count.push_back(rcount[1]);
1057 count.push_back(rcount[2]);
1061 var =
outfile.ncGrps[4].getVar(
"rhot_red");
1063 var =
outfile.ncGrps[4].getVar(
"Lt_red");
1066 var =
outfile.ncGrps[4].getVar(
"qual_red");
1073 start.push_back(iscn);
1078 count.push_back(sicount[0]);
1079 count.push_back(sicount[1]);
1080 count.push_back(sicount[2]);
1082 var = ncGrps[3].getVar(
"sci_SWIR");
1087 float *sdc =
new float[swb];
1091 float *k3 =
new float[swb];
1093 float **k4 =
new float *[swb];
1094 k4[0] =
new float[psdim*swb];
1095 for (
size_t i=1;
i<swb;
i++) k4[
i] = k4[
i-1] + psdim;
1097 float **k5 =
new float *[swb];
1098 k5[0] =
new float[psdim*swb];
1099 for (
size_t i=1;
i<swb;
i++) k5[
i] = k5[
i-1] + psdim;
1110 for (
int pix=0; pix<psdim*swb; pix++) {
1116 get_oci_dark<uint32_t>( iscn, nscan_good, hside, ndsc, nskp,
1117 1, 1, 1, &sagg, sfill, nds, sdark,
1130 for (
size_t j=0;
j<swb;
j++) {
1133 int32_t *indx =
new int32_t[psdim];
1134 for (
size_t k=0;
k<psdim;
k++) {
1137 if (radiance && ssci[
j][
k] != sfill) {
1138 indx[goodcnt++] =
k;
1141 else if (!radiance && ssci[
j][
k] != sfill && (
int)qualFlag[iscn*pcdim+
k] == 0) {
1142 indx[goodcnt++] =
k;
1147 scal[
j][
k] = -32767;
1152 float hc_prev[4]={0,0,0,0};
1153 float hc[4]={0,0,0,0};
1154 float *hyst =
new float[psdim];
1156 for (
size_t k=0;
k<goodcnt;
k++) {
1158 sdn[
j][indx[
k]] = ssci[
j][indx[
k]] - sdc[
j];
1162 for (
size_t l=0; l<3; l++) {
1164 float e = exp(-1.0/hysttime[
j][l]);
1166 hc[l] = hc_prev[l]*e + sdn[
j][indx[
k-1]]*hystamp[
j][l];
1176 for (
size_t k=0;
k<goodcnt;
k++) {
1178 k3[
j] * sgains.
K1K2[
j][hside[iscn]] * (sdn[
j][indx[
k]] - hyst[
k]);
1180 scal[
j][indx[
k]] *= k5[
j][indx[
k]]*k4[
j][indx[
k]];
1184 scal[
j][indx[
k]] *=
M_PI*distcorr/(sf0[
j]*csolz[iscn*psdim+indx[
k]]);
1186 scal[
j][indx[
k]] = -32767;
1197 for (
size_t k=0;
k<psdim;
k++) {
1198 for (
size_t j=0;
j<swb;
j++) {
1202 for (
size_t j=0;
j<swb;
j++) {
1203 squal[
j][
k] = ssat[
j];
1217 start.push_back(iscn);
1221 count.push_back(scount[0]);
1222 count.push_back(scount[1]);
1223 count.push_back(scount[2]);
1227 var =
outfile.ncGrps[4].getVar(
"rhot_SWIR");
1229 var =
outfile.ncGrps[4].getVar(
"Lt_SWIR");
1232 var =
outfile.ncGrps[4].getVar(
"qual_SWIR");
1236 cout <<
"No mirror side index for scan: " << iscn << endl;
1247 float *b1bwave =
new float[bbb];
1248 float *sum =
new float[bib];
1249 for (
size_t i=0;
i<bib;
i++) {
1251 for (
size_t j=0;
j<512;
j++) {
1252 sum[
i] += bwave[
j]*bgmat[
j][
i];
1257 for (
size_t i=0;
i<bbb;
i++) {
1259 for (
size_t j=0;
j<bib;
j++) {
1260 b1bwave[
i] += bamat[
j][
i]*sum[
j];
1268 count.push_back(bbb);
1269 var =
outfile.ncGrps[0].getVar(
"blue_wavelength");
1272 var =
outfile.ncGrps[0].getVar(
"blue_solar_irradiance");
1279 dims[0] = bbb; dims[1] = 2; dims[2] = 3;
1280 float ***b1bm12 = make3dT<float>(dims);
1281 float ***b1bm13 = make3dT<float>(dims);
1283 for (
size_t l=0; l<3; l++) {
1284 for (
size_t m=0; m<2; m++) {
1286 for (
size_t i=0;
i<bib;
i++) {
1294 for (
size_t i=0;
i<bbb;
i++) {
1295 b1bm12[
i][m][l] = 0.0;
1296 for (
size_t j=0;
j<bib;
j++) {
1297 b1bm12[
i][m][l] += bamat[
j][
i]*sum[
j];
1301 for (
size_t i=0;
i<bib;
i++) {
1309 for (
size_t i=0;
i<bbb;
i++) {
1310 b1bm13[
i][m][l] = 0.0;
1311 for (
size_t j=0;
j<bib;
j++) {
1312 b1bm13[
i][m][l] += bamat[
j][
i]*sum[
j];
1325 var =
outfile.ncGrps[0].getVar(
"blue_m12_coef");
1327 var =
outfile.ncGrps[0].getVar(
"blue_m13_coef");
1333 delete [] b1bm12[0][0];
1334 delete [] b1bm13[0][0];
1338 float *r1bwave =
new float[rbb];
1339 float *sum =
new float[rib];
1340 for (
size_t i=0;
i<rib;
i++) {
1342 for (
size_t j=0;
j<512;
j++) {
1343 sum[
i] += rwave[
j]*rgmat[
j][
i];
1347 for (
size_t i=0;
i<rbb;
i++) {
1349 for (
size_t j=0;
j<rib;
j++) {
1350 r1bwave[
i] += ramat[
j][
i]*sum[
j];
1358 count.push_back(rbb);
1359 var =
outfile.ncGrps[0].getVar(
"red_wavelength");
1362 var =
outfile.ncGrps[0].getVar(
"red_solar_irradiance");
1365 dims[0] = rbb; dims[1] = 2; dims[2] = 3;
1366 float ***r1bm12 = make3dT<float>(dims);
1367 float ***r1bm13 = make3dT<float>(dims);
1369 for (
size_t l=0; l<3; l++) {
1370 for (
size_t m=0; m<2; m++) {
1372 for (
size_t i=0;
i<rib;
i++) {
1380 for (
size_t i=0;
i<rbb;
i++) {
1381 r1bm12[
i][m][l] = 0.0;
1382 for (
size_t j=0;
j<rib;
j++) {
1383 r1bm12[
i][m][l] += ramat[
j][
i]*sum[
j];
1387 for (
size_t i=0;
i<rib;
i++) {
1395 for (
size_t i=0;
i<rbb;
i++) {
1396 r1bm13[
i][m][l] = 0.0;
1397 for (
size_t j=0;
j<rib;
j++) {
1398 r1bm13[
i][m][l] += ramat[
j][
i]*sum[
j];
1411 var =
outfile.ncGrps[0].getVar(
"red_m12_coef");
1413 var =
outfile.ncGrps[0].getVar(
"red_m13_coef");
1419 delete [] r1bm12[0][0];
1420 delete [] r1bm13[0][0];
1429 var =
outfile.ncGrps[0].getVar(
"SWIR_wavelength");
1431 var =
outfile.ncGrps[0].getVar(
"SWIR_bandpass");
1434 var =
outfile.ncGrps[0].getVar(
"SWIR_solar_irradiance");
1443 var =
outfile.ncGrps[0].getVar(
"SWIR_m12_coef");
1445 var =
outfile.ncGrps[0].getVar(
"SWIR_m13_coef");
1450 outfile.write_granule_metadata( tstart, tend, l1b_filename);
1467 delete [] enc_count;
1474 delete [] hamenc[0];
1476 delete [] rtaenc[0];
1478 delete [] caltemps[0];
1509 delete [] blue_lut.
K1[0];
1510 delete [] blue_lut.
K1;
1511 delete [] blue_lut.
K5_coef[0];
1523 delete [] red_lut.
K1[0];
1524 delete [] red_lut.
K1;
1533 delete [] swir_lut.
K1[0];
1534 delete [] swir_lut.
K1;
1535 delete [] swir_lut.
K5_coef[0];
1538 delete [] sgains.
K1K2[0];
1539 delete [] sgains.
K1K2;
1544 delete [] bdark[0][0];
1553 uint32_t& banddim, uint32_t mcedim, uint32_t& nldim,
1556 size_t dims[3],dims4[4];
1558 uint32_t timedim, tempdim, tcdim, rvsdim, msdim=2;
1560 bandname.assign( tag);
1561 bandname.append(
"_bands");
1563 ncDIM = calLUTfile->getDim(bandname.c_str());
1564 banddim = ncDIM.getSize();
1566 ncDIM = calLUTfile->getDim(
"number_of_times");
1567 timedim = ncDIM.getSize();
1569 if (tag.compare(
"blue") == 0 || tag.compare(
"red") == 0)
1570 ncDIM = calLUTfile->getDim(
"number_of_CCD_temperatures");
1572 ncDIM = calLUTfile->getDim(
"number_of_SWIR_temperatures");
1573 tempdim = ncDIM.getSize();
1575 ncDIM = calLUTfile->getDim(
"number_of_T_coefficients");
1576 tcdim = ncDIM.getSize();
1577 ncDIM = calLUTfile->getDim(
"number_of_RVS_coefficients");
1578 rvsdim = ncDIM.getSize();
1579 ncDIM = calLUTfile->getDim(
"number_of_nonlinearity_coefficients");
1580 nldim = ncDIM.getSize();
1581 ncDIM = calLUTfile->getDim(
"number_of_polarization_coefficients");
1582 poldim = ncDIM.getSize();
1584 float**
K1 =
new float *[banddim];
1585 K1[0] =
new float[msdim*banddim];
1586 for (
size_t i=1;
i<banddim;
i++)
K1[
i] =
K1[
i-1] + msdim;
1589 dims[0] = banddim; dims[1] = msdim; dims[2] = timedim;
1590 float ***K2 = make3dT<float>(dims);
1592 dims[0] = banddim; dims[1] = tempdim; dims[2] = tcdim;
1593 float ***K3_coef = make3dT<float>(dims);
1595 dims4[0] = banddim; dims4[1] = msdim; dims4[2] = mcedim; dims4[3] = rvsdim;
1596 float ****K4_coef = make4dT<float>(dims4);
1599 double **K5_coef =
new double *[banddim];
1600 K5_coef[0] =
new double[nldim*banddim];
1601 for (
size_t i=1;
i<banddim;
i++) K5_coef[
i] = K5_coef[
i-1] + nldim;
1604 uint32_t *sat_thres =
new uint32_t [banddim];
1607 dims[0] = banddim; dims[1] = msdim; dims[2] = poldim;
1608 float ***m12_coef = make3dT<float>(dims);
1610 float ***m13_coef = make3dT<float>(dims);
1614 cal_lut.
ldims[0] = timedim; cal_lut.
ldims[1] = tempdim;
1615 cal_lut.
ldims[2] = tcdim; cal_lut.
ldims[3] = rvsdim;
1616 cal_lut.
ldims[4] = nldim; cal_lut.
ldims[5] = msdim;
1617 cal_lut.
ldims[6] = poldim;
1620 var = gidLUT.getVar(
"K1");
1621 var.getVar( &cal_lut.
K1[0][0]);
1622 var = gidLUT.getVar(
"K2");
1623 var.getVar( &cal_lut.
K2[0][0][0]);
1624 var = gidLUT.getVar(
"K3_coef");
1625 var.getVar( &cal_lut.
K3_coef[0][0][0]);
1626 var = gidLUT.getVar(
"K4_coef");
1627 var.getVar( &cal_lut.
K4_coef[0][0][0][0]);
1628 var = gidLUT.getVar(
"K5_coef");
1629 var.getVar( &cal_lut.
K5_coef[0][0]);
1630 var = gidLUT.getVar(
"sat_thres");
1633 var = gidLUT.getVar(
"m12_coef");
1634 var.getVar( &cal_lut.
m12_coef[0][0][0]);
1635 var = gidLUT.getVar(
"m13_coef");
1636 var.getVar( &cal_lut.
m13_coef[0][0][0]);
1647 double stime,
size_t numTimes,
double *K2t, int16_t board_id,
1653 uint16_t timedim = gains.
ldims[0];
1654 uint16_t tempdim = gains.
ldims[1];
1655 uint16_t tcdim = gains.
ldims[2];
1656 uint16_t rvsdim = gains.
ldims[3];
1657 uint16_t nldim = gains.
ldims[4];
1658 uint16_t msdim = gains.
ldims[5];
1662 int16_t *iaf =
NULL;
1665 if ( board_id == -1) {
1667 iaf =
new int16_t[nib];
1669 for (
size_t i=0;
i<16;
i++) {
1671 uint32_t
nb = 32/jagg[
i];
1672 for (
size_t j=0;
j<
nb;
j++) {
1673 if (iagg*jagg[
i] < 4)
1674 iaf[ib+
j] = 4/(iagg*jagg[
i]);
1681 }
else bd_id = board_id % 2;
1685 float **K1K2 =
new float *[nib];
1686 K1K2[0] =
new float[nib*msdim];
1687 for (
size_t i=1;
i<nib;
i++) K1K2[
i] = K1K2[
i-1] + msdim;
1689 dims[0] = nib; dims[1] = tempdim; dims[2] = tcdim;
1690 float ***K3_coef = make3dT<float>(dims);
1692 dims[0] = nib; dims[1] = msdim; dims[2] = rvsdim;
1693 float ***K4_coef = make3dT<float>(dims);
1696 double **K5_coef =
new double *[nib];
1697 K5_coef[0] =
new double[nib*nldim];
1698 for (
size_t i=1;
i<nib;
i++) K5_coef[
i] = K5_coef[
i-1] + nldim;
1701 uint32_t *sat_thres =
new uint32_t[nib];
1705 double *K2 =
new double[banddim];
1706 for (
size_t ms=0; ms<msdim; ms++) {
1709 double d2 =
jd - 2451545 + stime/86400.0;
1712 for (
size_t j=numTimes-1;
j>=0;
j--) {
1718 if ( kd < (
size_t) (timedim-1)) {
1719 double ff = (d2 - K2t[kd]) / (K2t[kd+1] - K2t[kd]);
1720 for (
size_t j=0;
j<banddim;
j++)
1721 K2[
j] = cal_lut.
K2[
j][ms][kd]*(1.0-
ff) + cal_lut.
K2[
j][ms][kd+1]*
ff;
1723 for (
size_t j=0;
j<banddim;
j++) K2[
j] = cal_lut.
K2[
j][ms][kd];
1727 for (
size_t i=0;
i<nib;
i++) {
1728 gains.
K1K2[
i][ms] = 0;
1729 if (hyper) iaf0 = iaf[
i];
1730 for (
size_t j=0;
j<banddim;
j++)
1731 gains.
K1K2[
i][ms] += gmat[
j][
i] * cal_lut.
K1[
j][ms]*K2[
j]*iaf0;
1735 for (
size_t i=0;
i<nib;
i++) {
1736 for (
size_t k=0;
k<rvsdim;
k++) {
1738 for (
size_t j=0;
j<banddim;
j++) {
1752 for (
size_t i=0;
i<nib;
i++) {
1753 for (
size_t k=0;
k<tcdim;
k++) {
1754 for (
size_t l=0; l<tempdim; l++) {
1756 for (
size_t j=0;
j<banddim;
j++)
1763 for (
size_t i=0;
i<nib;
i++) {
1764 for (
size_t k=0;
k<nldim;
k++) {
1766 for (
size_t j=0;
j<banddim;
j++) {
1769 gmat[
j][
i] * cal_lut.
K5_coef[
j][
k] * powf(iaf[
i], (
float)
i);
1778 for (
size_t i=0;
i<nib;
i++) {
1780 for (
size_t j=0;
j<banddim;
j++) {
1788 if (hyper)
delete[] iaf;
1794 template <
typename T>
1795 int get_oci_dark(
size_t iscn, uint32_t nscan, uint8_t *hside, uint16_t ndsc,
1796 uint16_t nskp, int16_t iags, int16_t iagd, uint32_t ntaps,
1797 int16_t *jagg, uint32_t dfill, int16_t ndc, T ***dark,
1798 uint32_t nib,
float *dc, int16_t& iret) {
1804 int16_t *nbndt =
new int16_t[ntaps];
1808 for (
size_t i=0;
i<ntaps;
i++)
1809 if ( jagg[
i] > 0) nbndt[
i] = 32 / jagg[
i];
else nbndt[
i] = 0;
1811 for (
size_t i=0;
i<ntaps;
i++) nbndt[
i] = 9;
1814 for (
size_t i=0;
i<ntaps;
i++)
nbnd += nbndt[
i];
1817 int32_t *kh =
new int32_t[
nscan];
1820 if ( hside[
i] == hside[iscn]) {
1821 kh[
i] = (int32_t)
i;
1830 if ( kh[
i] == (int32_t) iscn) {
1837 uint16_t ndscl = ndsc;
1838 bool valid_dark_found =
false;
1839 int32_t is1=js, is2=js;
1841 while (!valid_dark_found && ndscl <= nkh) {
1857 for (
size_t i=is1;
i<=(size_t) is2;
i++) {
1858 for (
size_t j=nskp;
j<(size_t) ndc;
j++) {
1859 if ( dark[kh[
i]][0][
j] != dfill) {
1860 valid_dark_found =
true;
1865 if ( !valid_dark_found) ndscl += 2;
1868 if ( !valid_dark_found) {
1875 for (
size_t i=0;
i<ntaps;
i++) {
1879 if ( iags*jagg[
i] > 4) {
1880 ddiv = iagd * jagg[
i] / 4.0;
1881 doff = (ddiv-1) / (2*ddiv);
1884 for (
size_t j=0;
j<(size_t) nbndt[
i];
j++) {
1887 for (
size_t k=kh[is1];
k<=(size_t) kh[is2];
k++) {
1888 for (
size_t l=nskp; l<(size_t) ndc; l++) {
1889 if (dark[
k][ibnd+
j][l] != dfill) {
1890 sum += dark[
k][ibnd+
j][l];
1895 dc[ibnd+
j] = ((sum/(nv))/ddiv) - doff;
1905 if (ndscl > ndsc) iret = 1;
1912 float *caltemps, uint32_t nscan,
float *k3) {
1914 uint16_t tempdim = gains.
ldims[1];
1915 uint16_t tcdim = gains.
ldims[2];
1917 for (
size_t i=0;
i<nib;
i++) k3[
i] = 1.0;
1919 for (
size_t i=0;
i<tempdim;
i++) {
1920 float td = caltemps[
i] - K3T[
i];
1921 for (
size_t j=0;
j<tcdim;
j++) {
1922 for (
size_t k=0;
k<nib;
k++) {
1936 uint16_t rvsdim = gains.
ldims[3];
1938 for (
size_t i=0;
i<nib;
i++)
1939 for (
size_t j=0;
j<pdim;
j++)
1942 for (
size_t i=0;
i<rvsdim;
i++)
1943 for (
size_t j=0;
j<nib;
j++)
1944 for (
size_t k=0;
k<pdim;
k++)
1945 k4[
j][
k] += gains.
K4_coef[
j][hside][
i] * powf(theta[
k],
i+1);
1953 for (
size_t i=0;
i<pdim;
i++) {
1955 for (
size_t j=0;
j<nib;
j++) {
1958 for (
size_t k=1;
k<nldim;
k++) {
1969 uint16_t ntemps, uint32_t nscan,
double *evtime,
1984 uint32_t tlmdim, daudim, icdudim;
1985 ncDIM = l1afile->getDim(
"tlm_packets");
1986 tlmdim = ncDIM.getSize();
1987 ncDIM = l1afile->getDim(
"DAUC_temps");
1988 daudim = ncDIM.getSize();
1989 ncDIM = l1afile->getDim(
"ICDU_therm");
1990 icdudim = ncDIM.getSize();
1992 double *dauctime =
new double[tlmdim];
1994 float **dauctemp =
new float *[tlmdim];
1995 dauctemp[0] =
new float[daudim*tlmdim];
1996 for (
size_t i=1;
i<tlmdim;
i++) dauctemp[
i] = dauctemp[
i-1] + daudim;
1998 double *icdutime =
new double[tlmdim];
2000 float **icdutherm =
new float *[tlmdim];
2001 icdutherm[0] =
new float[icdudim*tlmdim];
2002 for (
size_t i=1;
i<tlmdim;
i++) icdutherm[
i] = icdutherm[
i-1] + icdudim;
2005 var = egid.getVar(
"DAUC_temp_time");
2006 var.getVar( dauctime);
2007 var = egid.getVar(
"DAUC_temperatures");
2008 var.getVar( &dauctemp[0][0]);
2009 var = egid.getVar(
"TC_tlm_time");
2010 var.getVar( icdutime);
2011 var = egid.getVar(
"ICDU_thermisters");
2012 var.getVar( &icdutherm[0][0]);
2025 uint32_t iicdu[5] = {23,24,25,26,11};
2027 uint32_t idauc[26] = {5,6,12,13,
2028 14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
2032 double *dstime =
new double[
nscan];
2033 for (
size_t i=0;
i<
nscan;
i++) dstime[
i] = evtime[
i] - evtime[0];
2036 double *ditime =
new double[tlmdim];
2037 double *dummy =
new double[tlmdim];
2038 double c0, c1, cov00, cov01, cov11,
sumsq;
2039 for (
size_t i=0;
i<=3;
i++) {
2041 for (
size_t j=0;
j<tlmdim;
j++)
2042 if ( icdutime[
j] > 0) {
2043 ditime[
k] = icdutime[
j] - evtime[0];
2044 dummy[
k++] = icdutherm[
j][iicdu[
i]];
2047 gsl_fit_linear(ditime, 1, dummy, 1,
k,
2048 &c0, &c1, &cov00, &cov01, &cov11, &
sumsq);
2050 for (
size_t j=0;
j<
nscan;
j++) caltemps[
j][
i] = c0 + c1*dstime[
j];
2054 for (
size_t j=0;
j<tlmdim;
j++)
2055 if ( icdutime[
j] > 0)
2056 dummy[
k++] = icdutherm[
j][iicdu[4]];
2058 gsl_fit_linear(ditime, 1, dummy, 1,
k,
2059 &c0, &c1, &cov00, &cov01, &cov11, &
sumsq);
2060 for (
size_t j=0;
j<
nscan;
j++) caltemps[
j][30] = c0 + c1*dstime[
j];
2063 double *ddtime =
new double[tlmdim];
2064 for (
size_t i=0;
i<=25;
i++) {
2066 for (
size_t j=0;
j<tlmdim;
j++)
2067 if ( dauctime[
j] > 0) {
2068 ddtime[
k] = dauctime[
j] - evtime[0];
2069 dummy[
k++] = dauctemp[
j][idauc[
i]];
2072 gsl_fit_linear(ddtime, 1, dummy, 1,
k,
2073 &c0, &c1, &cov00, &cov01, &cov11, &
sumsq);
2075 for (
size_t j=0;
j<
nscan;
j++) caltemps[
j][
i+4] = c0 + c1*dstime[
j];
2079 delete [] dauctemp[0];
2083 delete [] icdutherm[0];
2084 delete [] icdutherm;
2096 l1bfile->putAtt(
"time_coverage_start", tstart.c_str());
2097 l1bfile->putAtt(
"time_coverage_end", tend.c_str());
2100 l1bfile->putAtt(
"product_name", l1b_name.c_str());
2111 catch ( NcException& e) {
2112 cout << e.what() << endl;
2113 cerr <<
"Failure closing: " + fileName << endl;
2121 template <
typename T>
2124 T ***arr3d =
new T **[dims[0]];
2126 arr3d[0] =
new T*[dims[0]*dims[1]];
2127 arr3d[0][0] =
new T[dims[0]*dims[1]*dims[2]];
2129 for (
size_t i=1;
i<dims[0];
i++) arr3d[
i] = arr3d[
i-1] + dims[1];
2131 for (
size_t i=0;
i<dims[0];
i++) {
2132 if (
i > 0) arr3d[
i][0] = arr3d[
i-1][0] + dims[1]*dims[2];
2133 for (
size_t j=1;
j<dims[1];
j++)
2134 arr3d[
i][
j] = arr3d[
i][
j-1] + dims[2];
2140 template <
typename T>
2143 T ****arr4d =
new T ***[dims[0]];
2145 arr4d[0] =
new T**[dims[0]*dims[1]];
2146 arr4d[0][0] =
new T*[dims[0]*dims[1]*dims[2]];
2147 arr4d[0][0][0] =
new T[dims[0]*dims[1]*dims[2]*dims[3]];
2149 for (
size_t i=0;
i<dims[0];
i++) {
2151 arr4d[
i] = arr4d[
i-1] + dims[1];
2152 arr4d[
i][0] = arr4d[
i-1][0] + dims[1]*dims[2];
2153 arr4d[
i][0][0] = arr4d[
i-1][0][0] + dims[1]*dims[2]*dims[3];
2155 for (
size_t j=0;
j<dims[1];
j++) {
2157 arr4d[
i][
j] = arr4d[
i][
j-1] + dims[2];
2158 arr4d[
i][
j][0] = arr4d[
i][
j-1][0] + dims[2]*dims[3];
2160 for (
size_t k=1;
k<dims[2];
k++) {
2161 arr4d[
i][
j][
k] = arr4d[
i][
j][
k-1] + dims[3];