📄 simulatevariablewind.cpp
字号:
dWindDir = 360. - getWindDirection(x, y, m_pTimeGrid->asFloat(x,y));
Fire_SpreadNoWindNoSlope(m_Catalog, modelNumber, moisture);
Fire_SpreadWindSlopeMax(m_Catalog, modelNumber, dWindSpd,
dWindDir, tan(m_pSlopeGrid->asFloat(x,y)),
m_pAspectGrid->asFloat(x,y, true));
for (i = -2; i < 3 ; i++){
for (j = -2; j < 3; j++){
if (i!= 0 || j!=0){
x2 = x + i;
y2 = y + j;
if (m_pTimeGrid->is_InGrid(x2,y2,false)){
fAz = getAzimuth(i,j);
Fire_SpreadAtAzimuth(m_Catalog, modelNumber, fAz, FIRE_BYRAMS);
dSpreadRate = Fuel_SpreadAny(m_Catalog, modelNumber); // in ft/min (awkward...)
dSpreadRate *= FTMIN2MMIN; //a bit better...
if (dSpreadRate > Smidgen){
fDist = sqrt(pow(i,2.) + pow(j,2.)) * m_pTimeGrid->Get_Cellsize();
dSpreadTime = fDist / dSpreadRate;
dIgnTime = m_pTimeGrid->asDouble(x,y) + dSpreadTime;
if (dIgnTime < fTimeLimit){
if (m_pTimeGrid->asDouble(x2,y2) == 0.0
|| m_pTimeGrid->asDouble(x2, y2)>dIgnTime){
m_pTimeGrid->Set_Value(x2, y2, dIgnTime);
m_AdjPoints.Add(x2,y2);
Fire_FlameScorch(m_Catalog, modelNumber, FIRE_FLAME);
m_pFlameGrid->Set_Value(x2, y2, Fuel_FlameLength(m_Catalog, modelNumber) * FT2M);
m_pIntensityGrid->Set_Value(x2, y2, Fuel_ByramsIntensity(m_Catalog, modelNumber)
* BTU2KCAL / FT2M );
m_pReactionIntensityGrid->Set_Value(x2, y2, Fuel_RxIntensity(m_Catalog, modelNumber));
m_pHeatPerUnitAreaGrid->Set_Value(x2, y2, Fuel_HeatPerUnitArea(m_Catalog, modelNumber));
m_pEffectiveWindGrid->Set_Value(x2,y2, Fuel_EffectiveWind(m_Catalog, modelNumber));
}//if
}//if
}//if
}//if
}//if
}//for
}//for
}//if
}//for
m_CentralPoints.Clear();
for (int i=0; i<m_AdjPoints.Get_Count(); i++){
x= m_AdjPoints.Get_X(i);
y = m_AdjPoints.Get_Y(i);
m_CentralPoints.Add(x, y);
iBurntCells++;
}//for
m_AdjPoints.Clear();
if (fTimeLimit == NO_TIME_LIMIT){
Process_Get_Okay(true);
}//if
}//while
return iBurntCells;
}//method
float CSimulateVariableWind::getWindSpeed(int iX,
int iY,
float fTime /*in mins*/){
if (fTime <= 0){
return m_pWindSpdGrids[0]->asFloat(iX,iY);
}//if
if (fTime >= (m_iWindSpdGrids - 1) * m_fInterval){
return m_pWindSpdGrids[m_iWindSpdGrids - 1]->asFloat(iX,iY);
}//if
float fClass = fTime / ((m_iWindSpdGrids - 1) * m_fInterval);
int iClass1 = (int)floor(fClass);
int iClass2 = (int)ceil(fClass);
float fValue1 = m_pWindSpdGrids[iClass1]->asFloat(iX,iY);
float fValue2 = m_pWindSpdGrids[iClass2]->asFloat(iX,iY);
float fSpeed = fValue1 + (fValue2 - fValue1) * (fClass - iClass1);
return fSpeed;
}//
float CSimulateVariableWind::getWindDirection(int iX,
int iY,
float fTime /*in mins*/){
if (fTime <= 0){
return m_pWindDirGrids[0]->asFloat(iX,iY);
}//if
if (fTime >= (m_iWindDirGrids - 1) * m_fInterval){
return m_pWindDirGrids[m_iWindDirGrids - 1]->asFloat(iX,iY);
}//if
float fClass = fTime / ((m_iWindDirGrids - 1) * m_fInterval);
int iClass1 = (int)floor(fClass);
int iClass2 = (int)ceil(fClass);
float fValue1 = m_pWindDirGrids[iClass1]->asFloat(iX,iY);
if (fValue1 > 180){
fValue1 = - (fValue1 - 180.);
}//if
float fValue2 = m_pWindDirGrids[iClass2]->asFloat(iX,iY);
if (fValue2 > 180){
fValue2 = - (fValue2 - 180.);
}//if
float fDir = fValue1 + (fValue2 - fValue1) * (fClass - iClass1);
if (fDir < 0){
fDir += 360;
}//if
return fDir;
}//
void CSimulateVariableWind::CreateReport(){
CSG_String sReportFile;
std::ofstream file;
int i;
if (Parameters("REPORTFILE")->asString() != NULL){
sReportFile = Parameters("REPORTFILE")->asString();
CalculateReportParameters();
file.open(sReportFile.c_str());
char cDate[81];
time_t curTime;
tm * timeinfo;
time(&curTime);
timeinfo = gmtime(&curTime);
// std::locale spanish("esp");
// std::locale::global(spanish);
strftime(cDate, 80, "%#x", timeinfo);
file << "\t\t\t SIMULACI覰 realizada el ";
file << cDate;
file << "\n\t\t ==============================================================================";
file << "\n\n\t Par醡etros de entrada\n";
file << "\t --------------------------------\n\n";
file << "\t\t Modelos de combustible (por area) \n: ";
for (i = 0; i < 12; i++){
if (m_pAreaByFuelModel[i]){
file << "\t\t\t * " + SG_Get_String(i + 1, 0) + " : " + SG_Get_String(m_pAreaByFuelModel[i]) + " ha\n";
}//if
}//for
file << "\t\t Humedad de los combustibles muertos (1 h): " + SG_Get_String(m_fDeadFuelMoisture) + " %\n";
file << "\t\t Velocidad del viento a media llama: \n" ;
for(i = 0; i < m_iWindSpdGrids; i++){
file << "\t\t\t * " + SG_Get_String(i * m_fInterval, 0) + " min: "
+ SG_Get_String(m_pMeanWindSpd[i]) + "Km/h\n";
}//for
file << "\t\t Direcci髇 del vector viento, desde el norte geogr醘ico: \n";
for(i = 0; i < m_iWindDirGrids; i++){
file << "\t\t\t * " + SG_Get_String(i * m_fInterval, 0) + " min: "
+ SG_Get_String(m_pMeanWindDir[i]) + "篭n";
}//for
file << "\t\t Pendiente del terreno media: " + SG_Get_String(m_fSlope) + " %\n";
file << "\t\t Orientaci髇 del terreno: " + SG_Get_String(m_fAspect) + "篭n";
file << "\t\t Foco de partida: X = " + SG_Get_String(Parameters("COORDX")->asDouble(), 0) + " / Y = "
+ SG_Get_String(Parameters("COORDY")->asDouble(), 0) + "\n";
file << "\t\t Tiempo de simulaci髇: 3.0 h";
file << "\n\n\t Resultado de la simulaci髇\n";
file << "\t --------------------------------\n\n";
file << "\t\t Velocidad de propagaci髇: " + SG_Get_String(m_fMeanSpeed) + " m/min\n";
file << "\t\t Calor por unidad de area: " + SG_Get_String(m_fHeatPerUnitArea) + " kJ/m^2\n"; //revisar unidades!!
file << "\t\t Intensidad de la l韓ea de fuego: " + SG_Get_String(m_fIntensity) + " kCal/m\n";
file << "\t\t Longitud de la llama: " + SG_Get_String(m_fFlameHeight) + " m\n";
file << "\t\t Intensidad de reacci髇: " + SG_Get_String(m_fReactionIntensity) + " kCal/m2\n";
file << "\t\t Velocidad efectiva del viento: " + SG_Get_String(m_fEffectiveWind / KMH2FTMIN) + " Km/h\n";
file << "\t\t Direcci髇 de m醲ima propagaci髇, desde el norte geogr醘ico: " + SG_Get_String(m_fMaxSpreadDir) + "篭n";
file << "\t\t Area: " + SG_Get_String(m_fArea / 10000) + " ha\n";
file << "\t\t Per韒etro: " + SG_Get_String(m_fPerimeter) + "m\n";
//Raz髇 Longitud/Ancho: 1.9
file << "\t\t Distancia de propagaci髇 hacia delante: " + SG_Get_String(m_fFrontDistance) + " m\n";
file << "\t\t Distancia de propagaci髇 hacia atr醩: " + SG_Get_String(m_fRearDistance) + " m\n";
file.close();
}//if
}//method
void CSimulateVariableWind::CalculateReportParameters(){
int i;
int x,y;
int iFuelModel;
int iX, iY, iXOrig, iYOrig;
int iCells = 0;
int iOffsetX[] = {0, 1, 1, 1, 0, -1, -1, -1};
int iOffsetY[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int iDirection;
int iDir = 1;
int iNewDirection[] = {5, 6, 7, 0, 1, 2, 3, 4};
float fAspect;
float fDist;
m_fFrontDistance = -1;
m_fRearDistance = 999999999999999999.f;
m_fSlope = m_fAspect = m_fFlameHeight = m_fIntensity = m_fMeanSpeed = 0;
m_fPerimeter = m_fArea = 0;
m_fDeadFuelMoisture = m_fHeatPerUnitArea = m_fEffectiveWind = m_fReactionIntensity = 0;
m_pMeanWindDir = new float[m_iWindDirGrids];
for (i = 0; i < m_iWindDirGrids; i++){
m_pMeanWindDir[i] = 0;
}//for
m_pMeanWindSpd = new float[m_iWindSpdGrids];
for (i = 0; i < m_iWindSpdGrids; i++){
m_pMeanWindSpd[i] = 0;
}//for
m_pAreaByFuelModel = new float[12];
for (i = 0; i < 12; i++){
m_pAreaByFuelModel[i] = 0;
}//for
for(y=0; y<Get_NY(); y++){
for(x=0; x<Get_NX(); x++){
if (!m_pTimeGrid->is_NoData(x,y)){
m_fArea += m_pTimeGrid->Get_Cellarea();
if (!m_pFuelGrid->is_NoData(x,y)){
iFuelModel = m_pFuelGrid->asInt(x,y) - 1;
m_pAreaByFuelModel[iFuelModel] += m_pFuelGrid->Get_Cellarea();
}//if
m_fSlope += m_pSlopeGrid->asFloat(x,y, true);
if (!m_pAspectGrid->is_NoData(x,y)){
fAspect = m_pAspectGrid->asFloat(x,y, true);
if (fAspect > 180){
fAspect = 360 - fAspect;
}//if
m_fAspect += fAspect;
}//if
for (i = 0; i < m_iWindDirGrids; i++){
fAspect = m_pWindDirGrids[i]->asFloat(x,y);
if (fAspect > 180){
fAspect = 360 - fAspect;
}//if
m_pMeanWindDir[i] += fAspect;
}//for
for (i = 0; i < m_iWindSpdGrids; i++){
m_pMeanWindSpd[i] += m_pWindSpdGrids[i]->asFloat(x,y);
}//for
m_fFlameHeight += m_pFlameGrid->asFloat(x,y);
m_fIntensity += m_pIntensityGrid->asFloat(x,y);
if (m_pM1Grid->asFloat(x,y) > 0){
m_fDeadFuelMoisture += m_pM1Grid->asFloat(x,y);
}//if
m_fHeatPerUnitArea += m_pHeatPerUnitAreaGrid->asFloat(x,y);
m_fEffectiveWind += m_pEffectiveWindGrid->asFloat(x,y);
m_fReactionIntensity += m_pReactionIntensityGrid->asFloat(x,y);
iCells++;
}//if
}//for
}//for
m_fSlope /= (float)iCells;
m_fAspect /= (float)iCells;
m_fFlameHeight /= (float)iCells;
m_fIntensity /= (float)iCells;
m_fDeadFuelMoisture /= (float)iCells;
m_fHeatPerUnitArea /= (float)iCells;
m_fHeatPerUnitArea *= (BTU2KCAL * FT2M * FT2M);
m_fEffectiveWind /= (float)iCells;
m_fReactionIntensity /= (float)iCells;
for (i = 0; i < m_iWindSpdGrids; i++){
m_pMeanWindSpd[i] /= (float)iCells;
}//for
for (i = 0; i < m_iWindDirGrids; i++){
m_pMeanWindDir[i] /= (float)iCells;
}//for
for (x = 0; x < Get_NX(); x++) {
for (y = 0; y < Get_NY(); y++) {
if (!m_pTimeGrid->is_NoData(x,y)) {
iX = x;
iY = y;
goto out;
}// if
}// for
}// for
out:
iCells = 0;
iXOrig = iX;
iYOrig = iY;
iDirection = 1;
do {
if (iDirection > 7) {
iDirection = iDirection % 8;
}//if
for (i = iDirection; i < iDirection + 8; i++) {
if (i > 7) {
iDir = i % 8;
}//if
else {
iDir = i;
}//else
if (!m_pTimeGrid->is_NoData(iX + iOffsetX[iDir],iY + iOffsetY[iDir])) {
iX = iX + iOffsetX[iDir];
iY = iY + iOffsetY[iDir];
iDirection = iNewDirection[iDir];
break;
}// if
}// for
m_fPerimeter += sqrt(pow(iOffsetX[iDir],2.) + pow(iOffsetY[iDir],2.));
fDist = sqrt(pow(iX - m_iGridX, 2.) + pow(m_iGridY - iY,2.)) * m_pTimeGrid->Get_Cellsize();
if (fDist > m_fFrontDistance){
m_fFrontDistance = fDist;
m_fMaxSpreadDir = getAzimuth(iX - m_iGridX, iY - m_iGridY);
m_fMaxSpreadDir = 360 - m_fMaxSpreadDir;
}//if
if (fDist < m_fRearDistance){
m_fRearDistance = fDist;
}//if
m_fMeanSpeed += (fDist / m_fTimeLimit);
iCells++;
}while ((iY != iYOrig) || (iX != iXOrig));
m_fMeanSpeed /= (float)iCells;
m_fPerimeter *= m_pTimeGrid->Get_Cellsize();
}//method
float CSimulateVariableWind::getAzimuth(float x, float y){
float fAz;
fAz = atan(fabs(y)/fabs(x)) * M_RAD_TO_DEG;
if (y < 0){
if (x < 0){
fAz = 270 - fAz;
}//if
else if (x == 0){
fAz = 180;
}//else if
else if (x > 0){
fAz = 90 + fAz;
}//else if
}//if
else{
if (x < 0){
fAz = 270 + fAz;
}//if
else if (x == 0){
fAz = 0;
}//else if
else if (x > 0){
fAz = 90 - fAz;
}//else if
}//if
return fAz;
}//method
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -