Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SPLT_CopyPatchData.F90
Go to the documentation of this file.
1 ! *********************************************************************
2 ! * Rocstar Simulation Suite *
3 ! * Copyright@2015, Illinois Rocstar LLC. All rights reserved. *
4 ! * *
5 ! * Illinois Rocstar LLC *
6 ! * Champaign, IL *
7 ! * www.illinoisrocstar.com *
8 ! * sales@illinoisrocstar.com *
9 ! * *
10 ! * License: See LICENSE file in top level of distribution package or *
11 ! * http://opensource.org/licenses/NCSA *
12 ! *********************************************************************
13 ! *********************************************************************
14 ! * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
15 ! * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
16 ! * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
17 ! * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR *
18 ! * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
19 ! * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
20 ! * Arising FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
21 ! * USE OR OTHER DEALINGS WITH THE SOFTWARE. *
22 ! *********************************************************************
23 !******************************************************************************
24 !
25 ! Purpose: copy topology data associated with old patch onto a new patch
26 ! created by splitting the domain.
27 !
28 ! Description: none.
29 !
30 ! Input: regionNew = new region
31 ! patchOld = patch of old grid
32 ! l1Off = offset of the old patch in l1-direction
33 ! l2Off = offset of the old patch in l2-direction
34 ! l1Cells = max. number of cells in l1-direction
35 ! l2Cells = max. number of cells in l2-direction.
36 !
37 ! Output: regionNew%levels(1)%patch = new topology.
38 !
39 ! Notes: routine can handle periodic boundaries or interior cuts, but NOT
40 ! boundaries between regions.
41 !
42 !******************************************************************************
43 !
44 ! $Id: SPLT_CopyPatchData.F90,v 1.3 2008/12/06 08:44:51 mtcampbe Exp $
45 !
46 ! Copyright: (c) 2001 by the University of Illinois
47 !
48 !******************************************************************************
49 
50 SUBROUTINE copypatchdata( regionsNew,patchOld,splitDirection,iReg, &
51  l1off,l2off,l1cells,l2cells )
52 
53  USE moddatatypes
54  USE modbndpatch, ONLY : t_patch
55  USE moddatastruct, ONLY : t_region
56  USE modparameters
57  IMPLICIT NONE
58 
59 ! ... parameters
60  TYPE(t_region), POINTER :: regionsnew(:)
61  TYPE(t_patch), POINTER :: patchold
62 
63  INTEGER :: splitdirection, ireg, l1off, l2off, l1cells, l2cells
64 
65 ! ... loop variables
66  INTEGER :: ir
67 
68 ! ... local variables
69  INTEGER :: bctype, lbound, lboundsrc
70  INTEGER :: ibeg, jbeg, kbeg, l1offsrc, l2offsrc, l1cellssrc, l2cellssrc
71 
72  TYPE(t_patch), POINTER :: patchnew
73 
74 !******************************************************************************
75 
76  patchnew => regionsnew(ireg)%levels(1)%patches(regionsnew(ireg)%nPatches)
77 
78  patchnew%bcType = patchold%bcType
79  patchnew%lbound = patchold%lbound
80  patchnew%bcCoupled = patchold%bcCoupled
81  patchnew%l1beg = max(patchold%l1beg-l1off+1,1)
82  patchnew%l1end = min(patchold%l1end-l1off+1,l1cells)
83  patchnew%l2beg = max(patchold%l2beg-l2off+1,1)
84  patchnew%l2end = min(patchold%l2end-l2off+1,l2cells)
85 
86 ! zero out data of source patch
87 
88  patchnew%align = patchold%align
89  patchnew%srcLbound = 0
90  patchnew%srcRegion = 0
91  patchnew%srcL1beg = 0
92  patchnew%srcL1end = 0
93  patchnew%srcL2beg = 0
94  patchnew%srcL2end = 0
95 
96  bctype = patchnew%bcType
97 
98 ! source patch is periodic boundary -------------------------------------------
99 
100  IF ((bctype>=bc_tra_peri .AND. bctype<=bc_tra_peri+bc_range) .OR. &
101  (bctype>=bc_rot_peri .AND. bctype<=bc_rot_peri+bc_range)) THEN
102 
103  patchnew%srcLbound = patchold%srcLbound
104  lboundsrc = patchold%srcLbound
105 
106 ! - split between the boundaries
107 
108  IF (((lboundsrc==1 .OR. lboundsrc==2) .AND. splitdirection==1) .OR. &
109  ((lboundsrc==3 .OR. lboundsrc==4) .AND. splitdirection==2) .OR. &
110  ((lboundsrc==5 .OR. lboundsrc==6) .AND. splitdirection==3)) THEN
111  IF (lboundsrc==1 .OR. lboundsrc==3 .OR. lboundsrc==5) THEN
112  patchnew%srcRegion = 1
113  ELSE
114  patchnew%srcRegion = regionsnew(ireg)%global%nRegions
115  ENDIF
116  patchnew%srcL1beg = patchold%srcL1beg
117  patchnew%srcL1end = patchold%srcL1end
118  patchnew%srcL2beg = patchold%srcL2beg
119  patchnew%srcL2end = patchold%srcL2end
120 
121 ! - split along the boundaries
122 
123  ELSE
124  patchnew%srcRegion = ireg
125  patchnew%srcL1beg = max(patchold%srcL1beg-l1off+1,1)
126  patchnew%srcL1end = min(patchold%srcL1end-l1off+1,l1cells)
127  patchnew%srcL2beg = max(patchold%srcL2beg-l2off+1,1)
128  patchnew%srcL2end = min(patchold%srcL2end-l2off+1,l2cells)
129  ENDIF
130 
131 ! source patch is interior cut ------------------------------------------------
132 
133  ELSE IF (bctype>=bc_regionconf .AND. bctype<=bc_regionconf+bc_range) THEN
134 
135  patchnew%srcLbound = patchold%srcLbound
136  lbound = patchold%lbound
137  lboundsrc = patchold%srcLbound
138 
139 ! - source patch on the same boundary (C-grid)
140 
141  IF (lbound == lboundsrc) THEN
142 
143 ! --- boundary cannot have been splitted
144 
145  IF (((lbound==1 .OR. lbound==2) .AND. splitdirection==1) .OR. &
146  ((lbound==3 .OR. lbound==4) .AND. splitdirection==2) .OR. &
147  ((lbound==5 .OR. lbound==6) .AND. splitdirection==3)) THEN
148  patchnew%srcRegion = ireg
149  patchnew%srcL1beg = patchold%srcL1beg
150  patchnew%srcL1end = patchold%srcL1end
151  patchnew%srcL2beg = patchold%srcL2beg
152  patchnew%srcL2end = patchold%srcL2end
153 
154 ! --- boundary possibly splitted
155 
156  ELSE
157  patchnew%srcRegion = regionsnew(ireg)%global%nRegions - ireg + 1
158  IF (patchold%srcL1beg > patchold%srcL1End) THEN ! l1 reversed
159  IF (((lbound==1 .OR. lbound==2) .AND. splitdirection==3) .OR. &
160  ((lbound==3 .OR. lbound==4) .AND. splitdirection==1) .OR. &
161  ((lbound==5 .OR. lbound==6) .AND. splitdirection==2)) THEN
162  patchnew%srcRegion = ireg
163  ENDIF
164  ELSE ! l2 reversed
165  IF (((lbound==1 .OR. lbound==2) .AND. splitdirection==2) .OR. &
166  ((lbound==3 .OR. lbound==4) .AND. splitdirection==3) .OR. &
167  ((lbound==5 .OR. lbound==6) .AND. splitdirection==1)) THEN
168  patchnew%srcRegion = ireg
169  ENDIF
170  ENDIF
171  ibeg = 1
172  jbeg = 1
173  kbeg = 1
174  DO ir=1,patchnew%srcRegion-1
175  IF (splitdirection == 1) THEN
176  ibeg = ibeg + regionsnew(ir)%levels(1)%grid%ipc
177  ELSE IF (splitdirection == 2) THEN
178  jbeg = jbeg + regionsnew(ir)%levels(1)%grid%jpc
179  ELSE
180  kbeg = kbeg + regionsnew(ir)%levels(1)%grid%kpc
181  ENDIF
182  ENDDO
183  IF (lbound==1 .OR. lbound==2) THEN
184  l1offsrc = jbeg
185  l2offsrc = kbeg
186  l1cellssrc = regionsnew(patchnew%srcRegion)%levels(1)%grid%jpc
187  l2cellssrc = regionsnew(patchnew%srcRegion)%levels(1)%grid%kpc
188  ELSE IF (lbound==3 .OR. lbound==4) THEN
189  l1offsrc = kbeg
190  l2offsrc = ibeg
191  l1cellssrc = regionsnew(patchnew%srcRegion)%levels(1)%grid%kpc
192  l2cellssrc = regionsnew(patchnew%srcRegion)%levels(1)%grid%ipc
193  ELSE IF (lbound==5 .OR. lbound==6) THEN
194  l1offsrc = ibeg
195  l2offsrc = jbeg
196  l1cellssrc = regionsnew(patchnew%srcRegion)%levels(1)%grid%ipc
197  l2cellssrc = regionsnew(patchnew%srcRegion)%levels(1)%grid%jpc
198  ENDIF
199  patchnew%srcL1beg = max(patchold%srcL1beg-l1offsrc+1,1)
200  patchnew%srcL1beg = min(patchnew%srcL1beg,l1cellssrc)
201  patchnew%srcL1end = min(patchold%srcL1end-l1offsrc+1,l1cellssrc)
202  patchnew%srcL1end = max(patchnew%srcL1end,1)
203  patchnew%srcL2beg = max(patchold%srcL2beg-l2offsrc+1,1)
204  patchnew%srcL2beg = min(patchnew%srcL2beg,l2cellssrc)
205  patchnew%srcL2end = min(patchold%srcL2end-l2offsrc+1,l2cellssrc)
206  patchnew%srcL2end = max(patchnew%srcL2end,1)
207  ENDIF
208 
209 ! - source patch on different boundary (O-grid)
210 
211  ELSE
212 
213 ! --- boundary cannot have been splitted
214 
215  IF (((lbound==1 .OR. lbound==2) .AND. splitdirection==1) .OR. &
216  ((lbound==3 .OR. lbound==4) .AND. splitdirection==2) .OR. &
217  ((lbound==5 .OR. lbound==6) .AND. splitdirection==3)) THEN
218  IF (lboundsrc==1 .OR. lboundsrc==3 .OR. lboundsrc==5) THEN
219  patchnew%srcRegion = 1
220  ELSE
221  patchnew%srcRegion = regionsnew(ireg)%global%nRegions
222  ENDIF
223  patchnew%srcL1beg = patchold%srcL1beg
224  patchnew%srcL1end = patchold%srcL1end
225  patchnew%srcL2beg = patchold%srcL2beg
226  patchnew%srcL2end = patchold%srcL2end
227 
228 ! --- boundary splitted
229 
230  ELSE
231  patchnew%srcRegion = ireg
232  patchnew%srcL1beg = max(patchold%srcL1beg-l1off+1,1)
233  patchnew%srcL1end = min(patchold%srcL1end-l1off+1,l1cells)
234  patchnew%srcL2beg = max(patchold%srcL2beg-l2off+1,1)
235  patchnew%srcL2end = min(patchold%srcL2end-l2off+1,l2cells)
236  ENDIF
237 
238  ENDIF ! lbound == lboundSrc
239 
240  ENDIF ! bcType
241 
242 END SUBROUTINE copypatchdata
243 
244 !******************************************************************************
245 !
246 ! RCS Revision history:
247 !
248 ! $Log: SPLT_CopyPatchData.F90,v $
249 ! Revision 1.3 2008/12/06 08:44:51 mtcampbe
250 ! Updated license.
251 !
252 ! Revision 1.2 2008/11/19 22:18:01 mtcampbe
253 ! Added Illinois Open Source License/Copyright
254 !
255 ! Revision 1.1 2004/12/03 02:41:15 wasistho
256 ! added prefix
257 !
258 ! Revision 1.1 2004/12/03 00:45:30 wasistho
259 ! lower to upper case
260 !
261 ! Revision 1.4 2003/05/15 02:57:07 jblazek
262 ! Inlined index function.
263 !
264 ! Revision 1.3 2002/09/27 00:57:11 jblazek
265 ! Changed makefiles - no makelinks needed.
266 !
267 ! Revision 1.2 2002/09/05 17:40:22 jblazek
268 ! Variable global moved into regions().
269 !
270 ! Revision 1.1 2002/07/12 21:50:07 jblazek
271 ! Added tool to split single grid into multiple regions.
272 !
273 !******************************************************************************
274 
275 
276 
277 
278 
279 
**********************************************************************Rocstar Simulation Suite Illinois Rocstar LLC All rights reserved ****Illinois Rocstar LLC IL **www illinoisrocstar com **sales illinoisrocstar com WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **Arising OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE **********************************************************************INTERFACE SUBROUTINE ibeg
Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:354
Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
Definition: Vector_n.h:346
**********************************************************************Rocstar Simulation Suite Illinois Rocstar LLC All rights reserved ****Illinois Rocstar LLC IL **www illinoisrocstar com **sales illinoisrocstar com WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **Arising OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE **********************************************************************INTERFACE SUBROUTINE knode jbeg
subroutine copypatchdata(regionsNew, patchOld, splitDirection, iReg, l1Off, l2Off, l1Cells, l2Cells)
**********************************************************************Rocstar Simulation Suite Illinois Rocstar LLC All rights reserved ****Illinois Rocstar LLC IL **www illinoisrocstar com **sales illinoisrocstar com WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **Arising OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE **********************************************************************INTERFACE SUBROUTINE knode kbeg