00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 subroutine psmile_remove_intersect (inter, idl, idg, npart, &
00012 local_extent_info, global_extent_info, ierror)
00013
00014
00015
00016 use PRISM_constants
00017
00018 use PSMILe, dummy_interface => PSMILe_Remove_intersect
00019
00020 implicit none
00021
00022
00023
00024 Integer, Intent (In) ::
00025 local_extent_info (nd_extent_infos, *)
00026
00027
00028
00029
00030
00031 Integer, Intent (In) ::
00032 global_extent_info (nd_extent_infos, *)
00033
00034
00035
00036
00037
00038
00039
00040 Integer, Intent (InOut) :: npart
00041
00042
00043
00044 Real (PSMILe_float_kind), Intent (InOut) :: inter (2, ndim_3d, npart)
00045
00046
00047
00048 Integer, Intent (InOut) :: idl (npart)
00049
00050
00051
00052
00053 Integer, Intent (InOut) :: idg (npart)
00054
00055
00056
00057
00058
00059
00060 Integer, Intent (Out) :: ierror
00061
00062
00063
00064
00065
00066
00067
00068 Double Precision :: gap = 0.0d0
00069
00070
00071
00072 Integer :: i, k, l, lbeg
00073 Integer :: nfit
00074 Logical :: fit (ndim_3d)
00075
00076 Integer :: trans_diff (npart)
00077 Real (PSMILe_float_kind) :: common (2, ndim_3d, npart)
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 Character(len=len_cvs_string), save :: mycvs =
00097 '$Id: psmile_remove_intersect.F90 2325 2010-04-21 15:00:07Z valcke $'
00098
00099
00100
00101
00102
00103 #ifdef VERBOSE
00104 print 9990, trim(ch_id), npart
00105
00106 call psmile_flushstd
00107
00108 #endif /* VERBOSE */
00109
00110 ierror = 0
00111
00112 do l = 1, npart
00113 trans_diff (l) = local_extent_info(3, idl(l)) - &
00114 global_extent_info(3, idg(l))
00115 end do
00116
00117
00118
00119 k = 1
00120 do while (k <= npart - 1)
00121
00122
00123
00124 do l = k+1, npart
00125 common (1, :, l) = max (inter (1,:,l), inter (1,:,k))
00126 common (2, :, l) = min (inter (2,:,l), inter (2,:,k))
00127 end do
00128
00129
00130
00131
00132
00133 do l = k+1, npart
00134 if (trans_diff (l) /= trans_diff (k)) &
00135 common (1, 1, l) = common (2, 1, l) + 1.0
00136 end do
00137
00138 lbeg = k + 1
00139
00140 do while (lbeg <= npart )
00141 do l = lbeg, npart
00142 if (minval (common (2, :, l) - common (1, :, l)) >= 0.0d0) exit
00143 end do
00144
00145 if (l > npart) exit
00146 lbeg = l + 1
00147
00148 if (maxval (common (2, :, l) - common (1, :, l)) == 0.0d0) cycle
00149
00150
00151
00152
00153
00154
00155
00156 do i = 1, ndim_3d
00157 fit (i) = maxval (abs (common (1:2,i,l) - inter (1:2,i,l))) &
00158 == 0.0d0
00159 end do
00160 nfit = count (fit)
00161
00162
00163
00164 if (nfit == ndim_3d) then
00165 if (l /= npart) then
00166 inter (:, :, l) = inter (:, :, npart)
00167 common (:, :, l) = common (:, :, npart)
00168 idl (l) = idl (npart)
00169 idg (l) = idg (npart)
00170 trans_diff (l) = trans_diff (npart)
00171 endif
00172
00173 npart = npart - 1
00174 lbeg = l
00175
00176 cycle
00177 endif
00178
00179
00180
00181 if (maxval (abs (common (:,:,l) - inter (:,:,k))) == 0.0d0) then
00182 inter (:, :, k) = inter (:, :, npart)
00183 trans_diff (k) = trans_diff (npart)
00184
00185 idl (k) = idl (npart)
00186 idg (k) = idg (npart)
00187
00188 npart = npart - 1
00189 k = k - 1
00190
00191 exit
00192 endif
00193
00194
00195
00196
00197
00198
00199 if (nfit >= ndim_2d) then
00200 if (fit(1) .and. fit (2)) then
00201
00202 if (common (1, 3, l) == inter (1, 3, l)) then
00203 inter (1, 3, l) = common (2, 3, l) + gap
00204
00205
00206 else if (common (2, 3, l) == inter (2, 3, l)) then
00207
00208 inter (2, 3, l) = common (1, 3, l) - gap
00209
00210 endif
00211
00212 else if (fit (2) .and. fit (3)) then
00213
00214 if (common (1, 1, l) == inter (1, 1, l)) then
00215 inter (1, 1, l) = common (2, 1, l) + gap
00216
00217
00218 else if (common (2, 1, l) == inter (2, 1, l)) then
00219
00220 inter (2, 1, l) = common (1, 1, l) - gap
00221
00222 endif
00223
00224 else
00225
00226 if (common (1, 2, l) == inter (1, 2, l)) then
00227 inter (1, 2, l) = common (2, 2, l) + gap
00228
00229
00230 else if (common (2, 1, l) == inter (2, 1, l)) then
00231
00232 inter (2, 2, l) = common (1, 2, l) - gap
00233
00234 endif
00235 endif
00236 endif
00237
00238 #ifdef WIRKLICH
00239
00240
00241
00242
00243
00244
00245
00246
00247 if (
00248
00249 do i = 1, ndim_3d
00250 fitk (i) = maxval (abs (common (1:2,i,l) - inter (1:2,i,k))) &
00251 == 0
00252 end do
00253 nfitk = count (fitk)
00254
00255 if (nfitk >= ndim_2d) then
00256 if (fitk(1) .and. fitk (2)) then
00257
00258 if (common (1, 3, l) == inter (1, 3, k)) then
00259 inter (1, 3, k) = common (2, 3, l) + gap
00260 k = k - 1
00261 exit
00262
00263 else if (common (2, 3, l) == inter (2, 3, k)) then
00264
00265 inter (2, 3, k) = common (1, 3, l) - gap
00266 k = k - 1
00267 exit
00268
00269 endif
00270
00271 else if (fitk (2) .and. fitk (3)) then
00272
00273 if (common (1, 1, l) == inter (1, 1, k)) then
00274 inter (1, 1, k) = common (2, 1, l) + gap
00275 k = k - 1
00276 exit
00277
00278 else if (common (2, 1, l) == inter (2, 1, k)) then
00279
00280 inter (2, 1, k) = common (1, 1, l) - gap
00281 k = k - 1
00282 exit
00283 endif
00284
00285 else
00286
00287 if (common (1, 2, l) == inter (1, 2, k)) then
00288 inter (1, 2, k) = common (2, 2, l) + gap
00289 k = k - 1
00290 exit
00291
00292 else if (common (2, 1, l) == inter (2, 1, k)) then
00293
00294 inter (2, 2, k) = common (1, 2, l) - gap
00295 k = k - 1
00296 exit
00297 endif
00298 endif
00299 endif
00300 endif
00301 #endif
00302
00303 end do
00304
00305 k = k + 1
00306 end do
00307
00308
00309
00310 #ifdef VERBOSE
00311 print 9980, trim(ch_id), ierror, npart
00312 call psmile_flushstd
00313 #endif /* VERBOSE */
00314
00315
00316
00317
00318 #ifdef VERBOSE
00319
00320 9990 format (1x, a, ': psmile_remove_intersect: npart =', i4)
00321 9980 format (1x, a, ': psmile_remove_intersect: eof ierror =', i3, &
00322 '; npart =', i4)
00323
00324 #endif /* VERBOSE */
00325
00326 end subroutine PSMILe_Remove_intersect