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"
80 #if 0 && defined (GMX_X86_SSE2)
82 # include "nb_kernel_sse2_double/nb_kernel_sse2_double.h"
84 # include "nb_kernel_sse2_single/nb_kernel_sse2_single.h"
88 #if defined(GMX_FORTRAN)
90 # include "nb_kernel_f77_double/nb_kernel_f77_double.h"
92 # include "nb_kernel_f77_single/nb_kernel_f77_single.h"
98 #include "nb_kernel_power6/nb_kernel_power6.h"
102 #include "nb_kernel_bluegene/nb_kernel_bluegene.h"
107 enum { TABLE_NONE
, TABLE_COMBINED
, TABLE_COUL
, TABLE_VDW
, TABLE_NR
};
110 /* Table version for each kernel.
113 nb_kernel_table
[eNR_NBKERNEL_NR
] =
115 TABLE_NONE
, /* kernel010 */
116 TABLE_NONE
, /* kernel020 */
117 TABLE_VDW
, /* kernel030 */
118 TABLE_NONE
, /* kernel100 */
119 TABLE_NONE
, /* kernel101 */
120 TABLE_NONE
, /* kernel102 */
121 TABLE_NONE
, /* kernel103 */
122 TABLE_NONE
, /* kernel104 */
123 TABLE_NONE
, /* kernel110 */
124 TABLE_NONE
, /* kernel111 */
125 TABLE_NONE
, /* kernel112 */
126 TABLE_NONE
, /* kernel113 */
127 TABLE_NONE
, /* kernel114 */
128 TABLE_NONE
, /* kernel120 */
129 TABLE_NONE
, /* kernel121 */
130 TABLE_NONE
, /* kernel122 */
131 TABLE_NONE
, /* kernel123 */
132 TABLE_NONE
, /* kernel124 */
133 TABLE_VDW
, /* kernel130 */
134 TABLE_VDW
, /* kernel131 */
135 TABLE_VDW
, /* kernel132 */
136 TABLE_VDW
, /* kernel133 */
137 TABLE_VDW
, /* kernel134 */
138 TABLE_NONE
, /* kernel200 */
139 TABLE_NONE
, /* kernel201 */
140 TABLE_NONE
, /* kernel202 */
141 TABLE_NONE
, /* kernel203 */
142 TABLE_NONE
, /* kernel204 */
143 TABLE_NONE
, /* kernel210 */
144 TABLE_NONE
, /* kernel211 */
145 TABLE_NONE
, /* kernel212 */
146 TABLE_NONE
, /* kernel213 */
147 TABLE_NONE
, /* kernel214 */
148 TABLE_NONE
, /* kernel220 */
149 TABLE_NONE
, /* kernel221 */
150 TABLE_NONE
, /* kernel222 */
151 TABLE_NONE
, /* kernel223 */
152 TABLE_NONE
, /* kernel224 */
153 TABLE_VDW
, /* kernel230 */
154 TABLE_VDW
, /* kernel231 */
155 TABLE_VDW
, /* kernel232 */
156 TABLE_VDW
, /* kernel233 */
157 TABLE_VDW
, /* kernel234 */
158 TABLE_COUL
, /* kernel300 */
159 TABLE_COUL
, /* kernel301 */
160 TABLE_COUL
, /* kernel302 */
161 TABLE_COUL
, /* kernel303 */
162 TABLE_COUL
, /* kernel304 */
163 TABLE_COUL
, /* kernel310 */
164 TABLE_COUL
, /* kernel311 */
165 TABLE_COUL
, /* kernel312 */
166 TABLE_COUL
, /* kernel313 */
167 TABLE_COUL
, /* kernel314 */
168 TABLE_COUL
, /* kernel320 */
169 TABLE_COUL
, /* kernel321 */
170 TABLE_COUL
, /* kernel322 */
171 TABLE_COUL
, /* kernel323 */
172 TABLE_COUL
, /* kernel324 */
173 TABLE_COMBINED
, /* kernel330 */
174 TABLE_COMBINED
, /* kernel331 */
175 TABLE_COMBINED
, /* kernel332 */
176 TABLE_COMBINED
, /* kernel333 */
177 TABLE_COMBINED
, /* kernel334 */
178 TABLE_NONE
, /* kernel400 */
179 TABLE_NONE
, /* kernel410 */
180 TABLE_VDW
/* kernel430 */
185 static nb_kernel_t
**
186 nb_kernel_list
= NULL
;
188 static nb_adress_kernel_t
**
189 nb_kernel_list_adress
= NULL
;
192 gmx_setup_kernels(FILE *fplog
,t_forcerec
*fr
,gmx_bool bGenericKernelOnly
)
196 snew(nb_kernel_list
,eNR_NBKERNEL_NR
);
198 /* Note that later calls overwrite earlier, so the preferred (fastest)
199 * version should be at the end. For instance, we call SSE after 3DNow.
202 for(i
=0; i
<eNR_NBKERNEL_NR
; i
++)
204 nb_kernel_list
[i
] = NULL
;
207 if (bGenericKernelOnly
)
214 fprintf(fplog
,"Configuring nonbonded kernels...\n");
217 nb_kernel_setup(fplog
,nb_kernel_list
);
219 if(fr
->use_cpu_acceleration
==FALSE
)
224 /* Setup kernels. The last called setup routine will overwrite earlier assignments,
225 * so we should e.g. test SSE3 support _after_ SSE2 support,
226 * and call e.g. Fortran setup before SSE.
229 #if defined(GMX_FORTRAN) && defined(GMX_DOUBLE)
230 nb_kernel_setup_f77_double(fplog
,nb_kernel_list
);
233 #if defined(GMX_FORTRAN) && !defined(GMX_DOUBLE)
234 nb_kernel_setup_f77_single(fplog
,nb_kernel_list
);
238 nb_kernel_setup_bluegene(fplog
,nb_kernel_list
);
242 nb_kernel_setup_power6(fplog
,nb_kernel_list
);
247 fprintf(fplog
,"\n\n");
252 gmx_setup_adress_kernels(FILE *fplog
,gmx_bool bGenericKernelOnly
) {
255 snew(nb_kernel_list_adress
, eNR_NBKERNEL_NR
);
257 for (i
= 0; i
< eNR_NBKERNEL_NR
; i
++) {
258 nb_kernel_list_adress
[i
] = NULL
;
261 if (bGenericKernelOnly
)
266 nb_kernel_setup_adress(fplog
, nb_kernel_list_adress
);
269 void do_nonbonded(t_commrec
*cr
,t_forcerec
*fr
,
270 rvec x
[],rvec f
[],t_mdatoms
*mdatoms
,t_blocka
*excl
,
271 real egnb
[],real egcoul
[],real egpol
[],rvec box_size
,
272 t_nrnb
*nrnb
,real
*lambda
, real
*dvdl
,
273 int nls
,int eNL
,int flags
)
275 gmx_bool bLR
,bDoForces
,bForeignLambda
;
278 int n
,n0
,n1
,i
,i0
,i1
,nrnb_ind
,sz
;
285 int outeriter
,inneriter
;
286 real
* tabledata
= NULL
;
289 nb_kernel_t
*kernelptr
=NULL
;
290 nb_adress_kernel_t
*adresskernelptr
=NULL
;
292 gmx_bool bCG
; /* for AdresS */
293 int k
;/* for AdresS */
295 bLR
= (flags
& GMX_DONB_LR
);
296 bDoForces
= (flags
& GMX_DONB_FORCES
);
297 bForeignLambda
= (flags
& GMX_DONB_FOREIGNLAMBDA
);
299 bCG
= FALSE
; /* for AdresS */
301 gbdata
.gb_epsilon_solvent
= fr
->gb_epsilon_solvent
;
302 gbdata
.epsilon_r
= fr
->epsilon_r
;
305 if (!fr
->adress_type
==eAdressOff
&& !bDoForces
){
306 gmx_fatal(FARGS
,"No force kernels not implemeted for adress");
313 #if 0 && defined (GMX_X86_SSE2)
315 if(fr
->use_cpu_acceleration
)
317 nb_kernel_allvsallgb_sse2_double(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,egpol
,
318 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
322 nb_kernel_allvsallgb(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,egpol
,
323 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
325 # else /* not double */
326 if(fr
->use_cpu_acceleration
)
328 nb_kernel_allvsallgb_sse2_single(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,egpol
,
329 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
333 nb_kernel_allvsallgb(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,egpol
,
334 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
336 # endif /* double/single alt. */
337 #else /* no SSE support compiled in */
338 nb_kernel_allvsallgb(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,egpol
,
339 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
341 inc_nrnb(nrnb
,eNR_NBKERNEL_ALLVSALLGB
,inneriter
);
345 #if 0 && defined (GMX_X86_SSE2)
347 if(fr
->use_cpu_acceleration
)
349 nb_kernel_allvsall_sse2_double(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,
350 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
354 nb_kernel_allvsall(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,
355 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
358 # else /* not double */
359 if(fr
->use_cpu_acceleration
)
361 nb_kernel_allvsall_sse2_single(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,
362 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
366 nb_kernel_allvsall(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,
367 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
370 # endif /* double/single check */
371 #else /* No SSE2 support compiled in */
372 nb_kernel_allvsall(fr
,mdatoms
,excl
,x
[0],f
[0],egcoul
,egnb
,
373 &outeriter
,&inneriter
,&fr
->AllvsAll_work
);
376 inc_nrnb(nrnb
,eNR_NBKERNEL_ALLVSALL
,inneriter
);
378 inc_nrnb(nrnb
,eNR_NBKERNEL_OUTER
,outeriter
);
404 if(nb_kernel_list
== NULL
)
406 gmx_fatal(FARGS
,"gmx_setup_kernels has not been called");
409 fshift
= fr
->fshift
[0];
411 for(n
=n0
; (n
<n1
); n
++)
413 nblists
= &fr
->nblists
[n
];
414 for(i
=i0
; (i
<i1
); i
++)
416 outeriter
= inneriter
= 0;
420 nlist
= &(nblists
->nlist_lr
[i
]);
424 nlist
= &(nblists
->nlist_sr
[i
]);
429 nrnb_ind
= nlist
->il_code
;
431 if(nrnb_ind
==eNR_NBKERNEL_FREE_ENERGY
)
433 /* generic free energy, use combined table */
434 tabledata
= nblists
->tab
.tab
;
440 /* We don't need the non-perturbed interactions */
444 tabletype
= nb_kernel_table
[nrnb_ind
];
446 /* normal kernels, not free energy */
449 nrnb_ind
+= eNR_NBKERNEL_NR
/2;
452 if(tabletype
== TABLE_COMBINED
)
454 tabledata
= nblists
->tab
.tab
;
456 else if(tabletype
== TABLE_COUL
)
458 tabledata
= nblists
->coultab
;
460 else if(tabletype
== TABLE_VDW
)
462 tabledata
= nblists
->vdwtab
;
472 if(nlist
->free_energy
)
474 if(nlist
->ivdw
==enbvdwBHAM
)
476 gmx_fatal(FARGS
,"Cannot do free energy Buckingham interactions.");
479 gmx_nb_free_energy_kernel(nlist
->icoul
,
518 else if (nlist
->enlist
== enlistCG_CG
)
520 if (fr
->adress_type
==eAdressOff
){
521 /* Call the charge group based inner loop */
522 gmx_nb_generic_cg_kernel(nlist
,
537 /*gmx_nb_generic_adress_kernel(nlist,
549 gmx_fatal(FARGS
,"Death & horror! Adress cgcg kernel not implemented anymore.\n");
556 /* for adress we need to determine for each energy group wether it is explicit or coarse-grained */
557 if (!fr
->adress_type
== eAdressOff
) {
559 if ( !fr
->adress_group_explicit
[ mdatoms
->cENER
[nlist
->iinr
[0]] ] ){
562 /* If this processor has only explicit atoms (w=1)
563 skip the coarse grained force calculation. Same for
564 only coarsegrained atoms and explicit interactions.
565 Last condition is to make sure that generic kernel is not
567 if (mdatoms
->pureex
&& bCG
&& nb_kernel_list
[nrnb_ind
] != NULL
) continue;
568 if (mdatoms
->purecg
&& !bCG
&& nb_kernel_list
[nrnb_ind
] != NULL
) continue;
571 if (fr
->adress_type
== eAdressOff
||
574 /* if we only have to calculate pure cg/ex interactions
575 we can use the faster standard gromacs kernels*/
576 kernelptr
= nb_kernel_list
[nrnb_ind
];
578 /* This processor has hybrid interactions which means
580 * use our own kernels. We have two kernel types: one that
581 * calculates the forces with the explicit prefactor w1*w2
582 * and one for coarse-grained with (1-w1*w2)
583 * explicit kernels are the second part of the kernel
585 if (!bCG
) nrnb_ind
+= eNR_NBKERNEL_NR
/2;
586 adresskernelptr
= nb_kernel_list_adress
[nrnb_ind
];
589 if (kernelptr
== NULL
&& adresskernelptr
== NULL
)
591 /* Call a generic nonbonded kernel */
593 /* If you want to hack/test your own interactions,
594 * do it in this routine and make sure it is called
595 * by setting the environment variable GMX_NB_GENERIC.
597 if (fr
->adress_type
==eAdressOff
){
599 gmx_nb_generic_kernel(nlist
,
611 }else /* do generic AdResS kernels (slow)*/
614 gmx_nb_generic_adress_kernel(nlist
,
633 /* Call nonbonded kernel from function pointer */
634 if (kernelptr
!=NULL
){
635 (*kernelptr
)( &(nlist
->nri
),
654 &(nblists
->tab
.scale
),
666 }else if (adresskernelptr
!= NULL
)
667 { /* Adress kernels */
668 (*adresskernelptr
)( &(nlist
->nri
),
687 &(nblists
->tab
.scale
),
698 fr
->adress_ex_forcecap
,
704 /* Update flop accounting */
706 /* Outer loop in kernel */
707 switch (nlist
->enlist
) {
708 case enlistATOM_ATOM
: fac
= 1; break;
709 case enlistSPC_ATOM
: fac
= 3; break;
710 case enlistSPC_SPC
: fac
= 9; break;
711 case enlistTIP4P_ATOM
: fac
= 4; break;
712 case enlistTIP4P_TIP4P
: fac
= 16; break;
713 case enlistCG_CG
: fac
= 1; break;
715 inc_nrnb(nrnb
,eNR_NBKERNEL_OUTER
,fac
*outeriter
);
717 /* inner loop in kernel */
718 inc_nrnb(nrnb
,nrnb_ind
,inneriter
);
726 do_listed_vdw_q(int ftype
,int nbonds
,
727 const t_iatom iatoms
[],const t_iparams iparams
[],
728 const rvec x
[],rvec f
[],rvec fshift
[],
729 const t_pbc
*pbc
,const t_graph
*g
,
730 real
*lambda
, real
*dvdl
,
732 const t_forcerec
*fr
,gmx_grppairener_t
*grppener
,
733 int *global_atom_index
)
735 static gmx_bool bWarn
=FALSE
;
736 real eps
,r2
,*tab
,rtab2
=0;
737 rvec dx
,x14
[2],f14
[2];
739 int typeA
[2]={0,0},typeB
[2]={0,1};
740 real chargeA
[2]={0,0},chargeB
[2];
741 int gid
,shift_vir
,shift_f
;
742 int j_index
[] = { 0, 1 };
745 int outeriter
,inneriter
;
748 real krf
,crf
,tabscale
;
751 real
*egnb
=NULL
,*egcoul
=NULL
;
754 gmx_bool bMolPBC
,bFreeEnergy
;
756 gmx_bool bCG
; /* AdResS*/
757 real wf14
[2]={0,0}; /* AdResS*/
759 #if GMX_THREAD_SHM_FDECOMP
766 #if GMX_THREAD_SHM_FDECOMP
767 pthread_mutex_initialize(&mtx
);
770 bMolPBC
= fr
->bMolPBC
;
775 eps
= fr
->epsfac
*fr
->fudgeQQ
;
777 egnb
= grppener
->ener
[egLJ14
];
778 egcoul
= grppener
->ener
[egCOUL14
];
783 egnb
= grppener
->ener
[egLJSR
];
784 egcoul
= grppener
->ener
[egCOULSR
];
787 gmx_fatal(FARGS
,"Unknown function type %d in do_nonbonded14",
791 rtab2
= sqr(fr
->tab14
.r
);
792 tabscale
= fr
->tab14
.scale
;
797 /* Determine the values for icoul/ivdw. */
801 else if(fr
->bcoultab
)
805 else if(fr
->eeltype
== eelRF_NEC
)
824 bCG
= FALSE
; /*Adres*/
825 /* We don't do SSE or altivec here, due to large overhead for 4-fold
826 * unrolling on short lists
830 for(i
=0; (i
<nbonds
); )
835 gid
= GID(md
->cENER
[ai
],md
->cENER
[aj
],md
->nenergrp
);
837 if (!fr
->adress_type
== eAdressOff
) {
838 if (fr
->adress_group_explicit
[md
->cENER
[ai
]] != fr
->adress_group_explicit
[md
->cENER
[aj
]]){
839 /*exclude cg-ex interaction*/
842 bCG
= !fr
->adress_group_explicit
[md
->cENER
[ai
]];
843 wf14
[0] = md
->wf
[ai
];
844 wf14
[1] = md
->wf
[aj
];
849 (fr
->efep
!= efepNO
&&
850 ((md
->nPerturbed
&& (md
->bPerturbed
[ai
] || md
->bPerturbed
[aj
])) ||
851 iparams
[itype
].lj14
.c6A
!= iparams
[itype
].lj14
.c6B
||
852 iparams
[itype
].lj14
.c12A
!= iparams
[itype
].lj14
.c12B
));
853 chargeA
[0] = md
->chargeA
[ai
];
854 chargeA
[1] = md
->chargeA
[aj
];
855 nbfp
= (real
*)&(iparams
[itype
].lj14
.c6A
);
858 eps
= fr
->epsfac
*iparams
[itype
].ljc14
.fqq
;
859 chargeA
[0] = iparams
[itype
].ljc14
.qi
;
860 chargeA
[1] = iparams
[itype
].ljc14
.qj
;
861 nbfp
= (real
*)&(iparams
[itype
].ljc14
.c6
);
864 chargeA
[0] = iparams
[itype
].ljcnb
.qi
;
865 chargeA
[1] = iparams
[itype
].ljcnb
.qj
;
866 nbfp
= (real
*)&(iparams
[itype
].ljcnb
.c6
);
872 /* This is a bonded interaction, atoms are in the same box */
874 r2
= distance2(x
[ai
],x
[aj
]);
878 /* Apply full periodic boundary conditions */
879 shift_f
= pbc_dx_aiuc(pbc
,x
[ai
],x
[aj
],dx
);
887 fprintf(stderr
,"Warning: 1-4 interaction between %d and %d "
888 "at distance %.3f which is larger than the 1-4 table size %.3f nm\n",
889 glatnr(global_atom_index
,ai
),
890 glatnr(global_atom_index
,aj
),
891 sqrt(r2
), sqrt(rtab2
));
892 fprintf(stderr
,"These are ignored for the rest of the simulation\n");
893 fprintf(stderr
,"This usually means your system is exploding,\n"
894 "if not, you should increase table-extension in your mdp file\n"
895 "or with user tables increase the table size\n");
899 fprintf(debug
,"%8f %8f %8f\n%8f %8f %8f\n1-4 (%d,%d) interaction not within cut-off! r=%g. Ignored\n",
900 x
[ai
][XX
],x
[ai
][YY
],x
[ai
][ZZ
],
901 x
[aj
][XX
],x
[aj
][YY
],x
[aj
][ZZ
],
902 glatnr(global_atom_index
,ai
),
903 glatnr(global_atom_index
,aj
),
908 copy_rvec(x
[ai
],x14
[0]);
909 copy_rvec(x
[aj
],x14
[1]);
913 fprintf(debug
,"LJ14: grp-i=%2d, grp-j=%2d, ngrp=%2d, GID=%d\n",
914 md
->cENER
[ai
],md
->cENER
[aj
],md
->nenergrp
,gid
);
917 outeriter
= inneriter
= count
= 0;
920 chargeB
[0] = md
->chargeB
[ai
];
921 chargeB
[1] = md
->chargeB
[aj
];
922 /* We pass &(iparams[itype].lj14.c6A) as LJ parameter matrix
924 * Here we use that the LJ-14 parameters are stored in iparams
925 * as c6A,c12A,c6B,c12B, which are referenced correctly
926 * in the innerloops if we assign type combinations 0-0 and 0-1
927 * to atom pair ai-aj in topologies A and B respectively.
930 /* need to do a bit of a kludge here -- the way it is set up,
931 if the charges change, but the vdw do not, then even though bFreeEnergy is on,
932 it won't work, because all the bonds are perturbed.
936 gmx_fatal(FARGS
,"Cannot do free energy Buckingham interactions.");
939 gmx_nb_free_energy_kernel(icoul
,
971 6.0, /* for 1-4's use the 6 power always - 48 power too high because of where they are forced to be */
980 if (fr
->adress_type
==eAdressOff
|| !fr
->adress_do_hybridpairs
){
981 /* Not perturbed - call kernel 330 */
1016 nb_kernel330_adress_cg(&i1
,
1046 fr
->adress_ex_forcecap
,
1049 nb_kernel330_adress_ex(&i1
,
1079 fr
->adress_ex_forcecap
,
1086 /* Add the forces */
1087 rvec_inc(f
[ai
],f14
[0]);
1088 rvec_dec(f
[aj
],f14
[0]);
1092 /* Correct the shift forces using the graph */
1093 ivec_sub(SHIFT_IVEC(g
,ai
),SHIFT_IVEC(g
,aj
),dt
);
1094 shift_vir
= IVEC2IS(dt
);
1095 rvec_inc(fshift
[shift_vir
],f14
[0]);
1096 rvec_dec(fshift
[CENTRAL
],f14
[0]);
1099 /* flops: eNR_KERNEL_OUTER + eNR_KERNEL330 + 12 */