static void computeAndSendVertexArrays(GmshClient *client, bool compute=true) { for(unsigned int i = 0; i < PView::list.size(); i++){ PView *p = PView::list[i]; if(compute) p->fillVertexArrays(); PViewData *data = p->getData(); PViewOptions *opt = p->getOptions(); double min = data->getMin(), max = data->getMax(); if(opt->rangeType == PViewOptions::PerTimeStep){ min = data->getMin(opt->timeStep); max = data->getMax(opt->timeStep); } VertexArray *va[4] = {p->va_points, p->va_lines, p->va_triangles, p->va_vectors}; for(int type = 0; type < 4; type++){ if(va[type]){ int len; char *str = va[type]->toChar (p->getTag(), data->getName(), type + 1, min, max, data->getNumTimeSteps(), data->getTime(opt->timeStep), data->getBoundingBox(), len); client->SendMessage(GmshSocket::GMSH_VERTEX_ARRAY, len, str); delete [] str; } } } }
// This version sends VArrays using MPI static void computeAndSendVertexArrays() { // compute... for(unsigned int i = 0; i < PView::list.size(); i++) PView::list[i]->fillVertexArrays(); // ...and send int nbArrays = PView::list.size()* 4; MPI_Send(&nbArrays, 1, MPI_INT, 0, MPI_GMSH_DATA_READY, MPI_COMM_WORLD); for(unsigned int i = 0; i < PView::list.size(); i++){ PView *p = PView::list[i]; PViewData *data = p->getData(); PViewOptions *opt = p->getOptions(); double min = data->getMin(), max = data->getMax(); if(opt->rangeType == PViewOptions::PerTimeStep){ min = data->getMin(opt->timeStep); max = data->getMax(opt->timeStep); } VertexArray *va[4] = {p->va_points, p->va_lines, p->va_triangles, p->va_vectors}; for(int type = 0; type < 4; type++){ if(va[type]){ int len; char *str = va[type]->toChar (p->getTag(), data->getName(), type + 1, min, max, data->getNumTimeSteps(), data->getTime(opt->timeStep), data->getBoundingBox(), len); MPI_Send(&len, 1, MPI_INT, 0, MPI_GMSH_VARRAY_LEN, MPI_COMM_WORLD); MPI_Send(str, len, MPI_CHAR, 0, MPI_GMSH_VARRAY, MPI_COMM_WORLD); delete [] str; } } } }
// Merge the vertex arrays static void addToVertexArrays(int length, const char* bytes, int swap) { std::string name; int num, type, numSteps; double min, max, time, xmin, ymin, zmin, xmax, ymax, zmax; VertexArray::decodeHeader(length, bytes, swap, name, num, type, min, max, numSteps, time, xmin, ymin, zmin, xmax, ymax, zmax); PView *p = PView::list[num - 1]; PViewData *data = p->getData(); VertexArray *varrays[4] = {p->va_points, p->va_lines, p->va_triangles, p->va_vectors}; VertexArray *va = varrays[type - 1]; if (data->getMin() > min) data->setMin(min); if (data->getMax() < max) data->setMax(max); SBoundingBox3d bbox(xmin, ymin, zmin, xmax, ymax, zmax); SBoundingBox3d bb = data->getBoundingBox(); bb += bbox; data->setBoundingBox(bb); if (type == 4) type = 2; VertexArray* toAdd = new VertexArray(type, 100); toAdd->fromChar(length, bytes, swap); va->merge(toAdd); delete toAdd; }