Scrambler  1
stencil_declarations.f90
Go to the documentation of this file.
00001 !#########################################################################
00002 !               
00003 !    Copyright (C) 2003-2012 Department of Physics and Astronomy,
00004 !                            University of Rochester,
00005 !                            Rochester, NY
00006 !
00007 !    stencil_declarations.f90 is part of AstroBEAR.
00008 !
00009 !    AstroBEAR is free software: you can redistribute it and/or modify    
00010 !    it under the terms of the GNU General Public License as published by 
00011 !    the Free Software Foundation, either version 3 of the License, or    
00012 !    (at your option) any later version.
00013 !
00014 !    AstroBEAR is distributed in the hope that it will be useful, 
00015 !    but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 !    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 !    GNU General Public License for more details.
00018 !
00019 !    You should have received a copy of the GNU General Public License
00020 !    along with AstroBEAR.  If not, see <http://www.gnu.org/licenses/>.
00021 !
00022 !#########################################################################
00023 MODULE StencilDeclarations
00024 USE GlobalDeclarations
00025 IMPLICIT NONE
00026    
00027 SAVE
00029    TYPE :: StencilDef
00030       INTEGER :: x(-10:10)
00031       INTEGER, DIMENSION(3,2) :: range=RESHAPE( (/100,100,100,-100,-100,-100/), (/ 3,2 /) )
00032       INTEGER :: lead=-100
00033       INTEGER :: trail=100
00034       INTEGER :: lag
00035       INTEGER :: rank=-1
00036       INTEGER :: NrVars(2)=0
00037       LOGICAL :: needed=.false.
00038       CHARACTER(LEN=16) :: description
00039       LOGICAL :: clear=.false.
00040    END TYPE StencilDef
00041 
00042 
00043    TYPE :: StencilBufferDef
00044       INTEGER, DIMENSION(3,2) :: range
00045       INTEGER :: start
00046       INTEGER :: finish
00047       REAL(KIND=qPREC), DIMENSION(:,:,:,:,:), POINTER :: data => NULL()
00048       INTEGER :: x(-10:10)
00049    END type StencilBufferDef
00050 
00051   TYPE BufferDataDef
00052      TYPE(StencilBufferDef), DIMENSION(:), POINTER :: StencilBuffer
00053   END TYPE BufferDataDef
00054 
00055   TYPE(BufferDataDef), DIMENSION(:), ALLOCATABLE :: LevelBuffers
00056   TYPE(BufferDataDef), POINTER :: ActiveBuffer
00057 
00058 
00063 
00064 
00066    TYPE dependency
00067       INTEGER :: p1, p2
00068       INTEGER :: range(3,2)
00069    END TYPE dependency
00070 
00072    TYPE grouping
00073       INTEGER :: p1, p2
00074    END TYPE grouping
00075 
00077    TYPE adjustment
00078       INTEGER :: p1
00079       INTEGER :: range(3,2)
00080    END TYPE adjustment
00081 
00083    TYPE codependency
00084       INTEGER :: p1, p2
00085       INTEGER :: range(3,2)
00086    END TYPE codependency
00087 
00088 
00089    INTEGER, PARAMETER :: nStencilsMax=200
00090    TYPE(StencilDef), DIMENSION(nStencilsMax), Target :: Stencil
00091    INTEGER :: nStencils=0
00092    
00093    INTEGER :: slist(nStencilsMax)
00094    INTEGER :: MaxLead, MaxTrail
00095    TYPE(dependency) :: dependencies(300)
00096    TYPE(adjustment) :: adjustments(50)
00097    TYPE(grouping) :: groupings(10)
00098    TYPE(codependency) :: codependencies(10)
00099    
00100    INTEGER :: di=0
00101    INTEGER :: gi=0
00102    INTEGER :: ci=0
00103 
00104 
00105   INTEGER, PARAMETER, DIMENSION(6) :: center_r=(/0,0,0,0,0,0/), center_l=(/-1,-1,0,0,0,0/), center_u=(/0,0,0,0,0,0/), 
00106        center_d=(/0,0,-1,-1,0,0/), center_b=(/0,0,0,0,-1,-1/), center_f=(/0,0,0,0,0,0/), 
00107        same=(/0,0,0,0,0,0/), exact=(/1000,1000,1000,1000,1000,1000/)
00108 
00109 
00110 CONTAINS
00111 
00114 FUNCTION square(a)
00115   INTEGER, DIMENSION(:) :: a
00116   INTEGER, DIMENSION(3,2) :: square
00117   square=reshape(a,(/3,2/),(/0/), (/2,1/))
00118 END FUNCTION square
00119 
00122 FUNCTION cube(a)
00123   INTEGER :: a, cube(6)
00124   cube=(/-a,a,-a,a,-a,a/)
00125 END FUNCTION cube
00126 
00127 
00131 SUBROUTINE set_group(a,b)
00132    INTEGER :: a,b
00133    gi=gi+1
00134    IF (a == 0) THEN      
00135       nStencils=nStencils+1
00136       a=nStencils
00137    END IF
00138    IF (b == 0) THEN
00139       nStencils=nStencils+1
00140       b=nStencils
00141    END IF
00142    groupings(gi)%p1=a
00143    groupings(gi)%p2=b
00144 END SUBROUTINE set_group
00145 
00150 SUBROUTINE set_dependency(a, b, range)
00151    INTEGER :: a,b
00152    INTEGER, DIMENSION(6) :: range
00153    di=di+1
00154    IF (a == 0) THEN
00155       nStencils=nStencils+1
00156       a=nStencils
00157    END IF
00158    IF (b == 0) THEN
00159       nStencils=nStencils+1
00160       b=nStencils
00161    END IF
00162    dependencies(di)%p1=a
00163    dependencies(di)%p2=b
00164    dependencies(di)%range=square(range)
00165 END SUBROUTINE set_dependency
00166 
00171 SUBROUTINE set_codependency(a,b,range)
00172    INTEGER :: a, b
00173    INTEGER, DIMENSION(3) :: range
00174    ci=ci+1
00175    IF (a == 0) THEN 
00176       nStencils=nStencils+1
00177       a=nStencils
00178    END IF
00179    IF (b == 0) THEN
00180       nStencils=nStencils+1
00181       b=nStencils
00182    END IF
00183    codependencies(ci)%p1=a
00184    codependencies(ci)%p2=b
00185    codependencies(ci)%range=SPREAD(range, 2, 2)
00186 END SUBROUTINE set_codependency
00187 
00192 SUBROUTINE ExpandIfNeeded(range1, range2, offsets)
00193   INTEGER, DIMENSION(3,2) :: range1, range2, offsets
00194   INTEGER :: i
00195   DO i=1,3
00196      range2(i,1)=min(range2(i,1), range1(i,1)+offsets(i,1))
00197      range2(i,2)=max(range2(i,2), range1(i,2)+offsets(i,2))
00198   END DO
00199 
00200 END SUBROUTINE ExpandIfNeeded
00201 
00206 SUBROUTINE shrink(range1, range2, offsets)
00207   INTEGER, DIMENSION(3,2) :: range1, range2, offsets
00208   INTEGER :: i
00209   DO i=1,3
00210      range2(i,1)=max(range2(i,1), range1(i,1)+offsets(i,1))
00211      range2(i,2)=min(range2(i,2), range1(i,2)+offsets(i,2))
00212   END DO
00213 
00214 END SUBROUTINE shrink
00215 
00216 
00217 
00222 function expand(dim, x, range)
00223   integer, dimension(3,2), INTENT(IN) :: range
00224   integer, dimension(3,2)  :: expand
00225   integer,INTENT(IN)  :: dim, x
00226   expand=range
00227   expand(dim,1)=expand(dim,1)-x
00228   expand(dim,2)=expand(dim,2)+x
00229 end function expand
00230 
00235 function expand_left(dim, x, range)
00236   integer, dimension(4,2), INTENT(IN) :: range
00237   integer, dimension(4,2)  :: expand_left
00238   integer,INTENT(IN)  :: dim, x
00239   expand_left=range
00240   expand_left(dim,1)=expand_left(dim,1)-x
00241 end function expand_left
00242 
00247 function expand_right(dim, x, range)
00248   integer, dimension(3,2), INTENT(IN) :: range
00249   integer, dimension(3,2)  :: expand_right
00250   integer,INTENT(IN)  :: dim, x
00251   expand_right=range
00252   expand_right(dim,2)=expand_right(dim,2)+x
00253 end function expand_right
00254 
00255 
00256 
00261 function expandaux(dim, x, range)
00262   integer, dimension(3,2), INTENT(IN) :: range
00263   integer, dimension(3,2)  :: expandaux
00264   integer,INTENT(IN)  :: dim, x
00265   expandaux=range
00266   expandaux(dim,1)=expandaux(dim,1)-x
00267   expandaux(dim,2)=expandaux(dim,2)+x+1
00268 end function expandaux
00269 
00274 function expandauxinv(dim, x, range)
00275   integer, dimension(3,2), INTENT(IN) :: range
00276   integer, INTENT(IN) :: x, dim
00277   integer, dimension(3,2) :: expandauxinv
00278   expandauxinv=range
00279   expandauxinv(dim,1)=expandauxinv(dim,1)-x
00280   expandauxinv(dim,2)=expandauxinv(dim,2)+x-1
00281 end function expandauxinv
00282 
00283 
00284 
00285 END MODULE StencilDeclarations
 All Classes Files Functions Variables