20 Inform m(
"FS::dumpVectorField() ");
43 std::string dirname =
"data/";
55 auto localIdx = field->getOwned();
56 auto mesh_mp = &(field->get_mesh());
57 auto spacing = mesh_mp->getMeshSpacing();
58 auto origin = mesh_mp->getOrigin();
60 auto fieldV = field->getView();
61 auto field_hostV = field->getHostMirror();
62 Kokkos::deep_copy(field_hostV, fieldV);
64 boost::filesystem::path file(dirname);
65 boost::format filename(
"%1%-%2%-%|3$06|.dat");
67 filename % basename % (what + std::string(
"_") + type) %
call_counter_m;
68 file /= filename.str();
69 std::ofstream fout(file.string(), std::ios::out);
71 fout << std::setprecision(9);
73 fout <<
"# " <<
Util::toUpper(what) <<
" " << type <<
" data on grid" << std::endl
74 <<
"# origin= " << std::fixed << origin <<
" h= " << std::fixed << spacing << std::endl
75 << std::setw(5) <<
"i"
76 << std::setw(5) <<
"j"
77 << std::setw(5) <<
"k"
78 << std::setw(17) <<
"x [m]"
79 << std::setw(17) <<
"y [m]"
80 << std::setw(17) <<
"z [m]";
82 fout << std::setw(10) << what <<
"x [" << unit <<
"]"
83 << std::setw(10) << what <<
"y [" << unit <<
"]"
84 << std::setw(10) << what <<
"z [" << unit <<
"]";
88 for (
int i = localIdx[0].first() + 1; i <= localIdx[0].last() +1 ; i++) {
89 for (
int j = localIdx[1].first() + 1 ; j <= localIdx[1].last() +1 ; j++) {
90 for (
int k = localIdx[2].first() + 1 ; k <= localIdx[2].last() +1 ; k++) {
93 double x = i * spacing[0] + origin[0];
94 double y = j * spacing[1] + origin[1];
95 double z = k * spacing[2] + origin[2];
97 fout << std::setw(5) << i-1
98 << std::setw(5) << j-1
99 << std::setw(5) << k-1
100 << std::setw(17) << x
101 << std::setw(17) << y
102 << std::setw(17) << z
104 <<
"\t" << field_hostV(i,j,k)[0]
105 <<
"\t" << field_hostV(i,j,k)[1]
106 <<
"\t" << field_hostV(i,j,k)[2]
112 m <<
"*** FINISHED DUMPING " +
Util::toUpper(what) +
" FIELD *** to " << file.string() << endl;
122 Inform m(
"FS::dumpScalField() ");
144 std::string dirname =
"data/";
148 bool isVectorField =
false;
161 auto localIdx = field->getOwned();
162 auto mesh_mp = &(field->get_mesh());
163 auto spacing = mesh_mp->getMeshSpacing();
164 auto origin = mesh_mp->getOrigin();
166 auto fieldV = field->getView();
167 auto field_hostV = field->getHostMirror();
168 Kokkos::deep_copy(field_hostV, fieldV);
170 boost::filesystem::path file(dirname);
171 boost::format filename(
"%1%-%2%-%|3$06|.dat");
173 filename % basename % (what + std::string(
"_") + type) %
call_counter_m;
174 file /= filename.str();
175 std::ofstream fout(file.string(), std::ios::out);
177 fout << std::setprecision(9);
179 fout <<
"# " <<
Util::toUpper(what) <<
" " << type <<
" data on grid" << std::endl
180 <<
"# origin= " << std::fixed << origin <<
" h= " << std::fixed << spacing << std::endl
181 << std::setw(5) <<
"i"
182 << std::setw(5) <<
"j"
183 << std::setw(5) <<
"k"
184 << std::setw(17) <<
"x [m]"
185 << std::setw(17) <<
"y [m]"
186 << std::setw(17) <<
"z [m]";
189 fout << std::setw(10) << what <<
"x [" << unit <<
"]"
190 << std::setw(10) << what <<
"y [" << unit <<
"]"
191 << std::setw(10) << what <<
"z [" << unit <<
"]";
193 fout << std::setw(13) << what <<
" [" << unit <<
"]";
199 for (
int i = localIdx[0].first(); i <= localIdx[0].last(); i++) {
200 for (
int j = localIdx[1].first(); j <= localIdx[1].last(); j++) {
201 for (
int k = localIdx[2].first(); k <= localIdx[2].last(); k++) {
204 double x = i * spacing[0] + origin[0];
205 double y = j * spacing[1] + origin[1];
206 double z = k * spacing[2] + origin[2];
208 fout << std::setw(5) << i
211 << std::setw(17) << x
212 << std::setw(17) << y
213 << std::setw(17) << z
214 << std::scientific <<
"\t" << field_hostV(i,j,k)
221 for (
int i = localIdx[0].first() + 1; i <= localIdx[0].last() +1 ; i++) {
222 for (
int j = localIdx[1].first() + 1 ; j <= localIdx[1].last() +1 ; j++) {
223 for (
int k = localIdx[2].first() + 1 ; k <= localIdx[2].last() +1 ; k++) {
226 double x = i * spacing[0] + origin[0];
227 double y = j * spacing[1] + origin[1];
228 double z = k * spacing[2] + origin[2];
230 fout << std::setw(5) << i-1
231 << std::setw(5) << j-1
232 << std::setw(5) << k-1
233 << std::setw(17) << x
234 << std::setw(17) << y
235 << std::setw(17) << z
236 << std::scientific <<
"\t" << field_hostV(i,j,k)
243 m <<
"*** FINISHED DUMPING " +
Util::toUpper(what) +
" FIELD *** to " << file.string() << endl;
292 constexpr int Dim = 3;
294 if (this->getStype() ==
"CG") {
295 CGSolver_t<double, 3>& solver = std::get<CGSolver_t<double, 3>>(this->getSolver());
298 if (ippl::Comm->rank() == 0) {
299 std::stringstream fname;
301 fname << ippl::Comm->size();
304 Inform log(NULL, fname.str().c_str(), Inform::APPEND);
305 int iterations = solver.getIterationCount();
307 if (iterations == 0) {
308 log <<
"residue,iterations" << endl;
311 if (iterations > 0) {
312 log << solver.getResidue() <<
"," << iterations << endl;
315 ippl::Comm->barrier();
316 }
else if (this->getStype() ==
"FFT") {
317 if constexpr (
Dim == 2 ||
Dim == 3) {
318#ifdef OPALX_FIELD_DEBUG
323 std::get<OpenSolver_t<double, 3>>(this->getSolver()).solve();
324#ifdef OPALX_FIELD_DEBUG
330 }
else if (this->getStype() ==
"P3M") {
331 if constexpr (
Dim == 3) {
332 std::get<FFTTruncatedGreenSolver_t<double, 3>>(this->getSolver()).solve();
334 }
else if (this->getStype() ==
"FFTOPEN") {
335 if constexpr (
Dim == 3) {
336#ifdef OPALX_FIELD_DEBUG
340 std::get<OpenSolver_t<double, 3>>(this->getSolver()).solve();
341#ifdef OPALX_FIELD_DEBUG
347 }
else if (this->getStype() ==
"NONE") {
348 std::get<NullSolver_t<T, Dim>>(this->getSolver()).solve();
350 throw std::runtime_error(
"Unknown solver type");