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();
    }
  }
}