Several issues with ArrayRefs from nullptr have been found by UBSAN.
const int numPmeAtoms = numHomeAtoms - fr->n_tpi;
gmx_pme_reinit_atoms(fr->pmedata,
numPmeAtoms,
- gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr));
+ mdatoms->chargeA ? gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->chargeB ? gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr)
+ : gmx::ArrayRef<real>{});
}
if (constr)
if (!thisRankHasDuty(cr, DUTY_PME))
{
/* Send the charges and/or c6/sigmas to our PME only node */
- gmx_pme_send_parameters(cr,
- *fr->ic,
- mdatoms->nChargePerturbed != 0,
- mdatoms->nTypePerturbed != 0,
- gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr),
- mdatoms->chargeB ? gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr)
- : gmx::ArrayRef<real>{},
- gmx::arrayRefFromArray(mdatoms->sqrt_c6A, mdatoms->nr),
- mdatoms->sqrt_c6B ? gmx::arrayRefFromArray(mdatoms->sqrt_c6B, mdatoms->nr)
- : gmx::ArrayRef<real>{},
- gmx::arrayRefFromArray(mdatoms->sigmaA, mdatoms->nr),
- mdatoms->sigmaB ? gmx::arrayRefFromArray(mdatoms->sigmaB, mdatoms->nr)
- : gmx::ArrayRef<real>{},
- dd_pme_maxshift_x(*dd),
- dd_pme_maxshift_y(*dd));
+ gmx_pme_send_parameters(
+ cr,
+ *fr->ic,
+ mdatoms->nChargePerturbed != 0,
+ mdatoms->nTypePerturbed != 0,
+ mdatoms->chargeA ? gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->chargeB ? gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->sqrt_c6A ? gmx::arrayRefFromArray(mdatoms->sqrt_c6A, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->sqrt_c6B ? gmx::arrayRefFromArray(mdatoms->sqrt_c6B, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->sigmaA ? gmx::arrayRefFromArray(mdatoms->sigmaA, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->sigmaB ? gmx::arrayRefFromArray(mdatoms->sigmaB, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ dd_pme_maxshift_x(*dd),
+ dd_pme_maxshift_y(*dd));
}
if (dd->atomSets != nullptr)
pbc,
lambda.data(),
dvdl.data(),
- gmx::arrayRefFromArray(md->chargeA, md->nr),
- gmx::arrayRefFromArray(md->chargeB, md->nr),
+ md->chargeA ? gmx::arrayRefFromArray(md->chargeA, md->nr) : gmx::ArrayRef<real>{},
+ md->chargeB ? gmx::arrayRefFromArray(md->chargeB, md->nr) : gmx::ArrayRef<real>{},
md->bPerturbed ? gmx::arrayRefFromArray(md->bPerturbed, md->nr) : gmx::ArrayRef<bool>(),
gmx::arrayRefFromArray(md->cENER, md->nr),
md->nPerturbed,
t,
*fr,
ir,
- gmx::constArrayRefFromArray(md->chargeA, md->nr),
- gmx::constArrayRefFromArray(md->chargeB, md->nr),
+ md->chargeA ? gmx::constArrayRefFromArray(md->chargeA, md->nr)
+ : gmx::ArrayRef<const real>{},
+ md->chargeB ? gmx::constArrayRefFromArray(md->chargeB, md->nr)
+ : gmx::ArrayRef<const real>{},
(md->nChargePerturbed != 0),
coordinates,
box,
fr->pmedata,
gmx::constArrayRefFromArray(coordinates.data(), md->homenr - fr->n_tpi),
forceWithVirial->force_,
- gmx::constArrayRefFromArray(md->chargeA, md->nr),
- gmx::constArrayRefFromArray(md->chargeB, md->nr),
- gmx::constArrayRefFromArray(md->sqrt_c6A, md->nr),
- gmx::constArrayRefFromArray(md->sqrt_c6B, md->nr),
- gmx::constArrayRefFromArray(md->sigmaA, md->nr),
- gmx::constArrayRefFromArray(md->sigmaB, md->nr),
+ md->chargeA ? gmx::constArrayRefFromArray(md->chargeA, md->nr)
+ : gmx::ArrayRef<const real>{},
+ md->chargeB ? gmx::constArrayRefFromArray(md->chargeB, md->nr)
+ : gmx::ArrayRef<const real>{},
+ md->sqrt_c6A ? gmx::constArrayRefFromArray(md->sqrt_c6A, md->nr)
+ : gmx::ArrayRef<const real>{},
+ md->sqrt_c6B ? gmx::constArrayRefFromArray(md->sqrt_c6B, md->nr)
+ : gmx::ArrayRef<const real>{},
+ md->sigmaA ? gmx::constArrayRefFromArray(md->sigmaA, md->nr)
+ : gmx::ArrayRef<const real>{},
+ md->sigmaB ? gmx::constArrayRefFromArray(md->sigmaB, md->nr)
+ : gmx::ArrayRef<const real>{},
box,
cr,
DOMAINDECOMP(cr) ? dd_pme_maxshift_x(*cr->dd) : 0,
calc_mu(start,
mdatoms->homenr,
xRef,
- gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr),
+ mdatoms->chargeA ? gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->chargeB ? gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
mdatoms->nChargePerturbed != 0,
dipoleData.muStaging[0],
dipoleData.muStaging[1]);
/* Calculate the local and non-local free energy interactions here.
* Happens here on the CPU both with and without GPU.
*/
- nbv->dispatchFreeEnergyKernel(InteractionLocality::Local,
- *fr,
- x.unpaddedArrayRef(),
- &forceOutNonbonded->forceWithShiftForces(),
- gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->typeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->typeB, mdatoms->nr),
- inputrec.fepvals.get(),
- lambda,
- enerd,
- stepWork,
- nrnb);
+ nbv->dispatchFreeEnergyKernel(
+ InteractionLocality::Local,
+ *fr,
+ x.unpaddedArrayRef(),
+ &forceOutNonbonded->forceWithShiftForces(),
+ mdatoms->chargeA ? gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->chargeB ? gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->typeA ? gmx::arrayRefFromArray(mdatoms->typeA, mdatoms->nr)
+ : gmx::ArrayRef<int>{},
+ mdatoms->typeB ? gmx::arrayRefFromArray(mdatoms->typeB, mdatoms->nr)
+ : gmx::ArrayRef<int>{},
+ inputrec.fepvals.get(),
+ lambda,
+ enerd,
+ stepWork,
+ nrnb);
if (havePPDomainDecomposition(cr))
{
- nbv->dispatchFreeEnergyKernel(InteractionLocality::NonLocal,
- *fr,
- x.unpaddedArrayRef(),
- &forceOutNonbonded->forceWithShiftForces(),
- gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->typeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->typeB, mdatoms->nr),
- inputrec.fepvals.get(),
- lambda,
- enerd,
- stepWork,
- nrnb);
+ nbv->dispatchFreeEnergyKernel(
+ InteractionLocality::NonLocal,
+ *fr,
+ x.unpaddedArrayRef(),
+ &forceOutNonbonded->forceWithShiftForces(),
+ mdatoms->chargeA ? gmx::arrayRefFromArray(mdatoms->chargeA, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->chargeB ? gmx::arrayRefFromArray(mdatoms->chargeB, mdatoms->nr)
+ : gmx::ArrayRef<real>{},
+ mdatoms->typeA ? gmx::arrayRefFromArray(mdatoms->typeA, mdatoms->nr)
+ : gmx::ArrayRef<int>{},
+ mdatoms->typeB ? gmx::arrayRefFromArray(mdatoms->typeB, mdatoms->nr)
+ : gmx::ArrayRef<int>{},
+ inputrec.fepvals.get(),
+ lambda,
+ enerd,
+ stepWork,
+ nrnb);
}
}
real dvdl_walls = do_walls(inputrec,
*fr,
box,
- gmx::arrayRefFromArray(mdatoms->typeA, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->typeB, mdatoms->nr),
- gmx::arrayRefFromArray(mdatoms->cENER, mdatoms->nr),
+ mdatoms->typeA ? gmx::arrayRefFromArray(mdatoms->typeA, mdatoms->nr)
+ : gmx::ArrayRef<int>{},
+ mdatoms->typeB ? gmx::arrayRefFromArray(mdatoms->typeB, mdatoms->nr)
+ : gmx::ArrayRef<int>{},
+ mdatoms->cENER ? gmx::arrayRefFromArray(mdatoms->cENER, mdatoms->nr)
+ : gmx::ArrayRef<unsigned short>{},
mdatoms->homenr,
mdatoms->nPerturbed,
x.unpaddedConstArrayRef(),
step,
testData->mdAtoms_.homenr,
testData->mdAtoms_.havePartiallyFrozenAtoms,
- gmx::arrayRefFromArray(testData->mdAtoms_.ptype, testData->mdAtoms_.nr),
- gmx::arrayRefFromArray(testData->mdAtoms_.invmass, testData->mdAtoms_.nr),
- gmx::arrayRefFromArray(testData->mdAtoms_.invMassPerDim, testData->mdAtoms_.nr),
+ testData->mdAtoms_.ptype
+ ? gmx::arrayRefFromArray(testData->mdAtoms_.ptype, testData->mdAtoms_.nr)
+ : gmx::ArrayRef<ParticleType>{},
+ testData->mdAtoms_.invmass
+ ? gmx::arrayRefFromArray(testData->mdAtoms_.invmass, testData->mdAtoms_.nr)
+ : gmx::ArrayRef<real>{},
+ testData->mdAtoms_.invMassPerDim ? gmx::arrayRefFromArray(testData->mdAtoms_.invMassPerDim,
+ testData->mdAtoms_.nr)
+ : gmx::ArrayRef<rvec>{},
&testData->state_,
testData->f_,
testData->forceCalculationData_,