ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/visitors/AtomVisitor.cpp
(Generate patch)

Comparing trunk/src/visitors/AtomVisitor.cpp (file contents):
Revision 507 by gezelter, Fri Apr 15 22:04:00 2005 UTC vs.
Revision 989 by tim, Sat Jun 17 17:02:33 2006 UTC

# Line 221 | Line 221 | namespace oopse {
221      return strIter != linearAtomType.end() ? true : false;
222    }
223  
224 +  void LinearAtomVisitor::addGayBerneAtomType(const std::string& atomType){
225 +   linearAtomType.insert(atomType);
226 +  }
227 +
228    void LinearAtomVisitor::visit(DirectionalAtom* datom){
229      std::vector<AtomInfo*> atoms;
230      //we need to convert linear into 4 different atoms
# Line 237 | Line 241 | namespace oopse {
241      AtomData* atomData;
242      GenericData* data;
243      bool haveAtomData;
244 <
244 >    AtomType* atomType;
245      //if atom is not SSD atom, just skip it
246 <    if(!isLinearAtom(datom->getType()))
246 >    if(!isLinearAtom(datom->getType()) || !datom->getAtomType()->isGayBerne())
247        return;
248  
249 +    //setup GayBerne type in fortran side
250 +    data = datom->getAtomType()->getPropertyByName("GayBerne");
251 +    if (data != NULL) {
252 +       GayBerneParamGenericData* gayBerneData = dynamic_cast<GayBerneParamGenericData*>(data);
253 +
254 +       if (gayBerneData != NULL) {
255 +           GayBerneParam gayBerneParam = gayBerneData->getData();
256 +
257 +                                          double halfLen = gayBerneParam.GB_sigma * gayBerneParam.GB_l2b_ratio/2.0;
258 +                                                        c1[2] = -halfLen;
259 +              c2[2] = -halfLen /2;
260 +              c3[2] = halfLen/2;
261 +              c4[2] = halfLen;
262 +                
263 +            }
264 +            
265 +              else {
266 +                    sprintf( painCave.errMsg,
267 +                           "Can not cast GenericData to GayBerneParam\n");
268 +                    painCave.severity = OOPSE_ERROR;
269 +                    painCave.isFatal = 1;
270 +                    simError();          
271 +        }            
272 +    }
273 +
274 +
275      data = datom->getPropertyByName("ATOMDATA");
276      if(data != NULL){
277        atomData = dynamic_cast<AtomData*>(data);  
# Line 331 | Line 361 | namespace oopse {
361      result += buffer;
362  
363      sprintf(buffer , "Visitor Description: Convert linear into 4 different atoms\n");
364 +    result += buffer;
365 +
366 +    sprintf(buffer ,"------------------------------------------------------------------\n");
367 +    result += buffer;
368 +
369 +    return result;
370 +  }
371 +
372 +  bool GBLipidAtomVisitor::isGBLipidAtom(const std::string& atomType){
373 +    std::set<std::string>::iterator strIter;
374 +    strIter = GBLipidAtomType.find(atomType);
375 +
376 +    return strIter != GBLipidAtomType.end() ? true : false;
377 +  }
378 +
379 +  void GBLipidAtomVisitor::visit(DirectionalAtom* datom){
380 +    std::vector<AtomInfo*> atoms;
381 +    //we need to convert linear into 4 different atoms
382 +    Vector3d c1(0.0, 0.0, -6.25);
383 +    Vector3d c2(0.0, 0.0, -2.1);
384 +    Vector3d c3(0.0, 0.0,  2.1);
385 +    Vector3d c4(0.0, 0.0,  6.25);
386 +    RotMat3x3d rotMatrix;
387 +    RotMat3x3d rotTrans;
388 +    AtomInfo* atomInfo;
389 +    Vector3d pos;
390 +    Vector3d newVec;
391 +    Quat4d q;
392 +    AtomData* atomData;
393 +    GenericData* data;
394 +    bool haveAtomData;
395 +
396 +    //if atom is not GBlipid atom, just skip it
397 +    if(!isGBLipidAtom(datom->getType()))
398 +      return;
399 +
400 +    data = datom->getPropertyByName("ATOMDATA");
401 +    if(data != NULL){
402 +      atomData = dynamic_cast<AtomData*>(data);  
403 +      if(atomData == NULL){
404 +        std::cerr << "can not get Atom Data from " << datom->getType() << std::endl;
405 +        atomData = new AtomData;
406 +        haveAtomData = false;      
407 +      } else {
408 +        haveAtomData = true;
409 +      }
410 +    } else {
411 +      atomData = new AtomData;
412 +      haveAtomData = false;
413 +    }
414 +  
415 +  
416 +    pos = datom->getPos();
417 +    q = datom->getQ();
418 +    rotMatrix = datom->getA();
419 +
420 +    // We need A^T to convert from body-fixed to space-fixed:  
421 +    rotTrans = rotMatrix.transpose();
422 +
423 +    newVec = rotTrans * c1;
424 +    atomInfo = new AtomInfo;
425 +    atomInfo->atomTypeName = "K";
426 +    atomInfo->pos[0] = pos[0] + newVec[0];
427 +    atomInfo->pos[1] = pos[1] + newVec[1];
428 +    atomInfo->pos[2] = pos[2] + newVec[2];
429 +    atomInfo->dipole[0] = 0.0;
430 +    atomInfo->dipole[1] = 0.0;
431 +    atomInfo->dipole[2] = 0.0;
432 +    atomData->addAtomInfo(atomInfo);
433 +
434 +    newVec = rotTrans * c2;
435 +    atomInfo = new AtomInfo;
436 +    atomInfo->atomTypeName = "K";
437 +    atomInfo->pos[0] = pos[0] + newVec[0];
438 +    atomInfo->pos[1] = pos[1] + newVec[1];
439 +    atomInfo->pos[2] = pos[2] + newVec[2];
440 +    atomInfo->dipole[0] = 0.0;
441 +    atomInfo->dipole[1] = 0.0;
442 +    atomInfo->dipole[2] = 0.0;
443 +    atomData->addAtomInfo(atomInfo);
444 +
445 +    newVec = rotTrans * c3;
446 +    atomInfo = new AtomInfo;
447 +    atomInfo->atomTypeName = "K";
448 +    atomInfo->pos[0] = pos[0] + newVec[0];
449 +    atomInfo->pos[1] = pos[1] + newVec[1];
450 +    atomInfo->pos[2] = pos[2] + newVec[2];
451 +    atomInfo->dipole[0] = 0.0;
452 +    atomInfo->dipole[1] = 0.0;
453 +    atomInfo->dipole[2] = 0.0;
454 +    atomData->addAtomInfo(atomInfo);
455 +
456 +    newVec = rotTrans * c4;
457 +    atomInfo = new AtomInfo;
458 +    atomInfo->atomTypeName = "K";
459 +    atomInfo->pos[0] = pos[0] + newVec[0];
460 +    atomInfo->pos[1] = pos[1] + newVec[1];
461 +    atomInfo->pos[2] = pos[2] + newVec[2];
462 +    atomInfo->dipole[0] = 0.0;
463 +    atomInfo->dipole[1] = 0.0;
464 +    atomInfo->dipole[2] = 0.0;
465 +    atomData->addAtomInfo(atomInfo);
466 +
467 +    //add atom data into atom's property
468 +
469 +    if(!haveAtomData){
470 +      atomData->setID("ATOMDATA");
471 +      datom->addProperty(atomData);
472 +    }
473 +
474 +    setVisited(datom);
475 +
476 +  }
477 +
478 +  const std::string GBLipidAtomVisitor::toString(){
479 +    char buffer[65535];
480 +    std::string result;
481 +  
482 +    sprintf(buffer ,"------------------------------------------------------------------\n");
483      result += buffer;
484  
485 +    sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str());
486 +    result += buffer;
487 +
488 +    sprintf(buffer , "Visitor Description: Convert GBlipid into 4 different K atoms\n");
489 +    result += buffer;
490 +
491      sprintf(buffer ,"------------------------------------------------------------------\n");
492      result += buffer;
493  
# Line 380 | Line 535 | namespace oopse {
535        return;
536  
537      pos = datom->getPos();
538 <    u = datom->getElectroFrame().getColumn(2);
539 <
538 >    if (datom->getAtomType()->isGayBerne()) {
539 >        u = datom->getA().transpose()*V3Z;        
540 >    } else if (datom->getAtomType()->isMultipole()) {
541 >        u = datom->getElectroFrame().getColumn(2);
542 >    }
543      atomData = new AtomData;
544      atomData->setID("ATOMDATA");
545      atomInfo = new AtomInfo;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines