int main(int argc, char *argv[])
{
    int i, j, numSteps, startRow, startCol, endRow, endCol;
    double initialTemp;

    /* Initialization step */
    std::vector< std::vector<double> > currGrid(NROWS, std::vector<double>(NCOLS));
    std::vector< std::vector<double> > nextGrid(NROWS, std::vector<double>(NCOLS));
    /* Initial conditions */
    initialTemp = 100;
    currGrid[0].assign(NCOLS, initialTemp);
    currGrid[NROWS-1].assign(NCOLS, initialTemp);
    nextGrid[0].assign(NCOLS, initialTemp);
    nextGrid[NROWS-1].assign(NCOLS, initialTemp);  


    printGrid(currGrid);

    numSteps = 3;
    startRow = 1;
    startCol = 0;
    endRow = NROWS-1 ;
    endCol = NCOLS ;

    for(i = 0;i < numSteps;i++)
    {
        std::cout << "------------------Step " << i << "-----------------------" << std::endl;
        diffuse(currGrid, nextGrid, startRow, startCol, endRow, endCol, i);

    }


    return 0;
}
void  PFO_VariableArrayGridLinesGL :: DrawPlotObject()
{
    if (!InitDrawObject())
        return;

    Limit3D currLimits = GetCurrentViewLimits();
    OGL2DBase& currPlot = static_cast<OGL2DBase&>(*objectBase);

    PC_GridLine currGrid(currPlot, arrayIsX);

    GL_Line::SetLineProperties(gridLineSpec);


    for (int i = 0; i < variableArrayDC->Size(); i++)
    {
        double varVal = (*variableArrayDC)[i].GetValue();
        if (!currGrid.CreateGridLine(varVal, currLimits))
            continue;

        currGrid.SetLabelPos(labelFormat.labelPosition / 100.0);
        currGrid.AdjustForAxes();

        char label[80];
        bool doLabel;
        switch (labelFormat.labelType) {
            case PSC_GridLineLabelFormat::ltNone: {
                doLabel = false;
                break;
            }
            case PSC_GridLineLabelFormat::ltText : {
                CopyString(label, (*variableArrayDC)[i].GetID(), 80);
                doLabel = IsNotNull(label);
                break;
            }
            case PSC_GridLineLabelFormat::ltValue : {
                valueFormat.RealToString(varVal, label, 80);
                doLabel = true;
                break;
            }
        }

        bool drawFullLine = true;
        if (doLabel)
        {
            currGrid.OffsetLabelPos(labelFont, labelFormat.labelOffset, labelFormat.halign, labelFormat.valign);

            if (labelFormat.blankLabel)
            {
                drawFullLine = false;
                currGrid.DrawBlankedLine(labelFont, label, labelFormat.halign, labelFormat.valign);
            }

            currGrid.PrintUnclippedLabel(labelFont, label, labelFormat.halign, labelFormat.valign);
        }

        if (drawFullLine)
            currGrid.DrawGridLine();

    }

    CloseDrawObject();
}