Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

GridforceGrid Class Reference

#include <GridForceGrid.h>

List of all members.

Public Types

typedef __box Box

Public Member Functions

 GridforceGrid (void)
 ~GridforceGrid ()
void initialize (char *potfilename, SimParameters *simParams)
int get_box (Box *box, Vector pos) const
void pack (MOStream *msg) const
void unpack (MIStream *msg)
Position get_center (void) const
Tensor get_inv (void) const


Detailed Description

Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 by The Board of Trustees of the University of Illinois. All rights reserved.

Definition at line 17 of file GridForceGrid.h.


Member Typedef Documentation

typedef struct __box GridforceGrid::Box
 

Definition at line 36 of file GridForceGrid.h.

Referenced by ComputeGridForce::doForce(), and get_box().


Constructor & Destructor Documentation

GridforceGrid::GridforceGrid void   ) 
 

Definition at line 21 of file GridForceGrid.C.

00022 {
00023     grid = NULL;
00024 }

GridforceGrid::~GridforceGrid  ) 
 

Definition at line 43 of file GridForceGrid.C.

00043                               {
00044     delete [] grid;
00045 }


Member Function Documentation

int GridforceGrid::get_box Box box,
Vector  pos
const
 

Definition at line 364 of file GridForceGrid.C.

References GridforceGrid::__box::b, Bool, Box, DebugM, Tensor::diagonal(), endi(), GridforceGrid::__box::loc, Node::Object(), GridforceGrid::__box::scale, Node::simParameters, and simParams.

Referenced by ComputeGridForce::doForce().

00365 {
00366     SimParameters *simParams = Node::Object()->simParameters;
00367     Vector p = pos - origin;
00368     int inds[3];
00369     int ind;
00370     Vector g, dg;
00371     Vector gapscale = Vector(1, 1, 1);
00372     
00373     DebugM(3, "pos = " << pos << "\n" << "origin = " << origin << "\n" << "p = " << p << "\n" << endi);
00374     
00375     g = inv * p;
00376     for (int i = 0; i < 3; i++) {
00377         inds[i] = (int)floor(g[i]);
00378         dg[i] = g[i] - inds[i];
00379     }
00380     
00381     for (int i = 0; i < 3; i++) {
00382         if (inds[i] < 0 || inds[i] >= k[i]-1) {
00383             if (cont[i]) inds[i] = k[i]-1;
00384             else return -1;     // Outside potential and grid is not continuous
00385         }
00386         if (cont[i] && inds[i] == k[i]-1) {
00387             // Correct for non-unit spacing between continuous grid images
00388             gapscale[i] *= gapinv[i];
00389             if (g[i] < 0.0) dg[i] = 1.0 + g[i]*gapinv[i]; // = (gap[i] + g[i]) * gapinv[i]
00390             else dg[i] = (g[i] - inds[i]) * gapinv[i];
00391         }
00392     }
00393     
00394     DebugM(3, "gapscale = " << gapscale << "\n" << endi);
00395     box->scale = Tensor::diagonal(gapscale);
00396     
00397     DebugM(3, "dg = " << dg << "\n" << endi);
00398     DebugM(3, "ind + dg = " << inds[0]+dg[0] << " " << inds[1]+dg[1] << " " << inds[2]+dg[2] << "\n" << endi);
00399     
00400     ind = inds[0]*dk[0] + inds[1]*dk[1] + inds[2]*dk[2];
00401     
00402     for (int i0 = 0; i0 < 8; i0++) {
00403         int inds2[3];
00404         int ind2 = 0;
00405         
00406         float voff = 0.0;
00407         int bit = 1;    // bit = 2^i1 in the below loop
00408         for (int i1 = 0; i1 < 3; i1++) {
00409             inds2[i1] = (inds[i1] + ((i0 & bit) ? 1 : 0)) % k[i1];
00410             ind2 += inds2[i1] * dk[i1];
00411             
00412             // Deal with voltage offsets
00413             if (cont[i1] && inds[i1] == (k[i1]-1) && inds2[i1] == 0) {
00414                 voff += offset[i1];
00415                 DebugM(3, "offset[" << i1 << "] = " << offset[i1] << "\n" << endi);
00416             }
00417             
00418             bit <<= 1;  // i.e. multiply by 2
00419         }
00420         
00421         DebugM(3, "inds2 = " << inds2[0] << " " << inds2[1] << " " << inds2[2] << "\n" << endi);
00422         
00423         // NOTE: leaving everything in terms of unit cell coordinates for now,
00424         // eventually will multiply by inv tensor when applying the force
00425         
00426         // First set variables 'dk_{hi,lo}' (glob notation). The 'hi'
00427         // ('lo') variable in a given dimension is the number added (subtracted)
00428         // to go up (down) one grid point in that dimension; both are normally
00429         // just the corresponding 'dk[i]'. However, if we are sitting on a
00430         // boundary and we are using a continuous grid, then we want to map the
00431         // next point off the grid back around to the other side. e.g. point
00432         // (k[0], i1, k) maps to point (0, i1, k), which would be
00433         // accomplished by changing 'dk1_hi' to -(k[0]-1)*dk1.
00434         
00435         Bool zero_derivs = FALSE;
00436         int dk_hi[3];
00437         int dk_lo[3];
00438         float voffs[3];
00439         float dscales[3] = {0.5, 0.5, 0.5};
00440         for (int i1 = 0; i1 < 3; i1++) {
00441             if (inds2[i1] == 0) {
00442                 if (cont[i1]) {
00443                     dk_hi[i1] = dk[i1];
00444                     dk_lo[i1] = -(k[i1]-1) * dk[i1];
00445                     voffs[i1] = offset[i1];
00446                     dscales[i1] = 1.0/(1.0 + gap[i1]) * 1.0/gapscale[i1];
00447                 }
00448                 else zero_derivs = TRUE;
00449             }
00450             else if (inds2[i1] == k[i1]-1) {
00451                 if (cont[i1]) {
00452                     dk_hi[i1] = -(k[i1]-1) * dk[i1];
00453                     dk_lo[i1] = dk[i1];
00454                     voffs[i1] = offset[i1];
00455                     dscales[i1] = 1.0/(1.0 + gap[i1]) * 1.0/gapscale[i1];
00456                 }
00457                 else zero_derivs = TRUE;
00458             }
00459             else {
00460                 dk_hi[i1] = dk[i1];
00461                 dk_lo[i1] = dk[i1];
00462                 voffs[i1] = 0.0;
00463             }
00464         }
00465         
00466         DebugM(2, "zero_derivs = " << zero_derivs << "\n" << endi);
00467         DebugM(2, "dk_hi = " << dk_hi[0] << " " << dk_hi[1] << " " << dk_hi[2] << "\n" << endi);
00468         DebugM(2, "dk_lo = " << dk_lo[0] << " " << dk_lo[1] << " " << dk_lo[2] << "\n" << endi);
00469         
00470         
00471         // ### Now fill in box ###
00472         
00473         box->loc = dg;
00474         
00475         // V
00476         box->b[i0] = grid[ind2] + voff;
00477         
00478         if (zero_derivs) {
00479             box->b[8+i0] = 0.0;
00480             box->b[16+i0] = 0.0;
00481             box->b[24+i0] = 0.0;
00482             box->b[32+i0] = 0.0;
00483             box->b[40+i0] = 0.0;
00484             box->b[48+i0] = 0.0;
00485             box->b[56+i0] = 0.0;
00486         } else {
00487             box->b[8+i0] = dscales[0] * (grid[ind2 + dk_hi[0]] - grid[ind2 - dk_lo[0]] + voffs[0]);     //  dV/dx
00488             box->b[16+i0] = dscales[1] * (grid[ind2 + dk_hi[1]] - grid[ind2 - dk_lo[1]] + voffs[1]);    //  dV/dy
00489             box->b[24+i0] = dscales[2] * (grid[ind2 + dk_hi[2]] - grid[ind2 - dk_lo[2]] + voffs[2]);    //  dV/dz
00490             box->b[32+i0] = dscales[0] * dscales[1]
00491                 * (grid[ind2 + dk_hi[0] + dk_hi[1]] - grid[ind2 - dk_lo[0] + dk_hi[1]]
00492                    - grid[ind2 + dk_hi[0] - dk_lo[1]] + grid[ind2 - dk_lo[0] - dk_lo[1]]);      //  d2V/dxdy
00493             box->b[40+i0] = dscales[0] * dscales[2]
00494                 * (grid[ind2 + dk_hi[0] + dk_hi[2]] - grid[ind2 - dk_lo[0] + dk_hi[2]]
00495                    - grid[ind2 + dk_hi[0] - dk_lo[2]] + grid[ind2 - dk_lo[0] - dk_lo[2]]);      //  d2V/dxdz
00496             box->b[48+i0] = dscales[1] * dscales[2]
00497                 * (grid[ind2 + dk_hi[1] + dk_hi[2]] - grid[ind2 - dk_lo[1] + dk_hi[2]]
00498                    - grid[ind2 + dk_hi[1] - dk_lo[2]] + grid[ind2 - dk_lo[1] - dk_lo[2]]);      //  d2V/dydz
00499         
00500             box->b[56+i0] = dscales[0] * dscales[1] * dscales[2]                        // d3V/dxdydz
00501                 * (grid[ind2 + dk_hi[0] + dk_hi[1] + dk_hi[2]] - grid[ind2 + dk_hi[0]+ dk_hi[1] - dk_lo[2]]
00502                    - grid[ind2 + dk_hi[0] - dk_lo[1] + dk_hi[2]] - grid[ind2 - dk_lo[0] + dk_hi[1] + dk_hi[2]]
00503                    + grid[ind2 + dk_hi[0] - dk_lo[1] - dk_lo[2]] + grid[ind2 - dk_lo[0] + dk_hi[1] - dk_lo[2]]
00504                    + grid[ind2 - dk_lo[0] - dk_lo[1] + dk_hi[2]] - grid[ind2 - dk_lo[0] - dk_lo[1] - dk_lo[2]]);
00505         }
00506         
00507         DebugM(2, "V = " << box->b[i0] << "\n");
00508         
00509         DebugM(2, "dV/dx = " << box->b[8+i0] << "\n");
00510         DebugM(2, "dV/dy = " << box->b[16+i0] << "\n");
00511         DebugM(2, "dV/dz = " << box->b[24+i0] << "\n");
00512         
00513         DebugM(2, "d2V/dxdy = " << box->b[32+i0] << "\n");
00514         DebugM(2, "d2V/dxdz = " << box->b[40+i0] << "\n");
00515         DebugM(2, "d2V/dydz = " << box->b[48+i0] << "\n");
00516         
00517         DebugM(2, "d3V/dxdydz = " << box->b[56+i0] << "\n" << endi);
00518     }
00519     
00520     return 0;
00521 }

Position GridforceGrid::get_center void   )  const [inline]
 

Definition at line 43 of file GridForceGrid.h.

References Position.

Referenced by ComputeGridForce::doForce().

00043 { return center; }

Tensor GridforceGrid::get_inv void   )  const [inline]
 

Definition at line 44 of file GridForceGrid.h.

Referenced by ComputeGridForce::doForce().

00044 { return inv; }

void GridforceGrid::initialize char *  potfilename,
SimParameters simParams
 

Definition at line 111 of file GridForceGrid.C.

References Lattice::a(), Lattice::b(), BigReal, Bool, Lattice::c(), DebugM, endi(), Fopen(), SimParameters::gridforceContA1, SimParameters::gridforceContA2, SimParameters::gridforceContA3, SimParameters::gridforceVOffset, SimParameters::gridforceVolts, iout, iWARN(), SimParameters::lattice, Vector::length(), NAMD_die(), Position, simParams, Vector::x, Tensor::xx, Tensor::xy, Tensor::xz, Vector::y, Tensor::yx, Tensor::yy, Tensor::yz, Vector::z, Tensor::zx, Tensor::zy, and Tensor::zz.

Referenced by Molecule::build_gridforce_params().

00112 {
00113     FILE *poten = Fopen(potfilename, "r");
00114     if (!poten) {
00115         NAMD_die("Problem reading grid force potential file");
00116     }
00117     
00118     char line[256];
00119     do {
00120         fgets(line, 256, poten);        // Read comment lines
00121     } while (line[0] == '#');
00122     
00123     int k_nopad[3];
00124     sscanf(line, "object 1 class gridpositions counts %d %d %d\n", &k_nopad[0], &k_nopad[1], &k_nopad[2]);
00125     
00126     // Read origin
00127     fscanf(poten, "origin %lf %lf %lf\n", &origin.x, &origin.y, &origin.z);
00128         
00129     // Read delta (unit vectors)
00130     // These are column vectors, so must fill gridfrcE tensor to reflect this
00131     fscanf(poten, "delta %lf %lf %lf\n", &e.xx, &e.yx, &e.zx);
00132     fscanf(poten, "delta %lf %lf %lf\n", &e.xy, &e.yy, &e.zy);
00133     fscanf(poten, "delta %lf %lf %lf\n", &e.xz, &e.yz, &e.zz);
00134     
00135     center = origin + e * 0.5 * Position(k_nopad[0], k_nopad[1], k_nopad[2]);
00136 
00137     BigReal tmp[3];   // Temporary storage
00138     fscanf(poten, "object 2 class gridconnections counts %lf %lf %lf\n", tmp, tmp+1, tmp+2);
00139     fscanf(poten, "object 3 class array type double rank 0 items %lf data follows\n", tmp);
00140     
00141     // Calculate inverse tensor
00142     BigReal det;
00143     det = e.xx*(e.yy*e.zz - e.yz*e.zy) - e.xy*(e.yx*e.zz - e.yz*e.zx) + e.xz*(e.yx*e.zy - e.yy*e.zx);
00144     inv.xx =  (e.yy*e.zz - e.yz*e.zy)/det;
00145     inv.xy = -(e.xy*e.zz - e.xz*e.zy)/det;
00146     inv.xz =  (e.xy*e.yz - e.xz*e.yy)/det;
00147     inv.yx = -(e.yx*e.zz - e.yz*e.zx)/det;
00148     inv.yy =  (e.xx*e.zz - e.xz*e.zx)/det;
00149     inv.yz = -(e.xx*e.yz - e.xz*e.yx)/det;
00150     inv.zx =  (e.yx*e.zy - e.yy*e.zx)/det;
00151     inv.zy = -(e.xx*e.zy - e.xy*e.zx)/det;
00152     inv.zz =  (e.xx*e.yy - e.xy*e.yx)/det;
00153     
00154     // Allocate storage for potential
00155     int size_nopad = k_nopad[0] * k_nopad[1] * k_nopad[2];
00156     float *grid_nopad = new float[size_nopad];
00157     
00158     float factor;
00159     if (simParams->gridforceVolts) {
00160         factor = 1.0/0.0434;  // convert V -> kcal/mol*e
00161     } else {
00162         factor = 1.0;
00163     }
00164     
00165     float tmp2;
00166     for (int count = 0; count < size_nopad; count++) {
00167         int err = fscanf(poten, "%f", &tmp2);
00168         if (err == EOF || err == 0) {
00169             NAMD_die("Grid force potential file incorrectly formatted");
00170         }
00171         grid_nopad[count] = tmp2 * factor;
00172     }
00173     
00174     DebugM(4, "e = " << e << "\n" << endi);
00175     DebugM(4, "inv = " << inv << "\n" << endi);
00176     
00177     int dk_nopad[3];
00178     
00179     // Shortcuts for accessing 1-D array with four indices
00180     dk_nopad[0] = k_nopad[1] * k_nopad[2];
00181     dk_nopad[1] = k_nopad[2];
00182     dk_nopad[2] = 1;
00183     
00184     // PARAMETERS which probably ought to be somewhere else
00185     BigReal modThresh = 1.0;
00186     
00187     Vector Kvec[3];
00188     Kvec[0] = e * Position(k_nopad[0]-1, 0, 0);
00189     Kvec[1] = e * Position(0, k_nopad[1]-1, 0);
00190     Kvec[2] = e * Position(0, 0, k_nopad[2]-1);
00191     Vector Avec[3];
00192     Avec[0] = simParams->lattice.a();
00193     Avec[1] = simParams->lattice.b();
00194     Avec[2] = simParams->lattice.c();
00195     
00196     // Decide whether we're wrapping
00197     Bool gridforceCont[3];
00198     gridforceCont[0] = simParams->gridforceContA1;
00199     gridforceCont[1] = simParams->gridforceContA2;
00200     gridforceCont[2] = simParams->gridforceContA3;
00201     
00202     for (int i0 = 0; i0 < 3; i0++) {
00203         if (gridforceCont[i0]) {
00204             Bool found = FALSE;
00205             for (int i1 = 0; i1 < 3; i1++) {
00206                 if (cross(Avec[i0].unit(), Kvec[i1].unit()).length() < 1e-4) {
00207                     found = TRUE;
00208                     cont[i1] = TRUE;
00209                     offset[i1] = simParams->gridforceVOffset[i0] * factor;
00210                     gap[i1] = (inv * (Avec[i0] - Kvec[i1])).length();   // want in grid-point units (normal = 1)
00211                     gapinv[i1] = 1.0/gap[i1];
00212                     
00213                     if (gap[i1] < 0) {
00214                         NAMD_die("Gridforce Grid overlap!");
00215                     }
00216                     
00217                     DebugM(4, "cont[" << i1 << "] = " << cont[i1] << "\n" << endi);
00218                     DebugM(4, "gap[" << i1 << "] = " << gap[i1] << "\n" << endi);
00219                 }
00220             }
00221             
00222             if (!found) {
00223                 NAMD_die("No Gridforce unit vector found parallel to requested continuous grid direction!");
00224             }
00225         }
00226         else {
00227             // TO DO: must check for grid overlap in non-wrapping
00228             // dimensions taking non-orthogonal unit vectors into
00229             // consideration
00230         }
00231     }
00232     
00233     // Figure out size of true grid (padded on non-periodic sides)
00234     Vector delta = 0;
00235     for (int i = 0; i < 3; i++) {
00236         if (cont[i]) {
00237             k[i] = k_nopad[i];
00238         } else {
00239             k[i] = k_nopad[i] + 2*border;
00240             delta[i] -= border;
00241         }
00242     }
00243     DebugM(4, "delta = " << e * delta << " (" << delta << ")\n");
00244     origin += e * delta;
00245     
00246     size = k[0] * k[1] * k[2];
00247     dk[0] = k[1] * k[2];
00248     dk[1] = k[2];
00249     dk[2] = 1;
00250     
00251     grid = new float[size];
00252     
00253     // Fill in most of new grid (all except pad areas)
00254     BigReal n_sum[3] = {0, 0, 0};
00255     BigReal p_sum[3] = {0, 0, 0};
00256     for (int i0 = 0; i0 < k_nopad[0]; i0++) {
00257         for (int i1 = 0; i1 < k_nopad[1]; i1++) {
00258             for (int i2 = 0; i2 < k_nopad[2]; i2++) {
00259                 // Edges are special cases -- take force there to be
00260                 // zero for smooth transition across potential
00261                 // boundary
00262                 
00263                 int ind_nopad = i0*dk_nopad[0] + i1*dk_nopad[1] + i2*dk_nopad[2];
00264                 int j0 = (cont[0]) ? i0 : i0 + border;
00265                 int j1 = (cont[1]) ? i1 : i1 + border;
00266                 int j2 = (cont[2]) ? i2 : i2 + border;
00267                 int ind = j0*dk[0] + j1*dk[1] + j2*dk[2];
00268                 
00269                 if (i0 == 0)                    n_sum[0] += grid_nopad[ind_nopad];
00270                 else if (i0 == k_nopad[0]-1)    p_sum[0] += grid_nopad[ind_nopad];
00271                 if (i1 == 0)                    n_sum[1] += grid_nopad[ind_nopad];
00272                 else if (i1 == k_nopad[1]-1)    p_sum[1] += grid_nopad[ind_nopad];
00273                 if (i2 == 0)                    n_sum[2] += grid_nopad[ind_nopad];
00274                 else if (i2 == k_nopad[2]-1)    p_sum[2] += grid_nopad[ind_nopad];
00275                 
00276                 grid[ind] = grid_nopad[ind_nopad];
00277             }
00278         }
00279     }
00280     
00281     
00282     BigReal n_avg[3], p_avg[3];
00283     for (int i0 = 0; i0 < 3; i0++) {
00284         int i1 = (i0 + 1) % 3;
00285         int i2 = (i0 + 2) % 3;
00286         n_avg[i0] = n_sum[i0] / (k_nopad[i1] * k_nopad[i2]);
00287         p_avg[i0] = p_sum[i0] / (k_nopad[i1] * k_nopad[i2]);
00288         
00289         if (cont[i0] && fabs(offset[i0] - (p_avg[i0]-n_avg[i0])) > modThresh) {
00290             iout << iWARN << "GRID FORCE POTENTIAL DIFFERENCE IN K" << i0
00291                  << " DIRECTION IS " << offset[i0] - (p_avg[i0]-n_avg[i0]) << " KCAL/MOL*E\n" << endi;
00292         }
00293         DebugM(4, "n_avg[" << i0 << "] = " << n_avg[i0] << "\n" << endi);
00294         DebugM(4, "p_avg[" << i0 << "] = " << p_avg[i0] << "\n" << endi);
00295     }
00296     
00297     
00298     Bool twoPadVals = (cont[0] + cont[1] + cont[2] == 2);
00299     float padVal = 0.0;
00300     int weight = 0;
00301     if (!twoPadVals) {
00302         // Determine pad value (must average)
00303         if (!cont[0]) {
00304             padVal += p_sum[0] + n_sum[0];
00305             weight += 2 * k_nopad[1] * k_nopad[2];
00306         }
00307         if (!cont[1]) {
00308             padVal += p_sum[1] + n_sum[1];
00309             weight += 2 * k_nopad[0] * k_nopad[2];
00310         }
00311         if (!cont[2]) {
00312             padVal += p_sum[2] + n_sum[2];
00313             weight += 2 * k_nopad[0] * k_nopad[1];
00314         }
00315         padVal /= weight;
00316     }
00317     
00318     for (int i = 0; i < 3; i++) {
00319         pad_n[i] = (cont[i]) ? 0.0 : (twoPadVals) ? n_avg[i] : padVal;
00320         pad_p[i] = (cont[i]) ? 0.0 : (twoPadVals) ? p_avg[i] : padVal;
00321         DebugM(4, "pad_n[" << i << "] = " << pad_n[i] << "\n" << endi);
00322         DebugM(4, "pad_p[" << i << "] = " << pad_p[i] << "\n" << endi);
00323     }
00324     
00325     if (cont[0] && cont[1] && cont[2]) {
00326         // Nothing to do
00327         return;
00328     }
00329     
00330     // Now fill in rest of new grid
00331     for (int i0 = 0; i0 < k[0]; i0++) {
00332         for (int i1 = 0; i1 < k[1]; i1++) {
00333             for (int i2 = 0; i2 < k[2]; i2++) {
00334                 if ( (cont[0] || (i0 >= border && i0 < k[0]-border)) &&
00335                      (cont[1] || (i1 >= border && i1 < k[1]-border)) &&
00336                      (cont[2] || i2 == border) )
00337                 {
00338                     i2 += k_nopad[2]-1;
00339                     continue;
00340                 }
00341                 
00342                 int ind = i0*dk[0] + i1*dk[1] + i2*dk[2];
00343                 Position pos = e * Position(i0, i1, i2);
00344                 int var[3] = {i0, i1, i2};
00345                 
00346                 for (int dir = 0; dir < 3; dir++) {
00347                     if (cont[dir]) continue;
00348                     
00349                     if (var[dir] < border)
00350                         grid[ind] = pad_n[dir];
00351                     else if (var[dir] >= k[dir]-border)
00352                         grid[ind] = pad_p[dir];
00353                 }
00354                 
00355                 DebugM(2, "grid[" << ind << "; " << i0 << ", " << i1 << ", " << i2 << "] = " << grid[ind] << "\n" << endi);
00356             }
00357         }
00358     }
00359     
00360     // Finally, clean up our garbage
00361     delete [] grid_nopad;
00362 }

void GridforceGrid::pack MOStream msg  )  const
 

Definition at line 47 of file GridForceGrid.C.

References Bool, DebugM, endi(), and MOStream::put().

Referenced by Molecule::send_Molecule().

00048 {
00049     DebugM(2, "Packing message\n" << endi);
00050     
00051     msg->put(3*sizeof(int), (char*)k);
00052     msg->put(size);
00053     msg->put(3*sizeof(int), (char*)dk);
00054     
00055     msg->put(sizeof(Vector), (char*)&origin);
00056     msg->put(sizeof(Vector), (char*)&center);
00057     msg->put(sizeof(Tensor), (char*)&e);
00058     msg->put(sizeof(Tensor), (char*)&inv);
00059              
00060     msg->put(3*sizeof(float), (char*)pad_p);
00061     msg->put(3*sizeof(float), (char*)pad_n);
00062     msg->put(3*sizeof(Bool), (char*)cont);
00063     msg->put(3*sizeof(float), (char*)offset);
00064     msg->put(3*sizeof(float), (char*)gap);
00065     msg->put(3*sizeof(float), (char*)gapinv);
00066     
00067     msg->put(size*sizeof(float), (char*)grid);
00068 }

void GridforceGrid::unpack MIStream msg  ) 
 

Definition at line 70 of file GridForceGrid.C.

References Bool, DebugM, endi(), and MIStream::get().

Referenced by Molecule::receive_Molecule().

00071 {
00072     DebugM(2, "Unpacking message\n" << endi);
00073     
00074     msg->get(3*sizeof(int), (char*)k);
00075     msg->get(size);
00076     msg->get(3*sizeof(int), (char*)dk);
00077     
00078     msg->get(sizeof(Vector), (char*)&origin);
00079     msg->get(sizeof(Vector), (char*)&center);
00080     msg->get(sizeof(Tensor), (char*)&e);
00081     msg->get(sizeof(Tensor), (char*)&inv);
00082              
00083     msg->get(3*sizeof(float), (char*)pad_p);
00084     msg->get(3*sizeof(float), (char*)pad_n);
00085     msg->get(3*sizeof(Bool), (char*)cont);
00086     msg->get(3*sizeof(float), (char*)offset);
00087     msg->get(3*sizeof(float), (char*)gap);
00088     msg->get(3*sizeof(float), (char*)gapinv);
00089     
00090     if (size) {
00091         delete [] grid;
00092         grid = new float[size];
00093         msg->get(size*sizeof(float), (char*)grid);
00094     }
00095     
00096 //     DebugM(2, "grid[0] = " << grid[0] << "\n");
00097 //     DebugM(2, "k = " << k[0] << " " << k[1] << " " << k[2] << "\n");
00098 //     DebugM(2, "size = " << size << "\n");
00099 //     DebugM(2, "dk = " << dk[0] << " " << dk[1] << " " << dk[2] << "\n");
00100 //     DebugM(2, "origin = " << origin << "\n");
00101 //     DebugM(2, "center = " << center << "\n");
00102 //     DebugM(2, "e = " << e << "\n");
00103 //     DebugM(2, "inv = " << inv << "\n");
00104 //     DebugM(2, "pad_p = " << pad_p[0] << " " << pad_p[1] << " " << pad_p[2] << "\n");
00105 //     DebugM(2, "pad_n = " << pad_n[0] << " " << pad_n[1] << " " << pad_n[2] << "\n");
00106 //     DebugM(2, "cont = " << cont[0] << " " << cont[1] << " " << cont[2] << "\n");
00107 //     DebugM(2, "offset = " << offset[0] << " " << offset[1] << " " << offset[2] << "\n");
00108 //     DebugM(2, "gap = " << gap[0] << " " << gap[1] << " " << gap[2] << endi << "\n");
00109 }


The documentation for this class was generated from the following files:
Generated on Sun Sep 7 04:07:44 2008 for NAMD by  doxygen 1.3.9.1