Extact UnitCellInfo from gmx_domdec_t
[gromacs.git] / src / gromacs / domdec / dump.cpp
blob0a37a062692136ee9dddc9d10ec985e6632a7536
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 2018,2019, by the GROMACS development team, led by
5 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6 * and including many others, as listed in the AUTHORS file in the
7 * top-level source directory and at http://www.gromacs.org.
9 * GROMACS is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * GROMACS is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with GROMACS; if not, see
21 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * If you want to redistribute modifications to GROMACS, please
25 * consider that scientific software is very special. Version
26 * control is crucial - bugs must be traceable. We will be happy to
27 * consider code for inclusion in the official distribution, but
28 * derived work must not be called official GROMACS. Details are found
29 * in the README & COPYING files - if they are missing, get the
30 * official version at http://www.gromacs.org.
32 * To help us fund GROMACS development, we humbly ask that you cite
33 * the research papers on the package. Check out http://www.gromacs.org.
35 /*! \internal \file
37 * \brief This file definees functions for DD to write PDB files
38 * e.g. when reporting problems.
40 * \author Berk Hess <hess@kth.se>
41 * \ingroup module_domdec
44 #include "gmxpre.h"
46 #include "dump.h"
48 #include "gromacs/domdec/domdec_network.h"
49 #include "gromacs/fileio/gmxfio.h"
50 #include "gromacs/fileio/pdbio.h"
51 #include "gromacs/math/vec.h"
52 #include "gromacs/mdtypes/commrec.h"
53 #include "gromacs/pbcutil/pbc.h"
54 #include "gromacs/topology/mtop_lookup.h"
55 #include "gromacs/utility/cstringutil.h"
57 #include "domdec_internal.h"
59 void write_dd_grid_pdb(const char *fn, int64_t step,
60 gmx_domdec_t *dd, matrix box, gmx_ddbox_t *ddbox)
62 rvec grid_s[2], *grid_r = nullptr, cx, r;
63 char fname[STRLEN], buf[22];
64 FILE *out;
65 int a, i, d, z, y, x;
66 matrix tric;
67 real vol;
69 copy_rvec(dd->comm->cell_x0, grid_s[0]);
70 copy_rvec(dd->comm->cell_x1, grid_s[1]);
72 if (DDMASTER(dd))
74 snew(grid_r, 2*dd->nnodes);
77 dd_gather(dd, 2*sizeof(rvec), grid_s, DDMASTER(dd) ? grid_r : nullptr);
79 if (DDMASTER(dd))
81 for (d = 0; d < DIM; d++)
83 for (i = 0; i < DIM; i++)
85 if (d == i)
87 tric[d][i] = 1;
89 else
91 if (d < ddbox->npbcdim && dd->nc[d] > 1)
93 tric[d][i] = box[i][d]/box[i][i];
95 else
97 tric[d][i] = 0;
102 sprintf(fname, "%s_%s.pdb", fn, gmx_step_str(step, buf));
103 out = gmx_fio_fopen(fname, "w");
104 gmx_write_pdb_box(out, dd->unitCellInfo.haveScrewPBC ? epbcSCREW : epbcXYZ, box);
105 a = 1;
106 for (i = 0; i < dd->nnodes; i++)
108 vol = dd->nnodes/(box[XX][XX]*box[YY][YY]*box[ZZ][ZZ]);
109 for (d = 0; d < DIM; d++)
111 vol *= grid_r[i*2+1][d] - grid_r[i*2][d];
113 for (z = 0; z < 2; z++)
115 for (y = 0; y < 2; y++)
117 for (x = 0; x < 2; x++)
119 cx[XX] = grid_r[i*2+x][XX];
120 cx[YY] = grid_r[i*2+y][YY];
121 cx[ZZ] = grid_r[i*2+z][ZZ];
122 mvmul(tric, cx, r);
123 gmx_fprintf_pdb_atomline(out, epdbATOM, a++, "CA", ' ', "GLY", ' ', i+1, ' ',
124 10*r[XX], 10*r[YY], 10*r[ZZ], 1.0, vol, "");
128 for (d = 0; d < DIM; d++)
130 for (x = 0; x < 4; x++)
132 switch (d)
134 case 0: y = 1 + i*8 + 2*x; break;
135 case 1: y = 1 + i*8 + 2*x - (x % 2); break;
136 case 2: y = 1 + i*8 + x; break;
138 fprintf(out, "%6s%5d%5d\n", "CONECT", y, y+(1<<d));
142 gmx_fio_fclose(out);
143 sfree(grid_r);
147 void write_dd_pdb(const char *fn, int64_t step, const char *title,
148 const gmx_mtop_t *mtop, const t_commrec *cr,
149 int natoms, const rvec x[], const matrix box)
151 char fname[STRLEN], buf[22];
152 FILE *out;
153 int resnr;
154 const char *atomname, *resname;
155 gmx_domdec_t *dd;
157 dd = cr->dd;
158 if (natoms == -1)
160 natoms = dd->comm->atomRanges.end(DDAtomRanges::Type::Vsites);
163 sprintf(fname, "%s_%s_n%d.pdb", fn, gmx_step_str(step, buf), cr->sim_nodeid);
165 out = gmx_fio_fopen(fname, "w");
167 fprintf(out, "TITLE %s\n", title);
168 gmx_write_pdb_box(out, dd->unitCellInfo.haveScrewPBC ? epbcSCREW : epbcXYZ, box);
169 int molb = 0;
170 for (int i = 0; i < natoms; i++)
172 int ii = dd->globalAtomIndices[i];
173 mtopGetAtomAndResidueName(mtop, ii, &molb, &atomname, &resnr, &resname, nullptr);
174 int c;
175 real b;
176 if (i < dd->comm->atomRanges.end(DDAtomRanges::Type::Zones))
178 c = 0;
179 while (i >= dd->comm->zones.cg_range[c + 1])
181 c++;
183 b = c;
185 else if (i < dd->comm->atomRanges.end(DDAtomRanges::Type::Vsites))
187 b = dd->comm->zones.n;
189 else
191 b = dd->comm->zones.n + 1;
193 gmx_fprintf_pdb_atomline(out, epdbATOM, ii+1, atomname, ' ', resname, ' ', resnr, ' ',
194 10*x[i][XX], 10*x[i][YY], 10*x[i][ZZ], 1.0, b, "");
196 fprintf(out, "TER\n");
198 gmx_fio_fclose(out);