1 subroutine friction_force
2 implicit real*8 (a-h,o-z)
9 include 'COMMON.INTERACT'
12 include 'COMMON.LANGEVIN'
14 include 'COMMON.LANGEVIN.lang0'
16 include 'COMMON.IOUNITS'
17 double precision gamvec(MAXRES6)
19 double precision vv(3),vvtot(3,maxres),v_work(MAXRES6),
20 & ginvfric(maxres2,maxres2)
21 common /przechowalnia/ ginvfric
23 logical lprn /.false./, checkmode /.false./
37 d_t_work(ind+j)=d_t(j,i)
42 if (itype(i).ne.10 .and. itype(i).ne.21) then
44 d_t_work(ind+j)=d_t(j,i+nres)
50 call fricmat_mult(d_t_work,fric_work)
52 if (.not.checkmode) return
55 write (iout,*) "d_t_work and fric_work"
57 write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i)
61 friction(j,0)=fric_work(j)
66 friction(j,i)=fric_work(ind+j)
71 if (itype(i).ne.10 .and. itype(i).ne.21) then
73 friction(j,i+nres)=fric_work(ind+j)
79 write(iout,*) "Friction backbone"
81 write(iout,'(i5,3e15.5,5x,3e15.5)')
82 & i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3)
84 write(iout,*) "Friction side chain"
86 write(iout,'(i5,3e15.5,5x,3e15.5)')
87 & i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3)
96 vvtot(j,i)=vv(j)+0.5d0*d_t(j,i)
97 vvtot(j,i+nres)=vv(j)+d_t(j,i+nres)
101 write (iout,*) "vvtot backbone and sidechain"
103 write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3),
104 & (vvtot(j,i+nres),j=1,3)
109 v_work(ind+j)=vvtot(j,i)
115 v_work(ind+j)=vvtot(j,i+nres)
119 write (iout,*) "v_work gamvec and site-based friction forces"
121 write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i),
122 & gamvec(i)*v_work(i)
125 c fric_work1(i)=0.0d0
127 c fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j)
130 c write (iout,*) "fric_work and fric_work1"
132 c write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i)
138 ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j)
142 write (iout,*) "ginvfric"
144 write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen)
146 write (iout,*) "symmetry check"
149 write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i)
155 c-----------------------------------------------------
156 subroutine stochastic_force(stochforcvec)
157 implicit real*8 (a-h,o-z)
163 include 'COMMON.CHAIN'
164 include 'COMMON.DERIV'
166 include 'COMMON.LOCAL'
167 include 'COMMON.INTERACT'
169 include 'COMMON.TIME1'
171 include 'COMMON.LANGEVIN'
173 include 'COMMON.LANGEVIN.lang0'
175 include 'COMMON.IOUNITS'
177 double precision x,sig,lowb,highb,
178 & ff(3),force(3,0:MAXRES2),zeta2,lowb2,
179 & highb2,sig2,forcvec(MAXRES6),stochforcvec(MAXRES6)
180 logical lprn /.false./
189 c Compute the stochastic forces acting on bodies. Store in force.
195 force(j,i)=anorm_distr(x,sig,lowb,highb)
203 force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2)
206 time_fsample=time_fsample+MPI_Wtime()-time00
207 c Compute the stochastic forces acting on virtual-bond vectors.
213 stochforc(j,i)=ff(j)+0.5d0*force(j,i)
216 ff(j)=ff(j)+force(j,i)
218 if (itype(i+1).ne.21) then
220 stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1)
221 ff(j)=ff(j)+force(j,i+nres+1)
226 stochforc(j,0)=ff(j)+force(j,nnt+nres)
229 if (itype(i).ne.10 .and. itype(i).ne.21) then
231 stochforc(j,i+nres)=force(j,i+nres)
237 stochforcvec(j)=stochforc(j,0)
242 stochforcvec(ind+j)=stochforc(j,i)
247 if (itype(i).ne.10 .and. itype(i).ne.21) then
249 stochforcvec(ind+j)=stochforc(j,i+nres)
255 write (iout,*) "stochforcvec"
257 write(iout,'(i5,e15.5)') i,stochforcvec(i)
259 write(iout,*) "Stochastic forces backbone"
261 write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3)
263 write(iout,*) "Stochastic forces side chain"
265 write(iout,'(i5,3e15.5)')
266 & i,(stochforc(j,i+nres),j=1,3)
276 forcvec(ind+j)=force(j,i)
283 forcvec(j+ind)=force(j,i+nres)
288 write (iout,*) "forcvec"
292 write (iout,'(2i3,2f10.5)') i,j,force(j,i),
299 write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres),
309 c------------------------------------------------------------------
310 subroutine setup_fricmat
311 implicit real*8 (a-h,o-z)
315 include 'COMMON.CHAIN'
316 include 'COMMON.DERIV'
318 include 'COMMON.LOCAL'
319 include 'COMMON.INTERACT'
321 include 'COMMON.SETUP'
322 include 'COMMON.TIME1'
323 c integer licznik /0/
326 include 'COMMON.LANGEVIN'
328 include 'COMMON.LANGEVIN.lang0'
330 include 'COMMON.IOUNITS'
332 integer i,j,ind,ind1,m
333 logical lprn /.false./
334 double precision dtdi,gamvec(MAXRES2),
335 & ginvfric(maxres2,maxres2),Ghalf(mmaxres2),fcopy(maxres2,maxres2)
336 common /syfek/ gamvec
337 double precision work(8*maxres2)
338 integer iwork(maxres2)
339 common /przechowalnia/ ginvfric,Ghalf,fcopy
341 if (fg_rank.ne.king) goto 10
343 c Zeroing out fricmat
349 c Load the friction coefficients corresponding to peptide groups
355 c Load the friction coefficients corresponding to side chains
363 gamvec(ii)=gamsc(iti)
365 if (surfarea) call sdarea(gamvec)
367 c write (iout,*) "Matrix A and vector gamma"
369 c write (iout,'(i2,$)') i
371 c write (iout,'(f4.1,$)') A(i,j)
373 c write (iout,'(f8.3)') gamvec(i)
377 write (iout,*) "Vector gamvec"
379 write (iout,'(i5,f10.5)') i, gamvec(i)
383 c The friction matrix
388 dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j)
395 write (iout,'(//a)') "Matrix fricmat"
396 call matout2(dimen,dimen,maxres2,maxres2,fricmat)
398 if (lang.eq.2 .or. lang.eq.3) then
399 c Mass-scale the friction matrix if non-direct integration will be performed
405 Ginvfric(i,j)=Ginvfric(i,j)+
406 & Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l)
411 c Diagonalize the friction matrix
416 Ghalf(ind)=Ginvfric(i,j)
419 call gldiag(maxres2,dimen,dimen,Ghalf,work,fricgam,fricvec,
422 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",
423 & " mass-scaled friction matrix"
424 call eigout(dimen,dimen,maxres2,maxres2,fricvec,fricgam)
426 c Precompute matrices for tinker stochastic integrator
433 mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j)
434 mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j)
440 else if (lang.eq.4) then
441 c Diagonalize the friction matrix
446 Ghalf(ind)=fricmat(i,j)
449 call gldiag(maxres2,dimen,dimen,Ghalf,work,fricgam,fricvec,
452 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",
454 call eigout(dimen,dimen,maxres2,maxres2,fricvec,fricgam)
456 c Determine the number of zero eigenvalues of the friction matrix
457 nzero=max0(dimen-dimen1,0)
458 c do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen)
461 write (iout,*) "Number of zero eigenvalues:",nzero
466 fricmat(i,j)=fricmat(i,j)
467 & +fricvec(i,k)*fricvec(j,k)/fricgam(k)
472 write (iout,'(//a)') "Generalized inverse of fricmat"
473 call matout(dimen,dimen,maxres6,maxres6,fricmat)
478 if (nfgtasks.gt.1) then
479 if (fg_rank.eq.0) then
480 c The matching BROADCAST for fg processors is called in ERGASTULUM
482 call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR)
483 time_Bcast=time_Bcast+MPI_Wtime()-time00
484 c print *,"Processor",myrank,
485 c & " BROADCAST iorder in SETUP_FRICMAT"
488 c write (iout,*) "setup_fricmat licznik",licznik
490 c Scatter the friction matrix
491 call MPI_Scatterv(fricmat(1,1),nginv_counts(0),
492 & nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1),
493 & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR)
494 time_scatter=time_scatter+MPI_Wtime()-time00
496 time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00
500 fricmat(j,i)=fcopy(i,j)
503 c write (iout,*) "My chunk of fricmat"
504 c call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy)
509 c-------------------------------------------------------------------------------
510 subroutine sdarea(gamvec)
512 c Scale the friction coefficients according to solvent accessible surface areas
513 c Code adapted from TINKER
516 implicit real*8 (a-h,o-z)
518 include 'COMMON.CONTROL'
522 include 'COMMON.LANGEVIN'
524 include 'COMMON.LANGEVIN.lang0'
526 include 'COMMON.CHAIN'
527 include 'COMMON.DERIV'
529 include 'COMMON.LOCAL'
530 include 'COMMON.INTERACT'
531 include 'COMMON.IOUNITS'
532 include 'COMMON.NAMES'
533 double precision radius(maxres2),gamvec(maxres6)
534 parameter (twosix=1.122462048309372981d0)
535 logical lprn /.true./
537 c determine new friction coefficients every few SD steps
539 c set the atomic radii to estimates of sigma values
541 c print *,"Entered sdarea"
547 c Load peptide group radii
551 c Load side chain radii
554 radius(i+nres)=restok(iti)
557 c write (iout,*) "i",i," radius",radius(i)
560 radius(i) = radius(i) / twosix
561 if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe
564 c scale atomic friction coefficients by accessible area
566 if (lprn) write (iout,*)
567 & "Original gammas, surface areas, scaling factors, new gammas, ",
568 & "std's of stochastic forces"
571 if (radius(i).gt.0.0d0) then
572 call surfatom (i,area,radius)
573 ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1)
574 if (lprn) write (iout,'(i5,3f10.5,$)')
575 & i,gamvec(ind+1),area,ratio
578 gamvec(ind) = ratio * gamvec(ind)
580 stdforcp(i)=stdfp*dsqrt(gamvec(ind))
581 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i)
585 if (radius(i+nres).gt.0.0d0) then
586 call surfatom (i+nres,area,radius)
587 ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1)
588 if (lprn) write (iout,'(i5,3f10.5,$)')
589 & i,gamvec(ind+1),area,ratio
592 gamvec(ind) = ratio * gamvec(ind)
594 stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamvec(ind))
595 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i)