25 #include <sys/types.h>
80 if (!strcmp(pszType,
"Si"))
82 else if (!strcmp(pszType,
"GaAs"))
84 else if (!strcmp(pszType,
"InAs"))
93 if (!strcmp(pszForm,
"Box"))
95 else if (!strcmp(pszForm,
"Cylinder"))
121 for (i = 0; i < nSize; ++i)
141 #ifndef DISABLE_MPI_ROUTINE
144 #else //DISABLE_MPI_ROUTINE
146 #endif //DISABLE_MPI_ROUTINE
155 #ifndef DISABLE_MPI_ROUTINE
158 #else //DISABLE_MPI_ROUTINE
160 #endif //DISABLE_MPI_ROUTINE
185 #ifndef DISABLE_MPI_ROUTINE
190 #else //DISABLE_MPI_ROUTINE
192 #endif //DISABLE_MPI_ROUTINE
201 #ifndef DISABLE_MPI_ROUTINE
206 #else //DISABLE_MPI_ROUTINE
208 #endif //DISABLE_MPI_ROUTINE
257 double fXAssignCount, fYAssignCount, fZAssignCount;
258 double fUnitcellLength[3];
260 bool bPaddingUnitCell =
false;
269 bPaddingUnitCell =
true;
272 fYAssignCount = floor(
m_fLength[_Y] / fUnitcellLength[_Y]) + 2;
274 fYAssignCount = ceil(
m_fLength[_Y] / fUnitcellLength[_Y]);
277 fZAssignCount = floor(
m_fLength[_Z] / fUnitcellLength[_Z]) + 2;
279 fZAssignCount = ceil(
m_fLength[_Z] / fUnitcellLength[_Z]);
281 #ifdef DISABLE_MPI_ROUTINE
282 fXAssignCount = fXTotalCount;
284 if (bPaddingUnitCell)
293 fXAssignCount = fXTotalCount;
294 if (bPaddingUnitCell)
305 if( 1 > fXTotalCount / nNodeCount )
308 unsigned int nBaseCount, nRestCount;
310 nBaseCount = (
unsigned int)floor(fXTotalCount / nNodeCount);
311 nRestCount = (
unsigned int)floor(fXTotalCount) - nBaseCount * nNodeCount;
313 fXAssignCount = nBaseCount;
314 if( nRank < nRestCount )
322 unsigned int nExtraAdding = 0;
324 nExtraAdding = min(nRestCount, nRank);
326 nExtraAdding = std::min(nRestCount, nRank);
333 cx = (nBaseCount * nRank + nExtraAdding) * fUnitcellLength[_X];
342 #ifdef SHOW_DEBUG_STRING
346 sprintf(szMsg,
"TotalAssignCount: %7f\n", fXTotalCount);
353 #endif //SHOW_DEBUG_STRING
355 #endif //DISABLE_MPI_ROUTINE
378 sprintf(szMsg,
"-Unitcell counts: X-axis[%2.1f], Y-axis[%2.1f], Z-axis[%2.1f]\n", fXAssignCount, fYAssignCount, fZAssignCount);
395 int x, y, z, maxX, maxY, maxZ;
397 double fUnitcellLength[3];
398 double fUnitcellID = 0;
406 double fOffset[3] = { 0, };
411 fOffset[
_X] = -fUnitcellLength[
_X];
415 fOffset[
_Y] = -fUnitcellLength[
_Y];
418 fOffset[
_Z] = -fUnitcellLength[
_Z];
420 currentPos.
SetOffset(fOffset[_X], fOffset[_Y], fOffset[_Z]);
428 for (x = 0; x < maxX; ++x)
431 for (y = 0; y < maxY; ++y)
434 for (z = 0; z < maxZ; ++z)
439 UnitCell.
SetID(fUnitcellID++);
474 currentPos.
SetOffset(0, 0, fUnitcellLength[_Z]);
476 currentPos.
SetOffset(0, fUnitcellLength[_Y], 0);
478 currentPos.
SetOffset(fUnitcellLength[_X], 0, 0);
482 #define FIND_TARGET_INDEX(targetC, AssignIndex, AssigneCount, direction)\
483 if (m_bConsiderBoundaryCondition[direction]) \
485 if (0 == AssignIndex[direction])\
487 targetC = AssigneCount[direction] - 2; \
489 else if (AssigneCount[direction] - 1 == AssignIndex[direction])\
501 int maxX, maxY, maxZ;
502 double targetCx, targetCy, targetCz;
503 double *pfAssignIndex = NULL;
504 double fCopyIndex = -1;
513 for (i = 0; i < nSize; ++i)
518 targetCx = pfAssignIndex[
_X];
519 targetCy = pfAssignIndex[
_Y];
520 targetCz = pfAssignIndex[
_Z];
527 #ifdef DISABLE_MPI_ROUTINE
529 #else //DISABLE_MPI_ROUTINE
545 targetCx = pfAssignIndex[
_X]+1;
550 #endif //DISABLE_MPI_ROUTINE
554 #ifndef DISABLE_MPI_ROUTINE
557 if(
false == bXAxis )
572 if(
false == bXAxis )
576 #else //DISABLE_MPI_ROUTINE
578 if(
false == bXAxis )
581 #endif //DISABLE_MPI_ROUTINE
598 unsigned int i, j, k;
602 double fNeighborIndex[4];
605 if( 0 == fKValue[0] && 0 == fKValue[1] && 0 == fKValue[2] )
613 int nMatrixIndex = 0;
614 double kkTotal = kTotal;
617 for (j = 0; j < 4; ++j)
618 fNeighborIndex[j] = lpMapInfo->
pfNeighbor[j][i];
624 for (j = 0; j < 4; j++)
636 for (k = 0; k < 3; k++)
638 int nPeriodic = periodicDirection & (int)pow((
double)2, (int)k);
644 kTotal += (fPhase * fKValue[k] *
PI_VALUE);
667 if( fPeriodicAtomPos - fAtomPos > 0 )
683 for( i = 0; i < nSize ; ++ i)
717 matrixRotate.
SetElement(0, 1, -sin(fDegree[THETA_DEGREE]), 0);
718 matrixRotate.
SetElement(0, 2, -cos(fDegree[THETA_DEGREE])*sin(fDegree[PHI_DEGREE]), 0);
720 matrixRotate.
SetElement(1, 0, sin(fDegree[THETA_DEGREE]) * cos(fDegree[PHI_DEGREE]), 0);
721 matrixRotate.
SetElement(1, 1, cos(fDegree[THETA_DEGREE]), 0);
722 matrixRotate.
SetElement(1, 2, -sin(fDegree[THETA_DEGREE])*sin(fDegree[PHI_DEGREE]), 0);
724 matrixRotate.
SetElement(2, 0, sin(fDegree[PHI_DEGREE]), 0);
726 matrixRotate.
SetElement(2, 2, cos(fDegree[PHI_DEGREE]), 0);
739 for (i = 0; i < nSize; ++i)
753 char szMsg[1024], szAdditional[1024];
754 unsigned int i, j, k, nSize, nAtomSize, nNeighborSize, nMapIndex = 0;;
756 char szFileName[1024];
758 bool bPeriodic =
false;
759 char szTemp[1024], szMaterial[1024], szTemp2[1024];
760 #ifndef DISABLE_MPI_ROUTINE
763 #endif //DISABLE_MPI_ROUTINE
772 sprintf(szFileName,
"result\\%s", szTemp);
774 mkdir(
"result", 0777);
775 sprintf(szFileName,
"result/%s", szTemp);
779 #ifdef DISABLE_MPI_ROUTINE
780 out = fopen(szFileName,
"wt");
781 #else //DISABLE_MPI_ROUTINE
786 out = fopen(szFileName,
"wt");
791 out = fopen(szFileName,
"at");
793 #endif //DISABLE_MPI_ROUTINE
806 #ifdef SHOW_ATOM_MAP_RESULT_ON_SCREEN
809 #endif //SHOW_ATOM_MAP_RESULT_ON_SCREEN
810 for (i = 0; i < nSize; ++i)
815 for (j = 0; j < nAtomSize; ++j)
822 fIDForDebug = pAtom->
GetID();
824 sprintf(szAdditional,
"");
825 sprintf(szMaterial,
"");
827 for (k = 0; k < nNeighborSize; ++k)
836 #ifdef NOSHOW_MINORS_ONE
839 sprintf(szTemp,
"\t");
843 #endif //NOSHOW_MINORS_ONE
845 sprintf(szTemp,
"\t%7.0f", fNeighborAtomID);
846 if (-1 == fNeighborAtomID)
847 sprintf(szTemp2,
"\t%7.0d", -1);
851 strcat(szAdditional, szTemp);
852 strcat(szMaterial, szTemp2);
854 lpMapInfo->
pfNeighbor[k][nMapIndex] = fNeighborAtomID;
863 szAdditional, szMaterial);
869 lpMapInfo->
pfID[nMapIndex] = pAtom->
GetID();
877 #ifdef SHOW_ATOM_MAP_RESULT_ON_SCREEN
879 #endif //SHOW_ATOM_MAP_RESULT_ON_SCREEN
887 #ifndef DISABLE_MPI_ROUTINE
890 #endif //DISABLE_MPI_ROUTINE
912 #ifdef DISABLE_MPI_ROUTINE
915 #else //DISABLE_MPI_ROUTINE
920 #endif //DISABLE_MPI_ROUTINE
1070 lpMapInfo->
pfID = NULL;
1092 for (i = 0; i < nSize; ++i)
1101 double *pSendBuffer = NULL;
1125 for (i = 0; i < nSize; ++i)
1218 double *pBuffer = NULL;
1226 for (i = (
int)(fXLayer * floor(fSendingCount)); i < fXLayer * fSendingCount + floor(fSendingCount); ++i)
1250 fID = -fReceivingCount;
1254 for (i = 0 ; i < floor(fReceivingCount); ++i)
1258 unitcell.
SetID(fID++);
1260 pVectUnitCell->push_back(unitcell);
1299 if (!strcmp(lpParam->
szShape[0],
"Box"))
1300 strcpy(szTemp,
"B");
1301 else if (!strcmp(lpParam->
szShape[0],
"Cylinder"))
1302 strcpy(szTemp,
"C");
1304 strcat(pszFileName, szTemp);
1308 if (!strcmp(lpParam->
szShape[i + 1],
"Box"))
1309 strcpy(szTemp,
"B");
1310 else if (!strcmp(lpParam->
szShape[i + 1],
"Cylinder"))
1311 strcpy(szTemp,
"C");
1313 strcat(pszFileName, szTemp);
double * pfZ_Coordination
An array of Z coordination.
static void InitAtomList()
unsigned int m_ShapeForm
Shape form.
std::vector< CKNGeometricUnitCell > m_vectNextUnitCell
Back end edge unit cell that copy from next side node.
MATERIAL_INDEX m_MaterialType
Material type of shape.
Meterial parameter definition.
static CKNGeometricUnitCellInfo_cubic m_UnitCellInfo_cubic
bool SetMapInfoSize(LPNEIGHBOR_MAP_INFO lpMapInfo, double fSize)
Building Hamiltonian part.
void SetDirection(double *fDirection)
Set direciton information.
Class for calculating zincblend parameter.
static void ShowMsg(char *pszBuffer)
Show message.
bool * pbPeriodicCondition[MAX_NEIGHBOR]
An array of Neighbor no 1 bondary condition.
static void SetNeighborCoordination(CKNGeometricAtom::NEIGHOR_RELATION type, double x, double y, double z)
Setting neighbor coordination.
void ExchangeAtomInfoBetweenNode()
Get start index of atom in shape, using in MPI running enviroment.
void SetMaterialType(MATERIAL_INDEX type)
Get maetrial typpe of shap.
void SetConsideringBoundaryCondition(bool bConsider, AXIS_DEFINE direction)
Get bondary condition of shape.
CKNGeometricDirection m_shapDirection
Direction of shape.
MATERIAL_INDEX GetDomainMaterialNumber()
Get atom material type.
static bool SetAtomAndNeighborInformation(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Set neighbor information to AtomFactory.
Factory class for create CKNGeometricAtom instance.
void BuildNeighborInformation()
Find neighbor of each atom.
Data and operation representation of Matrix.
int GetNeighborPeriodicDirection(int nIndex)
Get neighbor coupling periodic direction if has coupling with periodic atom.
unsigned int GetAnionCount()
unsigned int GetNeighborCount()
std::vector< CKNGeometricAtom * > m_vectSurfaceAtom
Class for Geometric unit cell.
static void BroadcastDouble(double *pValue, unsigned int nSize, int nRootRank=0, MPI_Comm comm=MPI_COMM_NULL)
Broadcst boolean value.
double * pfX_Coordination
An array of X coordination.
bool RefillPeriodicBinding(CKNMatrixOperation::CKNCSR *pResult, CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam, LPNEIGHBOR_MAP_INFO lpMapInfo, unsigned int nRepeatIndex, double fKValue[3])
Applying phase to Hamiltonian.
static void FreeMapInfo(LPNEIGHBOR_MAP_INFO lpMapInfo)
Release mapinfo data.
static void BuildRotationMatrix(double fDegree[2])
Build rotation matrix for given direction.
static void ResetSubElementID()
Get unit cell length.
void SetOriginCoordination(double x, double y, double z)
Building Geometric part.
void Deserialize(std::vector< CKNGeometricUnitCell > *pVectUnitCell, double *pBuffer, bool bFrontSide)
Deerialize unitcells from double array.
Data and operation representation of CSR(Compressed Sparse Row)
MATERIAL_INDEX GetMaterialMaterialNumber(unsigned int nIndex)
Get Neighbor material type.
double * GetCoordinationAll()
static void SetShapeInformation(CKNGeometricShape &shape, CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Set shape information(Length, material, bondary condition and so on)
void SetDirection(double x_axis, double y_axis, double z_axis)
Set direciton of shape.
std::vector< CKNGeometricUnitCell > m_vectPrevUnitCell
Front edge unit cell that copy from previous side node.
void SetLength(double lx, double ly, double lz)
Set length of shape.
bool m_bConsiderBoundaryCondition[3]
Bondary condition for each driection.
static IKNGeometricUnitCellInfo * m_pUnitCellInfo
Unitcell information pointer for using in class internal.
int nShape[NMAXDOMAIN]
Geometric Shape.
void SetDireciton(int nDirectionSingle)
Set direction information.
static void InitNeighborList()
static int GetTotalNodeCount()
virtual void SetAtomCoordination()=0
Atom coordination setting.
double * GetDirectionAll()
Get direction information all.
MATERIAL_INDEX * pNeighborMaterial[MAX_NEIGHBOR]
An array of Neighbor material Number.
bool CalculateUnitcellCount()
Calculating unitcell count in shape.
void ArrangeAtom(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Set atoms information(coordination, type) in unit cell.
void SetOffset(CKNGeometricCoordination coord)
To offset coordination.
static void SetAtomCoordination(CKNGeometricAtom::ATOM_TYPE type, double x, double y, double z)
Setting atom coordination.
static int GetAtomCountInUnitcell()
void CheckingNeighborCandiate()
Checking neighbor unitcell by calculating index.
static double AllReduceDouble(double fNumber)
Do all reduce function with CKNComplex.
bool IsInBoundaryCondition(int x, int y, int z, int maxX, int maxY, int maxZ)
Check unitcell is in the bondary area or not.
virtual void SetNeighborCoordination()=0
Neighbor atom coordiantion setting.
double m_fAssignedCount[3]
Unitcell assigend count in shape for each direction.
Class for calculating parameter.
std::vector< CKNGeometricUnitCell > m_vectUnitCell
Array of unitcell in shape.
Class for Geometric shape.
static void MMMul(CKNDMatrix *pMatrix, CKNDMatrix *pMatrixOperand, CKNDMatrix *pResult)
Matrix and matrix multiple operation.
bool AreaScalarMultiple(unsigned int nRowStart, unsigned int nRowCount, unsigned int nColumnStart, unsigned int nColumnCount, CKNComplex Scalar)
Scalar multiple operation to specific area.
void SetAssignIndex(double fXAssignIndex, double fYAssignIndex, double fZAssignIndex)
Get Assign index.
std::vector< CKNGeometricAtom * > * GetSurfaceAtomList()
double * Serialize(double fXLayer)
Serialize unitcells with specific later index to double array.
bool bNeedRotate
Calculation parameter that need to apply rotation matrix.
CKNGeometricCoordination m_originCoordination
Orign coordination of shape.
void FinalShape()
Finalize Shape variable.
void InitCoordination()
Initial Coordination information.
bool m_bBackendFace
Flag of back end face or not.
Common definition for Solver.
void SetPeriodic(bool bPeriodic, int periodicDirection)
To mark unit cell is periodic condition.
Class for Geometric unit cell for cubic.
Structure for save input command file parsing result.
double GetKPhaseSign(double fAtomPos, double fPeriodicAtomPos)
Calculating Phase sign.
double fShapeLength[NMAXDOMAIN][3]
Shap length x, y, z, direction.
double * pfY_Coordination
An array of Y coordination.
bool TrnasPos()
Transpos matrix.
virtual void SetUnitCellSize(double fUnitcellSize[3])=0
Unitcell size setting.
double fItemCount
Item count at atom map.
double fDegree[2]
Rotation degree, this variable isn't input by command file. It is calculated by module.
CKNGeometricCoordination GetNeighborCoordination(int nIndex)
Get neighbor coordination.
static double GetSubElementID()
Reset SubElement ID to Zero.
Iterface for Unitcell information.
bool ConstructMapInfo(LPNEIGHBOR_MAP_INFO lpMapInfo, CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Extract atom information from runtime objects.
bool SetElement(unsigned int nRow, unsigned int nColumn, CKNComplex element)
Set matrix elements value.
#define ATOM_DEFAULT_INDEX
Atom index default value that empty atom instance.
double fDirection[3]
Direction x, y, z.
double m_fLength[3]
Building Geometric part.
double * pfNeighbor[MAX_NEIGHBOR]
An array of Neighbor no 1 index.
Class for Geometric shape.
unsigned int NumberingSubElement(CKNGeometricCoordination ShapeCoordination, double fLength[3], int nShapeType, char *pszDomainMatName)
Assign atom ID to sub element(atoms in unit cell)
bool bSaveMapFile
Save atom map or not.
char szDomainMat[NMAXDOMAIN][1024]
Material type.
int nSubDomainNumber
Numbers of Subdomain, except main domain.
#define UNITCELL_WRITING_BLOCK_SIZE
When serialize or deserialize how many data block converting.
bool FillUnitcell(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Set bondary condition of shape.
void InitShape()
Initialize Shape variable.
int GetPeriodicDirection(int x, int y, int z, int maxX, int maxY, int maxZ)
Get periodic direction information.
double fUnitcellLength[3]
Unitcell length x, y, z direction.
void SetBackendFace(bool bBackendFace)
Check is this back end face side in MPI running enviroment.
static void SetLength(double fLength[3], double fOriginLength[3])
Set unit cell length.
double GetCoordination(AXIS_DEFINE coord)
Get coordination specific axis.
bool IsPeriodicAtom()
Set atom is periodic.
This class includes functions for matrix debugging.
char szStructureType[1024]
Structure type.
void SetShapeForm(unsigned int form)
Get form type of shape.
void SetFrontFace(bool bFrontFace)
Check is this front face side in MPI running enviroment.
static int GetCurrentRank()
Class for Geometric unit cell for cubic.
#define FIND_TARGET_INDEX(targetC, AssignIndex, AssigneCount, direction)
void SetSubDomainMaterial(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Set atoms information(coordination, type) in unit cell.
CKNGeometricAtom * GetAtomByIndex(double fID)
Get atom instance by ID.
double m_fTotalAtomCountinMPI
Total valid atom count in shape.
double * pfID
An array of atom ID.
#define ALLOC_WITH_NULL_INIT(pointer, data_type, data_size)
#define PI_VALUE
Pi definition.
static double CalculatingIndex(double fXAssignedIndex, double fYAssignedIndex, double fZAssignedIndex, double fAssignedCount[3])
Calulating unit cell index.
bool IsPeriodicCoupling(int nIndex)
Check is this periodic atom.
MATERIAL_INDEX GetMaterialNumber()
Get atom typpe.
unsigned int GetCationCount()
Get anion count in Unitcell.
int GetC2ANeighborCount()
Get neigbhor relation count.
void RotateNeighbor(CKNMatrixOperation::CKNDMatrix *pRotationMatrix)
Rotating neighbor coordination.
#define FREE_MEM(pointer)
Macro for memory allocation and assign null value.
void PeriodicUnitCellNumbering(bool bXAxis=false)
Numbering to periodic unitcell.
bool m_bFrontFace
Flag of front face or not.
double m_fAtomIDStartIndex
Start atom index in current Shape.
void RotateMatrix(CKNMatrixOperation::CKNDMatrix *pMatrixNbr, CKNMatrixOperation::CKNDMatrix *pMatrixResult, double fDegree[2])
Rotate matrix with calculated degree.
This class for complex operation and saving value.
MATERIAL_INDEX * pMaterialNumber
An array of Atom number.
void FreeUnitCellList()
Relase unitcell list.
static double GetLength(AXIS_DEFINE index)
CKNGeometricAtom::ATOM_TYPE * pAtomType
An array of atom type 0:A, 1:C.
CKNGeometricCoordination GetCoordination()
Get Domain atom material type.
void SetCoordination(CKNGeometricCoordination coordination)
Get coordination of unit cell.
void SetCoordination(CKNGeometricCoordination coordination)
Get coordination with double buffer.
void ArrangeUnitCell(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Arranging unitcell into shape.
static void CalculateDegree(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Calculating degree from direction information.
static bool IsRootRank()
Get Total node count.
char szShape[NMAXDOMAIN][1024]
Geometric Shape.
#define ORBITALS
At Hamiltonian matrix one atom inserted 10 * 10.
unsigned int m_nAtomLastLayer
Last layer information for sending to next node.
CKNGeometricCoordination GetNeighborCoordination(CKNGeometricAtom::NEIGHOR_RELATION neighborType, unsigned int nIndex)
Get neigbhor atom coordination from Unitcell.
Class for Material Parameter.
void Deserialize(double *pBuffer)
Convert double buffer to unit cell data.
void SetUnitcellList(std::vector< CKNGeometricUnitCell > *pVect, std::vector< CKNGeometricUnitCell > *pVectPrev, std::vector< CKNGeometricUnitCell > *pVectNext)
Set unit cell list of shape to each unit cell.
void BuildGeoFileName(char *pszFileName, CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Make atom map naming.
static void SendDoubleBufferSync(int nTargetRank, double *pBuffer, int nSize, MPI_Request *req, MPI_Comm commWorld=MPI_COMM_NULL)
Sending buffer for double data array with sync.
void ShiftAtomID(double fShift)
Shift atom id in MPI running enviroment.
void SetComplexNumber(double fReal, double fImaginaray)
Set Complex number using real part and imaginary part.
MATERIAL_INDEX * pDomainMaterialNumber
An array of Domain Atom number.
int GetA2CNeighborCount()
Get neigbhor relation count.
bool BuildMatrixFirst(unsigned int nRow, unsigned int nColumn)
Building matrix elements.
CKNGeometricCoordination GetAtomCoordination(CKNGeometricAtom::ATOM_TYPE atomType, unsigned int nIndex)
Get Unitcell size x, y, z direction axis.
Structure for neighbor information.
bool bConsiderBoundaryCondition[3]
Considering bondary condition or not x, y, z direction.
double * GetUnitcCellSize()
Get cation count in Unitcell.
static CKNMatrixOperation::CKNDMatrix m_rotationMatrix
Rotation matrix for given direction.
double GetNeighborAtomID(unsigned int nIndex)
Get neighbor atom count.
static void SetNeighborNumber(unsigned int nNeighborNumber)
Get periodic direction information.
int nDirectionSingle
Direction xyz.
static CKNGeometricUnitCellInfo_zincblende m_UnitCellInfo_zincblende
void InitMapInfo(LPNEIGHBOR_MAP_INFO lpMapInfo)
Intilize map info data.
double fOrigin[NMAXDOMAIN][3]
Coordinator original coordinate.
static bool IsDeflationRoot()
Checking is root rank of Lanczos computation.
static void ReceiveDoubleBufferSync(int nSourceRank, double *pBuffer, int nSize, MPI_Request *req, MPI_Comm commWorld=MPI_COMM_NULL)
Receivinging buffer for double data array with sync.
unsigned int m_nAtomFirstLayer
Get Surface atom list.