1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
34 * GROningen Mixture of Alchemy and Childrens' Stories
40 #ifdef GMX_THREAD_SHM_FDECOMP
41 #include <thread_mpi.h>
58 #include "gmx_fatal.h"
64 #include "nonbonded.h"
66 #include "nb_kernel_c/nb_kernel_c.h"
67 #include "nb_kernel_adress_c/nb_kernel_c_adress.h"
68 #include "nb_free_energy.h"
69 #include "nb_generic.h"
70 #include "nb_generic_cg.h"
71 #include "nb_generic_adress.h"
74 /* 1,4 interactions uses kernel 330 directly */
75 #include "nb_kernel_c/nb_kernel330.h"
76 #include "nb_kernel_adress_c/nb_kernel330_adress.h"
78 #ifdef GMX_PPC_ALTIVEC
79 #include "nb_kernel_ppc_altivec/nb_kernel_ppc_altivec.h"
82 #if defined(GMX_IA32_SSE)
83 #include "nb_kernel_ia32_sse/nb_kernel_ia32_sse.h"
86 #if defined(GMX_IA32_SSE2)
87 #include "nb_kernel_ia32_sse2/nb_kernel_ia32_sse2.h"
90 #if defined(GMX_X86_64_SSE)
91 #include "nb_kernel_x86_64_sse/nb_kernel_x86_64_sse.h"
94 #if defined(GMX_X86_64_SSE2)
95 #include "nb_kernel_x86_64_sse2/nb_kernel_x86_64_sse2.h"
100 # include "nb_kernel_sse2_double/nb_kernel_sse2_double.h"
102 # include "nb_kernel_sse2_single/nb_kernel_sse2_single.h"
106 #if defined(GMX_FORTRAN)
108 # include "nb_kernel_f77_double/nb_kernel_f77_double.h"
110 # include "nb_kernel_f77_single/nb_kernel_f77_single.h"
114 #if (defined GMX_IA64_ASM && defined GMX_DOUBLE)
115 #include "nb_kernel_ia64_double/nb_kernel_ia64_double.h"
118 #if (defined GMX_IA64_ASM && !defined GMX_DOUBLE)
119 #include "nb_kernel_ia64_single/nb_kernel_ia64_single.h"
123 #include "nb_kernel_power6/nb_kernel_power6.h"
127 #include "nb_kernel_bluegene/nb_kernel_bluegene.h"
132 enum { TABLE_NONE, TABLE_COMBINED, TABLE_COUL, TABLE_VDW, TABLE_NR };
135 /* Table version for each kernel.
138 nb_kernel_table[eNR_NBKERNEL_NR] =
140 TABLE_NONE, /* kernel010 */
141 TABLE_NONE, /* kernel020 */
142 TABLE_VDW, /* kernel030 */
143 TABLE_NONE, /* kernel100 */
144 TABLE_NONE, /* kernel101 */
145 TABLE_NONE, /* kernel102 */
146 TABLE_NONE, /* kernel103 */
147 TABLE_NONE, /* kernel104 */
148 TABLE_NONE, /* kernel110 */
149 TABLE_NONE, /* kernel111 */
150 TABLE_NONE, /* kernel112 */
151 TABLE_NONE, /* kernel113 */
152 TABLE_NONE, /* kernel114 */
153 TABLE_NONE, /* kernel120 */
154 TABLE_NONE, /* kernel121 */
155 TABLE_NONE, /* kernel122 */
156 TABLE_NONE, /* kernel123 */
157 TABLE_NONE, /* kernel124 */
158 TABLE_VDW, /* kernel130 */
159 TABLE_VDW, /* kernel131 */
160 TABLE_VDW, /* kernel132 */
161 TABLE_VDW, /* kernel133 */
162 TABLE_VDW, /* kernel134 */
163 TABLE_NONE, /* kernel200 */
164 TABLE_NONE, /* kernel201 */
165 TABLE_NONE, /* kernel202 */
166 TABLE_NONE, /* kernel203 */
167 TABLE_NONE, /* kernel204 */
168 TABLE_NONE, /* kernel210 */
169 TABLE_NONE, /* kernel211 */
170 TABLE_NONE, /* kernel212 */
171 TABLE_NONE, /* kernel213 */
172 TABLE_NONE, /* kernel214 */
173 TABLE_NONE, /* kernel220 */
174 TABLE_NONE, /* kernel221 */
175 TABLE_NONE, /* kernel222 */
176 TABLE_NONE, /* kernel223 */
177 TABLE_NONE, /* kernel224 */
178 TABLE_VDW, /* kernel230 */
179 TABLE_VDW, /* kernel231 */
180 TABLE_VDW, /* kernel232 */
181 TABLE_VDW, /* kernel233 */
182 TABLE_VDW, /* kernel234 */
183 TABLE_COUL, /* kernel300 */
184 TABLE_COUL, /* kernel301 */
185 TABLE_COUL, /* kernel302 */
186 TABLE_COUL, /* kernel303 */
187 TABLE_COUL, /* kernel304 */
188 TABLE_COUL, /* kernel310 */
189 TABLE_COUL, /* kernel311 */
190 TABLE_COUL, /* kernel312 */
191 TABLE_COUL, /* kernel313 */
192 TABLE_COUL, /* kernel314 */
193 TABLE_COUL, /* kernel320 */
194 TABLE_COUL, /* kernel321 */
195 TABLE_COUL, /* kernel322 */
196 TABLE_COUL, /* kernel323 */
197 TABLE_COUL, /* kernel324 */
198 TABLE_COMBINED, /* kernel330 */
199 TABLE_COMBINED, /* kernel331 */
200 TABLE_COMBINED, /* kernel332 */
201 TABLE_COMBINED, /* kernel333 */
202 TABLE_COMBINED, /* kernel334 */
203 TABLE_NONE, /* kernel400 */
204 TABLE_NONE, /* kernel410 */
205 TABLE_VDW /* kernel430 */
210 static nb_kernel_t **
211 nb_kernel_list = NULL;
213 static nb_adress_kernel_t **
214 nb_kernel_list_adress = NULL;
217 gmx_setup_kernels(FILE *fplog,gmx_bool bGenericKernelOnly)
221 snew(nb_kernel_list,eNR_NBKERNEL_NR);
223 /* Note that later calls overwrite earlier, so the preferred (fastest)
224 * version should be at the end. For instance, we call SSE after 3DNow.
227 for(i=0; i<eNR_NBKERNEL_NR; i++)
229 nb_kernel_list[i] = NULL;
232 if (bGenericKernelOnly)
239 fprintf(fplog,"Configuring nonbonded kernels...\n");
242 nb_kernel_setup(fplog,nb_kernel_list);
244 if(getenv("GMX_NOOPTIMIZEDKERNELS") != NULL)
249 /* Setup kernels. The last called setup routine will overwrite earlier assignments,
250 * so we should e.g. test SSE3 support _after_ SSE2 support,
251 * and call e.g. Fortran setup before SSE.
254 #if defined(GMX_FORTRAN) && defined(GMX_DOUBLE)
255 nb_kernel_setup_f77_double(fplog,nb_kernel_list);
258 #if defined(GMX_FORTRAN) && !defined(GMX_DOUBLE)
259 nb_kernel_setup_f77_single(fplog,nb_kernel_list);
263 nb_kernel_setup_bluegene(fplog,nb_kernel_list);
267 nb_kernel_setup_power6(fplog,nb_kernel_list);
270 #ifdef GMX_PPC_ALTIVEC
271 nb_kernel_setup_ppc_altivec(fplog,nb_kernel_list);
274 #if defined(GMX_IA32_SSE)
275 nb_kernel_setup_ia32_sse(fplog,nb_kernel_list);
278 #if defined(GMX_IA32_SSE2)
279 nb_kernel_setup_ia32_sse2(fplog,nb_kernel_list);
282 #if defined(GMX_X86_64_SSE)
283 nb_kernel_setup_x86_64_sse(fplog,nb_kernel_list);
286 #if defined(GMX_X86_64_SSE2)
287 nb_kernel_setup_x86_64_sse2(fplog,nb_kernel_list);
290 #if (defined GMX_IA64_ASM && defined GMX_DOUBLE)
291 nb_kernel_setup_ia64_double(fplog,nb_kernel_list);
294 #if (defined GMX_IA64_ASM && !defined GMX_DOUBLE)
295 nb_kernel_setup_ia64_single(fplog,nb_kernel_list);
300 fprintf(fplog,"\n\n");
305 gmx_setup_adress_kernels(FILE *fplog,gmx_bool bGenericKernelOnly) {
308 snew(nb_kernel_list_adress, eNR_NBKERNEL_NR);
310 for (i = 0; i < eNR_NBKERNEL_NR; i++) {
311 nb_kernel_list_adress[i] = NULL;
314 if (bGenericKernelOnly)
319 nb_kernel_setup_adress(fplog, nb_kernel_list_adress);
322 void do_nonbonded(t_commrec *cr,t_forcerec *fr,
323 rvec x[],rvec f[],t_mdatoms *mdatoms,t_blocka *excl,
324 real egnb[],real egcoul[],real egpol[],rvec box_size,
325 t_nrnb *nrnb,real lambda,real *dvdlambda,
326 int nls,int eNL,int flags)
328 gmx_bool bLR,bDoForces,bForeignLambda;
331 int n,n0,n1,i,i0,i1,nrnb_ind,sz;
338 int outeriter,inneriter;
339 real * tabledata = NULL;
342 nb_kernel_t *kernelptr=NULL;
343 nb_adress_kernel_t *adresskernelptr=NULL;
345 gmx_bool bCG; /* for AdresS */
346 int k;/* for AdresS */
348 bLR = (flags & GMX_DONB_LR);
349 bDoForces = (flags & GMX_DONB_FORCES);
350 bForeignLambda = (flags & GMX_DONB_FOREIGNLAMBDA);
352 bCG = FALSE; /* for AdresS */
354 gbdata.gb_epsilon_solvent = fr->gb_epsilon_solvent;
355 gbdata.epsilon_r = fr->epsilon_r;
358 if (!fr->adress_type==eAdressOff && !bDoForces){
359 gmx_fatal(FARGS,"No force kernels not implemeted for adress");
366 #if (defined GMX_SSE2 || defined GMX_X86_64_SSE || defined GMX_X86_64_SSE2 || defined GMX_IA32_SSE || defined GMX_IA32_SSE2)
368 if(fr->UseOptimizedKernels)
370 nb_kernel_allvsallgb_sse2_double(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,egpol,
371 &outeriter,&inneriter,&fr->AllvsAll_work);
375 nb_kernel_allvsallgb(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,egpol,
376 &outeriter,&inneriter,&fr->AllvsAll_work);
378 # else /* not double */
379 if(fr->UseOptimizedKernels)
381 nb_kernel_allvsallgb_sse2_single(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,egpol,
382 &outeriter,&inneriter,&fr->AllvsAll_work);
386 nb_kernel_allvsallgb(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,egpol,
387 &outeriter,&inneriter,&fr->AllvsAll_work);
389 # endif /* double/single alt. */
390 #else /* no SSE support compiled in */
391 nb_kernel_allvsallgb(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,egpol,
392 &outeriter,&inneriter,&fr->AllvsAll_work);
394 inc_nrnb(nrnb,eNR_NBKERNEL_ALLVSALLGB,inneriter);
398 #if (defined GMX_SSE2 || defined GMX_X86_64_SSE || defined GMX_X86_64_SSE2 || defined GMX_IA32_SSE || defined GMX_IA32_SSE2)
400 if(fr->UseOptimizedKernels)
402 nb_kernel_allvsall_sse2_double(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,
403 &outeriter,&inneriter,&fr->AllvsAll_work);
407 nb_kernel_allvsall(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,
408 &outeriter,&inneriter,&fr->AllvsAll_work);
411 # else /* not double */
412 if(fr->UseOptimizedKernels)
414 nb_kernel_allvsall_sse2_single(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,
415 &outeriter,&inneriter,&fr->AllvsAll_work);
419 nb_kernel_allvsall(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,
420 &outeriter,&inneriter,&fr->AllvsAll_work);
423 # endif /* double/single check */
424 #else /* No SSE2 support compiled in */
425 nb_kernel_allvsall(fr,mdatoms,excl,x[0],f[0],egcoul,egnb,
426 &outeriter,&inneriter,&fr->AllvsAll_work);
429 inc_nrnb(nrnb,eNR_NBKERNEL_ALLVSALL,inneriter);
431 inc_nrnb(nrnb,eNR_NBKERNEL_OUTER,outeriter);
457 if(nb_kernel_list == NULL)
459 gmx_fatal(FARGS,"gmx_setup_kernels has not been called");
462 fshift = fr->fshift[0];
464 for(n=n0; (n<n1); n++)
466 nblists = &fr->nblists[n];
467 for(i=i0; (i<i1); i++)
469 outeriter = inneriter = 0;
473 nlist = &(nblists->nlist_lr[i]);
477 nlist = &(nblists->nlist_sr[i]);
482 nrnb_ind = nlist->il_code;
484 if(nrnb_ind==eNR_NBKERNEL_FREE_ENERGY)
486 /* generic free energy, use combined table */
487 tabledata = nblists->tab.tab;
493 /* We don't need the non-perturbed interactions */
497 tabletype = nb_kernel_table[nrnb_ind];
499 /* normal kernels, not free energy */
502 nrnb_ind += eNR_NBKERNEL_NR/2;
505 if(tabletype == TABLE_COMBINED)
507 tabledata = nblists->tab.tab;
509 else if(tabletype == TABLE_COUL)
511 tabledata = nblists->coultab;
513 else if(tabletype == TABLE_VDW)
515 tabledata = nblists->vdwtab;
525 if(nlist->free_energy)
529 gmx_fatal(FARGS,"Cannot do free energy Buckingham interactions.");
532 gmx_nb_free_energy_kernel(nlist->icoul,
568 else if (nlist->enlist == enlistCG_CG)
570 if (fr->adress_type==eAdressOff){
571 /* Call the charge group based inner loop */
572 gmx_nb_generic_cg_kernel(nlist,
587 /*gmx_nb_generic_adress_kernel(nlist,
599 gmx_fatal(FARGS,"Death & horror! Adress cgcg kernel not implemented anymore.\n");
606 /* for adress we need to determine for each energy group wether it is explicit or coarse-grained */
607 if (!fr->adress_type == eAdressOff) {
609 if ( !fr->adress_group_explicit[ mdatoms->cENER[nlist->iinr[0]] ] ){
612 /* If this processor has only explicit atoms (w=1)
613 skip the coarse grained force calculation. Same for
614 only coarsegrained atoms and explicit interactions.
615 Last condition is to make sure that generic kernel is not
617 if (mdatoms->pureex && bCG && nb_kernel_list[nrnb_ind] != NULL) continue;
618 if (mdatoms->purecg && !bCG && nb_kernel_list[nrnb_ind] != NULL) continue;
621 if (fr->adress_type == eAdressOff ||
624 /* if we only have to calculate pure cg/ex interactions
625 we can use the faster standard gromacs kernels*/
626 kernelptr = nb_kernel_list[nrnb_ind];
628 /* This processor has hybrid interactions which means
630 * use our own kernels. We have two kernel types: one that
631 * calculates the forces with the explicit prefactor w1*w2
632 * and one for coarse-grained with (1-w1*w2)
633 * explicit kernels are the second part of the kernel
635 if (!bCG) nrnb_ind += eNR_NBKERNEL_NR/2;
636 adresskernelptr = nb_kernel_list_adress[nrnb_ind];
639 if (kernelptr == NULL && adresskernelptr == NULL)
641 /* Call a generic nonbonded kernel */
643 /* If you want to hack/test your own interactions,
644 * do it in this routine and make sure it is called
645 * by setting the environment variable GMX_NB_GENERIC.
647 if (fr->adress_type==eAdressOff){
649 gmx_nb_generic_kernel(nlist,
661 }else /* do generic AdResS kernels (slow)*/
664 gmx_nb_generic_adress_kernel(nlist,
683 /* Call nonbonded kernel from function pointer */
684 if (kernelptr!=NULL){
685 (*kernelptr)( &(nlist->nri),
704 &(nblists->tab.scale),
716 }else if (adresskernelptr != NULL)
717 { /* Adress kernels */
718 (*adresskernelptr)( &(nlist->nri),
737 &(nblists->tab.scale),
748 fr->adress_ex_forcecap,
754 /* Update flop accounting */
756 /* Outer loop in kernel */
757 switch (nlist->enlist) {
758 case enlistATOM_ATOM: fac = 1; break;
759 case enlistSPC_ATOM: fac = 3; break;
760 case enlistSPC_SPC: fac = 9; break;
761 case enlistTIP4P_ATOM: fac = 4; break;
762 case enlistTIP4P_TIP4P: fac = 16; break;
763 case enlistCG_CG: fac = 1; break;
765 inc_nrnb(nrnb,eNR_NBKERNEL_OUTER,fac*outeriter);
767 /* inner loop in kernel */
768 inc_nrnb(nrnb,nrnb_ind,inneriter);
776 do_listed_vdw_q(int ftype,int nbonds,
777 const t_iatom iatoms[],const t_iparams iparams[],
778 const rvec x[],rvec f[],rvec fshift[],
779 const t_pbc *pbc,const t_graph *g,
780 real lambda,real *dvdlambda,
782 const t_forcerec *fr,gmx_grppairener_t *grppener,
783 int *global_atom_index)
785 static gmx_bool bWarn=FALSE;
786 real eps,r2,*tab,rtab2=0;
787 rvec dx,x14[2],f14[2];
789 int typeA[2]={0,0},typeB[2]={0,1};
790 real chargeA[2]={0,0},chargeB[2];
791 int gid,shift_vir,shift_f;
792 int j_index[] = { 0, 1 };
795 int outeriter,inneriter;
798 real krf,crf,tabscale;
801 real *egnb=NULL,*egcoul=NULL;
804 gmx_bool bMolPBC,bFreeEnergy;
806 gmx_bool bCG; /* AdResS*/
807 real wf14[2]={0,0}; /* AdResS*/
809 #if GMX_THREAD_SHM_FDECOMP
816 #if GMX_THREAD_SHM_FDECOMP
817 pthread_mutex_initialize(&mtx);
820 bMolPBC = fr->bMolPBC;
825 eps = fr->epsfac*fr->fudgeQQ;
827 egnb = grppener->ener[egLJ14];
828 egcoul = grppener->ener[egCOUL14];
833 egnb = grppener->ener[egLJSR];
834 egcoul = grppener->ener[egCOULSR];
837 gmx_fatal(FARGS,"Unknown function type %d in do_nonbonded14",
841 rtab2 = sqr(fr->tab14.r);
842 tabscale = fr->tab14.scale;
847 /* Determine the values for icoul/ivdw. */
851 else if(fr->bcoultab)
855 else if(fr->eeltype == eelRF_NEC)
878 bCG = FALSE; /*Adres*/
879 /* We don't do SSE or altivec here, due to large overhead for 4-fold
880 * unrolling on short lists
884 for(i=0; (i<nbonds); )
889 gid = GID(md->cENER[ai],md->cENER[aj],md->nenergrp);
891 if (!fr->adress_type == eAdressOff) {
892 if (fr->adress_group_explicit[md->cENER[ai]] != fr->adress_group_explicit[md->cENER[aj]]){
893 /*exclude cg-ex interaction*/
896 bCG = !fr->adress_group_explicit[md->cENER[ai]];
897 wf14[0] = md->wf[ai];
898 wf14[1] = md->wf[aj];
903 (fr->efep != efepNO &&
904 ((md->nPerturbed && (md->bPerturbed[ai] || md->bPerturbed[aj])) ||
905 iparams[itype].lj14.c6A != iparams[itype].lj14.c6B ||
906 iparams[itype].lj14.c12A != iparams[itype].lj14.c12B));
907 chargeA[0] = md->chargeA[ai];
908 chargeA[1] = md->chargeA[aj];
909 nbfp = (real *)&(iparams[itype].lj14.c6A);
912 eps = fr->epsfac*iparams[itype].ljc14.fqq;
913 chargeA[0] = iparams[itype].ljc14.qi;
914 chargeA[1] = iparams[itype].ljc14.qj;
915 nbfp = (real *)&(iparams[itype].ljc14.c6);
918 chargeA[0] = iparams[itype].ljcnb.qi;
919 chargeA[1] = iparams[itype].ljcnb.qj;
920 nbfp = (real *)&(iparams[itype].ljcnb.c6);
926 /* This is a bonded interaction, atoms are in the same box */
928 r2 = distance2(x[ai],x[aj]);
932 /* Apply full periodic boundary conditions */
933 shift_f = pbc_dx_aiuc(pbc,x[ai],x[aj],dx);
941 fprintf(stderr,"Warning: 1-4 interaction between %d and %d "
942 "at distance %.3f which is larger than the 1-4 table size %.3f nm\n",
943 glatnr(global_atom_index,ai),
944 glatnr(global_atom_index,aj),
945 sqrt(r2), sqrt(rtab2));
946 fprintf(stderr,"These are ignored for the rest of the simulation\n");
947 fprintf(stderr,"This usually means your system is exploding,\n"
948 "if not, you should increase table-extension in your mdp file\n"
949 "or with user tables increase the table size\n");
953 fprintf(debug,"%8f %8f %8f\n%8f %8f %8f\n1-4 (%d,%d) interaction not within cut-off! r=%g. Ignored\n",
954 x[ai][XX],x[ai][YY],x[ai][ZZ],
955 x[aj][XX],x[aj][YY],x[aj][ZZ],
956 glatnr(global_atom_index,ai),
957 glatnr(global_atom_index,aj),
962 copy_rvec(x[ai],x14[0]);
963 copy_rvec(x[aj],x14[1]);
967 fprintf(debug,"LJ14: grp-i=%2d, grp-j=%2d, ngrp=%2d, GID=%d\n",
968 md->cENER[ai],md->cENER[aj],md->nenergrp,gid);
971 outeriter = inneriter = count = 0;
974 chargeB[0] = md->chargeB[ai];
975 chargeB[1] = md->chargeB[aj];
976 /* We pass &(iparams[itype].lj14.c6A) as LJ parameter matrix
978 * Here we use that the LJ-14 parameters are stored in iparams
979 * as c6A,c12A,c6B,c12B, which are referenced correctly
980 * in the innerloops if we assign type combinations 0-0 and 0-1
981 * to atom pair ai-aj in topologies A and B respectively.
985 gmx_fatal(FARGS,"Cannot do free energy Buckingham interactions.");
988 gmx_nb_free_energy_kernel(icoul,
1026 if (fr->adress_type==eAdressOff || !fr->adress_do_hybridpairs){
1027 /* Not perturbed - call kernel 330 */
1062 nb_kernel330_adress_cg(&i1,
1092 fr->adress_ex_forcecap,
1095 nb_kernel330_adress_ex(&i1,
1125 fr->adress_ex_forcecap,
1132 /* Add the forces */
1133 rvec_inc(f[ai],f14[0]);
1134 rvec_dec(f[aj],f14[0]);
1138 /* Correct the shift forces using the graph */
1139 ivec_sub(SHIFT_IVEC(g,ai),SHIFT_IVEC(g,aj),dt);
1140 shift_vir = IVEC2IS(dt);
1141 rvec_inc(fshift[shift_vir],f14[0]);
1142 rvec_dec(fshift[CENTRAL],f14[0]);
1145 /* flops: eNR_KERNEL_OUTER + eNR_KERNEL330 + 12 */