@@ -69,6 +69,17 @@ subroutine locate_MPI_slice(npoints_subset,ipoin_already_done, &
6969 double precision , dimension (npoints_subset,0 :NPROC-1 ) :: final_distance_all
7070 double precision , dimension (NDIM,NDIM,npoints_subset,0 :NPROC-1 ) :: nu_all
7171
72+ double precision :: xi,eta,gamma
73+
74+ ! point inside element
75+ logical :: found_point_inside
76+
77+ ! prefer slice with point location inside element rather than just selecting slice with closest location
78+ logical , parameter :: DO_PREFER_INSIDE_ELEMENT = .true.
79+
80+ ! debug
81+ ! integer,dimension(1) :: iproc_min
82+
7283 ! initializes with dummy values
7384 ispec_selected_all(:,:) = - 1
7485 idomain_all(:,:) = - 1000
@@ -98,33 +109,117 @@ subroutine locate_MPI_slice(npoints_subset,ipoin_already_done, &
98109 ! find the slice and element to put the source
99110 if (myrank == 0 ) then
100111
101- ! loops over subset
102- do ipoin_in_this_subset = 1 ,npoints_subset
112+ ! we prefer slices with point locations inside an element over slices with a closer point distance
113+ ! but a point location outside the (best) element
114+ if (DO_PREFER_INSIDE_ELEMENT) then
115+
116+ ! loops over subset
117+ do ipoin_in_this_subset = 1 ,npoints_subset
118+ ! mapping from station/source number in current subset to real station/source number in all the subsets
119+ ipoin = ipoin_in_this_subset + ipoin_already_done
120+
121+ ! checks first if we have a close point inside an element
122+ found_point_inside = .false.
123+ distmin = HUGEVAL
124+ do iproc = 0 ,NPROC-1
125+ ! point position
126+ xi = xi_all(ipoin_in_this_subset,iproc)
127+ eta = eta_all(ipoin_in_this_subset,iproc)
128+ gamma = gamma_all(ipoin_in_this_subset,iproc)
129+
130+ ! points inside an element have xi/eta/gamma <= 1.0
131+ if (abs (xi) <= 1.d0 .and. abs (eta) <= 1.d0 .and. abs (gamma) <= 1.d0 ) then
132+ ! takes point if closer
133+ if (final_distance_all(ipoin_in_this_subset,iproc) < distmin) then
134+ found_point_inside = .true.
135+
136+ xi_point(ipoin) = xi
137+ eta_point(ipoin) = eta
138+ gamma_point(ipoin) = gamma
139+
140+ distmin = final_distance_all(ipoin_in_this_subset,iproc)
141+
142+ islice_selected(ipoin) = iproc
143+ ispec_selected(ipoin) = ispec_selected_all(ipoin_in_this_subset,iproc)
144+ idomain(ipoin) = idomain_all(ipoin_in_this_subset,iproc)
145+
146+ nu_point(:,:,ipoin) = nu_all(:,:,ipoin_in_this_subset,iproc)
147+
148+ x_found(ipoin) = x_found_all(ipoin_in_this_subset,iproc)
149+ y_found(ipoin) = y_found_all(ipoin_in_this_subset,iproc)
150+ z_found(ipoin) = z_found_all(ipoin_in_this_subset,iproc)
151+ endif
152+ endif
153+ enddo
154+
155+ ! if we haven't found a close point inside an element, then look for just the closest possible
156+ if (.not. found_point_inside) then
157+ do iproc = 0 ,NPROC-1
158+ if (final_distance_all(ipoin_in_this_subset,iproc) < distmin) then
159+ distmin = final_distance_all(ipoin_in_this_subset,iproc)
160+
161+ islice_selected(ipoin) = iproc
162+ ispec_selected(ipoin) = ispec_selected_all(ipoin_in_this_subset,iproc)
163+ idomain(ipoin) = idomain_all(ipoin_in_this_subset,iproc)
164+
165+ xi_point(ipoin) = xi_all(ipoin_in_this_subset,iproc)
166+ eta_point(ipoin) = eta_all(ipoin_in_this_subset,iproc)
167+ gamma_point(ipoin) = gamma_all(ipoin_in_this_subset,iproc)
168+
169+ nu_point(:,:,ipoin) = nu_all(:,:,ipoin_in_this_subset,iproc)
170+
171+ x_found(ipoin) = x_found_all(ipoin_in_this_subset,iproc)
172+ y_found(ipoin) = y_found_all(ipoin_in_this_subset,iproc)
173+ z_found(ipoin) = z_found_all(ipoin_in_this_subset,iproc)
174+ endif
175+ enddo
176+ endif
103177
104- ! mapping from station/source number in current subset to real station/source number in all the subsets
105- ipoin = ipoin_in_this_subset + ipoin_already_done
178+ final_distance(ipoin) = distmin
179+
180+ ! debug
181+ ! iproc_min = minloc(final_distance_all(ipoin_in_this_subset,:)) - 1 ! -1 to start procs at 0
182+ ! print *,'debug: locate MPI point',ipoin,ipoin_in_this_subset,'dist',final_distance_all(ipoin_in_this_subset,:), &
183+ ! 'iproc min',iproc_min(1), &
184+ ! 'xi min',xi_all(ipoin_in_this_subset,iproc_min(1)), &
185+ ! eta_all(ipoin_in_this_subset,iproc_min(1)), &
186+ ! gamma_all(ipoin_in_this_subset,iproc_min(1)), &
187+ ! 'iproc found',islice_selected(ipoin),'dist found',final_distance(ipoin), &
188+ ! 'xi found',xi_point(ipoin),eta_point(ipoin),gamma_point(ipoin)
189+ enddo
106190
107- distmin = HUGEVAL
108- do iproc = 0 ,NPROC-1
109- if (final_distance_all(ipoin_in_this_subset,iproc) < distmin) then
110- distmin = final_distance_all(ipoin_in_this_subset,iproc)
191+ else
192+ ! old version takes closest point
111193
112- islice_selected(ipoin) = iproc
113- ispec_selected(ipoin) = ispec_selected_all(ipoin_in_this_subset,iproc)
114- idomain(ipoin) = idomain_all(ipoin_in_this_subset,iproc)
194+ ! loops over subset
195+ do ipoin_in_this_subset = 1 ,npoints_subset
115196
116- xi_point(ipoin) = xi_all(ipoin_in_this_subset,iproc)
117- eta_point(ipoin) = eta_all(ipoin_in_this_subset,iproc)
118- gamma_point(ipoin) = gamma_all(ipoin_in_this_subset,iproc)
119- nu_point(:,:,ipoin) = nu_all(:,:,ipoin_in_this_subset,iproc)
197+ ! mapping from station/source number in current subset to real station/source number in all the subsets
198+ ipoin = ipoin_in_this_subset + ipoin_already_done
120199
121- x_found(ipoin) = x_found_all(ipoin_in_this_subset,iproc)
122- y_found(ipoin) = y_found_all(ipoin_in_this_subset,iproc)
123- z_found(ipoin) = z_found_all(ipoin_in_this_subset,iproc)
124- endif
200+ distmin = HUGEVAL
201+ do iproc = 0 ,NPROC-1
202+ if (final_distance_all(ipoin_in_this_subset,iproc) < distmin) then
203+ distmin = final_distance_all(ipoin_in_this_subset,iproc)
204+
205+ islice_selected(ipoin) = iproc
206+ ispec_selected(ipoin) = ispec_selected_all(ipoin_in_this_subset,iproc)
207+ idomain(ipoin) = idomain_all(ipoin_in_this_subset,iproc)
208+
209+ xi_point(ipoin) = xi_all(ipoin_in_this_subset,iproc)
210+ eta_point(ipoin) = eta_all(ipoin_in_this_subset,iproc)
211+ gamma_point(ipoin) = gamma_all(ipoin_in_this_subset,iproc)
212+ nu_point(:,:,ipoin) = nu_all(:,:,ipoin_in_this_subset,iproc)
213+
214+ x_found(ipoin) = x_found_all(ipoin_in_this_subset,iproc)
215+ y_found(ipoin) = y_found_all(ipoin_in_this_subset,iproc)
216+ z_found(ipoin) = z_found_all(ipoin_in_this_subset,iproc)
217+ endif
218+ enddo
219+ final_distance(ipoin) = distmin
125220 enddo
126- final_distance(ipoin) = distmin
127- enddo
221+
222+ endif
128223
129224 endif ! end of section executed by main process only
130225
0 commit comments