@@ -122,8 +122,8 @@ subroutine nwpw_born_init(rtdb0)
122122 logical born_on,born_relax
123123 integer uborn(2 ),qborn(2 )
124124 integer bradii(2 ),vradii(2 ),rtdb
125- real * 8 dielec
126- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
125+ real * 8 dielec,rcut
126+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
127127 > rtdb,born_on,born_relax
128128
129129
@@ -156,6 +156,9 @@ subroutine nwpw_born_init(rtdb0)
156156 if (.not. btdb_get(rtdb,' nwpw:born_dielec' ,mt_dbl,1 ,dielec))
157157 > dielec = 78.4d0
158158
159+ if (.not. btdb_get(rtdb,' nwpw:born_rcut' ,mt_dbl,1 ,rcut))
160+ > rcut = 0.1d0
161+
159162 nion = ion_nion()
160163 value = BA_alloc_get(mt_dbl,nion,' bradii' ,bradii(2 ),bradii(1 ))
161164 value = value.and.
@@ -198,6 +201,7 @@ subroutine nwpw_born_init(rtdb0)
198201 > " Chem. Phys. Lett., vol. 246, pages 122-129."
199202 write (luout,* )
200203 write (luout,' (5x,A,F11.6)' ) " dielectric constant = " ,dielec
204+ write (luout,' (5x,A,F11.6)' ) " rcut = " ,rcut
201205 if (born_relax) then
202206 write (luout,' (5x,A)' ) " self-consistent solvation"
203207 else
@@ -237,8 +241,8 @@ subroutine nwpw_born_end()
237241 logical born_on,born_relax
238242 integer uborn(2 ),qborn(2 )
239243 integer bradii(2 ),vradii(2 ),rtdb
240- real * 8 dielec
241- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
244+ real * 8 dielec,rcut
245+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
242246 > rtdb,born_on,born_relax
243247
244248* **** local variables ****
@@ -283,8 +287,8 @@ logical function nwpw_born_on()
283287 logical born_on,born_relax
284288 integer uborn(2 ),qborn(2 )
285289 integer bradii(2 ),vradii(2 ),rtdb
286- real * 8 dielec
287- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
290+ real * 8 dielec,rcut
291+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
288292 > rtdb,born_on,born_relax
289293
290294 nwpw_born_on = born_on
@@ -303,8 +307,8 @@ logical function nwpw_born_relax()
303307 logical born_on,born_relax
304308 integer uborn(2 ),qborn(2 )
305309 integer bradii(2 ),vradii(2 ),rtdb
306- real * 8 dielec
307- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
310+ real * 8 dielec,rcut
311+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
308312 > rtdb,born_on,born_relax
309313
310314 nwpw_born_relax = born_relax
@@ -331,8 +335,8 @@ subroutine nwpw_born_Qprint(nga,nion_qm,qgaus)
331335 logical born_on,born_relax
332336 integer uborn(2 ),qborn(2 )
333337 integer bradii(2 ),vradii(2 ),rtdb
334- real * 8 dielec
335- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
338+ real * 8 dielec,rcut
339+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
336340 > rtdb,born_on,born_relax
337341
338342* **** local variables ****
@@ -376,7 +380,7 @@ subroutine nwpw_born_Qprint(nga,nion_qm,qgaus)
376380 Gsolv = nwpw_born_energy0(nion,
377381 > dbl_mb(ion_rion_ptr()),
378382 > dbl_mb(bradii(1 )),
379- > dbl_mb(qborn(1 )),dielec)
383+ > dbl_mb(qborn(1 )),dielec,rcut )
380384 if (oprint) then
381385 write (luout,* )
382386 write (luout,* ) " Generalized Born Solvation"
@@ -391,6 +395,7 @@ subroutine nwpw_born_Qprint(nga,nion_qm,qgaus)
391395 write (luout,* )
392396 write (luout,' (2x,A,F8.2)' ) " Dielectric constant -eps- = " ,
393397 > dielec
398+ write (luout,' (2x,A,F8.2)' ) " rcut = " ,rcut
394399 write (luout,* )
395400 do ii= 1 ,nion
396401 write (luout,101 ) ion_atom(ion_katm(ii)),ii,
@@ -424,8 +429,8 @@ real*8 function nwpw_born_screen()
424429 logical born_on,born_relax
425430 integer uborn(2 ),qborn(2 )
426431 integer bradii(2 ),vradii(2 ),rtdb
427- real * 8 dielec
428- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
432+ real * 8 dielec,rcut
433+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
429434 > rtdb,born_on,born_relax
430435
431436 nwpw_born_screen = (1.0d0 - 1.0d0 / dielec)
@@ -448,8 +453,8 @@ real*8 function nwpw_born_energy()
448453 logical born_on,born_relax
449454 integer uborn(2 ),qborn(2 )
450455 integer bradii(2 ),vradii(2 ),rtdb
451- real * 8 dielec
452- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
456+ real * 8 dielec,rcut
457+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
453458 > rtdb,born_on,born_relax
454459
455460* **** external functions ****
@@ -461,21 +466,21 @@ real*8 function nwpw_born_energy()
461466 nwpw_born_energy = nwpw_born_energy0(ion_nion_qm(),
462467 > dbl_mb(ion_rion_ptr()),
463468 > dbl_mb(bradii(1 )),
464- > dbl_mb(qborn(1 )),dielec)
469+ > dbl_mb(qborn(1 )),dielec,rcut )
465470 return
466471 end
467472
468- real * 8 function nwpw_born_energy0(nion,rion,bradii,q,dielec)
473+ real * 8 function nwpw_born_energy0(nion,rion,bradii,q,dielec,rcut )
469474 implicit none
470475 integer nion
471476 real * 8 rion(3 ,nion),bradii(nion),q(nion)
472- real * 8 dielec
477+ real * 8 dielec,rcut
473478
474479* **** local variables ****
475480 integer MASTER,taskid,np
476481 parameter (MASTER= 0 )
477482 integer ii,jj,itask
478- real * 8 Gsolv,screen,C,f,dist2
483+ real * 8 Gsolv,screen,C,f,dist2,gg
479484
480485 call Parallel_np(np)
481486 call Parallel_taskid(taskid)
@@ -494,7 +499,8 @@ real*8 function nwpw_born_energy0(nion,rion,bradii,q,dielec)
494499 > + (rion(3 ,ii)- rion(3 ,jj))** 2 )
495500 C = dexp(- 0.25d0 * dist2/ (bradii(ii)* bradii(jj)))
496501 f = dsqrt(dist2 + bradii(ii)* bradii(jj)* C)
497- Gsolv = Gsolv - 0.5d0 * screen* q(ii)* q(jj)/ f
502+ gg = erf(dsqrt(dist2)/ rcut)
503+ Gsolv = Gsolv - 0.5d0 * screen* q(ii)* q(jj)* gg/ f
498504 end if
499505 itask = mod (itask+1 ,np)
500506 end do
@@ -529,8 +535,8 @@ subroutine nwpw_born_fion(fion)
529535 logical born_on,born_relax
530536 integer uborn(2 ),qborn(2 )
531537 integer bradii(2 ),vradii(2 ),rtdb
532- real * 8 dielec
533- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
538+ real * 8 dielec,rcut
539+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
534540 > rtdb,born_on,born_relax
535541
536542* **** external functions ****
@@ -547,7 +553,7 @@ subroutine nwpw_born_fion(fion)
547553 call nwpw_born_fion0(nion,
548554 > dbl_mb(ion_rion_ptr()),
549555 > dbl_mb(bradii(1 )),
550- > dbl_mb(qborn(1 )),dielec,dbl_mb(ftmp(1 )))
556+ > dbl_mb(qborn(1 )),dielec,rcut, dbl_mb(ftmp(1 )))
551557
552558 call DAXPY_OMP(3 * nion,1.0d0 ,dbl_mb(ftmp(1 )),1 ,fion,1 )
553559
@@ -558,35 +564,66 @@ subroutine nwpw_born_fion(fion)
558564 return
559565 end
560566
561- real * 8 function nwpw_born_gsolv(screen,qi,qj,bi,bj,xx)
567+ * **************************************
568+ * * *
569+ * * nwpw_born_gsolv *
570+ * * *
571+ * **************************************
572+ *
573+ * Calculates gsolv = -0.5*screen*qi*qj*gg/f
574+ *
575+ * where f = sqrt(xx + bi*bj*C)
576+ * gg = erf(sqrt(xx)/rcut)
577+ * C = exp(-xx/(4*bi*bj))
578+ *
579+
580+ real * 8 function nwpw_born_gsolv(screen,qi,qj,bi,bj,xx,rcut)
562581 implicit none
563- real * 8 screen,qi,qj,bi,bj,xx
564- real * 8 C,f
582+ real * 8 screen,qi,qj,bi,bj,xx,rcut
583+ real * 8 C,f,gg
565584
585+ gg = erf(dsqrt(xx)/ rcut)
566586 C = dexp(- 0.25d0 * xx/ (bi* bj))
567587 f = dsqrt(xx + bi* bj* C)
568- nwpw_born_gsolv = - 0.5d0 * screen* qi* qj/ f
588+ nwpw_born_gsolv = - 0.5d0 * screen* qi* qj* gg / f
569589 return
570590 end
571591
572- real * 8 function nwpw_born_dgsolv(screen,qi,qj,bi,bj,xx)
592+ * **************************************
593+ * * *
594+ * * nwpw_born_dgsolv *
595+ * * *
596+ * **************************************
597+ *
598+ * Calculates dgsolv/dxx
599+ *
600+ * dC/dxx = -1/(4*bi*bj)*exp(-xx/(4*bi*bj)) = -1/(4*bi*bj)*C
601+ * df/dxx = 0.5*1/f * (dxx/dxx + bi*bj*dC/dxx) = 0.5*1/f*(1-0.25*C)
602+ * dgg/dxx = 1/sqrt(xx*pi) * exp(-xx/rcut**2)/rcut
603+ * dsqrt(xx)/dxx = 0.5/xx
604+ *
605+ real * 8 function nwpw_born_dgsolv(screen,qi,qj,bi,bj,xx,rcut)
573606 implicit none
574- real * 8 screen,qi,qj,bi,bj,xx
575- real * 8 C,f,gsolv
607+ real * 8 screen,qi,qj,bi,bj,xx,rcut
608+ real * 8 C,f,gsolv,gg,dgg
609+
576610
611+ gg = erf(dsqrt(xx)/ rcut)
612+ dgg = (1.0d0 / dsqrt(xx* 4.0d0 * datan(1.0d0 )))* exp (- xx/ rcut** 2 )/ rcut
577613 C = dexp(- 0.25d0 * xx/ (bi* bj))
578614 f = dsqrt(xx + bi* bj* C)
579- gsolv = - 0.5d0 * screen* qi* qj/ f
615+ gsolv = - 0.5d0 * screen* qi* qj* gg / f
580616
581617 nwpw_born_dgsolv = - 0.5d0 * gsolv* (1.0-0.25d0 * C)/ f** 2
618+ > - 0.5d0 * screen* qi* qj* dgg/ f
582619 return
583620 end
584621
585- subroutine nwpw_born_fion0 (nion ,rion ,bradii ,q ,dielec ,fion )
622+ subroutine nwpw_born_fion0 (nion ,rion ,bradii ,q ,dielec ,rcut , fion )
586623 implicit none
587624 integer nion
588625 real * 8 rion(3 ,nion),bradii(nion),q(nion)
589- real * 8 dielec
626+ real * 8 dielec,rcut
590627 real * 8 fion(3 ,nion)
591628
592629* **** local variables ****
@@ -616,7 +653,7 @@ subroutine nwpw_born_fion0(nion,rion,bradii,q,dielec,fion)
616653
617654 dGsolv = nwpw_born_dgsolv(screen,q(ii),q(jj),
618655 > bradii(ii),bradii(jj),
619- > dist2)
656+ > dist2,rcut )
620657 fion(1 ,ii) = fion(1 ,ii) - 2.0d0 * dGsolv* dx
621658 fion(2 ,ii) = fion(2 ,ii) - 2.0d0 * dGsolv* dy
622659 fion(3 ,ii) = fion(3 ,ii) - 2.0d0 * dGsolv* dz
@@ -656,8 +693,8 @@ subroutine nwpw_born_dVdq(nion,q,u)
656693 logical born_on,born_relax
657694 integer uborn(2 ),qborn(2 )
658695 integer bradii(2 ),vradii(2 ),rtdb
659- real * 8 dielec
660- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
696+ real * 8 dielec,rcut
697+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
661698 > rtdb,born_on,born_relax
662699
663700 integer ion_rion_ptr
@@ -666,22 +703,22 @@ subroutine nwpw_born_dVdq(nion,q,u)
666703 call nwpw_born_dVdq0(nion,
667704 > dbl_mb(ion_rion_ptr()),
668705 > dbl_mb(bradii(1 )),
669- > q,dielec,u)
706+ > q,dielec,rcut, u)
670707 return
671708 end
672709
673- subroutine nwpw_born_dVdq0 (nion ,rion ,bradii ,q ,dielec ,u )
710+ subroutine nwpw_born_dVdq0 (nion ,rion ,bradii ,q ,dielec ,rcut , u )
674711 implicit none
675712 integer nion
676713 real * 8 rion(3 ,nion),bradii(nion),q(nion)
677- real * 8 dielec
714+ real * 8 dielec,rcut
678715 real * 8 u(nion)
679716
680717* **** local variables ****
681718 integer MASTER,taskid,np
682719 parameter (MASTER= 0 )
683720 integer ii,jj,itask
684- real * 8 Gsolv,screen,C,f,dist2
721+ real * 8 Gsolv,screen,C,f,dist2,gg
685722
686723 call Parallel_np(np)
687724 call Parallel_taskid(taskid)
@@ -700,11 +737,12 @@ subroutine nwpw_born_dVdq0(nion,rion,bradii,q,dielec,u)
700737 dist2 = ((rion(1 ,ii)- rion(1 ,jj))** 2
701738 > + (rion(2 ,ii)- rion(2 ,jj))** 2
702739 > + (rion(3 ,ii)- rion(3 ,jj))** 2 )
740+ gg = erf(dsqrt(dist2)/ rcut)
703741 C = dexp(- 0.25d0 * dist2/ (bradii(ii)* bradii(jj)))
704742 f = dsqrt(dist2 + bradii(ii)* bradii(jj)* C)
705- u(ii) = u(ii) + 0.5d0 * screen* q(jj)/ f
706- u(jj) = u(jj) + 0.5d0 * screen* q(ii)/ f
707- Gsolv = Gsolv - 0.5d0 * screen* q(ii)* q(jj)/ f
743+ u(ii) = u(ii) + 0.5d0 * screen* q(jj)* gg / f
744+ u(jj) = u(jj) + 0.5d0 * screen* q(ii)* gg / f
745+ Gsolv = Gsolv - 0.5d0 * screen* q(ii)* q(jj)* gg / f
708746 end if
709747 itask = mod (itask+1 ,np)
710748 end do
@@ -732,8 +770,8 @@ integer function nwpw_born_u_ptr()
732770 logical born_on,born_relax
733771 integer uborn(2 ),qborn(2 )
734772 integer bradii(2 ),vradii(2 ),rtdb
735- real * 8 dielec
736- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
773+ real * 8 dielec,rcut
774+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
737775 > rtdb,born_on,born_relax
738776
739777 nwpw_born_u_ptr = uborn(1 )
@@ -753,8 +791,8 @@ integer function nwpw_born_q_ptr()
753791 logical born_on,born_relax
754792 integer uborn(2 ),qborn(2 )
755793 integer bradii(2 ),vradii(2 ),rtdb
756- real * 8 dielec
757- common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,
794+ real * 8 dielec,rcut
795+ common / nwpw_born_blk/ uborn,qborn,bradii,vradii,dielec,rcut,
758796 > rtdb,born_on,born_relax
759797
760798 nwpw_born_q_ptr = qborn(1 )
0 commit comments