psmile_mg_first_subgrid_2d_dble.F90

Go to the documentation of this file.
00001 !-----------------------------------------------------------------------
00002 ! Copyright 2006-2010, NEC Europe Ltd., London, UK.
00003 ! All rights reserved. Use is subject to OASIS4 license terms.
00004 !-----------------------------------------------------------------------
00005 !BOP
00006 !
00007 ! !ROUTINE: PSMILe_MG_First_subgrid_2d_dble
00008 !
00009 ! !INTERFACE:
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 ! !USES:
00018 !
00019       use PRISM_constants
00020 !
00021       use PSMILe, dummy_interface => PSMILe_MG_First_subgrid_2d_dble
00022 
00023       implicit none
00024 !
00025 ! !INPUT PARAMETERS:
00026 !
00027       Integer, Intent (In)             :: idlow, idhigh, jdlow, jdhigh
00028       Integer, Intent (In)             :: nbr_corners
00029 !
00030 !     Dimensions of "array"
00031 !
00032       Double Precision, Intent (In)    :: array (idlow:idhigh, jdlow:jdhigh, 
00033                                                  nbr_corners)
00034 !
00035 !     Fully dimensioned arrays for which the first level
00036 !     should be computed.
00037 !
00038       Integer, Intent (In)             :: range (2, 2)
00039 !
00040 !     Definintion of the subgrid
00041 !
00042       Integer, Intent (In)             :: levdim1, levdim2
00043 !
00044 !     Dimension of the first MG level
00045 !
00046 ! !OUTPUT PARAMETERS:
00047 !
00048       Double Precision, Intent (Out)   :: chmin (0:levdim1, 0:levdim2)
00049 !
00050 !     Minimum extension of bounding box of each coordinate cell.
00051 !
00052 
00053       Double Precision, Intent (Out)   :: chmax (0:levdim1, 0:levdim2)
00054 !
00055 !     Maximum extension of bounding box of each coordinate cell.
00056 !
00057       Double Precision, Intent (Out)   :: midp  (0:levdim1, 0:levdim2)
00058 !
00059 !     Mid point of bounding box of each coordinate cell.
00060 !
00061       Integer, Intent (Out)            :: ierror
00062 !
00063 !     Returns the error code of PSMILe_MG_First_subgrid_2d_dble
00064 !             ierror = 0 : No error
00065 !             ierror > 0 : Severe error
00066 !
00067 ! !DEFINED PARAMETERS:
00068 !
00069       Double Precision, Parameter      :: epsp1 = 1.0d0 + 5d-6
00070 !
00071 ! !LOCAL VARIABLES
00072 !
00073       integer                          :: i, ibeg, iend
00074       integer                          :: j, jbeg, jend
00075 !
00076       Double Precision                 :: r_nbr
00077 !
00078 ! !DESCRIPTION:
00079 !
00080 ! Subroutine "PSMILe_MG_First_subgrid_2d_dble" computes the bounding
00081 ! boxes and the mid point for the corner coordinates ("control volumes")
00082 ! for a 2-dimensional subgrid. The bounding boxes and mid points are
00083 ! used in the Multigrid search.
00084 !
00085 !
00086 ! !REVISION HISTORY:
00087 !
00088 !   Date      Programmer   Description
00089 ! ----------  ----------   -----------
00090 ! 03.06.25    H. Ritzdorf  created
00091 !
00092 !EOP
00093 !----------------------------------------------------------------------
00094 !
00095 !  $Id: psmile_mg_first_subgrid_2d_dble.F90 2325 2010-04-21 15:00:07Z valcke $
00096 !  $Author: valcke $
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 !  Initialization
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 !     ... Compute minimum extension of grid cell
00131 !
00132          do j = jbeg, jend
00133 !cdir vector
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 !     ... Compute maximum extension of grid cell
00140 !
00141          do j = jbeg, jend
00142 !cdir vector
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 !     ... Compute mid point of grid cell
00149 !
00150          do j = jbeg, jend
00151 !cdir vector
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 !     ... Create dummy cells if necessary
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 !cdir vector
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 !cdir vector
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 !===> All done
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

Generated on 18 Mar 2011 for Oasis4 by  doxygen 1.6.1