65 CHARACTER(CHRLEN) :: RCSIdentString = &
66 '$RCSfile: RFLU_ModLimiters.F90,v $ $Revision: 1.5 $'
102 iendgrad,var,grad,lim)
114 INTEGER :: ibeggrad,ibegvar,iendgrad,iendvar
115 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: lim,var
116 REAL(RFREAL),
DIMENSION(:,:,:),
POINTER :: grad
117 TYPE(t_region
),
POINTER :: pregion
123 INTEGER :: c1,c2,errorflag,icg,ifg,igrad,ivar
124 REAL(RFREAL) :: dx1,dx2,dy1,dy2,dz1,dz2,d1max1,d1max2,d1min1,d1min2,d21, &
125 d22,
term,var1,var2,xc,yc,zc
126 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: varmax,varmin
128 TYPE(t_grid),
POINTER :: pgrid
134 global => pregion%global
137 'RFLU_ModLimiters.F90' )
139 IF ( (iendvar - ibegvar) /= (iendgrad - ibeggrad) )
THEN
140 CALL
errorstop(global,err_grad_mismatch,__line__)
147 pgrid => pregion%grid
153 ALLOCATE(varmin(ibegvar:iendvar,pgrid%nCellsTot),stat=errorflag)
154 global%error = errorflag
155 IF ( global%error /= err_none )
THEN
156 CALL
errorstop(global,err_allocate,__line__,
'varMin')
159 ALLOCATE(varmax(ibegvar:iendvar,pgrid%nCellsTot),stat=errorflag)
160 global%error = errorflag
161 IF ( global%error /= err_none )
THEN
162 CALL
errorstop(global,err_allocate,__line__,
'varMax')
169 DO icg = 1,pgrid%nCellsTot
170 DO ivar = ibegvar,iendvar
171 varmax(ivar,icg) = var(ivar,icg)
172 varmin(ivar,icg) = var(ivar,icg)
175 DO igrad = ibeggrad,iendgrad
176 lim(igrad,icg) = 1.0_rfreal
184 DO ifg = 1,pgrid%nFaces
185 c1 = pgrid%f2c(1,ifg)
186 c2 = pgrid%f2c(2,ifg)
188 DO ivar = ibegvar,iendvar
192 varmin(ivar,c1) =
min(varmin(ivar,c1),var2)
193 varmin(ivar,c2) =
min(varmin(ivar,c2),var1)
194 varmax(ivar,c1) =
max(varmax(ivar,c1),var2)
195 varmax(ivar,c2) =
max(varmax(ivar,c2),var1)
203 DO ifg = 1,pgrid%nFaces
204 c1 = pgrid%f2c(1,ifg)
205 c2 = pgrid%f2c(2,ifg)
207 xc = pgrid%fc(xcoord,ifg)
208 yc = pgrid%fc(ycoord,ifg)
209 zc = pgrid%fc(zcoord,ifg)
211 dx1 = pgrid%cofg(xcoord,c1) - xc
212 dy1 = pgrid%cofg(ycoord,c1) - yc
213 dz1 = pgrid%cofg(zcoord,c1) - zc
215 dx2 = pgrid%cofg(xcoord,c2) - xc
216 dy2 = pgrid%cofg(ycoord,c2) - yc
217 dz2 = pgrid%cofg(zcoord,c2) - zc
221 DO ivar = ibegvar,iendvar
225 d1min1 = varmin(ivar,c1) - var1
226 d1max1 = varmax(ivar,c1) - var1
227 d1min2 = varmin(ivar,c2) - var2
228 d1max2 = varmax(ivar,c2) - var2
230 d21 = grad(xcoord,igrad,c1)*dx1 &
231 + grad(ycoord,igrad,c1)*dy1 &
232 + grad(zcoord,igrad,c1)*dz1
233 d22 = grad(xcoord,igrad,c2)*dx2 &
234 + grad(ycoord,igrad,c2)*dy2 &
235 + grad(zcoord,igrad,c2)*dz2
237 IF ( d21 > 0.0_rfreal )
THEN
238 term =
min(1.0_rfreal,d1max1/d21)
239 lim(igrad,c1) =
min(
term,lim(igrad,c1))
240 ELSEIF ( d21 < 0.0_rfreal )
THEN
241 term =
min(1.0_rfreal,d1min1/d21)
242 lim(igrad,c1) =
min(
term,lim(igrad,c1))
245 IF ( d22 > 0.0_rfreal )
THEN
246 term =
min(1.0_rfreal,d1max2/d22)
247 lim(igrad,c2) =
min(
term,lim(igrad,c2))
248 ELSEIF ( d22 < 0.0_rfreal )
THEN
249 term =
min(1.0_rfreal,d1min2/d22)
250 lim(igrad,c2) =
min(
term,lim(igrad,c2))
261 DEALLOCATE(varmin,stat=errorflag)
262 global%error = errorflag
263 IF ( global%error /= err_none )
THEN
264 CALL
errorstop(global,err_deallocate,__line__,
'varMin')
267 DEALLOCATE(varmax,stat=errorflag)
268 global%error = errorflag
269 IF ( global%error /= err_none )
THEN
270 CALL
errorstop(global,err_deallocate,__line__,
'varMax')
311 iendgrad,var,grad,lim)
323 INTEGER :: ibeggrad,ibegvar,iendgrad,iendvar
324 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: lim,var
325 REAL(RFREAL),
DIMENSION(:,:,:),
POINTER :: grad
326 TYPE(t_region
),
POINTER :: pregion
332 INTEGER :: c1,c2,errorflag,icg,ifg,igrad,ivar
333 REAL(RFREAL),
PARAMETER :: thrd = 1.0_rfreal/3.0_rfreal
334 REAL(RFREAL),
PARAMETER :: tiny = 1.0e-12_rfreal
335 REAL(RFREAL) ::
denom,ds1,ds2,dx1,dx2,dy1,dy2,dz1,dz2,d1max1,d1max2,d1min1, &
336 d1min2,d21,d22,epsq1,epsq2,numer,
term,var1,var2,venkatlimk, &
338 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: varmax,varmin
340 TYPE(t_grid),
POINTER :: pgrid
346 global => pregion%global
349 'RFLU_ModLimiters.F90' )
355 pgrid => pregion%grid
358 venkatlimk = 1.0_rfreal
365 ALLOCATE(varmin(ibegvar:iendvar,pgrid%nCellsTot),stat=errorflag)
366 global%error = errorflag
367 IF ( global%error /= err_none )
THEN
368 CALL
errorstop(global,err_allocate,__line__,
'varMin')
371 ALLOCATE(varmax(ibegvar:iendvar,pgrid%nCellsTot),stat=errorflag)
372 global%error = errorflag
373 IF ( global%error /= err_none )
THEN
374 CALL
errorstop(global,err_allocate,__line__,
'varMax')
381 DO icg = 1,pgrid%nCellsTot
382 DO ivar = ibegvar,iendvar
383 varmax(ivar,icg) = var(ivar,icg)
384 varmin(ivar,icg) = var(ivar,icg)
387 DO igrad = ibeggrad,iendgrad
388 lim(igrad,icg) = 1.0_rfreal
396 DO ifg = 1,pgrid%nFaces
397 c1 = pgrid%f2c(1,ifg)
398 c2 = pgrid%f2c(2,ifg)
400 DO ivar = ibegvar,iendvar
404 varmin(ivar,c1) =
min(varmin(ivar,c1),var2)
405 varmin(ivar,c2) =
min(varmin(ivar,c2),var1)
406 varmax(ivar,c1) =
max(varmax(ivar,c1),var2)
407 varmax(ivar,c2) =
max(varmax(ivar,c2),var1)
415 DO ifg = 1,pgrid%nFaces
416 c1 = pgrid%f2c(1,ifg)
417 c2 = pgrid%f2c(2,ifg)
419 xc = pgrid%fc(xcoord,ifg)
420 yc = pgrid%fc(ycoord,ifg)
421 zc = pgrid%fc(zcoord,ifg)
423 dx1 = pgrid%cofg(xcoord,c1) - xc
424 dy1 = pgrid%cofg(ycoord,c1) - yc
425 dz1 = pgrid%cofg(zcoord,c1) - zc
427 dx2 = pgrid%cofg(xcoord,c2) - xc
428 dy2 = pgrid%cofg(ycoord,c2) - yc
429 dz2 = pgrid%cofg(zcoord,c2) - zc
431 ds1 = pgrid%vol(c1)**thrd
432 ds2 = pgrid%vol(c2)**thrd
433 epsq1 = (venkatlimk*ds1)*(venkatlimk*ds1)*(venkatlimk*ds1)
434 epsq2 = (venkatlimk*ds2)*(venkatlimk*ds2)*(venkatlimk*ds2)
438 DO ivar = ibegvar,iendvar
442 d1min1 = varmin(ivar,c1) - var1
443 d1max1 = varmax(ivar,c1) - var1
444 d1min2 = varmin(ivar,c2) - var2
445 d1max2 = varmax(ivar,c2) - var2
447 d21 = grad(xcoord,igrad,c1)*dx1 &
448 + grad(ycoord,igrad,c1)*dy1 &
449 + grad(zcoord,igrad,c1)*dz1
450 d22 = grad(xcoord,igrad,c2)*dx2 &
451 + grad(ycoord,igrad,c2)*dy2 &
452 + grad(zcoord,igrad,c2)*dz2
454 IF ( d21 > 0.0_rfreal )
THEN
455 numer = (d1max1*d1max1+epsq1)*d21 + 2*d21*d21*d1max1
456 denom = d21*(d1max1*d1max1 + 2*d21*d21 + d1max1*d21 + epsq1)
458 lim(igrad,c1) =
min(
term,lim(igrad,c1))
459 ELSEIF ( d21 < 0.0_rfreal )
THEN
460 numer = (d1min1*d1min1+epsq1)*d21 + 2*d21*d21*d1min1
461 denom = d21*(d1min1*d1min1 + 2*d21*d21 + d1min1*d21 + epsq1)
463 lim(igrad,c1) =
min(
term,lim(igrad,c1))
466 IF ( d22 > 0.0_rfreal )
THEN
467 numer = (d1max2*d1max2+epsq2)*d22 + 2*d22*d22*d1max2
468 denom = d22*(d1max2*d1max2 + 2*d22*d22 + d1max2*d22 + epsq2)
470 lim(igrad,c2) =
min(
term,lim(igrad,c2))
471 ELSEIF ( d22 < 0.0_rfreal )
THEN
472 numer = (d1min2*d1min2+epsq2)*d22 + 2*d22*d22*d1min2
473 denom = d22*(d1min2*d1min2 + 2*d22*d22 + d1min2*d22 + epsq2)
475 lim(igrad,c2) =
min(
term,lim(igrad,c2))
486 DEALLOCATE(varmin,stat=errorflag)
487 global%error = errorflag
488 IF ( global%error /= err_none )
THEN
489 CALL
errorstop(global,err_deallocate,__line__,
'varMin')
492 DEALLOCATE(varmax,stat=errorflag)
493 global%error = errorflag
494 IF ( global%error /= err_none )
THEN
495 CALL
errorstop(global,err_deallocate,__line__,
'varMax')
543 INTEGER,
INTENT(IN) :: ibeggrad,iendgrad
544 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: lim
545 TYPE(t_region
),
POINTER :: pregion
553 TYPE(t_grid),
POINTER :: pgrid
559 global => pregion%global
560 pgrid => pregion%grid
563 'RFLU_ModLimiters.F90')
569 ALLOCATE(lim(ibeggrad:iendgrad,pgrid%nCellsTot),stat=errorflag)
570 global%error = errorflag
571 IF ( global%error /= err_none )
THEN
572 CALL
errorstop(global,err_allocate,__line__,
'lim')
616 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: lim
617 TYPE(t_region
),
POINTER :: pregion
630 global => pregion%global
633 'RFLU_ModLimiters.F90')
639 DEALLOCATE(lim,stat=errorflag)
640 global%error = errorflag
641 IF ( global%error /= err_none )
THEN
642 CALL
errorstop(global,err_deallocate,__line__,
'lim')
691 INTEGER,
INTENT(IN) :: ibeggrad,iendgrad
692 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: lim
693 REAL(RFREAL),
DIMENSION(:,:,:),
POINTER :: grad
694 TYPE(t_region
),
POINTER :: pregion
702 TYPE(t_grid),
POINTER :: pgrid
708 global => pregion%global
709 pgrid => pregion%grid
712 'RFLU_ModLimiters.F90')
718 DO icg = 1,pgrid%nCellsTot
719 DO igrad = ibeggrad,iendgrad
720 grad(xcoord,igrad,icg) = lim(igrad,icg)*grad(xcoord,igrad,icg)
721 grad(ycoord,igrad,icg) = lim(igrad,icg)*grad(ycoord,igrad,icg)
722 grad(zcoord,igrad,icg) = lim(igrad,icg)*grad(zcoord,igrad,icg)
766 iendgrad,var,varinfo,grad)
778 INTEGER,
INTENT(IN) :: ibegvar,iendvar,ibeggrad,iendgrad
779 INTEGER,
DIMENSION(:),
POINTER :: varinfo
780 REAL(RFREAL),
DIMENSION(:,:),
POINTER :: var
781 REAL(RFREAL),
DIMENSION(:,:,:),
POINTER :: grad
782 TYPE(t_region
),
POINTER :: pregion
788 INTEGER :: errorflag,icg,icl,ict,ifg,ifl,igrad,ipatch,ivar,nfacespercell
789 INTEGER,
DIMENSION(:,:,:),
POINTER :: pc2f
790 REAL(RFREAL) ::
dx,
dy,
dz,varc,varf,xc,yc,zc,xfc,yfc,zfc
792 TYPE(t_grid),
POINTER :: pgrid
793 TYPE(t_patch),
POINTER :: ppatch
799 global => pregion%global
802 'RFLU_ModLimiters.F90' )
804 IF ( (iendvar - ibegvar) /= (iendgrad - ibeggrad) )
THEN
805 CALL
errorstop(global,err_grad_mismatch,__line__)
812 pgrid => pregion%grid
818 DO icg = 1,pgrid%nCellsTot
819 ict = pgrid%cellGlob2Loc(1,icg)
820 icl = pgrid%cellGlob2Loc(2,icg)
823 CASE ( cell_type_tet )
826 CASE ( cell_type_hex )
829 CASE ( cell_type_pri )
832 CASE ( cell_type_pyr )
836 CALL
errorstop(global,err_reached_default,__line__)
839 xc = pgrid%cofg(xcoord,icg)
840 yc = pgrid%cofg(ycoord,icg)
841 zc = pgrid%cofg(zcoord,icg)
849 DO ivar = ibegvar,iendvar
850 IF ( varinfo(ivar) == var_info_pos )
THEN
853 faceloop:
DO ifl = 1,nfacespercell
854 ipatch = pc2f(1,ifl,icl)
855 ifg = pc2f(2,ifl,icl)
857 IF ( ipatch == 0 )
THEN
858 dx = pgrid%fc(xcoord,ifg) - xc
859 dy = pgrid%fc(ycoord,ifg) - yc
860 dz = pgrid%fc(zcoord,ifg) - zc
862 ppatch => pregion%patches(ipatch)
864 dx = ppatch%fc(xcoord,ifg) - xc
865 dy = ppatch%fc(ycoord,ifg) - yc
866 dz = ppatch%fc(zcoord,ifg) - zc
869 varf = varc + grad(xcoord,igrad,icg)*
dx &
870 + grad(ycoord,igrad,icg)*
dy &
871 + grad(zcoord,igrad,icg)*
dz
873 IF ( varf <= 0.0_rfreal )
THEN
874 grad(xcoord,igrad,icg) = 0.0_rfreal
875 grad(ycoord,igrad,icg) = 0.0_rfreal
876 grad(zcoord,igrad,icg) = 0.0_rfreal
subroutine, public rflu_destroylimiter(pRegion, lim)
subroutine, public rflu_computelimitervenkat(pRegion, iBegVar, iEndVar, iBegGrad, iEndGrad, var, grad, lim)
subroutine, public rflu_computelimiterbarthjesp(pRegion, iBegVar, iEndVar, iBegGrad, iEndGrad, var, grad, lim)
subroutine, public rflu_createlimiter(pRegion, iBegGrad, iEndGrad, lim)
Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
subroutine registerfunction(global, funName, fileName)
subroutine, public rflu_limitgradcells(pRegion, iBegGrad, iEndGrad, grad, lim)
subroutine, public rflu_limitgradcellssimple(pRegion, iBegVar, iEndVar, iBegGrad, iEndGrad, var, varInfo, grad)
Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
subroutine errorstop(global, errorCode, errorLine, addMessage)
subroutine deregisterfunction(global)
CGAL_BEGIN_NAMESPACE void const NT NT NT NT & denom