psmile_mg_first_subgrid_3d_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_3d_dble
00008 !
00009 ! !INTERFACE:
00010 
00011       subroutine psmile_mg_first_subgrid_3d_dble (array, &
00012                     idlow, idhigh, jdlow, jdhigh, kdlow, kdhigh, &
00013                     nbr_corners,   &
00014                            range,                        &
00015                     chmin, chmax, midp,                  &
00016                     levdim1, levdim2, levdim3, ierror)
00017 !
00018 ! !USES:
00019 !
00020       use PRISM_constants
00021 !
00022       use PSMILe, dummy_interface => PSMILe_MG_First_subgrid_3d_dble
00023 
00024       implicit none
00025 !
00026 ! !INPUT PARAMETERS:
00027 !
00028       Integer, Intent (In)             :: idlow, idhigh, jdlow, jdhigh
00029       Integer, Intent (In)             :: kdlow, kdhigh, nbr_corners
00030 
00031 !     Dimensions of "array"
00032 
00033       Double Precision, Intent (In)    :: array (idlow:idhigh, jdlow:jdhigh, 
00034                                                  kdlow:kdhigh, nbr_corners)
00035 
00036 !     Fully dimensioned arrays for which the first level
00037 !     should be computed.
00038 
00039       Integer, Intent (In)             :: range (2, ndim_3d)
00040 
00041 !     Definintion of the subgrid
00042 
00043       Integer, Intent (In)             :: levdim1, levdim2, levdim3
00044 
00045 !     Dimension of the first MG level
00046 !
00047 ! !OUTPUT PARAMETERS:
00048 !
00049       Double Precision, Intent (Out)   :: chmin (0:levdim1, 0:levdim2, 0:levdim3)
00050 !
00051 !     Minimum extension of bounding box of each coordinate cell.
00052 !
00053       Double Precision, Intent (Out)   :: chmax (0:levdim1, 0:levdim2, 0:levdim3)
00054 !
00055 !     Maximum extension of bounding box of each coordinate cell.
00056 !
00057       Double Precision, Intent (Out)   :: midp  (0:levdim1, 0:levdim2, 0:levdim3)
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_3d_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       integer                          :: k, kbeg, kend
00076 !
00077       Double Precision                 :: r_nbr
00078 !
00079 ! !DESCRIPTION:
00080 !
00081 ! Subroutine "PSMILe_MG_First_subgrid_3d_dble" computes the
00082 ! bounding box for each control volume (cell) of the 3-dimensional grid
00083 ! defined by the corner array "array".
00084 ! The bounding boxes and mid points are used in the Multigrid search.
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_3d_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_3d_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_3d_dble'
00105 
00106       call psmile_flushstd
00107 #endif /* VERBOSE */
00108 !
00109 !  Initialization
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.0d0 / nbr_corners
00123 !
00124 !     ... Compute minimum extension of grid cell
00125 !         ??? wirklich MINVAL, MAXVAL und SUM verwenden, oder
00126 !             per hand von aussen den Werte berechnen ?
00127 !
00128          do k = kbeg, kend
00129             do j = jbeg, jend
00130 !cdir vector
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 !     ... Compute maximum extension of grid cell
00139 !
00140          do k = kbeg, kend
00141             do j = jbeg, jend
00142 !cdir vector
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 !     ... Compute mid point of grid cell
00151 !
00152          do k = kbeg, kend
00153             do j = jbeg, jend
00154 !cdir vector
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 !     ... Create dummy cells if necessary
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 !cdir vector
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 !cdir vector
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 !cdir vector
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 !===> All done
00206 !
00207 #ifdef VERBOSE
00208       print *, trim(ch_id), ': PSMILe_MG_First_subgrid_3d_dble eof', &
00209                             ': ierror =', ierror
00210 
00211       call psmile_flushstd
00212 #endif /* VERBOSE */
00213 !
00214       end subroutine PSMILe_MG_First_subgrid_3d_dble

Generated on 18 Mar 2011 for Oasis4 by  doxygen 1.6.1