@@ -51,6 +51,7 @@ module StatisticsMonitor
5151 real (kind= RP) :: starting_time
5252 integer :: no_of_samples
5353 logical :: saveGradients
54+ logical :: saveLambVector
5455 contains
5556 procedure :: Construct = > StatisticsMonitor_Construct
5657 procedure :: Update = > StatisticsMonitor_Update
@@ -67,23 +68,23 @@ module StatisticsMonitor
6768!
6869! //////////////////////////////////////////////////////////////////////////////////
6970!
70- subroutine StatisticsMonitor_Construct (self , mesh , saveGradients )
71+ subroutine StatisticsMonitor_Construct (self , mesh , saveGradients , saveLambVector )
7172 use ParamfileRegions
7273 use PhysicsStorage, only: NCONS, NGRAD
73- use HexMeshClass, only: no_of_stats_variables
7474 implicit none
7575 class(StatisticsMonitor_t) :: self
7676 class(HexMesh) :: mesh
77- logical , intent (in ) :: saveGradients
77+ logical , intent (in ) :: saveGradients, saveLambVector
7878 integer , allocatable :: Nsample, i0, Ndump, Nreset
7979 real (kind= RP), allocatable :: t0
8080 integer :: eID
8181 character (len= LINE_LENGTH) :: paramFile
8282
8383 NO_OF_VARIABLES = NO_OF_VARIABLES_Sij + NCONS
8484 self % saveGradients = saveGradients
85+ self % saveLambVector = saveLambVector
8586 if (saveGradients) NO_OF_VARIABLES = NO_OF_VARIABLES + NGRAD * NDIM
86- no_of_stats_variables = NO_OF_VARIABLES
87+ if (saveLambVector) NO_OF_VARIABLES = NO_OF_VARIABLES + NDIM
8788!
8889! Search for the parameters in the case file
8990! ------------------------------------------
@@ -168,7 +169,11 @@ subroutine StatisticsMonitor_WriteFile(self, mesh, iter, t, solution_file)
168169 character (len= LINE_LENGTH) :: fileName
169170
170171 write (fileName,' (A,A)' ) trim (solution_file),' .stats.hsol'
171- if ( self % state .ne. OFF) call mesh % SaveStatistics(iter, t, trim (fileName), self % saveGradients)
172+ if ( self % state .ne. OFF) then
173+ call mesh % SaveStatistics(iter, t, trim (fileName), self % saveGradients)
174+ write (fileName,' (A,A)' ) trim (solution_file),' .Lamb.stats.hsol'
175+ if (self % saveLambVector) call mesh % SaveLambVectorStatistics(iter, t, trim (fileName), self % saveGradients)
176+ end if
172177
173178 end subroutine StatisticsMonitor_WriteFile
174179
@@ -225,6 +230,7 @@ end subroutine StatisticsMonitor_Update
225230
226231 subroutine StatisticsMonitor_UpdateValues (self , mesh )
227232 use PhysicsStorage
233+ use MappedGeometryClass, only: vCross, ComputeVorticity
228234 implicit none
229235 class(StatisticsMonitor_t) :: self
230236 class(HexMesh) :: mesh
@@ -237,16 +243,23 @@ subroutine StatisticsMonitor_UpdateValues(self, mesh)
237243 integer :: i, j, k
238244 real (RP) :: ratio, inv_nsamples_plus_1
239245 real (RP) :: rfactor1, rfactor2
240- integer , dimension (5 ) :: limits
246+ integer , dimension (6 ) :: limits
247+ real (kind= RP), dimension (NDIM) :: vorticity, velocity, LambVector
248+ real (kind= RP), pointer , contiguous :: U_x(:), U_y(:), U_z(:)
241249
242250
243251#ifdef NAVIERSTOKES
244252 ! if gradients are not saved, limits(2) is equal to limits(5), the latter wont be used
245253 limits(1 ) = NO_OF_VARIABLES_Sij + IRHO
246254 limits(2 ) = NO_OF_VARIABLES_Sij + NCONS
247- limits(3 ) = NO_OF_VARIABLES_Sij + NCONS + NGRAD
248- limits(4 ) = NO_OF_VARIABLES_Sij + NCONS + 2 * NGRAD
249- limits(5 ) = NO_OF_VARIABLES
255+ limits(3 :6 ) = limits(2 )
256+ if (self % saveGradients) then
257+ limits(3 ) = NO_OF_VARIABLES_Sij + NCONS + NGRAD ! U_x
258+ limits(4 ) = NO_OF_VARIABLES_Sij + NCONS + 2 * NGRAD ! U_y
259+ limits(5 ) = NO_OF_VARIABLES_Sij + NCONS + NDIM * NGRAD ! U_z
260+ limits(6 ) = limits(5 )
261+ end if
262+ if (self % saveLambVector) limits(6 ) = limits(5 ) + NDIM
250263
251264 inv_nsamples_plus_1 = 1.0_RP / (self % no_of_samples + 1 )
252265 ratio = self % no_of_samples * inv_nsamples_plus_1
@@ -272,7 +285,18 @@ subroutine StatisticsMonitor_UpdateValues(self, mesh)
272285 data (limits(2 )+ 1 :limits(3 ),i,j,k) = data (limits(2 )+ 1 :limits(3 ),i,j,k) * ratio + e % storage % U_x(:,i,j,k) * inv_nsamples_plus_1
273286 data (limits(3 )+ 1 :limits(4 ),i,j,k) = data (limits(3 )+ 1 :limits(4 ),i,j,k) * ratio + e % storage % U_y(:,i,j,k) * inv_nsamples_plus_1
274287 data (limits(4 )+ 1 :limits(5 ),i,j,k) = data (limits(4 )+ 1 :limits(5 ),i,j,k) * ratio + e % storage % U_z(:,i,j,k) * inv_nsamples_plus_1
275- end if
288+ end if
289+ ! Save Lamb vector: u x w
290+ if (self % saveLambVector) then
291+ ! Attention: qm in APE is -(w x u)'
292+ U_x = > e % storage % U_x(:,i,j,k)
293+ U_y = > e % storage % U_y(:,i,j,k)
294+ U_z = > e % storage % U_z(:,i,j,k)
295+ call ComputeVorticity(U_x, U_y, U_z, vorticity)
296+ velocity = e % storage % Q(IRHOU:IRHOW,i,j,k) / e % storage % Q(IRHO,i,j,k)
297+ call vCross(velocity, vorticity, LambVector)
298+ data (limits(5 )+ 1 :limits(6 ),i,j,k) = data (limits(5 )+ 1 :limits(6 ),i,j,k) * ratio + LambVector * inv_nsamples_plus_1
299+ end if
276300 end do ; end do ; end do
277301
278302 end associate
@@ -283,9 +307,14 @@ subroutine StatisticsMonitor_UpdateValues(self, mesh)
283307 ! if gradients are not saved, limits(2) is equal to limits(5), the latter wont be used
284308 limits(1 ) = NO_OF_VARIABLES_Sij + INSRHO
285309 limits(2 ) = NO_OF_VARIABLES_Sij + NCONS
286- limits(3 ) = NO_OF_VARIABLES_Sij + NCONS + NGRAD
287- limits(4 ) = NO_OF_VARIABLES_Sij + NCONS + 2 * NGRAD
288- limits(5 ) = NO_OF_VARIABLES
310+ limits(3 :6 ) = limits(2 )
311+ if (self % saveGradients) then
312+ limits(3 ) = NO_OF_VARIABLES_Sij + NCONS + NGRAD ! U_x
313+ limits(4 ) = NO_OF_VARIABLES_Sij + NCONS + 2 * NGRAD ! U_y
314+ limits(5 ) = NO_OF_VARIABLES_Sij + NCONS + NDIM * NGRAD ! U_z
315+ limits(6 ) = limits(5 )
316+ end if
317+ if (self % saveLambVector) limits(6 ) = limits(5 ) + NDIM
289318
290319 inv_nsamples_plus_1 = 1.0_RP / (self % no_of_samples + 1 )
291320 ratio = self % no_of_samples * inv_nsamples_plus_1
@@ -312,6 +341,17 @@ subroutine StatisticsMonitor_UpdateValues(self, mesh)
312341 data (limits(3 )+ 1 :limits(4 ),i,j,k) = data (limits(3 )+ 1 :limits(4 ),i,j,k) * ratio + e % storage % U_y(:,i,j,k) * inv_nsamples_plus_1
313342 data (limits(4 )+ 1 :limits(5 ),i,j,k) = data (limits(4 )+ 1 :limits(5 ),i,j,k) * ratio + e % storage % U_z(:,i,j,k) * inv_nsamples_plus_1
314343 end if
344+ ! Save Lamb vector: u x w
345+ if (self % saveLambVector) then
346+ ! Attention: qm in APE is -(w x u)'
347+ U_x = > e % storage % U_x(:,i,j,k)
348+ U_y = > e % storage % U_y(:,i,j,k)
349+ U_z = > e % storage % U_z(:,i,j,k)
350+ call ComputeVorticity(U_x, U_y, U_z, vorticity)
351+ velocity = e % storage % Q(INSRHOU:INSRHOW,i,j,k) / e % storage % Q(INSRHO,i,j,k)
352+ call vCross(velocity, vorticity, LambVector)
353+ data (limits(5 )+ 1 :limits(6 ),i,j,k) = data (limits(5 )+ 1 :limits(6 ),i,j,k) * ratio + LambVector * inv_nsamples_plus_1
354+ end if
315355 end do ; end do ; end do
316356
317357 end associate
0 commit comments