Skip to content

Commit 7f3ffb0

Browse files
committed
added erf(|Ri-Rj|r/rcut) factor to solvation energy and gradients...EJB
1 parent 996429f commit 7f3ffb0

File tree

1 file changed

+85
-47
lines changed

1 file changed

+85
-47
lines changed

src/nwpw/nwpwlib/utilities/nwpw_born.F

Lines changed: 85 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)