void Ephemeris<Frame>::WriteToMessage( not_null<serialization::Ephemeris*> const message) const { LOG(INFO) << __FUNCTION__; // The bodies are serialized in the order in which they were given at // construction. for (auto const& unowned_body : unowned_bodies_) { unowned_body->WriteToMessage(message->add_body()); } // The trajectories are serialized in the order resulting from the separation // between oblate and spherical bodies. if (checkpoints_.empty()) { for (auto const& trajectory : trajectories_) { trajectory->WriteToMessage(message->add_trajectory()); } last_state_.WriteToMessage(message->mutable_last_state()); } else { auto const& checkpoints = checkpoints_.front().checkpoints; CHECK_EQ(trajectories_.size(), checkpoints.size()); for (int i = 0; i < trajectories_.size(); ++i) { trajectories_[i]->WriteToMessage(message->add_trajectory(), checkpoints[i]); } checkpoints_.front().system_state.WriteToMessage( message->mutable_last_state()); t_max().WriteToMessage(message->mutable_t_max()); } parameters_.WriteToMessage(message->mutable_fixed_step_parameters()); fitting_tolerance_.WriteToMessage(message->mutable_fitting_tolerance()); LOG(INFO) << NAMED(message->SpaceUsed()); LOG(INFO) << NAMED(message->ByteSize()); }