chrono学习(一)

我想用chrono进行沙土的仿真,首先学习demo_GPU_ballCosim.cpp,这个例子仿真了一些沙土的沉降过程。

首先,运行编辑完成的文件demo_GPU_ballCosim:

(base) eowyn@eowyn-MS-7D20:~/build_chrono/bin$ ./demo_GPU_ballCosim 

运行完得到一些数据,存放在DEMO_OUTPUT/GPU/ballCosim/checkpoint.dat中:

Reading parameters: ../data/gpu/ballCosim.json
--- Parsing JSON ---
params.sphere_radius 1.000000
params.sphere_density 1.000000
...
params.step_size 0.000050
--------------------
Now run_mode == FRICTIONLESS, this run is particle settling phase.
After it is done, you will have a settled bed of granular material.
A checkpoint file will be generated in the output directory to store this state.
Next, edit the JSON file, change 'run_mode' from 0 (FRICTIONLESS) to 1 (ONE_STEP),
then run this demo again to proceed with the ball drop part of this demo.

622476 particles sampled!
Output frame 1 of 100
Output frame 2 of 100
Output frame 3 of 100
...
Output frame 101 of 100
Writing checkpoint data to file "DEMO_OUTPUT/GPU/ballCosim/checkpoint.dat"

然后,根据运行文件中的提示,将/build_chrono/data/gpu/ballCosim.json文件中的‘run_mode'变量从frictionless改成one_step. 然后,重新运行demo_GPU_ballCosim,将会展示沉降后的沙土。

(base) eowyn@eowyn-MS-7D20:~/build_chrono/bin$ ./demo_GPU_ballCosim 
Reading parameters: ../data/gpu/ballCosim.json
--- Parsing JSON ---
params.sphere_radius 1.000000
params.sphere_density 1.000000
...
params.step_size 0.000050
--------------------
Reading checkpoint data from file "DEMO_OUTPUT/GPU/ballCosim/checkpoint.dat"...
1 meshes
Version: 3.3.0
NVIDIA Corporation : NVIDIA GeForce RTX 3060/PCIe/SSE2 (3.3.0 NVIDIA 470.199.02)
GLSL: 3.30 NVIDIA via Cg compiler
Initialize Viewer : GL_INVALID_ENUM
Output at    50 FPS
Rendering at 2000 FPS
Output frame 1 of 100
Output frame 2 of 100
...
Output frame 10 of 100
Time: 67.6678 seconds

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C++的可靠UDP源代码,它包含了数据包的序列化、反序列化、发送、接收和确认等功能: ```c++ #include <iostream> #include <cstring> #include <arpa/inet.h> #include <sys/socket.h> #include <unistd.h> #include <chrono> #include <thread> struct Packet { uint32_t seq; // 序列号 char data[1024]; // 数据 }; class ReliableUDP { public: ReliableUDP() { // 创建套接字 m_sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (m_sockfd < 0) { std::cerr << "Error: Failed to create socket." << std::endl; exit(-1); } // 设置目标服务器地址 memset(&m_server_addr, 0, sizeof(m_server_addr)); m_server_addr.sin_family = AF_INET; m_server_addr.sin_port = htons(6666); inet_pton(AF_INET, "127.0.0.1", &m_server_addr.sin_addr); } ~ReliableUDP() { // 关闭套接字 close(m_sockfd); } // 发送数据包 void send(const char* data, size_t len) { uint32_t seq = m_seq++; // 获取序列号 Packet packet = { seq }; memcpy(packet.data, data, len); // 序列化数据包 uint8_t buffer[sizeof(Packet)]; memcpy(buffer, &packet, sizeof(Packet)); // 发送数据包 ssize_t n = sendto(m_sockfd, buffer, sizeof(Packet), 0, (const sockaddr*)&m_server_addr, sizeof(m_server_addr)); if (n != sizeof(Packet)) { std::cerr << "Error: Failed to send packet." << std::endl; exit(-1); } // 等待ACK,直到超时 std::chrono::time_point<std::chrono::steady_clock> start_time = std::chrono::steady_clock::now(); while (true) { // 接收ACK Packet ack_packet; ssize_t n = recvfrom(m_sockfd, &ack_packet, sizeof(Packet), 0, NULL, NULL); if (n == sizeof(Packet) && ack_packet.seq == seq) { break; // 收到正确的ACK,退出循环 } // 检查是否超时 std::chrono::time_point<std::chrono::steady_clock> now_time = std::chrono::steady_clock::now(); std::chrono::duration<double> elapsed_seconds = now_time - start_time; if (elapsed_seconds.count() > m_timeout) { std::cerr << "Error: Timeout." << std::endl; exit(-1); } // 等待一段时间再次接收ACK std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } // 接收数据包 void recv(char* data, size_t& len) { while (true) { // 接收数据包 Packet packet; ssize_t n = recvfrom(m_sockfd, &packet, sizeof(Packet), 0, NULL, NULL); if (n <= 0) { continue; // 接收失败,继续等待 } // 发送ACK Packet ack_packet = { packet.seq }; sendto(m_sockfd, &ack_packet, sizeof(Packet), 0, (const sockaddr*)&m_server_addr, sizeof(m_server_addr)); // 反序列化数据包 memcpy(data, packet.data, sizeof(packet.data)); len = n - sizeof(uint32_t); break; } } private: int m_sockfd; // 套接字文件描述符 sockaddr_in m_server_addr; // 目标服务器地址 uint32_t m_seq = 0; // 当前序列号 double m_timeout = 1.0; // 超时时间 }; ``` 使用方法: ```c++ int main() { ReliableUDP udp; // 发送数据包 char data[] = "Hello, world!"; udp.send(data, strlen(data)); // 接收数据包 char recv_data[1024]; size_t len = 0; udp.recv(recv_data, len); recv_data[len] = '\0'; std::cout << "Received: " << recv_data << std::endl; return 0; } ``` 注意:此代码仅用于学习和参考,实际生产环境中需要考虑更多的异常处理、安全性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值