#include "FEDataStructures.h" #include #include Grid::Grid() {} void Grid::Initialize(const unsigned int numPoints[3], const double spacing[3] ) { if(numPoints[0] == 0 || numPoints[1] == 0 || numPoints[2] == 0) { std::cerr << "Must have a non-zero amount of points in each direction.\n"; } // in parallel, we do a simple partitioning in the x-direction. int mpiSize = 1; int mpiRank = 0; MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank); MPI_Comm_size(MPI_COMM_WORLD, &mpiSize); unsigned int startXPoint = mpiRank*numPoints[0]/mpiSize; unsigned int endXPoint = (mpiRank+1)*numPoints[0]/mpiSize; if(mpiSize != mpiRank+1) { endXPoint++; } // create the points -- slowest in the x and fastest in the z directions double coord[3] = {0,0,0}; for(unsigned int i=startXPoint;iPoints)); } } } // create the hex cells unsigned int cellPoints[8]; unsigned int numXPoints = endXPoint - startXPoint; for(unsigned int i=0;iCells)); } } } } size_t Grid::GetNumberOfPoints() { return this->Points.size()/3; } size_t Grid::GetNumberOfCells() { return this->Cells.size()/8; } double* Grid::GetPointsArray() { if(this->Points.empty()) { return NULL; } return &(this->Points[0]); } double* Grid::GetPoint(size_t pointId) { if(pointId >= this->Points.size()) { return NULL; } return &(this->Points[pointId*3]); } unsigned int* Grid::GetCellPoints(size_t cellId) { if(cellId >= this->Cells.size()) { return NULL; } return &(this->Cells[cellId*8]); } Attributes::Attributes() { this->GridPtr = NULL; } void Attributes::Initialize(Grid* grid) { this->GridPtr = grid; } void Attributes::UpdateFields(double time) { size_t numPoints = this->GridPtr->GetNumberOfPoints(); this->Velocity.resize(numPoints*3); for(size_t pt=0;ptGridPtr->GetPoint(pt); this->Velocity[pt] = coord[1]*time; //this->Velocity[pt] = time; } std::fill(this->Velocity.begin()+numPoints, this->Velocity.end(), 0.); size_t numCells = this->GridPtr->GetNumberOfCells(); this->Pressure.resize(numCells); std::fill(this->Pressure.begin(), this->Pressure.end(), 1.); } double* Attributes::GetVelocityArray() { if(this->Velocity.empty()) { return NULL; } return &this->Velocity[0]; } float* Attributes::GetPressureArray() { if(this->Pressure.empty()) { return NULL; } return &this->Pressure[0]; }