@@ -52,9 +52,12 @@ end subroutine computeBoundaryFluxF
5252
5353 character (len= LINE_LENGTH), parameter :: viscousDiscretizationKey = " viscous discretization"
5454 character (len= LINE_LENGTH), parameter :: CHDiscretizationKey = " cahn-hilliard discretization"
55+ character (len= LINE_LENGTH), parameter :: FLUID1_COMPRESSIBILITY_KEY = " fluid 1 sound speed square (m/s)"
56+
5557
5658 real (kind= RP), protected :: IMEX_S0 = 0.0_RP
5759 real (kind= RP), protected :: IMEX_K0 = 1.0_RP
60+ logical :: use_non_constant_speed_of_sound = .false.
5861!
5962! ========
6063 CONTAINS
@@ -188,6 +191,13 @@ subroutine Initialize_SpaceAndTimeMethods(controlVariables, mesh)
188191
189192 end select
190193
194+ use_non_constant_speed_of_sound = controlVariables % ContainsKey(FLUID1_COMPRESSIBILITY_KEY)
195+ if (use_non_constant_speed_of_sound) then
196+ write (STD_OUT,' (A)' ) " Implementing artificial compressibility with a non-constant speed of sound in each phase"
197+ else
198+ write (STD_OUT,' (A)' ) " Implementing artificial compressibility with a constant speed of sound in each phase"
199+ endif
200+
191201 call CHDiscretization % Construct(controlVariables, ELLIPTIC_CH)
192202 call CHDiscretization % Describe
193203
@@ -448,7 +458,7 @@ SUBROUTINE ComputeTimeDerivative( mesh, particles, time, mode, HO_Elements, elem
448458#endif
449459!
450460! -------------------------------------
451- ! Get the density in faces and elements
461+ ! Get the density and invMa2 in faces and elements
452462! -------------------------------------
453463!
454464! $omp do schedule(runtime)
@@ -459,9 +469,17 @@ SUBROUTINE ComputeTimeDerivative( mesh, particles, time, mode, HO_Elements, elem
459469 if (compute_element) then
460470
461471 mesh % elements(eID) % storage % rho = dimensionless % rho(2 ) + (dimensionless % rho(1 )- dimensionless % rho(2 ))* mesh % elements(eID) % storage % Q(IMC,:,:,:)
462-
463472 mesh % elements(eID) % storage % rho = min (max (mesh % elements(eID) % storage % rho, dimensionless % rho_min),dimensionless % rho_max)
473+
474+ if (use_non_constant_speed_of_sound ) then
475+ mesh % elements(eID) % storage % invMa2 = (sqrt (dimensionless % invMa2(1 )/ dimensionless % rho(1 )) * min (max (mesh % elements(eID) % storage % Q(IMC,:,:,:),0.0_RP ),1.0_RP ) + sqrt (dimensionless % invMa2(2 )/ dimensionless % rho(2 )) * (1.0_RP - min (max (mesh % elements(eID) % storage % Q(IMC,:,:,:),0.0_RP ),1.0_RP )))** 2
476+ mesh % elements(eID) % storage % invMa2 = mesh % elements(eID) % storage % invMa2* mesh % elements(eID) % storage % rho
477+ else
478+ mesh % elements(eID) % storage % invMa2 = dimensionless % invMa2(1 )
479+ endif
480+
464481 endif
482+
465483 end do
466484! $omp end do nowait
467485
@@ -477,6 +495,20 @@ SUBROUTINE ComputeTimeDerivative( mesh, particles, time, mode, HO_Elements, elem
477495
478496 mesh % faces(fID) % storage(1 ) % rho = min (max (mesh % faces(fID) % storage(1 ) % rho, dimensionless % rho_min),dimensionless % rho_max)
479497 mesh % faces(fID) % storage(2 ) % rho = min (max (mesh % faces(fID) % storage(2 ) % rho, dimensionless % rho_min),dimensionless % rho_max)
498+
499+
500+ if (use_non_constant_speed_of_sound ) then
501+ mesh % faces(fID) % storage(1 ) % invMa2 = (sqrt (dimensionless % invMa2(1 )/ dimensionless % rho(1 )) * min (max (mesh % faces(fID) % storage(1 ) % Q(IMC,:,:),0.0_RP ),1.0_RP ) + sqrt (dimensionless % invMa2(2 )/ dimensionless % rho(2 )) * (1.0_RP - min (max (mesh % faces(fID) % storage(1 ) % Q(IMC,:,:),0.0_RP ),1.0_RP )))** 2
502+ mesh % faces(fID) % storage(2 ) % invMa2 = (sqrt (dimensionless % invMa2(1 )/ dimensionless % rho(1 )) * min (max (mesh % faces(fID) % storage(2 ) % Q(IMC,:,:),0.0_RP ),1.0_RP ) + sqrt (dimensionless % invMa2(2 )/ dimensionless % rho(2 )) * (1.0_RP - min (max (mesh % faces(fID) % storage(2 ) % Q(IMC,:,:),0.0_RP ),1.0_RP )))** 2
503+
504+ mesh % faces(fID) % storage(1 ) % invMa2 = mesh % faces(fID) % storage(1 ) % invMa2* mesh % faces(fID) % storage(1 ) % rho
505+ mesh % faces(fID) % storage(2 ) % invMa2 = mesh % faces(fID) % storage(2 ) % invMa2* mesh % faces(fID) % storage(2 ) % rho
506+
507+ else
508+ mesh % faces(fID) % storage(1 ) % invMa2 = dimensionless % invMa2(1 )
509+ mesh % faces(fID) % storage(2 ) % invMa2 = dimensionless % invMa2(2 )
510+ endif
511+
480512 endif
481513 end do
482514! $omp end do
@@ -511,7 +543,9 @@ SUBROUTINE ComputeTimeDerivative( mesh, particles, time, mode, HO_Elements, elem
511543 associate(e = > mesh % elements(eID))
512544 do k = 0 , e % Nxyz(3 ) ; do j = 0 , e % Nxyz(2 ) ; do i = 0 , e % Nxyz(1 )
513545 sqrtRho = sqrt (e % storage % rho(i,j,k))
514- invMa2 = dimensionless % invMa2(1 ) * min (max (e % storage % Q(IMC,i,j,k),0.0_RP ),1.0_RP ) + dimensionless % invMa2(2 ) * (1.0_RP - min (max (e % storage % Q(IMC,i,j,k),0.0_RP ),1.0_RP ))
546+
547+ invMa2 = e % storage % invMa2(i,j,k)
548+
515549 e % storage % QDot(IMC,i,j,k) = 0.0_RP
516550 e % storage % QDot(IMSQRHOU,i,j,k) = - 0.5_RP * sqrtRho* ( e % storage % Q(IMSQRHOU,i,j,k)* e % storage % U_x(IGU,i,j,k) &
517551 + e % storage % Q(IMSQRHOV,i,j,k)* e % storage % U_y(IGU,i,j,k) &
@@ -1094,7 +1128,9 @@ SUBROUTINE computeElementInterfaceFlux_MU(f)
10941128 t1 = f % geom % t1(:,i,j), &
10951129 t2 = f % geom % t2(:,i,j), &
10961130 fL = inv_fluxL(:,i,j), &
1097- fR = inv_fluxR(:,i,j) )
1131+ fR = inv_fluxR(:,i,j), &
1132+ invMa2L= f % storage(1 ) % invMa2(i,j), &
1133+ invMa2R= f % storage(2 ) % invMa2(i,j))
10981134
10991135
11001136!
@@ -1190,7 +1226,9 @@ SUBROUTINE computeMPIFaceFlux_MU(f)
11901226 t1 = f % geom % t1(:,i,j), &
11911227 t2 = f % geom % t2(:,i,j), &
11921228 fL = inv_fluxL(:,i,j), &
1193- fR = inv_fluxR(:,i,j) )
1229+ fR = inv_fluxR(:,i,j),&
1230+ invMa2L= f % storage(1 ) % invMa2(i,j), &
1231+ invMa2R= f % storage(2 ) % invMa2(i,j))
11941232
11951233
11961234!
@@ -1293,7 +1331,9 @@ SUBROUTINE computeBoundaryFlux_MU(f, time)
12931331 t1 = f % geom % t1(:,i,j), &
12941332 t2 = f % geom % t2(:,i,j), &
12951333 fL = inv_fluxL, &
1296- fR = inv_fluxR )
1334+ fR = inv_fluxR,&
1335+ invMa2L= f % storage(1 ) % invMa2(i,j), &
1336+ invMa2R= f % storage(2 ) % invMa2(i,j))
12971337
12981338 fStar(:,i,j) = (inv_fluxL - visc_flux(:,i,j) ) * f % geom % jacobian(i,j)
12991339 end do
0 commit comments