Example #1
0
void Header::write()
{

    uint8_t n1 = 0;
    uint16_t n2 = 0;
    uint32_t n4 = 0;
    
    // Figure out how many points we already have.  
    // Figure out if we're in append mode.  If we are, we can't rewrite 
    // any of the VLRs including the Schema and SpatialReference ones.
    bool bAppendMode = false;

    // This test should only be true if we were opened in both 
    // std::ios::in *and* std::ios::out

    // Seek to the beginning
    m_ofs.seekp(0, ios::beg);
    ios::pos_type begin = m_ofs.tellp();

    // Seek to the end
    m_ofs.seekp(0, ios::end);
    ios::pos_type end = m_ofs.tellp();
    if ((begin != end) && (end != static_cast<ios::pos_type>(0))) {
        bAppendMode = true;
    }

    // If we are in append mode, we are not touching *any* VLRs. 
    if (bAppendMode) 
    {
        // Believe the header
        m_pointCount = m_header.GetPointRecordsCount();

        // Position to the beginning of the file to start writing the header
        m_ofs.seekp(0, ios::beg);
    } 
    else 
    {
        // Rewrite the georeference VLR entries if they exist
        m_header.DeleteVLRs("liblas", 2112);
        m_header.SetGeoreference();

        // If we have a custom schema, add the VLR and write it into the 
        // file.  
        if (m_header.GetSchema().IsCustom()) {
            
            // Wipe any schema-related VLRs we might have, as this is now out of date.
            m_header.DeleteVLRs("liblas", 7);
        
            VariableRecord v = m_header.GetSchema().GetVLR();
            std::cout <<  m_header.GetSchema()<< std::endl;
            m_header.AddVLR(v);
        }
    
        // add the laszip VLR, if needed
        if (m_header.Compressed())
        {
#ifdef HAVE_LASZIP
            m_header.DeleteVLRs("laszip encoded", 22204);
            ZipPoint zpd(m_header.GetDataFormatId(), m_header.GetVLRs());
            VariableRecord v;
            zpd.ConstructVLR(v);
            m_header.AddVLR(v);
#else
            throw configuration_error("LASzip compression support not enabled in this libLAS configuration.");
#endif
        }
        else
        {
            m_header.DeleteVLRs("laszip encoded", 22204);
        }
        
        int32_t existing_padding = m_header.GetDataOffset() - 
                                  (m_header.GetVLRBlockSize() + 
                                   m_header.GetHeaderSize());

        if (existing_padding < 0) 
        {
            int32_t d = abs(existing_padding);
            
            // If our required VLR space is larger than we have 
            // room for, we have no padding.  AddVLRs will take care 
            // of incrementing up the space it needs.
            if (static_cast<boost::int32_t>(m_header.GetVLRBlockSize()) > d)
            {
                m_header.SetHeaderPadding(0);
            } else {
                m_header.SetHeaderPadding(d - m_header.GetVLRBlockSize());
            }
        } else {
            // cast is safe, we've already checked for < 0
            if (static_cast<uint32_t>(existing_padding) >= m_header.GetHeaderPadding())
            {
                m_header.SetHeaderPadding(existing_padding);
            }
            else {
                m_header.SetHeaderPadding(m_header.GetHeaderPadding() + existing_padding);
            }

        }

        m_header.SetDataOffset( m_header.GetHeaderSize() + 
                                m_header.GetVLRBlockSize() + 
                                m_header.GetHeaderPadding());
    }

    
    // 1. File Signature
    std::string const filesig(m_header.GetFileSignature());
    assert(filesig.size() == 4);
    detail::write_n(m_ofs, filesig, 4);
    
    
    // 2. File SourceId / Reserved
    if (m_header.GetVersionMinor()  ==  0) {
        n4 = m_header.GetReserved();
        detail::write_n(m_ofs, n4, sizeof(n4));         
    } else if (m_header.GetVersionMinor()  >  0) {
        n2 = m_header.GetFileSourceId();
        detail::write_n(m_ofs, n2, sizeof(n2));                
        n2 = m_header.GetReserved();
        detail::write_n(m_ofs, n2, sizeof(n2));        
    } 

    // 3-6. GUID data
    boost::uint8_t d[16];
    boost::uuids::uuid u = m_header.GetProjectId();

    d[0] = u.data[3];
    d[1] = u.data[2];
    d[2] = u.data[1];
    d[3] = u.data[0];
    d[4] = u.data[5];
    d[5] = u.data[4];
    d[6] = u.data[7];
    d[7] = u.data[6];
    for (int i=8; i<16; i++)
        d[i] = u.data[i];
    
    detail::write_n(m_ofs, d, 16);
    
    // 7. Version major
    n1 = m_header.GetVersionMajor();
    assert(1 == n1);
    detail::write_n(m_ofs, n1, sizeof(n1));
    
    // 8. Version minor
    n1 = m_header.GetVersionMinor();
    detail::write_n(m_ofs, n1, sizeof(n1));

    // 9. System ID
    std::string sysid(m_header.GetSystemId(true));
    assert(sysid.size() == 32);
    detail::write_n(m_ofs, sysid, 32);
    
    // 10. Generating Software ID
    std::string softid(m_header.GetSoftwareId(true));
    assert(softid.size() == 32);
    detail::write_n(m_ofs, softid, 32);

    // 11. Flight Date Julian
    n2 = m_header.GetCreationDOY();
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 12. Year
    n2 = m_header.GetCreationYear();
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 13. Header Size
    n2 = m_header.GetHeaderSize();
    assert(227 <= n2);
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 14. Offset to data
    n4 = m_header.GetDataOffset();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 15. Number of variable length records
    n4 = m_header.GetRecordsCount();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 16. Point Data Format ID
    n1 = static_cast<uint8_t>(m_header.GetDataFormatId());
    uint8_t n1tmp = n1;
    if (m_header.Compressed()) // high bit set indicates laszip compression
        n1tmp |= 0x80;
    detail::write_n(m_ofs, n1tmp, sizeof(n1tmp));

    // 17. Point Data Record Length
    n2 = m_header.GetDataRecordLength();
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 18. Number of point records
    // This value is updated if necessary, see UpdateHeader function.
    n4 = m_header.GetPointRecordsCount();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 19. Number of points by return
    std::vector<uint32_t>::size_type const srbyr = 5;
    std::vector<uint32_t> const& vpbr = m_header.GetPointRecordsByReturnCount();
    // TODO: fix this for 1.3, which has srbyr = 7;  See detail/reader/header.cpp for more details
    // assert(vpbr.size() <= srbyr);
    uint32_t pbr[srbyr] = { 0 };
    std::copy(vpbr.begin(), vpbr.begin() + srbyr, pbr); // FIXME: currently, copies only 5 records, to be improved
    detail::write_n(m_ofs, pbr, sizeof(pbr));

    // 20-22. Scale factors
    detail::write_n(m_ofs, m_header.GetScaleX(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetScaleY(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetScaleZ(), sizeof(double));

    // 23-25. Offsets
    detail::write_n(m_ofs, m_header.GetOffsetX(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetOffsetY(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetOffsetZ(), sizeof(double));

    // 26-27. Max/Min X
    detail::write_n(m_ofs, m_header.GetMaxX(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetMinX(), sizeof(double));

    // 28-29. Max/Min Y
    detail::write_n(m_ofs, m_header.GetMaxY(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetMinY(), sizeof(double));

    // 30-31. Max/Min Z
    detail::write_n(m_ofs, m_header.GetMaxZ(), sizeof(double));
    detail::write_n(m_ofs, m_header.GetMinZ(), sizeof(double));

    if (!bAppendMode) 
    {
        WriteVLRs();

        // if we have padding, we should write it
        if (m_header.GetHeaderPadding() > 0) {
            m_ofs.seekp(m_header.GetHeaderSize() + m_header.GetVLRBlockSize(), std::ios::end);
            detail::write_n(m_ofs, "\0", m_header.GetHeaderPadding());
        }

        // Write the 1.0 pad signature if we need to.
        WriteLAS10PadSignature(); 
    }

    // If we already have points, we're going to put it at the end of the file.  
    // If we don't have any points,  we're going to leave it where it is.
    if (m_pointCount != 0)
    {
        m_ofs.seekp(0, std::ios::end);
    }
    else
    {
        m_ofs.seekp(m_header.GetDataOffset(), std::ios::beg);
    }
    
}
Example #2
0
void Header::write()
{

    uint8_t n1 = 0;
    uint16_t n2 = 0;
    uint32_t n4 = 0;


    // Figure out how many points we already have.  
    // Figure out if we're in append mode.  If we are, we can't rewrite 
    // any of the VLRs including the Schema and SpatialReference ones.
    bool bAppendMode = false;

    // This test should only be true if we were opened in both 
    // std::ios::in *and* std::ios::out

    // Seek to the beginning
    GetStream().seekp(0, ios::beg);
    ios::pos_type begin = GetStream().tellp();

    // Seek to the end
    GetStream().seekp(0, ios::end);
    ios::pos_type end = GetStream().tellp();
    if ((begin != end) && (end != static_cast<ios::pos_type>(0))) {
        bAppendMode = true;
    }

    // If we are in append mode, we are not touching *any* VLRs. 
    if (bAppendMode) 
    {
        // We're opened in append mode
        
        ios::off_type points = end - static_cast<ios::off_type>(m_header.GetDataOffset());
        ios::off_type count = points / static_cast<ios::off_type>(m_header.GetDataRecordLength());
        
        if (points < 0) {
            std::ostringstream oss;
            oss << "The header's data offset," << m_header.GetDataOffset() 
                <<", is much larger than the size of the file, " << end
                <<", and something is amiss.  Did you use the right header"
                <<" offset value?";
            throw std::runtime_error(oss.str());
        }

        uint32_t& cnt =  GetPointCount();
        cnt = static_cast<uint32_t>(count);
        SetPointCount(cnt);

        // Position to the beginning of the file to start writing the header
        GetStream().seekp(0, ios::beg);

    } 
    else 
    {
        // Rewrite the georeference VLR entries if they exist
        m_header.SetGeoreference();

        // If we have a custom schema, add the VLR and write it into the 
        // file.  
        if (m_header.GetSchema().IsCustom()) {
            
            // Wipe any schema-related VLRs we might have, as this is now out of date.
            m_header.DeleteVLRs("liblas", 7);
        
            VariableRecord v = m_header.GetSchema().GetVLR();
            std::cout <<  m_header.GetSchema()<< std::endl;
            m_header.AddVLR(v);
        }
    
        int32_t difference = m_header.GetDataOffset() - GetRequiredHeaderSize();

        if (difference <= 0) 
        {
            int32_t d = abs(difference);
            if (m_header.GetVersionMinor()  ==  0) 
            {
                // Add the two extra bytes for the 1.0 pad
                d = d + 2;
            }
            m_header.SetDataOffset(m_header.GetDataOffset() + d );
        }

    }

    
    // 1. File Signature
    std::string const filesig(m_header.GetFileSignature());
    assert(filesig.size() == 4);
    detail::write_n(GetStream(), filesig, 4);
    
    
    // 2. File SourceId / Reserved
    if (m_header.GetVersionMinor()  ==  0) {
        n4 = m_header.GetReserved();
        detail::write_n(GetStream(), n4, sizeof(n4));         
    } else if (m_header.GetVersionMinor()  >  0) {
        n2 = m_header.GetFileSourceId();
        detail::write_n(GetStream(), n2, sizeof(n2));                
        n2 = m_header.GetReserved();
        detail::write_n(GetStream(), n2, sizeof(n2));        
    } 

    // 3-6. GUID data
    uint32_t d1 = 0;
    uint16_t d2 = 0;
    uint16_t d3 = 0;
    uint8_t d4[8] = { 0 };
    liblas::guid g = m_header.GetProjectId();
    g.output_data(d1, d2, d3, d4);
    detail::write_n(GetStream(), d1, sizeof(d1));
    detail::write_n(GetStream(), d2, sizeof(d2));
    detail::write_n(GetStream(), d3, sizeof(d3));
    detail::write_n(GetStream(), d4, sizeof(d4));
    
    // 7. Version major
    n1 = m_header.GetVersionMajor();
    assert(1 == n1);
    detail::write_n(GetStream(), n1, sizeof(n1));
    
    // 8. Version minor
    n1 = m_header.GetVersionMinor();
    detail::write_n(GetStream(), n1, sizeof(n1));

    // 9. System ID
    std::string sysid(m_header.GetSystemId(true));
    assert(sysid.size() == 32);
    detail::write_n(GetStream(), sysid, 32);
    
    // 10. Generating Software ID
    std::string softid(m_header.GetSoftwareId(true));
    assert(softid.size() == 32);
    detail::write_n(GetStream(), softid, 32);

    // 11. Flight Date Julian
    n2 = m_header.GetCreationDOY();
    detail::write_n(GetStream(), n2, sizeof(n2));

    // 12. Year
    n2 = m_header.GetCreationYear();
    detail::write_n(GetStream(), n2, sizeof(n2));

    // 13. Header Size
    n2 = m_header.GetHeaderSize();
    assert(227 <= n2);
    detail::write_n(GetStream(), n2, sizeof(n2));

    // 14. Offset to data
    n4 = m_header.GetDataOffset();        
    detail::write_n(GetStream(), n4, sizeof(n4));

    // 15. Number of variable length records
    n4 = m_header.GetRecordsCount();
    detail::write_n(GetStream(), n4, sizeof(n4));

    // 16. Point Data Format ID
    n1 = static_cast<uint8_t>(m_header.GetDataFormatId());
    detail::write_n(GetStream(), n1, sizeof(n1));

    // 17. Point Data Record Length
    n2 = m_header.GetDataRecordLength();
    detail::write_n(GetStream(), n2, sizeof(n2));

    // 18. Number of point records
    // This value is updated if necessary, see UpdateHeader function.
    n4 = m_header.GetPointRecordsCount();
    detail::write_n(GetStream(), n4, sizeof(n4));

    // 19. Number of points by return
    std::vector<uint32_t>::size_type const srbyr = 5;
    std::vector<uint32_t> const& vpbr = m_header.GetPointRecordsByReturnCount();
    // TODO: fix this for 1.3, which has srbyr = 7;  See detail/reader/header.cpp for more details
    // assert(vpbr.size() <= srbyr);
    uint32_t pbr[srbyr] = { 0 };
    std::copy(vpbr.begin(), vpbr.begin() + srbyr, pbr); // FIXME: currently, copies only 5 records, to be improved
    detail::write_n(GetStream(), pbr, sizeof(pbr));

    // 20-22. Scale factors
    detail::write_n(GetStream(), m_header.GetScaleX(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetScaleY(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetScaleZ(), sizeof(double));

    // 23-25. Offsets
    detail::write_n(GetStream(), m_header.GetOffsetX(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetOffsetY(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetOffsetZ(), sizeof(double));

    // 26-27. Max/Min X
    detail::write_n(GetStream(), m_header.GetMaxX(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetMinX(), sizeof(double));

    // 28-29. Max/Min Y
    detail::write_n(GetStream(), m_header.GetMaxY(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetMinY(), sizeof(double));

    // 30-31. Max/Min Z
    detail::write_n(GetStream(), m_header.GetMaxZ(), sizeof(double));
    detail::write_n(GetStream(), m_header.GetMinZ(), sizeof(double));

    // If WriteVLR returns a value, it is because the header's 
    // offset is not large enough to contain the VLRs.  The value 
    // it returns is the number of bytes we must increase the header
    // by in order for it to contain the VLRs.  We do not touch VLRs if we 
    // are in append mode.

    if (!bAppendMode) 
    {
        WriteVLRs();

        // Write the 1.0 pad signature if we need to.
        WriteLAS10PadSignature(); 

    }           
    // If we already have points, we're going to put it at the end of the file.  
    // If we don't have any points,  we're going to leave it where it is.
    if (GetPointCount() != 0)
        GetStream().seekp(0, std::ios::end);
    
}
Example #3
0
void WriterImpl::WriteHeader(LASHeader& header)
{
    uint8_t n1 = 0;
    uint16_t n2 = 0;
    uint32_t n4 = 0;

    // Rewrite the georeference VLR entries if they exist
    header.SetGeoreference();
    
    // Seek to the beginning
    m_ofs.seekp(0, std::ios::beg);
    std::ios::pos_type beginning = m_ofs.tellp();

    // Seek to the end
    m_ofs.seekp(0, std::ios::end);
    std::ios::pos_type end = m_ofs.tellp();
    
    // Figure out how many points we already have.  Each point record 
    // should be 20 bytes long, and header.GetDataOffset tells
    // us the location to start counting points from.  
    
    // This test should only be true if we were opened in both 
    // std::ios::in *and* std::ios::out, otherwise it should return false 
    // and we won't adjust the point count.
    
    if ((beginning != end) && ((uint32_t)end != 0)) {
        m_pointCount = ((uint32_t) end - header.GetDataOffset())/header.GetDataRecordLength();

        // Position to the beginning of the file to start writing the header
        m_ofs.seekp(0, std::ios::beg);
    }

    // 1. File Signature
    std::string const filesig(header.GetFileSignature());
    assert(filesig.size() == 4);
    detail::write_n(m_ofs, filesig, 4);
    
    // 2. Reserved
    n4 = header.GetReserved();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 3-6. GUID data
    uint32_t d1 = 0;
    uint16_t d2 = 0;
    uint16_t d3 = 0;
    uint8_t d4[8] = { 0 };
    liblas::guid g = header.GetProjectId();
    g.output_data(d1, d2, d3, d4);
    detail::write_n(m_ofs, d1, sizeof(d1));
    detail::write_n(m_ofs, d2, sizeof(d2));
    detail::write_n(m_ofs, d3, sizeof(d3));
    detail::write_n(m_ofs, d4, sizeof(d4));
    
    // 7. Version major
    n1 = header.GetVersionMajor();
    assert(1 == n1);
    detail::write_n(m_ofs, n1, sizeof(n1));
    
    // 8. Version minor
    n1 = header.GetVersionMinor();
    assert(0 == n1);
    detail::write_n(m_ofs, n1, sizeof(n1));

    // 9. System ID
    std::string sysid(header.GetSystemId(true));
    assert(sysid.size() == 32);
    detail::write_n(m_ofs, sysid, 32);
    
    // 10. Generating Software ID
    std::string softid(header.GetSoftwareId(true));
    assert(softid.size() == 32);
    detail::write_n(m_ofs, softid, 32);

    // 11. Flight Date Julian
    n2 = header.GetCreationDOY();
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 12. Year
    n2 = header.GetCreationYear();
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 13. Header Size
    n2 = header.GetHeaderSize();
    assert(227 <= n2);
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 14. Offset to data
    n4 = header.GetDataOffset();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 15. Number of variable length records
    // TODO: This value must be updated after new variable length record is added.
    n4 = header.GetRecordsCount();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 16. Point Data Format ID
    n1 = static_cast<uint8_t>(header.GetDataFormatId());
    detail::write_n(m_ofs, n1, sizeof(n1));

    // 17. Point Data Record Length
    n2 = header.GetDataRecordLength();
    detail::write_n(m_ofs, n2, sizeof(n2));

    // 18. Number of point records
    // This value is updated if necessary, see UpdateHeader function.
    n4 = header.GetPointRecordsCount();
    detail::write_n(m_ofs, n4, sizeof(n4));

    // 19. Number of points by return
    std::vector<uint32_t>::size_type const srbyr = 5;
    std::vector<uint32_t> const& vpbr = header.GetPointRecordsByReturnCount();
    assert(vpbr.size() <= srbyr);
    uint32_t pbr[srbyr] = { 0 };
    std::copy(vpbr.begin(), vpbr.end(), pbr);
    detail::write_n(m_ofs, pbr, sizeof(pbr));

    // 20-22. Scale factors
    detail::write_n(m_ofs, header.GetScaleX(), sizeof(double));
    detail::write_n(m_ofs, header.GetScaleY(), sizeof(double));
    detail::write_n(m_ofs, header.GetScaleZ(), sizeof(double));

    // 23-25. Offsets
    detail::write_n(m_ofs, header.GetOffsetX(), sizeof(double));
    detail::write_n(m_ofs, header.GetOffsetY(), sizeof(double));
    detail::write_n(m_ofs, header.GetOffsetZ(), sizeof(double));

    // 26-27. Max/Min X
    detail::write_n(m_ofs, header.GetMaxX(), sizeof(double));
    detail::write_n(m_ofs, header.GetMinX(), sizeof(double));

    // 28-29. Max/Min Y
    detail::write_n(m_ofs, header.GetMaxY(), sizeof(double));
    detail::write_n(m_ofs, header.GetMinY(), sizeof(double));

    // 30-31. Max/Min Z
    detail::write_n(m_ofs, header.GetMaxZ(), sizeof(double));
    detail::write_n(m_ofs, header.GetMinZ(), sizeof(double));


    WriteVLR(header);

    uint8_t const sgn1 = 0xCC;
    uint8_t const sgn2 = 0xDD;
    detail::write_n(m_ofs, sgn1, sizeof(uint8_t));
    detail::write_n(m_ofs, sgn2, sizeof(uint8_t));

    // If we already have points, we're going to put it at the end of the file.  
    // If we don't have any points,  we're going to leave it where it is.
    if (m_pointCount != 0)
        m_ofs.seekp(0, std::ios::end);
}
	GPUAPI void kernel(T compile_time_param){
		if(sysid()>=_dens.nsys()) return;

		typedef Gravitation<T> GravitationInstance;

		// References to Ensemble and Shared Memory
		ensemble::SystemRef sys = _dens[sysid()];
		typedef typename GravitationInstance::shared_data grav_t;
		GravitationInstance calcForces(sys,*( (grav_t*) system_shared_data_pointer(this,compile_time_param) ) );

		/////////// Local variables /////////////
		const int nbod = T::n;               // Number of Bodies
		int b = thread_body_idx(nbod);       // Body id
		int c = thread_component_idx(nbod);  // Component id (x=0,y=1,z=2)
		int ij = thread_in_system();         // Pair id

		// Thread barrier predicates
		//		bool body_component_grid = (b < nbod) && (c < 3);         // Barrier to act on bodies and components
		//		bool first_thread_in_system = (thread_in_system() == 0);  // Barrier to select only the first thread


		//! Setting up Monitor
		monitor_t montest(_mon_params,sys,*_log) ;

		//! Setting up Propagator
		Propagator<T,GravitationInstance> prop(_prop_params,sys,calcForces);
		prop.b = b;
		prop.c = c;
		prop.ij = ij;
		//		prop.body_component_grid = body_component_grid;
		//		prop.first_thread_in_system = first_thread_in_system;

		////////// INTEGRATION //////////////////////
		
		prop.init();
		__syncthreads();


		for(int iter = 0 ; (iter < _max_iterations) && sys.is_active() ; iter ++ ) {

		        prop.max_timestep = _destination_time - sys.time();
			prop.advance();
			__syncthreads();

			bool thread_needs_std_coord  = false;
			bool using_std_coord = false;


#if ASSUME_PROPAGATOR_USES_STD_COORDINATES
			montest( thread_in_system() );
#else
			thread_needs_std_coord = montest.pass_one( thread_in_system() );
#if (__CUDA_ARCH__ >= 200) 
			// requires arch=compute_sm_20
			bool block_needs_std_coord = syncthreads_or((int)(thread_needs_std_coord));
#else
			// \todo Need to make this more intelligent for pre-Fermi GPUs.  For now just setting true, so it always makes the conversion on pre-Fermi GPUs
			//			void *ptr_shared_void = calcForces.unused_shared_data_pointer(system_per_block_gpu());
			//			int *ptr_shared_int = static_cast<int *>(ptr_shared_void);
			//			//			int put_back = *ptr_shared_int;
			//						*ptr_shared_int = 0;
			//			//			atomicOr(ptr_shared_int,thread_needs_std_coord);
			//			  //			if(thread_needs_std_coord) (*ptr_shared_int)++;
			//			__syncthreads();
			//			bool block_needs_std_coord = static_cast<bool>(*ptr_shared_int);
			//			*ptr_shared_int = put_back;
			bool block_needs_std_coord = true;
#endif			
			if(block_needs_std_coord) 
			  { 
			    prop.convert_internal_to_std_coord(); 
			    using_std_coord = true; 
			  }

			__syncthreads();
			int new_state = montest.pass_two ( thread_in_system() );

			if( montest.need_to_log_system() && (thread_in_system()==0) )
			  { log::system(*_log, sys); }
			    
			__syncthreads();
			if(using_std_coord)
			  {
			    prop.convert_std_to_internal_coord();
			    using_std_coord = false;
			  }
#endif
			__syncthreads();			  

			if( sys.is_active() && prop.is_first_thread_in_system() )
			  {
			    if( sys.time() >= _destination_time ) 
			      { sys.set_inactive();     }
			  }
			__syncthreads();

		}

		prop.shutdown();

	}