Merge branch 'devel' into AFM
[unres.git] / source / unres / src_Eshel / SRC-SURPLUS / minim_mcmf.F
diff --git a/source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F b/source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F
new file mode 100644 (file)
index 0000000..beb3d4c
--- /dev/null
@@ -0,0 +1,121 @@
+#ifdef MPI
+      subroutine minim_mcmf
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) 
+      include 'COMMON.VAR'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.MINIM'
+      include 'mpif.h'
+      external func,gradient,fdum
+      real ran1,ran2,ran3
+      include 'COMMON.SETUP'
+      include 'COMMON.GEO'
+      include 'COMMON.CHAIN'
+      include 'COMMON.FFIELD'
+      dimension muster(mpi_status_size)
+      dimension var(maxvar),erg(mxch*(mxch+1)/2+1)
+      double precision d(maxvar),v(1:lv+1),garbage(maxvar)                     
+      dimension indx(6)
+      dimension iv(liv)                                               
+      dimension idum(1),rdum(1)
+      double precision przes(3),obrot(3,3)
+      logical non_conv
+      data rad /1.745329252d-2/
+      common /przechowalnia/ v
+
+      ichuj=0
+   10 continue
+      ichuj = ichuj + 1
+      call mpi_recv(indx,6,mpi_integer,king,idint,CG_COMM,
+     *              muster,ierr)
+      if (indx(1).eq.0) return
+c      print *, 'worker ',me,' received order ',n,ichuj
+      call mpi_recv(var,nvar,mpi_double_precision,
+     *              king,idreal,CG_COMM,muster,ierr)
+      call mpi_recv(ene0,1,mpi_double_precision,
+     *              king,idreal,CG_COMM,muster,ierr)
+c      print *, 'worker ',me,' var read '
+
+
+      call deflt(2,iv,liv,lv,v)                                         
+* 12 means fresh start, dont call deflt                                 
+      iv(1)=12                                                          
+* max num of fun calls                                                  
+      if (maxfun.eq.0) maxfun=500
+      iv(17)=maxfun
+* max num of iterations                                                 
+      if (maxmin.eq.0) maxmin=1000
+      iv(18)=maxmin
+* controls output                                                       
+      iv(19)=2                                                          
+* selects output unit                                                   
+c      iv(21)=iout                                                       
+      iv(21)=0
+* 1 means to print out result                                           
+      iv(22)=0                                                          
+* 1 means to print out summary stats                                    
+      iv(23)=0                                                          
+* 1 means to print initial x and d                                      
+      iv(24)=0                                                          
+* min val for v(radfac) default is 0.1                                  
+      v(24)=0.1D0                                                       
+* max val for v(radfac) default is 4.0                                  
+      v(25)=2.0D0                                                       
+* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease)    
+* the sumsl default is 0.1                                              
+      v(26)=0.1D0
+* false conv if (act fnctn decrease) .lt. v(34)                         
+* the sumsl default is 100*machep                                       
+      v(34)=v(34)/100.0D0                                               
+* absolute convergence                                                  
+      if (tolf.eq.0.0D0) tolf=1.0D-4
+      v(31)=tolf
+* relative convergence                                                  
+      if (rtolf.eq.0.0D0) rtolf=1.0D-4
+      v(32)=rtolf
+* controls initial step size                                            
+       v(35)=1.0D-1                                                    
+* large vals of d correspond to small components of step                
+      do i=1,nphi
+        d(i)=1.0D-1
+      enddo
+      do i=nphi+1,nvar
+        d(i)=1.0D-1
+      enddo
+c  minimize energy
+
+      call func(nvar,var,nf,eee,idum,rdum,fdum)
+      if(eee.gt.1.0d18) then
+c       print *,'MINIM_JLEE: ',me,' CHUJ NASTAPIL'
+c       print *,' energy before SUMSL =',eee
+c       print *,' aborting local minimization'
+       iv(1)=-1
+       v(10)=eee
+       nf=1
+       go to 201
+      endif
+
+      call sumsl(nvar,d,var,func,gradient,iv,liv,lv,v,idum,rdum,fdum)
+c  find which conformation was returned from sumsl
+        nf=iv(7)+1
+  201  continue
+c total # of ftn evaluations (for iwf=0, it includes all minimizations).
+        indx(4)=nf
+        indx(5)=iv(1)
+        eee=v(10)
+
+        call mpi_send(indx,6,mpi_integer,king,idint,CG_COMM,
+     *                 ierr)
+c       print '(a5,i3,15f10.5)', 'ENEX0',indx(1),v(10)
+        call mpi_send(var,nvar,mpi_double_precision,
+     *               king,idreal,CG_COMM,ierr)
+        call mpi_send(eee,1,mpi_double_precision,king,idreal,
+     *                 CG_COMM,ierr)
+        call mpi_send(ene0,1,mpi_double_precision,king,idreal,
+     *                 CG_COMM,ierr)
+        go to 10
+
+      return
+      end
+#endif