Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RFLO_ModGridMetrics.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: Suite for grid metrics related routines.
26 !
27 ! Description: None.
28 !
29 ! Notes: None.
30 !
31 ! ******************************************************************************
32 !
33 ! $Id: RFLO_ModGridMetrics.F90,v 1.7 2008/12/06 08:44:16 mtcampbe Exp $
34 !
35 ! Copyright: (c) 2004 by the University of Illinois
36 !
37 ! ******************************************************************************
38 
40 
41  USE modglobal, ONLY : t_global
42  USE moddatastruct, ONLY: t_region
43  USE modgrid, ONLY : t_grid
44  USE modbndpatch, ONLY : t_patch
45  USE modparameters
46  USE moddatatypes
47  USE moderror
48  USE modmpi
49 
50  IMPLICIT NONE
51 
52  PRIVATE
53  PUBLIC :: rflo_arclengthpatch, &
56 
57 ! private :
58 
59 ! ******************************************************************************
60 ! Declarations and definitions
61 ! ******************************************************************************
62 
63  CHARACTER(CHRLEN) :: RCSIdentString = &
64  '$RCSfile: RFLO_ModGridMetrics.F90,v $ $Revision: 1.7 $'
65 
66 ! ******************************************************************************
67 ! Routines
68 ! ******************************************************************************
69 
70  CONTAINS
71 
72 
73 !******************************************************************************
74 !
75 ! Purpose: calculate approximate arclengths for every grid line
76 ! between two oposite patch boundaries (on the finest
77 ! grid only).
78 !
79 ! Description: none.
80 !
81 ! Input: region = grid dimensions
82 ! patch = current patch
83 ! xyzRef = reference coordinates.
84 !
85 ! Output: arcLen1 = arclength in first coordinate direction of patch
86 ! arcLen2 = arclength in second coordinate direction of patch
87 !
88 ! Notes: none.
89 !
90 !******************************************************************************
91 
92 SUBROUTINE rflo_arclengthpatch( region,patch,xyzRef )
93 
95 
96  IMPLICIT NONE
97 
98 #include "Indexing.h"
99 
100 ! ... parameters
101 
102  TYPE(t_region) :: region
103  TYPE(t_patch), POINTER :: patch
104  REAL(RFREAL), POINTER :: xyzref(:,:)
105 
106 ! ... loop variables
107  INTEGER :: l1, l2
108 
109 ! ... local variables
110  INTEGER :: ilev, lbound, ibeg, iend, jbeg, jend, kbeg, kend
111  INTEGER :: l1b, l1e, l2b, l2e, lc, ijkn, ijkn1, ijkn2, inoff, ijnoff
112  INTEGER :: k1, k2, switch(6,5)
113 
114  REAL(RFREAL), POINTER :: arclen1(:), arclen2(:)
115 
116 !******************************************************************************
117 
118  CALL registerfunction( region%global,'RFLO_ArcLengthPatch',&
119  'RFLO_ModGridMetrics.F90' )
120 
121 ! get dimensions and pointers -------------------------------------------------
122 
123  lbound = patch%lbound
124  ilev = 1
125 
126  CALL rflo_getnodeoffset( region,ilev,inoff,ijnoff )
127  CALL rflo_getpatchindicesnodes( region,patch,ilev, &
128  ibeg,iend,jbeg,jend,kbeg,kend )
129 
130  arclen1 => patch%arclen1
131  arclen2 => patch%arclen2
132 
133 ! set boundary switch ---------------------------------------------------------
134 ! switch(:,1-2) = first/last index in l1-direction
135 ! switch(:,3-4) = first/last index in l2-direction
136 ! switch(:, 5) = constant index
137 
138  switch(1,:) = (/jbeg, jend, kbeg, kend, ibeg/)
139  switch(2,:) = (/jbeg, jend, kbeg, kend, iend/)
140  switch(3,:) = (/kbeg, kend, ibeg, iend, jbeg/)
141  switch(4,:) = (/kbeg, kend, ibeg, iend, jend/)
142  switch(5,:) = (/ibeg, iend, jbeg, jend, kbeg/)
143  switch(6,:) = (/ibeg, iend, jbeg, jend, kend/)
144 
145  l1b = switch(lbound,1)
146  l1e = switch(lbound,2)
147  l2b = switch(lbound,3)
148  l2e = switch(lbound,4)
149  lc = switch(lbound,5)
150 
151 ! compute arclengths of current patch ------------------------------------------
152 
153  arclen1(:) = 0._rfreal
154  arclen2(:) = 0._rfreal
155 
156  DO l2=l2b+1,l2e
157  k2 = l2-l2b+1
158  DO l1=l1b+1,l1e
159  k1 = l1-l1b+1
160  IF (lbound==1 .OR. lbound==2) THEN
161  ijkn = indijk(lc,l1 ,l2 ,inoff,ijnoff)
162  ijkn1 = indijk(lc,l1-1 ,l2 ,inoff,ijnoff)
163  ijkn2 = indijk(lc,l1 ,l2-1 ,inoff,ijnoff)
164  ELSEIF (lbound==3 .OR. lbound==4) THEN
165  ijkn = indijk(l2 ,lc,l1 ,inoff,ijnoff)
166  ijkn1 = indijk(l2 ,lc,l1-1 ,inoff,ijnoff)
167  ijkn2 = indijk(l2-1 ,lc,l1 ,inoff,ijnoff)
168  ELSEIF (lbound==5 .OR. lbound==6) THEN
169  ijkn = indijk(l1 ,l2 ,lc,inoff,ijnoff)
170  ijkn1 = indijk(l1-1 ,l2 ,lc,inoff,ijnoff)
171  ijkn2 = indijk(l1 ,l2-1 ,lc,inoff,ijnoff)
172  ENDIF
173  arclen1(k2) = arclen1(k2) + &
174  sqrt((xyzref(xcoord,ijkn)-xyzref(xcoord,ijkn1))**2 + &
175  (xyzref(ycoord,ijkn)-xyzref(ycoord,ijkn1))**2 + &
176  (xyzref(zcoord,ijkn)-xyzref(zcoord,ijkn1))**2)
177  arclen2(k1) = arclen2(k1) + &
178  sqrt((xyzref(xcoord,ijkn)-xyzref(xcoord,ijkn2))**2 + &
179  (xyzref(ycoord,ijkn)-xyzref(ycoord,ijkn2))**2 + &
180  (xyzref(zcoord,ijkn)-xyzref(zcoord,ijkn2))**2)
181  ENDDO ! l1
182  ENDDO ! l2
183 
184  DO l2=l2b,l2b
185  DO l1=l1b+1,l1e
186  IF (lbound==1 .OR. lbound==2) THEN
187  ijkn = indijk(lc,l1 ,l2 ,inoff,ijnoff)
188  ijkn1 = indijk(lc,l1-1 ,l2 ,inoff,ijnoff)
189  ELSEIF (lbound==3 .OR. lbound==4) THEN
190  ijkn = indijk(l2 ,lc,l1 ,inoff,ijnoff)
191  ijkn1 = indijk(l2 ,lc,l1-1 ,inoff,ijnoff)
192  ELSEIF (lbound==5 .OR. lbound==6) THEN
193  ijkn = indijk(l1 ,l2 ,lc,inoff,ijnoff)
194  ijkn1 = indijk(l1-1 ,l2 ,lc,inoff,ijnoff)
195  ENDIF
196  arclen1(1) = arclen1(1) + &
197  sqrt((xyzref(xcoord,ijkn)-xyzref(xcoord,ijkn1))**2 + &
198  (xyzref(ycoord,ijkn)-xyzref(ycoord,ijkn1))**2 + &
199  (xyzref(zcoord,ijkn)-xyzref(zcoord,ijkn1))**2)
200  ENDDO ! l1
201  ENDDO ! l2
202 
203  DO l1=l1b,l1b
204  DO l2=l2b+1,l2e
205  IF (lbound==1 .OR. lbound==2) THEN
206  ijkn = indijk(lc,l1 ,l2 ,inoff,ijnoff)
207  ijkn2 = indijk(lc,l1 ,l2-1 ,inoff,ijnoff)
208  ELSEIF (lbound==3 .OR. lbound==4) THEN
209  ijkn = indijk(l2 ,lc,l1 ,inoff,ijnoff)
210  ijkn2 = indijk(l2-1 ,lc,l1 ,inoff,ijnoff)
211  ELSEIF (lbound==5 .OR. lbound==6) THEN
212  ijkn = indijk(l1 ,l2 ,lc,inoff,ijnoff)
213  ijkn2 = indijk(l1 ,l2-1 ,lc,inoff,ijnoff)
214  ENDIF
215  arclen2(1) = arclen2(1) + &
216  sqrt((xyzref(xcoord,ijkn)-xyzref(xcoord,ijkn2))**2 + &
217  (xyzref(ycoord,ijkn)-xyzref(ycoord,ijkn2))**2 + &
218  (xyzref(zcoord,ijkn)-xyzref(zcoord,ijkn2))**2)
219  ENDDO ! l2
220  ENDDO ! l1
221 
222 ! finalize --------------------------------------------------------------------
223 
224  CALL deregisterfunction( region%global )
225 
226 END SUBROUTINE rflo_arclengthpatch
227 
228 
229 !******************************************************************************
230 !
231 ! Purpose: calculate face vectors, volumes, cell centroids (optionally),
232 ! and cell-to-face averaging coefficients
233 !
234 ! Description: none.
235 !
236 ! Input: regions%grid = dimensions, grid coordinates.
237 !
238 ! Output: regions%grid = face vectors (si,sj,sk), volumes (vol),
239 ! cell centroids (cofg), avg coeffs. (avgCoI,J,K).
240 !
241 ! Notes: none.
242 !
243 !******************************************************************************
244 
245 SUBROUTINE rflo_calcgridmetrics( regions )
246 
251  IMPLICIT NONE
252 
253 ! ... parameters
254  TYPE (t_region), POINTER :: regions(:)
255 
256 ! ... loop variables
257  INTEGER :: ireg
258 
259 ! ... local variables
260  REAL(RFREAL) :: skewmin
261  TYPE (t_global), POINTER :: global
262 
263 !******************************************************************************
264 
265  global => regions(1)%global
266  CALL registerfunction( global,'RFLO_CalcGridMetrics',&
267  'RFLO_ModGridMetrics.F90' )
268 
269 ! initialization some parameters ----------------------------------------------
270 
271  global%skewness = 1._rfreal
272 
273 ! loop over all regions -------------------------------------------------------
274 
275  DO ireg=1,regions(1)%global%nRegions
276  IF (regions(ireg)%procid==regions(ireg)%global%myProcid & ! reg active and
277  .AND. regions(ireg)%active==active) THEN ! on my processor
278 
279  CALL rflo_calcfacevectors( regions(ireg) )
280 
281  CALL rflo_calccontrolvolumes( regions(ireg) )
282 
283  CALL rflo_calccellcentroids( regions(ireg) )
284 
285  CALL rflo_calcfacecentroids( regions(ireg) )
286 
287  CALL rflo_initavgcoeffs( regions(ireg) )
288 
289  IF (regions(ireg)%mixtInput%faceEdgeAvg==fe_avg_linear) &
290  CALL rflo_c2favgcoeffs( regions(ireg) )
291 
292  CALL rflo_c2eavgcoeffs( regions(ireg) )
293 
294 ! --- check metrics
295 
296  CALL rflo_checkmetrics( ireg,regions(ireg) )
297 
298  ENDIF ! region on this processor and active
299  ENDDO ! iReg
300 
301 ! global grid quality measure -------------------------------------------------
302 
303  CALL rflo_gridqualityglobal( regions )
304 
305 ! finalize --------------------------------------------------------------------
306 
307  CALL deregisterfunction( global )
308 
309 END SUBROUTINE rflo_calcgridmetrics
310 
311 
312 !******************************************************************************
313 !
314 ! Purpose: global reduction of grid quality measures
315 !
316 ! Description: none.
317 !
318 ! Input: regions%grid, regions%global = grid quality data
319 !
320 ! Output: global%skewness, etc = global skewness, etc
321 !
322 ! Notes: none.
323 !
324 !******************************************************************************
325 
326 SUBROUTINE rflo_gridqualityglobal( regions )
327 
328  IMPLICIT NONE
329 
330 ! ... parameters
331  TYPE (t_region), POINTER :: regions(:)
332 
333 ! ... loop variables
334  INTEGER :: ireg
335 
336 ! ... local variables
337  REAL(RFREAL) :: skewmin, volmin
338  TYPE (t_global), POINTER :: global
339 
340 !******************************************************************************
341 
342  global => regions(1)%global
343  CALL registerfunction( global,'RFLO_GridQualityGlobal',&
344  'RFLO_ModGridMetrics.F90' )
345 
346 ! global skewness and minVol --------------------------------------------------
347 
348  skewmin = global%skewness
349  volmin = global%minVol
350 
351  DO ireg=1,global%nRegions
352  IF (regions(ireg)%procid==global%myProcid .AND. & ! region active and
353  regions(ireg)%active==active) THEN ! on my processor
354  skewmin = min( skewmin,regions(ireg)%levels(1)%grid%skewness )
355  volmin = min( volmin, regions(ireg)%levels(1)%grid%minVol )
356  ENDIF ! active
357  ENDDO ! iReg
358 
359  global%skewness = skewmin
360  global%minVol = volmin
361 
362 #ifdef MPI
363  CALL mpi_allreduce( global%skewness,skewmin,1,mpi_rfreal,mpi_min, &
364  global%mpiComm,global%mpierr )
365  IF (global%mpierr /=0 ) CALL errorstop( global,err_mpi_trouble,&
366  __line__ )
367  global%skewness = skewmin
368 
369  CALL mpi_allreduce( global%minVol,volmin,1,mpi_rfreal,mpi_min, &
370  global%mpiComm,global%mpierr )
371  IF (global%mpierr /=0 ) CALL errorstop( global,err_mpi_trouble,&
372  __line__ )
373  global%minVol = volmin
374 #endif
375 
376 ! finalize --------------------------------------------------------------------
377 
378  CALL deregisterfunction( global )
379 
380 END SUBROUTINE rflo_gridqualityglobal
381 
382 
383 ! ******************************************************************************
384 ! End
385 ! ******************************************************************************
386 
387 END MODULE rflo_modgridmetrics
388 
389 
390 ! ******************************************************************************
391 !
392 ! RCS Revision history:
393 !
394 ! $Log: RFLO_ModGridMetrics.F90,v $
395 ! Revision 1.7 2008/12/06 08:44:16 mtcampbe
396 ! Updated license.
397 !
398 ! Revision 1.6 2008/11/19 22:17:27 mtcampbe
399 ! Added Illinois Open Source License/Copyright
400 !
401 ! Revision 1.5 2006/03/24 00:53:51 wasistho
402 ! fixed loop indexing in patch%arclen1,2
403 !
404 ! Revision 1.4 2006/03/18 11:01:23 wasistho
405 ! moved some routines to ModGridRegionShape
406 !
407 ! Revision 1.3 2006/03/18 08:17:01 wasistho
408 ! added arcLengthPatch
409 !
410 ! Revision 1.2 2006/03/15 06:37:46 wasistho
411 ! added region and global skewness
412 !
413 ! Revision 1.1 2006/03/04 04:36:41 wasistho
414 ! initial import RFLO_ModGridMetrics
415 !
416 !
417 !
418 ! ******************************************************************************
419 
420 
421 
422 
423 
424 
425 
426 
427 
**********************************************************************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
subroutine rflo_calccellcentroids(region)
subroutine rflo_c2eavgcoeffs(region)
subroutine registerfunction(global, funName, fileName)
Definition: ModError.F90:449
subroutine rflo_c2favgcoeffs(region)
double sqrt(double d)
Definition: double.h:73
subroutine, public rflo_gridqualityglobal(regions)
subroutine rflo_calccontrolvolumes(region)
subroutine rflo_getnodeoffset(region, iLev, iNodeOffset, ijNodeOffset)
Definition: patch.h:74
**********************************************************************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 iend
subroutine rflo_calcfacevectors(region)
subroutine rflo_getpatchindicesnodes(region, patch, iLev, ibeg, iend, jbeg, jend, kbeg, kend)
subroutine rflo_initavgcoeffs(region)
subroutine, public rflo_arclengthpatch(region, patch, xyzRef)
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 jend
subroutine errorstop(global, errorCode, errorLine, addMessage)
Definition: ModError.F90:483
**********************************************************************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, public rflo_calcgridmetrics(regions)
**********************************************************************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
subroutine deregisterfunction(global)
Definition: ModError.F90:469
subroutine rflo_checkmetrics(iReg, region)
subroutine rflo_calcfacecentroids(region)