rename
[unres4.git] / source / wham / control_wham.F90
1       module control_wham
2 !-----------------------------------------------------------------------------
3
4       implicit none
5 !-----------------------------------------------------------------------------
6 !
7 !
8 !-----------------------------------------------------------------------------
9       contains
10 !-----------------------------------------------------------------------------
11 ! initialize_p.F
12 !-----------------------------------------------------------------------------
13       subroutine init_int_table
14 !      implicit real*8 (a-h,o-z)
15 !      include 'DIMENSIONS'
16 !      include 'DIMENSIONS.ZSCOPT'
17 #ifdef MPI
18       use MPI_data
19       include 'mpif.h'
20 #endif
21 #ifdef MP
22 !      include 'COMMON.INFO'
23 #endif
24 !      include 'COMMON.CHAIN'
25 !      include 'COMMON.INTERACT'
26 !      include 'COMMON.LOCAL'
27 !      include 'COMMON.SBRIDGE'
28 !      include 'COMMON.IOUNITS'
29       logical :: scheck,lprint
30 #ifdef MPI
31       integer :: my_sc_int(0:nfgtasks-1),my_ele_int(0:nfgtasks-1)
32       integer :: my_sc_intt(0:nfgtasks),my_ele_intt(0:nfgtasks)
33
34 !... Determine the numbers of start and end SC-SC interaction 
35 !... to deal with by current processor.
36       lprint=.true.
37       if (lprint) &
38       write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct
39       n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss
40       MyRank=MyID-(MyGroup-1)*fgProcs
41       call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde)
42       if (lprint) &
43         write (iout,*) 'Processor',MyID,' MyRank',MyRank,&
44         ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds,&
45         ' my_sc_inde',my_sc_inde
46       ind_sctint=0
47       iatsc_s=0
48       iatsc_e=0
49 #endif
50       lprint=.false.
51 !      do i=1,maxres !el ?????????
52       do i=1,nres
53         nint_gr(i)=0
54         nscp_gr(i)=0
55         do j=1,maxint_gr
56           istart(i,1)=0
57           iend(i,1)=0
58           ielstart(i)=0
59           ielend(i)=0
60           iscpstart(i,1)=0
61           iscpend(i,1)=0    
62         enddo
63       enddo
64       ind_scint=0
65       ind_scint_old=0
66 !d    write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb',
67 !d   &   (ihpb(i),jhpb(i),i=1,nss)
68       do i=nnt,nct-1
69         scheck=.false.
70         do ii=1,nss
71           if (ihpb(ii).eq.i+nres) then
72             scheck=.true.
73             jj=jhpb(ii)-nres
74             goto 10
75           endif
76         enddo
77    10   continue
78 !d      write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj
79         if (scheck) then
80           if (jj.eq.i+1) then
81 #ifdef MPI
82             write (iout,*) 'jj=i+1'
83             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,&
84        iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
85 #else
86             nint_gr(i)=1
87             istart(i,1)=i+2
88             iend(i,1)=nct
89 #endif
90           else if (jj.eq.nct) then
91 #ifdef MPI
92             write (iout,*) 'jj=nct'
93             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,&
94         iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12)
95 #else
96             nint_gr(i)=1
97             istart(i,1)=i+1
98             iend(i,1)=nct-1
99 #endif
100           else
101 #ifdef MPI
102             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,&
103        iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12)
104             ii=nint_gr(i)+1
105             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,&
106        iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12)
107 #else
108             nint_gr(i)=2
109             istart(i,1)=i+1
110             iend(i,1)=jj-1
111             istart(i,2)=jj+1
112             iend(i,2)=nct
113 #endif
114           endif
115         else
116 #ifdef MPI
117           call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,&
118           iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
119 #else
120           nint_gr(i)=1
121           istart(i,1)=i+1
122           iend(i,1)=nct
123           ind_scint=int_scint+nct-i
124 #endif
125         endif
126 #ifdef MPI
127         ind_scint_old=ind_scint
128 #endif
129       enddo
130    12 continue
131 #ifndef MPI
132       iatsc_s=nnt
133       iatsc_e=nct-1
134 #endif
135 #ifdef MPI
136       if (lprint) then
137         write (iout,*) 'Processor',MyID,' Group',MyGroup
138         write (iout,*) 'iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e
139       endif
140 #endif
141       if (lprint) then
142       write (iout,'(a)') 'Interaction array:'
143       do i=iatsc_s,iatsc_e
144         write (iout,'(i3,2(2x,2i3))') &
145        i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i))
146       enddo
147       endif
148       ispp=2
149 #ifdef MPI
150 ! Now partition the electrostatic-interaction array
151       npept=nct-nnt
152       nele_int_tot=(npept-ispp)*(npept-ispp+1)/2
153       call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde)
154       if (lprint) &
155        write (iout,*) 'Processor',MyID,' MyRank',MyRank,&
156         ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds,&
157                      ' my_ele_inde',my_ele_inde
158       iatel_s=0
159       iatel_e=0
160       ind_eleint=0
161       ind_eleint_old=0
162       do i=nnt,nct-3
163         ijunk=0
164         call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i,&
165           iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13)
166       enddo ! i 
167    13 continue
168 #else
169       iatel_s=nnt
170       iatel_e=nct-3
171       do i=iatel_s,iatel_e
172         ielstart(i)=i+2
173         ielend(i)=nct-1
174       enddo
175 #endif
176       if (lprint) then
177         write (iout,'(a)') 'Electrostatic interaction array:'
178         do i=iatel_s,iatel_e
179           write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i)
180         enddo
181       endif ! lprint
182 !     iscp=3
183       iscp=2
184 ! Partition the SC-p interaction array
185 #ifdef MPI
186       nscp_int_tot=(npept-iscp+1)*(npept-iscp+1)
187       call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde)
188       if (lprint) &
189        write (iout,*) 'Processor',MyID,' MyRank',MyRank,&
190         ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds,&
191                      ' my_scp_inde',my_scp_inde
192       iatscp_s=0
193       iatscp_e=0
194       ind_scpint=0
195       ind_scpint_old=0
196       do i=nnt,nct-1
197         if (i.lt.nnt+iscp) then
198 !d        write (iout,*) 'i.le.nnt+iscp'
199           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,&
200             iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1),&
201             iscpend(i,1),*14)
202         else if (i.gt.nct-iscp) then
203 !d        write (iout,*) 'i.gt.nct-iscp'
204           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,&
205             iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),&
206             iscpend(i,1),*14)
207         else
208           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,&
209             iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),&
210             iscpend(i,1),*14)
211           ii=nscp_gr(i)+1
212           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,&
213             iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii),&
214             iscpend(i,ii),*14)
215         endif
216       enddo ! i
217    14 continue
218 #else
219       iatscp_s=nnt
220       iatscp_e=nct-1
221       do i=nnt,nct-1
222         if (i.lt.nnt+iscp) then
223           nscp_gr(i)=1
224           iscpstart(i,1)=i+iscp
225           iscpend(i,1)=nct
226         elseif (i.gt.nct-iscp) then
227           nscp_gr(i)=1
228           iscpstart(i,1)=nnt
229           iscpend(i,1)=i-iscp
230         else
231           nscp_gr(i)=2
232           iscpstart(i,1)=nnt
233           iscpend(i,1)=i-iscp
234           iscpstart(i,2)=i+iscp
235           iscpend(i,2)=nct
236         endif 
237       enddo ! i
238 #endif
239       if (lprint) then
240         write (iout,'(a)') 'SC-p interaction array:'
241         do i=iatscp_s,iatscp_e
242           write (iout,'(i3,2(2x,2i3))') &
243                i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
244         enddo
245       endif ! lprint
246 ! Partition local interactions
247 #ifdef MPI
248       call int_bounds(nres-2,loc_start,loc_end)
249       loc_start=loc_start+1
250       loc_end=loc_end+1
251       call int_bounds(nres-2,ithet_start,ithet_end)
252       ithet_start=ithet_start+2
253       ithet_end=ithet_end+2
254       call int_bounds(nct-nnt-2,iphi_start,iphi_end) 
255       iphi_start=iphi_start+nnt+2
256       iphi_end=iphi_end+nnt+2
257       call int_bounds(nres-3,itau_start,itau_end)
258       itau_start=itau_start+3
259       itau_end=itau_end+3
260       if (lprint) then 
261         write (iout,*) 'Processor:',MyID,&
262        ' loc_start',loc_start,' loc_end',loc_end,&
263        ' ithet_start',ithet_start,' ithet_end',ithet_end,&
264        ' iphi_start',iphi_start,' iphi_end',iphi_end
265         write (*,*) 'Processor:',MyID,&
266        ' loc_start',loc_start,' loc_end',loc_end,&
267        ' ithet_start',ithet_start,' ithet_end',ithet_end,&
268        ' iphi_start',iphi_start,' iphi_end',iphi_end
269       endif
270       if (fgprocs.gt.1 .and. MyID.eq.BossID) then
271        write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ',&
272        nele_int_tot,' electrostatic and ',nscp_int_tot,&
273        ' SC-p interactions','were distributed among',fgprocs,&
274        ' fine-grain processors.'
275       endif
276 #else
277       loc_start=2
278       loc_end=nres-1
279       ithet_start=3 
280       ithet_end=nres
281       iphi_start=nnt+3
282       iphi_end=nct
283       itau_start=4
284       itau_end=nres
285 #endif
286       return
287       end subroutine init_int_table
288 !-----------------------------------------------------------------------------
289 !-----------------------------------------------------------------------------
290       end module control_wham