Merged legacyheaders/types/inputrec.h into mdtypes/inputrec.h
[gromacs.git] / src / gromacs / mdlib / broadcaststructs.cpp
blobf30b58ce30d4ca5abc508b5bbd4475035940f95b
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 /* This file is completely threadsafe - keep it that way! */
38 #include "gmxpre.h"
40 #include <string.h>
42 #include "gromacs/gmxlib/main.h"
43 #include "gromacs/gmxlib/network.h"
44 #include "gromacs/legacyheaders/types/commrec.h"
45 #include "gromacs/legacyheaders/types/enums.h"
46 #include "gromacs/math/vec.h"
47 #include "gromacs/mdlib/mdrun.h"
48 #include "gromacs/mdlib/tgroup.h"
49 #include "gromacs/mdtypes/inputrec.h"
50 #include "gromacs/mdtypes/state.h"
51 #include "gromacs/topology/symtab.h"
52 #include "gromacs/topology/topology.h"
53 #include "gromacs/utility/fatalerror.h"
54 #include "gromacs/utility/smalloc.h"
56 #define block_bc(cr, d) gmx_bcast( sizeof(d), &(d), (cr))
57 /* Probably the test for (nr) > 0 in the next macro is only needed
58 * on BlueGene(/L), where IBM's MPI_Bcast will segfault after
59 * dereferencing a null pointer, even when no data is to be transferred. */
60 #define nblock_bc(cr, nr, d) { if ((nr) > 0) {gmx_bcast((nr)*sizeof((d)[0]), (d), (cr)); }}
61 #define snew_bc(cr, d, nr) { if (!MASTER(cr)) {snew((d), (nr)); }}
62 /* Dirty macro with bAlloc not as an argument */
63 #define nblock_abc(cr, nr, d) { if (bAlloc) {snew((d), (nr)); } nblock_bc(cr, (nr), (d)); }
65 static void bc_string(const t_commrec *cr, t_symtab *symtab, char ***s)
67 int handle;
69 if (MASTER(cr))
71 handle = lookup_symtab(symtab, *s);
73 block_bc(cr, handle);
74 if (!MASTER(cr))
76 *s = get_symtab_handle(symtab, handle);
80 static void bc_strings(const t_commrec *cr, t_symtab *symtab, int nr, char ****nm)
82 int i;
83 int *handle;
85 snew(handle, nr);
86 if (MASTER(cr))
88 for (i = 0; (i < nr); i++)
90 handle[i] = lookup_symtab(symtab, (*nm)[i]);
93 nblock_bc(cr, nr, handle);
95 if (!MASTER(cr))
97 snew_bc(cr, *nm, nr);
98 for (i = 0; (i < nr); i++)
100 (*nm)[i] = get_symtab_handle(symtab, handle[i]);
103 sfree(handle);
106 static void bc_strings_resinfo(const t_commrec *cr, t_symtab *symtab,
107 int nr, t_resinfo *resinfo)
109 int i;
110 int *handle;
112 snew(handle, nr);
113 if (MASTER(cr))
115 for (i = 0; (i < nr); i++)
117 handle[i] = lookup_symtab(symtab, resinfo[i].name);
120 nblock_bc(cr, nr, handle);
122 if (!MASTER(cr))
124 for (i = 0; (i < nr); i++)
126 resinfo[i].name = get_symtab_handle(symtab, handle[i]);
129 sfree(handle);
132 static void bc_symtab(const t_commrec *cr, t_symtab *symtab)
134 int i, nr, len;
135 t_symbuf *symbuf;
137 block_bc(cr, symtab->nr);
138 nr = symtab->nr;
139 snew_bc(cr, symtab->symbuf, 1);
140 symbuf = symtab->symbuf;
141 symbuf->bufsize = nr;
142 snew_bc(cr, symbuf->buf, nr);
143 for (i = 0; i < nr; i++)
145 if (MASTER(cr))
147 len = strlen(symbuf->buf[i]) + 1;
149 block_bc(cr, len);
150 snew_bc(cr, symbuf->buf[i], len);
151 nblock_bc(cr, len, symbuf->buf[i]);
155 static void bc_block(const t_commrec *cr, t_block *block)
157 block_bc(cr, block->nr);
158 snew_bc(cr, block->index, block->nr+1);
159 nblock_bc(cr, block->nr+1, block->index);
162 static void bc_blocka(const t_commrec *cr, t_blocka *block)
164 block_bc(cr, block->nr);
165 snew_bc(cr, block->index, block->nr+1);
166 nblock_bc(cr, block->nr+1, block->index);
167 block_bc(cr, block->nra);
168 if (block->nra)
170 snew_bc(cr, block->a, block->nra);
171 nblock_bc(cr, block->nra, block->a);
175 static void bc_grps(const t_commrec *cr, t_grps grps[])
177 int i;
179 for (i = 0; (i < egcNR); i++)
181 block_bc(cr, grps[i].nr);
182 snew_bc(cr, grps[i].nm_ind, grps[i].nr);
183 nblock_bc(cr, grps[i].nr, grps[i].nm_ind);
187 static void bc_atoms(const t_commrec *cr, t_symtab *symtab, t_atoms *atoms)
189 block_bc(cr, atoms->nr);
190 snew_bc(cr, atoms->atom, atoms->nr);
191 nblock_bc(cr, atoms->nr, atoms->atom);
192 bc_strings(cr, symtab, atoms->nr, &atoms->atomname);
193 block_bc(cr, atoms->nres);
194 snew_bc(cr, atoms->resinfo, atoms->nres);
195 nblock_bc(cr, atoms->nres, atoms->resinfo);
196 bc_strings_resinfo(cr, symtab, atoms->nres, atoms->resinfo);
197 /* QMMM requires atomtypes to be known on all nodes as well */
198 bc_strings(cr, symtab, atoms->nr, &atoms->atomtype);
199 bc_strings(cr, symtab, atoms->nr, &atoms->atomtypeB);
202 static void bc_groups(const t_commrec *cr, t_symtab *symtab,
203 int natoms, gmx_groups_t *groups)
205 int g, n;
207 bc_grps(cr, groups->grps);
208 block_bc(cr, groups->ngrpname);
209 bc_strings(cr, symtab, groups->ngrpname, &groups->grpname);
210 for (g = 0; g < egcNR; g++)
212 if (MASTER(cr))
214 if (groups->grpnr[g])
216 n = natoms;
218 else
220 n = 0;
223 block_bc(cr, n);
224 if (n == 0)
226 groups->grpnr[g] = NULL;
228 else
230 snew_bc(cr, groups->grpnr[g], n);
231 nblock_bc(cr, n, groups->grpnr[g]);
234 if (debug)
236 fprintf(debug, "after bc_groups\n");
240 void bcast_state(const t_commrec *cr, t_state *state)
242 int i, nnht, nnhtp;
243 gmx_bool bAlloc;
245 if (!PAR(cr) || (cr->nnodes - cr->npmenodes <= 1))
247 return;
250 /* Broadcasts the state sizes and flags from the master to all nodes
251 * in cr->mpi_comm_mygroup. The arrays are not broadcasted. */
252 block_bc(cr, state->natoms);
253 block_bc(cr, state->ngtc);
254 block_bc(cr, state->nnhpres);
255 block_bc(cr, state->nhchainlength);
256 block_bc(cr, state->flags);
257 if (state->lambda == NULL)
259 snew_bc(cr, state->lambda, efptNR)
262 if (cr->dd)
264 /* We allocate dynamically in dd_partition_system. */
265 return;
267 /* The code below is reachable only by TPI and NM, so it is not
268 tested by anything. */
270 nnht = (state->ngtc)*(state->nhchainlength);
271 nnhtp = (state->nnhpres)*(state->nhchainlength);
273 /* We still need to allocate the arrays in state for non-master
274 * ranks, which is done (implicitly via bAlloc) in the dirty,
275 * dirty nblock_abc macro. */
276 bAlloc = !MASTER(cr);
277 if (bAlloc)
279 state->nalloc = state->natoms;
281 for (i = 0; i < estNR; i++)
283 if (state->flags & (1<<i))
285 switch (i)
287 case estLAMBDA: nblock_bc(cr, efptNR, state->lambda); break;
288 case estFEPSTATE: block_bc(cr, state->fep_state); break;
289 case estBOX: block_bc(cr, state->box); break;
290 case estBOX_REL: block_bc(cr, state->box_rel); break;
291 case estBOXV: block_bc(cr, state->boxv); break;
292 case estPRES_PREV: block_bc(cr, state->pres_prev); break;
293 case estSVIR_PREV: block_bc(cr, state->svir_prev); break;
294 case estFVIR_PREV: block_bc(cr, state->fvir_prev); break;
295 case estNH_XI: nblock_abc(cr, nnht, state->nosehoover_xi); break;
296 case estNH_VXI: nblock_abc(cr, nnht, state->nosehoover_vxi); break;
297 case estNHPRES_XI: nblock_abc(cr, nnhtp, state->nhpres_xi); break;
298 case estNHPRES_VXI: nblock_abc(cr, nnhtp, state->nhpres_vxi); break;
299 case estTC_INT: nblock_abc(cr, state->ngtc, state->therm_integral); break;
300 case estVETA: block_bc(cr, state->veta); break;
301 case estVOL0: block_bc(cr, state->vol0); break;
302 case estX: nblock_abc(cr, state->natoms, state->x); break;
303 case estV: nblock_abc(cr, state->natoms, state->v); break;
304 case estSDX: nblock_abc(cr, state->natoms, state->sd_X); break;
305 case estCGP: nblock_abc(cr, state->natoms, state->cg_p); break;
306 case estDISRE_INITF: block_bc(cr, state->hist.disre_initf); break;
307 case estDISRE_RM3TAV:
308 block_bc(cr, state->hist.ndisrepairs);
309 nblock_abc(cr, state->hist.ndisrepairs, state->hist.disre_rm3tav);
310 break;
311 case estORIRE_INITF: block_bc(cr, state->hist.orire_initf); break;
312 case estORIRE_DTAV:
313 block_bc(cr, state->hist.norire_Dtav);
314 nblock_abc(cr, state->hist.norire_Dtav, state->hist.orire_Dtav);
315 break;
316 default:
317 gmx_fatal(FARGS,
318 "Communication is not implemented for %s in bcast_state",
319 est_names[i]);
325 static void bc_ilists(const t_commrec *cr, t_ilist *ilist)
327 int ftype;
329 /* Here we only communicate the non-zero length ilists */
330 if (MASTER(cr))
332 for (ftype = 0; ftype < F_NRE; ftype++)
334 if (ilist[ftype].nr > 0)
336 block_bc(cr, ftype);
337 block_bc(cr, ilist[ftype].nr);
338 nblock_bc(cr, ilist[ftype].nr, ilist[ftype].iatoms);
341 ftype = -1;
342 block_bc(cr, ftype);
344 else
346 for (ftype = 0; ftype < F_NRE; ftype++)
348 ilist[ftype].nr = 0;
352 block_bc(cr, ftype);
353 if (ftype >= 0)
355 block_bc(cr, ilist[ftype].nr);
356 snew_bc(cr, ilist[ftype].iatoms, ilist[ftype].nr);
357 nblock_bc(cr, ilist[ftype].nr, ilist[ftype].iatoms);
360 while (ftype >= 0);
363 if (debug)
365 fprintf(debug, "after bc_ilists\n");
369 static void bc_cmap(const t_commrec *cr, gmx_cmap_t *cmap_grid)
371 int i, nelem, ngrid;
373 block_bc(cr, cmap_grid->ngrid);
374 block_bc(cr, cmap_grid->grid_spacing);
376 ngrid = cmap_grid->ngrid;
377 nelem = cmap_grid->grid_spacing * cmap_grid->grid_spacing;
379 if (ngrid > 0)
381 snew_bc(cr, cmap_grid->cmapdata, ngrid);
383 for (i = 0; i < ngrid; i++)
385 snew_bc(cr, cmap_grid->cmapdata[i].cmap, 4*nelem);
386 nblock_bc(cr, 4*nelem, cmap_grid->cmapdata[i].cmap);
391 static void bc_ffparams(const t_commrec *cr, gmx_ffparams_t *ffp)
393 block_bc(cr, ffp->ntypes);
394 block_bc(cr, ffp->atnr);
395 snew_bc(cr, ffp->functype, ffp->ntypes);
396 snew_bc(cr, ffp->iparams, ffp->ntypes);
397 nblock_bc(cr, ffp->ntypes, ffp->functype);
398 nblock_bc(cr, ffp->ntypes, ffp->iparams);
399 block_bc(cr, ffp->reppow);
400 block_bc(cr, ffp->fudgeQQ);
401 bc_cmap(cr, &ffp->cmap_grid);
404 static void bc_grpopts(const t_commrec *cr, t_grpopts *g)
406 int i, n;
408 block_bc(cr, g->ngtc);
409 block_bc(cr, g->ngacc);
410 block_bc(cr, g->ngfrz);
411 block_bc(cr, g->ngener);
412 snew_bc(cr, g->nrdf, g->ngtc);
413 snew_bc(cr, g->tau_t, g->ngtc);
414 snew_bc(cr, g->ref_t, g->ngtc);
415 snew_bc(cr, g->acc, g->ngacc);
416 snew_bc(cr, g->nFreeze, g->ngfrz);
417 snew_bc(cr, g->egp_flags, g->ngener*g->ngener);
419 nblock_bc(cr, g->ngtc, g->nrdf);
420 nblock_bc(cr, g->ngtc, g->tau_t);
421 nblock_bc(cr, g->ngtc, g->ref_t);
422 nblock_bc(cr, g->ngacc, g->acc);
423 nblock_bc(cr, g->ngfrz, g->nFreeze);
424 nblock_bc(cr, g->ngener*g->ngener, g->egp_flags);
425 snew_bc(cr, g->annealing, g->ngtc);
426 snew_bc(cr, g->anneal_npoints, g->ngtc);
427 snew_bc(cr, g->anneal_time, g->ngtc);
428 snew_bc(cr, g->anneal_temp, g->ngtc);
429 nblock_bc(cr, g->ngtc, g->annealing);
430 nblock_bc(cr, g->ngtc, g->anneal_npoints);
431 for (i = 0; (i < g->ngtc); i++)
433 n = g->anneal_npoints[i];
434 if (n > 0)
436 snew_bc(cr, g->anneal_time[i], n);
437 snew_bc(cr, g->anneal_temp[i], n);
438 nblock_bc(cr, n, g->anneal_time[i]);
439 nblock_bc(cr, n, g->anneal_temp[i]);
443 /* QMMM stuff, see inputrec */
444 block_bc(cr, g->ngQM);
445 snew_bc(cr, g->QMmethod, g->ngQM);
446 snew_bc(cr, g->QMbasis, g->ngQM);
447 snew_bc(cr, g->QMcharge, g->ngQM);
448 snew_bc(cr, g->QMmult, g->ngQM);
449 snew_bc(cr, g->bSH, g->ngQM);
450 snew_bc(cr, g->CASorbitals, g->ngQM);
451 snew_bc(cr, g->CASelectrons, g->ngQM);
452 snew_bc(cr, g->SAon, g->ngQM);
453 snew_bc(cr, g->SAoff, g->ngQM);
454 snew_bc(cr, g->SAsteps, g->ngQM);
456 if (g->ngQM)
458 nblock_bc(cr, g->ngQM, g->QMmethod);
459 nblock_bc(cr, g->ngQM, g->QMbasis);
460 nblock_bc(cr, g->ngQM, g->QMcharge);
461 nblock_bc(cr, g->ngQM, g->QMmult);
462 nblock_bc(cr, g->ngQM, g->bSH);
463 nblock_bc(cr, g->ngQM, g->CASorbitals);
464 nblock_bc(cr, g->ngQM, g->CASelectrons);
465 nblock_bc(cr, g->ngQM, g->SAon);
466 nblock_bc(cr, g->ngQM, g->SAoff);
467 nblock_bc(cr, g->ngQM, g->SAsteps);
468 /* end of QMMM stuff */
472 static void bc_cosines(const t_commrec *cr, t_cosines *cs)
474 block_bc(cr, cs->n);
475 snew_bc(cr, cs->a, cs->n);
476 snew_bc(cr, cs->phi, cs->n);
477 if (cs->n > 0)
479 nblock_bc(cr, cs->n, cs->a);
480 nblock_bc(cr, cs->n, cs->phi);
484 static void bc_pull_group(const t_commrec *cr, t_pull_group *pgrp)
486 block_bc(cr, *pgrp);
487 if (pgrp->nat > 0)
489 snew_bc(cr, pgrp->ind, pgrp->nat);
490 nblock_bc(cr, pgrp->nat, pgrp->ind);
492 if (pgrp->nweight > 0)
494 snew_bc(cr, pgrp->weight, pgrp->nweight);
495 nblock_bc(cr, pgrp->nweight, pgrp->weight);
499 static void bc_pull(const t_commrec *cr, pull_params_t *pull)
501 int g;
503 block_bc(cr, *pull);
504 snew_bc(cr, pull->group, pull->ngroup);
505 for (g = 0; g < pull->ngroup; g++)
507 bc_pull_group(cr, &pull->group[g]);
509 snew_bc(cr, pull->coord, pull->ncoord);
510 nblock_bc(cr, pull->ncoord, pull->coord);
513 static void bc_rotgrp(const t_commrec *cr, t_rotgrp *rotg)
515 block_bc(cr, *rotg);
516 if (rotg->nat > 0)
518 snew_bc(cr, rotg->ind, rotg->nat);
519 nblock_bc(cr, rotg->nat, rotg->ind);
520 snew_bc(cr, rotg->x_ref, rotg->nat);
521 nblock_bc(cr, rotg->nat, rotg->x_ref);
525 static void bc_rot(const t_commrec *cr, t_rot *rot)
527 int g;
529 block_bc(cr, *rot);
530 snew_bc(cr, rot->grp, rot->ngrp);
531 for (g = 0; g < rot->ngrp; g++)
533 bc_rotgrp(cr, &rot->grp[g]);
537 static void bc_adress(const t_commrec *cr, t_adress *adress)
539 block_bc(cr, *adress);
540 if (adress->n_tf_grps > 0)
542 snew_bc(cr, adress->tf_table_index, adress->n_tf_grps);
543 nblock_bc(cr, adress->n_tf_grps, adress->tf_table_index);
545 if (adress->n_energy_grps > 0)
547 snew_bc(cr, adress->group_explicit, adress->n_energy_grps);
548 nblock_bc(cr, adress->n_energy_grps, adress->group_explicit);
552 static void bc_imd(const t_commrec *cr, t_IMD *imd)
554 block_bc(cr, *imd);
555 snew_bc(cr, imd->ind, imd->nat);
556 nblock_bc(cr, imd->nat, imd->ind);
559 static void bc_fepvals(const t_commrec *cr, t_lambda *fep)
561 int i;
563 block_bc(cr, fep->nstdhdl);
564 block_bc(cr, fep->init_lambda);
565 block_bc(cr, fep->init_fep_state);
566 block_bc(cr, fep->delta_lambda);
567 block_bc(cr, fep->edHdLPrintEnergy);
568 block_bc(cr, fep->n_lambda);
569 if (fep->n_lambda > 0)
571 snew_bc(cr, fep->all_lambda, efptNR);
572 nblock_bc(cr, efptNR, fep->all_lambda);
573 for (i = 0; i < efptNR; i++)
575 snew_bc(cr, fep->all_lambda[i], fep->n_lambda);
576 nblock_bc(cr, fep->n_lambda, fep->all_lambda[i]);
579 block_bc(cr, fep->sc_alpha);
580 block_bc(cr, fep->sc_power);
581 block_bc(cr, fep->sc_r_power);
582 block_bc(cr, fep->sc_sigma);
583 block_bc(cr, fep->sc_sigma_min);
584 block_bc(cr, fep->bScCoul);
585 nblock_bc(cr, efptNR, &(fep->separate_dvdl[0]));
586 block_bc(cr, fep->dhdl_derivatives);
587 block_bc(cr, fep->dh_hist_size);
588 block_bc(cr, fep->dh_hist_spacing);
589 if (debug)
591 fprintf(debug, "after bc_fepvals\n");
595 static void bc_expandedvals(const t_commrec *cr, t_expanded *expand, int n_lambda)
597 block_bc(cr, expand->nstexpanded);
598 block_bc(cr, expand->elamstats);
599 block_bc(cr, expand->elmcmove);
600 block_bc(cr, expand->elmceq);
601 block_bc(cr, expand->equil_n_at_lam);
602 block_bc(cr, expand->equil_wl_delta);
603 block_bc(cr, expand->equil_ratio);
604 block_bc(cr, expand->equil_steps);
605 block_bc(cr, expand->equil_samples);
606 block_bc(cr, expand->lmc_seed);
607 block_bc(cr, expand->minvar);
608 block_bc(cr, expand->minvar_const);
609 block_bc(cr, expand->c_range);
610 block_bc(cr, expand->bSymmetrizedTMatrix);
611 block_bc(cr, expand->nstTij);
612 block_bc(cr, expand->lmc_repeats);
613 block_bc(cr, expand->lmc_forced_nstart);
614 block_bc(cr, expand->gibbsdeltalam);
615 block_bc(cr, expand->wl_scale);
616 block_bc(cr, expand->wl_ratio);
617 block_bc(cr, expand->init_wl_delta);
618 block_bc(cr, expand->bInit_weights);
619 snew_bc(cr, expand->init_lambda_weights, n_lambda);
620 nblock_bc(cr, n_lambda, expand->init_lambda_weights);
621 block_bc(cr, expand->mc_temp);
622 if (debug)
624 fprintf(debug, "after bc_expandedvals\n");
628 static void bc_simtempvals(const t_commrec *cr, t_simtemp *simtemp, int n_lambda)
630 block_bc(cr, simtemp->simtemp_low);
631 block_bc(cr, simtemp->simtemp_high);
632 block_bc(cr, simtemp->eSimTempScale);
633 snew_bc(cr, simtemp->temperatures, n_lambda);
634 nblock_bc(cr, n_lambda, simtemp->temperatures);
635 if (debug)
637 fprintf(debug, "after bc_simtempvals\n");
642 static void bc_swapions(const t_commrec *cr, t_swapcoords *swap)
644 block_bc(cr, *swap);
646 /* Broadcast atom indices for split groups, solvent group, and for all user-defined swap groups */
647 snew_bc(cr, swap->grp, swap->ngrp);
648 for (int i = 0; i < swap->ngrp; i++)
650 t_swapGroup *g = &swap->grp[i];
652 block_bc(cr, *g);
653 snew_bc(cr, g->ind, g->nat);
654 nblock_bc(cr, g->nat, g->ind);
656 int len = 0;
657 if (MASTER(cr))
659 len = strlen(g->molname);
661 block_bc(cr, len);
662 snew_bc(cr, g->molname, len);
663 nblock_bc(cr, len, g->molname);
668 static void bc_inputrec(const t_commrec *cr, t_inputrec *inputrec)
670 int i;
672 block_bc(cr, *inputrec);
674 bc_grpopts(cr, &(inputrec->opts));
676 /* even if efep is efepNO, we need to initialize to make sure that
677 * n_lambda is set to zero */
679 snew_bc(cr, inputrec->fepvals, 1);
680 if (inputrec->efep != efepNO || inputrec->bSimTemp)
682 bc_fepvals(cr, inputrec->fepvals);
684 /* need to initialize this as well because of data checked for in the logic */
685 snew_bc(cr, inputrec->expandedvals, 1);
686 if (inputrec->bExpanded)
688 bc_expandedvals(cr, inputrec->expandedvals, inputrec->fepvals->n_lambda);
690 snew_bc(cr, inputrec->simtempvals, 1);
691 if (inputrec->bSimTemp)
693 bc_simtempvals(cr, inputrec->simtempvals, inputrec->fepvals->n_lambda);
695 if (inputrec->bPull)
697 snew_bc(cr, inputrec->pull, 1);
698 bc_pull(cr, inputrec->pull);
700 if (inputrec->bRot)
702 snew_bc(cr, inputrec->rot, 1);
703 bc_rot(cr, inputrec->rot);
705 if (inputrec->bIMD)
707 snew_bc(cr, inputrec->imd, 1);
708 bc_imd(cr, inputrec->imd);
710 for (i = 0; (i < DIM); i++)
712 bc_cosines(cr, &(inputrec->ex[i]));
713 bc_cosines(cr, &(inputrec->et[i]));
715 if (inputrec->eSwapCoords != eswapNO)
717 snew_bc(cr, inputrec->swap, 1);
718 bc_swapions(cr, inputrec->swap);
720 if (inputrec->bAdress)
722 snew_bc(cr, inputrec->adress, 1);
723 bc_adress(cr, inputrec->adress);
727 static void bc_moltype(const t_commrec *cr, t_symtab *symtab,
728 gmx_moltype_t *moltype)
730 bc_string(cr, symtab, &moltype->name);
731 bc_atoms(cr, symtab, &moltype->atoms);
732 if (debug)
734 fprintf(debug, "after bc_atoms\n");
737 bc_ilists(cr, moltype->ilist);
738 bc_block(cr, &moltype->cgs);
739 bc_blocka(cr, &moltype->excls);
742 static void bc_molblock(const t_commrec *cr, gmx_molblock_t *molb)
744 block_bc(cr, molb->type);
745 block_bc(cr, molb->nmol);
746 block_bc(cr, molb->natoms_mol);
747 block_bc(cr, molb->nposres_xA);
748 if (molb->nposres_xA > 0)
750 snew_bc(cr, molb->posres_xA, molb->nposres_xA);
751 nblock_bc(cr, molb->nposres_xA*DIM, molb->posres_xA[0]);
753 block_bc(cr, molb->nposres_xB);
754 if (molb->nposres_xB > 0)
756 snew_bc(cr, molb->posres_xB, molb->nposres_xB);
757 nblock_bc(cr, molb->nposres_xB*DIM, molb->posres_xB[0]);
759 if (debug)
761 fprintf(debug, "after bc_molblock\n");
765 static void bc_atomtypes(const t_commrec *cr, t_atomtypes *atomtypes)
767 int nr;
769 block_bc(cr, atomtypes->nr);
771 nr = atomtypes->nr;
773 snew_bc(cr, atomtypes->radius, nr);
774 snew_bc(cr, atomtypes->vol, nr);
775 snew_bc(cr, atomtypes->surftens, nr);
776 snew_bc(cr, atomtypes->gb_radius, nr);
777 snew_bc(cr, atomtypes->S_hct, nr);
779 nblock_bc(cr, nr, atomtypes->radius);
780 nblock_bc(cr, nr, atomtypes->vol);
781 nblock_bc(cr, nr, atomtypes->surftens);
782 nblock_bc(cr, nr, atomtypes->gb_radius);
783 nblock_bc(cr, nr, atomtypes->S_hct);
786 /*! \brief Broadcasts ir and mtop from the master to all nodes in
787 * cr->mpi_comm_mygroup. */
788 static
789 void bcast_ir_mtop(const t_commrec *cr, t_inputrec *inputrec, gmx_mtop_t *mtop)
791 int i;
792 if (debug)
794 fprintf(debug, "in bc_data\n");
796 bc_inputrec(cr, inputrec);
797 if (debug)
799 fprintf(debug, "after bc_inputrec\n");
801 bc_symtab(cr, &mtop->symtab);
802 if (debug)
804 fprintf(debug, "after bc_symtab\n");
806 bc_string(cr, &mtop->symtab, &mtop->name);
807 if (debug)
809 fprintf(debug, "after bc_name\n");
812 bc_ffparams(cr, &mtop->ffparams);
814 block_bc(cr, mtop->nmoltype);
815 snew_bc(cr, mtop->moltype, mtop->nmoltype);
816 for (i = 0; i < mtop->nmoltype; i++)
818 bc_moltype(cr, &mtop->symtab, &mtop->moltype[i]);
821 block_bc(cr, mtop->bIntermolecularInteractions);
822 if (mtop->bIntermolecularInteractions)
824 snew_bc(cr, mtop->intermolecular_ilist, F_NRE);
825 bc_ilists(cr, mtop->intermolecular_ilist);
828 block_bc(cr, mtop->nmolblock);
829 snew_bc(cr, mtop->molblock, mtop->nmolblock);
830 for (i = 0; i < mtop->nmolblock; i++)
832 bc_molblock(cr, &mtop->molblock[i]);
835 block_bc(cr, mtop->natoms);
837 bc_atomtypes(cr, &mtop->atomtypes);
839 bc_block(cr, &mtop->mols);
840 bc_groups(cr, &mtop->symtab, mtop->natoms, &mtop->groups);
843 void init_parallel(t_commrec *cr, t_inputrec *inputrec,
844 gmx_mtop_t *mtop)
846 bcast_ir_mtop(cr, inputrec, mtop);