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