00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 subroutine psmile_mg_first_subgrid_2d_dble (array, &
00012 idlow, idhigh, jdlow, jdhigh, nbr_corners, &
00013 range, &
00014 chmin, chmax, midp, &
00015 levdim1, levdim2, ierror)
00016
00017
00018
00019 use PRISM_constants
00020
00021 use PSMILe, dummy_interface => PSMILe_MG_First_subgrid_2d_dble
00022
00023 implicit none
00024
00025
00026
00027 Integer, Intent (In) :: idlow, idhigh, jdlow, jdhigh
00028 Integer, Intent (In) :: nbr_corners
00029
00030
00031
00032 Double Precision, Intent (In) :: array (idlow:idhigh, jdlow:jdhigh,
00033 nbr_corners)
00034
00035
00036
00037
00038 Integer, Intent (In) :: range (2, 2)
00039
00040
00041
00042 Integer, Intent (In) :: levdim1, levdim2
00043
00044
00045
00046
00047
00048 Double Precision, Intent (Out) :: chmin (0:levdim1, 0:levdim2)
00049
00050
00051
00052
00053 Double Precision, Intent (Out) :: chmax (0:levdim1, 0:levdim2)
00054
00055
00056
00057 Double Precision, Intent (Out) :: midp (0:levdim1, 0:levdim2)
00058
00059
00060
00061 Integer, Intent (Out) :: ierror
00062
00063
00064
00065
00066
00067
00068
00069 Double Precision, Parameter :: epsp1 = 1.0d0 + 5d-6
00070
00071
00072
00073 integer :: i, ibeg, iend
00074 integer :: j, jbeg, jend
00075
00076 Double Precision :: r_nbr
00077
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_2d_dble.F90 2325 2010-04-21 15:00:07Z valcke $'
00100
00101
00102
00103 #ifdef VERBOSE
00104 print *, trim(ch_id), ': PSMILe_MG_First_subgrid_2d_dble'
00105
00106 call psmile_flushstd
00107 #endif /* VERBOSE */
00108
00109 #ifdef PRISM_ASSERTION
00110 if (range(2,1)-range(1,1) > levdim1 .or. &
00111 range(2,2)-range(1,2) > levdim2) then
00112 call psmile_assert ( __FILE__, __LINE__, &
00113 'invalid range specified')
00114
00115 endif
00116 #endif
00117
00118
00119
00120 ierror = 0
00121
00122 ibeg = range (1, 1)
00123 iend = min (range(1, 1)+levdim1, range (2, 1))
00124
00125 jbeg = range (1, 2)
00126 jend = min (range(1, 2)+levdim2, range (2, 2))
00127
00128 r_nbr = 1.0 / nbr_corners
00129
00130
00131
00132 do j = jbeg, jend
00133
00134 do i = ibeg, iend
00135 chmin (i-range(1,1), j-range(1,2)) = MINVAL (array (i, j, :))
00136 enddo
00137 enddo
00138
00139
00140
00141 do j = jbeg, jend
00142
00143 do i = ibeg, iend
00144 chmax (i-range(1,1), j-range(1,2)) = MAXVAL (array (i, j, :))
00145 enddo
00146 enddo
00147
00148
00149
00150 do j = jbeg, jend
00151
00152 do i = ibeg, iend
00153 midp (i-range(1,1), j-range(1,2)) = SUM (array (i, j, :)) * r_nbr
00154 enddo
00155 enddo
00156
00157
00158
00159 ibeg = ibeg - range(1,1)
00160 iend = iend - range(1,1)
00161 jbeg = jbeg - range(1,2)
00162 jend = jend - range(1,2)
00163
00164 if (iend < levdim1) then
00165
00166 do j = jbeg, jend
00167 chmin (iend+1:levdim1, j) = chmax (iend, j) * epsp1
00168 chmax (iend+1:levdim1, j) = chmax (iend, j)
00169 midp (iend+1:levdim1, j) = midp (iend, j)
00170 enddo
00171 endif
00172
00173 if (jend < levdim2) then
00174
00175 do j = jend+1, levdim2
00176 chmin (ibeg:levdim1, j) = chmax (ibeg:levdim1, jend) * epsp1
00177 chmax (ibeg:levdim1, j) = chmax (ibeg:levdim1, jend)
00178 midp (ibeg:levdim1, j) = midp (ibeg:levdim1, jend)
00179 enddo
00180 endif
00181
00182
00183
00184 #ifdef DEBUG
00185 print *, 'dim', levdim1, levdim2
00186 print *, 'range', range
00187 print *, 'chmin', chmin (0,0), chmin (levdim1, 0), &
00188 chmin (0,levdim2), chmin (levdim1, levdim2)
00189 print *, 'chmax', chmax (0,0), chmax (levdim1, 0), &
00190 chmax (0,levdim2), chmax (levdim1, levdim2)
00191 print *, 'midp ', midp (0,0), midp (levdim1, 0), &
00192 midp (0,levdim2), midp (levdim1, levdim2)
00193 #endif
00194
00195 #ifdef VERBOSE
00196 print *, trim(ch_id), ': PSMILe_MG_First_subgrid_2d_dble eof', &
00197 ': ierror =', ierror
00198
00199 call psmile_flushstd
00200 #endif /* VERBOSE */
00201
00202 end subroutine PSMILe_MG_First_subgrid_2d_dble