Detailed Description
This is an example of how to use the WinProp API for multi-threaded outdoor propagation with OpenMP. The full example is distributed with the installation.
#include <stdio.h>
#include <string>
#include <iostream>
#ifdef _OPENMP
#include <omp.h>
#endif
#include "outdoor_propagation_openmp.h"
#ifndef API_DATA_FOLDER
#define API_DATA_FOLDER "../../api/winprop/data/"
#endif // !API_DATA_FOLDER
int main(int argc, char** argv)
{
TOPOGRAPHY TopographyData;
InterfaceTopoInit(&TopographyData);
InterfaceLoadTopoASC(&TopographyData, API_DATA_FOLDER "outdoor/Topo.asc");
URBAN_BUILDINGS BuildingData;
InterfaceBuildingsInit(&BuildingData);
InterfaceLoadBuildingsASCII(&BuildingData, API_DATA_FOLDER "outdoor/City.oda");
WinProp_Propagation_Results OutputResults;
WinProp_Structure_Init_Propagation_Results(&OutputResults);
sprintf(OutputResults.ResultPath, "%s", API_DATA_FOLDER "output/outdoor_propagation_openmp");
OutputResults.FieldStrength = 1;
OutputResults.PathLoss = 1;
OutputResults.StatusLOS = 1;
#ifdef _OPENMP
omp_set_num_threads(4);
#endif
#pragma omp parallel for schedule(dynamic,1)
for (int i = 0; i < 16; i++)
{
int Error = 0;
WinProp_ParaMain GeneralParameters;
WinProp_Structure_Init_ParameterMain(&GeneralParameters);
GeneralParameters.ScenarioMode = SCENARIOMODE_URBAN;
GeneralParameters.PredictionModelUrban = PREDMODEL_UDP;
GeneralParameters.UrbanLowerLeftX = 100.0;
GeneralParameters.UrbanLowerLeftY = 100.0;
GeneralParameters.UrbanUpperRightX = 2200.0;
GeneralParameters.UrbanUpperRightY = 3200.0;
GeneralParameters.RuralLowerLeftX = GeneralParameters.UrbanLowerLeftX;
GeneralParameters.RuralLowerLeftY = GeneralParameters.UrbanLowerLeftY;
GeneralParameters.RuralUpperRightX = GeneralParameters.UrbanUpperRightX;
GeneralParameters.RuralUpperRightY = GeneralParameters.UrbanUpperRightY;
double PredictionHeight = 1.5;
GeneralParameters.Resolution = 10.0;
GeneralParameters.NrLayers = 1;
GeneralParameters.PredictionHeights = &PredictionHeight;
GeneralParameters.BuildingsMode = BUILDINGSMODE_RAM;
GeneralParameters.Buildings = BuildingData;
GeneralParameters.TopographyMode = TOPOMODE_RAM;
GeneralParameters.Topography = TopographyData;
GeneralParameters.OutputResults = &OutputResults;
WinProp_Callback Callback;
WinProp_Structure_Init_Callback(&Callback);
Callback.Percentage = CallbackProgress;
Callback.Message = CallbackMessage;
Callback.Error = CallbackError;
WinProp_Antenna Antenna;
WinProp_Structure_Init_Antenna(&Antenna);
Antenna.Id = i + 1;
Antenna.SiteId = 1;
Antenna.Longitude_X = 1100.0;
Antenna.Latitude_Y = 2100.0;
Antenna.Height = 20.0;
Antenna.Power = 43.0;
Antenna.Frequency = 900.0 + 100. * i;
sprintf(Antenna.Name, "Antenna %i", i);
WinProp_Result Resultmatrix;
WinProp_RayMatrix RayMatrix;
WinProp_Structure_Init_Result(&Resultmatrix);
WinProp_Structure_Init_RayMatrix(&RayMatrix);
Error = OutdoorPlugIn_ComputePrediction(
&Antenna, &GeneralParameters, NULL, 0, NULL, NULL, NULL, NULL, &Callback, &Resultmatrix, &RayMatrix, NULL, NULL);
if (Error == 0)
{
char Filename[500];
sprintf(Filename, API_DATA_FOLDER "output/outdoor_propagation_openmp/Results Antenna %i.txt", i);
write_ascii(&Resultmatrix, Filename);
}
else
{
CallbackError(GeneralParameters.ErrorMessageMain, Error);
}
WinProp_FreeResult(&Resultmatrix);
WinProp_FreeRayMatrix(&RayMatrix);
}
InterfaceTopoFree(&TopographyData);
InterfaceBuildingsInit(&BuildingData);
return 0;
}
int _STD_CALL CallbackMessage(const char * Text)
{
if (Text == nullptr)
return 0;
std::cout << "\n" << Text;
return(0);
}
int _STD_CALL CallbackError(const char * Text, int Error)
{
if (Text == nullptr)
return 0;
std::cout << "\n";
#ifdef __LINUX
std::cout << "\033[31m" << "Error (" << Error << "): ";
#else
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
std::cout << "Error (" << Error << "): ";
#endif // __LINUX
std::cout << Text;
#ifdef __LINUX
std::cout << "\033[0m";
#else
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif // __LINUX
return 0;
}
int _STD_CALL CallbackProgress(int value, const char* text)
{
char Line[200];
sprintf(Line, "\n%d%% %s", value, text);
std::cout << Line;
return(0);
}
void write_ascii(const WinProp_Result* Resultmatrix, const char* Filename) {
FILE* OutputFile = fopen(Filename,"w");
if (OutputFile)
{
for (int x = 0; x < Resultmatrix->Columns; x++)
{
for (int y = 0; y < Resultmatrix->Lines; y++)
{
double Coordinate_X = Resultmatrix->LowerLeftX + ((double)x + 0.5) * Resultmatrix->Resolution;
double Coordinate_Y = Resultmatrix->LowerLeftY + ((double)y + 0.5) * Resultmatrix->Resolution;
if (Resultmatrix->Matrix[0][x][y] > -1000)
fprintf(OutputFile, "%.2f\t%.2f\t%.2f\n", Coordinate_X, Coordinate_Y, Resultmatrix->Matrix[0][x][y]);
}
}
fclose(OutputFile);
}
else
printf("\nCould not open the File: %s for writing.\n",Filename);
}