00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 subroutine psmile_mg_cells_gauss2 ( grid_id, &
00012 search_grid_type, found, loc, &
00013 loc_fnd_shape, control, ierror )
00014
00015
00016
00017 use PRISM_constants
00018
00019 use PSMILe, dummy_interface => PSMILe_mg_cells_gauss2
00020 #ifdef DEBUG_TRACE
00021 use psmile_debug_trace
00022 #endif
00023
00024 Implicit none
00025
00026
00027
00028 Integer, Intent (In) :: grid_id
00029
00030 Integer, Intent (In) :: search_grid_type
00031
00032 Integer, Intent (In) :: loc_fnd_shape (2, ndim_3d)
00033
00034
00035
00036 Integer, Intent (In) :: control (2, ndim_3d)
00037
00038
00039
00040
00041
00042
00043 Integer, Intent (InOut) :: found ( loc_fnd_shape(1,1):loc_fnd_shape(2,1),
00044 loc_fnd_shape(1,2):loc_fnd_shape(2,2),
00045 loc_fnd_shape(1,3):loc_fnd_shape(2,3) )
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 Integer, Intent (InOut) :: loc ( loc_fnd_shape(1,1):loc_fnd_shape(2,1),
00060 loc_fnd_shape(1,2):loc_fnd_shape(2,2),
00061 loc_fnd_shape(1,3):loc_fnd_shape(2,3) )
00062
00063
00064
00065
00066
00067
00068
00069 Integer, Intent (Out) :: ierror
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 Integer, Parameter :: val_coupler = -1
00081
00082
00083
00084
00085 Integer, Parameter :: lev = 1
00086
00087
00088
00089 Integer :: i, j, k
00090
00091 Integer :: not_found
00092
00093
00094
00095 Integer, Parameter :: nerrp = 2
00096 Integer :: ierrp (nerrp)
00097
00098 #ifdef DEBUG_TRACE
00099
00100
00101
00102 Integer :: m1, m2, m3, m4
00103 #endif
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 Character(len=len_cvs_string), save :: mycvs =
00128 '$Id: psmile_mg_cells_gauss2.F90 3023 2011-03-17 10:21:20Z hanke $'
00129
00130
00131
00132
00133
00134 ierror = 0
00135
00136 not_found = - (Grids(grid_id)%nlev + 1)
00137
00138 #ifdef VERBOSE
00139 print 9990, trim(ch_id), lev, control
00140 call psmile_flushstd
00141 #endif /* VERBOSE */
00142
00143
00144
00145
00146
00147
00148 #ifdef PRISM_ASSERTION
00149 do k = control(1,3), control(2,3)
00150 do j = control(1,2), control (2,2)
00151
00152 do i = control(1,1), control (2,1)
00153 if ( found(i,j,k) == lev .and. &
00154 ( loc(i,j,k) < grids(grid_id)%grid_shape(1,1) .or. &
00155 loc(i,j,k) > grids(grid_id)%grid_shape(2,1)) ) exit
00156 end do
00157
00158 if (i <= control (2,1)) then
00159 print *, 'i,j,k', i,j,k, ', loc', loc(i,j,k)
00160 print *, 'grids(grid_id)%grid_shape', grids(grid_id)%grid_shape(:,1)
00161 call psmile_assert (__FILE__, __LINE__, &
00162 "Incorrect gauss index found")
00163 endif
00164 end do
00165 end do
00166 #endif
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 if ( search_grid_type /= PRISM_Gaussreduced_regvrt ) then
00177
00178 do k = loc_fnd_shape(1,3), loc_fnd_shape(2,3)
00179 do j = loc_fnd_shape(1,2), loc_fnd_shape(2,2)-1
00180 do i = loc_fnd_shape(1,1), loc_fnd_shape(2,1)-1
00181
00182 if ( found(i ,j ,k) /= lev .and. &
00183 (found(i+1,j ,k) == lev .or. &
00184 found(i ,j+1,k) == lev .or. &
00185 found(i+1,j+1,k) == lev ) ) then
00186
00187 found(i,j,k) = 1
00188
00189 if ( abs(found(i+1,j ,k)) == lev ) then
00190
00191 loc(i,j,k) = loc(i+1,j ,k)
00192
00193 else if ( abs(found(i ,j+1,k)) == lev ) then
00194
00195 loc(i,j,k) = loc(i ,j+1,k)
00196
00197 else if ( abs(found(i+1,j+1,k)) == lev ) then
00198
00199 loc(i,j,k) = loc(i+1,j+1,k)
00200
00201 endif
00202
00203 endif
00204 enddo
00205 enddo
00206 enddo
00207
00208
00209
00210
00211 do k = loc_fnd_shape(1,3), loc_fnd_shape(2,3)
00212 j = loc_fnd_shape(2,2)
00213 do i = loc_fnd_shape(1,1), loc_fnd_shape(2,1)
00214 found(i,j,k) = not_found
00215 enddo
00216 enddo
00217
00218 do k = loc_fnd_shape(1,3), loc_fnd_shape(2,3)
00219 i = loc_fnd_shape(2,1)
00220 do j = loc_fnd_shape(1,2), loc_fnd_shape(2,2)
00221 found(i,j,k) = not_found
00222 enddo
00223 enddo
00224
00225 endif
00226
00227
00228
00229
00230 where (found(:,:,:) == lev)
00231 found(:,:,:) = val_coupler
00232 endwhere
00233
00234
00235
00236
00237
00238
00239 #ifdef DEBUG_TRACE
00240 if ( loc_fnd_shape(1,1) <= ictl_ind(1) .and. loc_fnd_shape(2,1) >= ictl_ind(1) .and. &
00241 loc_fnd_shape(1,2) <= ictl_ind(2) .and. loc_fnd_shape(2,2) >= ictl_ind(2)) then
00242 print 8990, ictl_ind (1:ndim_2d), &
00243 found (ictl_ind(1),ictl_ind(2),control(1,3)), &
00244 loc (ictl_ind(1),ictl_ind(2),control(1,3))
00245 m1 = 1
00246 m3 = 0
00247 do m2 = grids(grid_id)%grid_shape(1,1), loc (ictl_ind(1),ictl_ind(2),control(1,3))
00248 m4 = Grids(grid_id)%partition(m1,1)
00249 m3 = m3 + 1
00250 if ( m3 == Grids(grid_id)%extent(m1,1) ) then
00251 m1 = m1 + 1
00252 m3 = 0
00253 endif
00254 enddo
00255 print *, ' corresponding to loc global index ', m4+m3
00256
00257 8990 format (1x, '### psmile_mg_cells_gauss2: ictl_ind', 2i5, &
00258 '; found, loc ', i3, 1x, i8)
00259 endif
00260 #endif /* DEBUG_TRACE */
00261
00262 #ifdef VERBOSE
00263 print 9980, trim(ch_id), lev
00264
00265 call psmile_flushstd
00266 #endif /* VERBOSE */
00267
00268
00269
00270 9990 format (1x, a, ': psmile_mg_cells_gauss2: level', i3, &
00271 ', control', 6i6)
00272 9980 format (1x, a, ': psmile_mg_cells_gauss2: eof, level', i3)
00273
00274 end subroutine psmile_mg_cells_gauss2