subroutine muca_delta(remd_t_bath,remd_ene,i,iex,delta) implicit real*8 (a-h,o-z) include 'DIMENSIONS' include 'COMMON.MUCA' include 'COMMON.MD' double precision remd_t_bath(maxprocs) double precision remd_ene(maxprocs) double precision muca_ene double precision betai,betaiex,delta betai=1.0/(Rb*remd_t_bath(i)) betaiex=1.0/(Rb*remd_t_bath(iex)) delta=betai*(muca_ene(remd_ene(iex),i,remd_t_bath)- & muca_ene(remd_ene(i),i,remd_t_bath)) & -betaiex*(muca_ene(remd_ene(iex),iex,remd_t_bath)- & muca_ene(remd_ene(i),iex,remd_t_bath)) return end double precision function muca_ene(energy,i,remd_t_bath) implicit real*8 (a-h,o-z) include 'DIMENSIONS' include 'COMMON.MUCA' include 'COMMON.MD' double precision y,yp,energy double precision remd_t_bath(maxprocs) integer i if (energy.lt.elowi(i)) then call splint(emuca,nemuca,nemuca2,nmuca,elowi(i),y,yp) muca_ene=remd_t_bath(i)*Rb*(yp*(energy-elowi(i))+y) elseif (energy.gt.ehighi(i)) then call splint(emuca,nemuca,nemuca2,nmuca,ehighi(i),y,yp) muca_ene=remd_t_bath(i)*Rb*(yp*(energy-ehighi(i))+y) else call splint(emuca,nemuca,nemuca2,nmuca,energy,y,yp) muca_ene=remd_t_bath(i)*Rb*y endif return end subroutine read_muca implicit real*8 (a-h,o-z) include 'DIMENSIONS' include 'COMMON.MUCA' include 'COMMON.CONTROL' include 'COMMON.MD' include 'COMMON.REMD' include 'COMMON.SETUP' include 'COMMON.IOUNITS' double precision yp1,ypn,yp,x,muca_factor,y,muca_ene imtime=0 do i=1,4*maxres hist(i)=0 enddo if (modecalc.eq.14.and..not.remd_tlist) then print *,"MUCAREMD works only with TLIST" stop endif open(89,file='muca.input') read(89,*) read(89,*) if (modecalc.eq.14) then read(89,*) (elowi(i),ehighi(i),i=1,nrep) if (remd_mlist) then k=0 do i=1,nrep do j=1,remd_m(i) i2rep(k)=i k=k+1 enddo enddo elow=elowi(i2rep(me)) ehigh=ehighi(i2rep(me)) elowi(me+1)=elow ehighi(me+1)=ehigh else elow=elowi(me+1) ehigh=ehighi(me+1) endif else read(89,*) elow,ehigh elowi(1)=elow ehighi(1)=ehigh endif i=0 do while(.true.) i=i+1 read(89,*,end=100) emuca(i),nemuca(i) cd nemuca(i)=nemuca(i)*remd_t(me+1)*Rb enddo 100 continue nmuca=i-1 hbin=emuca(nmuca)-emuca(nmuca-1) write (iout,*) 'hbin',hbin write (iout,*) me,'elow,ehigh',elow,ehigh yp1=0 ypn=0 call spline(emuca,nemuca,nmuca,yp1,ypn,nemuca2) factor_min=0.0d0 factor_min=muca_factor(ehigh) call print_muca return end subroutine print_muca implicit real*8 (a-h,o-z) include 'DIMENSIONS' include 'COMMON.MUCA' include 'COMMON.CONTROL' include 'COMMON.MD' include 'COMMON.REMD' include 'COMMON.SETUP' include 'COMMON.IOUNITS' double precision yp1,ypn,yp,x,muca_factor,y,muca_ene double precision dummy(maxprocs) if (remd_mlist) then k=0 do i=1,nrep do j=1,remd_m(i) i2rep(k)=i k=k+1 enddo enddo endif do i=1,nmuca c print *,'nemuca ',emuca(i),nemuca(i) do j=0,4 x=emuca(i)+hbin/5*j if (modecalc.eq.14) then if (remd_mlist) then yp=muca_factor(x)*remd_t(i2rep(me))*Rb dummy(me+1)=remd_t(i2rep(me)) y=muca_ene(x,me+1,dummy) else yp=muca_factor(x)*remd_t(me+1)*Rb y=muca_ene(x,me+1,remd_t) endif write (iout,'(i4,i12,a12,2f15.5,a10,f15.5)') me,imtime, & 'muca factor ',x,yp,' muca ene',y else yp=muca_factor(x)*t_bath*Rb dummy(1)=t_bath y=muca_ene(x,1,dummy) write (iout,'(i4,i12,a12,2f15.5,a10,f15.5)') me,imtime, & 'muca factor ',x,yp,' muca ene',y endif enddo enddo if(mucadyn.gt.0) then do i=1,nmuca write(iout,'(a13,i8,2f12.5)') 'nemuca after ', & imtime,emuca(i),nemuca(i) enddo endif return end subroutine muca_update(energy) implicit real*8 (a-h,o-z) include 'DIMENSIONS' include 'COMMON.MUCA' include 'COMMON.CONTROL' include 'COMMON.MD' include 'COMMON.REMD' include 'COMMON.SETUP' include 'COMMON.IOUNITS' double precision energy double precision yp1,ypn integer k logical lnotend k=int((energy-emuca(1))/hbin)+1 IF(muca_smooth.eq.1.or.muca_smooth.eq.3) THEN if(energy.ge.ehigh) & write (iout,*) 'MUCA reject',energy,emuca(k) if(energy.ge.ehigh.and.(energy-ehigh).lt.hbin) then write (iout,*) 'MUCA ehigh',energy,emuca(k) do i=k,nmuca hist(i)=hist(i)+1 enddo endif if(k.gt.0.and.energy.lt.ehigh) hist(k)=hist(k)+1 ELSE if(k.gt.0.and.k.lt.4*maxres) hist(k)=hist(k)+1 ENDIF if(mod(imtime,mucadyn).eq.0) then do i=1,nmuca IF(muca_smooth.eq.2.or.muca_smooth.eq.3) THEN nemuca(i)=nemuca(i)+dlog(hist(i)+1) ELSE if (hist(i).gt.0) hist(i)=dlog(hist(i)) nemuca(i)=nemuca(i)+hist(i) ENDIF hist(i)=0 write(iout,'(a24,i8,2f12.5)')'nemuca before smoothing ', & imtime,emuca(i),nemuca(i) enddo lnotend=.true. ismooth=0 ist=2 ien=nmuca-1 IF(muca_smooth.eq.1.or.muca_smooth.eq.3) THEN c lnotend=.false. c do i=1,nmuca-1 c do j=i+1,nmuca c if(nemuca(j).lt.nemuca(i)) lnotend=.true. c enddo c enddo do while(lnotend) ismooth=ismooth+1 write (iout,*) 'MUCA update smoothing',ist,ien do i=ist,ien nemuca(i)=(nemuca(i-1)+nemuca(i)+nemuca(i+1))/3 enddo lnotend=.false. ist=0 ien=0 do i=1,nmuca-1 do j=i+1,nmuca if(nemuca(j).lt.nemuca(i)) then lnotend=.true. if(ist.eq.0) ist=i-1 if(ien.lt.j+1) ien=j+1 endif enddo enddo enddo ENDIF write (iout,*) 'MUCA update ',imtime,' smooth= ',ismooth yp1=0 ypn=0 call spline(emuca,nemuca,nmuca,yp1,ypn,nemuca2) call print_muca endif return end double precision function muca_factor(energy) implicit real*8 (a-h,o-z) include 'DIMENSIONS' include 'COMMON.MUCA' double precision y,yp,energy if (energy.lt.elow) then call splint(emuca,nemuca,nemuca2,nmuca,elow,y,yp) elseif (energy.gt.ehigh) then call splint(emuca,nemuca,nemuca2,nmuca,ehigh,y,yp) else call splint(emuca,nemuca,nemuca2,nmuca,energy,y,yp) endif if(yp.ge.factor_min) then muca_factor=yp else muca_factor=factor_min endif cd print *,'energy, muca_factor',energy,muca_factor return end SUBROUTINE spline(x,y,n,yp1,ypn,y2) INTEGER n,NMAX REAL*8 yp1,ypn,x(n),y(n),y2(n) PARAMETER (NMAX=500) INTEGER i,k REAL*8 p,qn,sig,un,u(NMAX) if (yp1.gt..99e30) then y2(1)=0. u(1)=0. else y2(1)=-0.5 u(1)=(3./(x(2)-x(1)))*((y(2)-y(1))/(x(2)-x(1))-yp1) endif do i=2,n-1 sig=(x(i)-x(i-1))/(x(i+1)-x(i-1)) p=sig*y2(i-1)+2. y2(i)=(sig-1.)/p u(i)=(6.*((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1)) * /(x(i)-x(i-1)))/(x(i+1)-x(i-1))-sig*u(i-1))/p enddo if (ypn.gt..99e30) then qn=0. un=0. else qn=0.5 un=(3./(x(n)-x(n-1)))*(ypn-(y(n)-y(n-1))/(x(n)-x(n-1))) endif y2(n)=(un-qn*u(n-1))/(qn*y2(n-1)+1.) do k=n-1,1,-1 y2(k)=y2(k)*y2(k+1)+u(k) enddo return END SUBROUTINE splint(xa,ya,y2a,n,x,y,yp) INTEGER n REAL*8 x,y,xa(n),y2a(n),ya(n),yp INTEGER k,khi,klo REAL*8 a,b,h klo=1 khi=n 1 if (khi-klo.gt.1) then k=(khi+klo)/2 if (xa(k).gt.x) then khi=k else klo=k endif goto 1 endif h=xa(khi)-xa(klo) if (h.eq.0.) pause 'bad xa input in splint' a=(xa(khi)-x)/h b=(x-xa(klo))/h y=a*ya(klo)+b*ya(khi)+ * ((a**3-a)*y2a(klo)+(b**3-b)*y2a(khi))*(h**2)/6. yp=-ya(klo)/h+ya(khi)/h-3*(a**2)*y2a(klo)*h/6. + +(3*(b**2)-1)*y2a(khi)*h/6. return END