128 int flag_observables) {
129#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
130 auto const allocate_cpu_field_if_empty =
131 [&]<
typename Field>(
auto const &blocks, std::string name,
132 std::optional<BlockDataID> &cpu_field) {
134 cpu_field = field::addToStorage<Field>(
135 blocks, name, FloatType{0}, field::fzyx,
136 m_lattice->get_ghost_layers(), m_host_field_allocator);
141 auto const unit_conversion =
142 FloatType_c(zero_centered_to_md(units.at(
"density")));
143#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
145 auto const &blocks = m_lattice->get_blocks();
146 allocate_cpu_field_if_empty.template operator()<PdfFieldCpu>(
147 blocks,
"pdfs_cpu", m_pdf_cpu_field_id);
148 vtk_obj.addBeforeFunction(gpu::fieldCpyFunctor<PdfFieldCpu, PdfField>(
149 blocks, *m_pdf_cpu_field_id, m_pdf_field_id));
152 vtk_obj.addCellDataWriter(
154 m_pdf_field_id,
"density", unit_conversion));
157 auto const unit_conversion = FloatType_c(units.at(
"velocity"));
158#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
160 auto const &blocks = m_lattice->get_blocks();
161 allocate_cpu_field_if_empty.template operator()<VectorFieldCpu>(
162 blocks,
"vel_cpu", m_vel_cpu_field_id);
163 vtk_obj.addBeforeFunction(
164 gpu::fieldCpyFunctor<VectorFieldCpu, VectorField>(
165 blocks, *m_vel_cpu_field_id, m_velocity_field_id));
168 vtk_obj.addCellDataWriter(
170 m_velocity_field_id,
"velocity_vector", unit_conversion));
173 auto const unit_conversion =
174 FloatType_c(zero_centered_to_md(units.at(
"pressure")));
175#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
177 auto const &blocks = m_lattice->get_blocks();
178 allocate_cpu_field_if_empty.template operator()<PdfFieldCpu>(
179 blocks,
"pdfs_cpu", m_pdf_cpu_field_id);
180 vtk_obj.addBeforeFunction(gpu::fieldCpyFunctor<PdfFieldCpu, PdfField>(
181 blocks, *m_pdf_cpu_field_id, m_pdf_field_id));
184 vtk_obj.addCellDataWriter(
186 m_pdf_field_id,
"pressure_tensor", unit_conversion,
187 pressure_tensor_correction_factor()));