NAMD
Public Member Functions | Public Attributes | List of all members
msm::Map Struct Reference

#include <MsmMap.h>

Public Member Functions

Ivec clipIndexToLevel (const Ivec &n, int level) const
 
BlockIndex blockOfGridIndex (const Ivec &n, int level) const
 
BlockIndex blockOfGridIndexFold (const Ivec &n, int level) const
 
IndexRange indexRangeOfBlock (const BlockIndex &nb) const
 
IndexRange indexRangeOfBlockFold (const BlockIndex &nb) const
 
IndexRange clipBlockToIndexRange (const BlockIndex &nb, const IndexRange &nrange) const
 
IndexRange clipBlockToIndexRangeFold (const BlockIndex &nb, const IndexRange &nrange) const
 
void wrapBlockSend (BlockSend &bs) const
 
void wrapBlockSendFold (BlockSend &bs) const
 
void wrapBlockIndex (BlockIndex &bn) const
 

Public Attributes

Array< IndexRangegridrange
 
Array< Grid< Float > > gc
 
Array< Grid< Float > > gvc
 
Grid< Floatgrespro
 
Array< Grid< C1Matrix > > gc_c1hermite
 
Array< Grid< C1Matrix > > gvc_c1hermite
 
Array< Grid< C1Matrix > > gres_c1hermite
 
Array< Grid< C1Matrix > > gpro_c1hermite
 
Array< PatchDiagrampatchList
 
Array< Grid< BlockDiagram > > blockLevel
 
int ispx
 
int ispy
 
int ispz
 
Array< int > bsx
 
Array< int > bsy
 
Array< int > bsz
 
Array< FoldFactorfoldfactor
 

Detailed Description

Definition at line 941 of file MsmMap.h.

Member Function Documentation

BlockIndex msm::Map::blockOfGridIndex ( const Ivec n,
int  level 
) const
inline

Definition at line 991 of file MsmMap.h.

References ASSERT, bsx, bsy, bsz, gridrange, msm::Ivec::i, msm::Ivec::j, and msm::Ivec::k.

Referenced by MsmGridCutoffKernel< Float, Float >::setup().

991  {
992  ASSERT(level >= 0 && level < gridrange.len());
993  BlockIndex bn;
994  // we want floor((i - ia) / bsx), etc.
995  // modify case i < ia to avoid integer division of negative numbers
996  int d = n.i - gridrange[level].ia();
997  bn.n.i = (d >= 0 ? d / bsx[level] : -((-d+bsx[level]-1) / bsx[level]));
998  d = n.j - gridrange[level].ja();
999  bn.n.j = (d >= 0 ? d / bsy[level] : -((-d+bsy[level]-1) / bsy[level]));
1000  d = n.k - gridrange[level].ka();
1001  bn.n.k = (d >= 0 ? d / bsz[level] : -((-d+bsz[level]-1) / bsz[level]));
1002  bn.level = level;
1003  return bn;
1004  }
Array< int > bsz
Definition: MsmMap.h:960
#define ASSERT(expr)
Definition: MsmMap.h:68
Array< int > bsy
Definition: MsmMap.h:960
Array< int > bsx
Definition: MsmMap.h:960
Array< IndexRange > gridrange
Definition: MsmMap.h:942
BlockIndex msm::Map::blockOfGridIndexFold ( const Ivec n,
int  level 
) const
inline

Definition at line 1008 of file MsmMap.h.

References ASSERT, bsx, bsy, bsz, foldfactor, gridrange, msm::Ivec::i, msm::Ivec::j, and msm::Ivec::k.

1008  {
1009  ASSERT(level >= 0 && level < gridrange.len());
1010  BlockIndex bn;
1011  int bsi = foldfactor[level].numrep.i * bsx[level];
1012  int bsj = foldfactor[level].numrep.j * bsy[level];
1013  int bsk = foldfactor[level].numrep.k * bsz[level];
1014  // we want floor((i - ia) / bsx), etc.
1015  // modify case i < ia to avoid integer division of negative numbers
1016  int d = n.i - gridrange[level].ia();
1017  bn.n.i = (d >= 0 ? d / bsi : -((-d+bsi-1) / bsi));
1018  d = n.j - gridrange[level].ja();
1019  bn.n.j = (d >= 0 ? d / bsj : -((-d+bsj-1) / bsj));
1020  d = n.k - gridrange[level].ka();
1021  bn.n.k = (d >= 0 ? d / bsk : -((-d+bsk-1) / bsk));
1022  bn.level = level;
1023  return bn;
1024  }
Array< int > bsz
Definition: MsmMap.h:960
#define ASSERT(expr)
Definition: MsmMap.h:68
Array< int > bsy
Definition: MsmMap.h:960
Array< int > bsx
Definition: MsmMap.h:960
Array< IndexRange > gridrange
Definition: MsmMap.h:942
Array< FoldFactor > foldfactor
Definition: MsmMap.h:962
IndexRange msm::Map::clipBlockToIndexRange ( const BlockIndex nb,
const IndexRange nrange 
) const
inline

Definition at line 1053 of file MsmMap.h.

References msm::IndexRange::ia(), msm::IndexRange::ib(), indexRangeOfBlock(), msm::IndexRange::ja(), msm::IndexRange::jb(), msm::IndexRange::ka(), msm::IndexRange::kb(), and msm::IndexRange::setbounds().

1054  {
1055  IndexRange nr = indexRangeOfBlock(nb);
1056  int nia = nrange.ia();
1057  int nib = nrange.ib();
1058  int nja = nrange.ja();
1059  int njb = nrange.jb();
1060  int nka = nrange.ka();
1061  int nkb = nrange.kb();
1062  int ia = nr.ia();
1063  if (ia < nia) ia = nia;
1064  int ib = nr.ib();
1065  if (ib > nib) ib = nib;
1066  int ja = nr.ja();
1067  if (ja < nja) ja = nja;
1068  int jb = nr.jb();
1069  if (jb > njb) jb = njb;
1070  int ka = nr.ka();
1071  if (ka < nka) ka = nka;
1072  int kb = nr.kb();
1073  if (kb > nkb) kb = nkb;
1074  nr.setbounds(ia, ib, ja, jb, ka, kb);
1075  return nr;
1076  }
IndexRange indexRangeOfBlock(const BlockIndex &nb) const
Definition: MsmMap.h:1027
IndexRange msm::Map::clipBlockToIndexRangeFold ( const BlockIndex nb,
const IndexRange nrange 
) const
inline

Definition at line 1080 of file MsmMap.h.

References msm::IndexRange::ia(), msm::IndexRange::ib(), indexRangeOfBlockFold(), msm::IndexRange::ja(), msm::IndexRange::jb(), msm::IndexRange::ka(), msm::IndexRange::kb(), and msm::IndexRange::setbounds().

1081  {
1082  IndexRange nr = indexRangeOfBlockFold(nb);
1083  int nia = nrange.ia();
1084  int nib = nrange.ib();
1085  int nja = nrange.ja();
1086  int njb = nrange.jb();
1087  int nka = nrange.ka();
1088  int nkb = nrange.kb();
1089  int ia = nr.ia();
1090  if (ia < nia) ia = nia;
1091  int ib = nr.ib();
1092  if (ib > nib) ib = nib;
1093  int ja = nr.ja();
1094  if (ja < nja) ja = nja;
1095  int jb = nr.jb();
1096  if (jb > njb) jb = njb;
1097  int ka = nr.ka();
1098  if (ka < nka) ka = nka;
1099  int kb = nr.kb();
1100  if (kb > nkb) kb = nkb;
1101  nr.setbounds(ia, ib, ja, jb, ka, kb);
1102  return nr;
1103  }
IndexRange indexRangeOfBlockFold(const BlockIndex &nb) const
Definition: MsmMap.h:1039
Ivec msm::Map::clipIndexToLevel ( const Ivec n,
int  level 
) const
inline

Definition at line 966 of file MsmMap.h.

References ASSERT, gridrange, ispx, ispy, and ispz.

966  {
967  ASSERT(level >= 0 && level < gridrange.len());
968  Ivec pn(n);
969  if ( ! ispx) {
970  int a = gridrange[level].ia();
971  int b = gridrange[level].ib();
972  if (pn.i < a) pn.i = a;
973  if (pn.i > b) pn.i = b;
974  }
975  if ( ! ispy) {
976  int a = gridrange[level].ja();
977  int b = gridrange[level].jb();
978  if (pn.j < a) pn.j = a;
979  if (pn.j > b) pn.j = b;
980  }
981  if ( ! ispz) {
982  int a = gridrange[level].ka();
983  int b = gridrange[level].kb();
984  if (pn.k < a) pn.k = a;
985  if (pn.k > b) pn.k = b;
986  }
987  return pn;
988  }
#define ASSERT(expr)
Definition: MsmMap.h:68
int ispx
Definition: MsmMap.h:958
int ispy
Definition: MsmMap.h:958
int ispz
Definition: MsmMap.h:958
Array< IndexRange > gridrange
Definition: MsmMap.h:942
IndexRange msm::Map::indexRangeOfBlock ( const BlockIndex nb) const
inline

Definition at line 1027 of file MsmMap.h.

References ASSERT, bsx, bsy, bsz, gridrange, msm::Ivec::i, msm::Ivec::j, msm::Ivec::k, msm::BlockIndex::level, and msm::BlockIndex::n.

Referenced by clipBlockToIndexRange().

1027  {
1028  ASSERT(nb.level >= 0 && nb.level < gridrange.len());
1029  IndexRange nr;
1030  int ia = nb.n.i * bsx[nb.level] + gridrange[nb.level].ia();
1031  int ja = nb.n.j * bsy[nb.level] + gridrange[nb.level].ja();
1032  int ka = nb.n.k * bsz[nb.level] + gridrange[nb.level].ka();
1033  nr.set(ia, bsx[nb.level], ja, bsy[nb.level], ka, bsz[nb.level]);
1034  return nr;
1035  }
Array< int > bsz
Definition: MsmMap.h:960
#define ASSERT(expr)
Definition: MsmMap.h:68
Array< int > bsy
Definition: MsmMap.h:960
Array< int > bsx
Definition: MsmMap.h:960
Array< IndexRange > gridrange
Definition: MsmMap.h:942
IndexRange msm::Map::indexRangeOfBlockFold ( const BlockIndex nb) const
inline

Definition at line 1039 of file MsmMap.h.

References ASSERT, bsx, bsy, bsz, foldfactor, gridrange, msm::Ivec::i, msm::Ivec::j, msm::Ivec::k, msm::BlockIndex::level, msm::BlockIndex::n, and msm::IndexRange::set().

Referenced by clipBlockToIndexRangeFold().

1039  {
1040  ASSERT(nb.level >= 0 && nb.level < gridrange.len());
1041  int bsi = foldfactor[nb.level].numrep.i * bsx[nb.level];
1042  int bsj = foldfactor[nb.level].numrep.j * bsy[nb.level];
1043  int bsk = foldfactor[nb.level].numrep.k * bsz[nb.level];
1044  IndexRange nr;
1045  int ia = nb.n.i * bsi + gridrange[nb.level].ia();
1046  int ja = nb.n.j * bsj + gridrange[nb.level].ja();
1047  int ka = nb.n.k * bsk + gridrange[nb.level].ka();
1048  nr.set(ia, bsi, ja, bsj, ka, bsk);
1049  return nr;
1050  }
Array< int > bsz
Definition: MsmMap.h:960
#define ASSERT(expr)
Definition: MsmMap.h:68
Array< int > bsy
Definition: MsmMap.h:960
Array< int > bsx
Definition: MsmMap.h:960
Array< IndexRange > gridrange
Definition: MsmMap.h:942
Array< FoldFactor > foldfactor
Definition: MsmMap.h:962
void msm::Map::wrapBlockIndex ( BlockIndex bn) const
inline

Definition at line 1214 of file MsmMap.h.

References blockLevel, msm::Ivec::i, ispx, ispy, ispz, msm::Ivec::j, msm::Ivec::k, msm::BlockIndex::level, and msm::BlockIndex::n.

Referenced by MsmGridCutoffKernel< Float, Float >::setup().

1214  {
1215  int level = bn.level;
1216  int ni = blockLevel[level].ni();
1217  int nj = blockLevel[level].nj();
1218  int nk = blockLevel[level].nk();
1219  if (ispx) {
1220  while (bn.n.i < 0) {
1221  bn.n.i += ni;
1222  }
1223  while (bn.n.i >= ni) {
1224  bn.n.i -= ni;
1225  }
1226  }
1227  if (ispy) {
1228  while (bn.n.j < 0) {
1229  bn.n.j += nj;
1230  }
1231  while (bn.n.j >= nj) {
1232  bn.n.j -= nj;
1233  }
1234  }
1235  if (ispz) {
1236  while (bn.n.k < 0) {
1237  bn.n.k += nk;
1238  }
1239  while (bn.n.k >= nk) {
1240  bn.n.k -= nk;
1241  }
1242  }
1243  }
int ispx
Definition: MsmMap.h:958
int ispy
Definition: MsmMap.h:958
int ispz
Definition: MsmMap.h:958
Array< Grid< BlockDiagram > > blockLevel
Definition: MsmMap.h:956
void msm::Map::wrapBlockSend ( BlockSend bs) const
inline

Definition at line 1106 of file MsmMap.h.

References ASSERT, blockLevel, bsx, bsy, bsz, msm::Ivec::i, msm::IndexRange::ia(), msm::IndexRange::ib(), ispx, ispy, ispz, msm::Ivec::j, msm::IndexRange::ja(), msm::IndexRange::jb(), msm::Ivec::k, msm::IndexRange::ka(), msm::IndexRange::kb(), msm::BlockIndex::level, msm::BlockIndex::n, msm::BlockSend::nblock, msm::BlockSend::nblock_wrap, msm::BlockSend::nrange, msm::BlockSend::nrange_wrap, and msm::IndexRange::setbounds().

1106  {
1107  BlockIndex nb = bs.nblock;
1108  IndexRange nr = bs.nrange;
1109  int level = bs.nblock.level;
1110  ASSERT(level >= 0 && level < blockLevel.len());
1111  int ni = blockLevel[level].ni();
1112  int nj = blockLevel[level].nj();
1113  int nk = blockLevel[level].nk();
1114  int di=0, dj=0, dk=0;
1115  if (ispx) {
1116  while (nb.n.i < 0) {
1117  nb.n.i += ni;
1118  di += ni * bsx[level];
1119  }
1120  while (nb.n.i >= ni) {
1121  nb.n.i -= ni;
1122  di -= ni * bsx[level];
1123  }
1124  }
1125  if (ispy) {
1126  while (nb.n.j < 0) {
1127  nb.n.j += nj;
1128  dj += nj * bsy[level];
1129  }
1130  while (nb.n.j >= nj) {
1131  nb.n.j -= nj;
1132  dj -= nj * bsy[level];
1133  }
1134  }
1135  if (ispz) {
1136  while (nb.n.k < 0) {
1137  nb.n.k += nk;
1138  dk += nk * bsz[level];
1139  }
1140  while (nb.n.k >= nk) {
1141  nb.n.k -= nk;
1142  dk -= nk * bsz[level];
1143  }
1144  }
1145  int ia = nr.ia();
1146  int ib = nr.ib();
1147  int ja = nr.ja();
1148  int jb = nr.jb();
1149  int ka = nr.ka();
1150  int kb = nr.kb();
1151  nr.setbounds(ia + di, ib + di, ja + dj, jb + dj, ka + dk, kb + dk);
1152  bs.nblock_wrap = nb;
1153  bs.nrange_wrap = nr;
1154  }
Array< int > bsz
Definition: MsmMap.h:960
#define ASSERT(expr)
Definition: MsmMap.h:68
Array< int > bsy
Definition: MsmMap.h:960
int ispx
Definition: MsmMap.h:958
int ispy
Definition: MsmMap.h:958
int ispz
Definition: MsmMap.h:958
Array< Grid< BlockDiagram > > blockLevel
Definition: MsmMap.h:956
Array< int > bsx
Definition: MsmMap.h:960
void msm::Map::wrapBlockSendFold ( BlockSend bs) const
inline

Definition at line 1158 of file MsmMap.h.

References ASSERT, blockLevel, bsx, bsy, bsz, foldfactor, msm::Ivec::i, msm::IndexRange::ia(), msm::IndexRange::ib(), ispx, ispy, ispz, msm::Ivec::j, msm::IndexRange::ja(), msm::IndexRange::jb(), msm::Ivec::k, msm::IndexRange::ka(), msm::IndexRange::kb(), msm::BlockIndex::level, msm::BlockIndex::n, msm::BlockSend::nblock, msm::BlockSend::nblock_wrap, msm::BlockSend::nrange, msm::BlockSend::nrange_wrap, and msm::IndexRange::setbounds().

1158  {
1159  BlockIndex nb = bs.nblock;
1160  IndexRange nr = bs.nrange;
1161  int level = bs.nblock.level;
1162  ASSERT(level >= 0 && level < blockLevel.len());
1163  int foldi = foldfactor[level].numrep.i;
1164  int foldj = foldfactor[level].numrep.j;
1165  int foldk = foldfactor[level].numrep.k;
1166  int ni = blockLevel[level].ni();
1167  int nj = blockLevel[level].nj();
1168  int nk = blockLevel[level].nk();
1169  int bsi = foldi * bsx[level];
1170  int bsj = foldj * bsy[level];
1171  int bsk = foldk * bsz[level];
1172  int di=0, dj=0, dk=0;
1173  if (ispx) {
1174  while (nb.n.i < 0) {
1175  nb.n.i += ni;
1176  di += ni * bsi;
1177  }
1178  while (nb.n.i >= ni) {
1179  nb.n.i -= ni;
1180  di -= ni * bsi;
1181  }
1182  }
1183  if (ispy) {
1184  while (nb.n.j < 0) {
1185  nb.n.j += nj;
1186  dj += nj * bsj;
1187  }
1188  while (nb.n.j >= nj) {
1189  nb.n.j -= nj;
1190  dj -= nj * bsj;
1191  }
1192  }
1193  if (ispz) {
1194  while (nb.n.k < 0) {
1195  nb.n.k += nk;
1196  dk += nk * bsk;
1197  }
1198  while (nb.n.k >= nk) {
1199  nb.n.k -= nk;
1200  dk -= nk * bsk;
1201  }
1202  }
1203  int ia = nr.ia();
1204  int ib = nr.ib();
1205  int ja = nr.ja();
1206  int jb = nr.jb();
1207  int ka = nr.ka();
1208  int kb = nr.kb();
1209  nr.setbounds(ia + di, ib + di, ja + dj, jb + dj, ka + dk, kb + dk);
1210  bs.nblock_wrap = nb;
1211  bs.nrange_wrap = nr;
1212  }
Array< int > bsz
Definition: MsmMap.h:960
#define ASSERT(expr)
Definition: MsmMap.h:68
Array< int > bsy
Definition: MsmMap.h:960
int ispx
Definition: MsmMap.h:958
int ispy
Definition: MsmMap.h:958
int ispz
Definition: MsmMap.h:958
Array< Grid< BlockDiagram > > blockLevel
Definition: MsmMap.h:956
Array< int > bsx
Definition: MsmMap.h:960
Array< FoldFactor > foldfactor
Definition: MsmMap.h:962

Member Data Documentation

Array<Grid<BlockDiagram> > msm::Map::blockLevel
Array<int> msm::Map::bsx
Array<int> msm::Map::bsy
Array<int> msm::Map::bsz
Array<FoldFactor> msm::Map::foldfactor
Array<Grid<Float> > msm::Map::gc
Array<Grid<C1Matrix> > msm::Map::gc_c1hermite
Array<Grid<C1Matrix> > msm::Map::gpro_c1hermite

Definition at line 952 of file MsmMap.h.

Referenced by ComputeMsmMgr::initialize(), and MsmC1HermiteBlock::MsmC1HermiteBlock().

Array<Grid<C1Matrix> > msm::Map::gres_c1hermite

Definition at line 951 of file MsmMap.h.

Referenced by ComputeMsmMgr::initialize(), and MsmC1HermiteBlock::MsmC1HermiteBlock().

Grid<Float> msm::Map::grespro

Definition at line 946 of file MsmMap.h.

Referenced by ComputeMsmMgr::initialize(), and MsmBlock::MsmBlock().

Array<IndexRange> msm::Map::gridrange
Array<Grid<Float> > msm::Map::gvc

Definition at line 945 of file MsmMap.h.

Referenced by ComputeMsmMgr::initialize().

Array<Grid<C1Matrix> > msm::Map::gvc_c1hermite

Definition at line 950 of file MsmMap.h.

int msm::Map::ispx
int msm::Map::ispy
int msm::Map::ispz
Array<PatchDiagram> msm::Map::patchList

The documentation for this struct was generated from the following file: