int OutCoreInterp::outputFile(char *outputName, int outputFormat, unsigned int outputType)
{
    int i, j, k, l;

    FILE **arcFiles;
    char arcFileName[1024];

    FILE **gridFiles;
    char gridFileName[1024];

    char *ext[5] = {".min", ".max", ".mean", ".idw", ".den"};
    unsigned int type[5] = {OUTPUT_TYPE_MIN, OUTPUT_TYPE_MAX, OUTPUT_TYPE_MEAN, OUTPUT_TYPE_IDW, OUTPUT_TYPE_DEN};
    int numTypes = 5;


    // open ArcGIS files
    if(outputFormat == OUTPUT_FORMAT_ARC_ASCII || outputFormat == OUTPUT_FORMAT_ALL)
        {
            if((arcFiles = (FILE **)malloc(sizeof(FILE *) *  numTypes)) == NULL)
                {
                    cout << "Arc File open error: " << endl;
                    return -1;
                }

            for(i = 0; i < numTypes; i++)
                {
                    if(outputType & type[i])
                        {
                            strncpy(arcFileName, outputName, sizeof(arcFileName));
                            strncat(arcFileName, ext[i], strlen(ext[i]));
                            strncat(arcFileName, ".asc", strlen(".asc"));

                            if((arcFiles[i] = fopen64(arcFileName, "w+")) == NULL)
                                {
                                    cout << "File open error: " << arcFileName << endl;
                                    return -1;
                                }
                        }else{
			arcFiles[i] = NULL;
		    }
                }
        } else {
	arcFiles = NULL;
    }

    // open Grid ASCII files
    if(outputFormat == OUTPUT_FORMAT_GRID_ASCII || outputFormat == OUTPUT_FORMAT_ALL)
        {
            if((gridFiles = (FILE **)malloc(sizeof(FILE *) * numTypes)) == NULL)
                {
                    cout << "File array allocation error" << endl;
                    return -1;
                }

            for(i = 0; i < numTypes; i++)
                {
                    if(outputType & type[i])
                        {
                            strncpy(gridFileName, outputName, sizeof(arcFileName));
                            strncat(gridFileName, ext[i], strlen(ext[i]));
                            strncat(gridFileName, ".grid", strlen(".grid"));

                            if((gridFiles[i] = fopen64(gridFileName, "w+")) == NULL)
                                {
                                    cout << "File open error: " << gridFileName << endl;
                                    return -1;
                                }
                        }else{
			gridFiles[i] = NULL;
		    }
                }
        } else {
	gridFiles = NULL;
    }

    // print ArcGIS headers
    if(arcFiles != NULL)
        {
            for(i = 0; i < numTypes; i++)
                {
                    if(arcFiles[i] != NULL)
                        {
                            fprintf(arcFiles[i], "ncols %d\n", GRID_SIZE_X);
                            fprintf(arcFiles[i], "nrows %d\n", GRID_SIZE_Y);
                            fprintf(arcFiles[i], "xllcorner %f\n", min_x);
                            fprintf(arcFiles[i], "yllcorner %f\n", min_y);
                            fprintf(arcFiles[i], "cellsize %f\n", GRID_DIST_X);
                            fprintf(arcFiles[i], "NODATA_value -9999\n");
                        }
                }
        }

    // print Grid headers
    if(gridFiles != NULL)
        {
            for(i = 0; i < numTypes; i++)
                {
                    if(gridFiles[i] != NULL)
                        {
                            fprintf(gridFiles[i], "north: %f\n", max_y);
                            fprintf(gridFiles[i], "south: %f\n", min_y);
                            fprintf(gridFiles[i], "east: %f\n", max_x);
                            fprintf(gridFiles[i], "west: %f\n", min_x);
                            fprintf(gridFiles[i], "rows: %d\n", GRID_SIZE_Y);
                            fprintf(gridFiles[i], "cols: %d\n", GRID_SIZE_X);
                        }
                }
        }


    for(i = numFiles -1; i >= 0; i--)
        {
            GridFile *gf = gridMap[i]->getGridFile();
            gf->map();

            int start = gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound();
            int end = gridMap[i]->getUpperBound() - gridMap[i]->getOverlapLowerBound() + 1;

            //int start = (gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound()) * GRID_SIZE_X;
            //int end = (gridMap[i]->getUpperBound() - gridMap[i]->getOverlapLowerBound() + 1) * GRID_SIZE_X;

            cout << "Merging " << i << ": from " << (start) << " to " << (end) << endl;
            cout << "        " << i << ": from " << (start/GRID_SIZE_X) << " to " << (end/GRID_SIZE_X) << endl;
	
            for(j = end - 1; j >= start; j--)
                {
                    for(k = 0; k < GRID_SIZE_X; k++)
                        {
                            int index = j * GRID_SIZE_X + k;

                            if(arcFiles != NULL)
                                {
                                    // Zmin
                                    if(arcFiles[0] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                //if(gf->interp[k][j].Zmin == 0)
                                                fprintf(arcFiles[0], "-9999 ");
                                            else
                                                //fprintf(arcFiles[0], "%f ", gf->interp[j][i].Zmin);
                                                fprintf(arcFiles[0], "%f ", gf->interp[index].Zmin);
                                        }

                                    // Zmax
                                    if(arcFiles[1] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(arcFiles[1], "-9999 ");
                                            else
                                                fprintf(arcFiles[1], "%f ", gf->interp[index].Zmax);
                                        }

                                    // Zmean
                                    if(arcFiles[2] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(arcFiles[2], "-9999 ");
                                            else
                                                fprintf(arcFiles[2], "%f ", gf->interp[index].Zmean);
                                        }

                                    // Zidw
                                    if(arcFiles[3] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(arcFiles[3], "-9999 ");
                                            else
                                                fprintf(arcFiles[3], "%f ", gf->interp[index].Zidw);
                                        }

                                    // count
                                    if(arcFiles[4] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(arcFiles[4], "-9999 ");
                                            else
                                                fprintf(arcFiles[4], "%d ", gf->interp[index].count);
                                        }
                                }

                            if(gridFiles != NULL)
                                {
                                    // Zmin
                                    if(gridFiles[0] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(gridFiles[0], "-9999 ");
                                            else
                                                fprintf(gridFiles[0], "%f ", gf->interp[index].Zmin);
                                        }

                                    // Zmax
                                    if(gridFiles[1] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(gridFiles[1], "-9999 ");
                                            else
                                                fprintf(gridFiles[1], "%f ", gf->interp[index].Zmax);
                                        }

                                    // Zmean
                                    if(gridFiles[2] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(gridFiles[2], "-9999 ");
                                            else
                                                fprintf(gridFiles[2], "%f ", gf->interp[index].Zmean);
                                        }

                                    // Zidw
                                    if(gridFiles[3] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(gridFiles[3], "-9999 ");
                                            else
                                                fprintf(gridFiles[3], "%f ", gf->interp[index].Zidw);
                                        }

                                    // count
                                    if(gridFiles[4] != NULL)
                                        {
					    if(gf->interp[index].empty == 0 &&
					       gf->interp[index].filled == 0)
                                                fprintf(gridFiles[4], "-9999 ");
                                            else
                                                fprintf(gridFiles[4], "%d ", gf->interp[index].count);
                                        }
                                }
                        }
	    	
                    if(arcFiles != NULL)
                        for(l = 0; l < numTypes; l++)
                            {
                                if(arcFiles[l] != NULL)
                                    fprintf(arcFiles[l], "\n");
                            }
	
                    if(gridFiles != NULL)
                        for(l = 0; l < numTypes; l++)
                            {
                                if(gridFiles[l] != NULL)
                                    fprintf(gridFiles[l], "\n");
                            }
                }

            gf->unmap();
        }

    // close files
    if(gridFiles != NULL)
        {
            for(i = 0; i < numTypes; i++)
                {
                    if(gridFiles[i] != NULL)
                        fclose(gridFiles[i]);
                }
        }

    if(arcFiles != NULL)
        {
            for(i = 0; i < numTypes; i++)
                {
                    if(arcFiles[i] != NULL)
                        fclose(arcFiles[i]);
                }
        }

    return 0;
}
示例#2
0
int OutCoreInterp::outputFile(char *outputName, int outputFormat, unsigned int outputType, double *adfGeoTransform, const char* wkt)
{
    int i, j, k, l, t;

    FILE **arcFiles;
    char arcFileName[1024];

    FILE **gridFiles;
    char gridFileName[1024];

    const char *ext[6] = {".min", ".max", ".mean", ".idw", ".den", ".std"};
    unsigned int type[6] = {OUTPUT_TYPE_MIN, OUTPUT_TYPE_MAX, OUTPUT_TYPE_MEAN, OUTPUT_TYPE_IDW, OUTPUT_TYPE_DEN, OUTPUT_TYPE_STD};
    int numTypes = 6;


    // open ArcGIS files
    if(outputFormat == OUTPUT_FORMAT_ARC_ASCII || outputFormat == OUTPUT_FORMAT_ALL)
    {
        if((arcFiles = (FILE **)malloc(sizeof(FILE *) *  numTypes)) == NULL)
        {
            cerr << "Arc File open error: " << endl;
            return -1;
        }

        for(i = 0; i < numTypes; i++)
        {
            if(outputType & type[i])
            {
                strncpy(arcFileName, outputName, sizeof(arcFileName));
                strncat(arcFileName, ext[i], strlen(ext[i]));
                strncat(arcFileName, ".asc", strlen(".asc"));

                if((arcFiles[i] = fopen(arcFileName, "w+")) == NULL)
                {
                    cerr << "File open error: " << arcFileName << endl;
                    return -1;
                }
            } else {
                arcFiles[i] = NULL;
            }
        }
    } else {
        arcFiles = NULL;
    }

    // open Grid ASCII files
    if(outputFormat == OUTPUT_FORMAT_GRID_ASCII || outputFormat == OUTPUT_FORMAT_ALL)
    {
        if((gridFiles = (FILE **)malloc(sizeof(FILE *) * numTypes)) == NULL)
        {
            cerr << "File array allocation error" << endl;
            return -1;
        }

        for(i = 0; i < numTypes; i++)
        {
            if(outputType & type[i])
            {
                strncpy(gridFileName, outputName, sizeof(arcFileName));
                strncat(gridFileName, ext[i], strlen(ext[i]));
                strncat(gridFileName, ".grid", strlen(".grid"));

                if((gridFiles[i] = fopen(gridFileName, "w+")) == NULL)
                {
                    cerr << "File open error: " << gridFileName << endl;
                    return -1;
                }
            } else {
                gridFiles[i] = NULL;
            }
        }
    } else {
        gridFiles = NULL;
    }

    // print ArcGIS headers
    if(arcFiles != NULL)
    {
        for(i = 0; i < numTypes; i++)
        {
            if(arcFiles[i] != NULL)
            {
                fprintf(arcFiles[i], "ncols %d\n", GRID_SIZE_X);
                fprintf(arcFiles[i], "nrows %d\n", GRID_SIZE_Y);
                fprintf(arcFiles[i], "xllcorner %f\n", min_x);
                fprintf(arcFiles[i], "yllcorner %f\n", min_y);
                fprintf(arcFiles[i], "cellsize %f\n", GRID_DIST_X);
                fprintf(arcFiles[i], "NODATA_value -9999\n");
            }
        }
    }

    // print Grid headers
    if(gridFiles != NULL)
    {
        for(i = 0; i < numTypes; i++)
        {
            if(gridFiles[i] != NULL)
            {
                fprintf(gridFiles[i], "north: %f\n", max_y);
                fprintf(gridFiles[i], "south: %f\n", min_y);
                fprintf(gridFiles[i], "east: %f\n", max_x);
                fprintf(gridFiles[i], "west: %f\n", min_x);
                fprintf(gridFiles[i], "rows: %d\n", GRID_SIZE_Y);
                fprintf(gridFiles[i], "cols: %d\n", GRID_SIZE_X);
            }
        }
    }

    for(i = numFiles -1; i >= 0; i--)
    {
        GridFile *gf = gridMap[i]->getGridFile();
        gf->map();

        int start = gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound();
        int end = gridMap[i]->getUpperBound() - gridMap[i]->getOverlapLowerBound() + 1;

        //int start = (gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound()) * GRID_SIZE_X;
        //int end = (gridMap[i]->getUpperBound() - gridMap[i]->getOverlapLowerBound() + 1) * GRID_SIZE_X;

        cerr << "Merging " << i << ": from " << (start) << " to " << (end) << endl;
        cerr << "        " << i << ": from " << (start/GRID_SIZE_X) << " to " << (end/GRID_SIZE_X) << endl;

        for(j = end - 1; j >= start; j--)
        {
            for(k = 0; k < GRID_SIZE_X; k++)
            {
                int index = j * GRID_SIZE_X + k;

                if(arcFiles != NULL)
                {
                    // Zmin
                    if(arcFiles[0] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            //if(gf->interp[k][j].Zmin == 0)
                            fprintf(arcFiles[0], "-9999 ");
                        else
                            //fprintf(arcFiles[0], "%f ", gf->interp[j][i].Zmin);
                            fprintf(arcFiles[0], "%f ", gf->interp[index].Zmin);
                    }

                    // Zmax
                    if(arcFiles[1] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(arcFiles[1], "-9999 ");
                        else
                            fprintf(arcFiles[1], "%f ", gf->interp[index].Zmax);
                    }

                    // Zmean
                    if(arcFiles[2] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(arcFiles[2], "-9999 ");
                        else
                            fprintf(arcFiles[2], "%f ", gf->interp[index].Zmean);
                    }

                    // Zidw
                    if(arcFiles[3] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(arcFiles[3], "-9999 ");
                        else
                            fprintf(arcFiles[3], "%f ", gf->interp[index].Zidw);
                    }

                    // count
                    if(arcFiles[4] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(arcFiles[4], "-9999 ");
                        else
                            fprintf(arcFiles[4], "%d ", gf->interp[index].count);
                    }

                    // Zstd
                    if(arcFiles[5] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(arcFiles[5], "-9999 ");
                        else
                            fprintf(arcFiles[5], "%f ", gf->interp[index].Zstd);
                    }
                }

                if(gridFiles != NULL)
                {
                    // Zmin
                    if(gridFiles[0] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(gridFiles[0], "-9999 ");
                        else
                            fprintf(gridFiles[0], "%f ", gf->interp[index].Zmin);
                    }

                    // Zmax
                    if(gridFiles[1] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(gridFiles[1], "-9999 ");
                        else
                            fprintf(gridFiles[1], "%f ", gf->interp[index].Zmax);
                    }

                    // Zmean
                    if(gridFiles[2] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(gridFiles[2], "-9999 ");
                        else
                            fprintf(gridFiles[2], "%f ", gf->interp[index].Zmean);
                    }

                    // Zidw
                    if(gridFiles[3] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(gridFiles[3], "-9999 ");
                        else
                            fprintf(gridFiles[3], "%f ", gf->interp[index].Zidw);
                    }

                    // count
                    if(gridFiles[4] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(gridFiles[4], "-9999 ");
                        else
                            fprintf(gridFiles[4], "%d ", gf->interp[index].count);
                    }

                    // Zstd
                    if(gridFiles[5] != NULL)
                    {
                        if(gf->interp[index].empty == 0 &&
                                gf->interp[index].filled == 0)
                            fprintf(gridFiles[5], "-9999 ");
                        else
                            fprintf(gridFiles[5], "%f ", gf->interp[index].Zstd);
                    }
		}
            }

            if(arcFiles != NULL)
                for(l = 0; l < numTypes; l++)
                {
                    if(arcFiles[l] != NULL)
                        fprintf(arcFiles[l], "\n");
                }

            if(gridFiles != NULL)
                for(l = 0; l < numTypes; l++)
                {
                    if(gridFiles[l] != NULL)
                        fprintf(gridFiles[l], "\n");
                }
        }

        gf->unmap();
    }

#ifdef HAVE_GDAL
    GDALDataset **gdalFiles;
    char gdalFileName[1024];

    // open GDAL GeoTIFF files
    if(outputFormat == OUTPUT_FORMAT_GDAL_GTIFF || outputFormat == OUTPUT_FORMAT_ALL)
    {
        GDALAllRegister();

        if((gdalFiles = (GDALDataset **)malloc(sizeof(GDALDataset *) *  numTypes)) == NULL)
        {
            cerr << "File array allocation error" << endl;
            return -1;
        }

        for(i = 0; i < numTypes; i++)
        {
            if(outputType & type[i])
            {
                strncpy(gdalFileName, outputName, sizeof(gdalFileName));
                strncat(gdalFileName, ext[i], strlen(ext[i]));
                strncat(gdalFileName, ".tif", strlen(".tif"));

                char **papszMetadata;
                const char *pszFormat = "GTIFF";
                GDALDriver* tpDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);

                if (tpDriver)
                {
                    papszMetadata = tpDriver->GetMetadata();
                    if (CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE))
                    {
                        char **papszOptions = NULL;
                        gdalFiles[i] = tpDriver->Create(gdalFileName, GRID_SIZE_X, GRID_SIZE_Y, 1, GDT_Float32, papszOptions);
                        if (gdalFiles[i] == NULL)
                        {
                            cerr << "File open error: " << gdalFileName << endl;
                            return -1;
                        } else {
                            if (adfGeoTransform)
                                gdalFiles[i]->SetGeoTransform(adfGeoTransform);
                            if (wkt)
                                gdalFiles[i]->SetProjection(wkt);
                        }
                    }
                }
            } else {
                gdalFiles[i] = NULL;
            }
        }
    } else {
      gdalFiles = NULL;
    }

    if(gdalFiles != NULL)
    {
        for(t = 0; t < numTypes; t++)
        {
            if(gdalFiles[t] != NULL)
            {
                for(i = numFiles -1; i >= 0; i--)
                {
                    GridFile *gf = gridMap[i]->getGridFile();
                    gf->map();

                    int start = gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound();
                    int end = gridMap[i]->getUpperBound() - gridMap[i]->getOverlapLowerBound() + 1;

                    cerr << "Merging " << i << ": from " << (start) << " to " << (end) << endl;
                    cerr << "        " << i << ": from " << (start/GRID_SIZE_X) << " to " << (end/GRID_SIZE_X) << endl;

                    float *poRasterData = new float[GRID_SIZE_X*GRID_SIZE_Y];
                    for (int j = 0; j < GRID_SIZE_X*GRID_SIZE_Y; j++)
                    {
                        poRasterData[j] = 0;
                    }

                    for(j = end - 1; j >= start; j--)
                    {
                        for(k = 0; k < GRID_SIZE_X; k++)
                        {
                            int index = j * GRID_SIZE_X + k;

                            if(gf->interp[index].empty == 0 &&
                                    gf->interp[index].filled == 0)
                            {
                                poRasterData[index] = -9999.f;
                             } else {
                                switch (t)
                                {
                                    case 0:
                                        poRasterData[index] = gf->interp[index].Zmin;
                                        break;

                                    case 1:
                                        poRasterData[index] = gf->interp[index].Zmax;
                                        break;

                                    case 2:
                                        poRasterData[index] = gf->interp[index].Zmean;
                                        break;

                                    case 3:
                                        poRasterData[index] = gf->interp[index].Zidw;
                                        break;

                                    case 4:
                                        poRasterData[index] = gf->interp[index].count;
                                        break;

                                    case 5:
                                        poRasterData[index] = gf->interp[index].Zstd;
                                        break;
                                }
                            }
                        }
                    }
                    GDALRasterBand *tBand = gdalFiles[t]->GetRasterBand(1);
                    tBand->SetNoDataValue(-9999.f);

                    if (GRID_SIZE_X > 0 && GRID_SIZE_Y > 0)
                        tBand->RasterIO(GF_Write, 0, 0, GRID_SIZE_X, GRID_SIZE_Y, poRasterData, GRID_SIZE_X, GRID_SIZE_Y, GDT_Float32, 0, 0);
                    GDALClose((GDALDatasetH) gdalFiles[t]);
                    delete [] poRasterData;
                }
            }
        }
    }
#endif // HAVE_GDAL

    // close files
    if(gridFiles != NULL)
    {
        for(i = 0; i < numTypes; i++)
        {
            if(gridFiles[i] != NULL)
                fclose(gridFiles[i]);
        }
    }

    if(arcFiles != NULL)
    {
        for(i = 0; i < numTypes; i++)
        {
            if(arcFiles[i] != NULL)
                fclose(arcFiles[i]);
        }
    }

    return 0;
}
int OutCoreInterp::finish(char *outputName, int outputFormat, unsigned int outputType)
{
    int i, j;
    GridPoint *p;
    GridFile *gf;
    int len_y;
    int offset;

    //struct tms tbuf;
    clock_t t0, t1;


    /*
    // managing overlap.
    read adjacent blocks and store ghost cells and update the cells

    merging multiple files
    */
    if(openFile != -1){
	gridMap[openFile]->getGridFile()->unmap();
	openFile = -1;
    }

     for(i = 0; i < numFiles; i++)
        {
            if(qlist[i].size() != 0)
                {
                    if((gf = gridMap[i]->getGridFile()) == NULL)
                        {
                            cout << "OutCoreInterp::finish() getGridFile() NULL" << endl;
                            return -1;
                        }

                    gf->map();
                    openFile = i;

                    // flush UpdateInfo queue
                    // pop every update information
                    list<UpdateInfo>::const_iterator iter;

                    for(iter = qlist[i].begin(); iter!= qlist[i].end(); iter++){ 
                        updateInterpArray(i, (*iter).data_x, (*iter).data_y, (*iter).data_z);
                    }
                    qlist[i].erase(qlist[i].begin(), qlist[i].end());

                    gf->unmap();
                    openFile = -1;
                    gf = NULL;
                }
        }

    for(i = 0; i < numFiles - 1; i++)
        {
            // read the upside overlap

            if((gf = gridMap[i]->getGridFile()) == NULL)
                {
                    cout << "OutCoreInterp::finish() getGridFile() NULL" << endl;
                    return -1;
                }

            if(gf->map() != -1)
                {
                    openFile = i;
		    // Sriram's edit to copy over DEM values to overlap also
                    len_y = 2 * (gridMap[i]->getOverlapUpperBound() - gridMap[i]->getUpperBound() - 1);

                    if((p = (GridPoint *)malloc(sizeof(GridPoint) * len_y * GRID_SIZE_X)) == NULL)
                        {
                            cout << "OutCoreInterp::finish() malloc error" << endl;
                            return -1;
                        }

                    int start = (gridMap[i]->getOverlapUpperBound() - gridMap[i]->getOverlapLowerBound() - len_y) * GRID_SIZE_X;
                    cout << "copy from " << start << " to " << (start + len_y * GRID_SIZE_X) << endl;

                    memcpy(p, &(gf->interp[start]), sizeof(GridPoint) * len_y * (GRID_SIZE_X) );

                    gf->unmap();
                    gf = NULL;
                    openFile = -1;

                } else {
		cout << "OutCoreInterp::finish() gf->map() error" << endl;
		return -1;
	    }
            // update (i+1)th component
            if((gf = gridMap[i+1]->getGridFile()) == NULL)
                {
                    cout << "OutCoreInterp::finish() getGridFile() NULL" << endl;
                    return -1;
                }

            if(gf->map() != -1)
                {
		    offset = 0;
                    openFile = i - 1;

                    for(j = 0; j < len_y * GRID_SIZE_X; j++)
                        {
                            if(gf->interp[j + offset].Zmin > p[j].Zmin)
                                gf->interp[j + offset].Zmin = p[j].Zmin;

                            if(gf->interp[j + offset].Zmax < p[j].Zmax)
                                gf->interp[j + offset].Zmax = p[j].Zmax;

                            gf->interp[j + offset].Zmean += p[j].Zmean;
                            gf->interp[j + offset].count += p[j].count;
			    
			    if (p[j].sum != -1) {
				gf->interp[j + offset].Zidw += p[j].Zidw;
				gf->interp[j + offset].sum += p[j].sum;
			    } else {
				gf->interp[j + offset].Zidw = p[j].Zidw;
				gf->interp[j + offset].sum = p[j].sum;
			    }
                        }

                    if(p != NULL){
                        free(p);
                        p = NULL;
                    }

                    gf->unmap();
                    gf = NULL;
                    openFile = -1;

                } else {
		cout << "OutCoreInterp::finish() gf->map() error" << endl;
		return -1;
	    }
        }

    for(i = numFiles -1; i > 0; i--)
        {
            // read the downside overlap

            if((gf = gridMap[i]->getGridFile()) == NULL)
                {
                    cout << "GridFile is NULL" << endl;
                    return -1;
                }

            if(gf->map() != -1)
                {
                    openFile = i;
                    len_y = 2 * (gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound());

                    if((p = (GridPoint *)malloc(sizeof(GridPoint) * len_y * GRID_SIZE_X)) == NULL)
                        {
                            cout << "OutCoreInterp::finish() malloc error" << endl;
                            return -1;
                        }

                    memcpy(p, &(gf->interp[0]), len_y * sizeof(GridPoint) * GRID_SIZE_X);

                    //finalize();
	
                    gf->unmap();
                    gf = NULL;
                    openFile = -1;
                } else {
		cout << "OutCoreInterp::finish gf->map() error" << endl;
		return -1;
	    }
            // update (i-1)th component
            if((gf = gridMap[i-1]->getGridFile()) == NULL)
                {
                    cout << "GridFile is NULL" << endl;
                    return -1;
                }

            if(gf->map() != -1)
                {
                    offset = (gridMap[i-1]->getOverlapUpperBound() - gridMap[i-1]->getOverlapLowerBound() - len_y) * GRID_SIZE_X;
                    openFile = i - 1;

                    for(j = 0; j < len_y * GRID_SIZE_X; j++)
                        {
			    // Sriram - the overlap already contains the correct values
			    gf->interp[j + offset].Zmin = p[j].Zmin;
			    gf->interp[j + offset].Zmax = p[j].Zmax;
                            gf->interp[j + offset].Zmean = p[j].Zmean;
                            gf->interp[j + offset].count = p[j].count;
                            gf->interp[j + offset].Zidw = p[j].Zidw;
                            gf->interp[j + offset].sum = p[j].sum;
                        }

                    //if(i - 1 == 0)
                    //finalize();

                    if(p != NULL){
                        free(p);
                        p = NULL;
                    }

                    gf->unmap();
                    gf = NULL;
                    openFile = -1;
                }
        }

    for(i = 0; i < numFiles; i++)
        {
            gridMap[i]->getGridFile()->map();
            openFile = i;
            finalize();
            gridMap[i]->getGridFile()->unmap();
            openFile = -1;
        }



    t0 = clock();
 
    // merge pieces into one file
    if(outputFile(outputName, outputFormat, outputType) < 0)
        {
            cout << "OutCoreInterp::finish outputFile error" << endl;
            return -1;
        }

    t1 = clock();
    printf("Output Execution time: %10.2f\n", (double)(t1 - t0)/CLOCKS_PER_SEC);

    return 0;
}
示例#4
0
int OutCoreInterp::finish(const std::string& outputName, int outputFormat, unsigned int outputType, double *adfGeoTransform, const char* wkt)
{
    int i, j;
    GridPoint *p;
    GridFile *gf;
    int len_y;
    int offset;

    //struct tms tbuf;
    clock_t t0, t1;


    /*
    // managing overlap.
    read adjacent blocks and store ghost cells and update the cells

    merging multiple files
    */
    if(openFile != -1) {
        gridMap[openFile]->getGridFile()->unmap();
        openFile = -1;
    }

    ////////////////////////////////////////////////////////////
    // flushing
    // can be moved inside the communications
    for(i = 0; i < numFiles; i++)
    {
        if(qlist[i].size() != 0)
        {
            if((gf = gridMap[i]->getGridFile()) == NULL)
            {
                cerr << "OutCoreInterp::finish() getGridFile() NULL" << endl;
                return -1;
            }

            gf->map();
            openFile = i;

            // flush UpdateInfo queue
            // pop every update information
            list<UpdateInfo>::const_iterator iter;

            for(iter = qlist[i].begin(); iter!= qlist[i].end(); iter++) {
                updateInterpArray(i, (*iter).data_x, (*iter).data_y, (*iter).data_z);
            }
            qlist[i].erase(qlist[i].begin(), qlist[i].end());

            gf->unmap();
            openFile = -1;
            gf = NULL;
        }
    }
    ////////////////////////////////////////////////////////////

    for(i = 0; i < numFiles - 1; i++)
    {
        //////////////////////////////////////////////////////////////
        // read the upside overlap

        if((gf = gridMap[i]->getGridFile()) == NULL)
        {
            cerr << "OutCoreInterp::finish() getGridFile() NULL" << endl;
            return -1;
        }

        if(gf->map() != -1)
        {
            openFile = i;
            // Sriram's edit to copy over DEM values to overlap also
            len_y = 2 * (gridMap[i]->getOverlapUpperBound() - gridMap[i]->getUpperBound() - 1);

            if((p = (GridPoint *)malloc(sizeof(GridPoint) * len_y * GRID_SIZE_X)) == NULL)
            {
                cerr << "OutCoreInterp::finish() malloc error" << endl;
                return -1;
            }

            int start = (gridMap[i]->getOverlapUpperBound() - gridMap[i]->getOverlapLowerBound() - len_y) * GRID_SIZE_X;
            cerr << "copy from " << start << " to " << (start + len_y * GRID_SIZE_X) << endl;

            memcpy(p, &(gf->interp[start]), sizeof(GridPoint) * len_y * (GRID_SIZE_X) );

            gf->unmap();
            gf = NULL;
            openFile = -1;

        } else {
            cerr << "OutCoreInterp::finish() gf->map() error" << endl;
            return -1;
        }
        //////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////
        // update (i+1)th component
        if((gf = gridMap[i+1]->getGridFile()) == NULL)
        {
            cerr << "OutCoreInterp::finish() getGridFile() NULL" << endl;
            return -1;
        }

        if(gf->map() != -1)
        {
            offset = 0;
            openFile = i - 1;

            for(j = 0; j < len_y * GRID_SIZE_X; j++)
            {
                if(gf->interp[j + offset].Zmin > p[j].Zmin)
                    gf->interp[j + offset].Zmin = p[j].Zmin;

                if(gf->interp[j + offset].Zmax < p[j].Zmax)
                    gf->interp[j + offset].Zmax = p[j].Zmax;

                gf->interp[j + offset].Zmean += p[j].Zmean;
                gf->interp[j + offset].count += p[j].count;

		/*
		// https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm
		double delta = p[j].Zstd_tmp - p[j].Zstd_tmp;
		gf->interp[j + offset].Zstd_tmp += delta / gf->interp[j + offset].count;
		gf->interp[j + offset].Zstd += delta * (
		interp[x][y].Zstd += delta * (data_z-interp[x][y].Zstd_tmp);

		gf->interp[j + offset].Zstd += p[j].Zstd;
                gf->interp[j + offset].Zstd_tmp += p[j].Zstd_tmp;
		*/

                if (p[j].sum != -1) {
                    gf->interp[j + offset].Zidw += p[j].Zidw;
                    gf->interp[j + offset].sum += p[j].sum;
                } else {
                    gf->interp[j + offset].Zidw = p[j].Zidw;
                    gf->interp[j + offset].sum = p[j].sum;
                }
            }

            if(p != NULL) {
                free(p);
                p = NULL;
            }

            gf->unmap();
            gf = NULL;
            openFile = -1;

        } else {
            cerr << "OutCoreInterp::finish() gf->map() error" << endl;
            return -1;
        }
        //////////////////////////////////////////////////////////////
    }

    for(i = numFiles -1; i > 0; i--)
    {
        //////////////////////////////////////////////////////////////
        // read the downside overlap

        if((gf = gridMap[i]->getGridFile()) == NULL)
        {
            cerr << "GridFile is NULL" << endl;
            return -1;
        }

        if(gf->map() != -1)
        {
            openFile = i;
            len_y = 2 * (gridMap[i]->getLowerBound() - gridMap[i]->getOverlapLowerBound());

            if((p = (GridPoint *)malloc(sizeof(GridPoint) * len_y * GRID_SIZE_X)) == NULL)
            {
                cerr << "OutCoreInterp::finish() malloc error" << endl;
                return -1;
            }

            memcpy(p, &(gf->interp[0]), len_y * sizeof(GridPoint) * GRID_SIZE_X);

            //finalize();

            gf->unmap();
            gf = NULL;
            openFile = -1;
        } else {
            cerr << "OutCoreInterp::finish gf->map() error" << endl;
            return -1;
        }
        //////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////
        // update (i-1)th component
        if((gf = gridMap[i-1]->getGridFile()) == NULL)
        {
            cerr << "GridFile is NULL" << endl;
            return -1;
        }

        if(gf->map() != -1)
        {
            offset = (gridMap[i-1]->getOverlapUpperBound() - gridMap[i-1]->getOverlapLowerBound() - len_y) * GRID_SIZE_X;
            openFile = i - 1;

            for(j = 0; j < len_y * GRID_SIZE_X; j++)
            {
                // Sriram - the overlap already contains the correct values
                gf->interp[j + offset].Zmin = p[j].Zmin;
                gf->interp[j + offset].Zmax = p[j].Zmax;
                gf->interp[j + offset].Zmean = p[j].Zmean;
                gf->interp[j + offset].count = p[j].count;
                gf->interp[j + offset].Zidw = p[j].Zidw;
                gf->interp[j + offset].sum = p[j].sum;
		//gf->interp[j + offset].Zstd = p[j].Zstd;
		//gf->interp[j + offset].Zstd_tmp = p[j].Zstd_tmp;
            }

            //if(i - 1 == 0)
            //finalize();

            if(p != NULL) {
                free(p);
                p = NULL;
            }

            gf->unmap();
            gf = NULL;
            openFile = -1;
        }
        //////////////////////////////////////////////////////////////
    }

    for(i = 0; i < numFiles; i++)
    {
        gridMap[i]->getGridFile()->map();
        openFile = i;
        finalize();
        gridMap[i]->getGridFile()->unmap();
        openFile = -1;
    }



    t0 = clock();
    //t0 = times(&tbuf);

    // merge pieces into one file
    if(outputFile(outputName, outputFormat, outputType, adfGeoTransform, wkt) < 0)
    {
        cerr << "OutCoreInterp::finish outputFile error" << endl;
        return -1;
    }

    t1 = clock();
    //t1 = times(&tbuf);
    cerr << "Output Execution time: " << (double)(t1 - t0)/CLOCKS_PER_SEC << std::endl;

    return 0;
}