void SolverInterfaceTestRemote:: testGeometryMode() { preciceTrace("testGeometryMode()"); using namespace tarch::la; using utils::DynVector; for (int dim=2; dim <= 3; dim++){ std::string configFilename; if (dim == 2){ configFilename = _pathToTests + "geomode-2D.xml"; } else { configFilename = _pathToTests + "geomode-3D.xml"; } int rank = utils::Parallel::getProcessRank(); if (rank == 0){ SolverInterface interface("TestAccessor", rank, 2); configureSolverInterface(configFilename, interface); validateEquals(interface.getDimensions(), dim); int meshIDScalar = interface.getMeshID ( "AccessorMeshScalar" ); int meshIDVector = interface.getMeshID ( "AccessorMeshVector" ); DynVector pos(dim, 0.0); int posIndex1 = interface.setMeshVertex ( meshIDScalar, raw(pos) ); assign(pos) = 1.0; int posIndex2 = interface.setMeshVertex ( meshIDScalar, raw(pos) ); assign(pos) = 0.0; int posIndex3 = interface.setMeshVertex ( meshIDVector, raw(pos) ); interface.initialize(); interface.initializeData(); // is skipped due to geometry mode std::set<int> ids = interface.getMeshIDs(); typedef query::tests::GeometryTestScenarios GeoTests; GeoTests geoTests; // Test inquireClosestMesh() const GeoTests::PointQueryScenario& pointScen = geoTests.pointQueryScenario(dim); std::list<DynVector>::const_iterator coordIter = pointScen.queryCoords.begin(); std::list<double>::const_iterator distIter = pointScen.validDistances.begin(); std::list<DynVector>::const_iterator distVectorIter = pointScen.validDistanceVectors.begin(); DynVector distanceVec(dim); while (coordIter != pointScen.queryCoords.end()){ ClosestMesh closest = interface.inquireClosestMesh(raw(*coordIter), ids); for(int i=0; i<dim; i++) distanceVec[i] = closest.distanceVector()[i]; validate(equals(*distVectorIter, distanceVec)); validate(equals(*distIter, closest.distance())); coordIter++; distIter++; distVectorIter++; } // Test inquirePosition() const GeoTests::PositionQueryScenario& posScen = geoTests.positionQueryScenario(dim); coordIter = posScen.queryCoords.begin(); std::list<int>::const_iterator posIter = posScen.validPositions.begin(); while ( coordIter != posScen.queryCoords.end() ){ int position = interface.inquirePosition ( raw(*coordIter), ids ); validateEquals ( position, *posIter ); coordIter ++; posIter ++; } // Test inquireVoxelPosition() const GeoTests::VoxelQueryScenario& voxelScen = geoTests.voxelQueryScenario(dim); std::list<DynVector>::const_iterator centerIter = voxelScen.queryCenters.begin(); std::list<DynVector>::const_iterator hIter = voxelScen.queryHalflengths.begin(); std::list<bool>::const_iterator includeBoundsIter = voxelScen.includeBoundaries.begin(); posIter = voxelScen.validPositions.begin(); while ( centerIter != voxelScen.queryCenters.end() ){ VoxelPosition pos = interface.inquireVoxelPosition ( raw(*centerIter), raw(*hIter), *includeBoundsIter, ids ); validateEquals ( pos.position(), *posIter ); centerIter ++; hIter ++; includeBoundsIter ++; posIter ++; } // Test write data int dataID = interface.getDataID ( "ScalarData", meshIDScalar ); double value = 1.0; interface.writeScalarData ( dataID, posIndex1, value ); value = 2.0; interface.writeScalarData ( dataID, posIndex2, value ); // Test read data (not really good test...) dataID = interface.getDataID ( "VectorData", meshIDVector ); DynVector readValue(dim, 2.0); interface.readVectorData ( dataID, posIndex3, raw(readValue) ); validate ( equals(readValue, DynVector(dim,0.0)) ); // Test exporting mesh interface.exportMesh ( "remote" ); interface.advance(1.0); interface.finalize(); } else { assertion1 ( rank == 1, rank ); bool isServer = true; impl::SolverInterfaceImpl server ( "TestAccessor", rank, 2, isServer ); // Perform manual configuration without overwritting logging config mesh::Mesh::resetGeometryIDsGlobally(); mesh::Data::resetDataCount(); impl::Participant::resetParticipantCount(); config::Configuration config; utils::configure(config.getXMLTag(), configFilename); server.configure(config.getSolverInterfaceConfiguration()); validateEquals(server.getDimensions(), dim); server.runServer(); } } }