00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 subroutine psmile_mg_first_subgrid_3d_real (array, &
00012 idlow, idhigh, jdlow, jdhigh, kdlow, kdhigh, &
00013 nbr_corners, &
00014 range, &
00015 chmin, chmax, midp, &
00016 levdim1, levdim2, levdim3, ierror)
00017
00018
00019
00020 use PRISM_constants
00021
00022 use PSMILe, dummy_interface => PSMILe_MG_First_subgrid_3d_real
00023
00024 implicit none
00025
00026
00027
00028 Integer, Intent (In) :: idlow, idhigh, jdlow, jdhigh
00029 Integer, Intent (In) :: kdlow, kdhigh, nbr_corners
00030
00031
00032
00033 Real, Intent (In) :: array (idlow:idhigh, jdlow:jdhigh,
00034 kdlow:kdhigh, nbr_corners)
00035
00036
00037
00038
00039 Integer, Intent (In) :: range (2, ndim_3d)
00040
00041
00042
00043 Integer, Intent (In) :: levdim1, levdim2, levdim3
00044
00045
00046
00047
00048
00049 Real, Intent (Out) :: chmin (0:levdim1, 0:levdim2, 0:levdim3)
00050
00051
00052
00053 Real, Intent (Out) :: chmax (0:levdim1, 0:levdim2, 0:levdim3)
00054
00055
00056
00057 Real, Intent (Out) :: midp (0:levdim1, 0:levdim2, 0:levdim3)
00058
00059
00060
00061 integer, Intent (Out) :: ierror
00062
00063
00064
00065
00066
00067
00068
00069 Real, parameter :: epsp1 = 1.0 + 5e-6
00070
00071
00072
00073 integer :: i, ibeg, iend
00074 integer :: j, jbeg, jend
00075 integer :: k, kbeg, kend
00076
00077 Real :: r_nbr
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 Character(len=len_cvs_string), save :: mycvs =
00099 '$Id: psmile_mg_first_subgrid_3d_real.F90 2325 2010-04-21 15:00:07Z valcke $'
00100
00101
00102
00103 #ifdef VERBOSE
00104 print *, trim(ch_id), ': PSMILe_MG_First_subgrid_3d_real'
00105
00106 call psmile_flushstd
00107 #endif /* VERBOSE */
00108
00109
00110
00111 ierror = 0
00112
00113 ibeg = range (1, 1)
00114 iend = min (range(1, 1)+levdim1, range (2, 1))
00115
00116 jbeg = range (1, 2)
00117 jend = min (range(1, 2)+levdim2, range (2, 2))
00118
00119 kbeg = range (1, 3)
00120 kend = min (range(1, 3)+levdim3, range (2, 3))
00121
00122 r_nbr = 1.0 / nbr_corners
00123
00124
00125
00126
00127
00128 do k = kbeg, kend
00129 do j = jbeg, jend
00130
00131 do i = ibeg, iend
00132 chmin (i-range(1,1), j-range(1,2), k-range(1,3)) = &
00133 MINVAL (array (i, j, k, :))
00134 enddo
00135 enddo
00136 enddo
00137
00138
00139
00140 do k = kbeg, kend
00141 do j = jbeg, jend
00142
00143 do i = ibeg, iend
00144 chmax (i-range(1,1), j-range(1,2), k-range(1,3)) = &
00145 MAXVAL (array (i, j, k, :))
00146 enddo
00147 enddo
00148 enddo
00149
00150
00151
00152 do k = kbeg, kend
00153 do j = jbeg, jend
00154
00155 do i = ibeg, iend
00156 midp (i-range(1,1), j-range(1,2), k-range(1,3)) = &
00157 SUM (array (i, j, k, :)) * r_nbr
00158 enddo
00159 enddo
00160 enddo
00161
00162
00163
00164 ibeg = ibeg - range(1,1)
00165 iend = iend - range(1,1)
00166 jbeg = jbeg - range(1,2)
00167 jend = jend - range(1,2)
00168 kbeg = kbeg - range(1,3)
00169 kend = kend - range(1,3)
00170
00171 if (iend < levdim1) then
00172 do k = kbeg, kend
00173
00174 do j = jbeg, jend
00175 chmin (iend+1:levdim1, j, k) = chmax (iend, j, k) * epsp1
00176 chmax (iend+1:levdim1, j, k) = chmax (iend, j, k)
00177 midp (iend+1:levdim1, j, k) = midp (iend, j, k)
00178 enddo
00179 enddo
00180 endif
00181
00182 if (jend < levdim2) then
00183 do k = kbeg, kend
00184
00185 do j = jend+1, levdim2
00186 chmin (ibeg:levdim1, j, k) = chmax (ibeg:levdim1, jend, k) * epsp1
00187 chmax (ibeg:levdim1, j, k) = chmax (ibeg:levdim1, jend, k)
00188 midp (ibeg:levdim1, j, k) = midp (ibeg:levdim1, jend, k)
00189 enddo
00190 enddo
00191 endif
00192
00193 if (kend < levdim3) then
00194
00195 do k = kend+1, levdim3
00196 chmin (ibeg:levdim1, jbeg:levdim2, k) = &
00197 chmax (ibeg:levdim1, jbeg:levdim2, kend) * epsp1
00198 chmax (ibeg:levdim1, jbeg:levdim2, k) = &
00199 chmax (ibeg:levdim1, jbeg:levdim2, kend)
00200 midp (ibeg:levdim1, jbeg:levdim2, k) = &
00201 midp (ibeg:levdim1, jbeg:levdim2, kend)
00202 enddo
00203 endif
00204
00205
00206
00207 #ifdef VERBOSE
00208 print *, trim(ch_id), ': PSMILe_MG_First_subgrid_3d_real eof', &
00209 ': ierror =', ierror
00210
00211 call psmile_flushstd
00212 #endif /* VERBOSE */
00213
00214 end subroutine PSMILe_MG_First_subgrid_3d_real