| version 1.114 | version 1.115 |
|---|
| |
| float *work; | float *work; |
| #endif | #endif |
| | |
| int fepOn, lesOn, lesFactor, pairOn, selfOn, numGrids; | int fepOn, thermInt, lesOn, lesFactor, pairOn, selfOn, numGrids; |
| | int decouple; |
| | |
| LocalPmeInfo *localInfo; | LocalPmeInfo *localInfo; |
| int qgrid_size; | int qgrid_size; |
| |
| PatchMap *patchMap = PatchMap::Object(); | PatchMap *patchMap = PatchMap::Object(); |
| | |
| fepOn = simParams->fepOn; | fepOn = simParams->fepOn; |
| numGrids = fepOn ? 2 : 1; | thermInt = simParams->thermInt; |
| | decouple = (fepOn || thermInt) && (simParams->decouple == 1); |
| | numGrids = (fepOn || thermInt) ? (decouple ? 4 : 2) : 1; |
| lesOn = simParams->lesOn; | lesOn = simParams->lesOn; |
| useBarrier = simParams->PMEBarrier; | useBarrier = simParams->PMEBarrier; |
| if ( lesOn ) { | if ( lesOn ) { |
| |
| SimParameters *simParams = Node::Object()->simParameters; | SimParameters *simParams = Node::Object()->simParameters; |
| | |
| fepOn = simParams->fepOn; | fepOn = simParams->fepOn; |
| numGrids = fepOn ? 2 : 1; | thermInt = simParams->thermInt; |
| | decouple = (simParams->decouple == 1); |
| | numGrids = (fepOn || thermInt) ? (decouple ? 4 : 2) : 1; |
| lesOn = simParams->lesOn; | lesOn = simParams->lesOn; |
| if ( lesOn ) { | if ( lesOn ) { |
| lesFactor = simParams->lesFactor; | lesFactor = simParams->lesFactor; |
| |
| } | } |
| | |
| // copy to other grids if needed | // copy to other grids if needed |
| if ( fepOn || lesOn ) { | if ( ((fepOn || thermInt) && (!decouple)) || lesOn ) { |
| for ( g=0; g<numGrids; ++g ) { | for ( g=0; g<numGrids; ++g ) { |
| #ifdef NETWORK_PROGRESS | #ifdef NETWORK_PROGRESS |
| CmiNetworkProgress(); | CmiNetworkProgress(); |
| |
| } | } |
| numGridAtoms[g] = nga; | numGridAtoms[g] = nga; |
| } | } |
| | } else if ( (fepOn || thermInt) && decouple) { |
| | // alchemical decoupling: four grids |
| | // g=0: partition 0 and partition 1 |
| | // g=1: partition 0 and partition 2 |
| | // g=2: only partition 1 atoms |
| | // g=3: only partition 2 atoms |
| | for ( g=0; g<2; ++g ) { // same as before for first 2 |
| | #ifdef NETWORK_PROGRESS |
| | CmiNetworkProgress(); |
| | #endif |
| | |
| | PmeParticle *lgd = localGridData[g]; |
| | int nga = 0; |
| | for(int i=0; i<numLocalAtoms; ++i) { |
| | if ( localPartition[i] == 0 || localPartition[i] == (g+1) ) { |
| | lgd[nga++] = localData[i]; |
| | } |
| | } |
| | numGridAtoms[g] = nga; |
| | } |
| | for (g=2 ; g<4 ; ++g ) { // only alchemical atoms for these last 2 grids |
| | #ifdef NETWORK_PROGRESS |
| | CmiNetworkProgress(); |
| | #endif |
| | |
| | PmeParticle *lgd = localGridData[g]; |
| | int nga = 0; |
| | for(int i=0; i<numLocalAtoms; ++i) { |
| | if ( localPartition[i] == (g-1) ) { |
| | lgd[nga++] = localData[i]; |
| | } |
| | } |
| | numGridAtoms[g] = nga; |
| | } |
| } else if ( selfOn ) { | } else if ( selfOn ) { |
| if ( numGrids != 1 ) NAMD_bug("ComputePme::doWork assertion 1 failed"); | if ( numGrids != 1 ) NAMD_bug("ComputePme::doWork assertion 1 failed"); |
| g = 0; | g = 0; |
| |
| Vector *localResults = new Vector[numLocalAtoms* | Vector *localResults = new Vector[numLocalAtoms* |
| ((numGrids>1 || selfOn)?2:1)]; | ((numGrids>1 || selfOn)?2:1)]; |
| Vector *gridResults; | Vector *gridResults; |
| if ( fepOn || lesOn || selfOn || pairOn ) { | if ( fepOn || thermInt || lesOn || selfOn || pairOn ) { |
| for(int i=0; i<numLocalAtoms; ++i) { localResults[i] = 0.; } | for(int i=0; i<numLocalAtoms; ++i) { localResults[i] = 0.; } |
| gridResults = localResults + numLocalAtoms; | gridResults = localResults + numLocalAtoms; |
| } else { | } else { |
| |
| delete myRealSpace[g]; | delete myRealSpace[g]; |
| scale_forces(gridResults, numGridAtoms[g], lattice); | scale_forces(gridResults, numGridAtoms[g], lattice); |
| | |
| if ( fepOn || lesOn ) { | if ( fepOn || thermInt || lesOn ) { |
| double scale = 1.; | double scale = 1.; |
| if ( fepOn ) { | if ( fepOn || thermInt ) { |
| if ( g == 0 ) scale = simParams->lambda; | if ( g == 0 ) scale = simParams->lambda; |
| else if ( g == 1 ) scale = 1. - simParams->lambda; | else if ( g == 1 ) scale = 1. - simParams->lambda; |
| | if (decouple) { |
| | if ( g == 2 ) scale = 1. - simParams->lambda; |
| | else if ( g == 3 ) scale = simParams->lambda; |
| | } |
| } else if ( lesOn ) { | } else if ( lesOn ) { |
| scale = 1.0 / (double)lesFactor; | scale = 1.0 / (double)lesFactor; |
| } | } |
| |
| | |
| for ( g=0; g<numGrids; ++g ) { | for ( g=0; g<numGrids; ++g ) { |
| double scale = 1.; | double scale = 1.; |
| if ( fepOn ) { | if ( fepOn || thermInt ) { |
| if ( g == 0 ) scale = simParams->lambda; | if ( g == 0 ) scale = simParams->lambda; |
| else if ( g == 1 ) scale = 1. - simParams->lambda; | else if ( g == 1 ) scale = 1. - simParams->lambda; |
| | if (decouple) { |
| | if ( g == 2 ) scale = 1. - simParams->lambda; |
| | else if ( g == 3 ) scale = simParams->lambda; |
| | } |
| } else if ( lesOn ) { | } else if ( lesOn ) { |
| scale = 1.0 / (double)lesFactor; | scale = 1.0 / (double)lesFactor; |
| } else if ( pairOn ) { | } else if ( pairOn ) { |
| |
| double scale2 = 0.; | double scale2 = 0.; |
| if ( fepOn && g == 0 ) scale2 = simParams->lambda2; | if ( fepOn && g == 0 ) scale2 = simParams->lambda2; |
| else if ( fepOn && g == 1 ) scale2 = 1. - simParams->lambda2; | else if ( fepOn && g == 1 ) scale2 = 1. - simParams->lambda2; |
| | if (decouple && fepOn && g == 2 ) scale2 = 1. - simParams->lambda2; |
| | else if (decouple && fepOn && g == 3 ) scale2 = simParams->lambda2; |
| reduction->item(REDUCTION_ELECT_ENERGY_SLOW_F) += evir[g][0] * scale2; | reduction->item(REDUCTION_ELECT_ENERGY_SLOW_F) += evir[g][0] * scale2; |
| | if ( thermInt && g == 0 ) reduction->item(REDUCTION_ELECT_ENERGY_PME_TI) += evir[g][0]; |
| | else if ( thermInt && g == 1 ) reduction->item(REDUCTION_ELECT_ENERGY_PME_TI) -= evir[g][0]; |
| | if (decouple && thermInt && g == 2 ) reduction->item(REDUCTION_ELECT_ENERGY_PME_TI) -= evir[g][0]; |
| | else if (decouple && thermInt && g == 3 ) reduction->item(REDUCTION_ELECT_ENERGY_PME_TI) += evir[g][0]; |
| } | } |
| reduction->item(REDUCTION_STRAY_CHARGE_ERRORS) += strayChargeErrors; | reduction->item(REDUCTION_STRAY_CHARGE_ERRORS) += strayChargeErrors; |
| reduction->submit(); | reduction->submit(); |