예제 #1
0
void gcm::Geo2MeshLoader::loadMesh(TetrMeshSecondOrder* mesh, GCMDispatcher* dispatcher, string fileName, float tetrSize)
{
    if (!isMshFileCreated(fileName))
        createMshFile(fileName, tetrSize);

    //IBody* body = mesh->getBody();
    Engine& engine = Engine::getInstance();
    if( engine.getRank() == 0 )
    {
        LOG_DEBUG("Worker 0 started generating second order mesh from first order msh file");
        TetrMeshFirstOrder* foMesh = new TetrMeshFirstOrder();
//        foMesh->setBody(body);

        TetrMeshSecondOrder* soMesh = new TetrMeshSecondOrder();
//        soMesh->setBody(body);

        int sd, nn;
        AABB scene;
        GCMDispatcher* myDispatcher = new DummyDispatcher();
        myDispatcher->setEngine(&Engine::getInstance());
        preLoadMesh(&scene, sd, nn, fileName, tetrSize);
        myDispatcher->prepare(1, &scene);

        MshTetrFileReader* reader = new MshTetrFileReader();
        reader->readFile(getMshFileName(fileName), foMesh, myDispatcher, engine.getRank(), true);
        soMesh->copyMesh(foMesh);
        soMesh->preProcess();

        VTK2SnapshotWriter* sw = new VTK2SnapshotWriter();
        sw->setFileName(getVtkFileName(fileName));
        sw->dump(soMesh, -1);

        delete sw;
        delete reader;
        delete foMesh;
        delete soMesh;
        LOG_DEBUG("Worker 0 completed generating second order mesh");
    }

    MPI::COMM_WORLD.Barrier();

    LOG_DEBUG("Starting reading mesh");
    Vtu2TetrFileReader* reader = new Vtu2TetrFileReader();
    reader->readFile(getVtkFileName(fileName), mesh, dispatcher, engine.getRank());
    delete reader;

    mesh->preProcess();
}
예제 #2
0
void Ani3D2MeshLoader::loadMesh(TetrMeshSecondOrder* mesh, GCMDispatcher* dispatcher, const string& fileName)
{
    auto body = mesh->getBody();
    auto& engine = Engine::getInstance();
    if( engine.getRank() == 0 )
    {
        LOG_DEBUG("Worker 0 started generating second order mesh");
        TetrMeshFirstOrder* foMesh = new TetrMeshFirstOrder();
        foMesh->setBody(body);

        TetrMeshSecondOrder* soMesh = new TetrMeshSecondOrder();
        soMesh->setBody(body);

        int sd, nn;
        AABB scene;
        GCMDispatcher* myDispatcher = new DummyDispatcher();
        preLoadMesh(&scene, sd, nn, fileName);
        myDispatcher->prepare(1, &scene);

        Ani3DTetrFileReader* reader = new Ani3DTetrFileReader();
        reader->readFile(fileName,
                            foMesh, myDispatcher, engine.getRank(), true);
        soMesh->copyMesh(foMesh);
        soMesh->preProcess();

        VTK2SnapshotWriter* sw = new VTK2SnapshotWriter();
        // FIXME are we really about to overwrite this file?
        sw->dump(soMesh, -1, getVtkFileName(fileName));

        delete sw;
        delete reader;
        delete foMesh;
        delete soMesh;
        LOG_DEBUG("Worker 0 completed generating second order mesh");
    }

    MPI::COMM_WORLD.Barrier();

    LOG_DEBUG("Starting reading mesh");
    Vtu2TetrFileReader* reader = new Vtu2TetrFileReader();
    reader->readFile(getVtkFileName(fileName), mesh, dispatcher, engine.getRank());
    delete reader;
    LOG_DEBUG("Deleting generated file: " << getVtkFileName(fileName));
    remove( getVtkFileName(fileName).c_str() );


    mesh->preProcess();
}
예제 #3
0
void DataBus::syncMissedNodes(Mesh* _mesh, float tau)
{
    if( numberOfWorkers == 1 )
        return;

    bool transferRequired = false;

    AABB **reqZones = new AABB*[numberOfWorkers];
    AABB *reqZones_data = new AABB[numberOfWorkers*numberOfWorkers];
    for ( int i = 0; i < numberOfWorkers; ++i ) {
        reqZones[i] = reqZones_data + (i*numberOfWorkers);
    }
    auto& engine = Engine::getInstance();
    GCMDispatcher* dispatcher = engine.getDispatcher();

    // FIXME@avasyukov - workaround for SphProxyDispatcher
    // But we still need this
    if( dispatcher->getOutline(0) == NULL ) {
        THROW_BAD_METHOD("We can't do this because it will cause all MPI routines to freeze");
        return;
    }

    BARRIER("DataBus::syncMissedNodes#1");

    //Body* body = engine.getBodyById( engine.getDispatcher()->getMyBodyId() );
    //TetrMeshSecondOrder* mesh = (TetrMeshSecondOrder*)body->getMeshes();
    TetrMeshSecondOrder* mesh = (TetrMeshSecondOrder*) _mesh;
    AABB* areaOfInterest = &(mesh->areaOfInterest);
    if( (mesh->syncedArea).includes( areaOfInterest ) )
    {
        LOG_DEBUG("We need nothing");
    }
    else
    {
        LOG_DEBUG("Yes, we need additional nodes");
        for (int i = 0 ; i < numberOfWorkers; i++)
        {
            if( i != rank)
            {
                LOG_DEBUG("Our area of interest: " << *areaOfInterest << " Outline[" << i << "]: " << *(dispatcher->getOutline(i)));
                areaOfInterest->findIntersection(dispatcher->getOutline(i), &reqZones[rank][i]);
            }
        }
    }

    BARRIER("DataBus::syncMissedNodes#2");

    MPI::COMM_WORLD.Allgather(
        MPI_IN_PLACE,
        numberOfWorkers, MPI_OUTLINE,
        reqZones_data,
        numberOfWorkers, MPI_OUTLINE
    );

    BARRIER("DataBus::syncMissedNodes#3");

    vector<AABB> *_reqZones = new vector<AABB>[numberOfWorkers];
    for (int i = 0 ; i < numberOfWorkers; i++)
        for (int j = 0 ; j < numberOfWorkers; j++)
        {
            _reqZones[i].push_back(reqZones[i][j]);
            if( !isinf(reqZones[i][j].minX) )
            {
                transferRequired = true;
            }
        }

    if(transferRequired)
    {
        transferNodes(mesh, _reqZones);
        BARRIER("DataBus::syncMissedNodes#3");
        //LOG_DEBUG("Rebuilding data types");
        //createDynamicTypes();
        LOG_DEBUG("Processing mesh after the sync");
        // Overhead
        for( int z = 0; z < engine.getNumberOfBodies(); z++ )
        {
            TetrMeshSecondOrder* tmpMesh = (TetrMeshSecondOrder*) engine.getBody(z)->getMeshes();
            tmpMesh->preProcess();
            tmpMesh->checkTopology(tau);
        }
        //FIXME@avasyukov - rethink it
        for( int z = 0; z < 3; z++ )
        {
            (mesh->syncedArea).min_coords[z] = (mesh->areaOfInterest).min_coords[z] - EQUALITY_TOLERANCE;
            (mesh->syncedArea).max_coords[z] = (mesh->areaOfInterest).max_coords[z] + EQUALITY_TOLERANCE;
        }
    }

    for (int i = 0 ; i < numberOfWorkers; i++)
        _reqZones[i].clear();
    delete[] _reqZones;

    delete[] reqZones_data;
    delete[] reqZones;
}