void FireModule::fireSpread_ok(const FireModule::SIgnition &ign) { auto grid = Model::instance()->landscape()->grid(); Point index = grid.indexAt(PointF(ign.x, ign.y)); // clear the spread flag for all cells std::for_each(mGrid.begin(), mGrid.end(), [](SFireCell &c) { c.spread=0; }); mGrid[index].spread = 1; int max_ha = static_cast(ign.max_size / 10000); int n_ha = 0; int n_highseverity_ha = 0; int ixmin=index.x() - 1, ixmax = index.x() + 1, iymin = index.y() - 1, iymax = index.y() + 1; int ixmin2, ixmax2, iymin2, iymax2; int n_round, n_rounds = 1; while (n_ha <= max_ha) { n_round=0; for (int iy=iymin; iy<=iymax; ++iy) for (int ix=ixmin; ix<=ixmax; ++ix) { if (mGrid(ix, iy).spread == 1) { if (burnCell(ix, iy, &n_highseverity_ha)) { // the cell is burning and can spread if (mGrid.isIndexValid(ix-1, iy)) { mGrid[ix-1, iy].spread = 1; ixmin2 = std::min(ixmin, ix-1); } if (mGrid.isIndexValid(ix+1, iy)) { mGrid[ix+1, iy].spread = 1; ixmax2 = std::max(ixmax, ix+1); } /* It works fine if the following statements are commented out */ /*if (mGrid.isIndexValid(ix, iy-1)) { mGrid[ix, iy-1].spread = 1; iymin2 = std::min(iymin, iy-1); } if (mGrid.isIndexValid(ix, iy+1)) { mGrid[ix, iy+1].spread = 1; iymax2 = std::max(iymax, iy+1); } */ n_ha++; n_round++; } } } if (n_round == 0) break; n_rounds++; ixmin = ixmin2; ixmax = ixmax2; iymin = iymin2; iymax = iymax2; } // end while lg->info("FireEvent finished. total burned (ha): {}, high severity (ha): {}, max-fire-size (ha): {}", n_ha, n_highseverity_ha, max_ha) } void FireModule::fireSpread_not_ok(const FireModule::SIgnition &ign) { auto grid = Model::instance()->landscape()->grid(); Point index = grid.indexAt(PointF(ign.x, ign.y)); // clear the spread flag for all cells std::for_each(mGrid.begin(), mGrid.end(), [](SFireCell &c) { c.spread=0; }); mGrid[index].spread = 1; int max_ha = static_cast(ign.max_size / 10000); int n_ha = 0; int n_highseverity_ha = 0; int ixmin=index.x() - 1, ixmax = index.x() + 1, iymin = index.y() - 1, iymax = index.y() + 1; int ixmin2, ixmax2, iymin2, iymax2; int n_round, n_rounds = 1; while (n_ha <= max_ha) { n_round=0; for (int iy=iymin; iy<=iymax; ++iy) for (int ix=ixmin; ix<=ixmax; ++ix) { if (mGrid(ix, iy).spread == 1) { if (burnCell(ix, iy, &n_highseverity_ha)) { // the cell is burning and can spread if (mGrid.isIndexValid(ix-1, iy)) { mGrid[ix-1, iy].spread = 1; ixmin2 = std::min(ixmin, ix-1); } if (mGrid.isIndexValid(ix+1, iy)) { mGrid[ix+1, iy].spread = 1; ixmax2 = std::max(ixmax, ix+1); } if (mGrid.isIndexValid(ix, iy-1)) { mGrid[ix, iy-1].spread = 1; iymin2 = std::min(iymin, iy-1); } if (mGrid.isIndexValid(ix, iy+1)) { mGrid[ix, iy+1].spread = 1; iymax2 = std::max(iymax, iy+1); } /* ************************* * Indentation broken from here: try auto-indentation or adding a newline ******************************/ n_ha++; n_round++; } } } if (n_round == 0) break; n_rounds++; ixmin = ixmin2; ixmax = ixmax2; iymin = iymin2; iymax = iymax2; } // end while lg->info("FireEvent finished. total burned (ha): {}, high severity (ha): {}, max-fire-size (ha): {}", n_ha, n_highseverity_ha, max_ha) }