Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RFLU_ModAUSMFlux.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: Collection of AUSM flux routines.
26 !
27 ! Description: None.
28 !
29 ! Notes: None.
30 !
31 ! ******************************************************************************
32 !
33 ! $Id: RFLU_ModAUSMFlux.F90,v 1.11 2008/12/06 08:44:20 mtcampbe Exp $
34 !
35 ! Copyright: (c) 2005-2006 by the University of Illinois
36 !
37 ! ******************************************************************************
38 
40 
41  USE moddatatypes
42  USE modglobal, ONLY: t_global
43  USE modparameters
44  USE moderror
45  USE moddatastruct, ONLY: t_region
46  USE modbndpatch, ONLY: t_patch
47  USE modgrid, ONLY: t_grid
48  USE modmpi
49 
50  IMPLICIT NONE
51 
52  PRIVATE
53  PUBLIC :: rflu_ausm_computeflux
54 
55 ! ******************************************************************************
56 ! Declarations and definitions
57 ! ******************************************************************************
58 
59  CHARACTER(CHRLEN) :: &
60  RCSIdentString = '$RCSfile: RFLU_ModAUSMFlux.F90,v $ $Revision: 1.11 $'
61 
62 ! *****************************************************************************
63 ! Routines
64 ! *****************************************************************************
65 
66  CONTAINS
67 
68 
69 
70 
71 
72 
73 ! ******************************************************************************
74 !
75 ! Purpose: Wrapper function for AUSM flux functions.
76 !
77 ! Description: None.
78 !
79 ! Input:
80 ! pRegion Pointer to region data.
81 !
82 ! Output: None.
83 !
84 ! Notes: None.
85 !
86 ! ******************************************************************************
87 
88 SUBROUTINE rflu_ausm_computeflux(pRegion)
89 
90  IMPLICIT NONE
91 
92 ! ******************************************************************************
93 ! Definitions and declarations
94 ! ******************************************************************************
95 
96 ! ==============================================================================
97 ! Arguments
98 ! ==============================================================================
99 
100  TYPE(t_region), POINTER :: pregion
101 
102 ! ==============================================================================
103 ! Locals
104 ! ==============================================================================
105 
106  TYPE(t_global), POINTER :: global
107 
108 ! ******************************************************************************
109 ! Start
110 ! ******************************************************************************
111 
112  global => pregion%global
113 
114  CALL registerfunction(global,'RFLU_AUSM_ComputeFlux',&
115  'RFLU_ModAUSMFlux.F90')
116 
117 ! ******************************************************************************
118 ! Call flux functions
119 ! ******************************************************************************
120 
121  SELECT CASE ( pregion%mixtInput%gasModel )
122 
123 ! ==============================================================================
124 ! Thermally and calorically perfect gas
125 ! ==============================================================================
126 
127  CASE ( gas_model_tcperf )
128  SELECT CASE ( pregion%mixtInput%spaceOrder )
129  CASE ( discr_order_1 )
130  CALL rflu_ausm_computeflux1(pregion)
131  CASE ( discr_order_2 )
132  CALL rflu_ausm_computeflux2_tcp(pregion)
133  CASE default
134  CALL errorstop(global,err_reached_default,__line__)
135  END SELECT ! pRegion%mixtInput%spaceOrder
136 
137 ! ==============================================================================
138 ! Mixture of thermally and calorically perfect gases
139 ! ==============================================================================
140 
141  CASE ( gas_model_mixt_tcperf )
142  SELECT CASE ( pregion%mixtInput%spaceOrder )
143  CASE ( discr_order_1 )
144  CALL rflu_ausm_computeflux1(pregion)
145  CASE ( discr_order_2 )
146  CALL rflu_ausm_computeflux2_mtcp(pregion)
147  CASE default
148  CALL errorstop(global,err_reached_default,__line__)
149  END SELECT ! pRegion%mixtInput%spaceOrder
150 
151 ! ==============================================================================
152 ! Pseudo-gas
153 ! ==============================================================================
154 
155  CASE ( gas_model_mixt_pseudo )
156  SELECT CASE ( pregion%mixtInput%spaceOrder )
157 ! TO DO
158 ! CASE ( DISCR_ORDER_1 )
159 ! CALL RFLU_AUSM_ComputeFlux1_MPSD(pRegion)
160 ! END TO DO
161  CASE ( discr_order_2 )
162  CALL rflu_ausm_computeflux2_mpsd(pregion)
163  CASE default
164  CALL errorstop(global,err_reached_default,__line__)
165  END SELECT ! pRegion%mixtInput%spaceOrder
166 
167 ! ==============================================================================
168 ! Default
169 ! ==============================================================================
170 
171  CASE default
172  CALL errorstop(global,err_reached_default,__line__)
173  END SELECT ! pRegion%mixtInput%gasModel
174 
175 ! ******************************************************************************
176 ! End
177 ! ******************************************************************************
178 
179  CALL deregisterfunction(global)
180 
181 END SUBROUTINE rflu_ausm_computeflux
182 
183 
184 
185 
186 
187 
188 
189 ! ******************************************************************************
190 !
191 ! Purpose: Compute convective fluxes using AUSM+ scheme.
192 !
193 ! Description: None.
194 !
195 ! Input:
196 ! nx x-component of face normal
197 ! ny y-component of face normal
198 ! nz z-component of face normal
199 ! nm Magnitude of face normal
200 ! fs Face speed
201 ! rl Density of left state
202 ! ul x-component of velocity of left state
203 ! vl y-component of velocity of left state
204 ! wl z-component of velocity of left state
205 ! Hl Total enthalpy of left state
206 ! al Speed of sound of left state
207 ! pl Pressure of left state
208 ! rr Density of right state
209 ! ur x-component of velocity of right state
210 ! vr y-component of velocity of right state
211 ! wr z-component of velocity of right state
212 ! pr Pressure of right state
213 ! Hr Total enthalpy of right state
214 ! ar Speed of sound of right state
215 !
216 ! Output:
217 ! flx Fluxes
218 ! vf Face velocities
219 !
220 ! Notes:
221 ! 1. Liou M.-S., Progress towards an improved CFD method: AUSM+, AIAA Paper
222 ! 95-1701, 1995
223 ! 2. Do not use computation of face speed of sound which leads to exact
224 ! capturing of isolated normal shock waves because of robustness problems
225 ! for unsteady flows and because that formulation is not applicable to
226 ! anything but calorically and thermally perfect gases.
227 !
228 ! ******************************************************************************
229 
230 SUBROUTINE rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,Hl,al,rr,ur, &
231  vr,wr,pr,hr,ar,flx,vf)
232 
233  IMPLICIT NONE
234 
235 ! ******************************************************************************
236 ! Definitions and declarations
237 ! ******************************************************************************
238 
239 ! ==============================================================================
240 ! Arguments
241 ! ==============================================================================
242 
243  REAL(RFREAL), INTENT(IN) :: al,ar,fs,hl,hr,nm,nx,ny,nz,pl,pr,rl,rr,ul,ur,vl, &
244  vr,wl,wr
245  REAL(RFREAL), INTENT(OUT) :: flx(5),vf(3)
246 
247 ! ==============================================================================
248 ! Locals
249 ! ==============================================================================
250 
251  REAL(RFREAL) :: af,mf,mfa,mfm,mfp,ml,mla,mlp,mr,mra,mrm,pf,ql,qr,vml,vmr, &
252  wtl,wtr
253 
254 ! ******************************************************************************
255 ! Start, compute face state
256 ! ******************************************************************************
257 
258  ql = ul*nx + vl*ny + wl*nz - fs
259  qr = ur*nx + vr*ny + wr*nz - fs
260 
261  af = 0.5_rfreal*(al+ar) ! NOTE not using original formulation, see note
262 
263  ml = ql/af
264  mla = abs(ml)
265 
266  mr = qr/af
267  mra = abs(mr)
268 
269  IF ( mla <= 1.0_rfreal ) THEN
270  mlp = 0.25_rfreal*(ml+1.0_rfreal)*(ml+1.0_rfreal) &
271  + 0.125_rfreal*(ml*ml-1.0_rfreal)*(ml*ml-1.0_rfreal)
272  wtl = 0.25_rfreal*(ml+1.0_rfreal)*(ml+1.0_rfreal)*(2.0_rfreal-ml) &
273  + 0.1875_rfreal*ml*(ml*ml-1.0_rfreal)*(ml*ml-1.0_rfreal)
274  ELSE
275  mlp = 0.5_rfreal*(ml+mla)
276  wtl = 0.5_rfreal*(1.0_rfreal+ml/mla)
277  END IF ! mla
278 
279  IF ( mra <= 1.0_rfreal ) THEN
280  mrm = -0.25_rfreal*(mr-1.0_rfreal)*(mr-1.0_rfreal) &
281  -0.125_rfreal*(mr*mr-1.0_rfreal)*(mr*mr-1.0_rfreal)
282  wtr = 0.25_rfreal*(mr-1.0_rfreal)*(mr-1.0_rfreal)*(2.0_rfreal+mr) &
283  - 0.1875_rfreal*mr*(mr*mr-1.0_rfreal)*(mr*mr-1.0_rfreal)
284  ELSE
285  mrm = 0.5_rfreal*(mr-mra)
286  wtr = 0.5_rfreal*(1.0_rfreal-mr/mra)
287  END IF ! mla
288 
289  mf = mlp + mrm
290  mfa = abs(mf)
291  mfp = 0.5_rfreal*(mf+mfa)
292  mfm = 0.5_rfreal*(mf-mfa)
293 
294  pf = wtl*pl + wtr*pr
295 
296 ! ******************************************************************************
297 ! Compute fluxes
298 ! ******************************************************************************
299 
300  vf(1) = mfp*ul + mfm*ur
301  vf(2) = mfp*vl + mfm*vr
302  vf(3) = mfp*wl + mfm*wr
303 
304  flx(1) = (af*(mfp*rl + mfm*rr ) )*nm
305  flx(2) = (af*(mfp*rl*ul + mfm*rr*ur) + pf*nx)*nm
306  flx(3) = (af*(mfp*rl*vl + mfm*rr*vr) + pf*ny)*nm
307  flx(4) = (af*(mfp*rl*wl + mfm*rr*wr) + pf*nz)*nm
308  flx(5) = (af*(mfp*rl*hl + mfm*rr*hr) + pf*fs)*nm
309 
310 ! ******************************************************************************
311 ! End
312 ! ******************************************************************************
313 
314 END SUBROUTINE rflu_ausm_fluxfunction
315 
316 
317 
318 
319 
320 
321 
322 
323 
324 ! ******************************************************************************
325 !
326 ! Purpose: Compute convective fluxes using first-order accurate AUSM+ scheme.
327 !
328 ! Description: None.
329 !
330 ! Input:
331 ! pRegion Pointer to region
332 !
333 ! Output: None.
334 !
335 ! Notes:
336 ! 1. This routine can also be used for a mixture of thermally and calorically
337 ! perfect gases because, the face states being identical to the cell
338 ! states, the mixture properties are constant.
339 !
340 ! ******************************************************************************
341 
342 SUBROUTINE rflu_ausm_computeflux1(pRegion)
343 
344  USE modinterfaces, ONLY: mixtperf_ho_cptuvw, &
346 
347  IMPLICIT NONE
348 
349 ! ******************************************************************************
350 ! Definitions and declarations
351 ! ******************************************************************************
352 
353 ! ==============================================================================
354 ! Arguments
355 ! ==============================================================================
356 
357  TYPE(t_region), POINTER :: pregion
358 
359 ! ==============================================================================
360 ! Locals
361 ! ==============================================================================
362 
363  INTEGER :: c1,c2,ifg,indcp,indgs,indmf,indmol,indsd,ipatch
364  REAL(RFREAL) :: al,ar,cpl,cpr,fs,hl,hr,irl,irr,nm,nx,ny,nz,pl,pr,rl,rr, &
365  tl,tr,ul,ur,vl,vr,wl,wr
366  REAL(RFREAL) :: flx(5),vf(3)
367  REAL(RFREAL), DIMENSION(:), POINTER :: pmf
368  REAL(RFREAL), DIMENSION(:,:), POINTER :: pcv,pdv,pgv,prhs,psd
369  TYPE(t_global), POINTER :: global
370  TYPE(t_grid), POINTER :: pgrid
371  TYPE(t_patch), POINTER :: ppatch
372 
373 ! ******************************************************************************
374 ! Start
375 ! ******************************************************************************
376 
377  global => pregion%global
378 
379  CALL registerfunction(global,'RFLU_AUSM_ComputeFlux1',&
380  'RFLU_ModAUSMFlux.F90')
381 
382 #ifdef ROCPROF
383  CALL fprofiler_begins("RFLU::AUSM_ComputeFlux1")
384 #endif
385 
386 ! ******************************************************************************
387 ! Set dimensions and pointers
388 ! ******************************************************************************
389 
390  pgrid => pregion%grid
391 
392  indgs = pregion%grid%indGs
393 
394  indcp = pregion%mixtInput%indCp
395  indmf = pregion%mixtInput%indMfMixt
396  indmol = pregion%mixtInput%indMol
397  indsd = pregion%mixtInput%indSd
398 
399  pcv => pregion%mixt%cv
400  pdv => pregion%mixt%dv
401  pgv => pregion%mixt%gv
402 
403  pmf => pregion%mixt%mfMixt
404  prhs => pregion%mixt%rhs
405  psd => pregion%mixt%sd
406 
407 ! ******************************************************************************
408 ! Compute fluxes through interior faces
409 ! ******************************************************************************
410 
411  DO ifg = 1,pgrid%nFaces
412  c1 = pgrid%f2c(1,ifg)
413  c2 = pgrid%f2c(2,ifg)
414 
415 ! ==============================================================================
416 ! Get face geometry and grid speed
417 ! ==============================================================================
418 
419  nx = pgrid%fn(xcoord,ifg)
420  ny = pgrid%fn(ycoord,ifg)
421  nz = pgrid%fn(zcoord,ifg)
422  nm = pgrid%fn(xyzmag,ifg)
423 
424  fs = pgrid%gs(indgs*ifg)
425 
426 ! ==============================================================================
427 ! Compute left and right states
428 ! ==============================================================================
429 
430 ! ------------------------------------------------------------------------------
431 ! Left state
432 ! ------------------------------------------------------------------------------
433 
434  cpl = pgv(gv_mixt_cp,indcp*c1)
435 
436  rl = pcv(cv_mixt_dens,c1)
437  irl = 1.0_rfreal/rl
438 
439  ul = pcv(cv_mixt_xmom,c1)*irl
440  vl = pcv(cv_mixt_ymom,c1)*irl
441  wl = pcv(cv_mixt_zmom,c1)*irl
442 
443  pl = pdv(dv_mixt_pres,c1)
444  tl = pdv(dv_mixt_temp,c1)
445  al = pdv(dv_mixt_soun,c1)
446 
447  hl = mixtperf_ho_cptuvw(cpl,tl,ul,vl,wl)
448 
449 ! ------------------------------------------------------------------------------
450 ! Right state
451 ! ------------------------------------------------------------------------------
452 
453  cpr = pgv(gv_mixt_cp,indcp*c2)
454 
455  rr = pcv(cv_mixt_dens,c2)
456  irr = 1.0_rfreal/rr
457 
458  ur = pcv(cv_mixt_xmom,c2)*irr
459  vr = pcv(cv_mixt_ymom,c2)*irr
460  wr = pcv(cv_mixt_zmom,c2)*irr
461 
462  pr = pdv(dv_mixt_pres,c2)
463  tr = pdv(dv_mixt_temp,c2)
464  ar = pdv(dv_mixt_soun,c2)
465 
466  hr = mixtperf_ho_cptuvw(cpr,tr,ur,vr,wr)
467 
468 ! ==============================================================================
469 ! Compute fluxes
470 ! ==============================================================================
471 
472  CALL rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,hl,al,rr,ur,vr, &
473  wr,pr,hr,ar,flx,vf)
474 
475 ! ==============================================================================
476 ! Store mass flux
477 ! ==============================================================================
478 
479  pmf(indmf*ifg) = flx(1)
480 
481 ! ==============================================================================
482 ! Accumulate into residual
483 ! ==============================================================================
484 
485  prhs(cv_mixt_dens,c1) = prhs(cv_mixt_dens,c1) + flx(1)
486  prhs(cv_mixt_xmom,c1) = prhs(cv_mixt_xmom,c1) + flx(2)
487  prhs(cv_mixt_ymom,c1) = prhs(cv_mixt_ymom,c1) + flx(3)
488  prhs(cv_mixt_zmom,c1) = prhs(cv_mixt_zmom,c1) + flx(4)
489  prhs(cv_mixt_ener,c1) = prhs(cv_mixt_ener,c1) + flx(5)
490 
491  prhs(cv_mixt_dens,c2) = prhs(cv_mixt_dens,c2) - flx(1)
492  prhs(cv_mixt_xmom,c2) = prhs(cv_mixt_xmom,c2) - flx(2)
493  prhs(cv_mixt_ymom,c2) = prhs(cv_mixt_ymom,c2) - flx(3)
494  prhs(cv_mixt_zmom,c2) = prhs(cv_mixt_zmom,c2) - flx(4)
495  prhs(cv_mixt_ener,c2) = prhs(cv_mixt_ener,c2) - flx(5)
496 
497 ! ==============================================================================
498 ! Accumulate into substantial derivative
499 ! ==============================================================================
500 
501  psd(sd_xmom,c1*indsd) = psd(sd_xmom,c1*indsd) + vf(1)*flx(1)
502  psd(sd_ymom,c1*indsd) = psd(sd_ymom,c1*indsd) + vf(2)*flx(1)
503  psd(sd_zmom,c1*indsd) = psd(sd_zmom,c1*indsd) + vf(3)*flx(1)
504 
505  psd(sd_xmom,c2*indsd) = psd(sd_xmom,c2*indsd) - vf(1)*flx(1)
506  psd(sd_ymom,c2*indsd) = psd(sd_ymom,c2*indsd) - vf(2)*flx(1)
507  psd(sd_zmom,c2*indsd) = psd(sd_zmom,c2*indsd) - vf(3)*flx(1)
508  END DO ! ifg
509 
510 ! ******************************************************************************
511 ! Compute fluxes through boundary faces
512 ! ******************************************************************************
513 
514  DO ipatch = 1,pregion%grid%nPatches
515  ppatch => pregion%patches(ipatch)
516 
517  CALL rflu_centralfirstpatch(pregion,ppatch)
518  END DO ! iPatch
519 
520 ! ******************************************************************************
521 ! End
522 ! ******************************************************************************
523 
524 #ifdef ROCPROF
525  CALL fprofiler_ends("RFLU::AUSM_ComputeFlux1")
526 #endif
527 
528  CALL deregisterfunction(global)
529 
530 END SUBROUTINE rflu_ausm_computeflux1
531 
532 
533 
534 
535 
536 
537 
538 ! ******************************************************************************
539 !
540 ! Purpose: Compute convective fluxes using second-order accurate AUSM+ scheme
541 ! for mixture of thermally and calorically perfect gaseous species and
542 ! particulate species.
543 !
544 ! Description: None.
545 !
546 ! Input:
547 ! pRegion Pointer to region
548 !
549 ! Output: None.
550 !
551 ! Notes: None.
552 !
553 ! ******************************************************************************
554 
555 SUBROUTINE rflu_ausm_computeflux2_mpsd(pRegion)
556 
557 #ifdef SPEC
558  USE modspecies, ONLY: t_spec_type
559 #endif
560 
561  USE modinterfaces, ONLY: mixtperf_c_grt, &
562  mixtperf_g_cpr, &
564  mixtperf_m_r, &
565  mixtperf_r_m, &
566  mixtperf_t_dpr, &
569 
570  IMPLICIT NONE
571 
572 ! ******************************************************************************
573 ! Definitions and declarations
574 ! ******************************************************************************
575 
576 ! ==============================================================================
577 ! Arguments
578 ! ==============================================================================
579 
580  TYPE(t_region), POINTER :: pregion
581 
582 ! ==============================================================================
583 ! Locals
584 ! ==============================================================================
585 
586  INTEGER :: c1,c2,ifg,indcp,indgs,indmf,indmol,indsd,ipatch
587  REAL(RFREAL) :: al,ar,cpl,cpr,dx,dy,dz,fs,gcl,gcr,gl,gr,hl,hr,irl,irr,mml, &
588  mmr,nm,nx,ny,nz,pl,pr,rl,rr,tl,tr,ul,ur,vl,vr,wl,wr,xc,yc,zc
589  REAL(RFREAL) :: flx(5),vf(3)
590  REAL(RFREAL), DIMENSION(:), POINTER :: pmf
591  REAL(RFREAL), DIMENSION(:,:), POINTER :: pcv,pdv,pgv,prhs,psd
592  REAL(RFREAL), DIMENSION(:,:,:), POINTER :: pgc
593  TYPE(t_global), POINTER :: global
594  TYPE(t_grid), POINTER :: pgrid
595  TYPE(t_patch), POINTER :: ppatch
596 
597 #ifdef SPEC
598  INTEGER :: ispec
599  REAL(RFREAL) :: gcg,immg,mmg,phip,yg,y1,y2
600  REAL(RFREAL), DIMENSION(:,:), POINTER :: pcvspec
601  REAL(RFREAL), DIMENSION(:,:,:), POINTER :: pgcspec
602  TYPE(t_spec_type), POINTER :: pspectype
603 #endif
604 
605 ! ******************************************************************************
606 ! Start
607 ! ******************************************************************************
608 
609  global => pregion%global
610 
611  CALL registerfunction(global,'RFLU_AUSM_ComputeFlux2_MPSD',&
612  'RFLU_ModAUSMFlux.F90')
613 
614 #ifdef ROCPROF
615  CALL fprofiler_begins("RFLU::AUSM_ComputeFlux2_MPSD")
616 #endif
617 
618 ! ******************************************************************************
619 ! Set dimensions and pointers
620 ! ******************************************************************************
621 
622  pgrid => pregion%grid
623 
624  indgs = pgrid%indGs
625 
626  indcp = pregion%mixtInput%indCp
627  indmf = pregion%mixtInput%indMfMixt
628  indmol = pregion%mixtInput%indMol
629  indsd = pregion%mixtInput%indSd
630 
631  pcv => pregion%mixt%cv
632  pdv => pregion%mixt%dv
633  pgv => pregion%mixt%gv
634 
635  pgc => pregion%mixt%gradCell
636  pmf => pregion%mixt%mfMixt
637  prhs => pregion%mixt%rhs
638  psd => pregion%mixt%sd
639 
640 #ifdef SPEC
641  pcvspec => pregion%spec%cv
642  pgcspec => pregion%spec%gradCell
643 #endif
644 
645  IF ( pregion%spec%cvState /= cv_mixt_state_cons ) THEN
646  CALL errorstop(global,err_cv_state_invalid,__line__)
647  END IF ! pRegion%spec%cvState
648 
649  IF ( pregion%mixtInput%gasModel /= gas_model_mixt_pseudo ) THEN
650  CALL errorstop(global,err_gasmodel_invalid,__line__)
651  END IF ! pRegion%mixtInput%gasModel
652 
653  IF ( (indcp /= 1) .OR. (indmol /= 1) ) THEN
654  CALL errorstop(global,err_reached_default,__line__)
655  END IF ! indCp
656 
657 ! ******************************************************************************
658 ! Compute fluxes through interior faces
659 ! ******************************************************************************
660 
661  DO ifg = 1,pgrid%nFaces
662  c1 = pgrid%f2c(1,ifg)
663  c2 = pgrid%f2c(2,ifg)
664 
665 ! ==============================================================================
666 ! Get face geometry and grid speed
667 ! ==============================================================================
668 
669  nx = pgrid%fn(xcoord,ifg)
670  ny = pgrid%fn(ycoord,ifg)
671  nz = pgrid%fn(zcoord,ifg)
672  nm = pgrid%fn(xyzmag,ifg)
673 
674  xc = pgrid%fc(xcoord,ifg)
675  yc = pgrid%fc(ycoord,ifg)
676  zc = pgrid%fc(zcoord,ifg)
677 
678  fs = pgrid%gs(indgs*ifg)
679 
680 ! ==============================================================================
681 ! Compute left and right states
682 ! ==============================================================================
683 
684 ! ------------------------------------------------------------------------------
685 ! Left state
686 ! ------------------------------------------------------------------------------
687 
688  rl = pcv(cv_mixt_dens,c1)
689  irl = 1.0_rfreal/rl
690 
691  dx = xc - pgrid%cofg(xcoord,c1)
692  dy = yc - pgrid%cofg(ycoord,c1)
693  dz = zc - pgrid%cofg(zcoord,c1)
694 
695 #ifdef SPEC
696  immg = 0.0_rfreal
697  cpl = 0.0_rfreal
698  yg = 0.0_rfreal
699  phip = 0.0_rfreal
700 
701  DO ispec = 1,pregion%specInput%nSpecies
702  pspectype => pregion%specInput%specType(ispec)
703 
704  y1 = irl*pcvspec(ispec,c1) + pgcspec(xcoord,ispec,c1)*dx &
705  + pgcspec(ycoord,ispec,c1)*dy &
706  + pgcspec(zcoord,ispec,c1)*dz
707 
708  IF ( pspectype%discreteFlag .EQV. .true. ) THEN
709  cpl = cpl + y1*pspectype%pMaterial%spht
710  phip = phip + rl*y1/pspectype%pMaterial%dens
711  ELSE
712  immg = immg + y1/pspectype%pMaterial%molw
713  cpl = cpl + y1*pspectype%pMaterial%spht
714  yg = yg + y1
715  END IF ! pSpecType%discreteFlag
716  END DO ! iSpec
717 
718  mmg = yg/immg
719  gcg = mixtperf_r_m(mmg)
720  gcl = yg/(1.0_rfreal-phip)*gcg
721  mml = mixtperf_m_r(gcl)
722 #endif
723 
724  ul = pcv(cv_mixt_xmom,c1)*irl
725  vl = pcv(cv_mixt_ymom,c1)*irl
726  wl = pcv(cv_mixt_zmom,c1)*irl
727  pl = pdv(dv_mixt_pres,c1)
728 
729  rl = rl + pgc(xcoord,grc_mixt_dens,c1)*dx &
730  + pgc(ycoord,grc_mixt_dens,c1)*dy &
731  + pgc(zcoord,grc_mixt_dens,c1)*dz
732  ul = ul + pgc(xcoord,grc_mixt_xvel,c1)*dx &
733  + pgc(ycoord,grc_mixt_xvel,c1)*dy &
734  + pgc(zcoord,grc_mixt_xvel,c1)*dz
735  vl = vl + pgc(xcoord,grc_mixt_yvel,c1)*dx &
736  + pgc(ycoord,grc_mixt_yvel,c1)*dy &
737  + pgc(zcoord,grc_mixt_yvel,c1)*dz
738  wl = wl + pgc(xcoord,grc_mixt_zvel,c1)*dx &
739  + pgc(ycoord,grc_mixt_zvel,c1)*dy &
740  + pgc(zcoord,grc_mixt_zvel,c1)*dz
741  pl = pl + pgc(xcoord,grc_mixt_pres,c1)*dx &
742  + pgc(ycoord,grc_mixt_pres,c1)*dy &
743  + pgc(zcoord,grc_mixt_pres,c1)*dz
744 
745  tl = mixtperf_t_dpr(rl,pl,gcl)
746  al = mixtperf_c_grt(gl,gcl,tl)
747  hl = mixtperf_ho_cptuvw(cpl,tl,ul,vl,wl)
748 
749 ! ------------------------------------------------------------------------------
750 ! Right state
751 ! ------------------------------------------------------------------------------
752 
753  rr = pcv(cv_mixt_dens,c2)
754  irr = 1.0_rfreal/rr
755 
756  dx = xc - pgrid%cofg(xcoord,c2)
757  dy = yc - pgrid%cofg(ycoord,c2)
758  dz = zc - pgrid%cofg(zcoord,c2)
759 
760 #ifdef SPEC
761  immg = 0.0_rfreal
762  cpr = 0.0_rfreal
763  yg = 0.0_rfreal
764  phip = 0.0_rfreal
765 
766  DO ispec = 1,pregion%specInput%nSpecies
767  pspectype => pregion%specInput%specType(ispec)
768 
769  y2 = irr*pcvspec(ispec,c2) + pgcspec(xcoord,ispec,c2)*dx &
770  + pgcspec(ycoord,ispec,c2)*dy &
771  + pgcspec(zcoord,ispec,c2)*dz
772 
773  IF ( pspectype%discreteFlag .EQV. .true. ) THEN
774  cpr = cpr + y2*pspectype%pMaterial%spht
775  phip = phip + rr*y2/pspectype%pMaterial%dens
776  ELSE
777  immg = immg + y2/pspectype%pMaterial%molw
778  cpr = cpr + y2*pspectype%pMaterial%spht
779  yg = yg + y2
780  END IF ! pSpecType%discreteFlag
781  END DO ! iSpec
782 
783  mmg = yg/immg
784  gcg = mixtperf_r_m(mmg)
785  gcr = yg/(1.0_rfreal-phip)*gcg
786  mmr = mixtperf_m_r(gcr)
787 #endif
788 
789  ur = pcv(cv_mixt_xmom,c2)*irr
790  vr = pcv(cv_mixt_ymom,c2)*irr
791  wr = pcv(cv_mixt_zmom,c2)*irr
792  pr = pdv(dv_mixt_pres,c2)
793 
794  rr = rr + pgc(xcoord,grc_mixt_dens,c2)*dx &
795  + pgc(ycoord,grc_mixt_dens,c2)*dy &
796  + pgc(zcoord,grc_mixt_dens,c2)*dz
797  ur = ur + pgc(xcoord,grc_mixt_xvel,c2)*dx &
798  + pgc(ycoord,grc_mixt_xvel,c2)*dy &
799  + pgc(zcoord,grc_mixt_xvel,c2)*dz
800  vr = vr + pgc(xcoord,grc_mixt_yvel,c2)*dx &
801  + pgc(ycoord,grc_mixt_yvel,c2)*dy &
802  + pgc(zcoord,grc_mixt_yvel,c2)*dz
803  wr = wr + pgc(xcoord,grc_mixt_zvel,c2)*dx &
804  + pgc(ycoord,grc_mixt_zvel,c2)*dy &
805  + pgc(zcoord,grc_mixt_zvel,c2)*dz
806  pr = pr + pgc(xcoord,grc_mixt_pres,c2)*dx &
807  + pgc(ycoord,grc_mixt_pres,c2)*dy &
808  + pgc(zcoord,grc_mixt_pres,c2)*dz
809 
810  tr = mixtperf_t_dpr(rr,pr,gcr)
811  ar = mixtperf_c_grt(gr,gcr,tr)
812  hr = mixtperf_ho_cptuvw(cpr,tr,ur,vr,wr)
813 
814 ! ==============================================================================
815 ! Compute fluxes
816 ! ==============================================================================
817 
818  gl = cpl/(cpl-gcl)
819  gr = cpr/(cpr-gcr)
820 
821  IF ( abs(gr-gl) < 0.05_rfreal ) THEN
822  CALL rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,hl,al, &
823  rr,ur,vr,wr,pr,hr,ar,flx,vf)
824 
825  pmf(indmf*ifg) = flx(1)
826 
827  prhs(cv_mixt_dens,c1) = prhs(cv_mixt_dens,c1) + flx(1)
828  prhs(cv_mixt_xmom,c1) = prhs(cv_mixt_xmom,c1) + flx(2)
829  prhs(cv_mixt_ymom,c1) = prhs(cv_mixt_ymom,c1) + flx(3)
830  prhs(cv_mixt_zmom,c1) = prhs(cv_mixt_zmom,c1) + flx(4)
831  prhs(cv_mixt_ener,c1) = prhs(cv_mixt_ener,c1) + flx(5)
832 
833  prhs(cv_mixt_dens,c2) = prhs(cv_mixt_dens,c2) - flx(1)
834  prhs(cv_mixt_xmom,c2) = prhs(cv_mixt_xmom,c2) - flx(2)
835  prhs(cv_mixt_ymom,c2) = prhs(cv_mixt_ymom,c2) - flx(3)
836  prhs(cv_mixt_zmom,c2) = prhs(cv_mixt_zmom,c2) - flx(4)
837  prhs(cv_mixt_ener,c2) = prhs(cv_mixt_ener,c2) - flx(5)
838 
839  psd(sd_xmom,c1*indsd) = psd(sd_xmom,c1*indsd) + vf(1)*flx(1)
840  psd(sd_ymom,c1*indsd) = psd(sd_ymom,c1*indsd) + vf(2)*flx(1)
841  psd(sd_zmom,c1*indsd) = psd(sd_zmom,c1*indsd) + vf(3)*flx(1)
842 
843  psd(sd_xmom,c2*indsd) = psd(sd_xmom,c2*indsd) - vf(1)*flx(1)
844  psd(sd_ymom,c2*indsd) = psd(sd_ymom,c2*indsd) - vf(2)*flx(1)
845  psd(sd_zmom,c2*indsd) = psd(sd_zmom,c2*indsd) - vf(3)*flx(1)
846  ELSE
847  CALL rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,hl,al, &
848  rr,ur,vr,wr,pr,hr,ar,flx,vf)
849 
850  pmf(indmf*ifg) = 0.5_rfreal*flx(1)
851 
852  prhs(cv_mixt_dens,c1) = prhs(cv_mixt_dens,c1) + flx(1)
853  prhs(cv_mixt_xmom,c1) = prhs(cv_mixt_xmom,c1) + flx(2)
854  prhs(cv_mixt_ymom,c1) = prhs(cv_mixt_ymom,c1) + flx(3)
855  prhs(cv_mixt_zmom,c1) = prhs(cv_mixt_zmom,c1) + flx(4)
856  prhs(cv_mixt_ener,c1) = prhs(cv_mixt_ener,c1) + flx(5)
857 
858  psd(sd_xmom,c1*indsd) = psd(sd_xmom,c1*indsd) + vf(1)*flx(1)
859  psd(sd_ymom,c1*indsd) = psd(sd_ymom,c1*indsd) + vf(2)*flx(1)
860  psd(sd_zmom,c1*indsd) = psd(sd_zmom,c1*indsd) + vf(3)*flx(1)
861 
862  CALL rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,hl,al, &
863  rr,ur,vr,wr,pr,hr,ar,flx,vf)
864 
865  pmf(indmf*ifg) = pmf(indmf*ifg) + 0.5_rfreal*flx(1)
866 
867  prhs(cv_mixt_dens,c2) = prhs(cv_mixt_dens,c2) - flx(1)
868  prhs(cv_mixt_xmom,c2) = prhs(cv_mixt_xmom,c2) - flx(2)
869  prhs(cv_mixt_ymom,c2) = prhs(cv_mixt_ymom,c2) - flx(3)
870  prhs(cv_mixt_zmom,c2) = prhs(cv_mixt_zmom,c2) - flx(4)
871  prhs(cv_mixt_ener,c2) = prhs(cv_mixt_ener,c2) - flx(5)
872 
873  psd(sd_xmom,c2*indsd) = psd(sd_xmom,c2*indsd) - vf(1)*flx(1)
874  psd(sd_ymom,c2*indsd) = psd(sd_ymom,c2*indsd) - vf(2)*flx(1)
875  psd(sd_zmom,c2*indsd) = psd(sd_zmom,c2*indsd) - vf(3)*flx(1)
876  END IF ! ABS(gr-gl)
877  END DO ! ifg
878 
879 ! ******************************************************************************
880 ! Compute fluxes through boundary faces
881 ! ******************************************************************************
882 
883  DO ipatch = 1,pregion%grid%nPatches
884  ppatch => pregion%patches(ipatch)
885 
886  SELECT CASE ( ppatch%spaceOrder )
887  CASE ( 1 )
888  CALL rflu_centralfirstpatch(pregion,ppatch)
889  CASE ( 2 )
890  CALL rflu_centralsecondpatch(pregion,ppatch)
891  CASE default
892  CALL errorstop(global,err_reached_default,__line__)
893  END SELECT ! pPatch%spaceOrder
894  END DO ! iPatch
895 
896 ! ******************************************************************************
897 ! End
898 ! ******************************************************************************
899 
900 #ifdef ROCPROF
901  CALL fprofiler_ends("RFLU::AUSM_ComputeFlux2_MPSD")
902 #endif
903 
904  CALL deregisterfunction(global)
905 
906 END SUBROUTINE rflu_ausm_computeflux2_mpsd
907 
908 
909 
910 
911 
912 
913 
914 
915 
916 ! ******************************************************************************
917 !
918 ! Purpose: Compute convective fluxes using second-order accurate AUSM+ scheme
919 ! for mixture of thermally and calorically perfect gases.
920 !
921 ! Description: None.
922 !
923 ! Input:
924 ! pRegion Pointer to region
925 !
926 ! Output: None.
927 !
928 ! Notes: None.
929 !
930 ! ******************************************************************************
931 
932 SUBROUTINE rflu_ausm_computeflux2_mtcp(pRegion)
933 
934 #ifdef SPEC
935  USE modspecies, ONLY: t_spec_type
936 #endif
937 
938  USE modinterfaces, ONLY: mixtperf_c_grt, &
939  mixtperf_g_cpr, &
941  mixtperf_r_m, &
942  mixtperf_t_dpr, &
945 
946  IMPLICIT NONE
947 
948 ! ******************************************************************************
949 ! Definitions and declarations
950 ! ******************************************************************************
951 
952 ! ==============================================================================
953 ! Arguments
954 ! ==============================================================================
955 
956  TYPE(t_region), POINTER :: pregion
957 
958 ! ==============================================================================
959 ! Locals
960 ! ==============================================================================
961 
962  INTEGER :: c1,c2,ifg,indcp,indgs,indmf,indmol,indsd,ipatch
963  REAL(RFREAL) :: al,ar,cpl,cpr,dx,dy,dz,fs,gcl,gcr,gl,gr,hl,hr,irl,irr, &
964  nm,nx,ny,nz,pl,pr,rl,rr,tl,tr,ul,ur,vl,vr,wl,wr,xc,yc,zc
965  REAL(RFREAL) :: flx(5),vf(3)
966  REAL(RFREAL), DIMENSION(:), POINTER :: pmf
967  REAL(RFREAL), DIMENSION(:,:), POINTER :: pcv,pdv,pgv,prhs,psd
968  REAL(RFREAL), DIMENSION(:,:,:), POINTER :: pgc
969  TYPE(t_global), POINTER :: global
970  TYPE(t_grid), POINTER :: pgrid
971  TYPE(t_patch), POINTER :: ppatch
972 
973 #ifdef SPEC
974  INTEGER :: ispec
975  REAL(RFREAL) :: mml,mmr,y1,y2
976  REAL(RFREAL), DIMENSION(:,:), POINTER :: pcvspec
977  REAL(RFREAL), DIMENSION(:,:,:), POINTER :: pgcspec
978  TYPE(t_spec_type), POINTER :: pspectype
979 #endif
980 
981 ! ******************************************************************************
982 ! Start
983 ! ******************************************************************************
984 
985  global => pregion%global
986 
987  CALL registerfunction(global,'RFLU_AUSM_ComputeFlux2_MTCP',&
988  'RFLU_ModAUSMFlux.F90')
989 
990 #ifdef ROCPROF
991  CALL fprofiler_begins("RFLU::AUSM_ComputeFlux2_MTCP")
992 #endif
993 
994 ! ******************************************************************************
995 ! Set dimensions and pointers
996 ! ******************************************************************************
997 
998  pgrid => pregion%grid
999 
1000  indgs = pgrid%indGs
1001 
1002  indcp = pregion%mixtInput%indCp
1003  indmf = pregion%mixtInput%indMfMixt
1004  indmol = pregion%mixtInput%indMol
1005  indsd = pregion%mixtInput%indSd
1006 
1007  pcv => pregion%mixt%cv
1008  pdv => pregion%mixt%dv
1009  pgv => pregion%mixt%gv
1010 
1011  pgc => pregion%mixt%gradCell
1012  pmf => pregion%mixt%mfMixt
1013  prhs => pregion%mixt%rhs
1014  psd => pregion%mixt%sd
1015 
1016 #ifdef SPEC
1017  pcvspec => pregion%spec%cv
1018  pgcspec => pregion%spec%gradCell
1019 #endif
1020 
1021  IF ( pregion%spec%cvState /= cv_mixt_state_cons ) THEN
1022  CALL errorstop(global,err_cv_state_invalid,__line__)
1023  END IF ! pRegion%spec%cvState
1024 
1025  IF ( pregion%mixtInput%gasModel /= gas_model_mixt_tcperf ) THEN
1026  CALL errorstop(global,err_gasmodel_invalid,__line__)
1027  END IF ! pRegion%mixtInput%gasModel
1028 
1029  IF ( (indcp /= 1) .OR. (indmol /= 1) ) THEN
1030  CALL errorstop(global,err_reached_default,__line__)
1031  END IF ! indCp
1032 
1033 ! ******************************************************************************
1034 ! Compute fluxes through interior faces
1035 ! ******************************************************************************
1036 
1037  DO ifg = 1,pgrid%nFaces
1038  c1 = pgrid%f2c(1,ifg)
1039  c2 = pgrid%f2c(2,ifg)
1040 
1041 ! ==============================================================================
1042 ! Get face geometry and grid speed
1043 ! ==============================================================================
1044 
1045  nx = pgrid%fn(xcoord,ifg)
1046  ny = pgrid%fn(ycoord,ifg)
1047  nz = pgrid%fn(zcoord,ifg)
1048  nm = pgrid%fn(xyzmag,ifg)
1049 
1050  xc = pgrid%fc(xcoord,ifg)
1051  yc = pgrid%fc(ycoord,ifg)
1052  zc = pgrid%fc(zcoord,ifg)
1053 
1054  fs = pgrid%gs(indgs*ifg)
1055 
1056 ! ==============================================================================
1057 ! Compute left and right states
1058 ! ==============================================================================
1059 
1060 ! ------------------------------------------------------------------------------
1061 ! Left state
1062 ! ------------------------------------------------------------------------------
1063 
1064  rl = pcv(cv_mixt_dens,c1)
1065  irl = 1.0_rfreal/rl
1066 
1067  dx = xc - pgrid%cofg(xcoord,c1)
1068  dy = yc - pgrid%cofg(ycoord,c1)
1069  dz = zc - pgrid%cofg(zcoord,c1)
1070 
1071 #ifdef SPEC
1072  mml = 0.0_rfreal
1073  cpl = 0.0_rfreal
1074 
1075  DO ispec = 1,pregion%specInput%nSpecies
1076  pspectype => pregion%specInput%specType(ispec)
1077 
1078  y1 = irl*pcvspec(ispec,c1) + pgcspec(xcoord,ispec,c1)*dx &
1079  + pgcspec(ycoord,ispec,c1)*dy &
1080  + pgcspec(zcoord,ispec,c1)*dz
1081 
1082  mml = mml + y1/pspectype%pMaterial%molw
1083  cpl = cpl + y1*pspectype%pMaterial%spht
1084  END DO ! iSpec
1085 
1086  mml = 1.0_rfreal/mml
1087  gcl = mixtperf_r_m(mml)
1088  gl = mixtperf_g_cpr(cpl,gcl)
1089 #endif
1090 
1091  ul = pcv(cv_mixt_xmom,c1)*irl
1092  vl = pcv(cv_mixt_ymom,c1)*irl
1093  wl = pcv(cv_mixt_zmom,c1)*irl
1094  pl = pdv(dv_mixt_pres,c1)
1095 
1096  rl = rl + pgc(xcoord,grc_mixt_dens,c1)*dx &
1097  + pgc(ycoord,grc_mixt_dens,c1)*dy &
1098  + pgc(zcoord,grc_mixt_dens,c1)*dz
1099  ul = ul + pgc(xcoord,grc_mixt_xvel,c1)*dx &
1100  + pgc(ycoord,grc_mixt_xvel,c1)*dy &
1101  + pgc(zcoord,grc_mixt_xvel,c1)*dz
1102  vl = vl + pgc(xcoord,grc_mixt_yvel,c1)*dx &
1103  + pgc(ycoord,grc_mixt_yvel,c1)*dy &
1104  + pgc(zcoord,grc_mixt_yvel,c1)*dz
1105  wl = wl + pgc(xcoord,grc_mixt_zvel,c1)*dx &
1106  + pgc(ycoord,grc_mixt_zvel,c1)*dy &
1107  + pgc(zcoord,grc_mixt_zvel,c1)*dz
1108  pl = pl + pgc(xcoord,grc_mixt_pres,c1)*dx &
1109  + pgc(ycoord,grc_mixt_pres,c1)*dy &
1110  + pgc(zcoord,grc_mixt_pres,c1)*dz
1111 
1112  tl = mixtperf_t_dpr(rl,pl,gcl)
1113  al = mixtperf_c_grt(gl,gcl,tl)
1114  hl = mixtperf_ho_cptuvw(cpl,tl,ul,vl,wl)
1115 
1116 ! ------------------------------------------------------------------------------
1117 ! Right state
1118 ! ------------------------------------------------------------------------------
1119 
1120  rr = pcv(cv_mixt_dens,c2)
1121  irr = 1.0_rfreal/rr
1122 
1123  dx = xc - pgrid%cofg(xcoord,c2)
1124  dy = yc - pgrid%cofg(ycoord,c2)
1125  dz = zc - pgrid%cofg(zcoord,c2)
1126 
1127 #ifdef SPEC
1128  mmr = 0.0_rfreal
1129  cpr = 0.0_rfreal
1130 
1131 
1132  DO ispec = 1,pregion%specInput%nSpecies
1133  pspectype => pregion%specInput%specType(ispec)
1134 
1135  y2 = irr*pcvspec(ispec,c2) + pgcspec(xcoord,ispec,c2)*dx &
1136  + pgcspec(ycoord,ispec,c2)*dy &
1137  + pgcspec(zcoord,ispec,c2)*dz
1138 
1139 
1140  mmr = mmr + y2/pspectype%pMaterial%molw
1141  cpr = cpr + y2*pspectype%pMaterial%spht
1142  END DO ! iSpec
1143 
1144  mmr = 1.0_rfreal/mmr
1145  gcr = mixtperf_r_m(mmr)
1146  gr = mixtperf_g_cpr(cpr,gcr)
1147 #endif
1148 
1149  ur = pcv(cv_mixt_xmom,c2)*irr
1150  vr = pcv(cv_mixt_ymom,c2)*irr
1151  wr = pcv(cv_mixt_zmom,c2)*irr
1152  pr = pdv(dv_mixt_pres,c2)
1153 
1154  rr = rr + pgc(xcoord,grc_mixt_dens,c2)*dx &
1155  + pgc(ycoord,grc_mixt_dens,c2)*dy &
1156  + pgc(zcoord,grc_mixt_dens,c2)*dz
1157  ur = ur + pgc(xcoord,grc_mixt_xvel,c2)*dx &
1158  + pgc(ycoord,grc_mixt_xvel,c2)*dy &
1159  + pgc(zcoord,grc_mixt_xvel,c2)*dz
1160  vr = vr + pgc(xcoord,grc_mixt_yvel,c2)*dx &
1161  + pgc(ycoord,grc_mixt_yvel,c2)*dy &
1162  + pgc(zcoord,grc_mixt_yvel,c2)*dz
1163  wr = wr + pgc(xcoord,grc_mixt_zvel,c2)*dx &
1164  + pgc(ycoord,grc_mixt_zvel,c2)*dy &
1165  + pgc(zcoord,grc_mixt_zvel,c2)*dz
1166  pr = pr + pgc(xcoord,grc_mixt_pres,c2)*dx &
1167  + pgc(ycoord,grc_mixt_pres,c2)*dy &
1168  + pgc(zcoord,grc_mixt_pres,c2)*dz
1169 
1170  tr = mixtperf_t_dpr(rr,pr,gcr)
1171  ar = mixtperf_c_grt(gr,gcr,tr)
1172  hr = mixtperf_ho_cptuvw(cpr,tr,ur,vr,wr)
1173 
1174 ! ==============================================================================
1175 ! Compute fluxes
1176 ! ==============================================================================
1177 
1178  CALL rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,hl,al,rr,ur,vr, &
1179  wr,pr,hr,ar,flx,vf)
1180 
1181 ! ==============================================================================
1182 ! Store mass flux
1183 ! ==============================================================================
1184 
1185  pmf(indmf*ifg) = flx(1)
1186 
1187 ! ==============================================================================
1188 ! Accumulate into residual
1189 ! ==============================================================================
1190 
1191  prhs(cv_mixt_dens,c1) = prhs(cv_mixt_dens,c1) + flx(1)
1192  prhs(cv_mixt_xmom,c1) = prhs(cv_mixt_xmom,c1) + flx(2)
1193  prhs(cv_mixt_ymom,c1) = prhs(cv_mixt_ymom,c1) + flx(3)
1194  prhs(cv_mixt_zmom,c1) = prhs(cv_mixt_zmom,c1) + flx(4)
1195  prhs(cv_mixt_ener,c1) = prhs(cv_mixt_ener,c1) + flx(5)
1196 
1197  prhs(cv_mixt_dens,c2) = prhs(cv_mixt_dens,c2) - flx(1)
1198  prhs(cv_mixt_xmom,c2) = prhs(cv_mixt_xmom,c2) - flx(2)
1199  prhs(cv_mixt_ymom,c2) = prhs(cv_mixt_ymom,c2) - flx(3)
1200  prhs(cv_mixt_zmom,c2) = prhs(cv_mixt_zmom,c2) - flx(4)
1201  prhs(cv_mixt_ener,c2) = prhs(cv_mixt_ener,c2) - flx(5)
1202 
1203 ! ==============================================================================
1204 ! Accumulate into substantial derivative
1205 ! ==============================================================================
1206 
1207  psd(sd_xmom,c1*indsd) = psd(sd_xmom,c1*indsd) + vf(1)*flx(1)
1208  psd(sd_ymom,c1*indsd) = psd(sd_ymom,c1*indsd) + vf(2)*flx(1)
1209  psd(sd_zmom,c1*indsd) = psd(sd_zmom,c1*indsd) + vf(3)*flx(1)
1210 
1211  psd(sd_xmom,c2*indsd) = psd(sd_xmom,c2*indsd) - vf(1)*flx(1)
1212  psd(sd_ymom,c2*indsd) = psd(sd_ymom,c2*indsd) - vf(2)*flx(1)
1213  psd(sd_zmom,c2*indsd) = psd(sd_zmom,c2*indsd) - vf(3)*flx(1)
1214  END DO ! ifg
1215 
1216 ! ******************************************************************************
1217 ! Compute fluxes through boundary faces
1218 ! ******************************************************************************
1219 
1220  DO ipatch = 1,pregion%grid%nPatches
1221  ppatch => pregion%patches(ipatch)
1222 
1223  SELECT CASE ( ppatch%spaceOrder )
1224  CASE ( 1 )
1225  CALL rflu_centralfirstpatch(pregion,ppatch)
1226  CASE ( 2 )
1227  CALL rflu_centralsecondpatch(pregion,ppatch)
1228  CASE default
1229  CALL errorstop(global,err_reached_default,__line__)
1230  END SELECT ! pPatch%spaceOrder
1231  END DO ! iPatch
1232 
1233 ! ******************************************************************************
1234 ! End
1235 ! ******************************************************************************
1236 
1237 #ifdef ROCPROF
1238  CALL fprofiler_ends("RFLU::AUSM_ComputeFlux2_MTCP")
1239 #endif
1240 
1241  CALL deregisterfunction(global)
1242 
1243 END SUBROUTINE rflu_ausm_computeflux2_mtcp
1244 
1245 
1246 
1247 
1248 
1249 
1250 
1251 
1252 ! ******************************************************************************
1253 !
1254 ! Purpose: Compute convective fluxes using second-order accurate AUSM+ scheme
1255 ! for thermally and calorically perfect gas.
1256 !
1257 ! Description: None.
1258 !
1259 ! Input:
1260 ! pRegion Pointer to region
1261 !
1262 ! Output: None.
1263 !
1264 ! Notes:
1265 ! 1. Only applicable to thermally and calorically perfect gas because would
1266 ! need to recompute mixture properties at faces depending on face states.
1267 !
1268 ! ******************************************************************************
1269 
1270 SUBROUTINE rflu_ausm_computeflux2_tcp(pRegion)
1271 
1272  USE modinterfaces, ONLY: mixtperf_c_grt, &
1273  mixtperf_ho_cptuvw, &
1274  mixtperf_r_cpg, &
1275  mixtperf_t_dpr, &
1278 
1279  IMPLICIT NONE
1280 
1281 ! ******************************************************************************
1282 ! Definitions and declarations
1283 ! ******************************************************************************
1284 
1285 ! ==============================================================================
1286 ! Arguments
1287 ! ==============================================================================
1288 
1289  TYPE(t_region), POINTER :: pregion
1290 
1291 ! ==============================================================================
1292 ! Locals
1293 ! ==============================================================================
1294 
1295  INTEGER :: c1,c2,ifg,indgs,indmf,indsd,ipatch
1296  REAL(RFREAL) :: al,ar,cp,dx,dy,dz,fs,gc,g,hl,hr,irl,irr,nm,nx,ny,nz,pl,pr, &
1297  rl,rr,tl,tr,ul,ur,vl,vr,wl,wr,xc,yc,zc
1298  REAL(RFREAL) :: flx(5),vf(3)
1299  REAL(RFREAL), DIMENSION(:), POINTER :: pmf
1300  REAL(RFREAL), DIMENSION(:,:), POINTER :: pcv,pdv,prhs,psd
1301  REAL(RFREAL), DIMENSION(:,:,:), POINTER :: pgc
1302  TYPE(t_global), POINTER :: global
1303  TYPE(t_grid), POINTER :: pgrid
1304  TYPE(t_patch), POINTER :: ppatch
1305 
1306 ! ******************************************************************************
1307 ! Start
1308 ! ******************************************************************************
1309 
1310  global => pregion%global
1311 
1312  CALL registerfunction(global,'RFLU_AUSM_ComputeFlux2_TCP',&
1313  'RFLU_ModAUSMFlux.F90')
1314 
1315 #ifdef ROCPROF
1316  CALL fprofiler_begins("RFLU::AUSM_ComputeFlux2_TCP")
1317 #endif
1318 
1319 ! ******************************************************************************
1320 ! Set dimensions and pointers
1321 ! ******************************************************************************
1322 
1323  pgrid => pregion%grid
1324 
1325  indgs = pgrid%indGs
1326 
1327  indmf = pregion%mixtInput%indMfMixt
1328  indsd = pregion%mixtInput%indSd
1329 
1330  pcv => pregion%mixt%cv
1331  pdv => pregion%mixt%dv
1332 
1333  pgc => pregion%mixt%gradCell
1334  pmf => pregion%mixt%mfMixt
1335  prhs => pregion%mixt%rhs
1336  psd => pregion%mixt%sd
1337 
1338  IF ( pregion%mixtInput%gasModel /= gas_model_tcperf ) THEN
1339  CALL errorstop(global,err_gasmodel_invalid,__line__)
1340  END IF ! pRegion%mixtInput%gasModel
1341 
1342  cp = global%refCp
1343  g = global%refGamma
1344  gc = mixtperf_r_cpg(cp,g)
1345 
1346 ! ******************************************************************************
1347 ! Compute fluxes through interior faces
1348 ! ******************************************************************************
1349 
1350  DO ifg = 1,pgrid%nFaces
1351  c1 = pgrid%f2c(1,ifg)
1352  c2 = pgrid%f2c(2,ifg)
1353 
1354 ! ==============================================================================
1355 ! Get face geometry and grid speed
1356 ! ==============================================================================
1357 
1358  nx = pgrid%fn(xcoord,ifg)
1359  ny = pgrid%fn(ycoord,ifg)
1360  nz = pgrid%fn(zcoord,ifg)
1361  nm = pgrid%fn(xyzmag,ifg)
1362 
1363  xc = pgrid%fc(xcoord,ifg)
1364  yc = pgrid%fc(ycoord,ifg)
1365  zc = pgrid%fc(zcoord,ifg)
1366 
1367  fs = pgrid%gs(indgs*ifg)
1368 
1369 ! ==============================================================================
1370 ! Compute left and right states
1371 ! ==============================================================================
1372 
1373 ! ------------------------------------------------------------------------------
1374 ! Left state
1375 ! ------------------------------------------------------------------------------
1376 
1377  rl = pcv(cv_mixt_dens,c1)
1378  irl = 1.0_rfreal/rl
1379 
1380  ul = pcv(cv_mixt_xmom,c1)*irl
1381  vl = pcv(cv_mixt_ymom,c1)*irl
1382  wl = pcv(cv_mixt_zmom,c1)*irl
1383  pl = pdv(dv_mixt_pres,c1)
1384 
1385  dx = xc - pgrid%cofg(xcoord,c1)
1386  dy = yc - pgrid%cofg(ycoord,c1)
1387  dz = zc - pgrid%cofg(zcoord,c1)
1388 
1389  rl = rl + pgc(xcoord,grc_mixt_dens,c1)*dx &
1390  + pgc(ycoord,grc_mixt_dens,c1)*dy &
1391  + pgc(zcoord,grc_mixt_dens,c1)*dz
1392  ul = ul + pgc(xcoord,grc_mixt_xvel,c1)*dx &
1393  + pgc(ycoord,grc_mixt_xvel,c1)*dy &
1394  + pgc(zcoord,grc_mixt_xvel,c1)*dz
1395  vl = vl + pgc(xcoord,grc_mixt_yvel,c1)*dx &
1396  + pgc(ycoord,grc_mixt_yvel,c1)*dy &
1397  + pgc(zcoord,grc_mixt_yvel,c1)*dz
1398  wl = wl + pgc(xcoord,grc_mixt_zvel,c1)*dx &
1399  + pgc(ycoord,grc_mixt_zvel,c1)*dy &
1400  + pgc(zcoord,grc_mixt_zvel,c1)*dz
1401  pl = pl + pgc(xcoord,grc_mixt_pres,c1)*dx &
1402  + pgc(ycoord,grc_mixt_pres,c1)*dy &
1403  + pgc(zcoord,grc_mixt_pres,c1)*dz
1404 
1405  tl = mixtperf_t_dpr(rl,pl,gc)
1406  al = mixtperf_c_grt(g,gc,tl)
1407  hl = mixtperf_ho_cptuvw(cp,tl,ul,vl,wl)
1408 
1409 ! ------------------------------------------------------------------------------
1410 ! Right state
1411 ! ------------------------------------------------------------------------------
1412 
1413  rr = pcv(cv_mixt_dens,c2)
1414  irr = 1.0_rfreal/rr
1415 
1416  ur = pcv(cv_mixt_xmom,c2)*irr
1417  vr = pcv(cv_mixt_ymom,c2)*irr
1418  wr = pcv(cv_mixt_zmom,c2)*irr
1419  pr = pdv(dv_mixt_pres,c2)
1420 
1421  dx = xc - pgrid%cofg(xcoord,c2)
1422  dy = yc - pgrid%cofg(ycoord,c2)
1423  dz = zc - pgrid%cofg(zcoord,c2)
1424 
1425  rr = rr + pgc(xcoord,grc_mixt_dens,c2)*dx &
1426  + pgc(ycoord,grc_mixt_dens,c2)*dy &
1427  + pgc(zcoord,grc_mixt_dens,c2)*dz
1428  ur = ur + pgc(xcoord,grc_mixt_xvel,c2)*dx &
1429  + pgc(ycoord,grc_mixt_xvel,c2)*dy &
1430  + pgc(zcoord,grc_mixt_xvel,c2)*dz
1431  vr = vr + pgc(xcoord,grc_mixt_yvel,c2)*dx &
1432  + pgc(ycoord,grc_mixt_yvel,c2)*dy &
1433  + pgc(zcoord,grc_mixt_yvel,c2)*dz
1434  wr = wr + pgc(xcoord,grc_mixt_zvel,c2)*dx &
1435  + pgc(ycoord,grc_mixt_zvel,c2)*dy &
1436  + pgc(zcoord,grc_mixt_zvel,c2)*dz
1437  pr = pr + pgc(xcoord,grc_mixt_pres,c2)*dx &
1438  + pgc(ycoord,grc_mixt_pres,c2)*dy &
1439  + pgc(zcoord,grc_mixt_pres,c2)*dz
1440 
1441  tr = mixtperf_t_dpr(rr,pr,gc)
1442  ar = mixtperf_c_grt(g,gc,tr)
1443  hr = mixtperf_ho_cptuvw(cp,tr,ur,vr,wr)
1444 
1445 ! ==============================================================================
1446 ! Compute fluxes
1447 ! ==============================================================================
1448 
1449  CALL rflu_ausm_fluxfunction(nx,ny,nz,nm,fs,rl,ul,vl,wl,pl,hl,al,rr,ur,vr, &
1450  wr,pr,hr,ar,flx,vf)
1451 
1452 ! ==============================================================================
1453 ! Store mass flux
1454 ! ==============================================================================
1455 
1456  pmf(indmf*ifg) = flx(1)
1457 
1458 ! ==============================================================================
1459 ! Accumulate into residual
1460 ! ==============================================================================
1461 
1462  prhs(cv_mixt_dens,c1) = prhs(cv_mixt_dens,c1) + flx(1)
1463  prhs(cv_mixt_xmom,c1) = prhs(cv_mixt_xmom,c1) + flx(2)
1464  prhs(cv_mixt_ymom,c1) = prhs(cv_mixt_ymom,c1) + flx(3)
1465  prhs(cv_mixt_zmom,c1) = prhs(cv_mixt_zmom,c1) + flx(4)
1466  prhs(cv_mixt_ener,c1) = prhs(cv_mixt_ener,c1) + flx(5)
1467 
1468  prhs(cv_mixt_dens,c2) = prhs(cv_mixt_dens,c2) - flx(1)
1469  prhs(cv_mixt_xmom,c2) = prhs(cv_mixt_xmom,c2) - flx(2)
1470  prhs(cv_mixt_ymom,c2) = prhs(cv_mixt_ymom,c2) - flx(3)
1471  prhs(cv_mixt_zmom,c2) = prhs(cv_mixt_zmom,c2) - flx(4)
1472  prhs(cv_mixt_ener,c2) = prhs(cv_mixt_ener,c2) - flx(5)
1473 
1474 ! ==============================================================================
1475 ! Accumulate into substantial derivative
1476 ! ==============================================================================
1477 
1478  psd(sd_xmom,c1*indsd) = psd(sd_xmom,c1*indsd) + vf(1)*flx(1)
1479  psd(sd_ymom,c1*indsd) = psd(sd_ymom,c1*indsd) + vf(2)*flx(1)
1480  psd(sd_zmom,c1*indsd) = psd(sd_zmom,c1*indsd) + vf(3)*flx(1)
1481 
1482  psd(sd_xmom,c2*indsd) = psd(sd_xmom,c2*indsd) - vf(1)*flx(1)
1483  psd(sd_ymom,c2*indsd) = psd(sd_ymom,c2*indsd) - vf(2)*flx(1)
1484  psd(sd_zmom,c2*indsd) = psd(sd_zmom,c2*indsd) - vf(3)*flx(1)
1485  END DO ! ifg
1486 
1487 ! ******************************************************************************
1488 ! Compute fluxes through boundary faces
1489 ! ******************************************************************************
1490 
1491  DO ipatch = 1,pregion%grid%nPatches
1492  ppatch => pregion%patches(ipatch)
1493 
1494  SELECT CASE ( ppatch%spaceOrder )
1495  CASE ( 1 )
1496  CALL rflu_centralfirstpatch(pregion,ppatch)
1497  CASE ( 2 )
1498  CALL rflu_centralsecondpatch(pregion,ppatch)
1499  CASE default
1500  CALL errorstop(global,err_reached_default,__line__)
1501  END SELECT ! pPatch%spaceOrder
1502  END DO ! iPatch
1503 
1504 ! ******************************************************************************
1505 ! End
1506 ! ******************************************************************************
1507 
1508 #ifdef ROCPROF
1509  CALL fprofiler_ends("RFLU::AUSM_ComputeFlux2_TCP")
1510 #endif
1511 
1512  CALL deregisterfunction(global)
1513 
1514 END SUBROUTINE rflu_ausm_computeflux2_tcp
1515 
1516 
1517 
1518 
1519 
1520 
1521 
1522 ! ******************************************************************************
1523 ! End
1524 ! ******************************************************************************
1525 
1526 END MODULE rflu_modausmflux
1527 
1528 
1529 ! ******************************************************************************
1530 !
1531 ! RCS Revision history:
1532 !
1533 ! $Log: RFLU_ModAUSMFlux.F90,v $
1534 ! Revision 1.11 2008/12/06 08:44:20 mtcampbe
1535 ! Updated license.
1536 !
1537 ! Revision 1.10 2008/11/19 22:17:31 mtcampbe
1538 ! Added Illinois Open Source License/Copyright
1539 !
1540 ! Revision 1.9 2006/05/01 22:20:28 haselbac
1541 ! Removed debug statements
1542 !
1543 ! Revision 1.8 2006/05/01 21:00:47 haselbac
1544 ! Rewrite for consistency and cleanliness
1545 !
1546 ! Revision 1.7 2006/04/15 16:58:42 haselbac
1547 ! Added capability of running 1st order boundary fluxes with 2nd order volume
1548 ! fluxes
1549 !
1550 ! Revision 1.6 2006/04/07 15:19:18 haselbac
1551 ! Removed tabs
1552 !
1553 ! Revision 1.5 2005/11/15 17:25:07 haselbac
1554 ! Bug fix: Missing declarations lead to compilation failure without SPEC=1
1555 !
1556 ! Revision 1.4 2005/11/14 16:58:05 haselbac
1557 ! Added flux for pseudo-gas, reordered routines
1558 !
1559 ! Revision 1.3 2005/11/10 02:26:06 haselbac
1560 ! Complete rewrite to allow for computations with variable properties
1561 !
1562 ! Revision 1.2 2005/07/19 20:06:29 haselbac
1563 ! Modified af to prevent crashes for Skews problem
1564 !
1565 ! Revision 1.1 2005/07/14 21:39:02 haselbac
1566 ! Initial revision
1567 !
1568 ! ******************************************************************************
1569 
1570 
1571 
1572 
1573 
1574 
1575 
1576 
1577 
1578 
1579 
1580 
1581 
subroutine rflu_centralsecondpatch(pRegion, pPatch)
real(rfreal) function mixtperf_r_m(M)
Definition: MixtPerf_R.F90:54
subroutine rflu_ausm_computeflux2_mtcp(pRegion)
subroutine rflu_ausm_computeflux1(pRegion)
NT dx
subroutine registerfunction(global, funName, fileName)
Definition: ModError.F90:449
subroutine rflu_ausm_fluxfunction(nx, ny, nz, nm, fs, rl, ul, vl, wl, pl, Hl, al, rr, ur, vr, wr, pr, Hr, ar, flx, vf)
real(rfreal) function mixtperf_r_cpg(Cp, G)
Definition: MixtPerf_R.F90:39
real(rfreal) function mixtperf_ho_cptuvw(Cp, T, U, V, W)
Definition: MixtPerf_H.F90:39
real(rfreal) function mixtperf_m_r(R)
Definition: MixtPerf_M.F90:39
real(rfreal) function mixtperf_t_dpr(D, P, R)
Definition: MixtPerf_T.F90:85
subroutine, public rflu_ausm_computeflux(pRegion)
subroutine rflu_ausm_computeflux2_mpsd(pRegion)
RT dz() const
Definition: Direction_3.h:133
real(rfreal) function mixtperf_c_grt(G, R, T)
Definition: MixtPerf_C.F90:86
NT dy
subroutine rflu_centralfirstpatch(pRegion, pPatch)
subroutine rflu_ausm_computeflux2_tcp(pRegion)
subroutine errorstop(global, errorCode, errorLine, addMessage)
Definition: ModError.F90:483
subroutine deregisterfunction(global)
Definition: ModError.F90:469
real(rfreal) function mixtperf_g_cpr(Cp, R)
Definition: MixtPerf_G.F90:39
unsigned char g() const
Definition: Color.h:69