Scrambler
1
|
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